src/irc_net.c
author Tero Marttila <terom@fixme.fi>
Thu, 12 Mar 2009 23:54:03 +0200
changeset 48 4841f4398fd2
parent 47 7d4094eb3117
child 53 12d806823775
permissions -rw-r--r--
add irc_net_quit and signal handling
25
56367df4ce5b add irc_net module, and fix Makefile CFLAGS, add -Wextra
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     1
#include "irc_net.h"
56367df4ce5b add irc_net module, and fix Makefile CFLAGS, add -Wextra
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     2
#include "log.h"
56367df4ce5b add irc_net module, and fix Makefile CFLAGS, add -Wextra
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     3
56367df4ce5b add irc_net module, and fix Makefile CFLAGS, add -Wextra
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     4
#include <stdlib.h>
26
aec062af155d add irc_chan module
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
     5
#include <string.h>
25
56367df4ce5b add irc_net module, and fix Makefile CFLAGS, add -Wextra
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     6
46
0c13bca53ae1 add irc_net_error, and improve test_irc_net to cover it as well
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
     7
/**
0c13bca53ae1 add irc_net_error, and improve test_irc_net to cover it as well
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
     8
 * Something happaned which caused our irc_conn to fail. Destroy it, and recover. XXX: somehow
0c13bca53ae1 add irc_net_error, and improve test_irc_net to cover it as well
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
     9
 */
0c13bca53ae1 add irc_net_error, and improve test_irc_net to cover it as well
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
    10
static void irc_net_error (struct irc_net *net, struct error_info *err)
0c13bca53ae1 add irc_net_error, and improve test_irc_net to cover it as well
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
    11
{
0c13bca53ae1 add irc_net_error, and improve test_irc_net to cover it as well
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
    12
    struct irc_chan *chan = NULL;
0c13bca53ae1 add irc_net_error, and improve test_irc_net to cover it as well
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
    13
0c13bca53ae1 add irc_net_error, and improve test_irc_net to cover it as well
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
    14
    // log an error
0c13bca53ae1 add irc_net_error, and improve test_irc_net to cover it as well
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
    15
    log_err_info(err, "irc_conn failed");
0c13bca53ae1 add irc_net_error, and improve test_irc_net to cover it as well
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
    16
0c13bca53ae1 add irc_net_error, and improve test_irc_net to cover it as well
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
    17
    // destroy connection and set NULL
0c13bca53ae1 add irc_net_error, and improve test_irc_net to cover it as well
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
    18
    irc_conn_destroy(net->conn);
0c13bca53ae1 add irc_net_error, and improve test_irc_net to cover it as well
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
    19
    net->conn = NULL;
0c13bca53ae1 add irc_net_error, and improve test_irc_net to cover it as well
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
    20
0c13bca53ae1 add irc_net_error, and improve test_irc_net to cover it as well
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
    21
    // update channel state
0c13bca53ae1 add irc_net_error, and improve test_irc_net to cover it as well
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
    22
    TAILQ_FOREACH(chan, &net->channels, node) {
0c13bca53ae1 add irc_net_error, and improve test_irc_net to cover it as well
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
    23
        // XXX: notify channel somehow
0c13bca53ae1 add irc_net_error, and improve test_irc_net to cover it as well
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
    24
    }
0c13bca53ae1 add irc_net_error, and improve test_irc_net to cover it as well
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
    25
0c13bca53ae1 add irc_net_error, and improve test_irc_net to cover it as well
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
    26
    // XXX: reconnect?
0c13bca53ae1 add irc_net_error, and improve test_irc_net to cover it as well
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
    27
}
0c13bca53ae1 add irc_net_error, and improve test_irc_net to cover it as well
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
    28
0c13bca53ae1 add irc_net_error, and improve test_irc_net to cover it as well
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
    29
/**
0c13bca53ae1 add irc_net_error, and improve test_irc_net to cover it as well
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
    30
 * Our irc_conn has registered. Join our channels
0c13bca53ae1 add irc_net_error, and improve test_irc_net to cover it as well
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
    31
 */
27
e6639132bead add irc_conn_callbacks, and delay irc_chan_join until on_registered
Tero Marttila <terom@fixme.fi>
parents: 26
diff changeset
    32
