OSDN Git Service

Initial checkin of text Corinna sent to cygwin-announce.
[pf3gnuchains/pf3gnuchains4x.git] / winsup / cygwin / cygserver.h
1 /* cygserver.h
2
3    Copyright 2001, 2002, 2003, 2004, 2008 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       ssize_t 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   ssize_t error_code () const { return _header.error_code; };
84   void error_code (ssize_t 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_ */