src/sock_internal.h
author Tero Marttila <terom@fixme.fi>
Fri, 24 Apr 2009 23:01:34 +0300
changeset 153 d35e7cb3a489
parent 139 55b9dcc2b73a
child 155 c59d3eaff0fb
permissions -rw-r--r--
implement irc_net reconnect, requires testing
1
cf0e1bb6bcab a fancy socket abstraction layer, with TCP, next, SSL. Also, .hgignore
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     1
#ifndef SOCK_INTERNAL_H
cf0e1bb6bcab a fancy socket abstraction layer, with TCP, next, SSL. Also, .hgignore
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     2
#define SOCK_INTERNAL_H
cf0e1bb6bcab a fancy socket abstraction layer, with TCP, next, SSL. Also, .hgignore
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     3
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: 12
diff changeset
     4
/**
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: 12
diff changeset
     5
 * @file
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: 12
diff changeset
     6
 *
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: 12
diff changeset
     7
 * internal sock_* interface
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: 12
diff changeset
     8
 */
1
cf0e1bb6bcab a fancy socket abstraction layer, with TCP, next, SSL. Also, .hgignore
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     9
#include "sock.h"
139
55b9dcc2b73a implement sock_ssl_connect_async (the old sock_ssl_connect exists no more)
Tero Marttila <terom@fixme.fi>
parents: 118
diff changeset
    10
#include <stdbool.h>
1
cf0e1bb6bcab a fancy socket abstraction layer, with TCP, next, SSL. Also, .hgignore
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    11
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: 12
diff changeset
    12
/**
85
75bc8b164ef8 async TCP connects,
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
    13
 * General state for all sock_stream's
9
4c4c906cc649 add sock_stream_callbacks and ev_base
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    14
 */
85
75bc8b164ef8 async TCP connects,
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
    15
struct sock_stream_ctx {
75bc8b164ef8 async TCP connects,
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
    16
    /** libevent core */
9
4c4c906cc649 add sock_stream_callbacks and ev_base
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    17
    struct event_base *ev_base;
4c4c906cc649 add sock_stream_callbacks and ev_base
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    18
85
75bc8b164ef8 async TCP connects,
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
    19
};
75bc8b164ef8 async TCP connects,
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
    20
75bc8b164ef8 async TCP connects,
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
    21
/**
75bc8b164ef8 async TCP connects,
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
    22
 * Global sock_stream_ctx used for sock_init() and all sock_stream's
75bc8b164ef8 async TCP connects,
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
    23
 */
75bc8b164ef8 async TCP connects,
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
    24
extern struct sock_stream_ctx _sock_stream_ctx;
75bc8b164ef8 async TCP connects,
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
    25
75bc8b164ef8 async TCP connects,
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
    26
/**
75bc8b164ef8 async TCP connects,
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
    27
 * Socket implementation type methods
75bc8b164ef8 async TCP connects,
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
    28
 */
75bc8b164ef8 async TCP connects,
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
    29
struct sock_stream_methods {
75bc8b164ef8 async TCP connects,
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
    30
    /** As read(2) */
118
05b8d5150313 implement fifo (sock_fifo.c) and test_fifo
Tero Marttila <terom@fixme.fi>
parents: 85
diff changeset
    31
    err_t (*read) (struct sock_stream *sock, void *buf, size_t *len, struct error_info *err);
85
75bc8b164ef8 async TCP connects,
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
    32
75bc8b164ef8 async TCP connects,
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
    33
    /** As write(2) */
118
05b8d5150313 implement fifo (sock_fifo.c) and test_fifo
Tero Marttila <terom@fixme.fi>
parents: 85
diff changeset
    34
    err_t (*write) (struct sock_stream *sock, const void *buf, size_t *len, struct error_info *err);
85
75bc8b164ef8 async TCP connects,
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
    35
75bc8b164ef8 async TCP connects,
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
    36
    /** Initialize events. cb_info/cb_arg are already updated */
75bc8b164ef8 async TCP connects,
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
    37
    err_t (*event_init) (struct sock_stream *sock);
75bc8b164ef8 async TCP connects,
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
    38
75bc8b164ef8 async TCP connects,
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
    39
    /** Enable events as specified */
75bc8b164ef8 async TCP connects,
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
    40
    err_t (*event_enable) (struct sock_stream *sock, short mask);
75bc8b164ef8 async TCP connects,
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
    41
    
75bc8b164ef8 async TCP connects,
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
    42
    /** Release all resources and free the sock_stream */
75bc8b164ef8 async TCP connects,
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
    43
    void (*release) (struct sock_stream *sock);
139
55b9dcc2b73a implement sock_ssl_connect_async (the old sock_ssl_connect exists no more)
Tero Marttila <terom@fixme.fi>
parents: 118
diff changeset
    44
55b9dcc2b73a implement sock_ssl_connect_async (the old sock_ssl_connect exists no more)
Tero Marttila <terom@fixme.fi>
parents: 118
diff changeset
    45
    /** The type's connect_cb handler, defaults to just invoke conn_cb_func */
55b9dcc2b73a implement sock_ssl_connect_async (the old sock_ssl_connect exists no more)
Tero Marttila <terom@fixme.fi>
parents: 118
diff changeset
    46
    void (*_conn_cb) (struct sock_stream *sock, struct error_info *err);
85
75bc8b164ef8 async TCP connects,
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
    47
};
9
4c4c906cc649 add sock_stream_callbacks and ev_base
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    48
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: 12
diff changeset
    49
