src/irc_net_connect.c
author Tero Marttila <terom@fixme.fi>
Mon, 04 May 2009 20:55:04 +0300
branchnew-transport
changeset 168 a58ad50911fc
parent 156 6534a4ac957b
child 177 a74b55104fb9
permissions -rw-r--r--
refactor test.c into tests/*
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"
156
6534a4ac957b add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents: 154
diff changeset
     3
#include "sock_tcp.h"
153
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     4
#include "log.h"
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     5
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     6
#include <time.h>
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     7
#include <assert.h>
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     8
154
f4472119de3b initial code towards transport implementation, doesn't compile
Tero Marttila <terom@fixme.fi>
parents: 153
diff changeset
     9
void irc_net_disconnect (struct irc_net *net)
153
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    10
{
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    11
    struct irc_chan *chan = NULL;
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    12
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    13
    // mark
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    14
    net->connected = false;
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    15
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    16
    // destroy connection and set NULL
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    17
    irc_conn_destroy(net->conn);
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    18
    net->conn = NULL;
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    19
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    20
    // update channel state
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    21
    TAILQ_FOREACH(chan, &net->channels, net_channels) {
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    22
        // XXX: notify channel somehow
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    23
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
/**
156
6534a4ac957b add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents: 154
diff changeset
    29
 * 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
    30
 * it to us.
153
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    31
 *
156
6534a4ac957b add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents: 154
diff changeset
    32
 * 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
    33
 */
156
6534a4ac957b add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents: 154
diff changeset
    34
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
    35
{
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    36
    // mark state
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    37
    net->connecting = false;
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    38
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    39
    // create the irc connection state
156
6534a4ac957b add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents: 154
diff changeset
    40
    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
    41
        goto error;
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    42
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    43
    // add our command handlers
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    44
    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
    45
        goto error;
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    46
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    47
    // register
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    48
    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
    49
        goto error;
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    50
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    51
    // great, we're alive now
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    52
    net->connected = true;
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    53
    net->connected_ts = time(NULL);
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    54
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    55
    return SUCCESS;
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    56
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    57
error:
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    58
    if (!net->conn) {
156
6534a4ac957b add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents: 154
diff changeset
    59
        // cleanup transport ourselves
6534a4ac957b add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents: 154
diff changeset
    60
        transport_destroy(transport);
153
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    61
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    62
    } else {
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    63
        // cleanup the partial stuff
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    64
        irc_conn_destroy(net->conn);
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    65
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    66
        net->conn = NULL;
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    67
    }
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
    return ERROR_CODE(err);
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    70
}
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
 * 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
    74
 * irc_net_connected().
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    75
 */
156
6534a4ac957b add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents: 154
diff changeset
    76
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
    77
{
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    78
    struct irc_net *net = arg;
156
6534a4ac957b add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents: 154
diff changeset
    79
    error_t err;
153
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    80
    
156
6534a4ac957b add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents: 154
diff changeset
    81
    // yay
6534a4ac957b add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents: 154
diff changeset
    82
    if (irc_net_connected(net, transport, &err))
6534a4ac957b add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents: 154
diff changeset
    83
        log_err_info(&err, "irc_net_connected");
6534a4ac957b add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents: 154
diff changeset
    84
}
153
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    85
156
6534a4ac957b add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents: 154
diff changeset
    86
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
    87
{
6534a4ac957b add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents: 154
diff changeset
    88
    struct irc_net *net = arg;
6534a4ac957b add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents: 154
diff changeset
    89
    error_t err;
153
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    90
156
6534a4ac957b add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents: 154
diff changeset
    91
    // clean up
6534a4ac957b add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents: 154
diff changeset
    92
    transport_destroy(transport);
6534a4ac957b add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents: 154
diff changeset
    93
6534a4ac957b add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents: 154
diff changeset
    94
    // attempt reconnect later
6534a4ac957b add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents: 154
diff changeset
    95
    log_err_info(conn_err, "connect failed");
6534a4ac957b add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents: 154
diff changeset
    96
    
6534a4ac957b add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents: 154
diff changeset
    97
    if (irc_net_connect(net, false, &err))
6534a4ac957b add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents: 154
diff changeset
    98
        log_err_info(&err, "unable to reconnect");
153
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    99
}
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   100
156
6534a4ac957b add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents: 154
diff changeset
   101
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
   102
    .on_connect = irc_net_on_connect,
6534a4ac957b add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents: 154
diff changeset
   103
    .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
   104
};
6534a4ac957b add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents: 154
diff changeset
   105
