src/sock_internal.h
author Tero Marttila <terom@fixme.fi>
Tue, 31 Mar 2009 22:09:53 +0300
changeset 98 f357f835f0d5
parent 85 75bc8b164ef8
child 118 05b8d5150313
permissions -rw-r--r--
add irc_client_defaults to apply default values for irc_client_add_net irc_net_info, implement --defaults cmd opt and lua_client_connect
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"
cf0e1bb6bcab a fancy socket abstraction layer, with TCP, next, SSL. Also, .hgignore
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    10
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
    11
/**
85
75bc8b164ef8 async TCP connects,
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
    12
 * 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
    13
 */
85
75bc8b164ef8 async TCP connects,
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
    14
struct sock_stream_ctx {
75bc8b164ef8 async TCP connects,
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
    15
    /** libevent core */
9
4c4c906cc649 add sock_stream_callbacks and ev_base
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    16
    struct event_base *ev_base;
4c4c906cc649 add sock_stream_callbacks and ev_base
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    17
85
75bc8b164ef8 async TCP connects,
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
    18
};
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
 * 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
    22
 */
75bc8b164ef8 async TCP connects,
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
    23
extern struct sock_stream_ctx _sock_stream_ctx;
75bc8b164ef8 async TCP connects,
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
    24
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
 * Socket implementation type methods
75bc8b164ef8 async TCP connects,
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
    27
 */
75bc8b164ef8 async TCP connects,
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
    28
struct sock_stream_methods {
75bc8b164ef8 async TCP connects,
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
    29
    /** As read(2) */
75bc8b164ef8 async TCP connects,
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
    30
    err_t (*read) (struct sock_stream *sock, void *buf, size_t *len);
75bc8b164ef8 async TCP connects,
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
    31
75bc8b164ef8 async TCP connects,
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
    32
    /** As write(2) */
75bc8b164ef8 async TCP connects,
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
    33
    err_t (*write) (struct sock_stream *sock, const void *buf, size_t *len);
75bc8b164ef8 async TCP connects,
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
    34
75bc8b164ef8 async TCP connects,
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
    35
    /** Initialize events. cb_info/cb_arg are already updated */
75bc8b164ef8 async TCP connects,
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
    36
    err_t (*event_init) (struct sock_stream *sock);
75bc8b164ef8 async TCP connects,
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
    37
75bc8b164ef8 async TCP connects,
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
    38
    /** Enable events as specified */
75bc8b164ef8 async TCP connects,
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
    39
    err_t (*event_enable) (struct sock_stream *sock, short mask);
75bc8b164ef8 async TCP connects,
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
    40
    
75bc8b164ef8 async TCP connects,
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
    41
    /** Release all resources and free the sock_stream */
75bc8b164ef8 async TCP connects,
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
    42
    void (*release) (struct sock_stream *sock);
75bc8b164ef8 async TCP connects,
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
    43
};
9
4c4c906cc649 add sock_stream_callbacks and ev_base
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    44
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
    45
/**
1
cf0e1bb6bcab a fancy socket abstraction layer, with TCP, next, SSL. Also, .hgignore
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    46
 * 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
    47
 */
cf0e1bb6bcab a fancy socket abstraction layer, with TCP, next, SSL. Also, .hgignore
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    48
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
    49
    /** Method table */
85
75bc8b164ef8 async TCP connects,
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
    50
    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
    51
};
cf0e1bb6bcab a fancy socket abstraction layer, with TCP, next, SSL. Also, .hgignore
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    52
85
75bc8b164ef8 async TCP connects,
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
    53
/**
1
cf0e1bb6bcab a fancy socket abstraction layer, with TCP, next, SSL. Also, .hgignore
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    54
 * 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
    55
 *
cf0e1bb6bcab a fancy socket abstraction layer, with TCP, next, SSL. Also, .hgignore
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    56
 * 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
    57
 * as appropriate.
cf0e1bb6bcab a fancy socket abstraction layer, with TCP, next, SSL. Also, .hgignore
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    58
 */
