]> sourceware.org Git - newlib-cygwin.git/blob - winsup/cygwin/cygserver.h
* Merge in cygwin-64bit-branch.
[newlib-cygwin.git] / winsup / cygwin / cygserver.h
1 /* cygserver.h
2
3 Copyright 2001, 2002, 2003, 2004, 2008, 2012, 2013 Red Hat Inc.
4
5 Written by Egor Duda <deo@logos-m.ru>
6
7 This file is part of Cygwin.
8
9 This software is a copyrighted work licensed under the terms of the
10 Cygwin license. Please consult the file "CYGWIN_LICENSE" for
11 details. */
12
13 #ifndef _CYGSERVER_H_
14 #define _CYGSERVER_H_
15
16 #ifdef __GNUC__
17 #define CYGSERVER_PACKED __attribute__ ((packed))
18 #else
19 #define CYGSERVER_PACKED
20 #endif
21
22 #define CYGWIN_SERVER_VERSION_MAJOR 1
23 #define CYGWIN_SERVER_VERSION_API 4
24 #define CYGWIN_SERVER_VERSION_MINOR 0
25 #define CYGWIN_SERVER_VERSION_PATCH 0
26
27 typedef enum {
28 CYGSERVER_UNKNOWN = 0,
29 CYGSERVER_OK,
30 CYGSERVER_UNAVAIL
31 } cygserver_states;
32
33 /*---------------------------------------------------------------------------*
34 * class client_request
35 *---------------------------------------------------------------------------*/
36
37 class transport_layer_base;
38
39 #ifndef __INSIDE_CYGWIN__
40 class process_cache;
41 #endif
42
43 class client_request
44 {
45 protected:
46 typedef enum {
47 CYGSERVER_REQUEST_INVALID,
48 CYGSERVER_REQUEST_GET_VERSION,
49 CYGSERVER_REQUEST_SHUTDOWN,
50 CYGSERVER_REQUEST_ATTACH_TTY,
51 CYGSERVER_REQUEST_MSG,
52 CYGSERVER_REQUEST_SEM,
53 CYGSERVER_REQUEST_SHM,
54 CYGSERVER_REQUEST_SETPWD,
55 CYGSERVER_REQUEST_LAST
56 } request_code_t;
57
58 struct header_t
59 {
60 size_t msglen;
61 union
62 {
63 request_code_t request_code;
64 int error_code;
65 };
66
67 header_t () {};
68 header_t (request_code_t, size_t);
69 } CYGSERVER_PACKED;
70
71 public:
72 #ifndef __INSIDE_CYGWIN__
73 static void handle_request (transport_layer_base *, process_cache *);
74 #endif
75
76 client_request (request_code_t request_code,
77 void *buf = NULL,
78 size_t bufsiz = 0);
79 virtual ~client_request ();
80
81 request_code_t request_code () const { return _header.request_code; }
82
83 int error_code () const { return _header.error_code; };
84 void error_code (int error_code) { _header.error_code = error_code; };
85
86 size_t msglen () const { return _header.msglen; };
87 void msglen (size_t len) { _header.msglen = len; };
88
89 int make_request ();
90
91 protected:
92 virtual void send (transport_layer_base *);
93
94 private:
95 header_t _header;
96 void * const _buf;
97 const size_t _buflen;
98
99 #ifndef __INSIDE_CYGWIN__
100 void handle (transport_layer_base *, process_cache *);
101 virtual void serve (transport_layer_base *, process_cache *) = 0;
102 #endif
103 };
104
105 /*---------------------------------------------------------------------------*
106 * class client_request_get_version
107 *---------------------------------------------------------------------------*/
108
109 class client_request_get_version : public client_request
110 {
111 private:
112 struct request_get_version
113 {
114 DWORD major, api, minor, patch;
115 } CYGSERVER_PACKED;
116
117 public:
118 client_request_get_version ();
119 bool check_version () const;
120
121 private:
122 struct request_get_version version;
123
124 #ifndef __INSIDE_CYGWIN__
125 virtual void serve (transport_layer_base *, process_cache *);
126 #endif
127 };
128
129 /*---------------------------------------------------------------------------*
130 * class client_request_shutdown
131 *
132 * Nb. This whole class is only !__INSIDE_CYGWIN__ since it is used
133 * solely by cygserver itself.
134 *---------------------------------------------------------------------------*/
135
136 #ifndef __INSIDE_CYGWIN__
137
138 class client_request_shutdown : public client_request
139 {
140 public:
141 client_request_shutdown ();
142
143 private:
144 virtual void serve (transport_layer_base *, process_cache *);
145 };
146
147 #endif /* !__INSIDE_CYGWIN__ */
148
149 /*---------------------------------------------------------------------------*
150 * class client_request_attach_tty
151 *---------------------------------------------------------------------------*/
152
153 class client_request_attach_tty : public client_request
154 {
155 private:
156 struct request_attach_tty
157 {
158 DWORD pid, master_pid;
159 HANDLE from_master, to_master;
160 } CYGSERVER_PACKED;
161
162 public:
163 #ifdef __INSIDE_CYGWIN__
164 client_request_attach_tty (DWORD nmaster_pid,
165 HANDLE nfrom_master, HANDLE nto_master);
166 #else
167 client_request_attach_tty ();
168 #endif
169
170 HANDLE from_master () const { return req.from_master; };
171 HANDLE to_master () const { return req.to_master; };
172
173 protected:
174 virtual void send (transport_layer_base *);
175
176 private:
177 struct request_attach_tty req;
178
179 #ifndef __INSIDE_CYGWIN__
180 virtual void serve (transport_layer_base *, process_cache *);
181 #endif
182 };
183
184 #ifndef __INSIDE_CYGWIN__
185 extern PSID admininstrator_group_sid;
186 #endif
187
188 extern bool check_cygserver_available ();
189 extern void cygserver_init ();
190
191 #endif /* _CYGSERVER_H_ */
This page took 0.043009 seconds and 5 git commands to generate.