static void irc_net_conn_registered (struct irc_conn *conn, void *arg)
e6639132bead add irc_conn_callbacks, and delay irc_chan_join until on_registered
Tero Marttila <terom@fixme.fi>
parents: 26
diff changeset
    33
{
e6639132bead add irc_conn_callbacks, and delay irc_chan_join until on_registered
Tero Marttila <terom@fixme.fi>
parents: 26
diff changeset
    34
    struct irc_net *net = arg;
e6639132bead add irc_conn_callbacks, and delay irc_chan_join until on_registered
Tero Marttila <terom@fixme.fi>
parents: 26
diff changeset
    35
    struct irc_chan *chan = NULL;
46
0c13bca53ae1 add irc_net_error, and improve test_irc_net to cover it as well
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
    36
    struct error_info err;
27
e6639132bead add irc_conn_callbacks, and delay irc_chan_join until on_registered
Tero Marttila <terom@fixme.fi>
parents: 26
diff changeset
    37
e6639132bead add irc_conn_callbacks, and delay irc_chan_join until on_registered
Tero Marttila <terom@fixme.fi>
parents: 26
diff changeset
    38
    (void) conn;
e6639132bead add irc_conn_callbacks, and delay irc_chan_join until on_registered
Tero Marttila <terom@fixme.fi>
parents: 26
diff changeset
    39
e6639132bead add irc_conn_callbacks, and delay irc_chan_join until on_registered
Tero Marttila <terom@fixme.fi>
parents: 26
diff changeset
    40
    // join our channels
e6639132bead add irc_conn_callbacks, and delay irc_chan_join until on_registered
Tero Marttila <terom@fixme.fi>
parents: 26
diff changeset
    41
    TAILQ_FOREACH(chan, &net->channels, node) {
46
0c13bca53ae1 add irc_net_error, and improve test_irc_net to cover it as well
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
    42
        if ((ERROR_CODE(&err) = irc_chan_join(chan)))
0c13bca53ae1 add irc_net_error, and improve test_irc_net to cover it as well
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
    43
            // XXX: this should be some kind of irc_chan_error instead
0c13bca53ae1 add irc_net_error, and improve test_irc_net to cover it as well
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
    44
            irc_net_error(net, &err);
27
e6639132bead add irc_conn_callbacks, and delay irc_chan_join until on_registered
Tero Marttila <terom@fixme.fi>
parents: 26
diff changeset
    45
    }
e6639132bead add irc_conn_callbacks, and delay irc_chan_join until on_registered
Tero Marttila <terom@fixme.fi>
parents: 26
diff changeset
    46
}
e6639132bead add irc_conn_callbacks, and delay irc_chan_join until on_registered
Tero Marttila <terom@fixme.fi>
parents: 26
diff changeset
    47
46
0c13bca53ae1 add irc_net_error, and improve test_irc_net to cover it as well
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
    48
/**
0c13bca53ae1 add irc_net_error, and improve test_irc_net to cover it as well
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
    49
 * Our irc_conn has spontaneously failed, destroy it
0c13bca53ae1 add irc_net_error, and improve test_irc_net to cover it as well
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
    50
 */
45
71e65564afd2 remove irc_chan.state, modify irc_chan_callbacks.on_msg to take a irc_nm, improve error handling a bit further (up to irc_net now)
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    51
static void irc_net_conn_error (struct irc_conn *conn, struct error_info *err, void *arg)
71e65564afd2 remove irc_chan.state, modify irc_chan_callbacks.on_msg to take a irc_nm, improve error handling a bit further (up to irc_net now)
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    52
{
71e65564afd2 remove irc_chan.state, modify irc_chan_callbacks.on_msg to take a irc_nm, improve error handling a bit further (up to irc_net now)
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    53
    struct irc_net *net = arg;
71e65564afd2 remove irc_chan.state, modify irc_chan_callbacks.on_msg to take a irc_nm, improve error handling a bit further (up to irc_net now)
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    54
46
0c13bca53ae1 add irc_net_error, and improve test_irc_net to cover it as well
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
    55
    (void) conn;
0c13bca53ae1 add irc_net_error, and improve test_irc_net to cover it as well
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
    56
    
0c13bca53ae1 add irc_net_error, and improve test_irc_net to cover it as well
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
    57
    irc_net_error(net, err);
45
71e65564afd2 remove irc_chan.state, modify irc_chan_callbacks.on_msg to take a irc_nm, improve error handling a bit further (up to irc_net now)
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    58
}
71e65564afd2 remove irc_chan.state, modify irc_chan_callbacks.on_msg to take a irc_nm, improve error handling a bit further (up to irc_net now)
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    59
27
e6639132bead add irc_conn_callbacks, and delay irc_chan_join until on_registered
Tero Marttila <terom@fixme.fi>
parents: 26
diff changeset
    60
/**
48
4841f4398fd2 add irc_net_quit and signal handling
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
    61
 * Our irc_conn has quit succesfully
4841f4398fd2 add irc_net_quit and signal handling
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
    62
 */
4841f4398fd2 add irc_net_quit and signal handling
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
    63
