X-Git-Url: https://git.toastfreeware.priv.at/gregoa/bti.git/blobdiff_plain/da43d0b73a9df4c6eb67b94a1c050d7ad7f034ed..1c9a54c9bf22039cb9bd5d3d582e383c7849945f:/bti.c diff --git a/bti.c b/bti.c index 285fdfa..4bf6a6c 100644 --- a/bti.c +++ b/bti.c @@ -82,7 +82,9 @@ struct session { char *group; char *hosturl; char *hostname; + char *configfile; int bash; + int interactive; int shrink_urls; int dry_run; int page; @@ -115,6 +117,7 @@ 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, " --shrink-urls\n"); fprintf(stdout, " --page PAGENUMBER\n"); fprintf(stdout, " --bash\n"); @@ -143,7 +146,8 @@ static char *get_string(const char *name) if (!fgets(string, 999, stdin)) return NULL; temp = strchr(string, '\n'); - *temp = '\0'; + if (temp) + *temp = '\0'; return string; } @@ -172,8 +176,11 @@ static void session_readline_init(struct session *session) int (*bind_key)(int, void *); void (*insert)(void); - /* default to internal function if we can't find anything */ + /* default to internal function if we can't or won't find anything */ session->readline = get_string; + if (!isatty(0)) + return; + session->interactive = 1; tmp = malloc(strlen(libpath)+1); if (!tmp) @@ -185,7 +192,8 @@ static void session_readline_init(struct session *session) *next++ = 0; if (*cp == 0) continue; - if ((handle = dlopen(cp, RTLD_NOW))) { + handle = dlopen(cp, RTLD_NOW); + if (handle) { dbg("Using %s for readline library\n", cp); break; } @@ -228,7 +236,6 @@ static struct session *session_alloc(void) session = zalloc(sizeof(*session)); if (!session) return NULL; - session_readline_init(session); return session; } @@ -236,7 +243,6 @@ static void session_free(struct session *session) { if (!session) return; - session_readline_cleanup(session); free(session->password); free(session->account); free(session->tweet); @@ -247,6 +253,7 @@ static void session_free(struct session *session) free(session->group); free(session->hosturl); free(session->hostname); + free(session->configfile); free(session); } @@ -547,12 +554,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) @@ -704,7 +706,8 @@ static void log_session(struct session *session, int retval) session->time, session->hostname); else fprintf(log_file, "%s: host=%s tweet=%s\n", - session->time, session->hostname, session->tweet); + session->time, session->hostname, + session->tweet); break; case ACTION_FRIENDS: fprintf(log_file, "%s: host=%s retrieving friends timeline\n", @@ -745,7 +748,8 @@ static char *get_string_from_stdin(void) if (!fgets(string, 999, stdin)) return NULL; temp = strchr(string, '\n'); - *temp = '\0'; + if (temp) + *temp = '\0'; return string; } @@ -1056,6 +1060,7 @@ 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' }, { } }; struct session *session; @@ -1082,8 +1087,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 @@ -1099,7 +1109,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:snVv", options, NULL); if (option == -1) break; @@ -1195,6 +1205,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; @@ -1210,6 +1232,7 @@ int main(int argc, char *argv[], char *envp[]) } } + session_readline_init(session); /* * Show the version to make it easier to determine what * is going on here @@ -1245,7 +1268,7 @@ int main(int argc, char *argv[], char *envp[]) } if (session->action == ACTION_UPDATE) { - if (session->bash) + if (session->bash || !session->interactive) tweet = get_string_from_stdin(); else tweet = session->readline("tweet: "); @@ -1273,6 +1296,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); @@ -1295,6 +1319,7 @@ int main(int argc, char *argv[], char *envp[]) log_session(session, retval); exit: + session_readline_cleanup(session); session_free(session); return retval;; }