summaryrefslogtreecommitdiffstats
path: root/winsup/cygserver/client.cc
diff options
context:
space:
mode:
Diffstat (limited to 'winsup/cygserver/client.cc')
-rw-r--r--winsup/cygserver/client.cc190
1 files changed, 103 insertions, 87 deletions
diff --git a/winsup/cygserver/client.cc b/winsup/cygserver/client.cc
index 600ddbd67..d8f7ac55a 100644
--- a/winsup/cygserver/client.cc
+++ b/winsup/cygserver/client.cc
@@ -1,6 +1,6 @@
-/* cygserver_client.cc
+/* client.cc
- Copyright 2001, 2002 Red Hat Inc.
+ Copyright 2001, 2002, 2003 Red Hat Inc.
Written by Egor Duda <deo@logos-m.ru>
@@ -22,11 +22,12 @@ details. */
#include <unistd.h>
#include "cygerrno.h"
+#include "cygserver_msg.h"
+#include "cygserver_sem.h"
#include "cygserver_shm.h"
-#include "safe_memory.h"
#include "cygserver.h"
-#include "cygserver_transport.h"
+#include "transport.h"
int cygserver_running = CYGSERVER_UNKNOWN; // Nb: inherited by children.
@@ -48,6 +49,8 @@ client_request_get_version::client_request_get_version ()
* the first numbers match, that is).
*/
+#ifdef __INSIDE_CYGWIN__
+
bool
client_request_get_version::check_version () const
{
@@ -71,8 +74,6 @@ client_request_get_version::check_version () const
return ok;
}
-#ifdef __INSIDE_CYGWIN__
-
client_request_attach_tty::client_request_attach_tty (DWORD nmaster_pid,
HANDLE nfrom_master,
HANDLE nto_master)
@@ -87,15 +88,6 @@ client_request_attach_tty::client_request_attach_tty (DWORD nmaster_pid,
"from_master = %lu, to_master = %lu"),
req.pid, req.master_pid, req.from_master, req.to_master);
}
-
-#else /* !__INSIDE_CYGWIN__ */
-
-client_request_attach_tty::client_request_attach_tty ()
- : client_request (CYGSERVER_REQUEST_ATTACH_TTY, &req, sizeof (req))
-{
- // verbose: syscall_printf ("created");
-}
-
#endif /* __INSIDE_CYGWIN__ */
/*
@@ -230,7 +222,12 @@ client_request::send (transport_layer_base * const conn)
// sizeof (_header), msglen ());
}
-#ifndef __INSIDE_CYGWIN__
+#ifdef __OUTSIDE_CYGWIN__
+
+client_request_attach_tty::client_request_attach_tty ()
+ : client_request (CYGSERVER_REQUEST_ATTACH_TTY, &req, sizeof (req))
+{
+}
/*
* client_request::handle_request ()
@@ -277,16 +274,22 @@ client_request::handle_request (transport_layer_base *const conn,
switch (header.request_code)
{
case CYGSERVER_REQUEST_GET_VERSION:
- req = safe_new0 (client_request_get_version);
+ req = new client_request_get_version;
break;
case CYGSERVER_REQUEST_SHUTDOWN:
- req = safe_new0 (client_request_shutdown);
+ req = new client_request_shutdown;
break;
case CYGSERVER_REQUEST_ATTACH_TTY:
- req = safe_new0 (client_request_attach_tty);
+ req = new client_request_attach_tty;
+ break;
+ case CYGSERVER_REQUEST_MSG:
+ req = new client_request_msg;
+ break;
+ case CYGSERVER_REQUEST_SEM:
+ req = new client_request_sem;
break;
case CYGSERVER_REQUEST_SHM:
- req = safe_new0 (client_request_shm);
+ req = new client_request_shm;
break;
default:
syscall_printf ("unknown request code %d received: request ignored",
@@ -299,74 +302,9 @@ client_request::handle_request (transport_layer_base *const conn,
req->msglen (header.msglen);
req->handle (conn, cache);
- safe_delete (req);
-
-#ifndef DEBUGGING
- printf ("."); // A little noise when we're being quiet.
-#endif
-}
-
-#endif /* !__INSIDE_CYGWIN__ */
-
-client_request::client_request (request_code_t const id,
- void * const buf,
- size_t const buflen)
- : _header (id, buflen),
- _buf (buf),
- _buflen (buflen)
-{
- assert ((!_buf && !_buflen) || (_buf && _buflen));
-}
-
-client_request::~client_request ()
-{}
-
-int
-client_request::make_request ()
-{
- assert (cygserver_running == CYGSERVER_UNKNOWN \
- || cygserver_running == CYGSERVER_OK \
- || cygserver_running == CYGSERVER_UNAVAIL);
-
- if (cygserver_running == CYGSERVER_UNKNOWN)
- cygserver_init ();
-
- assert (cygserver_running == CYGSERVER_OK \
- || cygserver_running == CYGSERVER_UNAVAIL);
-
- /* Don't retry every request if the server's not there */
- if (cygserver_running == CYGSERVER_UNAVAIL)
- {
- syscall_printf ("cygserver un-available");
- error_code (ENOSYS);
- return -1;
- }
-
- transport_layer_base *const transport = create_server_transport ();
-
- assert (transport);
-
- if (transport->connect () == -1)
- {
- if (errno)
- error_code (errno);
- else
- error_code (ENOSYS);
- safe_delete (transport);
- return -1;
- }
-
- // verbose: debug_printf ("connected to server %p", transport);
-
- send (transport);
-
- safe_delete (transport);
-
- return 0;
+ delete req;
}
-#ifndef __INSIDE_CYGWIN__
-
/*
* client_request::handle ()
*
@@ -470,7 +408,84 @@ client_request::handle (transport_layer_base *const conn,
// sizeof (_header), msglen ());
}
-#endif /* !__INSIDE_CYGWIN__ */
+/* The server side implementation of make_request. Very simple. */
+int
+client_request::make_request ()
+{
+ transport_layer_base *const transport = create_server_transport ();
+ assert (transport);
+ if (transport->connect () == -1)
+ {
+ if (errno)
+ error_code (errno);
+ else
+ error_code (ENOSYS);
+ delete transport;
+ return -1;
+ }
+ send (transport);
+ delete transport;
+ return 0;
+}
+#endif /* __OUTSIDE_CYGWIN__ */
+
+client_request::client_request (request_code_t const id,
+ void * const buf,
+ size_t const buflen)
+ : _header (id, buflen),
+ _buf (buf),
+ _buflen (buflen)
+{
+ assert ((!_buf && !_buflen) || (_buf && _buflen));
+}
+
+client_request::~client_request ()
+{}
+
+#ifdef __INSIDE_CYGWIN__
+int
+client_request::make_request ()
+{
+ assert (cygserver_running == CYGSERVER_UNKNOWN \
+ || cygserver_running == CYGSERVER_OK \
+ || cygserver_running == CYGSERVER_UNAVAIL);
+
+ if (cygserver_running == CYGSERVER_UNKNOWN)
+ cygserver_init ();
+
+ assert (cygserver_running == CYGSERVER_OK \
+ || cygserver_running == CYGSERVER_UNAVAIL);
+
+ /* Don't retry every request if the server's not there */
+ if (cygserver_running == CYGSERVER_UNAVAIL)
+ {
+ syscall_printf ("cygserver un-available");
+ error_code (ENOSYS);
+ return -1;
+ }
+
+ transport_layer_base *const transport = create_server_transport ();
+
+ assert (transport);
+
+ if (transport->connect () == -1)
+ {
+ if (errno)
+ error_code (errno);
+ else
+ error_code (ENOSYS);
+ delete transport;
+ return -1;
+ }
+
+ // verbose: debug_printf ("connected to server %p", transport);
+
+ send (transport);
+
+ delete transport;
+
+ return 0;
+}
bool
check_cygserver_available ()
@@ -523,3 +538,4 @@ cygserver_init ()
if (!check_cygserver_available ())
cygserver_running = CYGSERVER_UNAVAIL;
}
+#endif /* __INSIDE_CYGWIN__ */