static void irc_net_conn_quit (struct irc_conn *conn, void *arg)
4841f4398fd2 add irc_net_quit and signal handling
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
    64
{
4841f4398fd2 add irc_net_quit and signal handling
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
    65
    struct irc_net *net = arg;
4841f4398fd2 add irc_net_quit and signal handling
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
    66
4841f4398fd2 add irc_net_quit and signal handling
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
    67
    // clean up the conn
4841f4398fd2 add irc_net_quit and signal handling
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
    68
    irc_conn_destroy(conn);
4841f4398fd2 add irc_net_quit and signal handling
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
    69
    net->conn = NULL;
4841f4398fd2 add irc_net_quit and signal handling
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
    70
4841f4398fd2 add irc_net_quit and signal handling
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
    71
    // XXX: notify user
4841f4398fd2 add irc_net_quit and signal handling
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
    72
}
4841f4398fd2 add irc_net_quit and signal handling
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
    73
4841f4398fd2 add irc_net_quit and signal handling
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
    74
/**
27
e6639132bead add irc_conn_callbacks, and delay irc_chan_join until on_registered
Tero Marttila <terom@fixme.fi>
parents: 26
diff changeset
    75
 * Our irc_conn_callbacks list
e6639132bead add irc_conn_callbacks, and delay irc_chan_join until on_registered
Tero Marttila <terom@fixme.fi>
parents: 26
diff changeset
    76
 */
e6639132bead add irc_conn_callbacks, and delay irc_chan_join until on_registered
Tero Marttila <terom@fixme.fi>
parents: 26
diff changeset
    77
struct irc_conn_callbacks _conn_callbacks = {
e6639132bead add irc_conn_callbacks, and delay irc_chan_join until on_registered
Tero Marttila <terom@fixme.fi>
parents: 26
diff changeset
    78
    .on_registered  = &irc_net_conn_registered,
45
71e65564afd2 remove irc_chan.state, modify irc_chan_callbacks.on_msg to take a irc_nm, improve error handling a bit further (up to irc_net now)
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    79
    .on_error       = &irc_net_conn_error,
48
4841f4398fd2 add irc_net_quit and signal handling
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
    80
    .on_quit        = &irc_net_conn_quit,
27
e6639132bead add irc_conn_callbacks, and delay irc_chan_join until on_registered
Tero Marttila <terom@fixme.fi>
parents: 26
diff changeset
    81
};
e6639132bead add irc_conn_callbacks, and delay irc_chan_join until on_registered
Tero Marttila <terom@fixme.fi>
parents: 26
diff changeset
    82
37
4fe4a3c4496e change irc_chan.state into bool fields, move irc_cmd implementation from irc_conn.c into irc_cmd.c, remove irc_conn arg from irc_cmd_handler, add irc_conn.nickname tracking, and handle irc_chan JOINs
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
    83
/**
38
0c2e0cb46c3a implement irc_chan_callbacks, and add on_msg
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
    84
 * Propagate the command to the appropriate irc_chan based on the given name
0c2e0cb46c3a implement irc_chan_callbacks, and add on_msg
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
    85
 */
0c2e0cb46c3a implement irc_chan_callbacks, and add on_msg
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
    86
static void irc_net_propagate_chan (struct irc_net *net, const struct irc_line *line, const char *channel)
37
4fe4a3c4496e change irc_chan.state into bool fields, move irc_cmd implementation from irc_conn.c into irc_cmd.c, remove irc_conn arg from irc_cmd_handler, add irc_conn.nickname tracking, and handle irc_chan JOINs
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
    87
{
4fe4a3c4496e change irc_chan.state into bool fields, move irc_cmd implementation from irc_conn.c into irc_cmd.c, remove irc_conn arg from irc_cmd_handler, add irc_conn.nickname tracking, and handle irc_chan JOINs
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
    88
    struct irc_chan *chan;
4fe4a3c4496e change irc_chan.state into bool fields, move irc_cmd implementation from irc_conn.c into irc_cmd.c, remove irc_conn arg from irc_cmd_handler, add irc_conn.nickname tracking, and handle irc_chan JOINs
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
    89
4fe4a3c4496e change irc_chan.state into bool fields, move irc_cmd implementation from irc_conn.c into irc_cmd.c, remove irc_conn arg from irc_cmd_handler, add irc_conn.nickname tracking, and handle irc_chan JOINs
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
    90
    // look up channel
38
0c2e0cb46c3a implement irc_chan_callbacks, and add on_msg
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
    91
    if ((chan = irc_net_get_chan(net, channel)) == NULL) {
0c2e0cb46c3a implement irc_chan_callbacks, and add on_msg
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
    92
        log_warn("unknown channel: %s", channel);
37
4fe4a3c4496e change irc_chan.state into bool fields, move irc_cmd implementation from irc_conn.c into irc_cmd.c, remove irc_conn arg from irc_cmd_handler, add irc_conn.nickname tracking, and handle irc_chan JOINs
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
    93
        return;
4fe4a3c4496e change irc_chan.state into bool fields, move irc_cmd implementation from irc_conn.c into irc_cmd.c, remove irc_conn arg from irc_cmd_handler, add irc_conn.nickname tracking, and handle irc_chan JOINs
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
    94
    }
4fe4a3c4496e change irc_chan.state into bool fields, move irc_cmd implementation from irc_conn.c into irc_cmd.c, remove irc_conn arg from irc_cmd_handler, add irc_conn.nickname tracking, and handle irc_chan JOINs
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
    95
4fe4a3c4496e change irc_chan.state into bool fields, move irc_cmd implementation from irc_conn.c into irc_cmd.c, remove irc_conn arg from irc_cmd_handler, add irc_conn.nickname tracking, and handle irc_chan JOINs
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
    96
    // propagate
4fe4a3c4496e change irc_chan.state into bool fields, move irc_cmd implementation from irc_conn.c into irc_cmd.c, remove irc_conn arg from irc_cmd_handler, add irc_conn.nickname tracking, and handle irc_chan JOINs
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
    97
    irc_cmd_invoke(&chan->handlers, line);
4fe4a3c4496e change irc_chan.state into bool fields, move irc_cmd implementation from irc_conn.c into irc_cmd.c, remove irc_conn arg from irc_cmd_handler, add irc_conn.nickname tracking, and handle irc_chan JOINs
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
    98
}
4fe4a3c4496e change irc_chan.state into bool fields, move irc_cmd implementation from irc_conn.c into irc_cmd.c, remove irc_conn arg from irc_cmd_handler, add irc_conn.nickname tracking, and handle irc_chan JOINs
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
    99
