src/irc_net_connect.c
author Tero Marttila <terom@fixme.fi>
Wed, 27 May 2009 23:57:48 +0300
branchnew-lib-errors
changeset 217 7728d6ec3abf
parent 180 22967b165692
permissions -rw-r--r--
nexus.c compiles
153
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     1
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     2
#include "irc_net_internal.h"
177
a74b55104fb9 rename sock_tcp to tcp_{transport,client}, fix irc_net_connect to use log_err/tcp_connect
Tero Marttila <terom@fixme.fi>
parents: 156
diff changeset
     3
#include "tcp.h"
180
22967b165692 rename sock_ssl/sock_gnutls -> ssl/ssl_client
Tero Marttila <terom@fixme.fi>
parents: 177
diff changeset
     4
#include "ssl.h"
153
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     5
#include "log.h"
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     6
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     7
#include <time.h>
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     8
#include <assert.h>
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     9
154
f4472119de3b initial code towards transport implementation, doesn't compile
Tero Marttila <terom@fixme.fi>
parents: 153
diff changeset
    10
void irc_net_disconnect (struct irc_net *net)
153
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    11
{
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    12
    struct irc_chan *chan = NULL;
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    13
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    14
    // mark
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    15
    net->connected = false;
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    16
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    17
    // destroy connection and set NULL
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    18
    irc_conn_destroy(net->conn);
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    19
    net->conn = NULL;
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    20
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    21
    // update channel state
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    22
    TAILQ_FOREACH(chan, &net->channels, net_channels) {
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    23
        // XXX: notify channel somehow
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    24
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    25
    }
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    26
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    27
}
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    28
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    29
/**
156
6534a4ac957b add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents: 154
diff changeset
    30
 * We have succesfully established a connection to our server with the given transport, so create the irc_conn and bind
6534a4ac957b add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents: 154
diff changeset
    31
 * it to us.
153
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    32
 *
156
6534a4ac957b add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents: 154
diff changeset
    33
 * If this fails, this will clean up any partial state, including \a transport.
153
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    34
 */
156
6534a4ac957b add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents: 154
diff changeset
    35
static err_t irc_net_connected (struct irc_net *net, transport_t *transport, struct error_info *err)
153
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    36
{
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    37
    // mark state
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    38
    net->connecting = false;
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    39
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    40
    // create the irc connection state
156
6534a4ac957b add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents: 154
diff changeset
    41
    if (irc_conn_create(&net->conn, transport, &irc_net_conn_callbacks, net, err))
153
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    42
        goto error;
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    43
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    44
    // add our command handlers
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    45
    if ((ERROR_CODE(err) = irc_conn_add_cmd_handlers (net->conn, irc_net_cmd_handlers, net)))
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    46
        goto error;
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    47
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    48
    // register
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    49
    if ((ERROR_CODE(err) = irc_conn_register(net->conn, &net->info.register_info)))
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    50
        goto error;
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    51
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    52
    // great, we're alive now
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    53
    net->connected = true;
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    54
    net->connected_ts = time(NULL);
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    55
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    56
    return SUCCESS;
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    57
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    58
error:
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    59
    if (!net->conn) {
156
6534a4ac957b add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents: 154
diff changeset
    60
        // cleanup transport ourselves
6534a4ac957b add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents: 154
diff changeset
    61
        transport_destroy(transport);
153
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    62
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    63
    } else {
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    64
        // cleanup the partial stuff
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    65
        irc_conn_destroy(net->conn);
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    66
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    67
        net->conn = NULL;
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    68
    }
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    69
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    70
    return ERROR_CODE(err);
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    71
}
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    72
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    73
/**
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    74
 * Our sock_*_connect_async callback. If the connect ended up failing, then try and reconnect later. Otherwise, do
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    75
 * irc_net_connected().
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    76
 */
156
6534a4ac957b add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents: 154
diff changeset
    77
static void irc_net_on_connect (transport_t *transport, void *arg)
153
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    78
{
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    79
    struct irc_net *net = arg;
156
6534a4ac957b add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents: 154
diff changeset
    80
    error_t err;
153
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    81
    
156
6534a4ac957b add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents: 154
diff changeset
    82
    // yay
6534a4ac957b add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents: 154
diff changeset
    83
    if (irc_net_connected(net, transport, &err))
177
a74b55104fb9 rename sock_tcp to tcp_{transport,client}, fix irc_net_connect to use log_err/tcp_connect
Tero Marttila <terom@fixme.fi>
parents: 156
diff changeset
    84
        log_error(&err, "irc_net_connected");
156
6534a4ac957b add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents: 154
diff changeset
    85
}
153
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    86
156
6534a4ac957b add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents: 154
diff changeset
    87
