/[debian]/bti/branches/upstream/current/bti.c
ViewVC logotype

Diff of /bti/branches/upstream/current/bti.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 2706 by gregoa, Tue Mar 22 16:13:50 2011 UTC revision 2707 by gregoa, Fri Dec 2 23:53:57 2011 UTC
# Line 75  static void display_help(void) Line 75  static void display_help(void)
75                  "  --retweet ID\n"                  "  --retweet ID\n"
76                  "  --shrink-urls\n"                  "  --shrink-urls\n"
77                  "  --page PAGENUMBER\n"                  "  --page PAGENUMBER\n"
78                    "  --column COLUMNWIDTH\n"
79                  "  --bash\n"                  "  --bash\n"
80                  "  --background\n"                  "  --background\n"
81                  "  --debug\n"                  "  --debug\n"
# Line 99  static char *get_string(const char *name Line 100  static char *get_string(const char *name
100                  exit(1);                  exit(1);
101          if (name != NULL)          if (name != NULL)
102                  fprintf(stdout, "%s", name);                  fprintf(stdout, "%s", name);
103          if (!fgets(string, 999, stdin))          if (!fgets(string, 999, stdin)) {
104                    free(string);
105                  return NULL;                  return NULL;
106            }
107          temp = strchr(string, '\n');          temp = strchr(string, '\n');
108          if (temp)          if (temp)
109                  *temp = '\0';                  *temp = '\0';
# Line 116  static char *get_string(const char *name Line 119  static char *get_string(const char *name
119   * lib/ss/get_readline.c file, which is licensed under the MIT license.   * lib/ss/get_readline.c file, which is licensed under the MIT license.
120   *   *
121   * This keeps us from having to relicense the bti codebase if readline   * This keeps us from having to relicense the bti codebase if readline
122   * ever changes its license, as there is no link-time dependancy.   * ever changes its license, as there is no link-time dependency.
123   * It is a run-time thing only, and we handle any readline-like library   * It is a run-time thing only, and we handle any readline-like library
124   * in the same manner, making bti not be a derivative work of any   * in the same manner, making bti not be a derivative work of any
125   * other program.   * other program.
# Line 255  const char identica_name[] = "identi.ca" Line 258  const char identica_name[] = "identi.ca"
258  static const char twitter_request_token_uri[]  = "http://twitter.com/oauth/request_token";  static const char twitter_request_token_uri[]  = "http://twitter.com/oauth/request_token";
259  static const char twitter_access_token_uri[]   = "http://twitter.com/oauth/access_token";  static const char twitter_access_token_uri[]   = "http://twitter.com/oauth/access_token";
260  static const char twitter_authorize_uri[]      = "http://twitter.com/oauth/authorize?oauth_token=";  static const char twitter_authorize_uri[]      = "http://twitter.com/oauth/authorize?oauth_token=";
261  static const char identica_request_token_uri[] = "http://identi.ca/api/oauth/request_token?oauth_callback=oob";  static const char identica_request_token_uri[] = "https://identi.ca/api/oauth/request_token?oauth_callback=oob";
262  static const char identica_access_token_uri[]  = "http://identi.ca/api/oauth/access_token";  static const char identica_access_token_uri[]  = "https://identi.ca/api/oauth/access_token";
263  static const char identica_authorize_uri[]     = "http://identi.ca/api/oauth/authorize?oauth_token=";  static const char identica_authorize_uri[]     = "https://identi.ca/api/oauth/authorize?oauth_token=";
264    static const char custom_request_token_uri[]   = "/../oauth/request_token?oauth_callback=oob";
265    static const char custom_access_token_uri[]    = "/../oauth/access_token";
266    static const char custom_authorize_uri[]       = "/../oauth/authorize?oauth_token=";
267    
268  static const char user_uri[]     = "/user_timeline/";  static const char user_uri[]     = "/user_timeline/";
269  static const char update_uri[]   = "/update.xml";  static const char update_uri[]   = "/update.xml";
# Line 268  static const char replies_uri[]  = "/rep Line 274  static const char replies_uri[]  = "/rep
274  static const char retweet_uri[]  = "/retweet/";  static const char retweet_uri[]  = "/retweet/";
275  static const char group_uri[]    = "/../statusnet/groups/timeline/";  static const char group_uri[]    = "/../statusnet/groups/timeline/";
276    
277    static const char config_default[]      = "/etc/bti";
278    static const char config_user_default[] = ".bti";
279    
280  static CURL *curl_init(void)  static CURL *curl_init(void)
281  {  {
282          CURL *curl;          CURL *curl;
# Line 288  static void bti_output_line(struct sessi Line 297  static void bti_output_line(struct sessi
297                              xmlChar *id, xmlChar *created, xmlChar *text)                              xmlChar *id, xmlChar *created, xmlChar *text)
298  {  {
299          if (session->verbose)          if (session->verbose)
300                  printf("[%s] {%s} (%.16s) %s\n", user, id, created, text);                  printf("[%*s] {%s} (%.16s) %s\n", -session->column_output, user,
301                                    id, created, text);
302          else          else
303                  printf("[%s] %s\n", user, text);                  printf("[%*s] %s\n", -session->column_output, user, text);
304  }  }
305    
306  static void parse_statuses(struct session *session,  static void parse_statuses(struct session *session,
# Line 451  static int request_access_token(struct s Line 461  static int request_access_token(struct s
461          char *at_secret   = NULL;          char *at_secret   = NULL;
462          char *verifier    = NULL;          char *verifier    = NULL;
463          char at_uri[90];          char at_uri[90];
464            char token_uri[90];
465    
466          if (!session)          if (!session)
467                  return -EINVAL;                  return -EINVAL;
# Line 465  static int request_access_token(struct s Line 476  static int request_access_token(struct s
476                                  identica_request_token_uri, NULL,                                  identica_request_token_uri, NULL,
477                                  OA_HMAC, NULL, session->consumer_key,                                  OA_HMAC, NULL, session->consumer_key,
478                                  session->consumer_secret, NULL, NULL);                                  session->consumer_secret, NULL, NULL);
479            else {
480                    sprintf(token_uri, "%s%s",
481                            session->hosturl, custom_request_token_uri);
482                    request_url = oauth_sign_url2(
483                                    token_uri, NULL,
484                                    OA_HMAC, NULL, session->consumer_key,
485                                    session->consumer_secret, NULL, NULL);
486            }
487          reply = oauth_http_get(request_url, post_params);          reply = oauth_http_get(request_url, post_params);
488    
489          if (request_url)          if (request_url)
# Line 495  static int request_access_token(struct s Line 514  static int request_access_token(struct s
514                  verifier = session->readline(NULL);                  verifier = session->readline(NULL);
515                  sprintf(at_uri, "%s?oauth_verifier=%s",                  sprintf(at_uri, "%s?oauth_verifier=%s",
516                          identica_access_token_uri, verifier);                          identica_access_token_uri, verifier);
517            } else {
518                    fprintf(stdout, "%s%s%s\nPIN: ",
519                            session->hosturl, custom_authorize_uri, at_key);
520                    verifier = session->readline(NULL);
521                    sprintf(at_uri, "%s%s?oauth_verifier=%s",
522                            session->hosturl, custom_access_token_uri, verifier);
523          }          }
524          request_url = oauth_sign_url2(at_uri, NULL, OA_HMAC, NULL,          request_url = oauth_sign_url2(at_uri, NULL, OA_HMAC, NULL,
525                                        session->consumer_key,                                        session->consumer_key,
# Line 512  static int request_access_token(struct s Line 537  static int request_access_token(struct s
537    
538          fprintf(stdout,          fprintf(stdout,
539                  "Please put these two lines in your bti "                  "Please put these two lines in your bti "
540                  "configuration file (~/.bti):\n"                  "configuration file (%s):\n"
541                  "access_token_key=%s\n"                  "access_token_key=%s\n"
542                  "access_token_secret=%s\n",                  "access_token_secret=%s\n",
543                  at_key, at_secret);                  session->configfile, at_key, at_secret);
544    
545          return 0;          return 0;
546  }  }
# Line 550  static int send_request(struct session * Line 575  static int send_request(struct session *
575                  curl_buf->session = session;                  curl_buf->session = session;
576    
577                  curl = curl_init();                  curl = curl_init();
578                  if (!curl)                  if (!curl) {
579                            bti_curl_buffer_free(curl_buf);
580                          return -EINVAL;                          return -EINVAL;
581                    }
582    
583                  if (!session->hosturl)                  if (!session->hosturl)
584                          session->hosturl = strdup(twitter_host);                          session->hosturl = strdup(twitter_host);
# Line 651  static int send_request(struct session * Line 678  static int send_request(struct session *
678                                  if (res) {                                  if (res) {
679                                          fprintf(stderr, "error(%d) trying to "                                          fprintf(stderr, "error(%d) trying to "
680                                                  "perform operation\n", res);                                                  "perform operation\n", res);
681                                            curl_easy_cleanup(curl);
682                                            if (session->action == ACTION_UPDATE)
683                                                    curl_formfree(formpost);
684                                            bti_curl_buffer_free(curl_buf);
685                                          return -EINVAL;                                          return -EINVAL;
686                                  }                                  }
687    
# Line 658  static int send_request(struct session * Line 689  static int send_request(struct session *
689                                                      curl_buf->length,                                                      curl_buf->length,
690                                                      "response.xml", NULL,                                                      "response.xml", NULL,
691                                                      XML_PARSE_NOERROR);                                                      XML_PARSE_NOERROR);
692                                  if (doc == NULL)                                  if (doc == NULL) {
693                                            curl_easy_cleanup(curl);
694                                            if (session->action == ACTION_UPDATE)
695                                                    curl_formfree(formpost);
696                                            bti_curl_buffer_free(curl_buf);
697                                          return -EINVAL;                                          return -EINVAL;
698                                    }
699    
700                                  current = xmlDocGetRootElement(doc);                                  current = xmlDocGetRootElement(doc);
701                                  if (current == NULL) {                                  if (current == NULL) {
702                                          fprintf(stderr, "empty document\n");                                          fprintf(stderr, "empty document\n");
703                                          xmlFreeDoc(doc);                                          xmlFreeDoc(doc);
704                                            curl_easy_cleanup(curl);
705                                            if (session->action == ACTION_UPDATE)
706                                                    curl_formfree(formpost);
707                                            bti_curl_buffer_free(curl_buf);
708                                          return -EINVAL;                                          return -EINVAL;
709                                  }                                  }
710    
711                                  if (xmlStrcmp(current->name, (const xmlChar *)"status")) {                                  if (xmlStrcmp(current->name, (const xmlChar *)"status")) {
712                                          fprintf(stderr, "unexpected document type\n");                                          fprintf(stderr, "unexpected document type\n");
713                                          xmlFreeDoc(doc);                                          xmlFreeDoc(doc);
714                                            curl_easy_cleanup(curl);
715                                            if (session->action == ACTION_UPDATE)
716                                                    curl_formfree(formpost);
717                                            bti_curl_buffer_free(curl_buf);
718                                          return -EINVAL;                                          return -EINVAL;
719                                  }                                  }
720    
# Line 830  static char *get_string_from_stdin(void) Line 874  static char *get_string_from_stdin(void)
874          if (!string)          if (!string)
875                  return NULL;                  return NULL;
876    
877          if (!fgets(string, 999, stdin))          if (!fgets(string, 999, stdin)) {
878                    free(string);
879                  return NULL;                  return NULL;
880            }
881          temp = strchr(string, '\n');          temp = strchr(string, '\n');
882          if (temp)          if (temp)
883                  *temp = '\0';                  *temp = '\0';
# Line 841  static char *get_string_from_stdin(void) Line 887  static char *get_string_from_stdin(void)
887  static void read_password(char *buf, size_t len, char *host)  static void read_password(char *buf, size_t len, char *host)
888  {  {
889          char pwd[80];          char pwd[80];
         int retval;  
890          struct termios old;          struct termios old;
891          struct termios tp;          struct termios tp;
892    
# Line 854  static void read_password(char *buf, siz Line 899  static void read_password(char *buf, siz
899          fprintf(stdout, "Enter password for %s: ", host);          fprintf(stdout, "Enter password for %s: ", host);
900          fflush(stdout);          fflush(stdout);
901          tcflow(0, TCOOFF);          tcflow(0, TCOOFF);
902          retval = scanf("%79s", pwd);  
903            /*
904             * I'd like to do something with the return value here, but really,
905             * what can be done?
906             */
907            (void)scanf("%79s", pwd);
908    
909          tcflow(0, TCOON);          tcflow(0, TCOON);
910          fprintf(stdout, "\n");          fprintf(stdout, "\n");
911    
# Line 1002  error_in: Line 1053  error_in:
1053    
1054  static int pcloseRWE(int pid, int *rwepipe)  static int pcloseRWE(int pid, int *rwepipe)
1055  {  {
1056          int rc, status;          int status;
1057          close(rwepipe[0]);          close(rwepipe[0]);
1058          close(rwepipe[1]);          close(rwepipe[1]);
1059          close(rwepipe[2]);          close(rwepipe[2]);
1060          rc = waitpid(pid, &status, 0);          (void)waitpid(pid, &status, 0);
1061          return status;          return status;
1062  }  }
1063    
# Line 1145  int main(int argc, char *argv[], char *e Line 1196  int main(int argc, char *argv[], char *e
1196                  { "background", 0, NULL, 'B' },                  { "background", 0, NULL, 'B' },
1197                  { "dry-run", 0, NULL, 'n' },                  { "dry-run", 0, NULL, 'n' },
1198                  { "page", 1, NULL, 'g' },                  { "page", 1, NULL, 'g' },
1199                    { "column", 1, NULL, 'o' },
1200                  { "version", 0, NULL, 'v' },                  { "version", 0, NULL, 'v' },
1201                  { "config", 1, NULL, 'c' },                  { "config", 1, NULL, 'c' },
1202                  { "replyto", 1, NULL, 'r' },                  { "replyto", 1, NULL, 'r' },
# Line 1158  int main(int argc, char *argv[], char *e Line 1210  int main(int argc, char *argv[], char *e
1210          int retval = 0;          int retval = 0;
1211          int option;          int option;
1212          char *http_proxy;          char *http_proxy;
1213            char *home;
1214            const char *config_file;
1215          time_t t;          time_t t;
1216          int page_nr;          int page_nr;
1217    
# Line 1174  int main(int argc, char *argv[], char *e Line 1228  int main(int argc, char *argv[], char *e
1228          session->time = strdup(ctime(&t));          session->time = strdup(ctime(&t));
1229          session->time[strlen(session->time)-1] = 0x00;          session->time[strlen(session->time)-1] = 0x00;
1230    
1231          /* Get the home directory so we can try to find a config file */          /*
1232          session->homedir = strdup(getenv("HOME"));           * Get the home directory so we can try to find a config file.
1233             * If we have no home dir set up, look in /etc/bti
1234             */
1235            home = getenv("HOME");
1236            if (home) {
1237                    /* We have a home dir, so this might be a user */
1238                    session->homedir = strdup(home);
1239                    config_file = config_user_default;
1240            } else {
1241                    session->homedir = strdup("");
1242                    config_file = config_default;
1243            }
1244    
1245          /* set up a default config file location (traditionally ~/.bti) */          /* set up a default config file location (traditionally ~/.bti) */
1246          session->configfile = zalloc(strlen(session->homedir) + 7);          session->configfile = zalloc(strlen(session->homedir) + strlen(config_file) + 7);
1247          sprintf(session->configfile, "%s/.bti", session->homedir);          sprintf(session->configfile, "%s/%s", session->homedir, config_file);
1248    
1249          /* Set environment variables first, before reading command line options          /* Set environment variables first, before reading command line options
1250           * or config file values. */           * or config file values. */
# Line 1195  int main(int argc, char *argv[], char *e Line 1260  int main(int argc, char *argv[], char *e
1260    
1261          while (1) {          while (1) {
1262                  option = getopt_long_only(argc, argv,                  option = getopt_long_only(argc, argv,
1263                                            "dp:P:H:a:A:u:c:hg:G:sr:nVvw:",                                            "dp:P:H:a:A:u:c:hg:o:G:sr:nVvw:",
1264                                            options, NULL);                                            options, NULL);
1265                  if (option == -1)                  if (option == -1)
1266                          break;                          break;
# Line 1217  int main(int argc, char *argv[], char *e Line 1282  int main(int argc, char *argv[], char *e
1282                          dbg("page = %d\n", page_nr);                          dbg("page = %d\n", page_nr);
1283                          session->page = page_nr;                          session->page = page_nr;
1284                          break;                          break;
1285                    case 'o':
1286                            session->column_output = atoi(optarg);
1287                            dbg("column_output = %d\n", session->column_output);
1288                            break;
1289                  case 'r':                  case 'r':
1290                          session->replyto = strdup(optarg);                          session->replyto = strdup(optarg);
1291                          dbg("in_reply_to_status_id = %s\n", session->replyto);                          dbg("in_reply_to_status_id = %s\n", session->replyto);

Legend:
Removed from v.2706  
changed lines
  Added in v.2707

  ViewVC Help
Powered by ViewVC 1.1.26