X-Git-Url: https://git.toastfreeware.priv.at/gregoa/bti.git/blobdiff_plain/37a84bdcca02fc32e9e44c60ce297da2479ffc0a..9b88bdb4ba1345728b0e27cdd40e6c861f76679c:/bti.c diff --git a/bti.c b/bti.c index 881b826..8478345 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" @@ -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'; @@ -116,7 +119,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. @@ -255,9 +258,9 @@ const char identica_name[] = "identi.ca"; static const char twitter_request_token_uri[] = "http://twitter.com/oauth/request_token"; static const char twitter_access_token_uri[] = "http://twitter.com/oauth/access_token"; static const char twitter_authorize_uri[] = "http://twitter.com/oauth/authorize?oauth_token="; -static const char identica_request_token_uri[] = "http://identi.ca/api/oauth/request_token?oauth_callback=oob"; -static const char identica_access_token_uri[] = "http://identi.ca/api/oauth/access_token"; -static const char identica_authorize_uri[] = "http://identi.ca/api/oauth/authorize?oauth_token="; +static const char identica_request_token_uri[] = "https://identi.ca/api/oauth/request_token?oauth_callback=oob"; +static const char identica_access_token_uri[] = "https://identi.ca/api/oauth/access_token"; +static const char identica_authorize_uri[] = "https://identi.ca/api/oauth/authorize?oauth_token="; static const char user_uri[] = "/user_timeline/"; static const char update_uri[] = "/update.xml"; @@ -268,6 +271,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 +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, @@ -550,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); @@ -651,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; } @@ -658,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; } @@ -830,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'; @@ -1145,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' }, @@ -1158,6 +1187,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; @@ -1174,12 +1205,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. */ @@ -1195,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; @@ -1217,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);