X-Git-Url: https://git.toastfreeware.priv.at/gregoa/bti.git/blobdiff_plain/c8f56274f6d6f7cb8f7f8a2f002989c396a07042..ec9264385a18f6f2212b7e19f2ea34ef807ca1cd:/bti.c diff --git a/bti.c b/bti.c index a70443a..7f82879 100644 --- a/bti.c +++ b/bti.c @@ -52,7 +52,7 @@ } while (0) -static int debug; +int debug; static void display_help(void) { @@ -283,6 +283,16 @@ static CURL *curl_init(void) return curl; } +/* The final place data is sent to the screen/pty/tty */ +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); + else + printf("[%s] %s\n", user, text); +} + static void parse_statuses(struct session *session, xmlDocPtr doc, xmlNodePtr current) { @@ -314,12 +324,7 @@ static void parse_statuses(struct session *session, } if (user && text && created && id) { - if (session->verbose) - printf("[%s] {%s} (%.16s) %s\n", - user, id, created, text); - else - printf("[%s] %s\n", - user, text); + bti_output_line(session, user, id, created, text); xmlFree(user); xmlFree(text); xmlFree(created); @@ -636,11 +641,36 @@ 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 " + if (!session->background) { + if (res) { + fprintf(stderr, "error(%d) trying to perform " "operation\n", res); - return -EINVAL; - } + return -EINVAL; + } else { + xmlDocPtr doc; + xmlNodePtr current; + + 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); + } + } } curl_easy_cleanup(curl); @@ -719,6 +749,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); @@ -1114,7 +1149,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; @@ -1156,7 +1190,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; @@ -1355,17 +1389,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); }