libgtop-GNOME-2-0-branch moved to HEAD.
2003-10-19 Carlos Perelló Marín <carlos@gnome.org> * libgtop-GNOME-2-0-branch moved to HEAD.
This commit is contained in:
committed by
Carlos Perelló Marín
parent
5e28a55218
commit
bae16b467f
158
lib/open.c
158
lib/open.c
@@ -1,5 +1,3 @@
|
||||
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 4 -*- */
|
||||
|
||||
/* $Id$ */
|
||||
|
||||
/* Copyright (C) 1998-99 Martin Baulig
|
||||
@@ -25,20 +23,160 @@
|
||||
|
||||
#include <glibtop.h>
|
||||
#include <glibtop/open.h>
|
||||
#include <glibtop/backend.h>
|
||||
#include <glibtop/version.h>
|
||||
#include <glibtop/sysdeps.h>
|
||||
#include <glibtop/command.h>
|
||||
#include <glibtop/xmalloc.h>
|
||||
|
||||
#include <glibtop/gnuserv.h>
|
||||
|
||||
/* Opens pipe to gtop server. Returns 0 on success and -1 on error. */
|
||||
|
||||
void
|
||||
glibtop_open_l (glibtop *server, const char *program_name,
|
||||
const unsigned long features, const unsigned flags)
|
||||
{
|
||||
if ((server->flags & _GLIBTOP_INIT_STATE_SYSDEPS) == 0) {
|
||||
glibtop_init_backends ();
|
||||
int connect_type;
|
||||
|
||||
_glibtop_open_sysdeps (server, "glibtop", features, flags);
|
||||
server->name = program_name;
|
||||
|
||||
server->_param.ncpu = server->info->ncpu;
|
||||
server->_param.os_version_code = server->os_version_code;
|
||||
/* It is important to set _GLIBTOP_INIT_STATE_OPEN here when we
|
||||
* do recursive calls to glibtop_init_r (). */
|
||||
|
||||
server->flags |= _GLIBTOP_INIT_STATE_SYSDEPS;
|
||||
}
|
||||
server->flags |= _GLIBTOP_INIT_STATE_OPEN;
|
||||
|
||||
server->error_method = GLIBTOP_ERROR_METHOD_DEFAULT;
|
||||
|
||||
#ifdef DEBUG
|
||||
fprintf (stderr, "SIZEOF: %u - %u - %u - %u - %u - %u\n",
|
||||
sizeof (glibtop_command), sizeof (glibtop_response),
|
||||
sizeof (glibtop_mountentry), sizeof (glibtop_union),
|
||||
sizeof (glibtop_sysdeps), sizeof (glibtop_response_union));
|
||||
#endif
|
||||
|
||||
switch (server->method) {
|
||||
case GLIBTOP_METHOD_DIRECT:
|
||||
server->features = 0;
|
||||
break;
|
||||
case GLIBTOP_METHOD_INET:
|
||||
#ifdef DEBUG
|
||||
fprintf (stderr, "Connecting to '%s' port %ld.\n",
|
||||
server->server_host, server->server_port);
|
||||
#endif
|
||||
|
||||
connect_type = glibtop_make_connection
|
||||
(server->server_host, server->server_port,
|
||||
&server->socket);
|
||||
|
||||
#ifdef DEBUG
|
||||
fprintf (stderr, "Connect Type is %d.\n", connect_type);
|
||||
#endif
|
||||
|
||||
server->flags |= _GLIBTOP_INIT_STATE_SERVER;
|
||||
|
||||
server->features = -1;
|
||||
break;
|
||||
case GLIBTOP_METHOD_UNIX:
|
||||
#ifdef DEBUG
|
||||
fprintf (stderr, "Connecting to Unix Domain Socket.\n");
|
||||
#endif
|
||||
|
||||
connect_type = glibtop_make_connection
|
||||
("unix", 0, &server->socket);
|
||||
|
||||
#ifdef DEBUG
|
||||
fprintf (stderr, "Connect Type is %d.\n", connect_type);
|
||||
#endif
|
||||
|
||||
server->flags |= _GLIBTOP_INIT_STATE_SERVER;
|
||||
|
||||
server->features = -1;
|
||||
break;
|
||||
case GLIBTOP_METHOD_PIPE:
|
||||
#ifdef DEBUG
|
||||
fprintf (stderr, "Opening pipe to server (%s).\n",
|
||||
LIBGTOP_SERVER);
|
||||
#endif
|
||||
|
||||
if (pipe (server->input) || pipe (server->output))
|
||||
glibtop_error_io_r (server, "cannot make a pipe");
|
||||
|
||||
server->pid = fork ();
|
||||
|
||||
if (server->pid < 0) {
|
||||
glibtop_error_io_r (server, "fork failed");
|
||||
} else if (server->pid == 0) {
|
||||
close (0); close (1);
|
||||
close (server->input [0]); close (server->output [1]);
|
||||
dup2 (server->input [1], 1);
|
||||
dup2 (server->output [0], 0);
|
||||
execl (LIBGTOP_SERVER, "libgtop-server", NULL);
|
||||
glibtop_error_io_r (server, "execl (%s)",
|
||||
LIBGTOP_SERVER);
|
||||
_exit (2);
|
||||
}
|
||||
|
||||
close (server->input [1]);
|
||||
close (server->output [0]);
|
||||
|
||||
server->flags |= _GLIBTOP_INIT_STATE_SERVER;
|
||||
|
||||
server->features = -1;
|
||||
break;
|
||||
}
|
||||
|
||||
/* If the server has been started, ask it for its features. */
|
||||
|
||||
if (server->flags & _GLIBTOP_INIT_STATE_SERVER) {
|
||||
char version [BUFSIZ], buffer [BUFSIZ];
|
||||
glibtop_sysdeps sysdeps;
|
||||
size_t size, nbytes;
|
||||
|
||||
/* First check whether the server version is correct. */
|
||||
|
||||
sprintf (version, LIBGTOP_VERSION_STRING,
|
||||
LIBGTOP_VERSION, LIBGTOP_SERVER_VERSION,
|
||||
sizeof (glibtop_command),
|
||||
sizeof (glibtop_response),
|
||||
sizeof (glibtop_union),
|
||||
sizeof (glibtop_sysdeps));
|
||||
|
||||
size = strlen (version) + 1;
|
||||
|
||||
glibtop_read_l (server, sizeof (nbytes), &nbytes);
|
||||
|
||||
if (nbytes != size)
|
||||
glibtop_error_r (server,
|
||||
"Requested %u bytes but got %u.",
|
||||
size, nbytes);
|
||||
|
||||
glibtop_read_l (server, nbytes, buffer);
|
||||
|
||||
if (memcmp (version, buffer, size))
|
||||
glibtop_error_r (server, "server version is not %s",
|
||||
LIBGTOP_VERSION);
|
||||
|
||||
/* Now ask it for its features. */
|
||||
|
||||
glibtop_call_l (server, GLIBTOP_CMND_SYSDEPS, 0, NULL,
|
||||
sizeof (glibtop_sysdeps), &sysdeps);
|
||||
|
||||
server->features = sysdeps.features;
|
||||
|
||||
memcpy (&server->sysdeps, &sysdeps, sizeof (glibtop_sysdeps));
|
||||
|
||||
#ifdef DEBUG
|
||||
fprintf (stderr, "Server features are %lu.\n",
|
||||
server->features);
|
||||
#endif
|
||||
}
|
||||
|
||||
/* In any case, we call the open functions of our own sysdeps
|
||||
* directory. */
|
||||
|
||||
#ifdef DEBUG
|
||||
fprintf (stderr, "Calling sysdeps open function.\n");
|
||||
#endif
|
||||
|
||||
glibtop_init_s (&server, features, flags);
|
||||
}
|
||||
|
Reference in New Issue
Block a user