]> ToastFreeware Gitweb - gregoa/bti.git/blobdiff - bti.c
In non-background execution, check whether the server reports success.
[gregoa/bti.git] / bti.c
diff --git a/bti.c b/bti.c
index 18b8116c56d576754e8bb307450d59e2335a068c..7f828791030669fd5d03519abdfaa5f390bbb99d 100644 (file)
--- a/bti.c
+++ b/bti.c
@@ -641,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);
@@ -724,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);
@@ -1119,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;
@@ -1161,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;
@@ -1360,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);
        }