+ case ACTION_USER:
+ sprintf(endpoint, "%s%s%s.xml?page=%d", session->hosturl,
+ user_uri, session->user, session->page);
+ curl_easy_setopt(curl, CURLOPT_URL, endpoint);
+ break;
+
+ case ACTION_REPLIES:
+ snprintf(user_password, sizeof(user_password), "%s:%s",
+ session->account, session->password);
+ sprintf(endpoint, "%s%s?page=%d", session->hosturl,
+ replies_uri, session->page);
+ curl_easy_setopt(curl, CURLOPT_URL, endpoint);
+ curl_easy_setopt(curl, CURLOPT_USERPWD, user_password);
+ break;
+
+ case ACTION_PUBLIC:
+ sprintf(endpoint, "%s%s?page=%d", session->hosturl,
+ public_uri, session->page);
+ curl_easy_setopt(curl, CURLOPT_URL, endpoint);
+ break;
+
+ case ACTION_GROUP:
+ sprintf(endpoint, "%s%s%s.xml?page=%d",
+ session->hosturl, group_uri, session->group,
+ session->page);
+ curl_easy_setopt(curl, CURLOPT_URL, endpoint);
+ break;
+
+ default:
+ break;
+ }
+
+ if (session->proxy)
+ curl_easy_setopt(curl, CURLOPT_PROXY, session->proxy);
+
+ if (debug)
+ curl_easy_setopt(curl, CURLOPT_VERBOSE, 1);
+
+ dbg("user_password = %s\n", user_password);
+ dbg("data = %s\n", data);
+ dbg("proxy = %s\n", session->proxy);
+
+ curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, curl_callback);
+ curl_easy_setopt(curl, CURLOPT_WRITEDATA, curl_buf);
+ if (!session->dry_run) {
+ res = curl_easy_perform(curl);
+ if (res && !session->background) {
+ fprintf(stderr, "error(%d) trying to perform "
+ "operation\n", res);
+ return -EINVAL;
+ }
+ }
+
+ curl_easy_cleanup(curl);
+ if (session->action == ACTION_UPDATE)
+ curl_formfree(formpost);
+ bti_curl_buffer_free(curl_buf);
+ } else {
+ switch (session->action) {
+ case ACTION_UPDATE:
+ escaped_tweet = oauth_url_escape(session->tweet);
+ if (session->replyto) {
+ sprintf(endpoint,
+ "%s%s?status=%s&in_reply_to_status_id=%s",
+ session->hosturl, update_uri,
+ escaped_tweet, session->replyto);
+ } else {
+ sprintf(endpoint, "%s%s?status=%s",
+ session->hosturl, update_uri,
+ escaped_tweet);
+ }
+
+ is_post = 1;
+ break;
+ case ACTION_USER:
+ sprintf(endpoint, "%s%s%s.xml?page=%d",
+ session->hosturl, user_uri, session->user,
+ session->page);
+ break;
+ case ACTION_REPLIES:
+ sprintf(endpoint, "%s%s?page=%d", session->hosturl,
+ mentions_uri, session->page);
+ break;
+ case ACTION_PUBLIC:
+ sprintf(endpoint, "%s%s?page=%d", session->hosturl,
+ public_uri, session->page);
+ break;
+ case ACTION_GROUP:
+ sprintf(endpoint, "%s%s%s.xml?page=%d",
+ session->hosturl, group_uri, session->group,
+ session->page);
+ break;
+ case ACTION_FRIENDS:
+ sprintf(endpoint, "%s%s?page=%d", session->hosturl,
+ friends_uri, session->page);
+ break;
+ case ACTION_RETWEET:
+ sprintf(endpoint, "%s%s%s.xml", session->hosturl,
+ retweet_uri, session->retweet);
+ is_post = 1;
+ break;
+ default:
+ break;
+ }
+
+ dbg("%s\n", endpoint);
+ if (!session->dry_run) {
+ if (is_post) {
+ req_url = oauth_sign_url2(endpoint, &postarg, OA_HMAC,
+ NULL, session->consumer_key,
+ session->consumer_secret,
+ session->access_token_key,
+ session->access_token_secret);
+ reply = oauth_http_post(req_url, postarg);
+ } else {
+ req_url = oauth_sign_url2(endpoint, NULL, OA_HMAC, NULL,
+ session->consumer_key,
+ session->consumer_secret,
+ session->access_token_key,
+ session->access_token_secret);
+ reply = oauth_http_get(req_url, postarg);
+ }
+
+ dbg("%s\n", req_url);
+ dbg("%s\n", reply);
+ if (req_url)
+ free(req_url);
+ }
+
+ if (!reply) {
+ fprintf(stderr, "Error retrieving from URL (%s)\n", endpoint);
+ return 1;
+ }
+
+ if ((session->action != ACTION_UPDATE) &&
+ (session->action != ACTION_RETWEET))
+ parse_timeline(reply, session);
+ }
+ return 0;
+}
+
+static void log_session(struct session *session, int retval)
+{
+ FILE *log_file;
+ char *filename;
+
+ /* Only log something if we have a log file set */
+ if (!session->logfile)
+ return;