r4667: Don't follow a NULL pointer for an idle event handler.
[tprouty/samba.git] / source4 / smbd / service.h
1 /* 
2    Unix SMB/CIFS implementation.
3
4    SERVER SERVICE code
5
6    Copyright (C) Stefan (metze) Metzmacher      2004
7    
8    This program is free software; you can redistribute it and/or modify
9    it under the terms of the GNU General Public License as published by
10    the Free Software Foundation; either version 2 of the License, or
11    (at your option) any later version.
12    
13    This program is distributed in the hope that it will be useful,
14    but WITHOUT ANY WARRANTY; without even the implied warranty of
15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16    GNU General Public License for more details.
17    
18    You should have received a copy of the GNU General Public License
19    along with this program; if not, write to the Free Software
20    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21 */
22
23 #ifndef _SERVER_SERVICE_H
24 #define _SERVER_SERVICE_H
25
26 struct event_context;
27 struct model_ops;
28 struct server_context;
29
30 struct server_connection;
31 struct server_service;
32
33 /* modules can use the following to determine if the interface has changed
34  * please increment the version number after each interface change
35  * with a comment and maybe update struct process_model_critical_sizes.
36  */
37 /* version 1 - initial version - metze */
38 #define SERVER_SERVICE_VERSION 1
39
40 struct server_service_ops {
41         /* the name of the server_service */
42         const char *name;
43
44         /* called at startup when the server_service is selected */
45         void (*service_init)(struct server_service *service, const struct model_ops *ops);
46
47         /* function to accept new connection */
48         void (*accept_connection)(struct server_connection *);
49
50         void (*recv_handler)(struct server_connection *, struct timeval, uint16_t);
51
52         void (*send_handler)(struct server_connection *, struct timeval, uint16_t);
53
54         /* function to be called when the server is idle */
55         void (*idle_handler)(struct server_connection *, struct timeval);
56
57         /* function to close a connection */
58         void (*close_connection)(struct server_connection *, const char *reason);
59
60         /* function to exit server */
61         void (*service_exit)(struct server_service *srv_ctx, const char *reason);       
62 };
63
64 struct socket_context;
65
66 struct server_socket {
67         struct server_socket *next,*prev;
68         void *private_data;
69
70         struct {
71                 struct event_context *ctx;
72                 struct fd_event *fde;
73         } event;
74
75         struct socket_context *socket;
76
77         struct server_service *service;
78
79         struct server_connection *connection_list;
80 };
81
82 struct server_service {
83         struct server_service *next,*prev;
84         void *private_data;
85         const struct server_service_ops *ops;
86
87         const struct model_ops *model_ops;
88
89         struct server_socket *socket_list;
90
91         struct server_context *srv_ctx;
92 };
93
94 /* the concept of whether two operations are on the same server
95    connection or different connections is an important one in SMB, especially
96    for locking and share modes. We will use a servid_t to distinguish different
97    connections 
98
99    this means that (for example) a unique open file is distinguished by the triple
100    of 
101       servid_t server;
102       uint16   tid;
103       uint16   fnum;
104 */
105 typedef uint32_t servid_t;
106
107 struct server_connection {
108         struct server_connection *next,*prev;
109         void *private_data;
110
111         struct {
112                 struct event_context *ctx;
113                 struct fd_event *fde;
114                 struct timed_event *idle;
115                 struct timeval idle_time;
116         } event;
117
118         servid_t server_id;
119
120         struct socket_context *socket;
121
122         struct server_socket *server_socket;
123
124         struct server_service *service;
125
126         struct messaging_context *messaging_ctx;
127 };
128
129 #endif /* _SERVER_SERVICE_H */