]> ToastFreeware Gitweb - gregoa/bti.git/commitdiff
Merge branch 'master' into gregoa
authorgregor herrmann <gregoa@debian.org>
Sun, 25 Sep 2011 15:07:24 +0000 (17:07 +0200)
committergregor herrmann <gregoa@debian.org>
Sun, 25 Sep 2011 15:07:24 +0000 (17:07 +0200)
ChangeLog
HACKING
RELEASE-NOTES
bti.c
bti.h
config.c
configure.ac

index 550d2eb8426f967152b30ac56449dd90759ee08a..384ed9f4365c3fb0a0d0d1c19f2a31c7c78ced73 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,18 @@
+Summary of changes from v030 to v031
+============================================
+
+Diego Elio Pettenò (1):
+      In non-background execution, check whether the server reports success.
+
+Greg Kroah-Hartman (2):
+      code formatting cleanups
+      config: fix possible access of non-allocated memory
+
+Michel Alexandre Salim (2):
+      Only treat # as a comment marker if it's at the beginning of line or is preceded by a whitespace character
+      Keep searching for '#' comment marker if previous occurence was a false positive
+
+
 Summary of changes from v029 to v030
 ============================================
 
diff --git a/HACKING b/HACKING
index fc0e7ce60d699fa227f5f7f6ebf53b399e992536..19bd8c942c8ab08d599102a8fb27e0006199b806 100644 (file)
--- a/HACKING
+++ b/HACKING
@@ -10,7 +10,7 @@ If you have never used git before, there are some useful tutorials on
 the github.com web site to help you through the learning process.
 
 I am trying to follow the Linux kernel coding style with the code
-whereever possible.  This style is documented in the Linux kernel source
+wherever possible.  This style is documented in the Linux kernel source
 tree in the file Documentation/CodingStyle.  Included in the bti code
 tree is a script called checkpatch.pl that can automatically check if
 your changes are compliant with the guidelines.
index 10f1bc25b59278f0c691f5b6a793b2f48fd9c4ad..24d8dd2a14d8d0e78dd6f3a92d5a15033c68b7e2 100644 (file)
@@ -1,3 +1,10 @@
+bti 031
+=============
+- Check for identi.ca server success or not in non-background mode
+  thanks to Flameeyes
+- Handle '#' in a password in the config file properly thanks to Michel
+  Alexandre Salim
+
 bti 030
 =============
 More minor bugfixes
@@ -22,7 +29,7 @@ some readline fixups from Pete
 
 bti 025
 =============
-remove readline link-time dependancy to make the distro's lives easier
+remove readline link-time dependency to make the distro's lives easier
 bugfixes for minor things by Amir and Gregor
 
 bti 024
diff --git a/bti.c b/bti.c
index 147d44b0d55e9d94d704c9c3b3488407f27321df..db9cadc8043f1cd5e23c539a077770d760a5086f 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"
@@ -116,7 +117,7 @@ static char *get_string(const char *name)
  * lib/ss/get_readline.c file, which is licensed under the MIT license.
  *
  * This keeps us from having to relicense the bti codebase if readline
- * ever changes its license, as there is no link-time dependancy.
+ * ever changes its license, as there is no link-time dependency.
  * It is a run-time thing only, and we handle any readline-like library
  * in the same manner, making bti not be a derivative work of any
  * other program.
@@ -268,6 +269,9 @@ static const char replies_uri[]  = "/replies.xml";
 static const char retweet_uri[]  = "/retweet/";
 static const char group_uri[]    = "/../statusnet/groups/timeline/";
 
+static const char config_default[]     = "/etc/bti";
+static const char config_user_default[]        = ".bti";
+
 static CURL *curl_init(void)
 {
        CURL *curl;
@@ -288,9 +292,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,
@@ -324,7 +329,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 +451,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 +579,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 +649,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);
                        }
                }
 
@@ -1115,6 +1150,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' },
@@ -1128,6 +1164,8 @@ int main(int argc, char *argv[], char *envp[])
        int retval = 0;
        int option;
        char *http_proxy;
+       char *home;
+       const char *config_file;
        time_t t;
        int page_nr;
 