cf0e1bb6bcab a fancy socket abstraction layer, with TCP, next, SSL. Also, .hgignore
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    59
struct sock_stream {
85
75bc8b164ef8 async TCP connects,
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
    60
    /** 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
    61
    struct sock_stream_type *type;
3
cc94ae754e2a error handling magic
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    62
85
75bc8b164ef8 async TCP connects,
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
    63
    /** Last error info, XXX: remove this */
3
cc94ae754e2a error handling magic
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    64
    struct error_info err;
9
4c4c906cc649 add sock_stream_callbacks and ev_base
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    65
85
75bc8b164ef8 async TCP connects,
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
    66
    /** Callbacks */
9
4c4c906cc649 add sock_stream_callbacks and ev_base
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    67
    const struct sock_stream_callbacks *cb_info;
4c4c906cc649 add sock_stream_callbacks and ev_base
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    68
85
75bc8b164ef8 async TCP connects,
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
    69
    /** Callback arg */
9
4c4c906cc649 add sock_stream_callbacks and ev_base
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    70
    void *cb_arg;
85
75bc8b164ef8 async TCP connects,
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
    71
75bc8b164ef8 async TCP connects,
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
    72
    /** Connection callback function */
75bc8b164ef8 async TCP connects,
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
    73
    sock_stream_connect_cb conn_cb_func;
75bc8b164ef8 async TCP connects,
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
    74
75bc8b164ef8 async TCP connects,
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
    75
    /** Connection callback context argument */
75bc8b164ef8 async TCP connects,
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
    76
    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
    77
};
cf0e1bb6bcab a fancy socket abstraction layer, with TCP, next, SSL. Also, .hgignore
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    78
85
75bc8b164ef8 async TCP connects,
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
    79
/**
75bc8b164ef8 async TCP connects,
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
    80
 * Convert a `struct sock_stream*` to the given type.
75bc8b164ef8 async TCP connects,
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
    81
 */
1
cf0e1bb6bcab a fancy socket abstraction layer, with TCP, next, SSL. Also, .hgignore
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    82
#define SOCK_FROM_BASE(sock, type) ((type*) sock)
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
/**
75bc8b164ef8 async TCP connects,
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
    85
 * Get a pointer to the sock_stream's error_info field.
75bc8b164ef8 async TCP connects,
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
    86
 */
4
a3ca0f97a075 change ERROR_* to use pointers again, and implement error_info for sock_init
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
    87
#define SOCK_ERR(sock) (&(sock)->err)
3
cc94ae754e2a error handling magic
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    88
85
75bc8b164ef8 async TCP connects,
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
    89
/**
3
cc94ae754e2a error handling magic
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    90
 * Initialize a sock_stream with the given sock_stream_type.
cc94ae754e2a error handling magic
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    91
 *
cc94ae754e2a error handling magic
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    92
 * 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
    93
 *
75bc8b164ef8 async TCP connects,
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
    94
 * @param sock the new sock_stream
75bc8b164ef8 async TCP connects,
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
    95
 * @param type the sock_stream_type defining the implementation used
3
cc94ae754e2a error handling magic
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    96
 */
cc94ae754e2a error handling magic
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    97
void sock_stream_init (struct sock_stream *sock, struct sock_stream_type *type);
1
cf0e1bb6bcab a fancy socket abstraction layer, with TCP, next, SSL. Also, .hgignore
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    98
85
75bc8b164ef8 async TCP connects,
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
    99
/**
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
   100
 * Invoke the appropriate callbacks for the given EV_* bitmask.
85
75bc8b164ef8 async TCP connects,
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
   101
 *
75bc8b164ef8 async TCP connects,
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
   102
 * @param sock the sock_stream
75bc8b164ef8 async TCP connects,
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
   103
 * @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
   104
 */
4147fae232d9 update sock_stream_read/write semantics for EOF/EAGAIN, tentative event-based gnutls code
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   105
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
   106
1
cf0e1bb6bcab a fancy socket abstraction layer, with TCP, next, SSL. Also, .hgignore
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   107
#endif /* SOCK_INTERNAL_H */