- Spelling checked
[sip-router] / sr_module.h
1 /* $Id$
2  *
3  * modules/plug-in structures declarations
4  *
5  *
6  * Copyright (C) 2001-2003 FhG Fokus
7  *
8  * This file is part of ser, a free SIP server.
9  *
10  * ser is free software; you can redistribute it and/or modify
11  * it under the terms of the GNU General Public License as published by
12  * the Free Software Foundation; either version 2 of the License, or
13  * (at your option) any later version
14  *
15  * For a license to use the ser software under conditions
16  * other than those described here, or to purchase support for this
17  * software, please contact iptel.org by e-mail at the following addresses:
18  *    info@iptel.org
19  *
20  * ser is distributed in the hope that it will be useful,
21  * but WITHOUT ANY WARRANTY; without even the implied warranty of
22  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
23  * GNU General Public License for more details.
24  *
25  * You should have received a copy of the GNU General Public License 
26  * along with this program; if not, write to the Free Software 
27  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
28  */
29 /*
30  * History:
31  * --------
32  *  2003-03-10  changed module exports interface: added struct cmd_export
33  *               and param_export (andrei)
34  *  2003-03-16  Added flags field to cmd_export_ (janakj)
35  *  2003-04-05  s/reply_route/failure_route, onreply_route introduced (jiri)
36  *  2004-03-12  extra flag USE_FUNC_PARAM added to modparam type -
37  *              instead of copying the param value, a func is called (bogdan)
38  */
39
40
41 #ifndef sr_module_h
42 #define sr_module_h
43
44 #include "parser/msg_parser.h" /* for sip_msg */
45
46 typedef  struct module_exports* (*module_register)();
47 typedef  int (*cmd_function)(struct sip_msg*, char*, char*);
48 typedef  int (*fixup_function)(void** param, int param_no);
49 typedef  int (*response_function)(struct sip_msg*);
50 typedef  void (*onbreak_function)(struct sip_msg*);
51 typedef void (*destroy_function)();
52 typedef int (*init_function)(void);
53 typedef int (*child_init_function)(int rank);
54
55
56 #define STR_PARAM        (1<<0)  /* String parameter type */
57 #define INT_PARAM        (1<<1)  /* Integer parameter type */
58 #define USE_FUNC_PARAM   (1<<(8*sizeof(int)-1))
59 #define PARAM_TYPE_MASK(_x)   ((_x)&(~USE_FUNC_PARAM))
60
61 typedef int modparam_t;
62
63 typedef union {
64         int integer;
65         char *string;
66 } param_func_param_t;
67
68 typedef int (*param_func_t)( modparam_t type, param_func_param_t param_val);
69
70 #define REQUEST_ROUTE 1  /* Function can be used in request route blocks */
71 #define FAILURE_ROUTE 2  /* Function can be used in reply route blocks */
72 #define ONREPLY_ROUTE 4  /* Function can be used in on_reply */
73
74 /* Macros - used as rank in child_init function */
75 #define PROC_MAIN      0  /* Main ser process */
76 #define PROC_TIMER    -1  /* Timer attendant process */
77 #define PROC_FIFO     -2  /* FIFO attendant process */
78 #define PROC_TCP_MAIN -4  /* TCP main process */
79 #define PROC_UNIXSOCK -5  /* Unix domain socket server processes */
80
81 #define MODULE_VERSION char *module_version=VERSION;
82
83 struct cmd_export_ {
84         char* name;             /* null terminated command name */
85         cmd_function function;  /* pointer to the corresponding function */
86         int param_no;           /* number of parameters used by the function */
87         fixup_function fixup;   /* pointer to the function called to "fix" the
88                                                            parameters */
89         int flags;              /* Function flags */
90 };
91
92
93 struct param_export_ {
94         char* name;             /* null terminated param. name */
95         modparam_t type;        /* param. type */
96         void* param_pointer;    /* pointer to the param. memory location */
97 };
98
99
100 typedef struct cmd_export_ cmd_export_t;
101 typedef struct param_export_ param_export_t;
102
103 struct module_exports{
104         char* name;                     /* null terminated module name */
105         
106         cmd_export_t* cmds;             /* null terminated array of the exported
107                                                                            commands */
108         param_export_t* params;         /* null terminated array of the exported
109                                                                            module parameters */
110
111         init_function init_f;           /* Initialization function */
112         response_function response_f;   /* function used for responses,
113                                                                            returns yes or no; can be null */
114         destroy_function destroy_f;     /* function called when the module should
115                                                                            be "destroyed", e.g: on ser exit;
116                                                                            can be null */
117         onbreak_function onbreak_f;
118         child_init_function init_child_f;  /* function called by all processes
119                                                                                   after the fork */
120 };
121
122
123
124
125
126 struct sr_module{
127         char* path;
128         void* handle;
129         struct module_exports* exports;
130         struct sr_module* next;
131 };
132
133
134 struct sr_module* modules; /* global module list*/
135
136 int register_builtin_modules();
137 int register_module(struct module_exports*, char*,  void*);
138 int load_module(char* path);
139 cmd_function find_export(char* name, int param_no, int flags);
140 cmd_function find_mod_export(char* mod, char* name, int param_no, int flags);
141 struct sr_module* find_module(void *f, cmd_export_t** cmd);
142 void destroy_modules();
143 int init_child(int rank);
144 int init_modules(void);
145
146 /*
147  * Find a parameter with given type and return it's
148  * address in memory
149  * If there is no such parameter, NULL is returned
150  */
151 void* find_param_export(char* mod, char* name, modparam_t type);
152
153 /* modules function prototypes:
154  * struct module_exports* mod_register(); (type module_register)
155  * int   foo_cmd(struct sip_msg* msg, char* param);
156  *  - returns >0 if ok , <0 on error, 0 to stop processing (==DROP)
157  * int   response_f(struct sip_msg* msg)
158  *  - returns >0 if ok, 0 to drop message
159  */
160
161
162 #endif