Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorConrad Scott <conrad.scott@dsl.pipex.com>2002-06-16 19:42:51 +0400
committerConrad Scott <conrad.scott@dsl.pipex.com>2002-06-16 19:42:51 +0400
commit13f76ab2f4d3e4f91485668062d6681c9fc8543a (patch)
tree7653352702b27b7fe7dbc0d6a994020f14131e16 /winsup/cygwin
parent0fda7719cf899fc816b72894268ba68a039cc0db (diff)
* include/cygwin/cygserver.h (client_request::send): Make
non-virtual. (class client_request_attach_tty): Put client- and server-specific interfaces inside #ifdef/#ifndef __INSIDE_CYGWIN__ guards. * cygserver_client.cc: Ditto. (cygserver_init): Fix error handling.
Diffstat (limited to 'winsup/cygwin')
-rw-r--r--winsup/cygwin/ChangeLog9
-rwxr-xr-xwinsup/cygwin/cygserver_client.cc75
-rwxr-xr-xwinsup/cygwin/include/cygwin/cygserver.h25
3 files changed, 70 insertions, 39 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog
index 93798e816..34040b93b 100644
--- a/winsup/cygwin/ChangeLog
+++ b/winsup/cygwin/ChangeLog
@@ -1,5 +1,14 @@
2002-06-16 Conrad Scott <conrad.scott@dsl.pipex.com>
+ * include/cygwin/cygserver.h (client_request::send): Make
+ non-virtual.
+ (class client_request_attach_tty): Put client- and server-specific
+ interfaces inside #ifdef/#ifndef __INSIDE_CYGWIN__ guards.
+ * cygserver_client.cc: Ditto.
+ (cygserver_init): Fix error handling.
+
+2002-06-16 Conrad Scott <conrad.scott@dsl.pipex.com>
+
* cygserver.cc: Throughout the code, check and correct level of
the XXX_printf() functions used. Comment out several of the
debug_printf() calls with "// verbose:". Reformat and correct
diff --git a/winsup/cygwin/cygserver_client.cc b/winsup/cygwin/cygserver_client.cc
index 770825d09..bd34d66a3 100755
--- a/winsup/cygwin/cygserver_client.cc
+++ b/winsup/cygwin/cygserver_client.cc
@@ -36,6 +36,8 @@ client_request_get_version::client_request_get_version () : client_request (CYGS
buffer = (char *)&version;
}
+#ifndef __INSIDE_CYGWIN__
+
client_request_attach_tty::client_request_attach_tty () : client_request (CYGSERVER_REQUEST_ATTACH_TTY, sizeof (req))
{
buffer = (char *)&req;
@@ -45,6 +47,8 @@ client_request_attach_tty::client_request_attach_tty () : client_request (CYGSER
req.to_master = NULL;
}
+#else /* __INSIDE_CYGWIN__ */
+
client_request_attach_tty::client_request_attach_tty (DWORD npid, DWORD nmaster_pid, HANDLE nfrom_master, HANDLE nto_master) : client_request (CYGSERVER_REQUEST_ATTACH_TTY, sizeof (req))
{
buffer = (char *)&req;
@@ -54,6 +58,8 @@ client_request_attach_tty::client_request_attach_tty (DWORD npid, DWORD nmaster_
req.to_master = nto_master;
}
+#endif /* __INSIDE_CYGWIN__ */
+
client_request_shutdown::client_request_shutdown () : client_request (CYGSERVER_REQUEST_SHUTDOWN, 0)
{
buffer = NULL;
@@ -102,6 +108,8 @@ client_request::send (transport_layer_base *conn)
debug_printf ("completed ok");
}
+#ifdef __INSIDE_CYGWIN__
+
/* Oh, BTW: Fix the procedural basis and make this more intuitive. */
int
@@ -165,38 +173,51 @@ check_cygserver_available ()
void
cygserver_init ()
{
- int rc;
- if (allow_daemon != TRUE)
+ if (!allow_daemon)
{
cygserver_running = CYGSERVER_DEAD;
return;
}
- if (cygserver_running==CYGSERVER_OK)
+ if (cygserver_running == CYGSERVER_OK)
return;
- client_request_get_version *req =
- new client_request_get_version ();
-
- rc = cygserver_request (req);
- delete req;
- if (rc < 0)
- cygserver_running = CYGSERVER_DEAD;
- else if (rc > 0)
- api_fatal ("error connecting to cygwin server. error: %d", rc);
- else if (req->version.major != CYGWIN_SERVER_VERSION_MAJOR ||
- req->version.api != CYGWIN_SERVER_VERSION_API ||
- req->version.minor > CYGWIN_SERVER_VERSION_MINOR)
- api_fatal ("incompatible version of cygwin server.\
- client version %d.%d.%d.%d, server version%ld.%ld.%ld.%ld",
- CYGWIN_SERVER_VERSION_MAJOR,
- CYGWIN_SERVER_VERSION_API,
- CYGWIN_SERVER_VERSION_MINOR,
- CYGWIN_SERVER_VERSION_PATCH,
- req->version.major,
- req->version.api,
- req->version.minor,
- req->version.patch);
- else
- cygserver_running = CYGSERVER_OK;
+ client_request_get_version req;
+
+ // This indicates that we failed to connect to cygserver at all but
+ // that's fine as cygwin doesn't need it to be running.
+ if (cygserver_request (&req) == -1)
+ {
+ cygserver_running = CYGSERVER_DEAD;
+ return;
+ }
+
+ // We connected to the server but something went wrong after that
+ // (sending the message, cygserver itself, or receiving the reply).
+ if (req.header.error_code != 0)
+ {
+ cygserver_running = CYGSERVER_DEAD;
+ debug_printf ("failure in cygserver version request: %d",
+ req.header.error_code);
+ debug_printf ("process will continue without cygserver support");
+ return;
+ }
+
+ if (req.version.major != CYGWIN_SERVER_VERSION_MAJOR ||
+ req.version.api != CYGWIN_SERVER_VERSION_API ||
+ req.version.minor > CYGWIN_SERVER_VERSION_MINOR)
+ api_fatal ("incompatible version of cygwin server:\n"
+ "client version %d.%d.%d.%d, server version %ld.%ld.%ld.%ld",
+ CYGWIN_SERVER_VERSION_MAJOR,
+ CYGWIN_SERVER_VERSION_API,
+ CYGWIN_SERVER_VERSION_MINOR,
+ CYGWIN_SERVER_VERSION_PATCH,
+ req.version.major,
+ req.version.api,
+ req.version.minor,
+ req.version.patch);
+
+ cygserver_running = CYGSERVER_OK;
}
+
+#endif /* __INSIDE_CYGWIN__ */
diff --git a/winsup/cygwin/include/cygwin/cygserver.h b/winsup/cygwin/include/cygwin/cygserver.h
index c7a04929f..de4e04b0e 100755
--- a/winsup/cygwin/include/cygwin/cygserver.h
+++ b/winsup/cygwin/include/cygwin/cygserver.h
@@ -38,11 +38,11 @@ typedef enum {
class request_header
{
- public:
- ssize_t cb;
- cygserver_request_code req_id;
- ssize_t error_code;
- request_header (cygserver_request_code id, ssize_t ncb) : cb (ncb), req_id (id), error_code (0) {} ;
+public:
+ ssize_t cb;
+ cygserver_request_code req_id;
+ ssize_t error_code;
+ request_header (cygserver_request_code id, ssize_t ncb) : cb (ncb), req_id (id), error_code (0) {} ;
}
#ifdef __GNUC__
__attribute__ ((packed))
@@ -85,9 +85,9 @@ struct request_attach_tty
class client_request
{
- public:
+public:
client_request (cygserver_request_code id, ssize_t data_size);
- virtual void send (transport_layer_base *conn);
+ void send (transport_layer_base *conn);
#ifndef __INSIDE_CYGWIN__
virtual void serve (transport_layer_base *conn, class process_cache *cache);
#endif
@@ -100,7 +100,7 @@ class client_request
class client_request_get_version : public client_request
{
- public:
+public:
#ifndef __INSIDE_CYGWIN__
virtual void serve (transport_layer_base *conn, class process_cache *cache);
#endif
@@ -110,7 +110,7 @@ class client_request_get_version : public client_request
class client_request_shutdown : public client_request
{
- public:
+public:
#ifndef __INSIDE_CYGWIN__
virtual void serve (transport_layer_base *conn, class process_cache *cache);
#endif
@@ -119,12 +119,13 @@ class client_request_shutdown : public client_request
class client_request_attach_tty : public client_request
{
- public:
+public:
#ifndef __INSIDE_CYGWIN__
virtual void serve (transport_layer_base *conn, class process_cache *cache);
-#endif
client_request_attach_tty ();
+#else
client_request_attach_tty (DWORD npid, DWORD nmaster_pid, HANDLE nfrom_master, HANDLE nto_master);
+#endif
HANDLE from_master () {return req.from_master;};
HANDLE to_master () {return req.to_master;};
struct request_attach_tty req;
@@ -132,4 +133,4 @@ class client_request_attach_tty : public client_request
extern int cygserver_request (client_request *);
-#endif /* _CYGSERVER+H+ */
+#endif /* _CYGSERVER_H_ */