static void irc_net_on_connect_error (transport_t *transport, const error_t *conn_err, void *arg)
6534a4ac957b add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents: 154
diff changeset
    88
{
6534a4ac957b add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents: 154
diff changeset
    89
    struct irc_net *net = arg;
6534a4ac957b add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents: 154
diff changeset
    90
    error_t err;
153
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    91
156
6534a4ac957b add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents: 154
diff changeset
    92
    // clean up
6534a4ac957b add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents: 154
diff changeset
    93
    transport_destroy(transport);
6534a4ac957b add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents: 154
diff changeset
    94
6534a4ac957b add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents: 154
diff changeset
    95
    // attempt reconnect later
177
a74b55104fb9 rename sock_tcp to tcp_{transport,client}, fix irc_net_connect to use log_err/tcp_connect
Tero Marttila <terom@fixme.fi>
parents: 156
diff changeset
    96
    log_error(conn_err, "connect failed");
156
6534a4ac957b add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents: 154
diff changeset
    97
    
6534a4ac957b add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents: 154
diff changeset
    98
    if (irc_net_connect(net, false, &err))
177
a74b55104fb9 rename sock_tcp to tcp_{transport,client}, fix irc_net_connect to use log_err/tcp_connect
Tero Marttila <terom@fixme.fi>
parents: 156
diff changeset
    99
        log_error(&err, "unable to reconnect");
153
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   100
}
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   101
156
6534a4ac957b add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents: 154
diff changeset
   102
static const struct transport_callbacks irc_net_transport_callbacks = {
6534a4ac957b add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents: 154
diff changeset
   103
    .on_connect = irc_net_on_connect,
6534a4ac957b add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents: 154
diff changeset
   104
    .on_error   = irc_net_on_connect_error,
6534a4ac957b add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents: 154
diff changeset
   105
};
6534a4ac957b add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents: 154
diff changeset
   106