@@ -1144,12 +1182,23 @@ int main(int argc, char *argv[], char *envp[])
        session->time = strdup(ctime(&t));
        session->time[strlen(session->time)-1] = 0x00;
 
-       /* Get the home directory so we can try to find a config file */
-       session->homedir = strdup(getenv("HOME"));
+       /*
+        * Get the home directory so we can try to find a config file.
+        * If we have no home dir set up, look in /etc/bti
+        */
+       home = getenv("HOME");
+       if (home) {
+               /* We have a home dir, so this might be a user */
+               session->homedir = strdup(home);
+               config_file = config_user_default;
+       } else {
+               session->homedir = strdup("");
+               config_file = config_default;
+       }
 
        /* set up a default config file location (traditionally ~/.bti) */
-       session->configfile = zalloc(strlen(session->homedir) + 7);
-       sprintf(session->configfile, "%s/.bti", session->homedir);
+       session->configfile = zalloc(strlen(session->homedir) + strlen(config_file) + 7);
+       sprintf(session->configfile, "%s/%s", session->homedir, config_file);
 
        /* Set environment variables first, before reading command line options
         * or config file values. */
@@ -1165,7 +1214,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;
@@ -1187,6 +1236,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);
@@ -1220,7 +1273,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;
@@ -1314,7 +1367,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,
@@ -1370,7 +1426,7 @@ int main(int argc, char *argv[], char *envp[])
                        fprintf(stdout, "Status ID to retweet: ");
                        rtid = get_string_from_stdin();
                        session->retweet = zalloc(strlen(rtid) + 10);
-                       sprintf(session->retweet,"%s", rtid);
+                       sprintf(session->retweet, "%s", rtid);
                        free(rtid);
                }
 
diff --git a/bti.h b/bti.h
index 13cdbdaaac994e66f66429e933e9dc1342c2a04c..a8ee16fff3647efe5ba526468b6ffa289710e356 100644 (file)
--- a/bti.h
+++ b/bti.h
@@ -65,6 +65,7 @@ struct session {
        int no_oauth;
        int guest;
        int verbose;
+       int column_output;
        enum host host;
        enum action action;
        void *readline_handle;
index 346fed8ceaacc83d4b86d2c7f68424a9d4df9f35..e06f480bc87078a5585e373a035634042332ee9a 100644 (file)
--- a/config.c
+++ b/config.c
@@ -327,6 +327,7 @@ void bti_parse_configfile(struct session *session)
        char *line = NULL;
        char *key = NULL;
        char *value = NULL;
+       char *hashmarker;
        size_t len = 0;
        ssize_t n;
        char *c;
@@ -344,8 +345,29 @@ void bti_parse_configfile(struct session *session)
                if (line[n - 1] == '\n')
                        line[n - 1] = '\0';
 
-               /* '#' is comment markers, like bash style */
-               *strchrnul(line, '#') = '\0';
+               /*
+                * '#' is comment markers, like bash style but it is a valid
+                * character in some fields, so only treat it as a comment
+                * marker if it occurs at the beginning of the line, or after
+                * whitespace
+                */
+               hashmarker = strchrnul(line, '#');
+               if (line == hashmarker)
+                       line[0] = '\0';
+               else {
+                       while (hashmarker[0] != '\0') {
+                               --hashmarker;
+                               if (isblank(hashmarker[0]))
+                                       hashmarker[0] = '\0';
+                               else {
+                                       /*
+                                        * false positive; '#' occured
+                                        * within a string
+                                        */
+                                       hashmarker = strchrnul(hashmarker+2, '#');
+                               }
+                       }
+               }
                c = line;
                while (isspace(*c))
                        c++;
index 39643d4e1e0f0b2be595bfbe6c8199c5e6a5dba4..8dc3071a71c56b6ab4a14a99853daf99ca18d262 100644 (file)
@@ -1,7 +1,7 @@
-AC_INIT([bti], [030], [greg@kroah.com])
+AC_INIT([bti], [031], [greg@kroah.com])
 AC_PREREQ(2.60)
 
-AM_INIT_AUTOMAKE(bti, 030)
+AM_INIT_AUTOMAKE(bti, 031)
 
 m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])