X-Git-Url: https://git.toastfreeware.priv.at/gregoa/bti.git/blobdiff_plain/e45e53c72f65e6e173ae1d624dd683fe0deefc61..dc38829e3ba8688fee7c0aff7d419ac6b01d4f7e:/bti.c diff --git a/bti.c b/bti.c index 4b31cd5..881b826 100644 --- a/bti.c +++ b/bti.c @@ -284,8 +284,8 @@ static CURL *curl_init(void) } /* The final place data is sent to the screen/pty/tty */ -bti_output_line(struct session *session, xmlChar *user, xmlChar *id, - xmlChar *created, xmlChar *text) +static void bti_output_line(struct session *session, xmlChar *user, + xmlChar *id, xmlChar *created, xmlChar *text) { if (session->verbose) printf("[%s] {%s} (%.16s) %s\n", user, id, created, text); @@ -324,7 +324,8 @@ static void parse_statuses(struct session *session, } if (user && text && created && id) { - bti_output_line(session, user, id, created, text); + bti_output_line(session, user, id, + created, text); xmlFree(user); xmlFree(text); xmlFree(created); @@ -445,7 +446,7 @@ static int request_access_token(struct session *session) { char *post_params = NULL; char *request_url = NULL; - char *reply = NULL; + char *reply = NULL; char *at_key = NULL; char *at_secret = NULL; char *verifier = NULL; @@ -573,8 +574,10 @@ static int send_request(struct session *session) if (session->replyto) curl_formadd(&formpost, &lastptr, - CURLFORM_COPYNAME, "in_reply_to_status_id", - CURLFORM_COPYCONTENTS, session->replyto, + CURLFORM_COPYNAME, + "in_reply_to_status_id", + CURLFORM_COPYCONTENTS, + session->replyto, CURLFORM_END); curl_easy_setopt(curl, CURLOPT_HTTPPOST, formpost); @@ -641,10 +644,37 @@ static int send_request(struct session *session) 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; + if (!session->background) { + xmlDocPtr doc; + xmlNodePtr current; + + if (res) { + fprintf(stderr, "error(%d) trying to " + "perform operation\n", res); + return -EINVAL; + } + + doc = xmlReadMemory(curl_buf->data, + curl_buf->length, + "response.xml", NULL, + XML_PARSE_NOERROR); + if (doc == NULL) + return -EINVAL; + + current = xmlDocGetRootElement(doc); + if (current == NULL) { + fprintf(stderr, "empty document\n"); + xmlFreeDoc(doc); + return -EINVAL; + } + + if (xmlStrcmp(current->name, (const xmlChar *)"status")) { + fprintf(stderr, "unexpected document type\n"); + xmlFreeDoc(doc); + return -EINVAL; + } + + xmlFreeDoc(doc); } } @@ -724,6 +754,11 @@ static int send_request(struct session *session) free(req_url); } + if (!reply) { + fprintf(stderr, "Error retrieving from URL (%s)\n", endpoint); + return -EIO; + } + if ((session->action != ACTION_UPDATE) && (session->action != ACTION_RETWEET)) parse_timeline(reply, session); @@ -1119,7 +1154,6 @@ int main(int argc, char *argv[], char *envp[]) struct session *session; pid_t child; char *tweet; - char *retweet; static char password[80]; int retval = 0; int option; @@ -1161,7 +1195,7 @@ int main(int argc, char *argv[], char *envp[]) while (1) { option = getopt_long_only(argc, argv, - "dp:P:H:a:A:u:c:hg:G:sr:nVv", + "dp:P:H:a:A:u:c:hg:G:sr:nVvw:", options, NULL); if (option == -1) break; @@ -1216,7 +1250,7 @@ int main(int argc, char *argv[], char *envp[]) session->action = ACTION_PUBLIC; else if (strcasecmp(optarg, "group") == 0) session->action = ACTION_GROUP; - else if (strcasecmp(optarg,"retweet") == 0) + else if (strcasecmp(optarg, "retweet") == 0) session->action = ACTION_RETWEET; else session->action = ACTION_UNKNOWN; @@ -1310,7 +1344,10 @@ int main(int argc, char *argv[], char *envp[]) if (!session->consumer_key || !session->consumer_secret) { if (session->action == ACTION_USER || session->action == ACTION_PUBLIC) { - /* Some actions may still work without authentication */ + /* + * Some actions may still work without + * authentication + */ session->guest = 1; } else { fprintf(stderr, @@ -1360,17 +1397,21 @@ int main(int argc, char *argv[], char *envp[]) } if (session->action == ACTION_RETWEET) { - fprintf(stdout, "Status ID to retweet: "); - retweet = get_string_from_stdin(); + if (!session->retweet) { + char *rtid; + + fprintf(stdout, "Status ID to retweet: "); + rtid = get_string_from_stdin(); + session->retweet = zalloc(strlen(rtid) + 10); + sprintf(session->retweet, "%s", rtid); + free(rtid); + } - if (!retweet || strlen(retweet) == 0) { + if (!session->retweet || strlen(session->retweet) == 0) { dbg("no retweet?\n"); return -1; } - session->retweet = zalloc(strlen(retweet) + 10); - sprintf(session->retweet,"%s", retweet); - free(retweet); dbg("retweet ID = %s\n", session->retweet); }