Changes in / [f97c1a6:1d21d9f]
- Files:
-
- 1 deleted
- 33 edited
Legend:
- Unmodified
- Added
- Removed
-
README
r13ee8f2 raeadc74 18 18 BarnOwl currently requires the following perl modules off of CPAN: 19 19 20 AnyEvent21 20 PAR 22 21 Net::DNS … … 31 30 The IRC module requires: 32 31 33 AnyEvent::IRC32 Net::IRC 34 33 Class::Accessor 35 34 -
cmd.c
r4c7c21f rf25df21 12 12 13 13 int owl_cmddict_setup(owl_cmddict *cd) { 14 owl_cmddict_init(cd);14 if (0 != owl_cmddict_init(cd)) return(-1); 15 15 if (0 != owl_cmddict_add_from_list(cd, commands_to_init)) return(-1); 16 16 return(0); 17 17 } 18 18 19 void owl_cmddict_init(owl_cmddict *cd) { 20 owl_dict_create(cd); 19 int owl_cmddict_init(owl_cmddict *cd) { 20 if (owl_dict_create(cd)) return(-1); 21 return(0); 21 22 } 22 23 … … 98 99 99 100 char *owl_cmddict_execute_argv(const owl_cmddict *cd, const owl_context *ctx, const char *const *argv, int argc) { 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 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); 107 115 return retval; 108 116 } … … 134 142 void owl_cmd_cleanup(owl_cmd *cmd) 135 143 { 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);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); 141 149 if (cmd->cmd_perl) owl_perlconfig_cmd_cleanup(cmd); 142 150 } -
commands.c
r3b8a563 rc809f5e 1288 1288 } 1289 1289 owl_function_nextmsg_full(filter, skip_deleted, last_if_none); 1290 g_free(filter);1290 if (filter) g_free(filter); 1291 1291 return(NULL); 1292 1292 } … … 1318 1318 } 1319 1319 owl_function_prevmsg_full(filter, skip_deleted, first_if_none); 1320 g_free(filter);1320 if (filter) 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 g_free(lastrv); 1693 if (lastrv) { 1694 g_free(lastrv); 1695 } 1694 1696 lastrv = owl_function_command(commands[i]); 1695 1697 } -
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 >= 2.12gobject-2.0 gthread-2.0])117 PKG_CHECK_MODULES(GLIB,[glib-2.0 gobject-2.0 gthread-2.0]) 118 118 119 119 AC_MSG_NOTICE([Adding glib-2.0 CFLAGS ${GLIB_CFLAGS}]) -
dict.c
r4c7c21f rf25df21 15 15 #define GROWBY 3 / 2 16 16 17 voidowl_dict_create(owl_dict *d) {17 int 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); 21 23 } 22 24 … … 58 60 /* Appends dictionary keys to a list. Duplicates the keys, 59 61 * so they will need to be freed by the caller. */ 60 voidowl_dict_get_keys(const owl_dict *d, owl_list *l) {62 int owl_dict_get_keys(const owl_dict *d, owl_list *l) { 61 63 int i; 64 char *dupk; 62 65 for (i=0; i<d->size; i++) { 63 owl_list_append_element(l, g_strdup(d->els[i].k)); 66 if ((dupk = g_strdup(d->els[i].k)) == NULL) return(-1); 67 owl_list_append_element(l, dupk); 64 68 } 69 return(0); 65 70 } 66 71 … … 79 84 { 80 85 int pos, found; 86 char *dupk; 81 87 found = _owl_dict_find_pos(d, k, &pos); 82 88 if (found && delete_on_replace) { … … 93 99 if (d->els==NULL) return(-1); 94 100 } 101 if ((dupk = g_strdup(k)) == NULL) return(-1); 95 102 if (pos!=d->size) { 96 103 /* shift forward to leave us a slot */ … … 99 106 } 100 107 d->size++; 101 d->els[pos].k = g_strdup(k);108 d->els[pos].k = dupk; 102 109 d->els[pos].v = v; 103 110 return(0); -
editwin.c
r3b8a563 r47e0a6a 317 317 } 318 318 319 g_free(locktext); 319 if (locktext) 320 g_free(locktext); 320 321 321 322 oe_set_index(e, lock); -
fmtext.c
r7b4f3be r4479497 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 186 193 static void _owl_fmtext_wcolor_set(WINDOW *w, short pair) 187 194 { 188 if ( has_colors()) {195 if (owl_global_get_hascolors(&g)) { 189 196 wcolor_set(w,pair,NULL); 190 197 wbkgdset(w, COLOR_PAIR(pair)); … … 214 221 bg = default_bgcolor; 215 222 _owl_fmtext_wattrset(w, attr); 216 pair = owl_fmtext_get_colorpair(fg, bg);223 _owl_fmtext_update_colorpair(fg, bg, &pair); 217 224 _owl_fmtext_wcolor_set(w, pair); 218 225 … … 263 270 if (bg == OWL_COLOR_DEFAULT) bg = default_bgcolor; 264 271 _owl_fmtext_wattrset(w, attr); 265 pair = owl_fmtext_get_colorpair(fg, bg);272 _owl_fmtext_update_colorpair(fg, bg, &pair); 266 273 _owl_fmtext_wcolor_set(w, pair); 267 274 … … 655 662 continue */ 656 663 } else if (!strcasecmp(buff, "@color") 664 && owl_global_get_hascolors(&g) 657 665 && owl_global_is_colorztext(&g)) { 658 666 g_free(buff); … … 812 820 } 813 821 } 814 if ( has_colors()) {822 if (owl_global_get_hascolors(&g)) { 815 823 for(i = 0; i < 8; i++) { 816 824 short fg, bg; … … 827 835 owl_colorpair_mgr *cpmgr; 828 836 short pair; 829 830 if (!has_colors())831 return 0;832 837 833 838 /* Sanity (Bounds) Check */ … … 847 852 if (!(pair != -1 && pair < cpmgr->next)) { 848 853 /* If we didn't find a pair, search for a free one to assign. */ 849 pair = (cpmgr->next < owl_util_get_colorpairs()) ? cpmgr->next : -1;854 pair = (cpmgr->next < COLOR_PAIRS) ? cpmgr->next : -1; 850 855 if (pair != -1) { 851 856 /* We found a free pair, initialize it. */ -
functions.c
r47128d9 r47128d9 32 32 char *rv; 33 33 rv=owl_function_command(cmdbuff); 34 g_free(rv);34 if (rv) g_free(rv); 35 35 } 36 36 … … 453 453 454 454 if (rv || status) { 455 g_free(cryptmsg);455 if(cryptmsg) 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 g_free(ret);993 if (ret) g_free(ret); 994 994 995 995 /* signal our child process, if any */ … … 1817 1817 owl_global_get_cols(&g)); 1818 1818 1819 if ( has_colors()) {1819 if (owl_global_get_hascolors(&g)) { 1820 1820 owl_fmtext_append_normal(&fm, "Color: Yes\n"); 1821 owl_fmtext_appendf_normal(&fm, "Number of color pairs: %i\n", owl_ util_get_colorpairs());1821 owl_fmtext_appendf_normal(&fm, "Number of color pairs: %i\n", owl_global_get_colorpairs(&g)); 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 owl_fmtext_append_normal_color(&fm, owl_filter_get_name(f), 2229 owl_filter_get_fgcolor(f), 2230 owl_filter_get_bgcolor(f)); 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 } 2231 2233 owl_fmtext_append_normal(&fm, "\n"); 2232 2234 } … … 2358 2360 done: 2359 2361 g_free(class); 2360 g_free(instance); 2362 if (instance) { 2363 g_free(instance); 2364 } 2361 2365 return(filtname); 2362 2366 } … … 2519 2523 2520 2524 filtname = g_strdup_printf("conversation-%s", ccs); 2521 g_strdelimit(filtname, " ", '-');2525 owl_text_tr(filtname, ' ', '-'); 2522 2526 2523 2527 if (owl_global_get_filter(&g, filtname)) { … … 2955 2959 2956 2960 if (viewsize==0) { 2957 owl_function_ makemsg("No messages present");2961 owl_function_error("No messages present"); 2958 2962 return; 2959 2963 } … … 2969 2973 /* bounds check */ 2970 2974 if (start>=viewsize || start<0) { 2971 owl_function_ makemsg("No further matches found");2975 owl_function_error("No further matches found"); 2972 2976 return; 2973 2977 } … … 2998 3002 } 2999 3003 owl_mainwin_redisplay(owl_global_get_mainwin(&g)); 3000 owl_function_ makemsg("No matches found");3004 owl_function_error("No matches found"); 3001 3005 } 3002 3006 -
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; 56 60 owl_fmtext_init_colorpair_mgr(&(g->cpmgr)); 57 61 g->debug=OWL_DEBUG; … … 508 512 509 513 void owl_global_set_startupargs(owl_global *g, int argc, char **argv) { 510 g_free(g->startupargs);514 if (g->startupargs) g_free(g->startupargs); 511 515 g->startupargs = g_strjoinv(" ", argv); 512 516 } … … 573 577 owl_view *owl_global_get_current_view(owl_global *g) { 574 578 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); 575 592 } 576 593 … … 756 773 } 757 774 758 voidowl_global_get_style_names(const owl_global *g, owl_list *l) {759 owl_dict_get_keys(&(g->styledict), l);775 int owl_global_get_style_names(const owl_global *g, owl_list *l) { 776 return owl_dict_get_keys(&(g->styledict), l); 760 777 } 761 778 -
keybinding.c
r3b8a563 rd07af84 69 69 void owl_keybinding_delete(owl_keybinding *kb) 70 70 { 71 g_free(kb->keys);72 g_free(kb->desc);73 g_free(kb->command);71 if (kb->keys) g_free(kb->keys); 72 if (kb->desc) g_free(kb->desc); 73 if (kb->command) g_free(kb->command); 74 74 g_free(kb); 75 75 } -
keymap.c
r4c7c21f r47e0a6a 9 9 { 10 10 if (!name || !desc) return(-1); 11 km->name = g_strdup(name);12 km->desc = g_strdup(desc);13 owl_list_create(&km->bindings);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); 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 voidowl_keyhandler_init(owl_keyhandler *kh)182 { 183 owl_dict_create(&kh->keymaps);181 int owl_keyhandler_init(owl_keyhandler *kh) 182 { 183 if (0 != owl_dict_create(&kh->keymaps)) return(-1); 184 184 kh->active = NULL; 185 185 owl_keyhandler_reset(kh); 186 return(0); 186 187 } 187 188 -
list.c
rfda61d3 rddbbcffa 5 5 #define GROWBY 3 / 2 6 6 7 voidowl_list_create(owl_list *l)7 int 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); 12 14 } 13 15 -
logging.c
r7865479 rfe3b017 151 151 } else if (owl_message_is_type_jabber(m)) { 152 152 to = g_strdup_printf("jabber:%s", owl_message_get_recipient(m)); 153 g_strdelimit(to, "/", '_');153 owl_text_tr(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; 43 44 } owl_options; 44 45 … … 49 50 fprintf(stderr, " -n,--no-subs don't load zephyr subscriptions\n"); 50 51 fprintf(stderr, " -d,--debug enable debugging\n"); 52 fprintf(stderr, " -D,--remove-debug enable debugging and delete previous debug file\n"); 51 53 fprintf(stderr, " -v,--version print the Barnowl version number and exit\n"); 52 54 fprintf(stderr, " -h,--help print this help message\n"); … … 64 66 { "tty", 1, 0, 't' }, 65 67 { "debug", 0, 0, 'd' }, 68 { "remove-debug", 0, 0, 'D' }, 66 69 { "version", 0, 0, 'v' }, 67 70 { "help", 0, 0, 'h' }, … … 85 88 opts->tty = g_strdup(optarg); 86 89 break; 90 case 'D': 91 opts->rm_debug = 1; 92 /* fallthrough */ 87 93 case 'd': 88 94 opts->debug = 1; … … 503 509 /* owl global init */ 504 510 owl_global_init(&g); 511 if (opts.rm_debug) unlink(OWL_DEBUG_FILE); 505 512 if (opts.debug) owl_global_set_debug_on(&g); 506 513 if (opts.confdir) owl_global_set_confdir(&g, opts.confdir); … … 570 577 owl_function_debugmsg("startup: executing perl startup, if applicable"); 571 578 perlout = owl_perlconfig_execute("BarnOwl::Hooks::_startup();"); 572 g_free(perlout);579 if (perlout) g_free(perlout); 573 580 574 581 /* welcome message */ -
owl.h
rdc1edbd rdc1edbd 66 66 #include "window.h" 67 67 68 #ifndef OWL_VERSION_STRING69 68 #ifdef GIT_VERSION 70 69 #define stringify(x) __stringify(x) … … 74 73 #define OWL_VERSION_STRING PACKAGE_VERSION 75 74 #endif 76 #endif /* !OWL_VERSION_STRING */77 75 78 76 /* Feature that is being tested to redirect stderr through a pipe. … … 604 602 char *startupargs; 605 603 int nextmsgid; 604 int hascolors; 605 int colorpairs; 606 606 owl_colorpair_mgr cpmgr; 607 607 pid_t newmsgproc_pid; -
perl/lib/BarnOwl.pm
rf2d71cfa rb120bd3 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;44 40 45 41 use List::Util qw(max); -
perl/modules/IRC/lib/BarnOwl/Message/IRC.pm
r60b49a7 re04b7a1 66 66 sub action {shift->{action}} 67 67 sub reason {shift->{reason}} 68 sub old_nick {shift->{old_nick}};69 68 70 69 # display … … 81 80 } 82 81 83 sub login_extra { 82 sub login_extra { 84 83 my $self = shift; 85 84 if ($self->action eq "quit") { 86 85 return $self->reason; 87 } elsif ($self->action eq 'nick change') {88 return "was: " . $self->old_nick;89 86 } else { 90 87 return $self->channel; -
perl/modules/IRC/lib/BarnOwl/Module/IRC.pm
r5c6d661 r9620c8d 20 20 use BarnOwl::Module::IRC::Completion; 21 21 22 use AnyEvent::IRC;22 use Net::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; 32 34 33 35 sub startup { … … 68 70 69 71 register_commands(); 72 register_handlers(); 70 73 BarnOwl::filter(qw{irc type ^IRC$ or ( type ^admin$ and adminheader ^IRC$ )}); 71 74 } … … 73 76 sub shutdown { 74 77 for my $conn (values %ircnets) { 75 $conn->conn->disconnect( 'Quitting');78 $conn->conn->disconnect(); 76 79 } 77 80 } … … 95 98 $list .= "\n"; 96 99 97 for my $chan (keys %{$conn->conn->{channel_list}}) { 100 for my $chan (keys %channels) { 101 next unless grep $_ eq $conn, @{$channels{$chan}}; 98 102 $list .= " $chan\n"; 99 103 } … … 101 105 102 106 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 } 103 131 } 104 132 … … 378 406 } 379 407 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; 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 389 425 return; 390 426 } … … 393 429 my $cmd = shift; 394 430 my $conn = shift; 395 if ($conn->conn->{socket}) { 396 $conn->did_quit(1); 397 $conn->conn->disconnect("Goodbye!"); 398 } elsif ($conn->{reconnect_timer}) { 431 if ($conn->conn->connected) { 432 $conn->conn->disconnect; 433 } elsif ($reconnect{$conn->alias}) { 399 434 BarnOwl::admin_message('IRC', 400 435 "[" . $conn->alias . "] Reconnect cancelled"); 401 436 $conn->cancel_reconnect; 402 delete $ircnets{$conn->alias};403 437 } 404 438 } … … 429 463 for my $body (@msgs) { 430 464 if ($body =~ /^\/me (.*)/) { 431 $conn-> me($to, Encode::encode('utf-8', $1));465 $conn->conn->me($to, Encode::encode('utf-8', $1)); 432 466 $body = '* '.$conn->nick.' '.$1; 433 467 } else { 434 $conn->conn-> send_msg('privmsg',$to, Encode::encode('utf-8', $body));468 $conn->conn->privmsg($to, Encode::encode('utf-8', $body)); 435 469 } 436 470 my $msg = BarnOwl::Message->new( … … 457 491 my $target = shift; 458 492 $target ||= shift; 459 $conn->conn-> send_msg(mode =>$target, @_);493 $conn->conn->mode($target, @_); 460 494 return; 461 495 } … … 465 499 my $conn = shift; 466 500 my $chan = shift or die("Usage: $cmd channel\n"); 467 $conn->conn->send_msg(join => $chan, @_); 501 $channels{$chan} ||= []; 502 push @{$channels{$chan}}, $conn; 503 $conn->conn->join($chan, @_); 468 504 return; 469 505 } … … 473 509 my $conn = shift; 474 510 my $chan = shift; 475 $conn->conn->send_msg(part => $chan); 511 $channels{$chan} = [grep {$_ ne $conn} @{$channels{$chan} || []}]; 512 $conn->conn->part($chan); 476 513 return; 477 514 } … … 481 518 my $conn = shift; 482 519 my $nick = shift or die("Usage: $cmd <new nick>\n"); 483 $conn->conn-> send_msg(nick =>$nick);520 $conn->conn->nick($nick); 484 521 return; 485 522 } … … 490 527 my $chan = shift; 491 528 $conn->names_tmp([]); 492 $conn->conn-> send_msg(names =>$chan);529 $conn->conn->names($chan); 493 530 return; 494 531 } … … 498 535 my $conn = shift; 499 536 my $who = shift || die("Usage: $cmd <user>\n"); 500 $conn->conn-> send_msg(whois =>$who);537 $conn->conn->whois($who); 501 538 return; 502 539 } … … 505 542 my $cmd = shift; 506 543 my $conn = shift; 507 $conn->conn-> send_msg('motd');544 $conn->conn->motd; 508 545 return; 509 546 } … … 523 560 my $conn = shift; 524 561 my $who = shift || die("Usage: $cmd <user>\n"); 525 $conn->conn->send_msg(who => $who); 562 BarnOwl::error("WHO $cmd $conn $who"); 563 $conn->conn->who($who); 526 564 return; 527 565 } … … 531 569 my $conn = shift; 532 570 my $type = shift || die("Usage: $cmd <chiklmouy> [server] \n"); 533 $conn->conn->s end_msg(stats =>$type, @_);571 $conn->conn->stats($type, @_); 534 572 return; 535 573 } … … 539 577 my $conn = shift; 540 578 my $chan = shift; 541 $conn->conn-> send_msg(topic =>$chan, @_ ? join(" ", @_) : undef);579 $conn->conn->topic($chan, @_ ? join(" ", @_) : undef); 542 580 return; 543 581 } … … 546 584 my $cmd = shift; 547 585 my $conn = shift; 548 $conn->conn->s end_msg(@_);586 $conn->conn->sl(join(" ", @_)); 549 587 return; 550 588 } … … 553 591 ########################### Utilities/Helpers ################################## 554 592 ################################################################################ 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 }566 593 567 594 sub mk_irc_command { … … 587 614 $channel = $ARGV[0]; 588 615 if(defined($channel) && $channel =~ /^#/) { 589 if( my $c = find_channel($channel)) {616 if($channels{$channel} && @{$channels{$channel}} == 1) { 590 617 shift @ARGV; 591 $conn ||= $c;618 $conn = $channels{$channel}[0] unless $conn; 592 619 } 593 620 } elsif ($m && $m->type eq 'IRC' && !$m->is_private) { … … 627 654 my $allow_disconnected = shift; 628 655 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."); 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") 635 659 } 636 660 -
perl/modules/IRC/lib/BarnOwl/Module/IRC/Completion.pm
rdace02a r955a36e 11 11 sub complete_networks { keys %BarnOwl::Module::IRC::ircnets } 12 12 sub complete_dests { keys %users, complete_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 } 13 sub complete_channels { keys %BarnOwl::Module::IRC::channels } 22 14 sub complete_nicks { keys %users } 23 15 sub complete_servers { keys %servers } -
perl/modules/IRC/lib/BarnOwl/Module/IRC/Connection.pm
r13ee8f2 rfb6e8e3 11 11 =head1 DESCRIPTION 12 12 13 This module is a wrapper around AnyEvent::IRC::Clientfor BarnOwl's IRC13 This module is a wrapper around Net::IRC::Connection for BarnOwl's IRC 14 14 support 15 15 16 16 =cut 17 17 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); 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); 27 23 28 24 use BarnOwl; 29 25 use Scalar::Util qw(weaken); 30 26 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 31 37 sub new { 32 38 my $class = shift; 39 my $irc = shift; 33 40 my $alias = shift; 34 my $host = shift; 35 my $port = shift; 36 my $args = shift; 37 my $nick = $args->{nick}; 38 my $conn = AnyEvent::IRC::Client->new(); 41 my %args = (@_); 42 my $conn = Net::IRC::Connection->new($irc, %args); 39 43 my $self = bless({}, $class); 40 44 $self->conn($conn); 41 $self->autoconnect_channels([]);42 45 $self->alias($alias); 43 $self-> server($host);46 $self->channels([]); 44 47 $self->motd(""); 45 48 $self->names_tmp(0); 46 $self->backoff(0);47 49 $self->whois_tmp(""); 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}})) }); 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(@_) }); 103 77 104 78 return $self; 105 }106 107 sub nick {108 my $self = shift;109 return $self->conn->nick;110 79 } 111 80 … … 114 83 my $self = shift; 115 84 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]))122 85 } 123 86 … … 129 92 my $self = shift; 130 93 my $evt = shift; 131 my %args =(94 return BarnOwl::Message->new( 132 95 type => 'IRC', 133 96 server => $self->server, 134 97 network => $self->alias, 98 sender => $evt->nick, 99 hostname => $evt->host, 100 from => $evt->from, 135 101 @_ 136 102 ); 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);145 103 } 146 104 147 105 sub on_msg { 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) = @_; 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'; 166 111 my $msg = $self->new_message($evt, 167 112 direction => 'in', 168 113 recipient => $recipient, 169 body 170 ($evt->{command}||'')eq 'notice' ?114 body => $body, 115 $evt->type eq 'notice' ? 171 116 (notice => 'true') : (), 172 117 is_private($recipient) ? 173 118 (private => 'true') : (channel => $recipient), 174 119 replycmd => BarnOwl::quote('irc-msg', '-a', $self->alias, 175 (is_private($recipient) ? prefix_nick($evt): $recipient)),176 replysendercmd => BarnOwl::quote('irc-msg', '-a', $self->alias, prefix_nick($evt)),120 (is_private($recipient) ? $evt->nick : $recipient)), 121 replysendercmd => BarnOwl::quote('irc-msg', '-a', $self->alias, $evt->nick), 177 122 ); 178 123 … … 180 125 } 181 126 127 sub on_ping { 128 my ($self, $evt) = @_; 129 $self->conn->ctcp_reply($evt->nick, join (' ', ($evt->args))); 130 } 182 131 183 132 sub on_admin_msg { 184 133 my ($self, $evt) = @_; 185 return if BarnOwl::Module::IRC->skip_msg($evt-> {command});186 BarnOwl::admin_message("IRC", 187 BarnOwl::Style::boldify('IRC ' . $evt-> {command}. ' message from '134 return if BarnOwl::Module::IRC->skip_msg($evt->type); 135 BarnOwl::admin_message("IRC", 136 BarnOwl::Style::boldify('IRC ' . $evt->type . ' message from ' 188 137 . $self->alias) . "\n" 189 . strip_irc_formatting(join ' ', cdr($evt-> {params})));138 . strip_irc_formatting(join ' ', cdr($evt->args))); 190 139 } 191 140 192 141 sub on_motdstart { 193 142 my ($self, $evt) = @_; 194 $self->motd(join "\n", cdr( @{$evt->{params}}));143 $self->motd(join "\n", cdr($evt->args)); 195 144 } 196 145 197 146 sub on_motd { 198 147 my ($self, $evt) = @_; 199 $self->motd(join "\n", $self->motd, cdr( @{$evt->{params}}));148 $self->motd(join "\n", $self->motd, cdr($evt->args)); 200 149 } 201 150 202 151 sub on_endofmotd { 203 152 my ($self, $evt) = @_; 204 $self->motd(join "\n", $self->motd, cdr( @{$evt->{params}}));153 $self->motd(join "\n", $self->motd, cdr($evt->args)); 205 154 BarnOwl::admin_message("IRC", 206 155 BarnOwl::Style::boldify('MOTD for ' . $self->alias) . "\n" … … 210 159 sub on_join { 211 160 my ($self, $evt) = @_; 212 my $chan = $evt->{params}[0];213 161 my $msg = $self->new_message($evt, 214 162 loginout => 'login', 215 163 action => 'join', 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)),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), 219 167 ); 220 168 BarnOwl::queue_message($msg); 169 push @{$self->channels}, $evt->to; 221 170 } 222 171 223 172 sub on_part { 224 173 my ($self, $evt) = @_; 225 my $chan = $evt->{params}[0];226 174 my $msg = $self->new_message($evt, 227 175 loginout => 'logout', 228 176 action => 'part', 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)),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), 232 180 ); 233 181 BarnOwl::queue_message($msg); 182 $self->channels([ grep {$_ ne $evt->to} @{$self->channels}]); 234 183 } 235 184 … … 239 188 loginout => 'logout', 240 189 action => 'quit', 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)),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), 245 194 ); 246 195 BarnOwl::queue_message($msg); … … 249 198 sub disconnect { 250 199 my $self = shift; 251 $self->conn->disconnect; 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}); 210 $self->motd(""); 252 211 } 253 212 254 213 sub on_disconnect { 255 my ($self, $why) = @_; 214 my ($self, $evt) = @_; 215 $self->disconnect; 256 216 BarnOwl::admin_message('IRC', 257 "[" . $self->alias . "] Disconnected from server: $why"); 258 $self->motd(""); 259 if (!$self->did_quit) { 217 "[" . $self->alias . "] Disconnected from server"); 218 if ($evt->format and $evt->format eq "error") { 260 219 $self->schedule_reconnect; 261 220 } else { 262 delete $BarnOwl::Module::IRC::ircnets{$self->alias};263 } 264 } 265 266 sub on_ error{267 my ($self, $evt) = @_; 268 BarnOwl::admin_message( 'IRC',221 $self->channels([]); 222 } 223 } 224 225 sub on_nickinuse { 226 my ($self, $evt) = @_; 227 BarnOwl::admin_message("IRC", 269 228 "[" . $self->alias . "] " . 270 "Error: " . join(" ", @{$evt->{params}})); 271 } 272 273 sub on_nickinuse { 274 my ($self, $evt) = @_; 275 BarnOwl::admin_message("IRC", 276 "[" . $self->alias . "] " . 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) { 229 [$evt->args]->[1] . ": Nick already in use"); 230 $self->disconnect unless $self->motd; 231 } 232 233 sub on_topic { 234 my ($self, $evt) = @_; 235 my @args = $evt->args; 236 if (scalar @args > 1) { 283 237 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 } 299 } 300 301 sub on_topic { 302 my ($self, $channel, $topic, $who) = @_; 303 if ($channel) { 304 BarnOwl::admin_message("IRC", 305 "Topic for $channel on " . $self->alias . " is $topic"); 238 "Topic for $args[1] on " . $self->alias . " is $args[2]"); 306 239 } else { 307 240 BarnOwl::admin_message("IRC", 308 "Topic changed to $ channel");241 "Topic changed to $args[0]"); 309 242 } 310 243 } … … 312 245 sub on_topicinfo { 313 246 my ($self, $evt) = @_; 314 my @args = @{$evt->{params}};247 my @args = $evt->args; 315 248 BarnOwl::admin_message("IRC", 316 249 "Topic for $args[1] set by $args[2] at " . localtime($args[3])); … … 324 257 my ($self, $evt) = @_; 325 258 return unless $self->names_tmp; 326 $self->names_tmp([@{$self->names_tmp}, 327 map {prefix_nick($_)} split(' ', $evt->{params}[3])]); 259 $self->names_tmp([@{$self->names_tmp}, split(' ', [$evt->args]->[3])]); 328 260 } 329 261 … … 340 272 my ($self, $evt) = @_; 341 273 return unless $self->names_tmp; 342 my $names = BarnOwl::Style::boldify("Members of " . $evt->{params}->[1] . ":\n");274 my $names = BarnOwl::Style::boldify("Members of " . [$evt->args]->[1] . ":\n"); 343 275 for my $name (sort {cmp_user($a, $b)} @{$self->names_tmp}) { 344 276 $names .= " $name\n"; … … 350 282 sub on_whois { 351 283 my ($self, $evt) = @_; 352 my %names = (353 311 => 'user',354 312 => 'server',355 319 => 'channels',356 330 => 'whowas',357 );358 284 $self->whois_tmp( 359 $self->whois_tmp . "\n" . $names{$evt->{command}}. ":\n " .360 join("\n ", cdr(cdr(@{$evt->{params}}))) . "\n"361 285 $self->whois_tmp . "\n" . $evt->type . ":\n " . 286 join("\n ", cdr(cdr($evt->args))) . "\n" 287 ); 362 288 } 363 289 … … 365 291 my ($self, $evt) = @_; 366 292 BarnOwl::popless_ztext( 367 BarnOwl::Style::boldify("/whois for " . $evt->{params}->[1] . ":\n") .293 BarnOwl::Style::boldify("/whois for " . [$evt->args]->[1] . ":\n") . 368 294 $self->whois_tmp 369 295 ); … … 374 300 my ($self, $evt) = @_; 375 301 BarnOwl::admin_message("IRC", 376 "[" . $self->alias . "] User " . ( prefix_nick($evt)) . + " set mode " .377 join(" ", cdr(@{$evt->{params}})) . " on " . $evt->{params}->[0]302 "[" . $self->alias . "] User " . ($evt->nick) . + " set mode " . 303 join(" ", $evt->args) . "on " . $evt->to->[0] 378 304 ); 379 305 } 380 306 381 sub on_nosuch { 382 my ($self, $evt) = @_; 383 my %things = (401 => 'nick', 402 => 'server', 403 => 'channel'); 307 sub on_nosuchchannel { 308 my ($self, $evt) = @_; 384 309 BarnOwl::admin_message("IRC", 385 310 "[" . $self->alias . "] " . 386 "No such @{[$things{$evt->{command}}]}: @{[$evt->{params}->[1]]}")311 "No such channel: " . [$evt->args]->[1]) 387 312 } 388 313 … … 398 323 sub schedule_reconnect { 399 324 my $self = shift; 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 325 my $interval = shift || 5; 326 delete $BarnOwl::Module::IRC::ircnets{$self->alias}; 327 $BarnOwl::Module::IRC::reconnect{$self->alias} = $self; 409 328 my $weak = $self; 410 329 weaken($weak); … … 424 343 sub cancel_reconnect { 425 344 my $self = shift; 426 345 delete $BarnOwl::Module::IRC::reconnect{$self->alias}; 427 346 if (defined $self->{reconnect_timer}) { 428 347 $self->{reconnect_timer}->stop; 429 348 } 430 349 delete $self->{reconnect_timer}; 431 }432 433 sub on_connect {434 my $self = shift;435 $self->connected("Connected to " . $self->alias . " as " . $self->nick)436 350 } 437 351 … … 441 355 BarnOwl::admin_message("IRC", $msg); 442 356 $self->cancel_reconnect; 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); 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; 454 361 } 455 362 456 363 sub reconnect { 457 364 my $self = shift; 458 my $backoff = $self->backoff; 459 460 $self->autoconnect_channels([keys(%{$self->{channel_list}})]); 461 $self->conn->connect(@{$self->connect_args}); 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 ); 462 379 } 463 380 -
perlconfig.c
r3b8a563 rf25df21 403 403 } 404 404 405 sv_setpv(get_sv("BarnOwl::VERSION", TRUE), OWL_VERSION_STRING);406 407 405 /* Add the system lib path to @INC */ 408 406 inc = get_av("INC", 0); … … 467 465 :"BarnOwl::_receive_msg_legacy_wrap", m); 468 466 } 469 g_free(ptr);467 if (ptr) g_free(ptr); 470 468 } 471 469 … … 478 476 :"BarnOwl::Hooks::_new_msg", m); 479 477 } 480 g_free(ptr);478 if (ptr) g_free(ptr); 481 479 } 482 480 -
perlglue.xs
r3b8a563 rf25df21 43 43 rv = owl_function_command(cmd); 44 44 } else { 45 /* Ensure this is NULL-terminated. */ 46 argv = g_new0(const char *, items + 1); 45 argv = g_new(const char *, items + 1); 47 46 argv[0] = cmd; 48 47 for(i = 1; i < items; i++) { … … 57 56 RETVAL 58 57 CLEANUP: 59 g_free(rv);58 if (rv) g_free(rv); 60 59 61 60 SV * … … 114 113 RETVAL 115 114 CLEANUP: 116 g_free(rv);115 if (rv) g_free(rv); 117 116 118 117 const utf8 * … … 141 140 RETVAL 142 141 CLEANUP: 143 g_free(rv);142 if (rv) g_free(rv); 144 143 145 144 void … … 324 323 RETVAL 325 324 CLEANUP: 326 g_free(rv); 325 if (rv) 326 g_free(rv); 327 327 328 328 void -
select.c
rba12b44 rba12b44 321 321 } 322 322 323 #if 0324 /* 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 #endif342 343 323 typedef struct _owl_task { /*noproto*/ 344 324 void (*cb)(void *); -
tester.c
r4c7c21f rf25df21 233 233 234 234 printf("# BEGIN testing owl_dict\n"); 235 owl_dict_create(&d);235 FAIL_UNLESS("create", 0==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 owl_dict_get_keys(&d, &l);251 FAIL_UNLESS("get_keys", 0==owl_dict_get_keys(&d, &l)); 252 252 FAIL_UNLESS("get_keys result size", 3==owl_list_get_size(&l)); 253 253 -
text.c
r7865479 r42ee1be 275 275 g_strfreev(split); 276 276 return out; 277 } 278 279 /* replace all instances of character a in buff with the character 280 * 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); 277 291 } 278 292 -
util.c
r9efa5bd re56303f 715 715 } 716 716 717 int owl_util_get_colorpairs(void) {718 #ifndef NCURSES_EXT_COLORS719 /* Without ext-color support (an ABI change), ncurses only supports 256720 * different color pairs. However, it gives us a larger number even if your721 * ncurses is compiled without ext-color. */722 return MIN(COLOR_PAIRS, 256);723 #else724 return COLOR_PAIRS;725 #endif726 }727 728 717 gulong owl_dirty_window_on_signal(owl_window *w, gpointer sender, const gchar *detailed_signal) 729 718 { -
variable.c
r4c7c21f rf25df21 30 30 NULL, NULL, NULL, NULL, NULL, NULL } 31 31 32 #define OWLVAR_STRING_FULL(name,default, validset,summary,description,validate,set,get) \33 { name, OWL_VARIABLE_STRING, default, 0, validset, summary,description, NULL, \32 #define OWLVAR_STRING_FULL(name,default,summary,description,validate,set,get) \ 33 { name, OWL_VARIABLE_STRING, default, 0, "<string>", summary,description, NULL, \ 34 34 validate, set, NULL, get, NULL, NULL } 35 35 … … 266 266 "" ), 267 267 268 OWLVAR_STRING_FULL( "tty" /* %OwlVarStub */, "", " <string>", "tty name for zephyr location", "",268 OWLVAR_STRING_FULL( "tty" /* %OwlVarStub */, "", "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 437 372 /* This MUST be last... */ 438 373 { NULL, 0, NULL, 0, NULL, NULL, NULL, NULL, … … 535 470 } 536 471 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 }554 472 555 473 /**************************************************************************/ … … 559 477 int owl_variable_dict_setup(owl_vardict *vd) { 560 478 owl_variable *var, *cur; 561 owl_dict_create(vd);479 if (owl_dict_create(vd)) return(-1); 562 480 for (var = variables_to_init; var->name != NULL; var++) { 563 481 cur = g_new(owl_variable, 1); … … 641 559 642 560 void owl_variable_update(owl_variable *var, const char *summary, const char *desc) { 643 g_free(var->summary);561 if(var->summary) g_free(var->summary); 644 562 var->summary = g_strdup(summary); 645 g_free(var->description);563 if(var->description) g_free(var->description); 646 564 var->description = g_strdup(desc); 647 565 } … … 651 569 if(old) { 652 570 owl_variable_update(old, summ, desc); 653 g_free(old->pval_default);571 if(old->pval_default) g_free(old->pval_default); 654 572 old->pval_default = g_strdup(initval); 655 573 } else { … … 770 688 } 771 689 if (msg && v->get_tostring_fn) { 772 tostring = v->get_tostring_fn(v, v-> get_fn(v));690 tostring = v->get_tostring_fn(v, v->val); 773 691 owl_function_makemsg("%s = '%s'", name, tostring); 774 692 g_free(tostring); … … 808 726 v = owl_dict_find_element(d, name); 809 727 if (v == NULL || !v->get_tostring_fn) return NULL; 810 return v->get_tostring_fn(v, v-> get_fn(v));728 return v->get_tostring_fn(v, v->val); 811 729 } 812 730 … … 944 862 void owl_variable_delete_default(owl_variable *v) 945 863 { 946 g_free(v->val);864 if (v->val) g_free(v->val); 947 865 } 948 866 … … 1076 994 if (!v->validate_fn(v, newval)) return(-1); 1077 995 } 1078 g_free(v->val);996 if (v->val) g_free(v->val); 1079 997 v->val = g_strdup(newval); 1080 998 return(0); -
view.c
r3b8a563 rd4927a7 160 160 { 161 161 owl_list_cleanup(&v->ml.list, NULL); 162 g_free(v->name);162 if (v->name) g_free(v->name); 163 163 } -
viewwin.c
r4fd211f r237d02c 150 150 151 151 if (!owl_viewwin_search(v, owl_global_get_search_re(&g), consider_current, direction)) 152 owl_function_ makemsg("No more matches");152 owl_function_error("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_ makemsg("No matches");174 owl_function_error("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 we550 * still overflow, this be useless work. With 8-colors, we get 64551 * pairs. With 256-colors, we get 32768 pairs with ext-colors552 * support and 256 otherwise.*/549 /* On colorpair shortage, reset and redraw /everything/. NOTE: if 550 * the current screen uses too many colorpairs, this draws 551 * everything twice. But this is unlikely; COLOR_PAIRS is 64 with 552 * 8+1 colors, and 256^2 with 256+1 colors. (+1 for default.) */ 553 553 cpmgr = owl_global_get_colorpair_mgr(&g); 554 554 if (cpmgr->overflow) { 555 owl_function_debugmsg("colorpairs: used all %d pairs; reset pairs and redraw.", 556 owl_util_get_colorpairs()); 555 owl_function_debugmsg("colorpairs: color shortage; reset pairs and redraw. COLOR_PAIRS = %d", COLOR_PAIRS); 557 556 owl_fmtext_reset_colorpairs(cpmgr); 558 557 owl_function_full_redisplay(); -
zcrypt.c
r3b8a563 r1dd285b 476 476 477 477 for(i = 0; i < MAX_SEARCH; i++) { 478 g_free(varname[i]); 479 } 480 481 g_free(filename); 478 if(varname[i] != NULL) { 479 g_free(varname[i]); 480 } 481 } 482 483 if(filename != NULL) { 484 g_free(filename); 485 } 482 486 483 487 return keyfile; … … 769 773 err = call_filter("gpg", argv, in, &out, &status); 770 774 if(err || status) { 771 g_free(out);775 if(out) g_free(out); 772 776 return FALSE; 773 777 } … … 852 856 err = call_filter("gpg", argv, in, &out, &status); 853 857 if(err || status) { 854 g_free(out);858 if(out) g_free(out); 855 859 return FALSE; 856 860 } -
zephyr.c
r959cb85 r959cb85 447 447 return 0; 448 448 } 449 g_free(buffer); 449 if (buffer) 450 g_free(buffer); 450 451 451 452 return owl_zephyr_loadsubs_helper(subs, count); … … 1048 1049 { 1049 1050 #ifdef HAVE_LIBZEPHYR 1051 char *exposure, *eset; 1052 Code_t ret; 1053 1050 1054 ZResetAuthentication(); 1051 1055 1052 /* ZSetLocation, and store the default value as the current value */ 1053 owl_global_set_exposure(&g, owl_global_get_default_exposure(&g)); 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)); 1054 1066 #endif 1055 1067 } … … 1172 1184 ZInitLocationInfo(zstr(host), zstr(val)); 1173 1185 #endif 1174 }1175 1176 const char *owl_zephyr_normalize_exposure(const char *exposure)1177 {1178 if (exposure == NULL)1179 return NULL;1180 #ifdef HAVE_LIBZEPHYR1181 return ZParseExposureLevel(zstr(exposure));1182 #else1183 return exposure;1184 #endif1185 }1186 1187 int owl_zephyr_set_default_exposure(const char *exposure)1188 {1189 #ifdef HAVE_LIBZEPHYR1190 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 #endif1202 return 0;1203 }1204 1205 const char *owl_zephyr_get_default_exposure(void)1206 {1207 #ifdef HAVE_LIBZEPHYR1208 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 #else1216 return "";1217 #endif1218 }1219 1220 int owl_zephyr_set_exposure(const char *exposure)1221 {1222 #ifdef HAVE_LIBZEPHYR1223 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 #endif1235 return 0;1236 1186 } 1237 1187 -
zwrite.c
r3b8a563 r3f52e14 185 185 void owl_zwrite_set_message_raw(owl_zwrite *z, const char *msg) 186 186 { 187 g_free(z->message);187 if (z->message) g_free(z->message); 188 188 z->message = owl_validate_utf8(msg); 189 189 } … … 195 195 char *tmp = NULL, *tmp2; 196 196 197 g_free(z->message);197 if (z->message) 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 g_free(z->opcode);291 if (z->opcode) 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 g_free(z->zsig);308 if(z->zsig) 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 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);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); 363 363 } 364 364
Note: See TracChangeset
for help on using the changeset viewer.