]> ToastFreeware Gitweb - gregoa/bti.git/blobdiff - bti.c
Only treat # as a comment marker if it's at the beginning of line or is preceded...
[gregoa/bti.git] / bti.c
diff --git a/bti.c b/bti.c
index a70443a5431a636050d9a9cbbd45a9e716bd97ce..881b8266f4d252a4ffefd7c3675802dc68097a79 100644 (file)
--- 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,8 @@ 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);
@@ -440,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;
@@ -568,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);
@@ -636,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);
                        }
                }
 
@@ -719,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);
@@ -1114,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;
@@ -1156,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;
@@ -1211,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;
@@ -1305,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,
@@ -1355,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);
        }