/[debian]/bti/trunk/bti.c
ViewVC logotype

Diff of /bti/trunk/bti.c

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

revision 1951 by gregoa, Thu May 28 15:22:46 2009 UTC revision 1952 by gregoa, Wed Dec 2 15:49:24 2009 UTC
# Line 38  Line 38 
38  #include <libxml/parser.h>  #include <libxml/parser.h>
39  #include <libxml/tree.h>  #include <libxml/tree.h>
40  #include <pcre.h>  #include <pcre.h>
41    #include <termios.h>
42    
43    
44  #define zalloc(size)    calloc(size, 1)  #define zalloc(size)    calloc(size, 1)
# Line 65  enum action { Line 66  enum action {
66          ACTION_USER    = 2,          ACTION_USER    = 2,
67          ACTION_REPLIES = 4,          ACTION_REPLIES = 4,
68          ACTION_PUBLIC  = 8,          ACTION_PUBLIC  = 8,
69          ACTION_UNKNOWN = 16          ACTION_GROUP   = 16,
70            ACTION_UNKNOWN = 32
71  };  };
72    
73  struct session {  struct session {
# Line 77  struct session { Line 79  struct session {
79          char *homedir;          char *homedir;
80          char *logfile;          char *logfile;
81          char *user;          char *user;
82            char *group;
83          char *hosturl;          char *hosturl;
84          int bash;          int bash;
85          int shrink_urls;          int shrink_urls;
# Line 102  static void display_help(void) Line 105  static void display_help(void)
105          fprintf(stdout, "  --account accountname\n");          fprintf(stdout, "  --account accountname\n");
106          fprintf(stdout, "  --password password\n");          fprintf(stdout, "  --password password\n");
107          fprintf(stdout, "  --action action\n");          fprintf(stdout, "  --action action\n");
108          fprintf(stdout, "    ('update', 'friends', 'public', 'replies' "          fprintf(stdout, "    ('update', 'friends', 'public', 'replies', "
109                  "or 'user')\n");                  "'group' or 'user')\n");
110          fprintf(stdout, "  --user screenname\n");          fprintf(stdout, "  --user screenname\n");
111            fprintf(stdout, "  --group groupname\n");
112          fprintf(stdout, "  --proxy PROXY:PORT\n");          fprintf(stdout, "  --proxy PROXY:PORT\n");
113          fprintf(stdout, "  --host HOST\n");          fprintf(stdout, "  --host HOST\n");
114          fprintf(stdout, "  --logfile logfile\n");          fprintf(stdout, "  --logfile logfile\n");
# Line 144  static void session_free(struct session Line 148  static void session_free(struct session
148          free(session->time);          free(session->time);
149          free(session->homedir);          free(session->homedir);
150          free(session->user);          free(session->user);
151            free(session->group);
152          free(session->hosturl);          free(session->hosturl);
153          free(session);          free(session);
154  }  }
# Line 184  static const char *update_uri  = "/updat Line 189  static const char *update_uri  = "/updat
189  static const char *public_uri  = "/public_timeline.xml";  static const char *public_uri  = "/public_timeline.xml";
190  static const char *friends_uri = "/friends_timeline.xml";  static const char *friends_uri = "/friends_timeline.xml";
191  static const char *replies_uri = "/replies.xml";  static const char *replies_uri = "/replies.xml";
192    static const char *group_uri = "/../laconica/groups/timeline/";
193    
194  static CURL *curl_init(void)  static CURL *curl_init(void)
195  {  {
# Line 350  static int send_request(struct session * Line 356  static int send_request(struct session *
356                  curl_easy_setopt(curl, CURLOPT_HTTPPOST, formpost);                  curl_easy_setopt(curl, CURLOPT_HTTPPOST, formpost);
357                  slist = curl_slist_append(slist, "Expect:");                  slist = curl_slist_append(slist, "Expect:");
358                  curl_easy_setopt(curl, CURLOPT_HTTPHEADER, slist);                  curl_easy_setopt(curl, CURLOPT_HTTPHEADER, slist);
359                    
360                  sprintf(endpoint, "%s%s", session->hosturl, update_uri);                  sprintf(endpoint, "%s%s", session->hosturl, update_uri);
361                  curl_easy_setopt(curl, CURLOPT_URL, endpoint);                  curl_easy_setopt(curl, CURLOPT_URL, endpoint);
362                  curl_easy_setopt(curl, CURLOPT_USERPWD, user_password);                  curl_easy_setopt(curl, CURLOPT_USERPWD, user_password);
# Line 366  static int send_request(struct session * Line 372  static int send_request(struct session *
372    
373                  break;                  break;
374          case ACTION_USER:          case ACTION_USER:
375                  sprintf(endpoint, "%s%s%s.xml?page=%d", session->hosturl, user_uri,                  sprintf(endpoint, "%s%s%s.xml?page=%d", session->hosturl,
376                                  session->user, session->page);                          user_uri, session->user, session->page);
377                  curl_easy_setopt(curl, CURLOPT_URL, endpoint);                  curl_easy_setopt(curl, CURLOPT_URL, endpoint);
378    
379                  break;                  break;
380          case ACTION_REPLIES:          case ACTION_REPLIES:
381                  snprintf(user_password, sizeof(user_password), "%s:%s",                  snprintf(user_password, sizeof(user_password), "%s:%s",
382                           session->account, session->password);                           session->account, session->password);
383                  sprintf(endpoint, "%s%s?page=%d", session->hosturl, replies_uri, session->page);                  sprintf(endpoint, "%s%s?page=%d", session->hosturl, replies_uri,
384                            session->page);
385                  curl_easy_setopt(curl, CURLOPT_URL, endpoint);                  curl_easy_setopt(curl, CURLOPT_URL, endpoint);
386                  curl_easy_setopt(curl, CURLOPT_USERPWD, user_password);                  curl_easy_setopt(curl, CURLOPT_USERPWD, user_password);
387    
388                  break;                  break;
389          case ACTION_PUBLIC:          case ACTION_PUBLIC:
390                  sprintf(endpoint, "%s%s?page=%d", session->hosturl, public_uri, session->page);                  sprintf(endpoint, "%s%s?page=%d", session->hosturl, public_uri,
391                            session->page);
392                    curl_easy_setopt(curl, CURLOPT_URL, endpoint);
393    
394                    break;
395            case ACTION_GROUP:
396                    sprintf(endpoint, "%s%s%s.xml?page=%d", session->hosturl,
397                                    group_uri, session->group, session->page);
398                  curl_easy_setopt(curl, CURLOPT_URL, endpoint);                  curl_easy_setopt(curl, CURLOPT_URL, endpoint);
399    
400                  break;                  break;
# Line 501  static void parse_configfile(struct sess Line 515  static void parse_configfile(struct sess
515                          if (!strncasecmp(c, "true", 4) ||                          if (!strncasecmp(c, "true", 4) ||
516                                          !strncasecmp(c, "yes", 3))                                          !strncasecmp(c, "yes", 3))
517                                  shrink_urls = 1;                                  shrink_urls = 1;
518                  }                  } else if (!strncasecmp(c, "verbose", 7) &&
                 else if (!strncasecmp(c, "verbose", 7) &&  
519                                  (c[7] == '=')) {                                  (c[7] == '=')) {
520                          c += 8;                          c += 8;
521                          if (!strncasecmp(c, "true", 4) ||                          if (!strncasecmp(c, "true", 4) ||
522                                          !strncasecmp(c, "yes", 3))                                          !strncasecmp(c, "yes", 3))
523                                  verbose = 1;                                  verbose = 1;
524                  }                        }
525          } while (!feof(config_file));          } while (!feof(config_file));
526    
527          if (password)          if (password)
# Line 546  static void parse_configfile(struct sess Line 559  static void parse_configfile(struct sess
559                          session->action = ACTION_REPLIES;                          session->action = ACTION_REPLIES;
560                  else if (strcasecmp(action, "public") == 0)                  else if (strcasecmp(action, "public") == 0)
561                          session->action = ACTION_PUBLIC;                          session->action = ACTION_PUBLIC;
562                    else if (strcasecmp(action, "group") == 0)
563                            session->action = ACTION_GROUP;
564                  else                  else
565                          session->action = ACTION_UNKNOWN;                          session->action = ACTION_UNKNOWN;
566                  free(action);                  free(action);
# Line 614  static void log_session(struct session * Line 629  static void log_session(struct session *
629                  fprintf(log_file, "%s: host=%s retrieving public timeline\n",                  fprintf(log_file, "%s: host=%s retrieving public timeline\n",
630                          session->time, host);                          session->time, host);
631                  break;                  break;
632            case ACTION_GROUP:
633                    fprintf(log_file, "%s: host=%s retrieving group timeline\n",
634                            session->time, host);
635                    break;
636          default:          default:
637                  break;                  break;
638          }          }
# Line 637  static char *get_string_from_stdin(void) Line 656  static char *get_string_from_stdin(void)
656          return string;          return string;
657  }  }
658    
659    static void read_password(char *buf, size_t len)
660    {
661            char pwd[80];
662            int retval;
663            struct termios old;
664            struct termios tp;
665    
666            tcgetattr(0, &tp);
667            old = tp;
668    
669            tp.c_lflag &= (~ECHO);
670            tcsetattr(0, TCSANOW, &tp);
671    
672            fprintf(stdout, "Enter twitter password: ");
673            fflush(stdout);
674            tcflow(0, TCOOFF);
675            retval = scanf("%79s", pwd);
676            tcflow(0, TCOON);
677            fprintf(stdout, "\n");
678    
679            tcsetattr(0, TCSANOW, &old);
680    
681            strncpy(buf, pwd, len);
682            buf[len-1] = '\0';
683    }
684    
685  static int find_urls(const char *tweet, int **pranges)  static int find_urls(const char *tweet, int **pranges)
686  {  {
687          /*          /*
# Line 910  int main(int argc, char *argv[], char *e Line 955  int main(int argc, char *argv[], char *e
955                  { "proxy", 1, NULL, 'P' },                  { "proxy", 1, NULL, 'P' },
956                  { "action", 1, NULL, 'A' },                  { "action", 1, NULL, 'A' },
957                  { "user", 1, NULL, 'u' },                  { "user", 1, NULL, 'u' },
958                    { "group", 1, NULL, 'G' },
959                  { "logfile", 1, NULL, 'L' },                  { "logfile", 1, NULL, 'L' },
960                  { "shrink-urls", 0, NULL, 's' },                  { "shrink-urls", 0, NULL, 's' },
961                  { "help", 0, NULL, 'h' },                  { "help", 0, NULL, 'h' },
# Line 922  int main(int argc, char *argv[], char *e Line 968  int main(int argc, char *argv[], char *e
968          struct session *session;          struct session *session;
969          pid_t child;          pid_t child;
970          char *tweet;          char *tweet;
971            static char password[80];
972          int retval = 0;          int retval = 0;
973          int option;          int option;
974          char *http_proxy;          char *http_proxy;
# Line 960  int main(int argc, char *argv[], char *e Line 1007  int main(int argc, char *argv[], char *e
1007          parse_configfile(session);          parse_configfile(session);
1008    
1009          while (1) {          while (1) {
1010                  option = getopt_long_only(argc, argv, "dp:P:H:a:A:u:hg:snVv",                  option = getopt_long_only(argc, argv, "dp:P:H:a:A:u:hg:G:snVv",
1011                                            options, NULL);                                            options, NULL);
1012                  if (option == -1)                  if (option == -1)
1013                          break;                          break;
# Line 1005  int main(int argc, char *argv[], char *e Line 1052  int main(int argc, char *argv[], char *e
1052                                  session->action = ACTION_REPLIES;                                  session->action = ACTION_REPLIES;
1053                          else if (strcasecmp(optarg, "public") == 0)                          else if (strcasecmp(optarg, "public") == 0)
1054                                  session->action = ACTION_PUBLIC;                                  session->action = ACTION_PUBLIC;
1055                            else if (strcasecmp(optarg, "group") == 0)
1056                                    session->action = ACTION_GROUP;
1057                          else                          else
1058                                  session->action = ACTION_UNKNOWN;                                  session->action = ACTION_UNKNOWN;
1059                          dbg("action = %d\n", session->action);                          dbg("action = %d\n", session->action);
# Line 1015  int main(int argc, char *argv[], char *e Line 1064  int main(int argc, char *argv[], char *e
1064                          session->user = strdup(optarg);                          session->user = strdup(optarg);
1065                          dbg("user = %s\n", session->user);                          dbg("user = %s\n", session->user);
1066                          break;                          break;
1067    
1068                    case 'G':
1069                            if (session->group)
1070                                    free(session->group);
1071                            session->group = strdup(optarg);
1072                            dbg("group = %s\n", session->group);
1073                            break;
1074                  case 'L':                  case 'L':
1075                          if (session->logfile)                          if (session->logfile)
1076                                  free(session->logfile);                                  free(session->logfile);
# Line 1067  int main(int argc, char *argv[], char *e Line 1123  int main(int argc, char *argv[], char *e
1123          if (session->action == ACTION_UNKNOWN) {          if (session->action == ACTION_UNKNOWN) {
1124                  fprintf(stderr, "Unknown action, valid actions are:\n");                  fprintf(stderr, "Unknown action, valid actions are:\n");
1125                  fprintf(stderr, "'update', 'friends', 'public', "                  fprintf(stderr, "'update', 'friends', 'public', "
1126                          "'replies' or 'user'.\n");                          "'replies', 'group' or 'user'.\n");
1127                  goto exit;                  goto exit;
1128          }          }
1129    
1130            if (session->host == HOST_TWITTER && session->action == ACTION_GROUP) {
1131                    fprintf(stderr, "Groups only work in Identi.ca.\n");
1132                    goto exit;
1133            }
1134    
1135            if (session->action == ACTION_GROUP && !session->group) {
1136                    fprintf(stdout, "Enter group name: ");
1137                    session->group = readline(NULL);
1138            }
1139    
1140          if (!session->account) {          if (!session->account) {
1141                  fprintf(stdout, "Enter twitter account: ");                  fprintf(stdout, "Enter twitter account: ");
1142                  session->account = readline(NULL);                  session->account = readline(NULL);
1143          }          }
1144    
1145          if (!session->password) {          if (!session->password) {
1146                  fprintf(stdout, "Enter twitter password: ");                  read_password(password, sizeof(password));
1147                  session->password = readline(NULL);                  session->password = strdup(password);
1148          }          }
1149    
1150          if (session->action == ACTION_UPDATE) {          if (session->action == ACTION_UPDATE) {
# Line 1096  int main(int argc, char *argv[], char *e Line 1162  int main(int argc, char *argv[], char *e
1162    
1163                  session->tweet = zalloc(strlen(tweet) + 10);                  session->tweet = zalloc(strlen(tweet) + 10);
1164                  if (session->bash)                  if (session->bash)
1165                          sprintf(session->tweet, "%c %s", getuid() ? '$' : '#', tweet);                          sprintf(session->tweet, "%c %s",
1166                                    getuid() ? '$' : '#', tweet);
1167                  else                  else
1168                          sprintf(session->tweet, "%s", tweet);                          sprintf(session->tweet, "%s", tweet);
1169    

Legend:
Removed from v.1951  
changed lines
  Added in v.1952

  ViewVC Help
Powered by ViewVC 1.1.26