Changes in / [1d21d9f:f97c1a6]


Ignore:
Files:
1 added
33 edited

Legend:

Unmodified
Added
Removed
  • README

    raeadc74 r13ee8f2  
    1818BarnOwl currently requires the following perl modules off of CPAN:
    1919
     20AnyEvent
    2021PAR
    2122Net::DNS
     
    3031The IRC module requires:
    3132
    32 Net::IRC
     33AnyEvent::IRC
    3334Class::Accessor
    3435
  • cmd.c

    rf25df21 r4c7c21f  
    1212
    1313int owl_cmddict_setup(owl_cmddict *cd) {
    14   if (0 != owl_cmddict_init(cd)) return(-1);
     14  owl_cmddict_init(cd);
    1515  if (0 != owl_cmddict_add_from_list(cd, commands_to_init)) return(-1);
    1616  return(0);
    1717}
    1818
    19 int owl_cmddict_init(owl_cmddict *cd) {
    20   if (owl_dict_create(cd)) return(-1);
    21   return(0);
     19void owl_cmddict_init(owl_cmddict *cd) {
     20  owl_dict_create(cd);
    2221}
    2322
     
    9998
    10099char *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
    115107  return retval;
    116108}
     
    142134void owl_cmd_cleanup(owl_cmd *cmd)
    143135{
    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);
    149141  if (cmd->cmd_perl) owl_perlconfig_cmd_cleanup(cmd);
    150142}
  • commands.c

    rc809f5e r3b8a563  
    12881288  }
    12891289  owl_function_nextmsg_full(filter, skip_deleted, last_if_none);
    1290   if (filter) g_free(filter);
     1290  g_free(filter);
    12911291  return(NULL);
    12921292}
     
    13181318  }
    13191319  owl_function_prevmsg_full(filter, skip_deleted, first_if_none);
    1320   if (filter) g_free(filter);
     1320  g_free(filter);
    13211321  return(NULL);
    13221322}
     
    16911691  commands = g_strsplit_set(newbuff, ";", 0);
    16921692  for (i = 0; commands[i] != NULL; i++) {
    1693     if (lastrv) {
    1694       g_free(lastrv);
    1695     }
     1693    g_free(lastrv);
    16961694    lastrv = owl_function_command(commands[i]);
    16971695  }
  • configure.ac

    r1255365 r1255365  
    115115
    116116dnl Add CFLAGS and LIBS for glib-2.0
    117 PKG_CHECK_MODULES(GLIB,[glib-2.0 gobject-2.0 gthread-2.0])
     117PKG_CHECK_MODULES(GLIB,[glib-2.0 >= 2.12 gobject-2.0 gthread-2.0])
    118118
    119119AC_MSG_NOTICE([Adding glib-2.0 CFLAGS ${GLIB_CFLAGS}])
  • dict.c

    rf25df21 r4c7c21f  
    1515#define GROWBY 3 / 2
    1616
    17 int owl_dict_create(owl_dict *d) {
     17void owl_dict_create(owl_dict *d) {
    1818  d->size=0;
    1919  d->els=g_new(owl_dict_el, INITSIZE);
    2020  d->avail=INITSIZE;
    21   if (d->els==NULL) return(-1);
    22   return(0);
    2321}
    2422
     
    6058/* Appends dictionary keys to a list.  Duplicates the keys,
    6159 * so they will need to be freed by the caller. */
    62 int owl_dict_get_keys(const owl_dict *d, owl_list *l) {
     60void owl_dict_get_keys(const owl_dict *d, owl_list *l) {
    6361  int i;
    64   char *dupk;
    6562  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));
    6864  }
    69   return(0);
    7065}
    7166
     
    8479{
    8580  int pos, found;
    86   char *dupk;
    8781  found = _owl_dict_find_pos(d, k, &pos);
    8882  if (found && delete_on_replace) {
     
    9993      if (d->els==NULL) return(-1);
    10094    }
    101     if ((dupk = g_strdup(k)) == NULL) return(-1);
    10295    if (pos!=d->size) {
    10396      /* shift forward to leave us a slot */
     
    10699    }
    107100    d->size++;
    108     d->els[pos].k = dupk;
     101    d->els[pos].k = g_strdup(k);
    109102    d->els[pos].v = v;   
    110103    return(0);
  • editwin.c

    r47e0a6a r3b8a563  
    317317  }
    318318
    319   if (locktext)
    320     g_free(locktext);
     319  g_free(locktext);
    321320
    322321  oe_set_index(e, lock);
  • fmtext.c

    r4479497 r7b4f3be  
    184184}
    185185
    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 
    193186static void _owl_fmtext_wcolor_set(WINDOW *w, short pair)
    194187{
    195   if (owl_global_get_hascolors(&g)) {
     188  if (has_colors()) {
    196189      wcolor_set(w,pair,NULL);
    197190      wbkgdset(w, COLOR_PAIR(pair));
     
    221214  bg = default_bgcolor;
    222215  _owl_fmtext_wattrset(w, attr);
    223   _owl_fmtext_update_colorpair(fg, bg, &pair);
     216  pair = owl_fmtext_get_colorpair(fg, bg);
    224217  _owl_fmtext_wcolor_set(w, pair);
    225218
     
    270263      if (bg == OWL_COLOR_DEFAULT) bg = default_bgcolor;
    271264      _owl_fmtext_wattrset(w, attr);
    272       _owl_fmtext_update_colorpair(fg, bg, &pair);
     265      pair = owl_fmtext_get_colorpair(fg, bg);
    273266      _owl_fmtext_wcolor_set(w, pair);
    274267
     
    662655           continue */
    663656      } else if (!strcasecmp(buff, "@color")
    664                  && owl_global_get_hascolors(&g)
    665657                 && owl_global_is_colorztext(&g)) {
    666658        g_free(buff);
     
    820812    }
    821813  }
    822   if (owl_global_get_hascolors(&g)) {
     814  if (has_colors()) {
    823815    for(i = 0; i < 8; i++) {
    824816      short fg, bg;
     
    835827  owl_colorpair_mgr *cpmgr;
    836828  short pair;
     829
     830  if (!has_colors())
     831    return 0;
    837832
    838833  /* Sanity (Bounds) Check */
     
    852847  if (!(pair != -1 && pair < cpmgr->next)) {
    853848    /* 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;
    855850    if (pair != -1) {
    856851      /* We found a free pair, initialize it. */
  • functions.c

    r47128d9 r47128d9  
    3232  char *rv;
    3333  rv=owl_function_command(cmdbuff);
    34   if (rv) g_free(rv);
     34  g_free(rv);
    3535}
    3636
     
    453453
    454454  if (rv || status) {
    455     if(cryptmsg) g_free(cryptmsg);
     455    g_free(cryptmsg);
    456456    g_free(old_msg);
    457457    owl_function_error("Error in zcrypt, possibly no key found.  Message not sent.");
     
    991991  /* execute the commands in shutdown */
    992992  ret = owl_perlconfig_execute("BarnOwl::Hooks::_shutdown();");
    993   if (ret) g_free(ret);
     993  g_free(ret);
    994994
    995995  /* signal our child process, if any */
     
    18171817          owl_global_get_cols(&g));
    18181818
    1819   if (owl_global_get_hascolors(&g)) {
     1819  if (has_colors()) {
    18201820    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());
    18221822    owl_fmtext_appendf_normal(&fm, "Can change colors: %s\n", can_change_color() ? "yes" : "no");
    18231823  } else {
     
    22262226    f = fl->data;
    22272227    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));
    22332231    owl_fmtext_append_normal(&fm, "\n");
    22342232  }
     
    23602358done:
    23612359  g_free(class);
    2362   if (instance) {
    2363     g_free(instance);
    2364   }
     2360  g_free(instance);
    23652361  return(filtname);
    23662362}
     
    25232519
    25242520  filtname = g_strdup_printf("conversation-%s", ccs);
    2525   owl_text_tr(filtname, ' ', '-');
     2521  g_strdelimit(filtname, " ", '-');
    25262522
    25272523  if (owl_global_get_filter(&g, filtname)) {
     
    29592955 
    29602956  if (viewsize==0) {
    2961     owl_function_error("No messages present");
     2957    owl_function_makemsg("No messages present");
    29622958    return;
    29632959  }
     
    29732969  /* bounds check */
    29742970  if (start>=viewsize || start<0) {
    2975     owl_function_error("No further matches found");
     2971    owl_function_makemsg("No further matches found");
    29762972    return;
    29772973  }
     
    30022998  }
    30032999  owl_mainwin_redisplay(owl_global_get_mainwin(&g));
    3004   owl_function_error("No matches found");
     3000  owl_function_makemsg("No matches found");
    30053001}
    30063002
  • global.c

    rdc1edbd rdc1edbd  
    5454  g->direction=OWL_DIRECTION_DOWNWARDS;
    5555  g->zaway=0;
    56   if (has_colors()) {
    57     g->hascolors=1;
    58   }
    59   g->colorpairs=COLOR_PAIRS;
    6056  owl_fmtext_init_colorpair_mgr(&(g->cpmgr));
    6157  g->debug=OWL_DEBUG;
     
    512508
    513509void owl_global_set_startupargs(owl_global *g, int argc, char **argv) {
    514   if (g->startupargs) g_free(g->startupargs);
     510  g_free(g->startupargs);
    515511  g->startupargs = g_strjoinv(" ", argv);
    516512}
     
    577573owl_view *owl_global_get_current_view(owl_global *g) {
    578574  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);
    592575}
    593576
     
    773756}
    774757
    775 int owl_global_get_style_names(const owl_global *g, owl_list *l) {
    776   return owl_dict_get_keys(&(g->styledict), l);
     758void owl_global_get_style_names(const owl_global *g, owl_list *l) {
     759  owl_dict_get_keys(&(g->styledict), l);
    777760}
    778761
  • keybinding.c

    rd07af84 r3b8a563  
    6969void owl_keybinding_delete(owl_keybinding *kb)
    7070{
    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);
    7474  g_free(kb);
    7575}
  • keymap.c

    r47e0a6a r4c7c21f  
    99{
    1010  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);
    1414  km->parent = NULL;
    1515  km->default_fn = default_fn;
     
    179179/* NOTE: keyhandler has private access to the internals of keymap */
    180180
    181 int owl_keyhandler_init(owl_keyhandler *kh)
    182 {
    183   if (0 != owl_dict_create(&kh->keymaps)) return(-1);
     181void owl_keyhandler_init(owl_keyhandler *kh)
     182{
     183  owl_dict_create(&kh->keymaps);
    184184  kh->active = NULL;
    185185  owl_keyhandler_reset(kh);
    186   return(0);
    187186}
    188187
  • list.c

    rddbbcffa rfda61d3  
    55#define GROWBY 3 / 2
    66
    7 int owl_list_create(owl_list *l)
     7void owl_list_create(owl_list *l)
    88{
    99  l->size=0;
    1010  l->list=g_new(void *, INITSIZE);
    1111  l->avail=INITSIZE;
    12   if (l->list==NULL) return(-1);
    13   return(0);
    1412}
    1513
  • logging.c

    rfe3b017 r7865479  
    151151  } else if (owl_message_is_type_jabber(m)) {
    152152    to = g_strdup_printf("jabber:%s", owl_message_get_recipient(m));
    153     owl_text_tr(to, '/', '_');
     153    g_strdelimit(to, "/", '_');
    154154  } else if (owl_message_is_type_aim(m)) {
    155155    char *temp2;
  • owl.c

    r1d21d9f r1d21d9f  
    4141  char *confdir;
    4242  bool debug;
    43   bool rm_debug;
    4443} owl_options;
    4544
     
    5049  fprintf(stderr, "  -n,--no-subs        don't load zephyr subscriptions\n");
    5150  fprintf(stderr, "  -d,--debug          enable debugging\n");
    52   fprintf(stderr, "  -D,--remove-debug   enable debugging and delete previous debug file\n");
    5351  fprintf(stderr, "  -v,--version        print the Barnowl version number and exit\n");
    5452  fprintf(stderr, "  -h,--help           print this help message\n");
     
    6664    { "tty",             1, 0, 't' },
    6765    { "debug",           0, 0, 'd' },
    68     { "remove-debug",    0, 0, 'D' },
    6966    { "version",         0, 0, 'v' },
    7067    { "help",            0, 0, 'h' },
     
    8885      opts->tty = g_strdup(optarg);
    8986      break;
    90     case 'D':
    91       opts->rm_debug = 1;
    92       /* fallthrough */
    9387    case 'd':
    9488      opts->debug = 1;
     
    509503  /* owl global init */
    510504  owl_global_init(&g);
    511   if (opts.rm_debug) unlink(OWL_DEBUG_FILE);
    512505  if (opts.debug) owl_global_set_debug_on(&g);
    513506  if (opts.confdir) owl_global_set_confdir(&g, opts.confdir);
     
    577570  owl_function_debugmsg("startup: executing perl startup, if applicable");
    578571  perlout = owl_perlconfig_execute("BarnOwl::Hooks::_startup();");
    579   if (perlout) g_free(perlout);
     572  g_free(perlout);
    580573
    581574  /* welcome message */
  • owl.h

    rdc1edbd rdc1edbd  
    6666#include "window.h"
    6767
     68#ifndef OWL_VERSION_STRING
    6869#ifdef  GIT_VERSION
    6970#define stringify(x)       __stringify(x)
     
    7374#define OWL_VERSION_STRING PACKAGE_VERSION
    7475#endif
     76#endif /* !OWL_VERSION_STRING */
    7577
    7678/* Feature that is being tested to redirect stderr through a pipe.
     
    602604  char *startupargs;
    603605  int nextmsgid;
    604   int hascolors;
    605   int colorpairs;
    606606  owl_colorpair_mgr cpmgr;
    607607  pid_t newmsgproc_pid;
  • perl/lib/BarnOwl.pm

    rb120bd3 rf2d71cfa  
    3838use BarnOwl::Completion;
    3939use BarnOwl::Help;
     40use BarnOwl::AnyEvent;
     41
     42unshift @AnyEvent::REGISTRY, [BarnOwl => BarnOwl::AnyEvent::];
     43require AnyEvent;
    4044
    4145use List::Util qw(max);
  • perl/modules/IRC/lib/BarnOwl/Message/IRC.pm

    re04b7a1 r60b49a7  
    6666sub action {shift->{action}}
    6767sub reason {shift->{reason}}
     68sub old_nick {shift->{old_nick}};
    6869
    6970# display
     
    8081}
    8182
    82 sub login_extra { 
     83sub login_extra {
    8384    my $self = shift;
    8485    if ($self->action eq "quit") {
    8586        return $self->reason;
     87    } elsif ($self->action eq 'nick change') {
     88        return "was: " . $self->old_nick;
    8689    } else {
    8790        return $self->channel;
  • perl/modules/IRC/lib/BarnOwl/Module/IRC.pm

    r9620c8d r5c6d661  
    2020use BarnOwl::Module::IRC::Completion;
    2121
    22 use Net::IRC;
     22use AnyEvent::IRC;
    2323use Getopt::Long;
    2424use Encode;
     
    3030# Hash alias -> BarnOwl::Module::IRC::Connection object
    3131our %ircnets;
    32 our %channels;
    33 our %reconnect;
    3432
    3533sub startup {
     
    7068
    7169    register_commands();
    72     register_handlers();
    7370    BarnOwl::filter(qw{irc type ^IRC$ or ( type ^admin$ and adminheader ^IRC$ )});
    7471}
     
    7673sub shutdown {
    7774    for my $conn (values %ircnets) {
    78         $conn->conn->disconnect();
     75        $conn->conn->disconnect('Quitting');
    7976    }
    8077}
     
    9895        $list .= "\n";
    9996
    100         for my $chan (keys %channels) {
    101             next unless grep $_ eq $conn, @{$channels{$chan}};
     97        for my $chan (keys %{$conn->conn->{channel_list}}) {
    10298            $list .= "  $chan\n";
    10399        }
     
    105101
    106102    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     }
    131103}
    132104
     
    406378    }
    407379
    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;
    425389    return;
    426390}
     
    429393    my $cmd = shift;
    430394    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}) {
    434399        BarnOwl::admin_message('IRC',
    435400                               "[" . $conn->alias . "] Reconnect cancelled");
    436401        $conn->cancel_reconnect;
     402        delete $ircnets{$conn->alias};
    437403    }
    438404}
     
    463429    for my $body (@msgs) {
    464430        if ($body =~ /^\/me (.*)/) {
    465             $conn->conn->me($to, Encode::encode('utf-8', $1));
     431            $conn->me($to, Encode::encode('utf-8', $1));
    466432            $body = '* '.$conn->nick.' '.$1;
    467433        } else {
    468             $conn->conn->privmsg($to, Encode::encode('utf-8', $body));
     434            $conn->conn->send_msg('privmsg', $to, Encode::encode('utf-8', $body));
    469435        }
    470436        my $msg = BarnOwl::Message->new(
     
    491457    my $target = shift;
    492458    $target ||= shift;
    493     $conn->conn->mode($target, @_);
     459    $conn->conn->send_msg(mode => $target, @_);
    494460    return;
    495461}
     
    499465    my $conn = shift;
    500466    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, @_);
    504468    return;
    505469}
     
    509473    my $conn = shift;
    510474    my $chan = shift;
    511     $channels{$chan} = [grep {$_ ne $conn} @{$channels{$chan} || []}];
    512     $conn->conn->part($chan);
     475    $conn->conn->send_msg(part => $chan);
    513476    return;
    514477}
     
    518481    my $conn = shift;
    519482    my $nick = shift or die("Usage: $cmd <new nick>\n");
    520     $conn->conn->nick($nick);
     483    $conn->conn->send_msg(nick => $nick);
    521484    return;
    522485}
     
    527490    my $chan = shift;
    528491    $conn->names_tmp([]);
    529     $conn->conn->names($chan);
     492    $conn->conn->send_msg(names => $chan);
    530493    return;
    531494}
     
    535498    my $conn = shift;
    536499    my $who = shift || die("Usage: $cmd <user>\n");
    537     $conn->conn->whois($who);
     500    $conn->conn->send_msg(whois => $who);
    538501    return;
    539502}
     
    542505    my $cmd = shift;
    543506    my $conn = shift;
    544     $conn->conn->motd;
     507    $conn->conn->send_msg('motd');
    545508    return;
    546509}
     
    560523    my $conn = shift;
    561524    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);
    564526    return;
    565527}
     
    569531    my $conn = shift;
    570532    my $type = shift || die("Usage: $cmd <chiklmouy> [server] \n");
    571     $conn->conn->stats($type, @_);
     533    $conn->conn->send_msg(stats => $type, @_);
    572534    return;
    573535}
     
    577539    my $conn = shift;
    578540    my $chan = shift;
    579     $conn->conn->topic($chan, @_ ? join(" ", @_) : undef);
     541    $conn->conn->send_msg(topic => $chan, @_ ? join(" ", @_) : undef);
    580542    return;
    581543}
     
    584546    my $cmd = shift;
    585547    my $conn = shift;
    586     $conn->conn->sl(join(" ", @_));
     548    $conn->conn->send_msg(@_);
    587549    return;
    588550}
     
    591553########################### Utilities/Helpers ##################################
    592554################################################################################
     555
     556sub 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}
    593566
    594567sub mk_irc_command {
     
    614587            $channel = $ARGV[0];
    615588            if(defined($channel) && $channel =~ /^#/) {
    616                 if($channels{$channel} && @{$channels{$channel}} == 1) {
     589                if(my $c = find_channel($channel)) {
    617590                    shift @ARGV;
    618                     $conn = $channels{$channel}[0] unless $conn;
     591                    $conn ||= $c;
    619592                }
    620593            } elsif ($m && $m->type eq 'IRC' && !$m->is_private) {
     
    654627    my $allow_disconnected = shift;
    655628
    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.");
    659635}
    660636
  • perl/modules/IRC/lib/BarnOwl/Module/IRC/Completion.pm

    r955a36e rdace02a  
    1111sub complete_networks { keys %BarnOwl::Module::IRC::ircnets }
    1212sub complete_dests    { keys %users, complete_channels() }
    13 sub complete_channels { keys %BarnOwl::Module::IRC::channels }
     13sub 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}
    1422sub complete_nicks    { keys %users }
    1523sub complete_servers  { keys %servers }
  • perl/modules/IRC/lib/BarnOwl/Module/IRC/Connection.pm

    rfb6e8e3 r13ee8f2  
    1111=head1 DESCRIPTION
    1212
    13 This module is a wrapper around Net::IRC::Connection for BarnOwl's IRC
     13This module is a wrapper around AnyEvent::IRC::Client for BarnOwl's IRC
    1414support
    1515
    1616=cut
    1717
    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);
     18use AnyEvent::IRC::Client;
     19use AnyEvent::IRC::Util qw(split_prefix prefix_nick encode_ctcp);
     20
     21use base qw(Class::Accessor);
     22use Exporter 'import';
     23__PACKAGE__->mk_accessors(qw(conn alias motd names_tmp whois_tmp
     24                             server autoconnect_channels
     25                             connect_args backoff did_quit));
     26our @EXPORT_OK = qw(is_private);
    2327
    2428use BarnOwl;
    2529use Scalar::Util qw(weaken);
    2630
    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 
    3731sub new {
    3832    my $class = shift;
    39     my $irc = shift;
    4033    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();
    4339    my $self = bless({}, $class);
    4440    $self->conn($conn);
     41    $self->autoconnect_channels([]);
    4542    $self->alias($alias);
    46     $self->channels([]);
     43    $self->server($host);
    4744    $self->motd("");
    4845    $self->names_tmp(0);
     46    $self->backoff(0);
    4947    $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}})) });
    77103
    78104    return $self;
     105}
     106
     107sub nick {
     108    my $self = shift;
     109    return $self->conn->nick;
    79110}
    80111
     
    83114    my $self = shift;
    84115    return $self->conn->socket;
     116}
     117
     118sub me {
     119    my ($self, $to, $msg) = @_;
     120    $self->conn->send_msg('privmsg', $to,
     121                          encode_ctcp(['ACTION', $msg]))
    85122}
    86123
     
    92129    my $self = shift;
    93130    my $evt = shift;
    94     return BarnOwl::Message->new(
     131    my %args = (
    95132        type        => 'IRC',
    96133        server      => $self->server,
    97134        network     => $self->alias,
    98         sender      => $evt->nick,
    99         hostname    => $evt->host,
    100         from        => $evt->from,
    101135        @_
    102136       );
     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);
    103145}
    104146
    105147sub 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
     153sub 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
     164sub handle_message {
     165    my ($self, $recipient, $evt, $body) = @_;
    111166    my $msg = $self->new_message($evt,
    112167        direction   => 'in',
    113168        recipient   => $recipient,
    114         body => $body,
    115         $evt->type eq 'notice' ?
     169        body        => $body,
     170        ($evt->{command}||'') eq 'notice' ?
    116171          (notice     => 'true') : (),
    117172        is_private($recipient) ?
    118173          (private  => 'true') : (channel => $recipient),
    119174        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)),
    122177       );
    123178
     
    125180}
    126181
    127 sub on_ping {
    128     my ($self, $evt) = @_;
    129     $self->conn->ctcp_reply($evt->nick, join (' ', ($evt->args)));
    130 }
    131182
    132183sub on_admin_msg {
    133184    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 '
    137188                . $self->alias) . "\n"
    138             . strip_irc_formatting(join ' ', cdr($evt->args)));
     189            . strip_irc_formatting(join ' ', cdr($evt->{params})));
    139190}
    140191
    141192sub on_motdstart {
    142193    my ($self, $evt) = @_;
    143     $self->motd(join "\n", cdr($evt->args));
     194    $self->motd(join "\n", cdr(@{$evt->{params}}));
    144195}
    145196
    146197sub on_motd {
    147198    my ($self, $evt) = @_;
    148     $self->motd(join "\n", $self->motd, cdr($evt->args));
     199    $self->motd(join "\n", $self->motd, cdr(@{$evt->{params}}));
    149200}
    150201
    151202sub on_endofmotd {
    152203    my ($self, $evt) = @_;
    153     $self->motd(join "\n", $self->motd, cdr($evt->args));
     204    $self->motd(join "\n", $self->motd, cdr(@{$evt->{params}}));
    154205    BarnOwl::admin_message("IRC",
    155206            BarnOwl::Style::boldify('MOTD for ' . $self->alias) . "\n"
     
    159210sub on_join {
    160211    my ($self, $evt) = @_;
     212    my $chan = $evt->{params}[0];
    161213    my $msg = $self->new_message($evt,
    162214        loginout   => 'login',
    163215        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)),
    167219        );
    168220    BarnOwl::queue_message($msg);
    169     push @{$self->channels}, $evt->to;
    170221}
    171222
    172223sub on_part {
    173224    my ($self, $evt) = @_;
     225    my $chan = $evt->{params}[0];
    174226    my $msg = $self->new_message($evt,
    175227        loginout   => 'logout',
    176228        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)),
    180232        );
    181233    BarnOwl::queue_message($msg);
    182     $self->channels([ grep {$_ ne $evt->to} @{$self->channels}]);
    183234}
    184235
     
    188239        loginout   => 'logout',
    189240        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)),
    194245        );
    195246    BarnOwl::queue_message($msg);
     
    198249sub disconnect {
    199250    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
     254sub on_disconnect {
     255    my ($self, $why) = @_;
     256    BarnOwl::admin_message('IRC',
     257                           "[" . $self->alias . "] Disconnected from server: $why");
    210258    $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) {
    219260        $self->schedule_reconnect;
    220261    } else {
    221         $self->channels([]);
    222     }
     262        delete $BarnOwl::Module::IRC::ircnets{$self->alias};
     263    }
     264}
     265
     266sub on_error {
     267    my ($self, $evt) = @_;
     268    BarnOwl::admin_message('IRC',
     269                           "[" . $self->alias . "] " .
     270                           "Error: " . join(" ", @{$evt->{params}}));
    223271}
    224272
     
    227275    BarnOwl::admin_message("IRC",
    228276                           "[" . $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
     280sub 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    }
    231299}
    232300
    233301sub 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) {
    237304        BarnOwl::admin_message("IRC",
    238                 "Topic for $args[1] on " . $self->alias . " is $args[2]");
     305                "Topic for $channel on " . $self->alias . " is $topic");
    239306    } else {
    240307        BarnOwl::admin_message("IRC",
    241                 "Topic changed to $args[0]");
     308                "Topic changed to $channel");
    242309    }
    243310}
     
    245312sub on_topicinfo {
    246313    my ($self, $evt) = @_;
    247     my @args = $evt->args;
     314    my @args = @{$evt->{params}};
    248315    BarnOwl::admin_message("IRC",
    249316        "Topic for $args[1] set by $args[2] at " . localtime($args[3]));
     
    257324    my ($self, $evt) = @_;
    258325    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])]);
    260328}
    261329
     
    272340    my ($self, $evt) = @_;
    273341    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");
    275343    for my $name (sort {cmp_user($a, $b)} @{$self->names_tmp}) {
    276344        $names .= "  $name\n";
     
    282350sub on_whois {
    283351    my ($self, $evt) = @_;
     352    my %names = (
     353        311 => 'user',
     354        312 => 'server',
     355        319 => 'channels',
     356        330 => 'whowas',
     357       );
    284358    $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       );
    288362}
    289363
     
    291365    my ($self, $evt) = @_;
    292366    BarnOwl::popless_ztext(
    293         BarnOwl::Style::boldify("/whois for " . [$evt->args]->[1] . ":\n") .
     367        BarnOwl::Style::boldify("/whois for " . $evt->{params}->[1] . ":\n") .
    294368        $self->whois_tmp
    295369    );
     
    300374    my ($self, $evt) = @_;
    301375    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]
    304378                          );
    305379}
    306380
    307 sub on_nosuchchannel {
    308     my ($self, $evt) = @_;
     381sub on_nosuch {
     382    my ($self, $evt) = @_;
     383    my %things = (401 => 'nick', 402 => 'server', 403 => 'channel');
    309384    BarnOwl::admin_message("IRC",
    310385                           "[" . $self->alias . "] " .
    311                            "No such channel: " . [$evt->args]->[1])
     386                           "No such @{[$things{$evt->{command}}]}: @{[$evt->{params}->[1]]}")
    312387}
    313388
     
    323398sub schedule_reconnect {
    324399    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
    328409    my $weak = $self;
    329410    weaken($weak);
     
    343424sub cancel_reconnect {
    344425    my $self = shift;
    345     delete $BarnOwl::Module::IRC::reconnect{$self->alias};
     426
    346427    if (defined $self->{reconnect_timer}) {
    347428        $self->{reconnect_timer}->stop;
    348429    }
    349430    delete $self->{reconnect_timer};
     431}
     432
     433sub on_connect {
     434    my $self = shift;
     435    $self->connected("Connected to " . $self->alias . " as " . $self->nick)
    350436}
    351437
     
    355441    BarnOwl::admin_message("IRC", $msg);
    356442    $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);
    361454}
    362455
    363456sub reconnect {
    364457    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});
    379462}
    380463
  • perlconfig.c

    rf25df21 r3b8a563  
    403403  }
    404404
     405  sv_setpv(get_sv("BarnOwl::VERSION", TRUE), OWL_VERSION_STRING);
     406
    405407  /* Add the system lib path to @INC */
    406408  inc = get_av("INC", 0);
     
    465467                                           :"BarnOwl::_receive_msg_legacy_wrap", m);
    466468  }
    467   if (ptr) g_free(ptr);
     469  g_free(ptr);
    468470}
    469471
     
    476478                                           :"BarnOwl::Hooks::_new_msg", m);
    477479  }
    478   if (ptr) g_free(ptr);
     480  g_free(ptr);
    479481}
    480482
  • perlglue.xs

    rf25df21 r3b8a563  
    4343                        rv = owl_function_command(cmd);
    4444                } else {
    45                         argv = g_new(const char *, items + 1);
     45                        /* Ensure this is NULL-terminated. */
     46                        argv = g_new0(const char *, items + 1);
    4647                        argv[0] = cmd;
    4748                        for(i = 1; i < items; i++) {
     
    5657                RETVAL
    5758        CLEANUP:
    58                 if (rv) g_free(rv);
     59                g_free(rv);
    5960
    6061SV *
     
    113114                RETVAL
    114115        CLEANUP:
    115                 if (rv) g_free(rv);
     116                g_free(rv);
    116117
    117118const utf8 *
     
    140141                RETVAL
    141142    CLEANUP:
    142                 if (rv) g_free(rv);
     143                g_free(rv);
    143144
    144145void
     
    323324                RETVAL
    324325        CLEANUP:
    325                 if (rv)
    326                         g_free(rv);
     326                g_free(rv);
    327327
    328328void
  • select.c

    rba12b44 rba12b44  
    321321}
    322322
     323#if 0
     324/* FIXME: Reimplement this check in the glib world. */
     325static 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
    323343typedef struct _owl_task { /*noproto*/
    324344  void (*cb)(void *);
  • tester.c

    rf25df21 r4c7c21f  
    233233
    234234  printf("# BEGIN testing owl_dict\n");
    235   FAIL_UNLESS("create", 0==owl_dict_create(&d));
     235  owl_dict_create(&d);
    236236  FAIL_UNLESS("insert b", 0==owl_dict_insert_element(&d, "b", bv, owl_dict_noop_delete));
    237237  FAIL_UNLESS("insert d", 0==owl_dict_insert_element(&d, "d", dv, owl_dict_noop_delete));
     
    249249  FAIL_UNLESS("get_size", 3==owl_dict_get_size(&d));
    250250  owl_list_create(&l);
    251   FAIL_UNLESS("get_keys", 0==owl_dict_get_keys(&d, &l));
     251  owl_dict_get_keys(&d, &l);
    252252  FAIL_UNLESS("get_keys result size", 3==owl_list_get_size(&l));
    253253 
  • text.c

    r42ee1be r7865479  
    275275  g_strfreev(split);
    276276  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);
    291277}
    292278
  • util.c

    re56303f r9efa5bd  
    715715}
    716716
     717int 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
    717728gulong owl_dirty_window_on_signal(owl_window *w, gpointer sender, const gchar *detailed_signal)
    718729{
  • variable.c

    rf25df21 r4c7c21f  
    3030        NULL, NULL, NULL, NULL, NULL, NULL }
    3131
    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, \
    3434        validate, set, NULL, get, NULL, NULL }
    3535
     
    266266                 "" ),
    267267
    268   OWLVAR_STRING_FULL( "tty" /* %OwlVarStub */, "", "tty name for zephyr location", "",
     268  OWLVAR_STRING_FULL( "tty" /* %OwlVarStub */, "", "<string>", "tty name for zephyr location", "",
    269269                      NULL, owl_variable_tty_set, NULL),
    270270
     
    370370               "delete a message right as it came in.\n" ),
    371371
     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
    372437  /* This MUST be last... */
    373438  { NULL, 0, NULL, 0, NULL, NULL, NULL, NULL,
     
    470535}
    471536
     537int owl_variable_default_exposure_set(owl_variable *v, const void *newval)
     538{
     539  return owl_zephyr_set_default_exposure(newval);
     540}
     541
     542const void *owl_variable_default_exposure_get(const owl_variable *v)
     543{
     544  return owl_zephyr_get_default_exposure();
     545}
     546
     547int 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}
    472554
    473555/**************************************************************************/
     
    477559int owl_variable_dict_setup(owl_vardict *vd) {
    478560  owl_variable *var, *cur;
    479   if (owl_dict_create(vd)) return(-1);
     561  owl_dict_create(vd);
    480562  for (var = variables_to_init; var->name != NULL; var++) {
    481563    cur = g_new(owl_variable, 1);
     
    559641
    560642void 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);
    562644  var->summary = g_strdup(summary);
    563   if(var->description) g_free(var->description);
     645  g_free(var->description);
    564646  var->description = g_strdup(desc);
    565647}
     
    569651  if(old) {
    570652    owl_variable_update(old, summ, desc);
    571     if(old->pval_default) g_free(old->pval_default);
     653    g_free(old->pval_default);
    572654    old->pval_default = g_strdup(initval);
    573655  } else {
     
    688770  }
    689771  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));
    691773    owl_function_makemsg("%s = '%s'", name, tostring);
    692774    g_free(tostring);
     
    726808  v = owl_dict_find_element(d, name);
    727809  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));
    729811}
    730812
     
    862944void owl_variable_delete_default(owl_variable *v)
    863945{
    864   if (v->val) g_free(v->val);
     946  g_free(v->val);
    865947}
    866948
     
    9941076    if (!v->validate_fn(v, newval)) return(-1);
    9951077  }
    996   if (v->val) g_free(v->val);
     1078  g_free(v->val);
    9971079  v->val = g_strdup(newval);
    9981080  return(0);
  • view.c

    rd4927a7 r3b8a563  
    160160{
    161161  owl_list_cleanup(&v->ml.list, NULL);
    162   if (v->name) g_free(v->name);
     162  g_free(v->name);
    163163}
  • viewwin.c

    r237d02c r4fd211f  
    150150
    151151  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");
    153153  return NULL;
    154154}
     
    172172  if (!owl_viewwin_search(data->v, owl_global_get_search_re(&g),
    173173                          consider_current, data->direction))
    174     owl_function_error("No matches");
     174    owl_function_makemsg("No matches");
    175175}
    176176
  • window.c

    r4cc49bc r4cc49bc  
    547547  /* update the terminal if we need to */
    548548  owl_window_redraw_scheduled();
    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.) */
     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. */
    553553  cpmgr = owl_global_get_colorpair_mgr(&g);
    554554  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());
    556557    owl_fmtext_reset_colorpairs(cpmgr);
    557558    owl_function_full_redisplay();
  • zcrypt.c

    r1dd285b r3b8a563  
    476476
    477477  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);
    486482
    487483  return keyfile;
     
    773769  err = call_filter("gpg", argv, in, &out, &status);
    774770  if(err || status) {
    775     if(out) g_free(out);
     771    g_free(out);
    776772    return FALSE;
    777773  }
     
    856852  err = call_filter("gpg", argv, in, &out, &status);
    857853  if(err || status) {
    858     if(out) g_free(out);
     854    g_free(out);
    859855    return FALSE;
    860856  }
  • zephyr.c

    r959cb85 r959cb85  
    447447    return 0;
    448448  }
    449   if (buffer)
    450     g_free(buffer);
     449  g_free(buffer);
    451450
    452451  return owl_zephyr_loadsubs_helper(subs, count);
     
    10491048{
    10501049#ifdef HAVE_LIBZEPHYR
    1051   char *exposure, *eset;
    1052   Code_t ret;
    1053 
    10541050  ZResetAuthentication();
    10551051
    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));
    10661054#endif
    10671055}
     
    11841172  ZInitLocationInfo(zstr(host), zstr(val));
    11851173#endif
     1174}
     1175
     1176const 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
     1187int 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
     1205const 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
     1220int 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;
    11861236}
    11871237 
  • zwrite.c

    r3f52e14 r3b8a563  
    185185void owl_zwrite_set_message_raw(owl_zwrite *z, const char *msg)
    186186{
    187   if (z->message) g_free(z->message);
     187  g_free(z->message);
    188188  z->message = owl_validate_utf8(msg);
    189189}
     
    195195  char *tmp = NULL, *tmp2;
    196196
    197   if (z->message) g_free(z->message);
     197  g_free(z->message);
    198198
    199199  j=owl_list_get_size(&(z->recips));
     
    289289void owl_zwrite_set_opcode(owl_zwrite *z, const char *opcode)
    290290{
    291   if (z->opcode) g_free(z->opcode);
     291  g_free(z->opcode);
    292292  z->opcode=owl_validate_utf8(opcode);
    293293}
     
    306306void owl_zwrite_set_zsig(owl_zwrite *z, const char *zsig)
    307307{
    308   if(z->zsig) g_free(z->zsig);
     308  g_free(z->zsig);
    309309  z->zsig = g_strdup(zsig);
    310310}
     
    353353{
    354354  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);
    363363}
    364364
Note: See TracChangeset for help on using the changeset viewer.