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