4fe4a3c4496e change irc_chan.state into bool fields, move irc_cmd implementation from irc_conn.c into irc_cmd.c, remove irc_conn arg from irc_cmd_handler, add irc_conn.nickname tracking, and handle irc_chan JOINs
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
   100
/**
38
0c2e0cb46c3a implement irc_chan_callbacks, and add on_msg
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
   101
 * Propagate line to irc_chan based on args[0]
0c2e0cb46c3a implement irc_chan_callbacks, and add on_msg
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
   102
 */ 
0c2e0cb46c3a implement irc_chan_callbacks, and add on_msg
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
   103
static void irc_net_on_chan0 (const struct irc_line *line, void *arg)
0c2e0cb46c3a implement irc_chan_callbacks, and add on_msg
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
   104
{
0c2e0cb46c3a implement irc_chan_callbacks, and add on_msg
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
   105
    struct irc_net *net = arg;
0c2e0cb46c3a implement irc_chan_callbacks, and add on_msg
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
   106
    
0c2e0cb46c3a implement irc_chan_callbacks, and add on_msg
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
   107
    irc_net_propagate_chan(net, line, line->args[0]);
0c2e0cb46c3a implement irc_chan_callbacks, and add on_msg
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
   108
}
0c2e0cb46c3a implement irc_chan_callbacks, and add on_msg
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
   109
0c2e0cb46c3a implement irc_chan_callbacks, and add on_msg
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
   110
/**
0c2e0cb46c3a implement irc_chan_callbacks, and add on_msg
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
   111
 * :nm PRIVMSG <target> <message>
0c2e0cb46c3a implement irc_chan_callbacks, and add on_msg
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
   112
 *
0c2e0cb46c3a implement irc_chan_callbacks, and add on_msg
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
   113
 * Either propagate to channel if found, otherwise handle as a privmsg
0c2e0cb46c3a implement irc_chan_callbacks, and add on_msg
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
   114
 */
0c2e0cb46c3a implement irc_chan_callbacks, and add on_msg
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
   115
static void irc_net_on_PRIVMSG (const struct irc_line *line, void *arg)
0c2e0cb46c3a implement irc_chan_callbacks, and add on_msg
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
   116
{
0c2e0cb46c3a implement irc_chan_callbacks, and add on_msg
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
   117
    struct irc_net *net = arg;
0c2e0cb46c3a implement irc_chan_callbacks, and add on_msg
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
   118
0c2e0cb46c3a implement irc_chan_callbacks, and add on_msg
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
   119
    // XXX: does two lookups
0c2e0cb46c3a implement irc_chan_callbacks, and add on_msg
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
   120
    if (irc_net_get_chan(net, line->args[0])) {
0c2e0cb46c3a implement irc_chan_callbacks, and add on_msg
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
   121
        // short-circuit to on_chan0
0c2e0cb46c3a implement irc_chan_callbacks, and add on_msg
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
   122
        irc_net_on_chan0(line, arg);
0c2e0cb46c3a implement irc_chan_callbacks, and add on_msg
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
   123
    
0c2e0cb46c3a implement irc_chan_callbacks, and add on_msg
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
   124
    } else {
0c2e0cb46c3a implement irc_chan_callbacks, and add on_msg
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
   125
        // XXX: callbacks for privmsgs
0c2e0cb46c3a implement irc_chan_callbacks, and add on_msg
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
   126
        
0c2e0cb46c3a implement irc_chan_callbacks, and add on_msg
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
   127
    }
0c2e0cb46c3a implement irc_chan_callbacks, and add on_msg
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
   128
}
0c2e0cb46c3a implement irc_chan_callbacks, and add on_msg
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
   129
