]> ToastFreeware Gitweb - gregoa/bti.git/blobdiff - bti.c
Name correct hosts in prompts.
[gregoa/bti.git] / bti.c
diff --git a/bti.c b/bti.c
index 2191b8a9b755be883794a12e516901885343637d..bc83cbaeb1be272dba120e474387d766a84b11e8 100644 (file)
--- a/bti.c
+++ b/bti.c
@@ -38,6 +38,7 @@
 #include <libxml/parser.h>
 #include <libxml/tree.h>
 #include <pcre.h>
+#include <termios.h>
 
 
 #define zalloc(size)   calloc(size, 1)
@@ -80,6 +81,7 @@ struct session {
        char *user;
        char *group;
        char *hosturl;
+       char *hostname;
        int bash;
        int shrink_urls;
        int dry_run;
@@ -149,6 +151,7 @@ static void session_free(struct session *session)
        free(session->user);
        free(session->group);
        free(session->hosturl);
+       free(session->hostname);
        free(session);
 }
 
@@ -182,6 +185,8 @@ static void bti_curl_buffer_free(struct bti_curl_buffer *buffer)
 
 static const char *twitter_host  = "https://twitter.com/statuses";
 static const char *identica_host = "https://identi.ca/api/statuses";
+static const char *twitter_name  = "twitter";
+static const char *identica_name = "identi.ca";
 
 static const char *user_uri    = "/user_timeline/";
 static const char *update_uri  = "/update.xml";
@@ -355,7 +360,7 @@ static int send_request(struct session *session)
                curl_easy_setopt(curl, CURLOPT_HTTPPOST, formpost);
                slist = curl_slist_append(slist, "Expect:");
                curl_easy_setopt(curl, CURLOPT_HTTPHEADER, slist);
-               
+
                sprintf(endpoint, "%s%s", session->hosturl, update_uri);
                curl_easy_setopt(curl, CURLOPT_URL, endpoint);
                curl_easy_setopt(curl, CURLOPT_USERPWD, user_password);
@@ -371,21 +376,23 @@ static int send_request(struct session *session)
 
                break;
        case ACTION_USER:
-               sprintf(endpoint, "%s%s%s.xml?page=%d", session->hosturl, user_uri,
-                               session->user, session->page);
+               sprintf(endpoint, "%s%s%s.xml?page=%d", session->hosturl,
+                       user_uri, session->user, session->page);
                curl_easy_setopt(curl, CURLOPT_URL, endpoint);
 
                break;
        case ACTION_REPLIES:
                snprintf(user_password, sizeof(user_password), "%s:%s",
                         session->account, session->password);
-               sprintf(endpoint, "%s%s?page=%d", session->hosturl, replies_uri, session->page);
+               sprintf(endpoint, "%s%s?page=%d", session->hosturl, replies_uri,
+                       session->page);
                curl_easy_setopt(curl, CURLOPT_URL, endpoint);
                curl_easy_setopt(curl, CURLOPT_USERPWD, user_password);
 
                break;
        case ACTION_PUBLIC:
-               sprintf(endpoint, "%s%s?page=%d", session->hosturl, public_uri, session->page);
+               sprintf(endpoint, "%s%s?page=%d", session->hosturl, public_uri,
+                       session->page);
                curl_easy_setopt(curl, CURLOPT_URL, endpoint);
 
                break;
@@ -512,14 +519,13 @@ static void parse_configfile(struct session *session)
                        if (!strncasecmp(c, "true", 4) ||
                                        !strncasecmp(c, "yes", 3))
                                shrink_urls = 1;
-               }
-               else if (!strncasecmp(c, "verbose", 7) &&
+               } else if (!strncasecmp(c, "verbose", 7) &&
                                (c[7] == '=')) {
                        c += 8;
                        if (!strncasecmp(c, "true", 4) ||
                                        !strncasecmp(c, "yes", 3))
                                verbose = 1;
-               }       
+               }
        } while (!feof(config_file));
 
        if (password)
@@ -530,12 +536,15 @@ static void parse_configfile(struct session *session)
                if (strcasecmp(host, "twitter") == 0) {
                        session->host = HOST_TWITTER;
                        session->hosturl = strdup(twitter_host);
+                       session->hostname = strdup(twitter_name);
                } else if (strcasecmp(host, "identica") == 0) {
                        session->host = HOST_IDENTICA;
                        session->hosturl = strdup(identica_host);
+                       session->hostname = strdup(identica_name);
                } else {
                        session->host = HOST_CUSTOM;
                        session->hosturl = strdup(host);
+                       session->hostname = strdup(host);
                }
                free(host);
        }
