Some more daemon stuff.
This commit is contained in:
@@ -32,7 +32,6 @@ glibtop_call_l (glibtop *server, unsigned command, size_t send_size, void *send_
|
||||
{
|
||||
glibtop_command cmnd;
|
||||
glibtop_response response;
|
||||
void *ptr;
|
||||
|
||||
glibtop_init_r (&server, 0, 0);
|
||||
|
||||
@@ -47,24 +46,34 @@ glibtop_call_l (glibtop *server, unsigned command, size_t send_size, void *send_
|
||||
* of two. */
|
||||
|
||||
#ifdef DEBUG
|
||||
fprintf (stderr, "COMMAND: send_size = %d; command = %d; sizeof (cmnd) = %d\n",
|
||||
send_size, command, sizeof (glibtop_command));
|
||||
// fprintf (stderr, "COMMAND: send_size = %d; command = %d; sizeof (cmnd) = %d\n",
|
||||
// send_size, command, sizeof (glibtop_command));
|
||||
#endif
|
||||
|
||||
|
||||
if (send_size <= _GLIBTOP_PARAM_SIZE)
|
||||
if (send_size <= _GLIBTOP_PARAM_SIZE) {
|
||||
memcpy (cmnd.parameter, send_buf, send_size);
|
||||
else
|
||||
cmnd.size = send_size;
|
||||
} else {
|
||||
cmnd.data_size = send_size;
|
||||
}
|
||||
|
||||
glibtop_write_l (server, sizeof (glibtop_command), &cmnd);
|
||||
glibtop_write_l (server, send_size, send_buf);
|
||||
// glibtop_write_l (server, cmnd.data_size, send_buf);
|
||||
|
||||
glibtop_read_l (server, sizeof (glibtop_response), &response);
|
||||
|
||||
/* glibtop_read_l (server, recv_size, recv_buf); */
|
||||
|
||||
/* ptr = glibtop_read_data_l (server); */
|
||||
|
||||
fprintf (stderr, "RESPONSE: %d - %d\n", response.offset, response.data_size);
|
||||
|
||||
if (recv_buf)
|
||||
memcpy (recv_buf, ((char *) &response) + response.offset, recv_size);
|
||||
|
||||
if (response.data_size) {
|
||||
void *ptr = glibtop_malloc_r (server, response.data_size);
|
||||
|
||||
glibtop_read_l (server, response.data_size, ptr);
|
||||
|
||||
return ptr;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
195
lib/open.c
195
lib/open.c
@@ -33,144 +33,97 @@ void
|
||||
glibtop_open_l (glibtop *server, const char *program_name,
|
||||
const unsigned long features, const unsigned flags)
|
||||
{
|
||||
char version [BUFSIZ], buffer [BUFSIZ];
|
||||
char *server_command, *server_rsh, *temp;
|
||||
char *server_host, *server_user;
|
||||
char version [BUFSIZ], buffer [BUFSIZ], *temp, *temp2;
|
||||
glibtop_sysdeps sysdeps;
|
||||
int connect_type;
|
||||
int connect_type, ret;
|
||||
|
||||
memset (server, 0, sizeof (glibtop));
|
||||
|
||||
server->name = program_name;
|
||||
|
||||
/* Is the user allowed to override the server ? */
|
||||
|
||||
if (flags & GLIBTOP_OPEN_NO_OVERRIDE)
|
||||
return;
|
||||
|
||||
if ((flags & GLIBTOP_OPEN_NO_OVERRIDE) == 0) {
|
||||
connect_type = glibtop_make_connection
|
||||
(NULL, (u_short) 0, &server->socket);
|
||||
/* Try to get data from environment. */
|
||||
|
||||
temp = getenv ("LIBGTOP_SERVER") ?
|
||||
getenv ("LIBGTOP_SERVER") : GTOP_SERVER;
|
||||
|
||||
server->server_command = glibtop_strdup_r (server, temp);
|
||||
|
||||
temp = getenv ("LIBGTOP_RSH") ?
|
||||
getenv ("LIBGTOP_RSH") : "rsh";
|
||||
|
||||
server->server_rsh = glibtop_strdup_r (server, temp);
|
||||
|
||||
/* If the first character of 'server_command' is a colon,
|
||||
* the first field is the method to connect to the server. */
|
||||
|
||||
if (server->server_command [0] == ':') {
|
||||
|
||||
#ifdef INTERNET_DOMAIN_SOCKETS
|
||||
if (connect_type == (int) CONN_INTERNET) {
|
||||
fprintf (stderr, "Calling GLITOP_CMND_SYSDEPS ...\n");
|
||||
/* Everything up to the next colon is the method. */
|
||||
|
||||
glibtop_call_l (server, GLIBTOP_CMND_SYSDEPS, 0, NULL,
|
||||
sizeof (glibtop_sysdeps), &sysdeps);
|
||||
temp = strstr (server->server_command+1, ":");
|
||||
if (temp) *temp = 0;
|
||||
|
||||
/* Dispatch method. */
|
||||
|
||||
server->features = sysdeps.features;
|
||||
if (!strcmp (server->server_command+1, "direct")) {
|
||||
|
||||
/* Use sysdeps dir instead of connecting to server
|
||||
* even if using the server would be required on
|
||||
* the current system. */
|
||||
|
||||
return;
|
||||
|
||||
fprintf (stderr, "Features: %lu\n", server->features);
|
||||
} else if (!strcmp (server->server_command+1, "inet")) {
|
||||
|
||||
/* Connect to internet server. */
|
||||
|
||||
if (temp == NULL) {
|
||||
server->server_host = glibtop_strdup_r
|
||||
(server, "localhost");
|
||||
} else {
|
||||
temp2 = strstr (temp+1, ":");
|
||||
if (temp2) *temp2 = 0;
|
||||
|
||||
server->server_host = glibtop_strdup_r
|
||||
(server, temp+1);
|
||||
|
||||
temp = temp2;
|
||||
}
|
||||
|
||||
if (temp == NULL) {
|
||||
server->server_port = DEFAULT_PORT;
|
||||
} else {
|
||||
temp2 = strstr (temp+1, ":");
|
||||
if (temp2) *temp2 = 0;
|
||||
|
||||
ret = sscanf (temp+1, "%d", &server->server_port);
|
||||
|
||||
if (ret != 1)
|
||||
server->server_port = DEFAULT_PORT;
|
||||
|
||||
temp = temp2 ? temp2 + 1 : temp2;
|
||||
}
|
||||
|
||||
fprintf (stderr, "Connecting to '%s' port %d.\n",
|
||||
server->server_host, server->server_port);
|
||||
|
||||
connect_type = glibtop_make_connection
|
||||
(server->server_host, server->server_port,
|
||||
&server->socket);
|
||||
|
||||
server->features = -1;
|
||||
|
||||
return;
|
||||
}
|
||||
#endif /* INTERNET_DOMAIN_SOCKETS */
|
||||
|
||||
/* Try to get data from environment. */
|
||||
|
||||
temp = getenv ("LIBGTOP_SERVER") ?
|
||||
getenv ("LIBGTOP_SERVER") : GTOP_SERVER;
|
||||
|
||||
server_command = glibtop_malloc_r (server, strlen (temp) + 1);
|
||||
|
||||
strcpy (server_command, temp);
|
||||
|
||||
temp = getenv ("LIBGTOP_RSH") ?
|
||||
getenv ("LIBGTOP_RSH") : "rsh";
|
||||
|
||||
server_rsh = glibtop_malloc_r (server, strlen (temp) + 1);
|
||||
|
||||
strcpy (server_rsh, temp);
|
||||
|
||||
/* Extract host and user information. */
|
||||
|
||||
temp = strstr (server_command, ":");
|
||||
|
||||
if (temp) {
|
||||
*temp = 0;
|
||||
server_host = server_command;
|
||||
server_command = temp+1;
|
||||
|
||||
temp = strstr (server_host, "@");
|
||||
|
||||
if (temp) {
|
||||
*temp = 0;
|
||||
server_user = server_host;
|
||||
server_host = temp+1;
|
||||
} else {
|
||||
server_user = NULL;
|
||||
}
|
||||
} else {
|
||||
server_host = NULL;
|
||||
server_user = NULL;
|
||||
}
|
||||
|
||||
/* Store everything in `server'. */
|
||||
|
||||
server->server_command = server_command;
|
||||
server->server_host = server_host;
|
||||
server->server_user = server_user;
|
||||
server->server_rsh = server_rsh;
|
||||
}
|
||||
|
||||
/* Get server features. */
|
||||
|
||||
if (server->server_host == NULL) {
|
||||
server->features = glibtop_server_features;
|
||||
|
||||
if (server->features == 0)
|
||||
return;
|
||||
}
|
||||
|
||||
/* Fork and exec server. */
|
||||
|
||||
if (pipe (server->input) || pipe (server->output))
|
||||
glibtop_error_r (server, _("cannot make a pipe: %s\n"),
|
||||
strerror (errno));
|
||||
|
||||
server->pid = fork ();
|
||||
|
||||
if (server->pid < 0) {
|
||||
glibtop_error_r (server, _("%s: fork failed: %s\n"),
|
||||
strerror (errno));
|
||||
} else if (server->pid == 0) {
|
||||
close (0); close (1); /* close (2); */
|
||||
close (server->input [0]); close (server->output [1]);
|
||||
dup2 (server->input [1], 1); /* dup2 (server->input [1], 2); */
|
||||
dup2 (server->output [0], 0);
|
||||
|
||||
if (server_host) {
|
||||
if (server_user) {
|
||||
execl (server->server_rsh, "-l",
|
||||
server->server_user, server->server_host,
|
||||
server->server_command, NULL);
|
||||
} else {
|
||||
execl (server->server_rsh,
|
||||
server->server_host, server_command, NULL);
|
||||
}
|
||||
} else {
|
||||
execl (server->server_command, NULL);
|
||||
}
|
||||
|
||||
_exit (2);
|
||||
}
|
||||
|
||||
fprintf (stderr, "PID: %d\n", server->pid);
|
||||
|
||||
close (server->input [1]);
|
||||
close (server->output [0]);
|
||||
|
||||
sprintf (version, "%s server %s ready.\n", PACKAGE, VERSION);
|
||||
|
||||
glibtop_read_l (server, strlen (version), buffer);
|
||||
|
||||
if (memcmp (version, buffer, strlen (version)))
|
||||
glibtop_error_r (server, _("server version is not %s"), VERSION);
|
||||
|
||||
fprintf (stderr, "Calling GLITOP_CMND_SYSDEPS ...\n");
|
||||
|
||||
glibtop_call_l (server, GLIBTOP_CMND_SYSDEPS, 0, NULL,
|
||||
sizeof (glibtop_sysdeps), &sysdeps);
|
||||
|
||||
sizeof (glibtop_sysdeps), &sysdeps);
|
||||
|
||||
server->features = sysdeps.features;
|
||||
|
||||
fprintf (stderr, "Features: %lu\n", server->features);
|
||||
}
|
||||
|
29
lib/read.c
29
lib/read.c
@@ -23,10 +23,35 @@
|
||||
|
||||
/* Reads some data from server. */
|
||||
|
||||
static void
|
||||
do_read (int s, void *ptr, size_t total_size)
|
||||
{
|
||||
int nread;
|
||||
size_t already_read = 0, remaining = total_size;
|
||||
|
||||
while (already_read < total_size) {
|
||||
nread = recv (s, ptr, remaining, 0);
|
||||
|
||||
if (nread == 0) {
|
||||
close (s);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (nread <= 0) {
|
||||
glibtop_error_io ("recv");
|
||||
return;
|
||||
}
|
||||
|
||||
already_read += nread;
|
||||
remaining -= nread;
|
||||
(char *) ptr += nread;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
glibtop_read_l (glibtop *server, size_t size, void *buf)
|
||||
{
|
||||
int ret;
|
||||
int ret = 0;
|
||||
|
||||
glibtop_init_r (&server, 0, 0);
|
||||
|
||||
@@ -35,7 +60,7 @@ glibtop_read_l (glibtop *server, size_t size, void *buf)
|
||||
#endif
|
||||
|
||||
if (server->socket) {
|
||||
ret = recv (server->socket, buf, size, 0);
|
||||
do_read (server->socket, buf, size);
|
||||
} else {
|
||||
ret = read (server->input [0], buf, size);
|
||||
}
|
||||
|
Reference in New Issue
Block a user