Changes in / [1d21d9f:f97c1a6]
- Files:
-
- 1 added
- 33 edited
Legend:
- Unmodified
- Added
- Removed
-
README
raeadc74 r13ee8f2 18 18 BarnOwl currently requires the following perl modules off of CPAN: 19 19 20 AnyEvent 20 21 PAR 21 22 Net::DNS … … 30 31 The IRC module requires: 31 32 32 Net::IRC33 AnyEvent::IRC 33 34 Class::Accessor 34 35 -
cmd.c
rf25df21 r4c7c21f 12 12 13 13 int owl_cmddict_setup(owl_cmddict *cd) { 14 if (0 != owl_cmddict_init(cd)) return(-1);14 owl_cmddict_init(cd); 15 15 if (0 != owl_cmddict_add_from_list(cd, commands_to_init)) return(-1); 16 16 return(0); 17 17 } 18 18 19 int owl_cmddict_init(owl_cmddict *cd) { 20 if (owl_dict_create(cd)) return(-1); 21 return(0); 19 void owl_cmddict_init(owl_cmddict *cd) { 20 owl_dict_create(cd); 22 21 } 23 22 … … 99 98 100 99 char *owl_cmddict_execute_argv(const owl_cmddict *cd, const owl_context *ctx, const char *const *argv, int argc) { 101 GString *buf = g_string_new(""); 102 int i; 103 char *retval; 104 105 /* We weren't given a command line, so fabricate a valid one. */ 106 for(i = 0; i < argc; i++) { 107 if (i != 0) 108 g_string_append_c(buf, ' '); 109 owl_string_append_quoted_arg(buf, argv[i]); 110 } 111 112 retval = _owl_cmddict_execute(cd, ctx, argv, argc, buf->str); 113 114 g_string_free(buf, true); 100 char *buff; 101 char *retval = NULL; 102 103 buff = g_strjoinv(" ", (char**)argv); 104 retval = _owl_cmddict_execute(cd, ctx, argv, argc, buff); 105 g_free(buff); 106 115 107 return retval; 116 108 } … … 142 134 void owl_cmd_cleanup(owl_cmd *cmd) 143 135 { 144 if (cmd->name)g_free(cmd->name);145 if (cmd->summary)g_free(cmd->summary);146 if (cmd->usage)g_free(cmd->usage);147 if (cmd->description)g_free(cmd->description);148 if (cmd->cmd_aliased_to)g_free(cmd->cmd_aliased_to);136 g_free(cmd->name); 137 g_free(cmd->summary); 138 g_free(cmd->usage); 139 g_free(cmd->description); 140 g_free(cmd->cmd_aliased_to); 149 141 if (cmd->cmd_perl) owl_perlconfig_cmd_cleanup(cmd); 150 142 } -
commands.c
rc809f5e r3b8a563 1288 1288 } 1289 1289 owl_function_nextmsg_full(filter, skip_deleted, last_if_none); 1290 if (filter)g_free(filter);1290 g_free(filter); 1291 1291 return(NULL); 1292 1292 } … … 1318 1318 } 1319 1319 owl_function_prevmsg_full(filter, skip_deleted, first_if_none); 1320 if (filter)g_free(filter);1320 g_free(filter); 1321 1321 return(NULL); 1322 1322 } … … 1691 1691 commands = g_strsplit_set(newbuff, ";", 0); 1692 1692 for (i = 0; commands[i] != NULL; i++) { 1693 if (lastrv) { 1694 g_free(lastrv); 1695 } 1693 g_free(lastrv); 1696 1694 lastrv = owl_function_command(commands[i]); 1697 1695 } -
configure.ac
r1255365 r1255365 115 115 116 116 dnl Add CFLAGS and LIBS for glib-2.0 117 PKG_CHECK_MODULES(GLIB,[glib-2.0 gobject-2.0 gthread-2.0])117 PKG_CHECK_MODULES(GLIB,[glib-2.0 >= 2.12 gobject-2.0 gthread-2.0]) 118 118 119 119 AC_MSG_NOTICE([Adding glib-2.0 CFLAGS ${GLIB_CFLAGS}]) -
dict.c
rf25df21 r4c7c21f 15 15 #define GROWBY 3 / 2 16 16 17 intowl_dict_create(owl_dict *d) {17 void owl_dict_create(owl_dict *d) { 18 18 d->size=0; 19 19 d->els=g_new(owl_dict_el, INITSIZE); 20 20 d->avail=INITSIZE; 21 if (d->els==NULL) return(-1);22 return(0);23 21 } 24 22 … … 60 58 /* Appends dictionary keys to a list. Duplicates the keys, 61 59 * so they will need to be freed by the caller. */ 62 intowl_dict_get_keys(const owl_dict *d, owl_list *l) {60 void owl_dict_get_keys(const owl_dict *d, owl_list *l) { 63 61 int i; 64 char *dupk;65 62 for (i=0; i<d->size; i++) { 66 if ((dupk = g_strdup(d->els[i].k)) == NULL) return(-1); 67 owl_list_append_element(l, dupk); 63 owl_list_append_element(l, g_strdup(d->els[i].k)); 68 64 } 69 return(0);70 65 } 71 66 … … 84 79 { 85 80 int pos, found; 86 char *dupk;87 81 found = _owl_dict_find_pos(d, k, &pos); 88 82 if (found && delete_on_replace) { … … 99 93 if (d->els==NULL) return(-1); 100 94 } 101 if ((dupk = g_strdup(k)) == NULL) return(-1);102 95 if (pos!=d->size) { 103 96 /* shift forward to leave us a slot */ … … 106 99 } 107 100 d->size++; 108 d->els[pos].k = dupk;101 d->els[pos].k = g_strdup(k); 109 102 d->els[pos].v = v; 110 103 return(0); -
editwin.c
r47e0a6a r3b8a563 317 317 } 318 318 319 if (locktext) 320 g_free(locktext); 319 g_free(locktext); 321 320 322 321 oe_set_index(e, lock); -
fmtext.c
r4479497 r7b4f3be 184 184 } 185 185 186 static void _owl_fmtext_update_colorpair(short fg, short bg, short *pair)187 {188 if (owl_global_get_hascolors(&g)) {189 *pair = owl_fmtext_get_colorpair(fg, bg);190 }191 }192 193 186 static void _owl_fmtext_wcolor_set(WINDOW *w, short pair) 194 187 { 195 if ( owl_global_get_hascolors(&g)) {188 if (has_colors()) { 196 189 wcolor_set(w,pair,NULL); 197 190 wbkgdset(w, COLOR_PAIR(pair)); … … 221 214 bg = default_bgcolor; 222 215 _owl_fmtext_wattrset(w, attr); 223 _owl_fmtext_update_colorpair(fg, bg, &pair);216 pair = owl_fmtext_get_colorpair(fg, bg); 224 217 _owl_fmtext_wcolor_set(w, pair); 225 218 … … 270 263 if (bg == OWL_COLOR_DEFAULT) bg = default_bgcolor; 271 264 _owl_fmtext_wattrset(w, attr); 272 _owl_fmtext_update_colorpair(fg, bg, &pair);265 pair = owl_fmtext_get_colorpair(fg, bg); 273 266 _owl_fmtext_wcolor_set(w, pair); 274 267 … … 662 655 continue */ 663 656 } else if (!strcasecmp(buff, "@color") 664 && owl_global_get_hascolors(&g)665 657 && owl_global_is_colorztext(&g)) { 666 658 g_free(buff); … … 820 812 } 821 813 } 822 if ( owl_global_get_hascolors(&g)) {814 if (has_colors()) { 823 815 for(i = 0; i < 8; i++) { 824 816 short fg, bg; … … 835 827 owl_colorpair_mgr *cpmgr; 836 828 short pair; 829 830 if (!has_colors()) 831 return 0; 837 832 838 833 /* Sanity (Bounds) Check */ … … 852 847 if (!(pair != -1 && pair < cpmgr->next)) { 853 848 /* If we didn't find a pair, search for a free one to assign. */ 854 pair = (cpmgr->next < COLOR_PAIRS) ? cpmgr->next : -1;849 pair = (cpmgr->next < owl_util_get_colorpairs()) ? cpmgr->next : -1; 855 850 if (pair != -1) { 856 851 /* We found a free pair, initialize it. */ -
functions.c
r47128d9 r47128d9 32 32 char *rv; 33 33 rv=owl_function_command(cmdbuff); 34 if (rv)g_free(rv);34 g_free(rv); 35 35 } 36 36 … … 453 453 454 454 if (rv || status) { 455 if(cryptmsg)g_free(cryptmsg);455 g_free(cryptmsg); 456 456 g_free(old_msg); 457 457 owl_function_error("Error in zcrypt, possibly no key found. Message not sent."); … … 991 991 /* execute the commands in shutdown */ 992 992 ret = owl_perlconfig_execute("BarnOwl::Hooks::_shutdown();"); 993 if (ret)g_free(ret);993 g_free(ret); 994 994 995 995 /* signal our child process, if any */ … … 1817 1817 owl_global_get_cols(&g)); 1818 1818 1819 if ( owl_global_get_hascolors(&g)) {1819 if (has_colors()) { 1820 1820 owl_fmtext_append_normal(&fm, "Color: Yes\n"); 1821 owl_fmtext_appendf_normal(&fm, "Number of color pairs: %i\n", owl_ global_get_colorpairs(&g));1821 owl_fmtext_appendf_normal(&fm, "Number of color pairs: %i\n", owl_util_get_colorpairs()); 1822 1822 owl_fmtext_appendf_normal(&fm, "Can change colors: %s\n", can_change_color() ? "yes" : "no"); 1823 1823 } else { … … 2226 2226 f = fl->data; 2227 2227 owl_fmtext_append_normal(&fm, " "); 2228 if (owl_global_get_hascolors(&g)) { 2229 owl_fmtext_append_normal_color(&fm, owl_filter_get_name(f), owl_filter_get_fgcolor(f), owl_filter_get_bgcolor(f)); 2230 } else { 2231 owl_fmtext_append_normal(&fm, owl_filter_get_name(f)); 2232 } 2228 owl_fmtext_append_normal_color(&fm, owl_filter_get_name(f), 2229 owl_filter_get_fgcolor(f), 2230 owl_filter_get_bgcolor(f)); 2233 2231 owl_fmtext_append_normal(&fm, "\n"); 2234 2232 } … … 2360 2358 done: 2361 2359 g_free(class); 2362 if (instance) { 2363 g_free(instance); 2364 } 2360 g_free(instance); 2365 2361 return(filtname); 2366 2362 } … … 2523 2519 2524 2520 filtname = g_strdup_printf("conversation-%s", ccs); 2525 owl_text_tr(filtname, ' ', '-');2521 g_strdelimit(filtname, " ", '-'); 2526 2522 2527 2523 if (owl_global_get_filter(&g, filtname)) { … … 2959 2955 2960 2956 if (viewsize==0) { 2961 owl_function_ error("No messages present");2957 owl_function_makemsg("No messages present"); 2962 2958 return; 2963 2959 } … … 2973 2969 /* bounds check */ 2974 2970 if (start>=viewsize || start<0) { 2975 owl_function_ error("No further matches found");2971 owl_function_makemsg("No further matches found"); 2976 2972 return; 2977 2973 } … … 3002 2998 } 3003 2999 owl_mainwin_redisplay(owl_global_get_mainwin(&g)); 3004 owl_function_ error("No matches found");3000 owl_function_makemsg("No matches found"); 3005 3001 } 3006 3002 -
global.c
rdc1edbd rdc1edbd 54 54 g->direction=OWL_DIRECTION_DOWNWARDS; 55 55 g->zaway=0; 56 if (has_colors()) {57 g->hascolors=1;58 }59 g->colorpairs=COLOR_PAIRS;60 56 owl_fmtext_init_colorpair_mgr(&(g->cpmgr)); 61 57 g->debug=OWL_DEBUG; … … 512 508 513 509 void owl_global_set_startupargs(owl_global *g, int argc, char **argv) { 514 if (g->startupargs)g_free(g->startupargs);510 g_free(g->startupargs); 515 511 g->startupargs = g_strjoinv(" ", argv); 516 512 } … … 577 573 owl_view *owl_global_get_current_view(owl_global *g) { 578 574 return(&(g->current_view)); 579 }580 581 /* has colors */582 583 int owl_global_get_hascolors(const owl_global *g) {584 if (g->hascolors) return(1);585 return(0);586 }587 588 /* color pairs */589 590 int owl_global_get_colorpairs(const owl_global *g) {591 return(g->colorpairs);592 575 } 593 576 … … 773 756 } 774 757 775 intowl_global_get_style_names(const owl_global *g, owl_list *l) {776 returnowl_dict_get_keys(&(g->styledict), l);758 void owl_global_get_style_names(const owl_global *g, owl_list *l) { 759 owl_dict_get_keys(&(g->styledict), l); 777 760 } 778 761 -
keybinding.c
rd07af84 r3b8a563 69 69 void owl_keybinding_delete(owl_keybinding *kb) 70 70 { 71 if (kb->keys)g_free(kb->keys);72 if (kb->desc)g_free(kb->desc);73 if (kb->command)g_free(kb->command);71 g_free(kb->keys); 72 g_free(kb->desc); 73 g_free(kb->command); 74 74 g_free(kb); 75 75 } -
keymap.c
r47e0a6a r4c7c21f 9 9 { 10 10 if (!name || !desc) return(-1); 11 if ((km->name = g_strdup(name)) == NULL) return(-1);12 if ((km->desc = g_strdup(desc)) == NULL) return(-1);13 if (0 != owl_list_create(&km->bindings)) return(-1);11 km->name = g_strdup(name); 12 km->desc = g_strdup(desc); 13 owl_list_create(&km->bindings); 14 14 km->parent = NULL; 15 15 km->default_fn = default_fn; … … 179 179 /* NOTE: keyhandler has private access to the internals of keymap */ 180 180 181 intowl_keyhandler_init(owl_keyhandler *kh)182 { 183 if (0 != owl_dict_create(&kh->keymaps)) return(-1);181 void owl_keyhandler_init(owl_keyhandler *kh) 182 { 183 owl_dict_create(&kh->keymaps); 184 184 kh->active = NULL; 185 185 owl_keyhandler_reset(kh); 186 return(0);187 186 } 188 187 -
list.c
rddbbcffa rfda61d3 5 5 #define GROWBY 3 / 2 6 6 7 intowl_list_create(owl_list *l)7 void owl_list_create(owl_list *l) 8 8 { 9 9 l->size=0; 10 10 l->list=g_new(void *, INITSIZE); 11 11 l->avail=INITSIZE; 12 if (l->list==NULL) return(-1);13 return(0);14 12 } 15 13 -
logging.c
rfe3b017 r7865479 151 151 } else if (owl_message_is_type_jabber(m)) { 152 152 to = g_strdup_printf("jabber:%s", owl_message_get_recipient(m)); 153 owl_text_tr(to, '/', '_');153 g_strdelimit(to, "/", '_'); 154 154 } else if (owl_message_is_type_aim(m)) { 155 155 char *temp2; -
owl.c
r1d21d9f r1d21d9f 41 41 char *confdir; 42 42 bool debug; 43 bool rm_debug;44 43 } owl_options; 45 44 … … 50 49 fprintf(stderr, " -n,--no-subs don't load zephyr subscriptions\n"); 51 50 fprintf(stderr, " -d,--debug enable debugging\n"); 52 fprintf(stderr, " -D,--remove-debug enable debugging and delete previous debug file\n");53 51 fprintf(stderr, " -v,--version print the Barnowl version number and exit\n"); 54 52 fprintf(stderr, " -h,--help print this help message\n"); … … 66 64 { "tty", 1, 0, 't' }, 67 65 { "debug", 0, 0, 'd' }, 68 { "remove-debug", 0, 0, 'D' },69 66 { "version", 0, 0, 'v' }, 70 67 { "help", 0, 0, 'h' }, … … 88 85 opts->tty = g_strdup(optarg); 89 86 break; 90 case 'D':91 opts->rm_debug = 1;92 /* fallthrough */93 87 case 'd': 94 88 opts->debug = 1; … … 509 503 /* owl global init */ 510 504 owl_global_init(&g); 511 if (opts.rm_debug) unlink(OWL_DEBUG_FILE);512 505 if (opts.debug) owl_global_set_debug_on(&g); 513 506 if (opts.confdir) owl_global_set_confdir(&g, opts.confdir); … … 577 570 owl_function_debugmsg("startup: executing perl startup, if applicable"); 578 571 perlout = owl_perlconfig_execute("BarnOwl::Hooks::_startup();"); 579 if (perlout)g_free(perlout);572 g_free(perlout); 580 573 581 574 /* welcome message */ -
owl.h
rdc1edbd rdc1edbd 66 66 #include "window.h" 67 67 68 #ifndef OWL_VERSION_STRING 68 69 #ifdef GIT_VERSION 69 70 #define stringify(x) __stringify(x) … … 73 74 #define OWL_VERSION_STRING PACKAGE_VERSION 74 75 #endif 76 #endif /* !OWL_VERSION_STRING */ 75 77 76 78 /* Feature that is being tested to redirect stderr through a pipe. … … 602 604 char *startupargs; 603 605 int nextmsgid; 604 int hascolors;605 int colorpairs;606 606 owl_colorpair_mgr cpmgr; 607 607 pid_t newmsgproc_pid; -
perl/lib/BarnOwl.pm
rb120bd3 rf2d71cfa 38 38 use BarnOwl::Completion; 39 39 use BarnOwl::Help; 40 use BarnOwl::AnyEvent; 41 42 unshift @AnyEvent::REGISTRY, [BarnOwl => BarnOwl::AnyEvent::]; 43 require AnyEvent; 40 44 41 45 use List::Util qw(max); -
perl/modules/IRC/lib/BarnOwl/Message/IRC.pm
re04b7a1 r60b49a7 66 66 sub action {shift->{action}} 67 67 sub reason {shift->{reason}} 68 sub old_nick {shift->{old_nick}}; 68 69 69 70 # display … … 80 81 } 81 82 82 sub login_extra { 83 sub login_extra { 83 84 my $self = shift; 84 85 if ($self->action eq "quit") { 85 86 return $self->reason; 87 } elsif ($self->action eq 'nick change') { 88 return "was: " . $self->old_nick; 86 89 } else { 87 90 return $self->channel; -
perl/modules/IRC/lib/BarnOwl/Module/IRC.pm
r9620c8d r5c6d661 20 20 use BarnOwl::Module::IRC::Completion; 21 21 22 use Net::IRC;22 use AnyEvent::IRC; 23 23 use Getopt::Long; 24 24 use Encode; … … 30 30 # Hash alias -> BarnOwl::Module::IRC::Connection object 31 31 our %ircnets; 32 our %channels;33 our %reconnect;34 32 35 33 sub startup { … … 70 68 71 69 register_commands(); 72 register_handlers();73 70 BarnOwl::filter(qw{irc type ^IRC$ or ( type ^admin$ and adminheader ^IRC$ )}); 74 71 } … … 76 73 sub shutdown { 77 74 for my $conn (values %ircnets) { 78 $conn->conn->disconnect( );75 $conn->conn->disconnect('Quitting'); 79 76 } 80 77 } … … 98 95 $list .= "\n"; 99 96 100 for my $chan (keys %channels) { 101 next unless grep $_ eq $conn, @{$channels{$chan}}; 97 for my $chan (keys %{$conn->conn->{channel_list}}) { 102 98 $list .= " $chan\n"; 103 99 } … … 105 101 106 102 return $list; 107 }108 109 #sub mainloop_hook {110 # return unless defined $irc;111 # eval {112 # $irc->do_one_loop();113 # };114 # return;115 #}116 117 sub OwlProcess {118 return unless defined $irc;119 eval {120 $irc->do_one_loop();121 };122 return;123 }124 125 126 sub register_handlers {127 if(!$irc) {128 $irc = Net::IRC->new;129 $irc->timeout(0);130 }131 103 } 132 104 … … 406 378 } 407 379 408 my $conn = BarnOwl::Module::IRC::Connection->new($irc, $alias, 409 Nick => $nick, 410 Server => $host, 411 Port => $port, 412 Username => $username, 413 Ircname => $ircname, 414 Port => $port, 415 Password => $password, 416 SSL => $ssl 417 ); 418 419 if ($conn->conn->connected) { 420 $conn->connected("Connected to $alias as $nick"); 421 } else { 422 die("IRC::Connection->connect failed: $!"); 423 } 424 380 my $conn = BarnOwl::Module::IRC::Connection->new($alias, $host, $port, { 381 nick => $nick, 382 user => $username, 383 real => $ircname, 384 password => $password, 385 SSL => $ssl, 386 timeout => sub {0} 387 }); 388 $ircnets{$alias} = $conn; 425 389 return; 426 390 } … … 429 393 my $cmd = shift; 430 394 my $conn = shift; 431 if ($conn->conn->connected) { 432 $conn->conn->disconnect; 433 } elsif ($reconnect{$conn->alias}) { 395 if ($conn->conn->{socket}) { 396 $conn->did_quit(1); 397 $conn->conn->disconnect("Goodbye!"); 398 } elsif ($conn->{reconnect_timer}) { 434 399 BarnOwl::admin_message('IRC', 435 400 "[" . $conn->alias . "] Reconnect cancelled"); 436 401 $conn->cancel_reconnect; 402 delete $ircnets{$conn->alias}; 437 403 } 438 404 } … … 463 429 for my $body (@msgs) { 464 430 if ($body =~ /^\/me (.*)/) { 465 $conn-> conn->me($to, Encode::encode('utf-8', $1));431 $conn->me($to, Encode::encode('utf-8', $1)); 466 432 $body = '* '.$conn->nick.' '.$1; 467 433 } else { 468 $conn->conn-> privmsg($to, Encode::encode('utf-8', $body));434 $conn->conn->send_msg('privmsg', $to, Encode::encode('utf-8', $body)); 469 435 } 470 436 my $msg = BarnOwl::Message->new( … … 491 457 my $target = shift; 492 458 $target ||= shift; 493 $conn->conn-> mode($target, @_);459 $conn->conn->send_msg(mode => $target, @_); 494 460 return; 495 461 } … … 499 465 my $conn = shift; 500 466 my $chan = shift or die("Usage: $cmd channel\n"); 501 $channels{$chan} ||= []; 502 push @{$channels{$chan}}, $conn; 503 $conn->conn->join($chan, @_); 467 $conn->conn->send_msg(join => $chan, @_); 504 468 return; 505 469 } … … 509 473 my $conn = shift; 510 474 my $chan = shift; 511 $channels{$chan} = [grep {$_ ne $conn} @{$channels{$chan} || []}]; 512 $conn->conn->part($chan); 475 $conn->conn->send_msg(part => $chan); 513 476 return; 514 477 } … … 518 481 my $conn = shift; 519 482 my $nick = shift or die("Usage: $cmd <new nick>\n"); 520 $conn->conn-> nick($nick);483 $conn->conn->send_msg(nick => $nick); 521 484 return; 522 485 } … … 527 490 my $chan = shift; 528 491 $conn->names_tmp([]); 529 $conn->conn-> names($chan);492 $conn->conn->send_msg(names => $chan); 530 493 return; 531 494 } … … 535 498 my $conn = shift; 536 499 my $who = shift || die("Usage: $cmd <user>\n"); 537 $conn->conn-> whois($who);500 $conn->conn->send_msg(whois => $who); 538 501 return; 539 502 } … … 542 505 my $cmd = shift; 543 506 my $conn = shift; 544 $conn->conn-> motd;507 $conn->conn->send_msg('motd'); 545 508 return; 546 509 } … … 560 523 my $conn = shift; 561 524 my $who = shift || die("Usage: $cmd <user>\n"); 562 BarnOwl::error("WHO $cmd $conn $who"); 563 $conn->conn->who($who); 525 $conn->conn->send_msg(who => $who); 564 526 return; 565 527 } … … 569 531 my $conn = shift; 570 532 my $type = shift || die("Usage: $cmd <chiklmouy> [server] \n"); 571 $conn->conn->s tats($type, @_);533 $conn->conn->send_msg(stats => $type, @_); 572 534 return; 573 535 } … … 577 539 my $conn = shift; 578 540 my $chan = shift; 579 $conn->conn-> topic($chan, @_ ? join(" ", @_) : undef);541 $conn->conn->send_msg(topic => $chan, @_ ? join(" ", @_) : undef); 580 542 return; 581 543 } … … 584 546 my $cmd = shift; 585 547 my $conn = shift; 586 $conn->conn->s l(join(" ", @_));548 $conn->conn->send_msg(@_); 587 549 return; 588 550 } … … 591 553 ########################### Utilities/Helpers ################################## 592 554 ################################################################################ 555 556 sub find_channel { 557 my $channel = shift; 558 my @found; 559 for my $conn (values %ircnets) { 560 if($conn->conn->{channel_list}{lc $channel}) { 561 push @found, $conn; 562 } 563 } 564 return $found[0] if(scalar @found == 1); 565 } 593 566 594 567 sub mk_irc_command { … … 614 587 $channel = $ARGV[0]; 615 588 if(defined($channel) && $channel =~ /^#/) { 616 if( $channels{$channel} && @{$channels{$channel}} == 1) {589 if(my $c = find_channel($channel)) { 617 590 shift @ARGV; 618 $conn = $channels{$channel}[0] unless $conn;591 $conn ||= $c; 619 592 } 620 593 } elsif ($m && $m->type eq 'IRC' && !$m->is_private) { … … 654 627 my $allow_disconnected = shift; 655 628 656 return $ircnets{$key} if exists $ircnets{$key}; 657 return $reconnect{$key} if $allow_disconnected && exists $reconnect{$key}; 658 die("No such ircnet: $key\n") 629 my $conn = $ircnets{$key}; 630 die("No such ircnet: $key\n") unless $conn; 631 if ($conn->conn->{registered} || $allow_disconnected) { 632 return $conn; 633 } 634 die("[@{[$conn->alias]}] Not currently connected."); 659 635 } 660 636 -
perl/modules/IRC/lib/BarnOwl/Module/IRC/Completion.pm
r955a36e rdace02a 11 11 sub complete_networks { keys %BarnOwl::Module::IRC::ircnets } 12 12 sub complete_dests { keys %users, complete_channels() } 13 sub complete_channels { keys %BarnOwl::Module::IRC::channels } 13 sub complete_channels { 14 my %channels; 15 for my $conn (values %BarnOwl::Module::IRC::ircnets) { 16 for my $chan (keys %{$conn->conn->{channel_list}}) { 17 $channels{$chan} = 1; 18 } 19 } 20 return keys %channels; 21 } 14 22 sub complete_nicks { keys %users } 15 23 sub complete_servers { keys %servers } -
perl/modules/IRC/lib/BarnOwl/Module/IRC/Connection.pm
rfb6e8e3 r13ee8f2 11 11 =head1 DESCRIPTION 12 12 13 This module is a wrapper around Net::IRC::Connectionfor BarnOwl's IRC13 This module is a wrapper around AnyEvent::IRC::Client for BarnOwl's IRC 14 14 support 15 15 16 16 =cut 17 17 18 use Net::IRC::Connection; 19 20 use base qw(Class::Accessor Exporter); 21 __PACKAGE__->mk_accessors(qw(conn alias channels motd names_tmp whois_tmp)); 22 our @EXPORT_OK = qw(&is_private); 18 use AnyEvent::IRC::Client; 19 use AnyEvent::IRC::Util qw(split_prefix prefix_nick encode_ctcp); 20 21 use base qw(Class::Accessor); 22 use Exporter 'import'; 23 __PACKAGE__->mk_accessors(qw(conn alias motd names_tmp whois_tmp 24 server autoconnect_channels 25 connect_args backoff did_quit)); 26 our @EXPORT_OK = qw(is_private); 23 27 24 28 use BarnOwl; 25 29 use Scalar::Util qw(weaken); 26 30 27 BEGIN {28 no strict 'refs';29 my @delegate = qw(nick server);30 for my $meth (@delegate) {31 *{"BarnOwl::Module::IRC::Connection::$meth"} = sub {32 shift->conn->$meth(@_);33 }34 }35 };36 37 31 sub new { 38 32 my $class = shift; 39 my $irc = shift;40 33 my $alias = shift; 41 my %args = (@_); 42 my $conn = Net::IRC::Connection->new($irc, %args); 34 my $host = shift; 35 my $port = shift; 36 my $args = shift; 37 my $nick = $args->{nick}; 38 my $conn = AnyEvent::IRC::Client->new(); 43 39 my $self = bless({}, $class); 44 40 $self->conn($conn); 41 $self->autoconnect_channels([]); 45 42 $self->alias($alias); 46 $self-> channels([]);43 $self->server($host); 47 44 $self->motd(""); 48 45 $self->names_tmp(0); 46 $self->backoff(0); 49 47 $self->whois_tmp(""); 50 51 $self->conn->add_default_handler(sub { shift; $self->on_event(@_) }); 52 $self->conn->add_handler(['msg', 'notice', 'public', 'caction'], 53 sub { shift; $self->on_msg(@_) }); 54 $self->conn->add_handler(['welcome', 'yourhost', 'created', 55 'luserclient', 'luserop', 'luserchannels', 'luserme', 56 'error'], 57 sub { shift; $self->on_admin_msg(@_) }); 58 $self->conn->add_handler(['myinfo', 'map', 'n_local', 'n_global', 59 'luserconns'], 60 sub { }); 61 $self->conn->add_handler(motdstart => sub { shift; $self->on_motdstart(@_) }); 62 $self->conn->add_handler(motd => sub { shift; $self->on_motd(@_) }); 63 $self->conn->add_handler(endofmotd => sub { shift; $self->on_endofmotd(@_) }); 64 $self->conn->add_handler(join => sub { shift; $self->on_join(@_) }); 65 $self->conn->add_handler(part => sub { shift; $self->on_part(@_) }); 66 $self->conn->add_handler(quit => sub { shift; $self->on_quit(@_) }); 67 $self->conn->add_handler(disconnect => sub { shift; $self->on_disconnect(@_) }); 68 $self->conn->add_handler(nicknameinuse => sub { shift; $self->on_nickinuse(@_) }); 69 $self->conn->add_handler(cping => sub { shift; $self->on_ping(@_) }); 70 $self->conn->add_handler(topic => sub { shift; $self->on_topic(@_) }); 71 $self->conn->add_handler(topicinfo => sub { shift; $self->on_topicinfo(@_) }); 72 $self->conn->add_handler(namreply => sub { shift; $self->on_namreply(@_) }); 73 $self->conn->add_handler(endofnames=> sub { shift; $self->on_endofnames(@_) }); 74 $self->conn->add_handler(endofwhois=> sub { shift; $self->on_endofwhois(@_) }); 75 $self->conn->add_handler(mode => sub { shift; $self->on_mode(@_) }); 76 $self->conn->add_handler(nosuchchannel => sub { shift; $self->on_nosuchchannel(@_) }); 48 $self->did_quit(0); 49 50 if(delete $args->{SSL}) { 51 $conn->enable_ssl; 52 } 53 $self->connect_args([$host, $port, $args]); 54 $conn->connect($host, $port, $args); 55 $conn->{heap}{parent} = $self; 56 weaken($conn->{heap}{parent}); 57 58 sub on { 59 my $meth = "on_" . shift; 60 return sub { 61 my $conn = shift; 62 return unless $conn->{heap}{parent}; 63 $conn->{heap}{parent}->$meth(@_); 64 } 65 } 66 67 # $self->conn->add_default_handler(sub { shift; $self->on_event(@_) }); 68 $self->conn->reg_cb(registered => on("connect"), 69 connfail => sub { BarnOwl::error("Connection to $host failed!") }, 70 disconnect => on("disconnect"), 71 publicmsg => on("msg"), 72 privatemsg => on("msg"), 73 irc_error => on("error")); 74 for my $m (qw(welcome yourhost created 75 luserclient luserop luserchannels luserme 76 error)) { 77 $self->conn->reg_cb("irc_$m" => on("admin_msg")); 78 } 79 $self->conn->reg_cb(irc_375 => on("motdstart"), 80 irc_372 => on("motd"), 81 irc_376 => on("endofmotd"), 82 irc_join => on("join"), 83 irc_part => on("part"), 84 irc_quit => on("quit"), 85 irc_433 => on("nickinuse"), 86 channel_topic => on("topic"), 87 irc_333 => on("topicinfo"), 88 irc_353 => on("namreply"), 89 irc_366 => on("endofnames"), 90 irc_311 => on("whois"), 91 irc_312 => on("whois"), 92 irc_319 => on("whois"), 93 irc_320 => on("whois"), 94 irc_318 => on("endofwhois"), 95 irc_mode => on("mode"), 96 irc_401 => on("nosuch"), 97 irc_402 => on("nosuch"), 98 irc_403 => on("nosuch"), 99 nick_change => on("nick"), 100 ctcp_action => on("ctcp_action"), 101 'irc_*' => sub { BarnOwl::debug("IRC: " . $_[1]->{command} . " " . 102 join(" ", @{$_[1]->{params}})) }); 77 103 78 104 return $self; 105 } 106 107 sub nick { 108 my $self = shift; 109 return $self->conn->nick; 79 110 } 80 111 … … 83 114 my $self = shift; 84 115 return $self->conn->socket; 116 } 117 118 sub me { 119 my ($self, $to, $msg) = @_; 120 $self->conn->send_msg('privmsg', $to, 121 encode_ctcp(['ACTION', $msg])) 85 122 } 86 123 … … 92 129 my $self = shift; 93 130 my $evt = shift; 94 return BarnOwl::Message->new(131 my %args = ( 95 132 type => 'IRC', 96 133 server => $self->server, 97 134 network => $self->alias, 98 sender => $evt->nick,99 hostname => $evt->host,100 from => $evt->from,101 135 @_ 102 136 ); 137 if ($evt) { 138 my ($nick, $user, $host) = split_prefix($evt); 139 $args{sender} ||= $nick; 140 $args{hostname} ||= $host if defined($host); 141 $args{from} ||= $evt->{prefix}; 142 $args{params} ||= join(' ', @{$evt->{params}}) 143 } 144 return BarnOwl::Message->new(%args); 103 145 } 104 146 105 147 sub on_msg { 106 my ($self, $evt) = @_; 107 my ($recipient) = $evt->to; 108 my $body = strip_irc_formatting([$evt->args]->[0]); 109 my $nick = $self->nick; 110 $body = '* '.$evt->nick.' '.$body if $evt->type eq 'caction'; 148 my ($self, $recipient, $evt) = @_; 149 my $body = strip_irc_formatting($evt->{params}->[1]); 150 $self->handle_message($recipient, $evt, $body); 151 } 152 153 sub on_ctcp_action { 154 my ($self, $src, $target, $msg) = @_; 155 my $body = strip_irc_formatting($msg); 156 my $evt = { 157 params => [$src], 158 type => 'privmsg', 159 prefix => $src 160 }; 161 $self->handle_message($target, $evt, "* $body"); 162 } 163 164 sub handle_message { 165 my ($self, $recipient, $evt, $body) = @_; 111 166 my $msg = $self->new_message($evt, 112 167 direction => 'in', 113 168 recipient => $recipient, 114 body => $body,115 $evt->typeeq 'notice' ?169 body => $body, 170 ($evt->{command}||'') eq 'notice' ? 116 171 (notice => 'true') : (), 117 172 is_private($recipient) ? 118 173 (private => 'true') : (channel => $recipient), 119 174 replycmd => BarnOwl::quote('irc-msg', '-a', $self->alias, 120 (is_private($recipient) ? $evt->nick: $recipient)),121 replysendercmd => BarnOwl::quote('irc-msg', '-a', $self->alias, $evt->nick),175 (is_private($recipient) ? prefix_nick($evt) : $recipient)), 176 replysendercmd => BarnOwl::quote('irc-msg', '-a', $self->alias, prefix_nick($evt)), 122 177 ); 123 178 … … 125 180 } 126 181 127 sub on_ping {128 my ($self, $evt) = @_;129 $self->conn->ctcp_reply($evt->nick, join (' ', ($evt->args)));130 }131 182 132 183 sub on_admin_msg { 133 184 my ($self, $evt) = @_; 134 return if BarnOwl::Module::IRC->skip_msg($evt-> type);135 BarnOwl::admin_message("IRC", 136 BarnOwl::Style::boldify('IRC ' . $evt-> type. ' message from '185 return if BarnOwl::Module::IRC->skip_msg($evt->{command}); 186 BarnOwl::admin_message("IRC", 187 BarnOwl::Style::boldify('IRC ' . $evt->{command} . ' message from ' 137 188 . $self->alias) . "\n" 138 . strip_irc_formatting(join ' ', cdr($evt-> args)));189 . strip_irc_formatting(join ' ', cdr($evt->{params}))); 139 190 } 140 191 141 192 sub on_motdstart { 142 193 my ($self, $evt) = @_; 143 $self->motd(join "\n", cdr( $evt->args));194 $self->motd(join "\n", cdr(@{$evt->{params}})); 144 195 } 145 196 146 197 sub on_motd { 147 198 my ($self, $evt) = @_; 148 $self->motd(join "\n", $self->motd, cdr( $evt->args));199 $self->motd(join "\n", $self->motd, cdr(@{$evt->{params}})); 149 200 } 150 201 151 202 sub on_endofmotd { 152 203 my ($self, $evt) = @_; 153 $self->motd(join "\n", $self->motd, cdr( $evt->args));204 $self->motd(join "\n", $self->motd, cdr(@{$evt->{params}})); 154 205 BarnOwl::admin_message("IRC", 155 206 BarnOwl::Style::boldify('MOTD for ' . $self->alias) . "\n" … … 159 210 sub on_join { 160 211 my ($self, $evt) = @_; 212 my $chan = $evt->{params}[0]; 161 213 my $msg = $self->new_message($evt, 162 214 loginout => 'login', 163 215 action => 'join', 164 channel => $ evt->to,165 replycmd => BarnOwl::quote('irc-msg', '-a', $self->alias, $ evt->to),166 replysendercmd => BarnOwl::quote('irc-msg', '-a', $self->alias, $evt->nick),216 channel => $chan, 217 replycmd => BarnOwl::quote('irc-msg', '-a', $self->alias, $chan), 218 replysendercmd => BarnOwl::quote('irc-msg', '-a', $self->alias, prefix_nick($evt)), 167 219 ); 168 220 BarnOwl::queue_message($msg); 169 push @{$self->channels}, $evt->to;170 221 } 171 222 172 223 sub on_part { 173 224 my ($self, $evt) = @_; 225 my $chan = $evt->{params}[0]; 174 226 my $msg = $self->new_message($evt, 175 227 loginout => 'logout', 176 228 action => 'part', 177 channel => $ evt->to,178 replycmd => BarnOwl::quote('irc-msg', '-a', $self->alias, $ evt->to),179 replysendercmd => BarnOwl::quote('irc-msg', '-a', $self->alias, $evt->nick),229 channel => $chan, 230 replycmd => BarnOwl::quote('irc-msg', '-a', $self->alias, $chan), 231 replysendercmd => BarnOwl::quote('irc-msg', '-a', $self->alias, prefix_nick($evt)), 180 232 ); 181 233 BarnOwl::queue_message($msg); 182 $self->channels([ grep {$_ ne $evt->to} @{$self->channels}]);183 234 } 184 235 … … 188 239 loginout => 'logout', 189 240 action => 'quit', 190 from => $evt-> to,191 reason => [$evt->args]->[0],192 replycmd => BarnOwl::quote('irc-msg', '-a', $self->alias, $evt->nick),193 replysendercmd => BarnOwl::quote('irc-msg', '-a', $self->alias, $evt->nick),241 from => $evt->{prefix}, 242 reason => $evt->{params}->[0], 243 replycmd => BarnOwl::quote('irc-msg', '-a', $self->alias, prefix_nick($evt)), 244 replysendercmd => BarnOwl::quote('irc-msg', '-a', $self->alias, prefix_nick($evt)), 194 245 ); 195 246 BarnOwl::queue_message($msg); … … 198 249 sub disconnect { 199 250 my $self = shift; 200 delete $BarnOwl::Module::IRC::ircnets{$self->alias}; 201 for my $k (keys %BarnOwl::Module::IRC::channels) { 202 my @conns = grep {$_ ne $self} @{$BarnOwl::Module::IRC::channels{$k}}; 203 if(@conns) { 204 $BarnOwl::Module::IRC::channels{$k} = \@conns; 205 } else { 206 delete $BarnOwl::Module::IRC::channels{$k}; 207 } 208 } 209 BarnOwl::remove_io_dispatch($self->{FD}); 251 $self->conn->disconnect; 252 } 253 254 sub on_disconnect { 255 my ($self, $why) = @_; 256 BarnOwl::admin_message('IRC', 257 "[" . $self->alias . "] Disconnected from server: $why"); 210 258 $self->motd(""); 211 } 212 213 sub on_disconnect { 214 my ($self, $evt) = @_; 215 $self->disconnect; 216 BarnOwl::admin_message('IRC', 217 "[" . $self->alias . "] Disconnected from server"); 218 if ($evt->format and $evt->format eq "error") { 259 if (!$self->did_quit) { 219 260 $self->schedule_reconnect; 220 261 } else { 221 $self->channels([]); 222 } 262 delete $BarnOwl::Module::IRC::ircnets{$self->alias}; 263 } 264 } 265 266 sub on_error { 267 my ($self, $evt) = @_; 268 BarnOwl::admin_message('IRC', 269 "[" . $self->alias . "] " . 270 "Error: " . join(" ", @{$evt->{params}})); 223 271 } 224 272 … … 227 275 BarnOwl::admin_message("IRC", 228 276 "[" . $self->alias . "] " . 229 [$evt->args]->[1] . ": Nick already in use"); 230 $self->disconnect unless $self->motd; 277 $evt->{params}->[1] . ": Nick already in use"); 278 } 279 280 sub on_nick { 281 my ($self, $old_nick, $new_nick, $is_me) = @_; 282 if ($is_me) { 283 BarnOwl::admin_message("IRC", 284 "[" . $self->alias . "] " . 285 "You are now known as $new_nick"); 286 } else { 287 my $msg = $self->new_message('', 288 loginout => 'login', 289 action => 'nick change', 290 from => $new_nick, 291 sender => $new_nick, 292 replycmd => BarnOwl::quote('irc-msg', '-a', $self->alias, 293 $new_nick), 294 replysendercmd => BarnOwl::quote('irc-msg', '-a', $self->alias, 295 $new_nick), 296 old_nick => $old_nick); 297 BarnOwl::queue_message($msg); 298 } 231 299 } 232 300 233 301 sub on_topic { 234 my ($self, $evt) = @_; 235 my @args = $evt->args; 236 if (scalar @args > 1) { 302 my ($self, $channel, $topic, $who) = @_; 303 if ($channel) { 237 304 BarnOwl::admin_message("IRC", 238 "Topic for $ args[1] on " . $self->alias . " is $args[2]");305 "Topic for $channel on " . $self->alias . " is $topic"); 239 306 } else { 240 307 BarnOwl::admin_message("IRC", 241 "Topic changed to $ args[0]");308 "Topic changed to $channel"); 242 309 } 243 310 } … … 245 312 sub on_topicinfo { 246 313 my ($self, $evt) = @_; 247 my @args = $evt->args;314 my @args = @{$evt->{params}}; 248 315 BarnOwl::admin_message("IRC", 249 316 "Topic for $args[1] set by $args[2] at " . localtime($args[3])); … … 257 324 my ($self, $evt) = @_; 258 325 return unless $self->names_tmp; 259 $self->names_tmp([@{$self->names_tmp}, split(' ', [$evt->args]->[3])]); 326 $self->names_tmp([@{$self->names_tmp}, 327 map {prefix_nick($_)} split(' ', $evt->{params}[3])]); 260 328 } 261 329 … … 272 340 my ($self, $evt) = @_; 273 341 return unless $self->names_tmp; 274 my $names = BarnOwl::Style::boldify("Members of " . [$evt->args]->[1] . ":\n");342 my $names = BarnOwl::Style::boldify("Members of " . $evt->{params}->[1] . ":\n"); 275 343 for my $name (sort {cmp_user($a, $b)} @{$self->names_tmp}) { 276 344 $names .= " $name\n"; … … 282 350 sub on_whois { 283 351 my ($self, $evt) = @_; 352 my %names = ( 353 311 => 'user', 354 312 => 'server', 355 319 => 'channels', 356 330 => 'whowas', 357 ); 284 358 $self->whois_tmp( 285 $self->whois_tmp . "\n" . $evt->type. ":\n " .286 join("\n ", cdr(cdr($evt->args))) . "\n"287 );359 $self->whois_tmp . "\n" . $names{$evt->{command}} . ":\n " . 360 join("\n ", cdr(cdr(@{$evt->{params}}))) . "\n" 361 ); 288 362 } 289 363 … … 291 365 my ($self, $evt) = @_; 292 366 BarnOwl::popless_ztext( 293 BarnOwl::Style::boldify("/whois for " . [$evt->args]->[1] . ":\n") .367 BarnOwl::Style::boldify("/whois for " . $evt->{params}->[1] . ":\n") . 294 368 $self->whois_tmp 295 369 ); … … 300 374 my ($self, $evt) = @_; 301 375 BarnOwl::admin_message("IRC", 302 "[" . $self->alias . "] User " . ( $evt->nick) . + " set mode " .303 join(" ", $evt->args) . "on " . $evt->to->[0]376 "[" . $self->alias . "] User " . (prefix_nick($evt)) . + " set mode " . 377 join(" ", cdr(@{$evt->{params}})) . " on " . $evt->{params}->[0] 304 378 ); 305 379 } 306 380 307 sub on_nosuchchannel { 308 my ($self, $evt) = @_; 381 sub on_nosuch { 382 my ($self, $evt) = @_; 383 my %things = (401 => 'nick', 402 => 'server', 403 => 'channel'); 309 384 BarnOwl::admin_message("IRC", 310 385 "[" . $self->alias . "] " . 311 "No such channel: " . [$evt->args]->[1])386 "No such @{[$things{$evt->{command}}]}: @{[$evt->{params}->[1]]}") 312 387 } 313 388 … … 323 398 sub schedule_reconnect { 324 399 my $self = shift; 325 my $interval = shift || 5; 326 delete $BarnOwl::Module::IRC::ircnets{$self->alias}; 327 $BarnOwl::Module::IRC::reconnect{$self->alias} = $self; 400 my $interval = $self->backoff; 401 if ($interval) { 402 $interval *= 2; 403 $interval = 60*5 if $interval > 60*5; 404 } else { 405 $interval = 5; 406 } 407 $self->backoff($interval); 408 328 409 my $weak = $self; 329 410 weaken($weak); … … 343 424 sub cancel_reconnect { 344 425 my $self = shift; 345 delete $BarnOwl::Module::IRC::reconnect{$self->alias}; 426 346 427 if (defined $self->{reconnect_timer}) { 347 428 $self->{reconnect_timer}->stop; 348 429 } 349 430 delete $self->{reconnect_timer}; 431 } 432 433 sub on_connect { 434 my $self = shift; 435 $self->connected("Connected to " . $self->alias . " as " . $self->nick) 350 436 } 351 437 … … 355 441 BarnOwl::admin_message("IRC", $msg); 356 442 $self->cancel_reconnect; 357 $BarnOwl::Module::IRC::ircnets{$self->alias} = $self; 358 my $fd = $self->getSocket()->fileno(); 359 BarnOwl::add_io_dispatch($fd, 'r', \&BarnOwl::Module::IRC::OwlProcess); 360 $self->{FD} = $fd; 443 if ($self->autoconnect_channels) { 444 for my $c (@{$self->autoconnect_channels}) { 445 $self->conn->send_msg(join => $c); 446 } 447 $self->autoconnect_channels([]); 448 } 449 $self->conn->enable_ping(60, sub { 450 $self->on_disconnect("Connection timed out."); 451 $self->schedule_reconnect; 452 }); 453 $self->backoff(0); 361 454 } 362 455 363 456 sub reconnect { 364 457 my $self = shift; 365 my $backoff = shift; 366 367 $self->conn->connect; 368 if ($self->conn->connected) { 369 $self->connected("Reconnected to ".$self->alias); 370 my @channels = @{$self->channels}; 371 $self->channels([]); 372 $self->conn->join($_) for @channels; 373 return; 374 } 375 376 $backoff *= 2; 377 $backoff = 60*5 if $backoff > 60*5; 378 $self->schedule_reconnect( $backoff ); 458 my $backoff = $self->backoff; 459 460 $self->autoconnect_channels([keys(%{$self->{channel_list}})]); 461 $self->conn->connect(@{$self->connect_args}); 379 462 } 380 463 -
perlconfig.c
rf25df21 r3b8a563 403 403 } 404 404 405 sv_setpv(get_sv("BarnOwl::VERSION", TRUE), OWL_VERSION_STRING); 406 405 407 /* Add the system lib path to @INC */ 406 408 inc = get_av("INC", 0); … … 465 467 :"BarnOwl::_receive_msg_legacy_wrap", m); 466 468 } 467 if (ptr)g_free(ptr);469 g_free(ptr); 468 470 } 469 471 … … 476 478 :"BarnOwl::Hooks::_new_msg", m); 477 479 } 478 if (ptr)g_free(ptr);480 g_free(ptr); 479 481 } 480 482 -
perlglue.xs
rf25df21 r3b8a563 43 43 rv = owl_function_command(cmd); 44 44 } else { 45 argv = g_new(const char *, items + 1); 45 /* Ensure this is NULL-terminated. */ 46 argv = g_new0(const char *, items + 1); 46 47 argv[0] = cmd; 47 48 for(i = 1; i < items; i++) { … … 56 57 RETVAL 57 58 CLEANUP: 58 if (rv)g_free(rv);59 g_free(rv); 59 60 60 61 SV * … … 113 114 RETVAL 114 115 CLEANUP: 115 if (rv)g_free(rv);116 g_free(rv); 116 117 117 118 const utf8 * … … 140 141 RETVAL 141 142 CLEANUP: 142 if (rv)g_free(rv);143 g_free(rv); 143 144 144 145 void … … 323 324 RETVAL 324 325 CLEANUP: 325 if (rv) 326 g_free(rv); 326 g_free(rv); 327 327 328 328 void -
select.c
rba12b44 rba12b44 321 321 } 322 322 323 #if 0 324 /* FIXME: Reimplement this check in the glib world. */ 325 static void owl_select_prune_bad_fds(void) { 326 owl_list *dl = owl_global_get_io_dispatch_list(&g); 327 int len, i; 328 struct stat st; 329 owl_io_dispatch *d; 330 331 len = owl_list_get_size(dl); 332 for (i = 0; i < len; i++) { 333 d = owl_list_get_element(dl, i); 334 if (fstat(d->fd, &st) < 0 && errno == EBADF) { 335 owl_function_debugmsg("Pruning defunct dispatch on fd %d.", d->fd); 336 d->needs_gc = 1; 337 } 338 } 339 owl_select_io_dispatch_gc(); 340 } 341 #endif 342 323 343 typedef struct _owl_task { /*noproto*/ 324 344 void (*cb)(void *); -
tester.c
rf25df21 r4c7c21f 233 233 234 234 printf("# BEGIN testing owl_dict\n"); 235 FAIL_UNLESS("create", 0==owl_dict_create(&d));235 owl_dict_create(&d); 236 236 FAIL_UNLESS("insert b", 0==owl_dict_insert_element(&d, "b", bv, owl_dict_noop_delete)); 237 237 FAIL_UNLESS("insert d", 0==owl_dict_insert_element(&d, "d", dv, owl_dict_noop_delete)); … … 249 249 FAIL_UNLESS("get_size", 3==owl_dict_get_size(&d)); 250 250 owl_list_create(&l); 251 FAIL_UNLESS("get_keys", 0==owl_dict_get_keys(&d, &l));251 owl_dict_get_keys(&d, &l); 252 252 FAIL_UNLESS("get_keys result size", 3==owl_list_get_size(&l)); 253 253 -
text.c
r42ee1be r7865479 275 275 g_strfreev(split); 276 276 return out; 277 }278 279 /* replace all instances of character a in buff with the character280 * b. buff must be null terminated.281 */282 void owl_text_tr(char *buff, char a, char b)283 {284 int i;285 286 owl_function_debugmsg("In: %s", buff);287 for (i=0; buff[i]!='\0'; i++) {288 if (buff[i]==a) buff[i]=b;289 }290 owl_function_debugmsg("Out: %s", buff);291 277 } 292 278 -
util.c
re56303f r9efa5bd 715 715 } 716 716 717 int owl_util_get_colorpairs(void) { 718 #ifndef NCURSES_EXT_COLORS 719 /* Without ext-color support (an ABI change), ncurses only supports 256 720 * different color pairs. However, it gives us a larger number even if your 721 * ncurses is compiled without ext-color. */ 722 return MIN(COLOR_PAIRS, 256); 723 #else 724 return COLOR_PAIRS; 725 #endif 726 } 727 717 728 gulong owl_dirty_window_on_signal(owl_window *w, gpointer sender, const gchar *detailed_signal) 718 729 { -
variable.c
rf25df21 r4c7c21f 30 30 NULL, NULL, NULL, NULL, NULL, NULL } 31 31 32 #define OWLVAR_STRING_FULL(name,default, summary,description,validate,set,get) \33 { name, OWL_VARIABLE_STRING, default, 0, "<string>", summary,description, NULL, \32 #define OWLVAR_STRING_FULL(name,default,validset,summary,description,validate,set,get) \ 33 { name, OWL_VARIABLE_STRING, default, 0, validset, summary,description, NULL, \ 34 34 validate, set, NULL, get, NULL, NULL } 35 35 … … 266 266 "" ), 267 267 268 OWLVAR_STRING_FULL( "tty" /* %OwlVarStub */, "", " tty name for zephyr location", "",268 OWLVAR_STRING_FULL( "tty" /* %OwlVarStub */, "", "<string>", "tty name for zephyr location", "", 269 269 NULL, owl_variable_tty_set, NULL), 270 270 … … 370 370 "delete a message right as it came in.\n" ), 371 371 372 OWLVAR_STRING_FULL( "default_exposure" /* %OwlVarStub */, "", 373 "none,opstaff,realm-visible,realm-announced,net-visible,net-announced", 374 "controls the persistent value for exposure", 375 "The default exposure level corresponds to the Zephyr exposure value\n" 376 "in ~/.zephyr.vars. Defaults to realm-visible if there is no value in\n" 377 "~/.zephyr.vars.\n" 378 "See the description of exposure for the values this can be.", 379 NULL, owl_variable_default_exposure_set, owl_variable_default_exposure_get ), 380 381 OWLVAR_STRING_FULL( "exposure" /* %OwlVarStub */, "", 382 "none,opstaff,realm-visible,realm-announced,net-visible,net-announced", 383 "controls who can zlocate you", 384 "The exposure level, defaulting to the value of default_exposure,\n" 385 "can be one of the following (from least exposure to widest exposure,\n" 386 "as listed in zctl(1)):\n" 387 "\n" 388 " none - This completely disables Zephyr for the user. \n" 389 " The user is not registered with Zephyr. No user\n" 390 " location information is retained by Zephyr. No\n" 391 " login or logout announcements will be sent. No\n" 392 " subscriptions will be entered for the user, and\n" 393 " no notices will be displayed by zwgc(1).\n" 394 " opstaff - The user is registered with Zephyr. No login or\n" 395 " logout announcements will be sent, and location\n" 396 " information will only be visible to Operations\n" 397 " staff. Default subscriptions and any additional\n" 398 " personal subscriptions will be entered for the\n" 399 " user.\n" 400 " realm-visible - The user is registered with Zephyr. User\n" 401 " location information is retained by Zephyr and\n" 402 " made available only to users within the user’s\n" 403 " Kerberos realm. No login or logout\n" 404 " announcements will be sent. This is the system\n" 405 " default. Default subscriptions and any\n" 406 " additional personal subscriptions will be\n" 407 " entered for the user.\n" 408 " realm-announced - The user is registered with Zephyr. User\n" 409 " location information is retained by Zephyr and\n" 410 " made available only to users authenticated\n" 411 " within the user’s Kerberos realm. Login and\n" 412 " logout announcements will be sent, but only to\n" 413 " users within the user’s Kerberos realm who have\n" 414 " explicitly requested such via subscriptions. \n" 415 " Default subscriptions and any additional\n" 416 " personal subscriptions will be entered for the\n" 417 " user.\n" 418 " net-visible - The user is registered with Zephyr. User\n" 419 " location information is retained by Zephyr and\n" 420 " made available to any authenticated user who\n" 421 " requests such. Login and logout announcements\n" 422 " will be sent only to users within the user’s\n" 423 " Kerberos realm who have explicitly requested\n" 424 " such via subscriptions. Default subscriptions\n" 425 " and any additional personal subscriptions will\n" 426 " be entered for the user.\n" 427 " net-announced - The user is registered with Zephyr. User\n" 428 " location information is retained by Zephyr and\n" 429 " made available to any authenticated user who\n" 430 " requests such. Login and logout announcements\n" 431 " will be sent to any user has requested such. \n" 432 " Default subscriptions and any additional\n" 433 " personal subscriptions will be entered for the\n" 434 " user.\n", 435 NULL, owl_variable_exposure_set, NULL /* use default for get */ ), 436 372 437 /* This MUST be last... */ 373 438 { NULL, 0, NULL, 0, NULL, NULL, NULL, NULL, … … 470 535 } 471 536 537 int owl_variable_default_exposure_set(owl_variable *v, const void *newval) 538 { 539 return owl_zephyr_set_default_exposure(newval); 540 } 541 542 const void *owl_variable_default_exposure_get(const owl_variable *v) 543 { 544 return owl_zephyr_get_default_exposure(); 545 } 546 547 int owl_variable_exposure_set(owl_variable *v, const void *newval) 548 { 549 int ret = owl_zephyr_set_exposure(newval); 550 if (ret != 0) 551 return ret; 552 return owl_variable_string_set_default(v, owl_zephyr_normalize_exposure(newval)); 553 } 472 554 473 555 /**************************************************************************/ … … 477 559 int owl_variable_dict_setup(owl_vardict *vd) { 478 560 owl_variable *var, *cur; 479 if (owl_dict_create(vd)) return(-1);561 owl_dict_create(vd); 480 562 for (var = variables_to_init; var->name != NULL; var++) { 481 563 cur = g_new(owl_variable, 1); … … 559 641 560 642 void owl_variable_update(owl_variable *var, const char *summary, const char *desc) { 561 if(var->summary)g_free(var->summary);643 g_free(var->summary); 562 644 var->summary = g_strdup(summary); 563 if(var->description)g_free(var->description);645 g_free(var->description); 564 646 var->description = g_strdup(desc); 565 647 } … … 569 651 if(old) { 570 652 owl_variable_update(old, summ, desc); 571 if(old->pval_default)g_free(old->pval_default);653 g_free(old->pval_default); 572 654 old->pval_default = g_strdup(initval); 573 655 } else { … … 688 770 } 689 771 if (msg && v->get_tostring_fn) { 690 tostring = v->get_tostring_fn(v, v-> val);772 tostring = v->get_tostring_fn(v, v->get_fn(v)); 691 773 owl_function_makemsg("%s = '%s'", name, tostring); 692 774 g_free(tostring); … … 726 808 v = owl_dict_find_element(d, name); 727 809 if (v == NULL || !v->get_tostring_fn) return NULL; 728 return v->get_tostring_fn(v, v-> val);810 return v->get_tostring_fn(v, v->get_fn(v)); 729 811 } 730 812 … … 862 944 void owl_variable_delete_default(owl_variable *v) 863 945 { 864 if (v->val)g_free(v->val);946 g_free(v->val); 865 947 } 866 948 … … 994 1076 if (!v->validate_fn(v, newval)) return(-1); 995 1077 } 996 if (v->val)g_free(v->val);1078 g_free(v->val); 997 1079 v->val = g_strdup(newval); 998 1080 return(0); -
view.c
rd4927a7 r3b8a563 160 160 { 161 161 owl_list_cleanup(&v->ml.list, NULL); 162 if (v->name)g_free(v->name);162 g_free(v->name); 163 163 } -
viewwin.c
r237d02c r4fd211f 150 150 151 151 if (!owl_viewwin_search(v, owl_global_get_search_re(&g), consider_current, direction)) 152 owl_function_ error("No more matches");152 owl_function_makemsg("No more matches"); 153 153 return NULL; 154 154 } … … 172 172 if (!owl_viewwin_search(data->v, owl_global_get_search_re(&g), 173 173 consider_current, data->direction)) 174 owl_function_ error("No matches");174 owl_function_makemsg("No matches"); 175 175 } 176 176 -
window.c
r4cc49bc r4cc49bc 547 547 /* update the terminal if we need to */ 548 548 owl_window_redraw_scheduled(); 549 /* On colorpair shortage, reset and redraw /everything/. NOTE: if 550 * the current screen uses too many colorpairs, this draws551 * everything twice. But this is unlikely; COLOR_PAIRS is 64 with552 * 8+1 colors, and 256^2 with 256+1 colors. (+1 for default.)*/549 /* On colorpair shortage, reset and redraw /everything/. NOTE: if we 550 * still overflow, this be useless work. With 8-colors, we get 64 551 * pairs. With 256-colors, we get 32768 pairs with ext-colors 552 * support and 256 otherwise. */ 553 553 cpmgr = owl_global_get_colorpair_mgr(&g); 554 554 if (cpmgr->overflow) { 555 owl_function_debugmsg("colorpairs: color shortage; reset pairs and redraw. COLOR_PAIRS = %d", COLOR_PAIRS); 555 owl_function_debugmsg("colorpairs: used all %d pairs; reset pairs and redraw.", 556 owl_util_get_colorpairs()); 556 557 owl_fmtext_reset_colorpairs(cpmgr); 557 558 owl_function_full_redisplay(); -
zcrypt.c
r1dd285b r3b8a563 476 476 477 477 for(i = 0; i < MAX_SEARCH; i++) { 478 if(varname[i] != NULL) { 479 g_free(varname[i]); 480 } 481 } 482 483 if(filename != NULL) { 484 g_free(filename); 485 } 478 g_free(varname[i]); 479 } 480 481 g_free(filename); 486 482 487 483 return keyfile; … … 773 769 err = call_filter("gpg", argv, in, &out, &status); 774 770 if(err || status) { 775 if(out)g_free(out);771 g_free(out); 776 772 return FALSE; 777 773 } … … 856 852 err = call_filter("gpg", argv, in, &out, &status); 857 853 if(err || status) { 858 if(out)g_free(out);854 g_free(out); 859 855 return FALSE; 860 856 } -
zephyr.c
r959cb85 r959cb85 447 447 return 0; 448 448 } 449 if (buffer) 450 g_free(buffer); 449 g_free(buffer); 451 450 452 451 return owl_zephyr_loadsubs_helper(subs, count); … … 1049 1048 { 1050 1049 #ifdef HAVE_LIBZEPHYR 1051 char *exposure, *eset;1052 Code_t ret;1053 1054 1050 ZResetAuthentication(); 1055 1051 1056 eset = EXPOSE_REALMVIS; 1057 exposure = ZGetVariable(zstr("exposure")); 1058 if (exposure) 1059 exposure = ZParseExposureLevel(exposure); 1060 if (exposure) 1061 eset = exposure; 1062 1063 ret = ZSetLocation(eset); 1064 if (ret != ZERR_NONE) 1065 owl_function_error("Error setting location: %s", error_message(ret)); 1052 /* ZSetLocation, and store the default value as the current value */ 1053 owl_global_set_exposure(&g, owl_global_get_default_exposure(&g)); 1066 1054 #endif 1067 1055 } … … 1184 1172 ZInitLocationInfo(zstr(host), zstr(val)); 1185 1173 #endif 1174 } 1175 1176 const char *owl_zephyr_normalize_exposure(const char *exposure) 1177 { 1178 if (exposure == NULL) 1179 return NULL; 1180 #ifdef HAVE_LIBZEPHYR 1181 return ZParseExposureLevel(zstr(exposure)); 1182 #else 1183 return exposure; 1184 #endif 1185 } 1186 1187 int owl_zephyr_set_default_exposure(const char *exposure) 1188 { 1189 #ifdef HAVE_LIBZEPHYR 1190 Code_t ret; 1191 if (exposure == NULL) 1192 return -1; 1193 exposure = ZParseExposureLevel(zstr(exposure)); 1194 if (exposure == NULL) 1195 return -1; 1196 ret = ZSetVariable(zstr("exposure"), zstr(exposure)); /* ZSetVariable does file I/O */ 1197 if (ret != ZERR_NONE) { 1198 owl_function_error("Unable to set default exposure location: %s", error_message(ret)); 1199 return -1; 1200 } 1201 #endif 1202 return 0; 1203 } 1204 1205 const char *owl_zephyr_get_default_exposure(void) 1206 { 1207 #ifdef HAVE_LIBZEPHYR 1208 const char *exposure = ZGetVariable(zstr("exposure")); /* ZGetVariable does file I/O */ 1209 if (exposure == NULL) 1210 return EXPOSE_REALMVIS; 1211 exposure = ZParseExposureLevel(zstr(exposure)); 1212 if (exposure == NULL) /* The user manually entered an invalid value in ~/.zephyr.vars, or something weird happened. */ 1213 return EXPOSE_REALMVIS; 1214 return exposure; 1215 #else 1216 return ""; 1217 #endif 1218 } 1219 1220 int owl_zephyr_set_exposure(const char *exposure) 1221 { 1222 #ifdef HAVE_LIBZEPHYR 1223 Code_t ret; 1224 if (exposure == NULL) 1225 return -1; 1226 exposure = ZParseExposureLevel(zstr(exposure)); 1227 if (exposure == NULL) 1228 return -1; 1229 ret = ZSetLocation(zstr(exposure)); 1230 if (ret != ZERR_NONE) { 1231 owl_function_error("Unable to set exposure level: %s.", error_message(ret)); 1232 return -1; 1233 } 1234 #endif 1235 return 0; 1186 1236 } 1187 1237 -
zwrite.c
r3f52e14 r3b8a563 185 185 void owl_zwrite_set_message_raw(owl_zwrite *z, const char *msg) 186 186 { 187 if (z->message)g_free(z->message);187 g_free(z->message); 188 188 z->message = owl_validate_utf8(msg); 189 189 } … … 195 195 char *tmp = NULL, *tmp2; 196 196 197 if (z->message)g_free(z->message);197 g_free(z->message); 198 198 199 199 j=owl_list_get_size(&(z->recips)); … … 289 289 void owl_zwrite_set_opcode(owl_zwrite *z, const char *opcode) 290 290 { 291 if (z->opcode)g_free(z->opcode);291 g_free(z->opcode); 292 292 z->opcode=owl_validate_utf8(opcode); 293 293 } … … 306 306 void owl_zwrite_set_zsig(owl_zwrite *z, const char *zsig) 307 307 { 308 if(z->zsig)g_free(z->zsig);308 g_free(z->zsig); 309 309 z->zsig = g_strdup(zsig); 310 310 } … … 353 353 { 354 354 owl_list_cleanup(&(z->recips), &g_free); 355 if (z->cmd)g_free(z->cmd);356 if (z->zwriteline)g_free(z->zwriteline);357 if (z->class)g_free(z->class);358 if (z->inst)g_free(z->inst);359 if (z->opcode)g_free(z->opcode);360 if (z->realm)g_free(z->realm);361 if (z->message)g_free(z->message);362 if (z->zsig)g_free(z->zsig);355 g_free(z->cmd); 356 g_free(z->zwriteline); 357 g_free(z->class); 358 g_free(z->inst); 359 g_free(z->opcode); 360 g_free(z->realm); 361 g_free(z->message); 362 g_free(z->zsig); 363 363 } 364 364
Note: See TracChangeset
for help on using the changeset viewer.