summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMartin Baulig <martin@src.gnome.org>1998-05-19 18:19:50 +0000
committerMartin Baulig <martin@src.gnome.org>1998-05-19 18:19:50 +0000
commit33cdc01c1db3a1cafaeb63e50247072b82ef49ea (patch)
tree765262671f242fc45d3504cc069636ced714e33b /src
downloadlibgtop-33cdc01c1db3a1cafaeb63e50247072b82ef49ea.tar.gz
Initial revision
Diffstat (limited to 'src')
-rw-r--r--src/.cvsignore2
-rw-r--r--src/Makefile.am1
-rw-r--r--src/server/.cvsignore5
-rw-r--r--src/server/Makefile.am14
-rw-r--r--src/server/main.c258
-rw-r--r--src/server/output.c31
-rw-r--r--src/server/version.c31
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);
+}