0c2e0cb46c3a implement irc_chan_callbacks, and add on_msg
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
   130
/**
37
4fe4a3c4496e change irc_chan.state into bool fields, move irc_cmd implementation from irc_conn.c into irc_cmd.c, remove irc_conn arg from irc_cmd_handler, add irc_conn.nickname tracking, and handle irc_chan JOINs
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
   131
 * Our irc_cmd handler list
4fe4a3c4496e change irc_chan.state into bool fields, move irc_cmd implementation from irc_conn.c into irc_cmd.c, remove irc_conn arg from irc_cmd_handler, add irc_conn.nickname tracking, and handle irc_chan JOINs
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
   132
 */
4fe4a3c4496e change irc_chan.state into bool fields, move irc_cmd implementation from irc_conn.c into irc_cmd.c, remove irc_conn arg from irc_cmd_handler, add irc_conn.nickname tracking, and handle irc_chan JOINs
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
   133
static struct irc_cmd_handler _cmd_handlers[] = {
38
0c2e0cb46c3a implement irc_chan_callbacks, and add on_msg
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
   134
    {   "JOIN",     &irc_net_on_chan0       },
0c2e0cb46c3a implement irc_chan_callbacks, and add on_msg
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
   135
    {   "PRIVMSG",  &irc_net_on_PRIVMSG     },
37
4fe4a3c4496e change irc_chan.state into bool fields, move irc_cmd implementation from irc_conn.c into irc_cmd.c, remove irc_conn arg from irc_cmd_handler, add irc_conn.nickname tracking, and handle irc_chan JOINs
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
   136
    {   NULL,       NULL                    }
4fe4a3c4496e change irc_chan.state into bool fields, move irc_cmd implementation from irc_conn.c into irc_cmd.c, remove irc_conn arg from irc_cmd_handler, add irc_conn.nickname tracking, and handle irc_chan JOINs
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
   137
};
4fe4a3c4496e change irc_chan.state into bool fields, move irc_cmd implementation from irc_conn.c into irc_cmd.c, remove irc_conn arg from irc_cmd_handler, add irc_conn.nickname tracking, and handle irc_chan JOINs
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
   138
