]> ToastFreeware Gitweb - gregoa/bti.git/blobdiff - bti.c
send_request: don't leak the curl stuff
[gregoa/bti.git] / bti.c
diff --git a/bti.c b/bti.c
index b3dac6ea8e944fc44f51b13111138328c77ae33d..9a6fae24b9eb040b5e7c85509552402c849d2da1 100644 (file)
--- a/bti.c
+++ b/bti.c
@@ -75,6 +75,7 @@ static void display_help(void)
                "  --retweet ID\n"
                "  --shrink-urls\n"
                "  --page PAGENUMBER\n"
+               "  --column COLUMNWIDTH\n"
                "  --bash\n"
                "  --background\n"
                "  --debug\n"
@@ -99,8 +100,10 @@ static char *get_string(const char *name)
                exit(1);
        if (name != NULL)
                fprintf(stdout, "%s", name);
-       if (!fgets(string, 999, stdin))
+       if (!fgets(string, 999, stdin)) {
+               free(string);
                return NULL;
+       }
        temp = strchr(string, '\n');
        if (temp)
                *temp = '\0';
@@ -291,9 +294,10 @@ 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);
+               printf("[%*s] {%s} (%.16s) %s\n", -session->column_output, user,
+                               id, created, text);
        else
-               printf("[%s] %s\n", user, text);
+               printf("[%*s] %s\n", -session->column_output, user, text);
 }
 
 static void parse_statuses(struct session *session,
@@ -553,8 +557,10 @@ static int send_request(struct session *session)
                curl_buf->session = session;
 
                curl = curl_init();
-               if (!curl)
+               if (!curl) {
+                       bti_curl_buffer_free(curl_buf);
                        return -EINVAL;
+               }
 
                if (!session->hosturl)
                        session->hosturl = strdup(twitter_host);
@@ -654,6 +660,10 @@ static int send_request(struct session *session)
                                if (res) {
                                        fprintf(stderr, "error(%d) trying to "
                                                "perform operation\n", res);
+                                       curl_easy_cleanup(curl);
+                                       if (session->action == ACTION_UPDATE)
+                                               curl_formfree(formpost);
+                                       bti_curl_buffer_free(curl_buf);
                                        return -EINVAL;
                                }
 
@@ -661,19 +671,32 @@ static int send_request(struct session *session)
                                                    curl_buf->length,
                                                    "response.xml", NULL,
                                                    XML_PARSE_NOERROR);
-                               if (doc == NULL)
+                               if (doc == NULL) {
+                                       curl_easy_cleanup(curl);
+                                       if (session->action == ACTION_UPDATE)
+                                               curl_formfree(formpost);
+                                       bti_curl_buffer_free(curl_buf);
                                        return -EINVAL;
+                               }
 
                                current = xmlDocGetRootElement(doc);
                                if (current == NULL) {
                                        fprintf(stderr, "empty document\n");
                                        xmlFreeDoc(doc);
+                                       curl_easy_cleanup(curl);
+                                       if (session->action == ACTION_UPDATE)
+                                               curl_formfree(formpost);
+                                       bti_curl_buffer_free(curl_buf);
                                        return -EINVAL;
                                }
 
                                if (xmlStrcmp(current->name, (const xmlChar *)"status")) {
                                        fprintf(stderr, "unexpected document type\n");
                                        xmlFreeDoc(doc);
+                                       curl_easy_cleanup(curl);
+                                       if (session->action == ACTION_UPDATE)
+                                               curl_formfree(formpost);
+                                       bti_curl_buffer_free(curl_buf);
                                        return -EINVAL;
                                }
 
@@ -833,8 +856,10 @@ static char *get_string_from_stdin(void)
        if (!string)
                return NULL;
 
-       if (!fgets(string, 999, stdin))
+       if (!fgets(string, 999, stdin)) {
+               free(string);
                return NULL;
+       }
        temp = strchr(string, '\n');
        if (temp)
                *temp = '\0';
@@ -1148,6 +1173,7 @@ int main(int argc, char *argv[], char *envp[])
                { "background", 0, NULL, 'B' },
                { "dry-run", 0, NULL, 'n' },
                { "page", 1, NULL, 'g' },
+               { "column", 1, NULL, 'o' },
                { "version", 0, NULL, 'v' },
                { "config", 1, NULL, 'c' },
                { "replyto", 1, NULL, 'r' },
@@ -1211,7 +1237,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:nVvw:",
+                                         "dp:P:H:a:A:u:c:hg:o:G:sr:nVvw:",
                                          options, NULL);
                if (option == -1)
                        break;
@@ -1233,6 +1259,10 @@ int main(int argc, char *argv[], char *envp[])
                        dbg("page = %d\n", page_nr);
                        session->page = page_nr;
                        break;
+               case 'o':
+                       session->column_output = atoi(optarg);
+                       dbg("column_output = %d\n", session->column_output);
+                       break;
                case 'r':
                        session->replyto = strdup(optarg);
                        dbg("in_reply_to_status_id = %s\n", session->replyto);