153
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   107
/**
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   108
 * The low-level connect() implementation, connects based on irc_net::info, calling irc_net_connected/irc_net_reconnect
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   109
 * later if this succeeds.
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   110
 */
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   111
static err_t irc_net_do_connect (struct irc_net *net, struct error_info *err)
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   112
{
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   113
    struct irc_net_info *info = &net->info;
156
6534a4ac957b add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents: 154
diff changeset
   114
    struct transport_info transport_info = { &irc_net_transport_callbacks, net, TRANSPORT_READ | TRANSPORT_WRITE };
6534a4ac957b add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents: 154
diff changeset
   115
    transport_t *transport = NULL;
153
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   116
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   117
    // sanity check
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   118
    assert(!net->connecting && !net->connected);
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   119
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   120
    // connect based on what's known
156
6534a4ac957b add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents: 154
diff changeset
   121
    if (info->transport) {
6534a4ac957b add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents: 154
diff changeset
   122
        log_debug("connected using raw transport: %p", info->transport);
153
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   123
156
6534a4ac957b add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents: 154
diff changeset
   124
        // direct transport connection
6534a4ac957b add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents: 154
diff changeset
   125
        transport = info->transport;
153
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   126
156
6534a4ac957b add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents: 154
diff changeset
   127
        // invalidate it from info since it will get destroyed later
6534a4ac957b add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents: 154
diff changeset
   128
        info->transport = NULL;
6534a4ac957b add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents: 154
diff changeset
   129
6534a4ac957b add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents: 154
diff changeset
   130
        // then create the transport right away
6534a4ac957b add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents: 154
diff changeset
   131
        if (irc_net_connected(net, transport, err))
153
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   132
            goto error;
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   133
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   134
    } else if (info->ssl_cred) {
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   135
        // aquire a ref
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   136
        // NOTE: before any error handling
180
22967b165692 rename sock_ssl/sock_gnutls -> ssl/ssl_client
Tero Marttila <terom@fixme.fi>
parents: 177
diff changeset
   137
        ssl_client_cred_get(info->ssl_cred);
153
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   138
        
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   139
        log_debug("connecting to [%s]:%s using SSL", info->hostname, info->service);
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   140
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   141
        // connect
180
22967b165692 rename sock_ssl/sock_gnutls -> ssl/ssl_client
Tero Marttila <terom@fixme.fi>
parents: 177
diff changeset
   142
        if (ssl_connect(&transport_info, &transport, info->hostname, info->service, info->ssl_cred, err))
153
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   143
            goto error;
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   144
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   145
        net->connecting = true;
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   146
156
6534a4ac957b add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents: 154
diff changeset
   147
    } else if (info->hostname || info->service) {
153
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   148
        log_debug("connecting to [%s]:%s", info->hostname, info->service);
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   149
            
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   150
        // begin async connect
177
a74b55104fb9 rename sock_tcp to tcp_{transport,client}, fix irc_net_connect to use log_err/tcp_connect
Tero Marttila <terom@fixme.fi>
parents: 156
diff changeset
   151
        if (tcp_connect(&transport_info, &transport, info->hostname, info->service, err))
153
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   152
            goto error;
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   153
        
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   154
        net->connecting = true;
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   155
156
6534a4ac957b add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents: 154
diff changeset
   156
    } else {
6534a4ac957b add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents: 154
diff changeset
   157
        RETURN_SET_ERROR_STR(err, ERR_MISC, "no connection info specified");
6534a4ac957b add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents: 154
diff changeset
   158
153
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   159
    }
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   160
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   161
    return SUCCESS;
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   162
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   163
error:
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   164
    return ERROR_CODE(err);    
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   165
}
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   166
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   167
/**
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   168
 * Reconnect timer callback
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   169
 */
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   170
static void irc_net_reconnect_timer_cb (int fd, short what, void *arg)
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   171
{
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   172
    struct irc_net *net = arg;
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   173
    struct error_info err;
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   174
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   175
    (void) fd;
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   176
    (void) what;
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   177
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   178
    // execute it?
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   179
    if (irc_net_connect(net, true, &err))
177
a74b55104fb9 rename sock_tcp to tcp_{transport,client}, fix irc_net_connect to use log_err/tcp_connect
Tero Marttila <terom@fixme.fi>
parents: 156
diff changeset
   180
        log_error(&err, "unable to reconnect");
153
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   181
}
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   182
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   183
/**
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   184
 * Schedule a reconnection attempt in IRC_NET_RECONNECT_INTERVAL.
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   185
 */
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   186
static err_t irc_net_schedule_reconnect (struct irc_net *net, struct error_info *err)
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   187
{   
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   188
    // ...for x seconds
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   189
    struct timeval tv = { IRC_NET_RECONNECT_INTERVAL, 0 };
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   190
    
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   191
    // schedule
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   192
    if (event_add(net->reconnect_timer, &tv))
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   193
        return SET_ERROR(err, ERR_EVENT_ADD);
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   194
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   195
    // oke
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   196
    return SUCCESS;
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   197
}
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   198
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   199
err_t irc_net_connect (struct irc_net *net, bool now, struct error_info *err)
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   200
{
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   201
    // attempt to reconnect now?
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   202
    if (now) {
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   203
        if (irc_net_do_connect(net, err))
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   204
            // log error and continue below with schedule_reconnect
177
a74b55104fb9 rename sock_tcp to tcp_{transport,client}, fix irc_net_connect to use log_err/tcp_connect
Tero Marttila <terom@fixme.fi>
parents: 156
diff changeset
   205
            log_error(err, "reconnect failed");
153
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   206
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   207
        else
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   208
            // connecting, done
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   209
            return SUCCESS;
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   210
    }
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   211
    
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   212
    // schedule for later
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   213
    if (irc_net_schedule_reconnect(net, err))
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   214
        goto error;
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   215
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   216
    // ok
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   217
    return SUCCESS;
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   218
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   219
error:
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   220
    return ERROR_CODE(err);
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   221
}
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   222
156
6534a4ac957b add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents: 154
diff changeset
   223
// XXX: to get the ev_base
6534a4ac957b add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents: 154
diff changeset
   224
#include "sock_internal.h"
6534a4ac957b add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents: 154
diff changeset
   225
6534a4ac957b add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents: 154
diff changeset
   226
153
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   227
err_t irc_net_connect_init (struct irc_net *net, struct error_info *err)
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   228
{
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   229
    // look up the ev_base 
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   230
    struct event_base *ev_base = _sock_stream_ctx.ev_base;
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   231
 
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   232
    // reconnect timer
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   233
    if ((net->reconnect_timer = evtimer_new(ev_base, irc_net_reconnect_timer_cb, net)) == NULL)
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   234
        return SET_ERROR(err, ERR_EVENT_NEW);
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   235
    
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   236
    // ok
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   237
    return SUCCESS;
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   238
}
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   239
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   240
void irc_net_connect_destroy (struct irc_net *net)
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   241
{
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   242
    event_free(net->reconnect_timer);
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   243
}
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   244