summaryrefslogtreecommitdiff
path: root/source4/smbd/service.h
blob: d5335b1cef68309d2bf3ed6faacfb6e3311fdfe9 (plain)
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
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
/* 
   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);	
};

struct server_stream_socket;

struct server_stream_ops {
	/* the name of the server_service */
	const char *name;

	/* called at startup when the server_service is selected */
	void (*socket_init)(struct server_stream_socket *socket);

	/* function to accept new connection */
	void (*accept_connection)(struct server_connection *);

	void (*recv_handler)(struct server_connection *, struct timeval, uint16_t);

	void (*send_handler)(struct server_connection *, struct timeval, uint16_t);

	/* function to be called when the server is idle */
	void (*idle_handler)(struct server_connection *, struct timeval);

	/* function to close a connection */
	void (*close_connection)(struct server_connection *, const char *reason);
};

struct socket_context;

struct server_stream_socket {
	struct server_stream_socket *next,*prev;
	struct {
		const struct server_stream_ops *ops;
		void *private_data;
	} stream;

	struct {
		struct event_context *ctx;
		struct fd_event *fde;
	} event;

	struct socket_context *socket;

	struct server_service *service;
};

struct server_service {
	struct server_service *next,*prev;
	struct {
		const struct server_service_ops *ops;
		void *private_data;
	} service;

	struct server_context *server;
};

/* 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;
	struct {
		void *private_data;
		servid_t id;
	} connection;

	struct {
		struct event_context *ctx;
		struct fd_event *fde;
		struct timed_event *idle;
		struct timeval idle_time;
	} event;

	struct socket_context *socket;

	struct server_stream_socket *stream_socket;

	struct {
		struct messaging_context *ctx;
	} messaging;
};

struct server_task;

struct server_task_ops {
	/* the name of the server_task */
	const char *name;

	/* called at startup when the server_task is selected */
	void (*task_init)(struct server_task *task);
};

struct server_task {
	struct server_task *next,*prev;
	struct {
		const struct server_task_ops *ops;
		void *private_data;
		servid_t id;
	} task;

	struct {
		struct event_context *ctx;
	} event;

	struct {
		struct messaging_context *ctx;
	} messaging;

	struct server_service *service;
};

#endif /* _SERVER_SERVICE_H */