From: gregor herrmann Date: Sun, 25 Sep 2011 15:07:24 +0000 (+0200) Subject: Merge branch 'master' into gregoa X-Git-Url: https://git.toastfreeware.priv.at/gregoa/bti.git/commitdiff_plain/62218d9b082bf37952ee4aecd37a6cee48943f63?hp=f8ec64472ec690ea5f67c8fec7ad260a962c95a5 Merge branch 'master' into gregoa --- diff --git a/ChangeLog b/ChangeLog index 550d2eb..384ed9f 100644 --- 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 fc0e7ce..19bd8c9 100644 --- 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. diff --git a/RELEASE-NOTES b/RELEASE-NOTES index 10f1bc2..24d8dd2 100644 --- a/RELEASE-NOTES +++ b/RELEASE-NOTES @@ -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 147d44b..db9cadc 100644 --- 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 13cdbda..a8ee16f 100644 --- 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; diff --git a/config.c b/config.c index 346fed8..e06f480 100644 --- 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++; diff --git a/configure.ac b/configure.ac index 39643d4..8dc3071 100644 --- a/configure.ac +++ b/configure.ac @@ -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])])