X-Git-Url: https://git.toastfreeware.priv.at/gregoa/bti.git/blobdiff_plain/f5653af73ffd81c843fb3fc4b06b8cf4893cf232..fd562ddb1a223ca6623c05761305a103e6a85dfb:/bti.c diff --git a/bti.c b/bti.c index 345821a..ae32c37 100644 --- a/bti.c +++ b/bti.c @@ -82,6 +82,8 @@ struct session { char *group; char *hosturl; char *hostname; + char *configfile; + char *replyto; int bash; int interactive; int shrink_urls; @@ -116,6 +118,8 @@ static void display_help(void) fprintf(stdout, " --proxy PROXY:PORT\n"); fprintf(stdout, " --host HOST\n"); fprintf(stdout, " --logfile logfile\n"); + fprintf(stdout, " --config configfile\n"); + fprintf(stdout, " --replyto ID\n"); fprintf(stdout, " --shrink-urls\n"); fprintf(stdout, " --page PAGENUMBER\n"); fprintf(stdout, " --bash\n"); @@ -241,6 +245,7 @@ static void session_free(struct session *session) { if (!session) return; + free(session->replyto); free(session->password); free(session->account); free(session->tweet); @@ -251,6 +256,7 @@ static void session_free(struct session *session) free(session->group); free(session->hosturl); free(session->hostname); + free(session->configfile); free(session); } @@ -314,6 +320,7 @@ static void parse_statuses(xmlDocPtr doc, xmlNodePtr current) xmlChar *text = NULL; xmlChar *user = NULL; xmlChar *created = NULL; + xmlChar *id = NULL; xmlNodePtr userinfo; current = current->xmlChildrenNode; @@ -323,6 +330,8 @@ static void parse_statuses(xmlDocPtr doc, xmlNodePtr current) created = xmlNodeListGetString(doc, current->xmlChildrenNode, 1); if (!xmlStrcmp(current->name, (const xmlChar *)"text")) text = xmlNodeListGetString(doc, current->xmlChildrenNode, 1); + if (!xmlStrcmp(current->name, (const xmlChar *)"id")) + id = xmlNodeListGetString(doc, current->xmlChildrenNode, 1); if (!xmlStrcmp(current->name, (const xmlChar *)"user")) { userinfo = current->xmlChildrenNode; while (userinfo != NULL) { @@ -335,19 +344,21 @@ static void parse_statuses(xmlDocPtr doc, xmlNodePtr current) } } - if (user && text && created) { + if (user && text && created && id) { if (verbose) - printf("[%s] (%.16s) %s\n", - user, created, text); + printf("[%s] {%s} (%.16s) %s\n", + user, id, created, text); else printf("[%s] %s\n", user, text); xmlFree(user); xmlFree(text); xmlFree(created); + xmlFree(id); user = NULL; text = NULL; created = NULL; + id = NULL; } } current = current->next; @@ -459,6 +470,12 @@ static int send_request(struct session *session) CURLFORM_COPYCONTENTS, "bti", CURLFORM_END); + if (session->replyto) + curl_formadd(&formpost, &lastptr, + CURLFORM_COPYNAME, "in_reply_to_status_id", + CURLFORM_COPYCONTENTS, session->replyto, + CURLFORM_END); + curl_easy_setopt(curl, CURLOPT_HTTPPOST, formpost); slist = curl_slist_append(slist, "Expect:"); curl_easy_setopt(curl, CURLOPT_HTTPHEADER, slist); @@ -551,12 +568,7 @@ static void parse_configfile(struct session *session) char *file; int shrink_urls = 0; - /* config file is ~/.bti */ - file = alloca(strlen(session->homedir) + 7); - - sprintf(file, "%s/.bti", session->homedir); - - config_file = fopen(file, "r"); + config_file = fopen(session->configfile, "r"); /* No error if file does not exist or is unreadable. */ if (config_file == NULL) @@ -1062,6 +1074,8 @@ int main(int argc, char *argv[], char *envp[]) { "dry-run", 0, NULL, 'n' }, { "page", 1, NULL, 'g' }, { "version", 0, NULL, 'v' }, + { "config", 1, NULL, 'c' }, + { "replyto", 1, NULL, 'r' }, { } }; struct session *session; @@ -1088,8 +1102,13 @@ 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")); + /* set up a default config file location (traditionally ~/.bti) */ + session->configfile = zalloc(strlen(session->homedir) + 7); + sprintf(session->configfile, "%s/.bti", session->homedir); + curl_global_init(CURL_GLOBAL_ALL); /* Set environment variables first, before reading command line options @@ -1105,7 +1124,7 @@ int main(int argc, char *argv[], char *envp[]) parse_configfile(session); while (1) { - option = getopt_long_only(argc, argv, "dp:P:H:a:A:u:hg:G:snVv", + option = getopt_long_only(argc, argv, "dp:P:H:a:A:u:c:hg:G:sr:nVv", options, NULL); if (option == -1) break; @@ -1127,6 +1146,10 @@ int main(int argc, char *argv[], char *envp[]) dbg("page = %d\n", page_nr); session->page = page_nr; break; + case 'r': + session->replyto = strdup(optarg); + dbg("in_reply_to_status_id = %s\n", session->replyto); + break; case 'p': if (session->password) free(session->password); @@ -1201,6 +1224,18 @@ int main(int argc, char *argv[], char *envp[]) case 'b': session->bash = 1; break; + case 'c': + if (session->configfile) + free(session->configfile); + session->configfile = strdup(optarg); + dbg("configfile = %s\n", session->configfile); + + /* + * read the config file now. Yes, this could override previously + * set options from the command line, but the user asked for it... + */ + parse_configfile(session); + break; case 'h': display_help(); goto exit; @@ -1280,6 +1315,7 @@ int main(int argc, char *argv[], char *envp[]) if (session->page == 0) session->page = 1; + dbg("config file = %s\n", session->configfile); dbg("account = %s\n", session->account); dbg("password = %s\n", session->password); dbg("host = %d\n", session->host);