/**
1
cf0e1bb6bcab a fancy socket abstraction layer, with TCP, next, SSL. Also, .hgignore
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    50
 * The base type struct, which defines the method table.
cf0e1bb6bcab a fancy socket abstraction layer, with TCP, next, SSL. Also, .hgignore
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    51
 */
cf0e1bb6bcab a fancy socket abstraction layer, with TCP, next, SSL. Also, .hgignore
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    52
struct sock_stream_type {
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: 12
diff changeset
    53
    /** Method table */
85
75bc8b164ef8 async TCP connects,
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
    54
    struct sock_stream_methods methods;
1
cf0e1bb6bcab a fancy socket abstraction layer, with TCP, next, SSL. Also, .hgignore
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    55
};
cf0e1bb6bcab a fancy socket abstraction layer, with TCP, next, SSL. Also, .hgignore
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    56
85
75bc8b164ef8 async TCP connects,
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
    57
/**
1
cf0e1bb6bcab a fancy socket abstraction layer, with TCP, next, SSL. Also, .hgignore
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    58
 * The base sock_stream type, as used by the sock_stream_* functions.
cf0e1bb6bcab a fancy socket abstraction layer, with TCP, next, SSL. Also, .hgignore
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    59
 *
cf0e1bb6bcab a fancy socket abstraction layer, with TCP, next, SSL. Also, .hgignore
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    60
 * The specific implementations should embed this at the start of their type-specific struct, and then cast around
cf0e1bb6bcab a fancy socket abstraction layer, with TCP, next, SSL. Also, .hgignore
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    61
 * as appropriate.
cf0e1bb6bcab a fancy socket abstraction layer, with TCP, next, SSL. Also, .hgignore
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    62
 */
cf0e1bb6bcab a fancy socket abstraction layer, with TCP, next, SSL. Also, .hgignore
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    63
struct sock_stream {
85
75bc8b164ef8 async TCP connects,
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
    64
    /** The sock_stream_type for this socket */
1
cf0e1bb6bcab a fancy socket abstraction layer, with TCP, next, SSL. Also, .hgignore
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    65
    struct sock_stream_type *type;
3
cc94ae754e2a error handling magic
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    66
85
75bc8b164ef8 async TCP connects,
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
    67
    /** Last error info, XXX: remove this */
3
cc94ae754e2a error handling magic
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    68
    struct error_info err;
9
4c4c906cc649 add sock_stream_callbacks and ev_base
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    69
85
75bc8b164ef8 async TCP connects,
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
    70
    /** Callbacks */
9
4c4c906cc649 add sock_stream_callbacks and ev_base
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    71
    const struct sock_stream_callbacks *cb_info;
4c4c906cc649 add sock_stream_callbacks and ev_base
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    72
85
75bc8b164ef8 async TCP connects,
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
    73
    /** Callback arg */
9
4c4c906cc649 add sock_stream_callbacks and ev_base
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    74
    void *cb_arg;
85
75bc8b164ef8 async TCP connects,
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
    75
75bc8b164ef8 async TCP connects,
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
    76
    /** Connection callback function */
75bc8b164ef8 async TCP connects,
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
    77
    sock_stream_connect_cb conn_cb_func;
75bc8b164ef8 async TCP connects,
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
    78
75bc8b164ef8 async TCP connects,
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
    79
    /** Connection callback context argument */
75bc8b164ef8 async TCP connects,
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
    80
    void *conn_cb_arg;
1
cf0e1bb6bcab a fancy socket abstraction layer, with TCP, next, SSL. Also, .hgignore
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    81
};
cf0e1bb6bcab a fancy socket abstraction layer, with TCP, next, SSL. Also, .hgignore
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    82
85
75bc8b164ef8 async TCP connects,
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
    83
/**
75bc8b164ef8 async TCP connects,
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
    84
 * Convert a `struct sock_stream*` to the given type.
75bc8b164ef8 async TCP connects,
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
    85
 */
1
cf0e1bb6bcab a fancy socket abstraction layer, with TCP, next, SSL. Also, .hgignore
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    86
#define SOCK_FROM_BASE(sock, type) ((type*) sock)
85
75bc8b164ef8 async TCP connects,
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
    87
75bc8b164ef8 async TCP connects,
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
    88
/**
75bc8b164ef8 async TCP connects,
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
    89
 * Get a pointer to the sock_stream's error_info field.
75bc8b164ef8 async TCP connects,
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
    90
 */
4
a3ca0f97a075 change ERROR_* to use pointers again, and implement error_info for sock_init
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
    91
