Modifying the return value of cfg_set* functions, in order to make
[sip-router] / tls_hooks.h
1 /*
2  * $Id$
3  *
4  * Copyright (C) 2007 iptelorg GmbH 
5  *
6  * Permission to use, copy, modify, and distribute this software for any
7  * purpose with or without fee is hereby granted, provided that the above
8  * copyright notice and this permission notice appear in all copies.
9  *
10  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17  */
18 /*
19  * tls hooks for modules
20  *
21  * History:
22  * --------
23  *  2007-02-09  created by andrei
24  */
25
26 #ifndef _tls_hooks_h
27 #define _tls_hooks_h
28
29 #ifdef TLS_HOOKS
30
31 #ifndef USE_TLS
32 #error "USE_TLS required and not defined (please compile with make \
33         TLS_HOOKS=1)"
34 #endif
35
36 #ifdef CORE_TLS
37 #error "Conflict: CORE_TLS and TLS_HOOKS cannot be defined in the same time"
38 #endif
39
40 #include "tcp_conn.h"
41
42
43
44 struct tls_hooks{
45         int  (*read)(struct tcp_connection* c);
46         int (*blocking_write)(struct tcp_connection* c, int fd, const char* buf,
47                                                         unsigned int len);
48         int  (*on_tcpconn_init)(struct tcp_connection *c, int sock);
49         void (*tcpconn_clean)(struct tcp_connection* c);
50         void (*tcpconn_close)(struct tcp_connection*c , int fd);
51         /* checks if a tls connection is fully established before a read, and if 
52          * not it runs tls_accept() or tls_connect() as needed
53          * (tls_accept and tls_connect are deferred to the "reader" process for
54          *  performance reasons) */
55         int (*fix_read_con)(struct tcp_connection* c);
56         
57         /* per listening socket init, called on ser startup (after modules,
58          *  process table, init() and udp socket initialization)*/
59         int (*init_si)(struct socket_info* si);
60         /* generic init function (called at ser init, after module initialization
61          *  and process table creation)*/
62         int (*init)();
63         /* destroy function, called after the modules are destroyed, and 
64          * after  destroy_tcp() */
65         void (*destroy)();
66 };
67
68
69 struct tls_hooks tls_hook;
70
71 #ifdef __SUNPRO_C
72         #define tls_hook_call(name, ret_not_set, ...) \
73                 ((tls_hook.name)?(tls_hook.name(__VA_ARGS__)): (ret_not_set))
74         #define tls_hook_call_v(name, __VA_ARGS__) \
75                 do{ \
76                         if (tls_hook.name) tls_hook.name(__VA_ARGS__); \
77                 }while(0)
78 #else
79         #define tls_hook_call(name, ret_not_set, args...) \
80                 ((tls_hook.name)?(tls_hook.name(args)): (ret_not_set))
81         #define tls_hook_call_v(name, args...) \
82                 do{ \
83                         if (tls_hook.name) tls_hook.name(args); \
84                 }while(0)
85 #endif
86
87 /* hooks */
88
89 #define tls_tcpconn_init(c, s)  tls_hook_call(on_tcpconn_init, 0, (c), (s))
90 #define tls_tcpconn_clean(c)    tls_hook_call_v(tcpconn_clean, (c))
91 #define tls_blocking_write(c, fd, buf, len) \
92         tls_hook_call(blocking_write, -1, (c), (fd), (buf), (len))
93 #define tls_close(conn, fd)             tls_hook_call_v(tcpconn_close, (conn), (fd))
94 #define tls_read(c)                             tls_hook_call(read, -1, (c))
95 #define tls_fix_read_conn(c)    tls_hook_call(fix_read_con, -1, (c))
96
97 int register_tls_hooks(struct tls_hooks* h);
98
99 #endif /* TLS_HOOKS */
100 #endif