153
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   106
/**
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   107
 * 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
   108
 * later if this succeeds.
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   109
 */
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   110
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
   111
{
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   112
    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
   113
    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
   114
    transport_t *transport = NULL;
153
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   115
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   116
    // sanity check
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   117
    assert(!net->connecting && !net->connected);
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   118
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   119
    // 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
   120
    if (info->transport) {
6534a4ac957b add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents: 154
diff changeset
   121
        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
   122
156
6534a4ac957b add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents: 154
diff changeset
   123
        // direct transport connection
6534a4ac957b add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents: 154
diff changeset
   124
        transport = info->transport;
153
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   125
156
6534a4ac957b add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents: 154
diff changeset
   126
        // 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
   127
        info->transport = NULL;
6534a4ac957b add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents: 154
diff changeset
   128
6534a4ac957b add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents: 154
diff changeset
   129
        // then create the transport right away
6534a4ac957b add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents: 154
diff changeset
   130
        if (irc_net_connected(net, transport, err))
153
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   131
            goto error;
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   132
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   133
    } else if (info->ssl_cred) {
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   134
        // aquire a ref
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   135
        // NOTE: before any error handling
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   136
        sock_ssl_client_cred_get(info->ssl_cred);
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   137
        
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   138
        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
   139
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   140
        // connect
156
6534a4ac957b add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents: 154
diff changeset
   141
        if (sock_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
   142
            goto error;
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   143
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   144
        net->connecting = true;
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   145
156
6534a4ac957b add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents: 154
diff changeset
   146
    } else if (info->hostname || info->service) {
153
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   147
        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
   148
            
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   149
        // begin async connect
156
6534a4ac957b add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents: 154
diff changeset
   150
        if (sock_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
   151
            goto error;
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   152
        
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   153
        net->connecting = true;
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   154
156
6534a4ac957b add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents: 154
diff changeset
   155
    } else {
6534a4ac957b add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents: 154
diff changeset
   156
        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
   157
153
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   158
    }
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
    return SUCCESS;
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   161
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   162
error:
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   163
    return ERROR_CODE(err);    
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   164
}
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
 * Reconnect timer callback
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   168
 */
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   169
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
   170
{
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   171
    struct irc_net *net = arg;
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   172
    struct error_info err;
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   173
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   174
    (void) fd;
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   175
    (void) what;
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   176
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   177
    // execute it?
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   178
    if (irc_net_connect(net, true, &err))
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   179
        log_err_info(&err, "unable to reconnect");
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   180
}
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
 * Schedule a reconnection attempt in IRC_NET_RECONNECT_INTERVAL.
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   184
 */
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   185
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
   186
{   
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   187
    // ...for x seconds
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   188
    struct timeval tv = { IRC_NET_RECONNECT_INTERVAL, 0 };
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   189
    
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   190
    // schedule
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   191
    if (event_add(net->reconnect_timer, &tv))
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   192
        return SET_ERROR(err, ERR_EVENT_ADD);
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   193
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   194
    // oke
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   195
    return SUCCESS;
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   196
}
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
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
   199
{
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   200
    // attempt to reconnect now?
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   201
    if (now) {
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   202
        if (irc_net_do_connect(net, err))
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   203
            // log error and continue below with schedule_reconnect
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   204
            log_err_info(err, "reconnect failed");
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   205
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   206
        else
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   207
            // connecting, done
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   208
            return SUCCESS;
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   209
    }
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
    // schedule for later
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   212
    if (irc_net_schedule_reconnect(net, err))
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   213
        goto error;
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   214
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   215
    // ok
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   216
    return SUCCESS;
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   217
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   218
error:
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   219
    return ERROR_CODE(err);
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   220
}
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   221
156
6534a4ac957b add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents: 154
diff changeset
   222
// XXX: to get the ev_base
6534a4ac957b add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents: 154
diff changeset
   223
#include "sock_internal.h"
6534a4ac957b add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents: 154
diff changeset
   224
6534a4ac957b add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents: 154
diff changeset
   225
153
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   226
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
   227
{
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   228
    // look up the ev_base 
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   229
    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
   230
 
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   231
    // reconnect timer
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   232
    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
   233
        return SET_ERROR(err, ERR_EVENT_NEW);
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   234
    
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   235
    // ok
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   236
    return SUCCESS;
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   237
}
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
void irc_net_connect_destroy (struct irc_net *net)
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   240
{
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   241
    event_free(net->reconnect_timer);
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   242
}
d35e7cb3a489 implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   243