#define SOCK_ERR(sock) (&(sock)->err)
3
cc94ae754e2a error handling magic
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    92
85
75bc8b164ef8 async TCP connects,
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
    93
/**
3
cc94ae754e2a error handling magic
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    94
 * Initialize a sock_stream with the given sock_stream_type.
cc94ae754e2a error handling magic
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    95
 *
cc94ae754e2a error handling magic
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    96
 * The sock_stream should be initialized to zero. It is a bug to call this twice.
85
75bc8b164ef8 async TCP connects,
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
    97
 *
75bc8b164ef8 async TCP connects,
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
    98
 * @param sock the new sock_stream
75bc8b164ef8 async TCP connects,
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
    99
 * @param type the sock_stream_type defining the implementation used
139
55b9dcc2b73a implement sock_ssl_connect_async (the old sock_ssl_connect exists no more)
Tero Marttila <terom@fixme.fi>
parents: 118
diff changeset
   100
 * @param cb_func the optional connect_async callback function
55b9dcc2b73a implement sock_ssl_connect_async (the old sock_ssl_connect exists no more)
Tero Marttila <terom@fixme.fi>
parents: 118
diff changeset
   101
 * @param cb_arg the optional context argument for cb_func
3
cc94ae754e2a error handling magic
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   102
 */
139
55b9dcc2b73a implement sock_ssl_connect_async (the old sock_ssl_connect exists no more)
Tero Marttila <terom@fixme.fi>
parents: 118
diff changeset
   103
void sock_stream_init (struct sock_stream *sock, struct sock_stream_type *type, sock_stream_connect_cb cb_func, void *cb_arg);
1
cf0e1bb6bcab a fancy socket abstraction layer, with TCP, next, SSL. Also, .hgignore
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   104
85
75bc8b164ef8 async TCP connects,
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
   105
/**
12
4147fae232d9 update sock_stream_read/write semantics for EOF/EAGAIN, tentative event-based gnutls code
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   106
 * Invoke the appropriate callbacks for the given EV_* bitmask.
85
75bc8b164ef8 async TCP connects,
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
   107
 *
75bc8b164ef8 async TCP connects,
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
   108
 * @param sock the sock_stream
75bc8b164ef8 async TCP connects,
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
   109
 * @param what combination of EV_* bits describing what callbacks to invoke
12
4147fae232d9 update sock_stream_read/write semantics for EOF/EAGAIN, tentative event-based gnutls code
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   110
 */
4147fae232d9 update sock_stream_read/write semantics for EOF/EAGAIN, tentative event-based gnutls code
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   111
void sock_stream_invoke_callbacks (struct sock_stream *sock, short what);
4147fae232d9 update sock_stream_read/write semantics for EOF/EAGAIN, tentative event-based gnutls code
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   112
139
55b9dcc2b73a implement sock_ssl_connect_async (the old sock_ssl_connect exists no more)
Tero Marttila <terom@fixme.fi>
parents: 118
diff changeset
   113
/**
55b9dcc2b73a implement sock_ssl_connect_async (the old sock_ssl_connect exists no more)
Tero Marttila <terom@fixme.fi>
parents: 118
diff changeset
   114
 * Invoke the sock_stream_conn_cb callback with the given error param.
55b9dcc2b73a implement sock_ssl_connect_async (the old sock_ssl_connect exists no more)
Tero Marttila <terom@fixme.fi>
parents: 118
diff changeset
   115
 *
55b9dcc2b73a implement sock_ssl_connect_async (the old sock_ssl_connect exists no more)
Tero Marttila <terom@fixme.fi>
parents: 118
diff changeset
   116
 * This invokes the sock_stream_methods::_conn_cb if present and \a direct is not given, otherwise the callback directly
55b9dcc2b73a implement sock_ssl_connect_async (the old sock_ssl_connect exists no more)
Tero Marttila <terom@fixme.fi>
parents: 118
diff changeset
   117
 *
55b9dcc2b73a implement sock_ssl_connect_async (the old sock_ssl_connect exists no more)
Tero Marttila <terom@fixme.fi>
parents: 118
diff changeset
   118
 * @param direct force the conn_cb to be called directly
55b9dcc2b73a implement sock_ssl_connect_async (the old sock_ssl_connect exists no more)
Tero Marttila <terom@fixme.fi>
parents: 118
diff changeset
   119
 */
55b9dcc2b73a implement sock_ssl_connect_async (the old sock_ssl_connect exists no more)
Tero Marttila <terom@fixme.fi>
parents: 118
diff changeset
   120
void sock_stream_invoke_conn_cb (struct sock_stream *sock, struct error_info *err, bool direct);
55b9dcc2b73a implement sock_ssl_connect_async (the old sock_ssl_connect exists no more)
Tero Marttila <terom@fixme.fi>
parents: 118
diff changeset
   121
1
cf0e1bb6bcab a fancy socket abstraction layer, with TCP, next, SSL. Also, .hgignore
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   122
#endif /* SOCK_INTERNAL_H */