]> ToastFreeware Gitweb - gregoa/bti.git/blobdiff - bti.c
Merge branch 'master' into oath
[gregoa/bti.git] / bti.c
diff --git a/bti.c b/bti.c
index c0c580443ba16e2177b391706ac29c38261da023..4bf6a6c2a98b7a32b9edb556d841202988916e08 100644 (file)
--- a/bti.c
+++ b/bti.c
@@ -82,6 +82,7 @@ struct session {
        char *group;
        char *hosturl;
        char *hostname;
+       char *configfile;
        int bash;
        int interactive;
        int shrink_urls;
@@ -116,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");
@@ -190,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;
                }
@@ -233,7 +236,6 @@ static struct session *session_alloc(void)
        session = zalloc(sizeof(*session));
        if (!session)
                return NULL;
-       session_readline_init(session);
        return session;
 }
 
@@ -241,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);
@@ -252,6 +253,7 @@ static void session_free(struct session *session)
        free(session->group);
        free(session->hosturl);
        free(session->hostname);
+       free(session->configfile);
        free(session);
 }
 
@@ -552,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)
@@ -709,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",
@@ -1062,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;
@@ -1088,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
@@ -1105,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;
@@ -1201,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;
@@ -1216,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
@@ -1279,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);
@@ -1301,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;;
 }