@@ -576,7 +585,6 @@ static void log_session(struct session *session, int retval)
 {
        FILE *log_file;
        char *filename;
-       char *host;
 
        /* Only log something if we have a log file set */
        if (!session->logfile)
@@ -590,46 +598,35 @@ static void log_session(struct session *session, int retval)
        log_file = fopen(filename, "a+");
        if (log_file == NULL)
                return;
-       switch (session->host) {
-       case HOST_TWITTER:
-               host = "twitter";
-               break;
-       case HOST_IDENTICA:
-               host = "identi.ca";
-               break;
-       default:
-               host = session->hosturl;
-               break;
-       }
 
        switch (session->action) {
        case ACTION_UPDATE:
                if (retval)
                        fprintf(log_file, "%s: host=%s tweet failed\n",
-                               session->time, host);
+                               session->time, session->hostname);
                else
                        fprintf(log_file, "%s: host=%s tweet=%s\n",
-                               session->time, host, session->tweet);
+                               session->time, session->hostname, session->tweet);
                break;
        case ACTION_FRIENDS:
                fprintf(log_file, "%s: host=%s retrieving friends timeline\n",
-                       session->time, host);
+                       session->time, session->hostname);
                break;
        case ACTION_USER:
                fprintf(log_file, "%s: host=%s retrieving %s's timeline\n",
-                       session->time, host, session->user);
+                       session->time, session->hostname, session->user);
                break;
        case ACTION_REPLIES:
                fprintf(log_file, "%s: host=%s retrieving replies\n",
-                       session->time, host);
+                       session->time, session->hostname);
                break;
        case ACTION_PUBLIC:
                fprintf(log_file, "%s: host=%s retrieving public timeline\n",
-                       session->time, host);
+                       session->time, session->hostname);
                break;
        case ACTION_GROUP:
                fprintf(log_file, "%s: host=%s retrieving group timeline\n",
-                       session->time, host);
+                       session->time, session->hostname);
                break;
        default:
                break;
@@ -654,6 +651,32 @@ static char *get_string_from_stdin(void)
        return string;
 }
 
+static void read_password(char *buf, size_t len, char *host)
+{
+       char pwd[80];
+       int retval;
+       struct termios old;
+       struct termios tp;
+
+       tcgetattr(0, &tp);
+       old = tp;
+
+       tp.c_lflag &= (~ECHO);
+       tcsetattr(0, TCSANOW, &tp);
+
+       fprintf(stdout, "Enter password for %s: ", host);
+       fflush(stdout);
+       tcflow(0, TCOOFF);
+       retval = scanf("%79s", pwd);
+       tcflow(0, TCOON);
+       fprintf(stdout, "\n");
+
+       tcsetattr(0, TCSANOW, &old);
+
+       strncpy(buf, pwd, len);
+       buf[len-1] = '\0';
+}
+
 static int find_urls(const char *tweet, int **pranges)
 {
        /*
@@ -940,6 +963,7 @@ int main(int argc, char *argv[], char *envp[])
        struct session *session;
        pid_t child;
        char *tweet;
+       static char password[80];
        int retval = 0;
        int option;
        char *http_proxy;
@@ -1054,15 +1078,20 @@ int main(int argc, char *argv[], char *envp[])
                case 'H':
                        if (session->hosturl)
                                free(session->hosturl);
+                       if (session->hostname)
+                               free(session->hostname);
                        if (strcasecmp(optarg, "twitter") == 0) {
                                session->host = HOST_TWITTER;
                                session->hosturl = strdup(twitter_host);
+                               session->hostname = strdup(twitter_name);
                        } else if (strcasecmp(optarg, "identica") == 0) {
                                session->host = HOST_IDENTICA;
                                session->hosturl = strdup(identica_host);
+                               session->hostname = strdup(identica_name);
                        } else {
                                session->host = HOST_CUSTOM;
                                session->hosturl = strdup(optarg);
+                               session->hostname = strdup(optarg);
                        }
                        dbg("host = %d\n", session->host);
                        break;
@@ -1088,10 +1117,8 @@ int main(int argc, char *argv[], char *envp[])
         * Show the version to make it easier to determine what
         * is going on here
         */
-       if (debug) {
+       if (debug)
                display_version();
-               fprintf(stderr, session->group);
-       }
 
        if (session->action == ACTION_UNKNOWN) {
                fprintf(stderr, "Unknown action, valid actions are:\n");
@@ -1100,6 +1127,11 @@ int main(int argc, char *argv[], char *envp[])
                goto exit;
        }
 
+       if (!session->host) {
+               fprintf(stderr, "You need to provide a host either in ~/.bti or with --host.\n");
+               goto exit;
+       }
+
        if (session->host == HOST_TWITTER && session->action == ACTION_GROUP) {
                fprintf(stderr, "Groups only work in Identi.ca.\n");
                goto exit;
@@ -1111,13 +1143,13 @@ int main(int argc, char *argv[], char *envp[])
        }
 
        if (!session->account) {
-               fprintf(stdout, "Enter twitter account: ");
+               fprintf(stdout, "Enter account for %s: ", session->hostname);
                session->account = readline(NULL);
        }
 
        if (!session->password) {
-               fprintf(stdout, "Enter twitter password: ");
-               session->password = readline(NULL);
+               read_password(password, sizeof(password), session->hostname);
+               session->password = strdup(password);
        }
 
        if (session->action == ACTION_UPDATE) {
@@ -1135,7 +1167,8 @@ int main(int argc, char *argv[], char *envp[])
 
                session->tweet = zalloc(strlen(tweet) + 10);
                if (session->bash)
-                       sprintf(session->tweet, "%c %s", getuid() ? '$' : '#', tweet);
+                       sprintf(session->tweet, "%c %s",
+                               getuid() ? '$' : '#', tweet);
                else
                        sprintf(session->tweet, "%s", tweet);