Changes in / [b8c336b:356e2dd]
- Files:
-
- 20 edited
Legend:
- Unmodified
- Added
- Removed
-
bitlbee.h
rb8c336b r356e2dd 93 93 #undef g_source_remove 94 94 #define g_source_remove __PLEASE_USE_B_EVENT_REMOVE__ 95 #undef g_source_remove_by_user_data 96 #define g_source_remove_by_user_data __PLEASE_USE_B_SOURCE_REMOVE_BY_USER_DATA__ 95 97 #undef g_main_run 96 98 #define g_main_run __PLEASE_USE_B_MAIN_RUN__ -
configure
rb8c336b r356e2dd 56 56 GLIB_MIN_VERSION=2.16 57 57 58 echo BitlBee configure 59 58 60 # Cygwin and Darwin don't support PIC/PIE 59 61 case "$arch" in … … 63 65 pie=0;; 64 66 esac 65 66 get_version() {67 REAL_BITLBEE_VERSION=$(grep '^#define BITLBEE_VERSION ' $srcdir/bitlbee.h | sed 's/.*\"\(.*\)\".*/\1/')68 69 if [ -n "$BITLBEE_VERSION" ]; then70 # environment variable already set to something to spoof it71 # don't replace it with the git stuff72 return73 fi74 75 BITLBEE_VERSION=$REAL_BITLBEE_VERSION76 77 if [ -d $srcdir/.git ] && type git > /dev/null 2> /dev/null; then78 timestamp=$(cd $srcdir; git show -s --format=%ci HEAD | sed 's/ .*$//; s/-//g')79 branch=$(cd $srcdir; git rev-parse --abbrev-ref HEAD)80 81 search="(.+)-([0-9]+)-(g[0-9a-f]+)"82 replace="\1+$timestamp+$branch+\2-\3-git"83 84 BITLBEE_VERSION=$(cd $srcdir; git describe --long --tags | sed -r "s/$search/$replace/")85 86 unset timestamp branch search replace87 fi88 }89 90 if [ "$1" = "--dump-version" ]; then91 srcdir=$(cd $(dirname $0);pwd)92 get_version93 echo $BITLBEE_VERSION94 exit95 fi96 97 echo BitlBee configure98 67 99 68 while [ -n "$1" ]; do … … 703 672 fi 704 673 705 get_version 706 707 if [ "$BITLBEE_VERSION" != "$REAL_BITLBEE_VERSION" ]; then 674 REAL_BITLBEE_VERSION=`grep '^#define BITLBEE_VERSION ' $srcdir/bitlbee.h | sed 's/.*\"\(.*\)\".*/\1/'` 675 echo 676 if [ -z "$BITLBEE_VERSION" -a -d .bzr ] && type bzr > /dev/null 2> /dev/null; then 677 nick=`bzr nick` 678 if [ -n "$nick" -a "$nick" != "bitlbee" ]; then 679 nick="-$nick" 680 else 681 nick="" 682 fi 683 rev=`bzr revno` 684 echo 'Using bzr revision #'$rev' as version number' 685 BITLBEE_VERSION=$REAL_BITLBEE_VERSION-bzr$nick-$rev 686 fi 687 688 if [ -z "$BITLBEE_VERSION" -a -d .git ] && type git > /dev/null 2> /dev/null; then 689 rev=`git describe --long --tags`-`git rev-parse --abbrev-ref HEAD` 690 echo 'Using '$rev' as git version number' 691 BITLBEE_VERSION=$rev-git 692 fi 693 694 if [ -n "$BITLBEE_VERSION" ]; then 708 695 echo 'Spoofing version number: '$BITLBEE_VERSION 709 696 echo '#undef BITLBEE_VERSION' >> config.h 710 697 echo '#define BITLBEE_VERSION "'$BITLBEE_VERSION'"' >> config.h 711 698 echo 699 else 700 # for pkg-config 701 BITLBEE_VERSION=$REAL_BITLBEE_VERSION 712 702 fi 713 703 -
debian/control
rb8c336b r356e2dd 22 22 Architecture: any 23 23 Depends: ${misc:Depends}, ${shlibs:Depends}, debianutils (>= 1.16), bitlbee-common (= ${source:Version}) 24 Provides: bitlbee25 24 Conflicts: bitlbee 26 25 Replaces: bitlbee -
doc/user-guide/commands.xml
rb8c336b r356e2dd 121 121 <description> 122 122 <para> 123 This command deletes an account from your account list. You should signoff the account before deleting it.123 This commands deletes an account from your account list. You should signoff the account before deleting it. 124 124 </para> 125 125 … … 853 853 <varlistentry><term>favourite <screenname|#id></term><listitem><para>Favo<emphasis>u</emphasis>rite the given user's most recent tweet, or the given tweet ID.</para></listitem></varlistentry> 854 854 <varlistentry><term>post <message></term><listitem><para>Post a tweet</para></listitem></varlistentry> 855 <varlistentry><term>url <screenname|#id></term><listitem><para>Show URL for a tweet to open it in a browser (and see context)</para></listitem></varlistentry>856 855 </variablelist> 857 856 -
irc_im.c
rb8c336b r356e2dd 50 50 51 51 memset(nick, 0, MAX_NICK_LENGTH + 1); 52 str ncpy(nick, nick_get(bu), MAX_NICK_LENGTH);52 strcpy(nick, nick_get(bu)); 53 53 54 54 bu->ui_data = iu = irc_user_new(irc, nick); … … 752 752 g_free(channel); 753 753 channel = s; 754 } else {755 g_free(s);756 754 } 757 755 } -
irc_send.c
rb8c336b r356e2dd 175 175 176 176 if (iu == irc->user) { 177 irc_write(irc, ":%s MODE %s +%s", irc->root->host, ic->name, ic->mode); 178 irc_send_names(ic); 177 179 if (ic->topic && *ic->topic) { 178 180 irc_send_topic(ic, FALSE); 179 181 } 180 irc_send_names(ic);181 182 } 182 183 } -
lib/events_glib.c
rb8c336b r356e2dd 82 82 } 83 83 84 event_debug("gaim_io_invoke( %d, %d, %p)\n", g_io_channel_unix_get_fd(source), condition, data);84 event_debug("gaim_io_invoke( %d, %d, 0x%x )\n", g_io_channel_unix_get_fd(source), condition, data); 85 85 86 86 st = closure->function(closure->data, g_io_channel_unix_get_fd(source), gaim_cond); … … 101 101 static void gaim_io_destroy(gpointer data) 102 102 { 103 event_debug("gaim_io_destroy( 0 %p)\n", data);103 event_debug("gaim_io_destroy( 0x%x )\n", data); 104 104 g_free(data); 105 105 } … … 127 127 gaim_io_invoke, closure, gaim_io_destroy); 128 128 129 event_debug("b_input_add( %d, %d, %p, %p) = %d (%p)\n", source, condition, function, data, st, closure);129 event_debug("b_input_add( %d, %d, 0x%x, 0x%x ) = %d (%p)\n", source, condition, function, data, st, closure); 130 130 131 131 g_io_channel_unref(channel); … … 140 140 gint st = g_timeout_add(timeout, (GSourceFunc) func, data); 141 141 142 event_debug("b_timeout_add( %d, % p, %p) = %d\n", timeout, func, data, st);142 event_debug("b_timeout_add( %d, %d, %d ) = %d\n", timeout, func, data, st); 143 143 144 144 return st; -
lib/oauth.c
rb8c336b r356e2dd 96 96 { 97 97 int key_len = strlen(key); 98 GSList *l , *n;98 GSList *l; 99 99 100 100 if (!params) { … … 102 102 } 103 103 104 for (l = *params; l; l = n) { 105 n = l->next; 104 for (l = *params; l; l = l->next) { 106 105 char *data = l->data; 107 106 -
lib/oauth2.c
rb8c336b r356e2dd 140 140 struct oauth2_access_token_data *cb_data = req->data; 141 141 char *atoken = NULL, *rtoken = NULL, *error = NULL; 142 char *content_type = NULL;142 char *content_type; 143 143 144 if (req->status_code <= 0 && !req->reply_body) { 145 cb_data->func(cb_data->data, NULL, NULL, req->status_string); 146 g_free(cb_data); 147 return; 148 } 149 150 if (getenv("BITLBEE_DEBUG")) { 144 if (getenv("BITLBEE_DEBUG") && req->reply_body) { 151 145 printf("%s\n", req->reply_body); 152 146 } -
protocols/jabber/hipchat.c
rb8c336b r356e2dd 47 47 jd->flags &= ~JFLAG_STREAM_RESTART; 48 48 49 if (!jabber_get_roster(ic) || 50 !jabber_iq_disco_server(ic) || 51 !jabber_get_hipchat_profile(ic) || 52 !jabber_iq_disco_muc(ic, muc_host)) { 49 if (!jabber_get_roster(ic)) { 50 return XT_ABORT; 51 } 52 if (!jabber_iq_disco_server(ic)) { 53 return XT_ABORT; 54 } 55 if (!jabber_get_hipchat_profile(ic)) { 56 return XT_ABORT; 57 } 58 if (!jabber_iq_disco_muc(ic, muc_host)) { 53 59 return XT_ABORT; 54 60 } … … 78 84 { 79 85 struct xt_node *query, *name_node; 86 87 //char *name; 80 88 81 89 if (!(query = xt_find_node(node->children, "query"))) { -
protocols/jabber/iq.c
rb8c336b r356e2dd 373 373 static xt_status jabber_parse_roster(struct im_connection *ic, struct xt_node *node, struct xt_node *orig) 374 374 { 375 struct jabber_data *jd = ic->proto_data;376 375 struct xt_node *query, *c; 377 376 int initial = (orig != NULL); … … 389 388 char *sub = xt_find_attr(c, "subscription"); 390 389 char *mention_name = xt_find_attr(c, "mention_name"); 390 char *nick = mention_name ? : name; 391 391 392 392 if (jid && sub) { … … 399 399 } 400 400 401 /* This could also be used to set the full name as nick for fb/gtalk, 402 * but i'm keeping the old (ugly?) default behavior just to be safe */ 403 if (mention_name && (jd->flags & JFLAG_HIPCHAT)) { 404 imcb_buddy_nick_hint(ic, jid, mention_name); 401 if (nick) { 402 imcb_buddy_nick_hint(ic, jid, nick); 405 403 } 406 404 } else if (strcmp(sub, "remove") == 0) { -
protocols/jabber/jabber.c
rb8c336b r356e2dd 428 428 } 429 429 430 jabber_get_vcard(ic, who);430 jabber_get_vcard(ic, bud ? bud->full_jid : who); 431 431 } 432 432 -
protocols/msn/gw.c
rb8c336b r356e2dd 87 87 gw->polling = FALSE; 88 88 89 if (req->status_code != 200 || !req->reply_body) {90 gw->callback(gw->md, -1, B_EV_IO_READ);91 return;92 }93 94 89 if (getenv("BITLBEE_DEBUG")) { 95 90 fprintf(stderr, "\n\x1b[90mHTTP:%s\n", req->reply_body); 96 91 fprintf(stderr, "\n\x1b[97m\n"); 92 } 93 94 if (req->status_code != 200) { 95 gw->callback(gw->md, -1, B_EV_IO_READ); 96 return; 97 97 } 98 98 … … 113 113 if (req->body_size) { 114 114 g_byte_array_append(gw->in, (const guint8 *) req->reply_body, req->body_size); 115 116 if (!gw->callback(gw->md, -1, B_EV_IO_READ)) { 117 return; 118 } 115 gw->callback(gw->md, -1, B_EV_IO_READ); 119 116 } 120 117 -
protocols/msn/ns.c
rb8c336b r356e2dd 181 181 imcb_error(ic, "Error while reading from server"); 182 182 imc_logout(ic, TRUE); 183 g_free(bytes);184 183 return FALSE; 185 184 } … … 189 188 g_free(bytes); 190 189 191 return msn_handler(md); 190 /* Ignore ret == 0, it's already disconnected then. */ 191 msn_handler(md); 192 193 return TRUE; 194 192 195 } 193 196 -
protocols/oscar/ssi.c
rb8c336b r356e2dd 66 66 newitem->gid += 0x0001; 67 67 for (cur = *list, i = 0; ((cur) && (!i)); cur = cur->next) { 68 if ((cur-> bid == newitem->bid) && (cur->gid == newitem->gid)) {68 if ((cur->gid == newitem->gid) && (cur->gid == newitem->gid)) { 69 69 i = 1; 70 70 } -
protocols/twitter/twitter.c
rb8c336b r356e2dd 483 483 } 484 484 485 int twitter_message_len(gchar *msg, int target_len) 486 { 485 static gboolean twitter_length_check(struct im_connection *ic, gchar * msg) 486 { 487 int max = set_getint(&ic->acc->set, "message_length"), len; 488 int target_len = set_getint(&ic->acc->set, "target_url_length"); 487 489 int url_len_diff = 0; 488 490 … … 491 493 } 492 494 493 return g_utf8_strlen(msg, -1) + url_len_diff; 494 } 495 496 static gboolean twitter_length_check(struct im_connection *ic, gchar * msg) 497 { 498 int max = set_getint(&ic->acc->set, "message_length"); 499 int target_len = set_getint(&ic->acc->set, "target_url_length"); 500 int len = twitter_message_len(msg, target_len); 501 502 if (max == 0 || len <= max) { 495 if (max == 0 || (len = g_utf8_strlen(msg, -1) + url_len_diff) <= max) { 503 496 return TRUE; 504 497 } … … 874 867 } 875 868 876 bee_user_t twitter_log_local_user;877 878 869 /** Convert the given bitlbee tweet ID, bitlbee username, or twitter tweet ID 879 870 * into a twitter tweet ID. … … 906 897 bu = td->log[id].bu; 907 898 id = td->log[id].id; 899 /* Beware of dangling pointers! */ 900 if (!g_slist_find(ic->bee->users, bu)) { 901 bu = NULL; 902 } 908 903 } else if (twitter_parse_id(arg, 10, &id)) { 909 904 /* Allow normal tweet IDs as well; not a very useful … … 916 911 } 917 912 if (bu_) { 918 if (bu == &twitter_log_local_user) {919 /* HACK alert. There's no bee_user object for the local920 * user so just fake one for the few cmds that need it. */921 twitter_log_local_user.handle = td->user;922 } else {923 /* Beware of dangling pointers! */924 if (!g_slist_find(ic->bee->users, bu)) {925 bu = NULL;926 }927 }928 913 *bu_ = bu; 929 914 } … … 1018 1003 in_reply_to = id; 1019 1004 allow_post = TRUE; 1020 } else if (g_strcasecmp(cmd[0], "url") == 0) {1021 id = twitter_message_id_from_command_arg(ic, cmd[1], &bu);1022 if (!id) {1023 twitter_log(ic, "Tweet `%s' does not exist", cmd[1]);1024 } else {1025 /* More common link is twitter.com/$UID/status/$ID (and that's1026 * what this will 302 to) but can't generate that since for RTs,1027 * bu here points at the retweeter while id contains the id of1028 * the original message. */1029 twitter_log(ic, "https://twitter.com/statuses/%lld", id);1030 }1031 goto eof;1032 1033 1005 } else if (g_strcasecmp(cmd[0], "post") == 0) { 1034 1006 message += 5; -
protocols/twitter/twitter.h
rb8c336b r356e2dd 101 101 struct twitter_log_data { 102 102 guint64 id; 103 /* DANGER: bu can be a dead pointer. Check it first. 104 * twitter_message_id_from_command_arg() will do this. */ 105 struct bee_user *bu; 103 struct bee_user *bu; /* DANGER: can be a dead pointer. Check it first. */ 106 104 }; 107 105 … … 112 110 */ 113 111 extern GSList *twitter_connections; 114 115 /**116 * Evil hack: Fake bee_user which will always point at the local user.117 * Sometimes used as a return value by twitter_message_id_from_command_arg.118 * NOT thread safe but don't you dare to even think of ever making BitlBee119 * threaded. :-)120 */121 extern bee_user_t twitter_log_local_user;122 112 123 113 void twitter_login_finish(struct im_connection *ic); -
protocols/twitter/twitter_lib.c
rb8c336b r356e2dd 460 460 #endif 461 461 462 static void expand_entities(char **text, const json_value *node);462 static char* expand_entities(char* text, const json_value *entities); 463 463 464 464 /** … … 473 473 { 474 474 struct twitter_xml_status *txs; 475 const json_value *rt = NULL ;475 const json_value *rt = NULL, *entities = NULL; 476 476 477 477 if (node->type != json_object) { … … 501 501 } else if (strcmp("in_reply_to_status_id", k) == 0 && v->type == json_integer) { 502 502 txs->reply_to = v->u.integer; 503 } else if (strcmp("entities", k) == 0 && v->type == json_object) { 504 entities = v; 503 505 } 504 506 } … … 514 516 txs_free(rtxs); 515 517 } 516 } else {517 expand_entities(&txs->text, node);518 } else if (entities) { 519 txs->text = expand_entities(txs->text, entities); 518 520 } 519 521 … … 532 534 { 533 535 struct twitter_xml_status *txs; 536 const json_value *entities = NULL; 534 537 535 538 if (node->type != json_object) { … … 558 561 } 559 562 560 expand_entities(&txs->text, node); 563 if (entities) { 564 txs->text = expand_entities(txs->text, entities); 565 } 561 566 562 567 if (txs->text && txs->user && txs->id) { … … 568 573 } 569 574 570 static void expand_entities(char **text, const json_value *node) 571 { 572 json_value *entities, *quoted; 573 char *quote_url = NULL, *quote_text = NULL; 574 575 if (!((entities = json_o_get(node, "entities")) && entities->type == json_object)) 576 return; 577 if ((quoted = json_o_get(node, "quoted_status")) && quoted->type == json_object) { 578 /* New "retweets with comments" feature. Note that this info 579 * seems to be included in the streaming API only! Grab the 580 * full message and try to insert it when we run into the 581 * Tweet entity. */ 582 struct twitter_xml_status *txs = twitter_xt_get_status(quoted); 583 quote_text = g_strdup_printf("@%s: %s", txs->user->screen_name, txs->text); 584 quote_url = g_strdup_printf("%s/status/%" G_GUINT64_FORMAT, txs->user->screen_name, txs->id); 585 txs_free(txs); 586 } else { 587 quoted = NULL; 588 } 589 575 static char* expand_entities(char* text, const json_value *entities) 576 { 590 577 JSON_O_FOREACH(entities, k, v) { 591 578 int i; … … 599 586 600 587 for (i = 0; i < v->u.array.length; i++) { 601 const char *format = "%s%s <%s>%s";602 603 588 if (v->u.array.values[i]->type != json_object) { 604 589 continue; … … 607 592 const char *kort = json_o_str(v->u.array.values[i], "url"); 608 593 const char *disp = json_o_str(v->u.array.values[i], "display_url"); 609 const char *full = json_o_str(v->u.array.values[i], "expanded_url");610 594 char *pos, *new; 611 595 612 if (!kort || !disp || !(pos = strstr( *text, kort))) {596 if (!kort || !disp || !(pos = strstr(text, kort))) { 613 597 continue; 614 598 } 615 if (quote_url && strstr(full, quote_url)) {616 format = "%s<%s> [%s]%s";617 disp = quote_text;618 }619 599 620 600 *pos = '\0'; 621 new = g_strdup_printf( format, *text, kort,601 new = g_strdup_printf("%s%s <%s>%s", text, kort, 622 602 disp, pos + strlen(kort)); 623 603 624 g_free( *text);625 *text = new;626 } 627 } 628 g_free(quote_text); 629 g_free(quote_url);604 g_free(text); 605 text = new; 606 } 607 } 608 609 return text; 630 610 } 631 611 … … 701 681 if (g_strcasecmp(txs->user->screen_name, td->user) == 0) { 702 682 td->log[td->log_id].id = txs->rt_id; 703 /* More useful than NULL. */704 td->log[td->log_id].bu = &twitter_log_local_user;705 683 } 706 684 -
protocols/yahoo/yahoo2.h
rb8c336b r356e2dd 33 33 #undef malloc 34 34 #define malloc(x) g_malloc(x) 35 #undef calloc 36 #define calloc(x, y) g_calloc(x, y) 35 37 #undef realloc 36 38 #define realloc(x, y) g_realloc(x, y) -
unix.c
rb8c336b r356e2dd 212 212 argv[0], argv[0], argv[0], argv[0], argv[0]); 213 213 } else if (strcmp(argv[2], "enc") == 0) { 214 char *encoded; 215 216 pass_len = arc_encode(argv[4], strlen(argv[4]), &pass_cr, argv[3], 12); 217 218 encoded = base64_encode(pass_cr, pass_len); 219 printf("%s\n", encoded); 220 g_free(encoded); 221 g_free(pass_cr); 214 pass_len = arc_encode(argv[4], strlen(argv[4]), (unsigned char **) &pass_cr, argv[3], 12); 215 printf("%s\n", base64_encode(pass_cr, pass_len)); 222 216 } else if (strcmp(argv[2], "dec") == 0) { 223 pass_len = base64_decode(argv[4], &pass_cr);217 pass_len = base64_decode(argv[4], (unsigned char **) &pass_cr); 224 218 arc_decode(pass_cr, pass_len, (char **) &pass_cl, argv[3]); 225 219 printf("%s\n", pass_cl); 226 227 g_free(pass_cr);228 g_free(pass_cl);229 220 } else if (strcmp(argv[2], "hash") == 0) { 230 221 md5_byte_t pass_md5[21]; 231 222 md5_state_t md5_state; 232 char *encoded;233 223 234 224 random_bytes(pass_md5 + 16, 5); … … 238 228 md5_finish(&md5_state, pass_md5); 239 229 240 encoded = base64_encode(pass_md5, 21); 241 printf("%s\n", encoded); 242 g_free(encoded); 230 printf("%s\n", base64_encode(pass_md5, 21)); 243 231 } else if (strcmp(argv[2], "unhash") == 0) { 244 232 printf("Hash %s submitted to a massive Beowulf cluster of\n"
Note: See TracChangeset
for help on using the changeset viewer.