diff options
author | Martin Baulig <martin@src.gnome.org> | 1998-05-19 18:19:50 +0000 |
---|---|---|
committer | Martin Baulig <martin@src.gnome.org> | 1998-05-19 18:19:50 +0000 |
commit | 33cdc01c1db3a1cafaeb63e50247072b82ef49ea (patch) | |
tree | 765262671f242fc45d3504cc069636ced714e33b /src | |
download | libgtop-33cdc01c1db3a1cafaeb63e50247072b82ef49ea.tar.gz |
Initial revision
Diffstat (limited to 'src')
-rw-r--r-- | src/.cvsignore | 2 | ||||
-rw-r--r-- | src/Makefile.am | 1 | ||||
-rw-r--r-- | src/server/.cvsignore | 5 | ||||
-rw-r--r-- | src/server/Makefile.am | 14 | ||||
-rw-r--r-- | src/server/main.c | 258 | ||||
-rw-r--r-- | src/server/output.c | 31 | ||||
-rw-r--r-- | src/server/version.c | 31 |
7 files changed, 342 insertions, 0 deletions
diff --git a/src/.cvsignore b/src/.cvsignore new file mode 100644 index 00000000..282522db --- /dev/null +++ b/src/.cvsignore @@ -0,0 +1,2 @@ +Makefile +Makefile.in diff --git a/src/Makefile.am b/src/Makefile.am new file mode 100644 index 00000000..b0e22324 --- /dev/null +++ b/src/Makefile.am @@ -0,0 +1 @@ +SUBDIRS = server diff --git a/src/server/.cvsignore b/src/server/.cvsignore new file mode 100644 index 00000000..2164d8f4 --- /dev/null +++ b/src/server/.cvsignore @@ -0,0 +1,5 @@ +.deps +.libs +Makefile +Makefile.in +gtop_server diff --git a/src/server/Makefile.am b/src/server/Makefile.am new file mode 100644 index 00000000..6fe258f4 --- /dev/null +++ b/src/server/Makefile.am @@ -0,0 +1,14 @@ +LINK = $(LIBTOOL) --mode=link $(CC) $(CFLAGS) $(LDFLAGS) -o $@ + +INCLUDES = @GTOP_INCS@ + +CFLAGS = -Wall -W @CFLAGS@ + +bin_PROGRAMS = gtop_server + +gtop_server_SOURCES = main.c output.c version.c +gtop_server_LDADD = $(top_builddir)/sysdeps/common/libgtop_common.la \ + $(top_builddir)/sysdeps/@sysdeps_dir@/libgtop_sysdeps.la \ + @INTLLIBS@ @LIBSUPPORT@ +gtop_server_LDFLAGS = -static + diff --git a/src/server/main.c b/src/server/main.c new file mode 100644 index 00000000..93332f12 --- /dev/null +++ b/src/server/main.c @@ -0,0 +1,258 @@ +/* $Id$ */ + +/* Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc. + This file is part of the Gnome Top Library. + Contributed by Martin Baulig <martin@home-of-linux.org>, April 1998. + + The Gnome Top Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The Gnome Top Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include <glibtop/command.h> +#include <glibtop/version.h> +#include <glibtop/xmalloc.h> +#include <glibtop/union.h> +#include <glibtop/open.h> + +#include <fcntl.h> + +#if defined(HAVE_GETDTABLESIZE) +#define GET_MAX_FDS() getdtablesize() +#else +/* Fallthrough case - please add other #elif cases above + for different OS's as necessary */ +#define GET_MAX_FDS() 256 +#endif + +int main(int argc, char *argv[]) +{ + pid_t pid; + int fd, max_fd, nread; + size_t size, dsize; + char parameter [BUFSIZ]; + glibtop_union data; + glibtop_command cmnd; + glibtop_sysdeps sysdeps; + glibtop server; + void *ptr; + + /* !!! WE ARE ROOT HERE - CHANGE WITH CAUTION !!! */ + + int uid, euid, gid, egid; + + uid = getuid (); euid = geteuid (); + gid = getgid (); egid = getegid (); + + if (setreuid (euid, uid)) _exit (1); + + if (setregid (egid, gid)) _exit (1); + + /* !!! END OF SUID ROOT PART !!! */ + + /* For security reasons, we temporarily drop our priviledges + * before doing the gettext stuff. */ + + setlocale (LC_ALL, ""); + bindtextdomain (PACKAGE, GTOPLOCALEDIR); + textdomain (PACKAGE); + + glibtop_version (); + + /* !!! WE ARE ROOT HERE - CHANGE WITH CAUTION !!! */ + + setreuid (uid, euid); setreuid (gid, egid); + + glibtop_open (&server, argv [0]); + + if (setreuid (euid, uid)) _exit (1); + + if (setregid (egid, gid)) _exit (1); + + /* !!! END OF SUID ROOT PART !!! */ + + /* close all file descriptors except ones used by the pipes (0 and 1). */ + max_fd = GET_MAX_FDS(); + for(fd = 3 /* The first fd after the pipes */; fd < max_fd; fd++) + close(fd); + + while(1) { + /* block on read from client */ + /* fprintf (stderr, "waiting for input ...\n"); */ + nread = read (0, &size, sizeof (size_t)); + + /* will return 0 if parent exits. */ + + if (nread == 0) + _exit(0); + + if (nread != sizeof (size_t)) + _exit(1); + + if (size != sizeof (glibtop_command)) + _exit(2); + + nread = read (0, &cmnd, size); + + /* will return 0 if parent exits. */ + + if (nread == 0) + _exit(0); + + if (nread < 0) + _exit(1); + + nread = read (0, &dsize, sizeof (size_t)); + + /* will return 0 if parent exits. */ + + if (nread == 0) + _exit(0); + + if (nread < 0) + _exit(1); + + if (dsize >= BUFSIZ) + _exit(3); + + memset (parameter, 0, sizeof (parameter)); + + if (dsize) { + nread = read (0, parameter, dsize); + + /* will return 0 if parent exits. */ + + if (nread == 0) + _exit(0); + + if (nread < 0) + _exit(1); + } + + switch (cmnd.command) { + case GLIBTOP_CMND_SYSDEPS: + glibtop_get_sysdeps__r (&server, &sysdeps); + glibtop_output (sizeof (glibtop_sysdeps), &sysdeps); + glibtop_output (0, NULL); + break; + case GLIBTOP_CMND_CPU: + glibtop_get_cpu__r (&server, &data.cpu); + glibtop_output (sizeof (glibtop_cpu), &data.cpu); + glibtop_output (0, NULL); + break; + case GLIBTOP_CMND_MEM: + glibtop_get_mem__r (&server, &data.mem); + glibtop_output (sizeof (glibtop_mem), &data.mem); + glibtop_output (0, NULL); + break; + case GLIBTOP_CMND_SWAP: + glibtop_get_swap__r (&server, &data.swap); + glibtop_output (sizeof (glibtop_swap), &data.swap); + glibtop_output (0, NULL); + break; + case GLIBTOP_CMND_UPTIME: + glibtop_get_uptime__r (&server, &data.uptime); + glibtop_output (sizeof (glibtop_uptime), &data.uptime); + glibtop_output (0, NULL); + break; + case GLIBTOP_CMND_LOADAVG: + glibtop_get_loadavg__r (&server, &data.loadavg); + glibtop_output (sizeof (glibtop_loadavg), &data.loadavg); + glibtop_output (0, NULL); + break; + case GLIBTOP_CMND_SHM_LIMITS: + glibtop_get_shm_limits__r (&server, &data.shm_limits); + glibtop_output (sizeof (glibtop_shm_limits), + &data.shm_limits); + glibtop_output (0, NULL); + break; + case GLIBTOP_CMND_MSG_LIMITS: + glibtop_get_msg_limits__r (&server, &data.msg_limits); + glibtop_output (sizeof (glibtop_msg_limits), + &data.msg_limits); + glibtop_output (0, NULL); + break; + case GLIBTOP_CMND_SEM_LIMITS: + glibtop_get_sem_limits__r (&server, &data.sem_limits); + glibtop_output (sizeof (glibtop_sem_limits), + &data.sem_limits); + glibtop_output (0, NULL); + break; + case GLIBTOP_CMND_PROCLIST: + ptr = glibtop_get_proclist__r (&server, &data.proclist); + glibtop_output (sizeof (glibtop_proclist), + &data.proclist); + glibtop_output (data.proclist.total, ptr); + glibtop_free__r (&server, ptr); + break; + case GLIBTOP_CMND_PROC_STATE: + memcpy (&pid, parameter, sizeof (pid_t)); + glibtop_get_proc_state__r + (&server, &data.proc_state, pid); + glibtop_output (sizeof (glibtop_proc_state), + &data.proc_state); + glibtop_output (0, NULL); + break; + case GLIBTOP_CMND_PROC_UID: + memcpy (&pid, parameter, sizeof (pid_t)); + glibtop_get_proc_uid__r + (&server, &data.proc_uid, pid); + glibtop_output (sizeof (glibtop_proc_uid), + &data.proc_uid); + glibtop_output (0, NULL); + break; + case GLIBTOP_CMND_PROC_MEM: + memcpy (&pid, parameter, sizeof (pid_t)); + glibtop_get_proc_mem__r + (&server, &data.proc_mem, pid); + glibtop_output (sizeof (glibtop_proc_mem), + &data.proc_mem); + glibtop_output (0, NULL); + break; + case GLIBTOP_CMND_PROC_TIME: + memcpy (&pid, parameter, sizeof (pid_t)); + glibtop_get_proc_time__r + (&server, &data.proc_time, pid); + glibtop_output (sizeof (glibtop_proc_time), + &data.proc_time); + glibtop_output (0, NULL); + break; + case GLIBTOP_CMND_PROC_SIGNAL: + memcpy (&pid, parameter, sizeof (pid_t)); + glibtop_get_proc_signal__r + (&server, &data.proc_signal, pid); + glibtop_output (sizeof (glibtop_proc_signal), + &data.proc_signal); + glibtop_output (0, NULL); + break; + case GLIBTOP_CMND_PROC_KERNEL: + memcpy (&pid, parameter, sizeof (pid_t)); + glibtop_get_proc_kernel__r + (&server, &data.proc_kernel, pid); + glibtop_output (sizeof (glibtop_proc_kernel), + &data.proc_kernel); + glibtop_output (0, NULL); + break; + case GLIBTOP_CMND_PROC_SEGMENT: + memcpy (&pid, parameter, sizeof (pid_t)); + glibtop_get_proc_segment__r + (&server, &data.proc_segment, pid); + glibtop_output (sizeof (glibtop_proc_segment), + &data.proc_segment); + glibtop_output (0, NULL); + break; + + } + } + _exit(0); +} diff --git a/src/server/output.c b/src/server/output.c new file mode 100644 index 00000000..9fa98655 --- /dev/null +++ b/src/server/output.c @@ -0,0 +1,31 @@ +/* $Id$ */ + +/* Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc. + This file is part of the Gnome Top Library. + Contributed by Martin Baulig <martin@home-of-linux.org>, April 1998. + + The Gnome Top Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The Gnome Top Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include <glibtop/output.h> + +void +glibtop_output (size_t size, const void *buf) +{ + if (write (1, &size, sizeof (size_t)) < 0) + _exit (2); + if (write (1, buf, size) < 0) + _exit (2); +} diff --git a/src/server/version.c b/src/server/version.c new file mode 100644 index 00000000..3e21f55a --- /dev/null +++ b/src/server/version.c @@ -0,0 +1,31 @@ +/* $Id$ */ + +/* Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc. + This file is part of the Gnome Top Library. + Contributed by Martin Baulig <martin@home-of-linux.org>, April 1998. + + The Gnome Top Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The Gnome Top Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include <glibtop/version.h> + +void +glibtop_version (void) +{ + char buffer [BUFSIZ]; + + sprintf (buffer, "%s server %s ready.\n", PACKAGE, VERSION); + glibtop_output (strlen (buffer), buffer); +} |