25
56367df4ce5b add irc_net module, and fix Makefile CFLAGS, add -Wextra
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   139
err_t irc_net_create (struct irc_net **net_ptr, const struct irc_net_info *info, struct error_info *err)
56367df4ce5b add irc_net module, and fix Makefile CFLAGS, add -Wextra
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   140
{
56367df4ce5b add irc_net module, and fix Makefile CFLAGS, add -Wextra
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   141
    struct irc_net *net;
28
9c1050bc8709 add sock_stream_release/line_proto_release/irc_conn_release functions, and add proper cleanup to irc_net_create
Tero Marttila <terom@fixme.fi>
parents: 27
diff changeset
   142
    struct sock_stream *sock = NULL;
25
56367df4ce5b add irc_net module, and fix Makefile CFLAGS, add -Wextra
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   143
    
56367df4ce5b add irc_net module, and fix Makefile CFLAGS, add -Wextra
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   144
    // allocate
56367df4ce5b add irc_net module, and fix Makefile CFLAGS, add -Wextra
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   145
    if ((net = calloc(1, sizeof(*net))) == NULL)
56367df4ce5b add irc_net module, and fix Makefile CFLAGS, add -Wextra
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   146
        return SET_ERROR(err, ERR_CALLOC);
56367df4ce5b add irc_net module, and fix Makefile CFLAGS, add -Wextra
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   147
26
aec062af155d add irc_chan module
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   148
    // initialize
aec062af155d add irc_chan module
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   149
    TAILQ_INIT(&net->channels);
aec062af155d add irc_chan module
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   150
44
6bd70113e1ed add irc_net test
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   151
    if (info->raw_sock) {
6bd70113e1ed add irc_net test
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   152
        log_info("connected using raw socket: %p", info->raw_sock);
6bd70113e1ed add irc_net test
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   153
6bd70113e1ed add irc_net test
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   154
        sock = info->raw_sock;
6bd70113e1ed add irc_net test
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   155
6bd70113e1ed add irc_net test
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   156
    } else if (info->use_ssl) {
25
56367df4ce5b add irc_net module, and fix Makefile CFLAGS, add -Wextra
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   157
        log_info("connecting to [%s]:%s using SSL", info->hostname, info->service);
56367df4ce5b add irc_net module, and fix Makefile CFLAGS, add -Wextra
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   158
44
6bd70113e1ed add irc_net test
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   159
        // XXX: over-simplified blocking connect
25
56367df4ce5b add irc_net module, and fix Makefile CFLAGS, add -Wextra
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   160
        if (sock_ssl_connect(&sock, info->hostname, info->service, err))
56367df4ce5b add irc_net module, and fix Makefile CFLAGS, add -Wextra
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   161
            goto error;
56367df4ce5b add irc_net module, and fix Makefile CFLAGS, add -Wextra
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   162
56367df4ce5b add irc_net module, and fix Makefile CFLAGS, add -Wextra
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   163
    } else {
56367df4ce5b add irc_net module, and fix Makefile CFLAGS, add -Wextra
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   164
        log_info("connecting to [%s]:%s", info->hostname, info->service);
56367df4ce5b add irc_net module, and fix Makefile CFLAGS, add -Wextra
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   165
44
6bd70113e1ed add irc_net test
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
   166
        // XXX: over-simplified blocking connect
25
56367df4ce5b add irc_net module, and fix Makefile CFLAGS, add -Wextra
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   167
        if (sock_tcp_connect(&sock, info->hostname, info->service, err))
56367df4ce5b add irc_net module, and fix Makefile CFLAGS, add -Wextra
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   168
            goto error;
56367df4ce5b add irc_net module, and fix Makefile CFLAGS, add -Wextra
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   169
56367df4ce5b add irc_net module, and fix Makefile CFLAGS, add -Wextra
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   170
    }
56367df4ce5b add irc_net module, and fix Makefile CFLAGS, add -Wextra
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   171
56367df4ce5b add irc_net module, and fix Makefile CFLAGS, add -Wextra
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   172
    // create the irc connection state
27
e6639132bead add irc_conn_callbacks, and delay irc_chan_join until on_registered
Tero Marttila <terom@fixme.fi>
parents: 26
diff changeset
   173
    if (irc_conn_create(&net->conn, sock, &_conn_callbacks, net, err))
e6639132bead add irc_conn_callbacks, and delay irc_chan_join until on_registered
Tero Marttila <terom@fixme.fi>
parents: 26
diff changeset
   174
        goto error;
e6639132bead add irc_conn_callbacks, and delay irc_chan_join until on_registered
Tero Marttila <terom@fixme.fi>
parents: 26
diff changeset
   175
37
4fe4a3c4496e change irc_chan.state into bool fields, move irc_cmd implementation from irc_conn.c into irc_cmd.c, remove irc_conn arg from irc_cmd_handler, add irc_conn.nickname tracking, and handle irc_chan JOINs
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
   176
    // add our command handlers
4fe4a3c4496e change irc_chan.state into bool fields, move irc_cmd implementation from irc_conn.c into irc_cmd.c, remove irc_conn arg from irc_cmd_handler, add irc_conn.nickname tracking, and handle irc_chan JOINs
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
   177
    if ((ERROR_CODE(err) = irc_conn_add_cmd_handlers (net->conn, _cmd_handlers, net)))
4fe4a3c4496e change irc_chan.state into bool fields, move irc_cmd implementation from irc_conn.c into irc_cmd.c, remove irc_conn arg from irc_cmd_handler, add irc_conn.nickname tracking, and handle irc_chan JOINs
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
   178
        goto error;
4fe4a3c4496e change irc_chan.state into bool fields, move irc_cmd implementation from irc_conn.c into irc_cmd.c, remove irc_conn arg from irc_cmd_handler, add irc_conn.nickname tracking, and handle irc_chan JOINs
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
   179
27
e6639132bead add irc_conn_callbacks, and delay irc_chan_join until on_registered
Tero Marttila <terom@fixme.fi>
parents: 26
diff changeset
   180
    // register
28
9c1050bc8709 add sock_stream_release/line_proto_release/irc_conn_release functions, and add proper cleanup to irc_net_create
Tero Marttila <terom@fixme.fi>
parents: 27
diff changeset
   181
    log_info("connected, registering");
9c1050bc8709 add sock_stream_release/line_proto_release/irc_conn_release functions, and add proper cleanup to irc_net_create
Tero Marttila <terom@fixme.fi>
parents: 27
diff changeset
   182
27
e6639132bead add irc_conn_callbacks, and delay irc_chan_join until on_registered
Tero Marttila <terom@fixme.fi>
parents: 26
diff changeset
   183
    if ((ERROR_CODE(err) = irc_conn_register(net->conn, &info->register_info)))
25
56367df4ce5b add irc_net module, and fix Makefile CFLAGS, add -Wextra
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   184
        goto error;
56367df4ce5b add irc_net module, and fix Makefile CFLAGS, add -Wextra
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   185
    
56367df4ce5b add irc_net module, and fix Makefile CFLAGS, add -Wextra
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   186
    // ok
56367df4ce5b add irc_net module, and fix Makefile CFLAGS, add -Wextra
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   187
    *net_ptr = net;
56367df4ce5b add irc_net module, and fix Makefile CFLAGS, add -Wextra
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   188
56367df4ce5b add irc_net module, and fix Makefile CFLAGS, add -Wextra
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   189
    return SUCCESS;
56367df4ce5b add irc_net module, and fix Makefile CFLAGS, add -Wextra
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   190
56367df4ce5b add irc_net module, and fix Makefile CFLAGS, add -Wextra
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   191
error:
47
7d4094eb3117 add irc_net_destroy and fix code to be valgrind-clean on bin/test
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   192
    if (sock && !net->conn)
28
9c1050bc8709 add sock_stream_release/line_proto_release/irc_conn_release functions, and add proper cleanup to irc_net_create
Tero Marttila <terom@fixme.fi>
parents: 27
diff changeset
   193
        // we need to clean up the socket ourself
9c1050bc8709 add sock_stream_release/line_proto_release/irc_conn_release functions, and add proper cleanup to irc_net_create
Tero Marttila <terom@fixme.fi>
parents: 27
diff changeset
   194
        sock_stream_release(sock);
9c1050bc8709 add sock_stream_release/line_proto_release/irc_conn_release functions, and add proper cleanup to irc_net_create
Tero Marttila <terom@fixme.fi>
parents: 27
diff changeset
   195
    
47
7d4094eb3117 add irc_net_destroy and fix code to be valgrind-clean on bin/test
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   196
    // cleanup main
7d4094eb3117 add irc_net_destroy and fix code to be valgrind-clean on bin/test
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   197
    irc_net_destroy(net);
25
56367df4ce5b add irc_net module, and fix Makefile CFLAGS, add -Wextra
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   198
56367df4ce5b add irc_net module, and fix Makefile CFLAGS, add -Wextra
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   199
    return ERROR_CODE(err);
56367df4ce5b add irc_net module, and fix Makefile CFLAGS, add -Wextra
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   200
}
56367df4ce5b add irc_net module, and fix Makefile CFLAGS, add -Wextra
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   201
47
7d4094eb3117 add irc_net_destroy and fix code to be valgrind-clean on bin/test
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   202
void irc_net_destroy (struct irc_net *net)
7d4094eb3117 add irc_net_destroy and fix code to be valgrind-clean on bin/test
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   203
{
7d4094eb3117 add irc_net_destroy and fix code to be valgrind-clean on bin/test
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   204
    struct irc_chan *next = TAILQ_FIRST(&net->channels), *chan;
7d4094eb3117 add irc_net_destroy and fix code to be valgrind-clean on bin/test
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   205
7d4094eb3117 add irc_net_destroy and fix code to be valgrind-clean on bin/test
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   206
    // our conn
7d4094eb3117 add irc_net_destroy and fix code to be valgrind-clean on bin/test
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   207
    if (net->conn)
7d4094eb3117 add irc_net_destroy and fix code to be valgrind-clean on bin/test
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   208
        irc_conn_destroy(net->conn);
7d4094eb3117 add irc_net_destroy and fix code to be valgrind-clean on bin/test
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   209
7d4094eb3117 add irc_net_destroy and fix code to be valgrind-clean on bin/test
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   210
    // our channels
7d4094eb3117 add irc_net_destroy and fix code to be valgrind-clean on bin/test
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   211
    while (next) {
7d4094eb3117 add irc_net_destroy and fix code to be valgrind-clean on bin/test
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   212
        chan = next;
7d4094eb3117 add irc_net_destroy and fix code to be valgrind-clean on bin/test
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   213
        next = TAILQ_NEXT(chan, node);
7d4094eb3117 add irc_net_destroy and fix code to be valgrind-clean on bin/test
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   214
7d4094eb3117 add irc_net_destroy and fix code to be valgrind-clean on bin/test
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   215
        irc_chan_destroy(chan);
7d4094eb3117 add irc_net_destroy and fix code to be valgrind-clean on bin/test
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   216
    }
7d4094eb3117 add irc_net_destroy and fix code to be valgrind-clean on bin/test
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   217
7d4094eb3117 add irc_net_destroy and fix code to be valgrind-clean on bin/test
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   218
    // ourselves
7d4094eb3117 add irc_net_destroy and fix code to be valgrind-clean on bin/test
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   219
    free(net);
7d4094eb3117 add irc_net_destroy and fix code to be valgrind-clean on bin/test
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   220
}
7d4094eb3117 add irc_net_destroy and fix code to be valgrind-clean on bin/test
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   221
26
aec062af155d add irc_chan module
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   222
struct irc_chan* irc_net_add_chan (struct irc_net *net, const struct irc_chan_info *info)
aec062af155d add irc_chan module
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   223
{
aec062af155d add irc_chan module
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   224
    struct irc_chan *chan;
aec062af155d add irc_chan module
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   225
    struct error_info err;
aec062af155d add irc_chan module
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   226
aec062af155d add irc_chan module
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   227
    // create the new irc_chan struct
aec062af155d add irc_chan module
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   228
    if (irc_chan_create(&chan, net, info, &err))
aec062af155d add irc_chan module
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   229
        // XXX: we lose error info
aec062af155d add irc_chan module
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   230
        return NULL;
aec062af155d add irc_chan module
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   231
    
aec062af155d add irc_chan module
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   232
    // add to network list
aec062af155d add irc_chan module
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   233
    TAILQ_INSERT_TAIL(&net->channels, chan, node);
27
e6639132bead add irc_conn_callbacks, and delay irc_chan_join until on_registered
Tero Marttila <terom@fixme.fi>
parents: 26
diff changeset
   234
    
e6639132bead add irc_conn_callbacks, and delay irc_chan_join until on_registered
Tero Marttila <terom@fixme.fi>
parents: 26
diff changeset
   235
    // currently connected?
e6639132bead add irc_conn_callbacks, and delay irc_chan_join until on_registered
Tero Marttila <terom@fixme.fi>
parents: 26
diff changeset
   236
    if (net->conn && net->conn->registered) {
e6639132bead add irc_conn_callbacks, and delay irc_chan_join until on_registered
Tero Marttila <terom@fixme.fi>
parents: 26
diff changeset
   237
        // then join
e6639132bead add irc_conn_callbacks, and delay irc_chan_join until on_registered
Tero Marttila <terom@fixme.fi>
parents: 26
diff changeset
   238
        if ((ERROR_CODE(&err) = irc_chan_join(chan)))
e6639132bead add irc_conn_callbacks, and delay irc_chan_join until on_registered
Tero Marttila <terom@fixme.fi>
parents: 26
diff changeset
   239
            // XXX
e6639132bead add irc_conn_callbacks, and delay irc_chan_join until on_registered
Tero Marttila <terom@fixme.fi>
parents: 26
diff changeset
   240
            return NULL;
e6639132bead add irc_conn_callbacks, and delay irc_chan_join until on_registered
Tero Marttila <terom@fixme.fi>
parents: 26
diff changeset
   241
    }
26
aec062af155d add irc_chan module
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   242
aec062af155d add irc_chan module
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   243
    // ok, return
aec062af155d add irc_chan module
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   244
    return chan;
aec062af155d add irc_chan module
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   245
}
aec062af155d add irc_chan module
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   246
aec062af155d add irc_chan module
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   247
struct irc_chan* irc_net_get_chan (struct irc_net *net, const char *channel)
aec062af155d add irc_chan module
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   248
{
aec062af155d add irc_chan module
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   249
    struct irc_chan *chan = NULL;
aec062af155d add irc_chan module
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   250
aec062af155d add irc_chan module
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   251
    // look for it...
aec062af155d add irc_chan module
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   252
    TAILQ_FOREACH(chan, &net->channels, node) {
aec062af155d add irc_chan module
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   253
        if (strcasecmp(chan->info.channel, channel) == 0)
aec062af155d add irc_chan module
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   254
            // found it
aec062af155d add irc_chan module
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   255
            return chan;
aec062af155d add irc_chan module
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   256
    }
aec062af155d add irc_chan module
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   257
aec062af155d add irc_chan module
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   258
    // no such channel
aec062af155d add irc_chan module
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   259
    return NULL;
aec062af155d add irc_chan module
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   260
}
aec062af155d add irc_chan module
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   261
48
4841f4398fd2 add irc_net_quit and signal handling
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   262
err_t irc_net_quit (struct irc_net *net, const char *message)
4841f4398fd2 add irc_net_quit and signal handling
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   263
{
4841f4398fd2 add irc_net_quit and signal handling
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   264
   if (!net->conn)
4841f4398fd2 add irc_net_quit and signal handling
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   265
       return ERR_IRC_NET_QUIT_STATE;
4841f4398fd2 add irc_net_quit and signal handling
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   266
    
4841f4398fd2 add irc_net_quit and signal handling
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   267
    // send the QUIT message, and then we can wait for the reply
4841f4398fd2 add irc_net_quit and signal handling
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   268
    return irc_conn_QUIT(net->conn, message);
4841f4398fd2 add irc_net_quit and signal handling
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   269
}