Compare commits

..

39 Commits

Author SHA1 Message Date
Martin Baulig
1d7491be0d Importing from GNU Fileutils 3.16. 1998-07-06 22:44:40 +00:00
Martin Baulig
15cc0113a9 Initial revision 1998-07-06 22:44:40 +00:00
Martin baulig
9532dadc2e No longer use `glibtop_machine.h' for Linux.
1998-07-03  Martin baulig  <martin@home-of-linux.org>

	* macros/gnome-libgtop-sysdeps.m4: No longer use
	`glibtop_machine.h' for Linux.

	* sysdeps/linux/glibtop_machine.h: Removed.

	* sysdeps/guile/guile.awk: Using `scm_append'
	instead of `gh_append'.

	* sysdeps/guile/names/guile-names.awk: dito.

	* sysdeps/linux/*.c: Using code from stable branch again.

	* include/glibtop/parameter.h: New file.

	* lib/parameter.c: New file.

	* lib/{open, init}.c: Done some more work on server
	initialization
1998-07-03 17:19:25 +00:00
Manish Vachharajani
94715ef718 Fixed a typo for determining gtop libs 1998-06-28 22:37:56 +00:00
Manish Vachharajani
44bb75cf6e Made glibtop_machine.h get put in include_HEADERS 1998-06-28 21:37:14 +00:00
Manish Vachharajani
4d2072ce65 Fixed a type in the Makefile 1998-06-28 21:04:40 +00:00
Vincent Renardias
eb36f97c50 Mon, 22 Jun 1998 12:38:50 +0200 [Vincent]
* .fr translation updates.
1998-06-22 10:45:16 +00:00
Martin Baulig
a76522a990 Added perl interface.
1998-06-21  Martin Baulig  <martin@home-of-linux.org>

	* perl/*: Added perl interface.

	* sysdeps/linux/cpu.c: Bug fix.

	* include/glibtop/global.h: Only including guile header files
	within libgtop.

	* configure.in (LIGBTOP_LIBS): Added `-lgtop'.

	* Makefile.am: Creating `perl/Makefile.PL' from `perl/Makefile.PL.in'
	and `perl/Libgtop.xs' using `perl/perl.awk'.
1998-06-21 22:24:18 +00:00
Martin Baulig
71187a5e51 Some more daemon stuff. 1998-06-18 19:06:55 +00:00
Martin Baulig
b54a5d2dfd *** empty log message *** 1998-06-18 19:04:47 +00:00
Martin Baulig
134ec106b3 Did some more work on the daemon; many debug messages are in the code at
the moment.
1998-06-18 19:04:44 +00:00
Martin Baulig
1b90ed4fcc Reverted some stuff from 06-07-1998 since it was too buggy.
1998-06-18  Martin Baulig  <baulig@taurus.uni-trier.de>

	* sysdeps/linux/*.c: Reverted some stuff from 06-07-1998
	since it was too buggy.
1998-06-18 19:02:49 +00:00
Martin Baulig
3fcc477b25 New field `server_port'.
1998-06-18  Martin Baulig  <baulig@taurus.uni-trier.de>

	* glibtop.h (_glibtop): New field `server_port'.
1998-06-18 13:08:40 +00:00
Martin Baulig
81c75477f4 New function.
1998-06-18  Martin Baulig  <baulig@taurus.uni-trier.de>

	* lib/xmalloc.c (glibtop_strdup_r): New function.
1998-06-18 13:06:40 +00:00
Martin Baulig
8b025ff2c2 Removed.
1998-06-18  Martin Baulig  <baulig@taurus.uni-trier.de>

	* lib/gnuclient.c: Removed.
1998-06-18 12:31:40 +00:00
Martin Baulig
2de9ea5c7d Changed client <-> server interface to make less system calls.
1998-06-18  Martin Baulig  <baulig@taurus.uni-trier.de>

	* lib/{command, write, read}.c: Changed client <-> server
	interface to make less system calls.

	* src/daemon/main.c: Changed server side of interface.

	* include/glibtop/command.h (struct _glibtop_response): New
	structure to return data from the server to the client.
1998-06-18 10:22:39 +00:00
Martin Baulig
d9e6288b7a *** empty log message *** 1998-06-14 21:33:26 +00:00
Martin Baulig
8d78559597 Did some more work on the daemon. 1998-06-14 21:32:00 +00:00
Martin Baulig
2a281d0a53 Added `socket' field.
1998-06-14  Martin Baulig  <martin@home-of-linux.org>

	* glibtop.h (struct _glibtop): Added `socket' field.
1998-06-14 21:30:41 +00:00
Martin Baulig
28dfff5752 New file. Imported from xemacs 20.3.
1998-06-14  Martin Baulig  <martin@home-of-linux.org>

	* include/glibtop/gnuserv.h: New file. Imported from xemacs 20.3.

	* sysdeps/common/gnuslib.c: New file. Imported from xemacs 20.3

	* lib/gnuclient.c: New file. Imported from xemacs 20.3

	* sysdeps/daemon/gnuserv.c: New file. Imported from xemacs 20.3

	* sysdeps/daemon: New directory.

	* configure.in (LIBGTOP_LIBS, LIBGTOP_GUILE_LIBS): Added
	`$X_LIBS -lXau' when we have xauth.
1998-06-14 19:04:44 +00:00
Martin Baulig
7d0d3db11c Removed again. 1998-06-14 17:05:37 +00:00
Martin Baulig
63c475d400 Committing changes from `src/daemon' 1998-06-14 17:04:57 +00:00
Martin Baulig
d334a77447 Importing from xemacs-20.3 1998-06-14 17:04:10 +00:00
Martin Baulig
1b7d7976b1 Initial revision 1998-06-14 17:04:10 +00:00
Martin Baulig
d7770a12c6 Committing changes from `src/daemon'. 1998-06-14 17:03:32 +00:00
Martin Baulig
5fef6560bf Importing from xemacs-20.3 1998-06-14 17:02:44 +00:00
Martin Baulig
75605116d0 Initial revision 1998-06-14 17:02:44 +00:00
Martin Baulig
35943ea8fc Committing changes I made in 'src/daemon'. 1998-06-14 16:54:23 +00:00
Martin Baulig
e166f54328 Importing from xemacs-20.3 1998-06-14 16:50:30 +00:00
Martin Baulig
c1cc35ac17 Initial revision 1998-06-14 16:50:30 +00:00
Martin Baulig
0acb497216 New tag.
1998-06-14  Martin Baulig  <martin@home-of-linux.org>

	* acconfig.h (HAVE_XAUTH): New tag.

	* configure.in: Added check for `HAVE_XAUTH'.
1998-06-14 16:48:06 +00:00
Martin Baulig
58707dac42 New function - same as glibtop_error_r', but doesn't call exit'.
1998-06-14  Martin Baulig  <martin@home-of-linux.org>

	* sysdeps/common/error.c (glibtop_warn_r): New function -
	same as `glibtop_error_r', but doesn't call `exit'.
	(glibtop_error_io_r, glibtop_warn_io_r): New functions,
	display `strerror (errno)' together with message.
1998-06-14 16:47:09 +00:00
Martin Baulig
8f14d30d11 Compiles and links correctly. 1998-06-14 14:45:57 +00:00
Martin Baulig
bde0d74282 including correct headers; (HAVE_UNISTD_H): Added conditional. Added
1998-06-14  Martin Baulig  <martin@home-of-linux.org>

	* include/glibtop/global.h (TIME_WITH_SYS_TIME): including
	correct headers; (HAVE_UNISTD_H): Added conditional.
	Added `#include <sys/param.h>' and `#include <sys/stat.h>'.
1998-06-14 14:44:53 +00:00
Martin Baulig
026e93121e Forgot to import this file. 1998-06-14 14:39:34 +00:00
Martin Baulig
f87722233a Initial revision 1998-06-14 14:39:34 +00:00
Martin Baulig
03c5a235ef Importing gnuserv and gnuclient from XEmacs 20.3. 1998-06-14 14:09:34 +00:00
Martin Baulig
215ab9f17b Initial revision 1998-06-14 14:09:34 +00:00
Martin Baulig
794a8efaed Added README.
1998-06-14  Martin Baulig  <baulig@taurus.uni-trier.de>

	* README: Added README.

	* kernel.patch: Patch for the Linux kernel to add the
	new system call.
1998-06-14 12:40:59 +00:00
65 changed files with 4018 additions and 838 deletions

View File

@@ -1,5 +1,87 @@
1998-07-03 Martin baulig <martin@home-of-linux.org>
* macros/gnome-libgtop-sysdeps.m4: No longer use
`glibtop_machine.h' for Linux.
* sysdeps/linux/glibtop_machine.h: Removed.
* sysdeps/guile/guile.awk: Using `scm_append'
instead of `gh_append'.
* sysdeps/guile/names/guile-names.awk: dito.
* sysdeps/linux/*.c: Using code from stable branch again.
* include/glibtop/parameter.h: New file.
* lib/parameter.c: New file.
* lib/{open, init}.c: Done some more work on server
initialization
1998-06-21 Martin Baulig <martin@home-of-linux.org>
* perl/*: Added perl interface.
* sysdeps/linux/cpu.c: Bug fix.
* include/glibtop/global.h: Only including guile header files
within libgtop.
* configure.in (LIGBTOP_LIBS): Added `-lgtop'.
* Makefile.am: Creating `perl/Makefile.PL' from `perl/Makefile.PL.in'
and `perl/Libgtop.xs' using `perl/perl.awk'.
1998-06-18 Martin Baulig <baulig@taurus.uni-trier.de>
* sysdeps/linux/*.c: Reverted some stuff from 06-07-1998
since it was too buggy.
* glibtop.h (_glibtop): New field `server_port'.
* lib/xmalloc.c (glibtop_strdup_r): New function.
* lib/gnuclient.c: Removed.
* lib/{command, write, read}.c: Changed client <-> server
interface to make less system calls.
* src/daemon/main.c: Changed server side of interface.
* include/glibtop/command.h (struct _glibtop_response): New
structure to return data from the server to the client.
1998-06-14 Martin Baulig <martin@home-of-linux.org>
* glibtop.h (struct _glibtop): Added `socket' field.
* include/glibtop/gnuserv.h: New file. Imported from xemacs 20.3.
* sysdeps/common/gnuslib.c: New file. Imported from xemacs 20.3
* lib/gnuclient.c: New file. Imported from xemacs 20.3
* sysdeps/daemon/gnuserv.c: New file. Imported from xemacs 20.3
* sysdeps/daemon: New directory.
* configure.in (LIBGTOP_LIBS, LIBGTOP_GUILE_LIBS): Added
`$X_LIBS -lXau' when we have xauth.
* acconfig.h (HAVE_XAUTH): New tag.
* configure.in: Added check for `HAVE_XAUTH'.
* sysdeps/common/error.c (glibtop_warn_r): New function -
same as `glibtop_error_r', but doesn't call `exit'.
(glibtop_error_io_r, glibtop_warn_io_r): New functions,
display `strerror (errno)' together with message.
* include/glibtop/global.h (TIME_WITH_SYS_TIME): including
correct headers; (HAVE_UNISTD_H): Added conditional.
Added `#include <sys/param.h>' and `#include <sys/stat.h>'.
* acconfig.h (HAVE_LINUX_TABLE): New tag.
* lib/lib.awk: New file.

View File

@@ -22,6 +22,9 @@ release:
confexecdir=$(libdir)
confexec_DATA = $(top_builddir)/libgtopConf.sh
noinst_DATA = $(top_builddir)/perl/Makefile.PL \
$(top_builddir)/perl/Libgtop.xs
## to automatically rebuild aclocal.m4 if any of the macros in
## `macros/' change
@MAINT@include macros/macros.dep
@@ -51,3 +54,27 @@ libgtopConf.sh: libgtopConf.sh.in Makefile
-e 's,\@libgtop_want_examples\@,$(libgtop_want_examples),g' \
< $(srcdir)/libgtopConf.sh.in > libgtopConf.tmp \
&& mv libgtopConf.tmp libgtopConf.sh
perl/Makefile.PL: perl/Makefile.PL.in Makefile
## Use sed and then mv to avoid problems if the user interrupts.
sed -e 's,\@LIBGTOP_LIBDIR\@,$(libdir),g' \
-e 's,\@LIBGTOP_INCLUDEDIR\@,$(includedir),g' \
-e 's,\@LIBGTOP_LIBS\@,$(LIBGTOP_LIBS),g' \
-e 's,\@LIBGTOP_INCS\@,$(LIBGTOP_INCS),g' \
-e 's,\@LIBGTOP_GUILE_LIBS\@,$(LIBGTOP_GUILE_LIBS),g' \
-e 's,\@LIBGTOP_GUILE_INCS\@,$(LIBGTOP_GUILE_INCS),g' \
-e 's,\@LIBGTOP_BINDIR\@,$(LIBGTOP_BINDIR),g' \
-e 's,\@LIBGTOP_SERVER\@,$(LIBGTOP_SERVER),g' \
-e 's,\@libgtop_sysdeps_dir\@,$(libgtop_sysdeps_dir),g' \
-e 's,\@libgtop_need_server\@,$(libgtop_need_server),g' \
-e 's,\@libgtop_use_machine_h\@,$(libgtop_use_machine_h),g' \
-e 's,\@libgtop_guile_found\@,$(libgtop_guile_found),g' \
-e 's,\@libgtop_want_names\@,$(libgtop_want_names),g' \
-e 's,\@libgtop_want_guile_names\@,$(libgtop_want_guile_names),g' \
-e 's,\@libgtop_want_examples\@,$(libgtop_want_examples),g' \
< $(srcdir)/perl/Makefile.PL.in > perl/Makefile.tmp \
&& mv perl/Makefile.tmp perl/Makefile.PL
perl/Libgtop.xs: perl/perl.awk $(top_builddir)/config.h $(top_srcdir)/features.def
$(AWK) -f $(top_srcdir)/perl/perl.awk < $(top_srcdir)/features.def > perl/lgt-t
mv perl/lgt-t perl/Libgtop.xs

View File

@@ -35,3 +35,5 @@
#undef NEED_LIBGTOP
#undef HAVE_LINUX_TABLE
#undef HAVE_XAUTH

View File

@@ -6,6 +6,8 @@ AC_INIT(copyright.txt)
AM_CONFIG_HEADER(config.h)
AC_CANONICAL_SYSTEM
AM_INIT_AUTOMAKE(libgtop, 0.01)
AM_ACLOCAL_INCLUDE(macros)
AC_ISC_POSIX
@@ -13,6 +15,8 @@ AC_PROG_CC
AC_STDC_HEADERS
AC_ARG_PROGRAM
AC_PROG_AWK
AC_CHECK_TOOL(CC,gcc)
AC_CHECK_TOOL(RANLIB,ranlib)
AC_CHECK_TOOL(AS,as)
@@ -30,8 +34,6 @@ export cross_compiling
AM_PROG_LIBTOOL
AM_INIT_AUTOMAKE(libgtop, 0.01)
dnl If you want to use libgtop without gnome, comment the following line out.
GNOME_INIT_HOOK(gnome_found=yes)
@@ -100,6 +102,30 @@ AC_CHECK_FUNCS(getcwd gettimeofday getwd putenv strdup strtoul uname)
ALL_LINGUAS="fr"
AM_GNU_GETTEXT
AC_PATH_XTRA
dnl The construct foo=`echo $w1 $w2 $w3` fails on some systems if $w1 = -e or -n
dnl So we use the following instead.
dnl XE_SPACE(var, words)
define([XE_SPACE],[
T=""
for W in $2; do if test -z "$T"; then T="$W"; else T="$T $W"; fi; done
$1="$T"
])dnl
dnl Autodetect Xauth
dnl -lXau is only used by gnuclient, so use a special variable for Xauth X libs
test -z "$with_xauth" && test "$window_system" = "none" && with_xauth=no
test -z "$with_xauth" && { AC_CHECK_HEADER(X11/Xauth.h, ,with_xauth=no) }
test -z "$with_xauth" && { AC_CHECK_LIB(Xau, XauGetAuthByAddr,[:],with_xauth=no, $X_LIBS) }
test -z "$with_xauth" && with_xauth=yes
if test "$with_xauth" = "yes"; then
AC_DEFINE(HAVE_XAUTH)
XE_SPACE(libs_xauth, $X_LIBS -lXau)
fi
AC_SUBST(libs_xauth)
CFLAGS="$CFLAGS -D_IN_LIBGTOP"
AC_SUBST(CFLAGS)
@@ -128,7 +154,7 @@ AC_SUBST(LIBSUPPORT)
AC_SUBST(SUPPORTINCS)
dnl These definitions are expanded in make.
LIBGTOP_LIBS='-L$(libdir)'
LIBGTOP_LIBS='-L$(libdir) -lgtop'
LIBGTOP_INCS='-I$(includedir)'
LIBGTOP_GUILE_LIBS="$LIBGTOP_LIBS"
LIBGTOP_GUILE_INCS="$LIBGTOP_INCS"
@@ -160,8 +186,8 @@ fi
AC_SUBST(libgtop_want_guile_names)
LIBGTOP_LIBS="$LIBGTOP_LIBS -lgtop_common"
LIBGTOP_GUILE_LIBS="$LIBGTOP_GUILE_LIBS -lgtop_common"
LIBGTOP_LIBS="$LIBGTOP_LIBS -lgtop_common $libs_xauth"
LIBGTOP_GUILE_LIBS="$LIBGTOP_GUILE_LIBS -lgtop_common $libs_xauth"
if test "x$need_server" = "xyes" ; then
LIBGTOP_LIBS="$LIBGTOP_LIBS -lgtop"
@@ -219,6 +245,7 @@ sysdeps/kernel/Makefile
src/Makefile
src/server/Makefile
src/proxy/Makefile
src/daemon/Makefile
lib/Makefile
examples/Makefile
support/Makefile

View File

@@ -16,20 +16,20 @@ bin_PROGRAMS = first first_static second second_static \
EXTRA_PROGRAMS = third third_static
first_SOURCES = first.c
first_LDADD = $(top_builddir)/sysdeps/common/libgtop_common.la \
$(top_builddir)/lib/libgtop.la \
first_LDADD = $(top_builddir)/lib/libgtop.la \
$(top_builddir)/sysdeps/common/libgtop_common.la \
$(top_builddir)/sysdeps/@sysdeps_dir@/libgtop_sysdeps.la \
@INTLLIBS@ @LIBSUPPORT@
@INTLLIBS@ @LIBSUPPORT@ @libs_xauth@
first_static_SOURCES = $(first_SOURCES)
first_static_LDADD = $(first_LDADD)
first_static_LDFLAGS = -static
second_SOURCES = second.c
second_LDADD = $(top_builddir)/sysdeps/common/libgtop_common.la \
$(top_builddir)/lib/libgtop.la \
second_LDADD = $(top_builddir)/lib/libgtop.la \
$(top_builddir)/sysdeps/common/libgtop_common.la \
$(top_builddir)/sysdeps/@sysdeps_dir@/libgtop_sysdeps.la \
@INTLLIBS@ @LIBSUPPORT@
@INTLLIBS@ @LIBSUPPORT@ @libs_xauth@
second_static_SOURCES = $(second_SOURCES)
second_static_LDADD = $(second_LDADD)
@@ -46,7 +46,7 @@ third_LDADD = $(top_builddir)/sysdeps/guile/libgtop_guile.la \
$(top_builddir)/lib/libgtop.la \
$(top_builddir)/sysdeps/common/libgtop_common.la \
$(top_builddir)/sysdeps/@sysdeps_dir@/libgtop_sysdeps.la \
@GUILE_LIBS@ @INTLLIBS@ @LIBSUPPORT@
@GUILE_LIBS@ @INTLLIBS@ @LIBSUPPORT@ @libs_xauth@
third_static_SOURCES = $(third_SOURCES)
third_static_LDADD = $(third_LDADD)

View File

@@ -26,6 +26,8 @@
#include <glibtop/close.h>
#include <glibtop/xmalloc.h>
#include <glibtop/parameter.h>
#include <glibtop/union.h>
#include <glibtop/sysdeps.h>
@@ -38,7 +40,8 @@ main (int argc, char *argv [])
{
glibtop_union data;
glibtop_sysdeps sysdeps;
unsigned c, count, i, *ptr;
unsigned c, method, count, port, i, *ptr;
char buffer [BUFSIZ];
pid_t pid, ppid;
count = PROFILE_COUNT;
@@ -47,98 +50,114 @@ main (int argc, char *argv [])
bindtextdomain (PACKAGE, GTOPLOCALEDIR);
textdomain (PACKAGE);
glibtop_init ();
glibtop_init_r (&glibtop_global_server, 0, GLIBTOP_INIT_NO_OPEN);
glibtop_get_parameter (GLIBTOP_PARAM_METHOD, &method, sizeof (method));
printf ("Method = %d\n", method);
count = glibtop_get_parameter (GLIBTOP_PARAM_COMMAND, buffer, BUFSIZ);
buffer [count] = 0;
printf ("Command = '%s'\n", buffer);
count = glibtop_get_parameter (GLIBTOP_PARAM_HOST, buffer, BUFSIZ);
buffer [count] = 0;
glibtop_get_parameter (GLIBTOP_PARAM_PORT, &port, sizeof (port));
printf ("Host = '%s' - %u\n\n", buffer, port);
for (c = 0; c < count; c++)
glibtop_get_cpu (&data.cpu);
fprintf (stderr, "CPU (0x%08lx): %lu, %lu, %lu, %lu, %lu, %lu\n",
data.cpu.flags, data.cpu.total, data.cpu.user, data.cpu.nice,
data.cpu.sys, data.cpu.idle, data.cpu.frequency);
printf ("CPU (0x%08lx): %lu, %lu, %lu, %lu, %lu, %lu\n",
data.cpu.flags, data.cpu.total, data.cpu.user, data.cpu.nice,
data.cpu.sys, data.cpu.idle, data.cpu.frequency);
for (c = 0; c < count; c++)
glibtop_get_mem (&data.mem);
fprintf (stderr, "Memory (0x%08lx): %lu, %lu, %lu, %lu, %lu, %lu, %lu, %lu\n",
data.mem.flags, data.mem.total, data.mem.used, data.mem.free,
data.mem.shared, data.mem.buffer, data.mem.cached,
data.mem.user, data.mem.locked);
printf ("Memory (0x%08lx): %lu, %lu, %lu, %lu, %lu, %lu, %lu, %lu\n",
data.mem.flags, data.mem.total, data.mem.used, data.mem.free,
data.mem.shared, data.mem.buffer, data.mem.cached,
data.mem.user, data.mem.locked);
for (c = 0; c < count; c++)
glibtop_get_swap (&data.swap);
fprintf (stderr, "Swap (0x%08lx): %lu, %lu, %lu\n", data.swap.flags,
data.swap.total, data.swap.used, data.swap.free);
printf ("Swap (0x%08lx): %lu, %lu, %lu\n", data.swap.flags,
data.swap.total, data.swap.used, data.swap.free);
for (c = 0; c < count; c++)
glibtop_get_uptime (&data.uptime);
fprintf (stderr, "Uptime (0x%08lx): %f, %f\n", data.uptime.flags,
data.uptime.uptime, data.uptime.idletime);
printf ("Uptime (0x%08lx): %f, %f\n", data.uptime.flags,
data.uptime.uptime, data.uptime.idletime);
for (c = 0; c < count; c++)
glibtop_get_loadavg (&data.loadavg);
fprintf (stderr, "Loadavg (0x%08lx): %f, %f, %f\n", data.loadavg.flags,
data.loadavg.loadavg [0], data.loadavg.loadavg [1],
data.loadavg.loadavg [2]);
printf ("Loadavg (0x%08lx): %f, %f, %f\n", data.loadavg.flags,
data.loadavg.loadavg [0], data.loadavg.loadavg [1],
data.loadavg.loadavg [2]);
for (c = 0; c < count; c++)
glibtop_get_shm_limits (&data.shm_limits);
fprintf (stderr, "Shm Limits (0x%08lx): %ld, %ld, %ld, %ld, %ld\n",
data.shm_limits.flags, data.shm_limits.shmmax,
data.shm_limits.shmmin, data.shm_limits.shmmni,
data.shm_limits.shmseg, data.shm_limits.shmall);
printf ("Shm Limits (0x%08lx): %ld, %ld, %ld, %ld, %ld\n",
data.shm_limits.flags, data.shm_limits.shmmax,
data.shm_limits.shmmin, data.shm_limits.shmmni,
data.shm_limits.shmseg, data.shm_limits.shmall);
for (c = 0; c < count; c++)
glibtop_get_msg_limits (&data.msg_limits);
fprintf (stderr, "Msg Limits (0x%08lx): %ld, %ld, %ld, %ld, %ld, %ld, %ld\n",
data.msg_limits.flags, data.msg_limits.msgpool,
data.msg_limits.msgmap, data.msg_limits.msgmax,
data.msg_limits.msgmnb, data.msg_limits.msgmni,
data.msg_limits.msgssz, data.msg_limits.msgtql);
printf ("Msg Limits (0x%08lx): %ld, %ld, %ld, %ld, %ld, %ld, %ld\n",
data.msg_limits.flags, data.msg_limits.msgpool,
data.msg_limits.msgmap, data.msg_limits.msgmax,
data.msg_limits.msgmnb, data.msg_limits.msgmni,
data.msg_limits.msgssz, data.msg_limits.msgtql);
for (c = 0; c < count; c++)
glibtop_get_sem_limits (&data.sem_limits);
fprintf (stderr, "Sem Limits (0x%08lx): "
"%ld, %ld, %ld, %ld, %ld, %ld, %ld, %ld, %ld, %ld\n",
data.sem_limits.flags, data.sem_limits.semmap,
data.sem_limits.semmni, data.sem_limits.semmns,
data.sem_limits.semmnu, data.sem_limits.semmsl,
data.sem_limits.semopm, data.sem_limits.semume,
data.sem_limits.semusz, data.sem_limits.semvmx,
data.sem_limits.semaem);
printf ("Sem Limits (0x%08lx): "
"%ld, %ld, %ld, %ld, %ld, %ld, %ld, %ld, %ld, %ld\n",
data.sem_limits.flags, data.sem_limits.semmap,
data.sem_limits.semmni, data.sem_limits.semmns,
data.sem_limits.semmnu, data.sem_limits.semmsl,
data.sem_limits.semopm, data.sem_limits.semume,
data.sem_limits.semusz, data.sem_limits.semvmx,
data.sem_limits.semaem);
fprintf (stderr, "\n");
printf ("\n");
glibtop_get_sysdeps (&sysdeps);
fprintf (stderr, "Sysdeps (0x%08lx): %lu, %lu, %lu, %lu, %lu, "
"%lu, %lu, %lu, %lu, %lu, %lu, %lu, %lu, %lu, %lu, %lu\n",
sysdeps.flags, sysdeps.cpu, sysdeps.mem, sysdeps.swap,
sysdeps.uptime, sysdeps.loadavg, sysdeps.shm_limits,
sysdeps.msg_limits, sysdeps.sem_limits,
sysdeps.proclist, sysdeps.proc_state,
sysdeps.proc_uid, sysdeps.proc_mem,
sysdeps.proc_time, sysdeps.proc_signal,
sysdeps.proc_kernel, sysdeps.proc_segment);
printf ("Sysdeps (0x%08lx): %lu, %lu, %lu, %lu, %lu, "
"%lu, %lu, %lu, %lu, %lu, %lu, %lu, %lu, %lu, %lu, %lu\n",
sysdeps.flags, sysdeps.cpu, sysdeps.mem, sysdeps.swap,
sysdeps.uptime, sysdeps.loadavg, sysdeps.shm_limits,
sysdeps.msg_limits, sysdeps.sem_limits,
sysdeps.proclist, sysdeps.proc_state,
sysdeps.proc_uid, sysdeps.proc_mem,
sysdeps.proc_time, sysdeps.proc_signal,
sysdeps.proc_kernel, sysdeps.proc_segment);
fprintf (stderr, "\n");
printf ("\n");
ptr = glibtop_get_proclist (&data.proclist);
fprintf (stderr, "Proclist (0x%08lx): %ld, %ld, %ld\n",
data.proclist.flags, data.proclist.number,
data.proclist.size, data.proclist.total);
printf ("Proclist (0x%08lx): %ld, %ld, %ld\n",
data.proclist.flags, data.proclist.number,
data.proclist.size, data.proclist.total);
if (ptr) {
fprintf (stderr, "\nProcess: ");
printf ("\nProcess: ");
for (i = 0; i < data.proclist.number; i++)
fprintf (stderr, "%s%u", i ? ", " : "", ptr [i]);
fprintf (stderr, "\n");
printf ("%s%u", i ? ", " : "", ptr [i]);
printf ("\n");
}
glibtop_free (ptr);
@@ -146,218 +165,218 @@ main (int argc, char *argv [])
pid = getpid ();
ppid = getppid ();
fprintf (stderr, "\n");
printf ("\n");
for (c = 0; c < count; c++)
glibtop_get_proc_state (&data.proc_state, pid);
fprintf (stderr, "Proc_State PID %5u (0x%08lx): '%s', %c, %u, %u\n",
pid, data.proc_state.flags, data.proc_state.cmd,
data.proc_state.state, data.proc_state.uid,
data.proc_state.gid);
printf ("Proc_State PID %5u (0x%08lx): '%s', %c, %u, %u\n",
pid, data.proc_state.flags, data.proc_state.cmd,
data.proc_state.state, data.proc_state.uid,
data.proc_state.gid);
for (c = 0; c < count; c++)
glibtop_get_proc_uid (&data.proc_uid, pid);
fprintf (stderr, "Proc_Uid PID %5u (0x%08lx): "
"%d %d %d %d %d %d %d %d %d %d %d %d\n",
pid, data.proc_uid.flags, data.proc_uid.uid,
data.proc_uid.euid, data.proc_uid.gid,
data.proc_uid.egid, data.proc_uid.pid,
data.proc_uid.ppid, data.proc_uid.pgrp,
data.proc_uid.session, data.proc_uid.tty,
data.proc_uid.tpgid, data.proc_uid.priority,
data.proc_uid.nice);
printf ("Proc_Uid PID %5u (0x%08lx): "
"%d %d %d %d %d %d %d %d %d %d %d %d\n",
pid, data.proc_uid.flags, data.proc_uid.uid,
data.proc_uid.euid, data.proc_uid.gid,
data.proc_uid.egid, data.proc_uid.pid,
data.proc_uid.ppid, data.proc_uid.pgrp,
data.proc_uid.session, data.proc_uid.tty,
data.proc_uid.tpgid, data.proc_uid.priority,
data.proc_uid.nice);
for (c = 0; c < count; c++)
glibtop_get_proc_mem (&data.proc_mem, pid);
fprintf (stderr, "Proc_Mem PID %5u (0x%08lx): "
"%ld %ld %ld %ld %ld %ld\n", pid, data.proc_mem.flags,
data.proc_mem.size, data.proc_mem.vsize,
data.proc_mem.resident, data.proc_mem.share,
data.proc_mem.rss, data.proc_mem.rss_rlim);
printf ("Proc_Mem PID %5u (0x%08lx): "
"%ld %ld %ld %ld %ld %ld\n", pid, data.proc_mem.flags,
data.proc_mem.size, data.proc_mem.vsize,
data.proc_mem.resident, data.proc_mem.share,
data.proc_mem.rss, data.proc_mem.rss_rlim);
for (c = 0; c < count; c++)
glibtop_get_proc_time (&data.proc_time, pid);
fprintf (stderr, "Proc_Time PID %5u (0x%08lx): "
"%ld %ld %ld %ld %ld %ld %ld\n", pid, data.proc_time.flags,
data.proc_time.start_time, data.proc_time.utime,
data.proc_time.stime, data.proc_time.cutime,
data.proc_time.cstime, data.proc_time.timeout,
data.proc_time.it_real_value);
printf ("Proc_Time PID %5u (0x%08lx): "
"%ld %ld %ld %ld %ld %ld %ld\n", pid, data.proc_time.flags,
data.proc_time.start_time, data.proc_time.utime,
data.proc_time.stime, data.proc_time.cutime,
data.proc_time.cstime, data.proc_time.timeout,
data.proc_time.it_real_value);
for (c = 0; c < count; c++)
glibtop_get_proc_signal (&data.proc_signal, pid);
fprintf (stderr, "Proc_Signal PID %5u (0x%08lx): "
"%d %d %d %d\n", pid, data.proc_signal.flags,
data.proc_signal.signal, data.proc_signal.blocked,
data.proc_signal.sigignore, data.proc_signal.sigcatch);
printf ("Proc_Signal PID %5u (0x%08lx): "
"%d %d %d %d\n", pid, data.proc_signal.flags,
data.proc_signal.signal, data.proc_signal.blocked,
data.proc_signal.sigignore, data.proc_signal.sigcatch);
for (c = 0; c < count; c++)
glibtop_get_proc_kernel (&data.proc_kernel, pid);
fprintf (stderr, "Proc_Kernel PID %5u (0x%08lx): "
"%lu %lu %lu %lu %lu %lu %lu %lu\n", pid,
data.proc_kernel.flags, data.proc_kernel.k_flags,
data.proc_kernel.min_flt, data.proc_kernel.maj_flt,
data.proc_kernel.cmin_flt, data.proc_kernel.cmaj_flt,
data.proc_kernel.kstk_esp, data.proc_kernel.kstk_eip,
data.proc_kernel.wchan);
printf ("Proc_Kernel PID %5u (0x%08lx): "
"%lu %lu %lu %lu %lu %lu %lu %lu\n", pid,
data.proc_kernel.flags, data.proc_kernel.k_flags,
data.proc_kernel.min_flt, data.proc_kernel.maj_flt,
data.proc_kernel.cmin_flt, data.proc_kernel.cmaj_flt,
data.proc_kernel.kstk_esp, data.proc_kernel.kstk_eip,
data.proc_kernel.wchan);
for (c = 0; c < count; c++)
glibtop_get_proc_segment (&data.proc_segment, pid);
fprintf (stderr, "Proc_Segment PID %5u (0x%08lx): "
"%ld %ld %ld %ld %lu %lu %lu\n", pid, data.proc_segment.flags,
data.proc_segment.trs, data.proc_segment.lrs,
data.proc_segment.drs, data.proc_segment.dt,
data.proc_segment.start_code, data.proc_segment.end_code,
data.proc_segment.start_stack);
printf ("Proc_Segment PID %5u (0x%08lx): "
"%ld %ld %ld %ld %lu %lu %lu\n", pid, data.proc_segment.flags,
data.proc_segment.trs, data.proc_segment.lrs,
data.proc_segment.drs, data.proc_segment.dt,
data.proc_segment.start_code, data.proc_segment.end_code,
data.proc_segment.start_stack);
fprintf (stderr, "\n");
printf ("\n");
for (c = 0; c < count; c++)
glibtop_get_proc_state (&data.proc_state, ppid);
fprintf (stderr, "Proc_State PPID %5u (0x%08lx): '%s', %c, %u, %u\n",
ppid, data.proc_state.flags, data.proc_state.cmd,
data.proc_state.state, data.proc_state.uid,
data.proc_state.gid);
printf ("Proc_State PPID %5u (0x%08lx): '%s', %c, %u, %u\n",
ppid, data.proc_state.flags, data.proc_state.cmd,
data.proc_state.state, data.proc_state.uid,
data.proc_state.gid);
for (c = 0; c < count; c++)
glibtop_get_proc_uid (&data.proc_uid, ppid);
fprintf (stderr, "Proc_Uid PPID %5u (0x%08lx): "
"%d %d %d %d %d %d %d %d %d %d %d %d\n",
ppid, data.proc_uid.flags, data.proc_uid.uid,
data.proc_uid.euid, data.proc_uid.gid,
data.proc_uid.egid, data.proc_uid.pid,
data.proc_uid.ppid, data.proc_uid.pgrp,
data.proc_uid.session, data.proc_uid.tty,
data.proc_uid.tpgid, data.proc_uid.priority,
data.proc_uid.nice);
printf ("Proc_Uid PPID %5u (0x%08lx): "
"%d %d %d %d %d %d %d %d %d %d %d %d\n",
ppid, data.proc_uid.flags, data.proc_uid.uid,
data.proc_uid.euid, data.proc_uid.gid,
data.proc_uid.egid, data.proc_uid.pid,
data.proc_uid.ppid, data.proc_uid.pgrp,
data.proc_uid.session, data.proc_uid.tty,
data.proc_uid.tpgid, data.proc_uid.priority,
data.proc_uid.nice);
for (c = 0; c < count; c++)
glibtop_get_proc_mem (&data.proc_mem, ppid);
fprintf (stderr, "Proc_Mem PPID %5u (0x%08lx): "
"%ld %ld %ld %ld %ld %ld\n", ppid, data.proc_mem.flags,
data.proc_mem.size, data.proc_mem.vsize,
data.proc_mem.resident, data.proc_mem.share,
data.proc_mem.rss, data.proc_mem.rss_rlim);
printf ("Proc_Mem PPID %5u (0x%08lx): "
"%ld %ld %ld %ld %ld %ld\n", ppid, data.proc_mem.flags,
data.proc_mem.size, data.proc_mem.vsize,
data.proc_mem.resident, data.proc_mem.share,
data.proc_mem.rss, data.proc_mem.rss_rlim);
for (c = 0; c < count; c++)
glibtop_get_proc_time (&data.proc_time, ppid);
fprintf (stderr, "Proc_Time PPID %5u (0x%08lx): "
"%ld %ld %ld %ld %ld %ld %ld\n", ppid, data.proc_time.flags,
data.proc_time.start_time, data.proc_time.utime,
data.proc_time.stime, data.proc_time.cutime,
data.proc_time.cstime, data.proc_time.timeout,
data.proc_time.it_real_value);
printf ("Proc_Time PPID %5u (0x%08lx): "
"%ld %ld %ld %ld %ld %ld %ld\n", ppid, data.proc_time.flags,
data.proc_time.start_time, data.proc_time.utime,
data.proc_time.stime, data.proc_time.cutime,
data.proc_time.cstime, data.proc_time.timeout,
data.proc_time.it_real_value);
for (c = 0; c < count; c++)
glibtop_get_proc_signal (&data.proc_signal, ppid);
fprintf (stderr, "Proc_Signal PPID %5u (0x%08lx): "
"%d %d %d %d\n", ppid, data.proc_signal.flags,
data.proc_signal.signal, data.proc_signal.blocked,
data.proc_signal.sigignore, data.proc_signal.sigcatch);
printf ("Proc_Signal PPID %5u (0x%08lx): "
"%d %d %d %d\n", ppid, data.proc_signal.flags,
data.proc_signal.signal, data.proc_signal.blocked,
data.proc_signal.sigignore, data.proc_signal.sigcatch);
for (c = 0; c < count; c++)
glibtop_get_proc_kernel (&data.proc_kernel, ppid);
fprintf (stderr, "Proc_Kernel PPID %5u (0x%08lx): "
"%lu %lu %lu %lu %lu %lu %lu %lu\n", ppid,
data.proc_kernel.flags, data.proc_kernel.k_flags,
data.proc_kernel.min_flt, data.proc_kernel.maj_flt,
data.proc_kernel.cmin_flt, data.proc_kernel.cmaj_flt,
data.proc_kernel.kstk_esp, data.proc_kernel.kstk_eip,
data.proc_kernel.wchan);
printf ("Proc_Kernel PPID %5u (0x%08lx): "
"%lu %lu %lu %lu %lu %lu %lu %lu\n", ppid,
data.proc_kernel.flags, data.proc_kernel.k_flags,
data.proc_kernel.min_flt, data.proc_kernel.maj_flt,
data.proc_kernel.cmin_flt, data.proc_kernel.cmaj_flt,
data.proc_kernel.kstk_esp, data.proc_kernel.kstk_eip,
data.proc_kernel.wchan);
for (c = 0; c < count; c++)
glibtop_get_proc_segment (&data.proc_segment, ppid);
fprintf (stderr, "Proc_Segment PPID %5u (0x%08lx): "
"%ld %ld %ld %ld %lu %lu %lu\n", ppid, data.proc_segment.flags,
data.proc_segment.trs, data.proc_segment.lrs,
data.proc_segment.drs, data.proc_segment.dt,
data.proc_segment.start_code, data.proc_segment.end_code,
data.proc_segment.start_stack);
printf ("Proc_Segment PPID %5u (0x%08lx): "
"%ld %ld %ld %ld %lu %lu %lu\n", ppid, data.proc_segment.flags,
data.proc_segment.trs, data.proc_segment.lrs,
data.proc_segment.drs, data.proc_segment.dt,
data.proc_segment.start_code, data.proc_segment.end_code,
data.proc_segment.start_stack);
fprintf (stderr, "\n");
printf ("\n");
for (c = 0; c < count; c++)
glibtop_get_proc_state (&data.proc_state, 1);
fprintf (stderr, "Proc_State INIT %5u (0x%08lx): '%s', %c, %u, %u\n",
1, data.proc_state.flags, data.proc_state.cmd,
data.proc_state.state, data.proc_state.uid,
data.proc_state.gid);
printf ("Proc_State INIT %5u (0x%08lx): '%s', %c, %u, %u\n",
1, data.proc_state.flags, data.proc_state.cmd,
data.proc_state.state, data.proc_state.uid,
data.proc_state.gid);
for (c = 0; c < count; c++)
glibtop_get_proc_uid (&data.proc_uid, 1);
fprintf (stderr, "Proc_Uid INIT %5u (0x%08lx): "
"%d %d %d %d %d %d %d %d %d %d %d %d\n",
1, data.proc_uid.flags, data.proc_uid.uid,
data.proc_uid.euid, data.proc_uid.gid,
data.proc_uid.egid, data.proc_uid.pid,
data.proc_uid.ppid, data.proc_uid.pgrp,
data.proc_uid.session, data.proc_uid.tty,
data.proc_uid.tpgid, data.proc_uid.priority,
data.proc_uid.nice);
printf ("Proc_Uid INIT %5u (0x%08lx): "
"%d %d %d %d %d %d %d %d %d %d %d %d\n",
1, data.proc_uid.flags, data.proc_uid.uid,
data.proc_uid.euid, data.proc_uid.gid,
data.proc_uid.egid, data.proc_uid.pid,
data.proc_uid.ppid, data.proc_uid.pgrp,
data.proc_uid.session, data.proc_uid.tty,
data.proc_uid.tpgid, data.proc_uid.priority,
data.proc_uid.nice);
for (c = 0; c < count; c++)
glibtop_get_proc_mem (&data.proc_mem, 1);
fprintf (stderr, "Proc_Mem INIT %5u (0x%08lx): "
"%ld %ld %ld %ld %ld %ld\n", 1, data.proc_mem.flags,
data.proc_mem.size, data.proc_mem.vsize,
data.proc_mem.resident, data.proc_mem.share,
data.proc_mem.rss, data.proc_mem.rss_rlim);
printf ("Proc_Mem INIT %5u (0x%08lx): "
"%ld %ld %ld %ld %ld %ld\n", 1, data.proc_mem.flags,
data.proc_mem.size, data.proc_mem.vsize,
data.proc_mem.resident, data.proc_mem.share,
data.proc_mem.rss, data.proc_mem.rss_rlim);
for (c = 0; c < count; c++)
glibtop_get_proc_time (&data.proc_time, 1);
fprintf (stderr, "Proc_Time INIT %5u (0x%08lx): "
"%ld %ld %ld %ld %ld %ld %ld\n", 1, data.proc_time.flags,
data.proc_time.start_time, data.proc_time.utime,
data.proc_time.stime, data.proc_time.cutime,
data.proc_time.cstime, data.proc_time.timeout,
data.proc_time.it_real_value);
printf ("Proc_Time INIT %5u (0x%08lx): "
"%ld %ld %ld %ld %ld %ld %ld\n", 1, data.proc_time.flags,
data.proc_time.start_time, data.proc_time.utime,
data.proc_time.stime, data.proc_time.cutime,
data.proc_time.cstime, data.proc_time.timeout,
data.proc_time.it_real_value);
for (c = 0; c < count; c++)
glibtop_get_proc_signal (&data.proc_signal, 1);
fprintf (stderr, "Proc_Signal INIT %5u (0x%08lx): "
"%d %d %d %d\n", 1, data.proc_signal.flags,
data.proc_signal.signal, data.proc_signal.blocked,
data.proc_signal.sigignore, data.proc_signal.sigcatch);
printf ("Proc_Signal INIT %5u (0x%08lx): "
"%d %d %d %d\n", 1, data.proc_signal.flags,
data.proc_signal.signal, data.proc_signal.blocked,
data.proc_signal.sigignore, data.proc_signal.sigcatch);
for (c = 0; c < count; c++)
glibtop_get_proc_kernel (&data.proc_kernel, 1);
fprintf (stderr, "Proc_Kernel INIT %5u (0x%08lx): "
"%lu %lu %lu %lu %lu %lu %lu %lu\n", 1,
data.proc_kernel.flags, data.proc_kernel.k_flags,
data.proc_kernel.min_flt, data.proc_kernel.maj_flt,
data.proc_kernel.cmin_flt, data.proc_kernel.cmaj_flt,
data.proc_kernel.kstk_esp, data.proc_kernel.kstk_eip,
data.proc_kernel.wchan);
printf ("Proc_Kernel INIT %5u (0x%08lx): "
"%lu %lu %lu %lu %lu %lu %lu %lu\n", 1,
data.proc_kernel.flags, data.proc_kernel.k_flags,
data.proc_kernel.min_flt, data.proc_kernel.maj_flt,
data.proc_kernel.cmin_flt, data.proc_kernel.cmaj_flt,
data.proc_kernel.kstk_esp, data.proc_kernel.kstk_eip,
data.proc_kernel.wchan);
for (c = 0; c < count; c++)
glibtop_get_proc_segment (&data.proc_segment, 1);
fprintf (stderr, "Proc_Segment INIT %5u (0x%08lx): "
"%ld %ld %ld %ld %lu %lu %lu\n", 1, data.proc_segment.flags,
data.proc_segment.trs, data.proc_segment.lrs,
data.proc_segment.drs, data.proc_segment.dt,
data.proc_segment.start_code, data.proc_segment.end_code,
data.proc_segment.start_stack);
printf ("Proc_Segment INIT %5u (0x%08lx): "
"%ld %ld %ld %ld %lu %lu %lu\n", 1, data.proc_segment.flags,
data.proc_segment.trs, data.proc_segment.lrs,
data.proc_segment.drs, data.proc_segment.dt,
data.proc_segment.start_code, data.proc_segment.end_code,
data.proc_segment.start_stack);
exit (0);
}

View File

@@ -35,12 +35,14 @@ typedef struct _glibtop glibtop;
struct _glibtop
{
int fd; /* Server file descriptor */
unsigned flags;
unsigned method; /* Server Method */
#ifdef HAVE_GLIBTOP_MACHINE_H
glibtop_machine machine; /* Machine dependent data */
#endif
int input [2]; /* Pipe client <- server */
int output [2]; /* Pipe client -> server */
int socket; /* Accepted connection of a socket */
unsigned long os_version_code; /* Version code of the operating system */
const char *name; /* Program name for error messages */
const char *server_command; /* Command used to invoke server */
@@ -48,6 +50,7 @@ struct _glibtop
const char *server_user; /* Name of the user on the target host */
const char *server_rsh; /* Command used to connect to the target host */
unsigned long features; /* Server is required for this features */
unsigned long server_port; /* Port on which daemon is listening */
pid_t pid; /* PID of the server */
};

View File

@@ -5,4 +5,5 @@ glibtop_HEADERS = close.h loadavg.h prockernel.h procstate.h \
proctime.h shm_limits.h version.h cpu.h msg_limits.h \
procmem.h procuid.h swap.h write.h error.h open.h \
procsegment.h read.h sysdeps.h xmalloc.h global.h \
output.h procsignal.h read_data.h union.h
output.h procsignal.h read_data.h union.h types.h \
parameter.h

View File

@@ -50,13 +50,30 @@ __BEGIN_DECLS
#define GLIBTOP_MAX_CMND 18
typedef struct _glibtop_command glibtop_command;
#define _GLIBTOP_PARAM_SIZE 16
typedef struct _glibtop_command glibtop_command;
typedef struct _glibtop_response glibtop_response;
struct _glibtop_command
{
glibtop server;
unsigned command;
size_t size;
glibtop server;
unsigned command;
size_t size, data_size;
char parameter [_GLIBTOP_PARAM_SIZE];
};
union _glibtop_response_union
{
glibtop_union data;
glibtop_sysdeps sysdeps;
};
struct _glibtop_response
{
off_t offset;
size_t size, data_size;
union _glibtop_response_union u;
};
#define glibtop_call(p1, p2, p3, p4) glibtop_call_r(glibtop_global_server, p1, p2, p3, p4)

View File

@@ -27,8 +27,16 @@
__BEGIN_DECLS
#define glibtop_error(p1, args...) glibtop_error_r(glibtop_global_server , p1 , ## args)
#define glibtop_warn(p1, args...) glibtop_warn_r(glibtop_global_server , p1 , ## args)
#define glibtop_error_io(p1, args...) glibtop_error_io_r(glibtop_global_server , p1 , ## args)
#define glibtop_warn_io(p1, args...) glibtop_warn_io_r(glibtop_global_server , p1 , ## args)
extern void glibtop_error_r __P((glibtop *, char *, ...));
extern void glibtop_warn_r __P((glibtop *, char *, ...));
extern void glibtop_error_io_r __P((glibtop *, char *, ...));
extern void glibtop_warn_io_r __P((glibtop *, char *, ...));
__END_DECLS

View File

@@ -51,6 +51,22 @@
# define __P(protos) ()
#endif
#if TIME_WITH_SYS_TIME
# include <sys/time.h>
# include <time.h>
#else
# if HAVE_SYS_TIME_H
# include <sys/time.h>
# else
# include <time.h>
# endif
#endif
#ifdef WITHOUT_GUILE
#undef HAVE_GUILE
#undef GLIBTOP_GUILE_NAMES
#endif
#ifdef HAVE_GUILE
#include <guile/gh.h>
#endif
@@ -67,7 +83,10 @@
#include <stdlib.h>
#include <stdarg.h>
#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif
#ifdef HAVE_MEMORY_H
#include <memory.h>
@@ -75,7 +94,9 @@
#include <string.h>
#include <sys/types.h>
#include <sys/param.h>
#include <sys/socket.h>
#include <sys/stat.h>
#include <signal.h>
#include <errno.h>

193
include/glibtop/gnuserv.h Normal file
View File

@@ -0,0 +1,193 @@
/* -*-C-*-
Header file for the GNU Emacs server and client C code.
This file is part of GNU Emacs.
Copying is permitted under those conditions described by the GNU
General Public License.
Copyright (C) 1989 Free Software Foundation, Inc.
Author: Andy Norman (ange@hplb.hpl.hp.com), based on
'etc/server.c' and 'etc/emacsclient.c' from the 18.52 GNU
Emacs distribution.
Please mail bugs and suggestions to the author at the above address.
*/
/* HISTORY
* 11-Nov-1990 bristor@simba
* Added EOT stuff.
*/
/*
* This file incorporates new features added by Bob Weiner <weiner@mot.com>,
* Darrell Kindred <dkindred@cmu.edu> and Arup Mukherjee <arup@cmu.edu>.
* Please see the note at the end of the README file for details.
*
* (If gnuserv came bundled with your emacs, the README file is probably
* ../etc/gnuserv.README relative to the directory containing this file)
*/
#if 0
static char header_rcsid [] = "!Header: gnuserv.h,v 2.4 95/02/16 11:58:11 arup alpha !";
#endif
#define NO_SHORTNAMES
#define PATCHLEVEL 2
#define NO_SHORTNAMES
/* gnuserv should not be compiled using SOCKS */
#define DO_NOT_SOCKSIFY
#include <glibtop.h>
#include <glibtop/error.h>
#undef read
#undef write
#undef open
#undef close
#undef signal
/* Define the communication method between server and clients:
* You can have either or both kinds of sockets, but you can't mix
* sockets with sysv ipc
*/
#define INTERNET_DOMAIN_SOCKETS
// #define UNIX_DOMAIN_SOCKETS
// #define SYSV_IPC
/*
* Define additional authentication protocols to be used. These methods will
* be tried before falling back to the default gnuserv protocol (based on
* the GNU_SECURE environment variable). Currently, only MIT-MAGIC-COOKIE-1
* is also supported.
*
* Comment out the next line(s) if you don't want to enable the
* appropriate authentication protocol.
*/
#if defined (HAVE_XAUTH)
#define AUTH_MAGIC_COOKIE
#endif /* HAVE_XAUTH */
/*
* stuff related to supporting MIT-MAGIC-COOKIE-1
*/
#define MCOOKIE_SCREEN "42980" /* screen # to use as the gnuserv cookie */
#define MCOOKIE_NAME "MAGIC-1" /* authentication protocol name */
#define MCOOKIE_X_NAME "MIT-MAGIC-COOKIE-1" /* as needed by X */
#define DEFAUTH_NAME "GNU-SECURE" /* name of default auth protocol */
#define AUTH_TIMEOUT 15 /* # seconds to wait for auth data */
#define AUTH_NAMESZ 15 /* max allows auth protocol name size */
/*
* Pick a default communication scheme, if none was specified.
*/
#if !defined(SYSV_IPC) && !defined(UNIX_DOMAIN_SOCKETS) && !defined(INTERNET_DOMAIN_SOCKETS)
#ifdef HAVE_SYSVIPC
#define SYSV_IPC /* SYSV systems use SYSV IPC by default */
#endif /* HAVE_SYSVIPC */
#ifdef BSD
#define UNIX_DOMAIN_SOCKETS /* BSD systems use Unix Domain sockets by default */
#endif /* BSD */
#endif /* No communication method pre-defined */
/*
* If you are using SYSV_IPC, you might want to make the buffer size bigger
* since it limits the size of requests and responses. Don't make it bigger
* than your system's max message size though (usually a couple of k) or else
* msgsend will start failing. For sockets, using the system BUFSIZ is usually
* what you want.
*/
# define GSERV_BUFSZ BUFSIZ
#ifdef SYSV_IPC
#include <sys/ipc.h>
#include <sys/msg.h>
#define send_string(s,str) \
if (strlen(msgp->mtext) + strlen(str) < GSERV_BUFSZ) \
strcat(msgp->mtext,str); \
else \
{ \
fprintf(stderr,"%s: not enough message buffer space\n",progname); \
exit(1); \
} \
#endif /* SYSV_IPC */
#if defined(INTERNET_DOMAIN_SOCKETS) || defined(UNIX_DOMAIN_SOCKETS)
#include <sys/socket.h>
#endif /* INTERNET_DOMAIN_SOCKETS || UNIX_DOMAIN_SOCKETS */
#ifdef INTERNET_DOMAIN_SOCKETS
#include <netdb.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#define TABLE_SIZE 101 /* The number of entries in the hash table */
#define HASH(host) host /* Rather simplistic hash function */
#define DEFAULT_PORT 21490 /* default port number to use is
* DEFAULT_PORT + uid */
#endif /* INTERNET_DOMAIN_SOCKETS */
#ifdef UNIX_DOMAIN_SOCKETS
#include <sys/un.h>
#define HIDE_UNIX_SOCKET /* put the unix socket in a protected dir */
#endif /* UNIX_DOMAIN_SOCKETS */
#define HOSTNAMSZ 255 /* max size of a hostname */
#define REPLYSIZ 300 /* max size of reply from server to client */
#undef FALSE
#define FALSE 0
#undef TRUE
#define TRUE 1
// extern char *optarg;
// extern int optind;
/* The casts shut Sun's compiler up and are safe in the context these
are actually used. */
#define max2(x,y) (((int) (x) > (int) (y)) ? (x) : (y))
#define min2(x,y) (((int) (x) < (int) (y)) ? (x) : (y))
#ifndef _NFILE /* rough guess at maximum number of open files */
#define _NFILE 20
#endif
#define EOT_STR "\004"
#define EOT_CHR '\004'
/* connection types */
#define CONN_UNIX 0
#define CONN_INTERNET 1
#define CONN_IPC 2
/* function declarations */
extern int glibtop_make_connection __P((const char *, int, int *));
#ifdef SYSV_IPC
void disconnect_from_ipc_server();
#endif
#if defined(INTERNET_DOMAIN_SOCKETS) || defined(UNIX_DOMAIN_SOCKETS)
// void send_string (int s, const char *msg);
// void disconnect_from_server (int s, int echo);
// int read_line (int s, char *dest);
#endif
#ifdef INTERNET_DOMAIN_SOCKETS
extern long glibtop_internet_addr __P((const char *));
#endif

View File

@@ -26,8 +26,19 @@
__BEGIN_DECLS
#define _GLIBTOP_INIT_STATE_INIT 0x10000
#define _GLIBTOP_INIT_STATE_OPEN 0x20000
#define _GLIBTOP_INIT_STATE_SERVER 0x40000
#define GLIBTOP_INIT_NO_OPEN 1
#define GLIBTOP_INIT_NO_INIT 2
#define GLIBTOP_OPEN_NO_OVERRIDE 1
#define GLIBTOP_METHOD_DIRECT 1
#define GLIBTOP_METHOD_PIPE 2
#define GLIBTOP_METHOD_INET 3
extern void glibtop_open_l __P((glibtop *, const char *, const unsigned long, const unsigned));
extern void glibtop_open_r __P((glibtop *, const char *, const unsigned long, const unsigned));

View File

@@ -0,0 +1,42 @@
/* 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. */
#ifndef __GLIBTOP_PARAMETER_H__
#define __GLIBTOP_PARAMETER_H__
#include <glibtop.h>
#include <glibtop/open.h>
__BEGIN_DECLS
#define GLIBTOP_PARAM_METHOD 1
#define GLIBTOP_PARAM_FEATURES 2
#define GLIBTOP_PARAM_COMMAND 3
#define GLIBTOP_PARAM_HOST 4
#define GLIBTOP_PARAM_PORT 5
#define glibtop_get_parameter(p1,p2,p3) glibtop_get_parameter_l(glibtop_global_server,p1,p2,p3)
#define glibtop_set_parameter(p1,p2,p3) glibtop_set_parameter_l(glibtop_global_server,p1,p2,p3)
extern size_t glibtop_get_parameter_l __P((glibtop *, const unsigned, void *, size_t));
extern void glibtop_set_parameter_l __P((glibtop *, const unsigned, const void *, size_t));
__END_DECLS
#endif

View File

@@ -30,11 +30,13 @@ __BEGIN_DECLS
#define glibtop_malloc(p1) glibtop_malloc_r(glibtop_global_server, p1)
#define glibtop_calloc(p1, p2) glibtop_calloc_r(glibtop_global_server, p1, p2)
#define glibtop_realloc(p1, p2) glibtop_realloc_r(glibtop_global_server, p1, p2)
#define glibtop_strdup(p2) glibtop_strdup_r(glibtop_global_server, p1)
#define glibtop_free(p1) glibtop_free_r(glibtop_global_server, p1)
extern void *glibtop_malloc_r __P((glibtop *, size_t));
extern void *glibtop_calloc_r __P((glibtop *, size_t, size_t));
extern void *glibtop_realloc_r __P((glibtop *, void *, size_t));
extern char *glibtop_strdup_r __P((glibtop *, const char *));
extern void glibtop_free_r __P((glibtop *, void *));
__END_DECLS

6
kernel/ChangeLog Normal file
View File

@@ -0,0 +1,6 @@
1998-06-14 Martin Baulig <baulig@taurus.uni-trier.de>
* README: Added README.
* kernel.patch: Patch for the Linux kernel to add the
new system call.

21
kernel/README Normal file
View File

@@ -0,0 +1,21 @@
This is a new system call `table ()' for the Linux table. It is faster
than reading from /proc and can be used to fetch all information required
for libgtop until whe have some other function (extended sysctl, ...) in
standard kernels.
I didn't want to change sysctl or some other function myself cause this may
cause other applications relying upon those function to fail. This is
something for the ``real'' kernel gurus ...
To use this new system call for libgtop, do the following:
* Copy this directory to /usr/src/linux/table
* Make /usr/src/linux/include/linux/table.h symlink to /usr/src/linux/table/table.h
* Apply the patch `kernel.patch' to the kernel, compile, install and reboot
* Recompile libgtop (remove `config.cache' and run the `autogen.sh' again).
If you want to change and/or add something - feel free to do so !
Have fun,
Martin

49
kernel/kernel.patch Normal file
View File

@@ -0,0 +1,49 @@
diff -ur linux-2.0.32/Makefile linux-hacked/Makefile
--- linux-2.0.32/Makefile Fri Nov 7 19:51:05 1997
+++ linux-hacked/Makefile Thu Jun 11 20:41:12 1998
@@ -87,7 +87,7 @@
# standard CFLAGS
#
-CFLAGS = -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -fno-strength-reduce
+CFLAGS = -Wall -Wstrict-prototypes -g -O2 -fomit-frame-pointer -fno-strength-reduce
ifdef CONFIG_CPP
CFLAGS := $(CFLAGS) -x c++
@@ -113,12 +113,12 @@
# Include the make variables (CC, etc...)
#
-ARCHIVES =kernel/kernel.o mm/mm.o fs/fs.o ipc/ipc.o net/network.a
+ARCHIVES =kernel/kernel.o mm/mm.o fs/fs.o ipc/ipc.o net/network.a table/table.o
FILESYSTEMS =fs/filesystems.a
DRIVERS =drivers/block/block.a \
drivers/char/char.a
LIBS =$(TOPDIR)/lib/lib.a
-SUBDIRS =kernel drivers mm fs net ipc lib
+SUBDIRS =kernel drivers mm fs net ipc lib table
ifeq ($(CONFIG_ISDN),y)
DRIVERS := $(DRIVERS) drivers/isdn/isdn.a
diff -ur linux-2.0.32/arch/i386/kernel/entry.S linux-hacked/arch/i386/kernel/entry.S
--- linux-2.0.32/arch/i386/kernel/entry.S Tue Sep 16 23:42:45 1997
+++ linux-hacked/arch/i386/kernel/entry.S Thu Jun 11 21:37:20 1998
@@ -699,4 +699,6 @@
.long SYMBOL_NAME(sys_mremap)
.long 0,0
.long SYMBOL_NAME(sys_vm86)
- .space (NR_syscalls-166)*4
+ .long 0
+ .long SYMBOL_NAME(sys_table)
+ .space (NR_syscalls-168)*4
diff -ur linux-2.0.32/include/asm-i386/unistd.h linux-hacked/include/asm-i386/unistd.h
--- linux-2.0.32/include/asm-i386/unistd.h Fri Mar 22 07:34:02 1996
+++ linux-hacked/include/asm-i386/unistd.h Thu Jun 11 21:37:03 1998
@@ -169,6 +169,7 @@
#define __NR_sched_rr_get_interval 161
#define __NR_nanosleep 162
#define __NR_mremap 163
+#define __NR_table 168
/* XXX - _foo needs to be __foo, while __NR_bar could be _NR_bar. */
#define _syscall0(type,name) \

View File

@@ -4,11 +4,12 @@ INCLUDES = -I$(top_builddir) -I$(top_srcdir) @machine_incs@ \
-I$(top_srcdir)/include -I$(top_srcdir)/intl @GUILE_INCS@ \
-DGTOPLOCALEDIR=\"$(datadir)/locale\" -D_GNU_SOURCE
CFLAGS = -Wall -W @CFLAGS@ -DGTOP_SERVER=\""@LIBGTOP_SERVER@"\"
CFLAGS = -Wall -W @CFLAGS@ -DGTOP_SERVER=\""@LIBGTOP_SERVER@"\" -DDEBUG
lib_LTLIBRARIES = libgtop.la
libgtop_la_SOURCES = init.c open.c close.c command.c read.c read_data.c write.c lib.c
libgtop_la_SOURCES = init.c open.c close.c command.c read.c read_data.c \
write.c lib.c parameter.c
BUILT_SOURCES = lib.c
@@ -19,3 +20,4 @@ lib.c: lib.awk $(top_builddir)/config.h $(top_builddir)/features.def
EXTRA_DIST = lib.awk
CLEANFILES = lib.c

View File

@@ -28,27 +28,52 @@
void *
glibtop_call_l (glibtop *server, unsigned command, size_t send_size, void *send_buf,
size_t recv_size, void *recv_buf)
size_t recv_size, void *recv_buf)
{
glibtop_command *cmnd;
void *ptr;
glibtop_command cmnd;
glibtop_response response;
glibtop_init_r (&server, 0, 0);
cmnd = glibtop_calloc_r (server, 1, sizeof (glibtop_command));
memset (&cmnd, 0, sizeof (glibtop_command));
memcpy (&cmnd.server, server, sizeof (glibtop));
memcpy (&cmnd->server, server, sizeof (glibtop));
cmnd.command = command;
/* If send_size is less than _GLIBTOP_PARAM_SIZE (normally 16 Bytes), we
* send it together with command, so we only need one system call instead
* of two. */
#ifdef DEBUG
// 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) {
memcpy (cmnd.parameter, send_buf, send_size);
cmnd.size = send_size;
} else {
cmnd.data_size = send_size;
}
cmnd->command = command;
cmnd->size = send_size;
glibtop_write_l (server, sizeof (glibtop_command), cmnd);
glibtop_write_l (server, send_size, send_buf);
glibtop_read_l (server, recv_size, recv_buf);
ptr = glibtop_read_data_l (server);
glibtop_free_r (server, cmnd);
return ptr;
glibtop_write_l (server, sizeof (glibtop_command), &cmnd);
// glibtop_write_l (server, cmnd.data_size, send_buf);
glibtop_read_l (server, sizeof (glibtop_response), &response);
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;
}

View File

@@ -20,23 +20,168 @@
Boston, MA 02111-1307, USA. */
#include <glibtop.h>
#include <glibtop/open.h>
#include <glibtop/xmalloc.h>
#include <glibtop/parameter.h>
static glibtop _glibtop_global_server;
glibtop *glibtop_global_server = NULL;
#ifndef DEFAULT_PORT
#define DEFAULT_PORT 42800
#endif
static glibtop _glibtop_global_server;
glibtop *glibtop_global_server = &_glibtop_global_server;
void
_init_server (glibtop *server, const unsigned features)
{
char *command, *temp;
/* Try to get server command, but don't override if already
* set via glibtop_set_parameter () */
if (server->server_command == NULL) {
const char *temp = getenv ("LIBGTOP_SERVER") ?
getenv ("LIBGTOP_SERVER") : GTOP_SERVER;
server->server_command = glibtop_strdup_r (server, temp);
}
if (server->server_rsh == NULL) {
const char *temp = getenv ("LIBGTOP_RSH") ?
getenv ("LIBGTOP_RSH") : "/usr/bin/ssh";
server->server_rsh = glibtop_strdup_r (server, temp);
}
/* Try to get server method, but don't override if already
* set via glibtop_set_parameter () */
if (server->method) return;
/* If server->command doesn't start with a colon, then it is
* the full pathname of the server executable. */
if (server->server_command [0] != ':') {
if (features & glibtop_server_features) {
/* We really need the server. */
server->method = GLIBTOP_METHOD_PIPE;
} else {
/* Fine. No server is needed, so we call the
* sysdeps functions directly. */
server->method = GLIBTOP_METHOD_DIRECT;
}
return;
}
/* If the first character of 'server_command' is a colon,
* the first field is the method to connect to the server. */
/* Everything up to the next colon is the method. */
command = glibtop_strdup_r (server, server->server_command+1);
temp = strstr (command, ":");
if (temp) *temp = 0;
/* Dispatch method. */
if (!strcmp (command, "direct")) {
/* Use sysdeps dir instead of connecting to server
* even if using the server would be required on
* the current system. */
server->method = GLIBTOP_METHOD_DIRECT;
} else if (!strcmp (command, "inet")) {
server->method = GLIBTOP_METHOD_INET;
/* Connect to internet server. */
if (temp == NULL) {
/* If no value was set, we use 'localhost'. */
if (server->server_host == NULL)
server->server_host = glibtop_strdup_r
(server, "localhost");
} else {
char *temp2 = strstr (temp+1, ":");
if (temp2) *temp2 = 0;
/* Override default. */
if (server->server_host)
glibtop_free_r (server, (char *) server->server_host);
server->server_host = glibtop_strdup_r
(server, temp+1);
temp = temp2;
}
if (temp == NULL) {
/* If no value was set, we use DEFAULT_PORT. */
if (server->server_port == 0)
server->server_port = DEFAULT_PORT;
} else {
char *temp2 = strstr (temp+1, ":");
if (temp2) *temp2 = 0;
if (sscanf (temp+1, "%ld", &server->server_port) != 1)
server->server_port = DEFAULT_PORT;
temp = temp2 ? temp2 + 1 : temp2;
}
} else {
glibtop_error_r (server, "Unknown server method '%s'",
server->server_command+1);
}
glibtop_free_r (server, command);
}
glibtop *
glibtop_init_r (glibtop **server, const unsigned long features,
const unsigned flags)
glibtop_init_r (glibtop **server_ptr, const unsigned long features,
const unsigned flags)
{
if (*server != NULL)
return *server;
glibtop *server;
if (glibtop_global_server == NULL) {
glibtop_global_server = &_glibtop_global_server;
glibtop_open_l (glibtop_global_server, "glibtop",
features, flags);
if (server_ptr == NULL)
return NULL;
if (*server_ptr == NULL)
*server_ptr = glibtop_global_server;
server = *server_ptr;
/* Should we do the initialization? */
if (flags & GLIBTOP_INIT_NO_INIT)
return server;
/* Do the initialization, but only if not already initialized. */
if ((server->flags & _GLIBTOP_INIT_STATE_INIT) == 0) {
_init_server (server, features);
server->flags |= _GLIBTOP_INIT_STATE_INIT;
}
/* Should we open the server? */
if (flags & GLIBTOP_INIT_NO_OPEN)
return server;
/* Open server, but only if not already opened. */
return *server = glibtop_global_server;
if ((server->flags & _GLIBTOP_INIT_STATE_OPEN) == 0)
glibtop_open_l (glibtop_global_server, "glibtop",
features, flags);
return server;
}

View File

@@ -4,6 +4,7 @@ BEGIN {
print "";
print "#include <glibtop.h>";
print "#include <glibtop/open.h>";
print "#include <glibtop/sysdeps.h>";
print "#include <glibtop/command.h>";
@@ -29,7 +30,9 @@ function output(feature) {
print "{";
print "\tglibtop_init_r (&server, GLIBTOP_SYSDEPS_"toupper(feature)", 0);";
print "";
print "\tif (server->features & GLIBTOP_SYSDEPS_"toupper(feature)") {";
print "\tif ((server->flags & _GLIBTOP_INIT_STATE_SERVER) &&";
print "\t (server->features & GLIBTOP_SYSDEPS_"toupper(feature)"))";
print "\t{";
if (feature ~ /^proc_/) {
print "\t\t"prefix"glibtop_call_l (server, GLIBTOP_CMND_"toupper(feature)", sizeof (pid_t),";

View File

@@ -25,132 +25,44 @@
#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)
const unsigned long features, const unsigned flags)
{
char version [BUFSIZ], buffer [BUFSIZ];
char *server_command, *server_rsh, *temp;
char *server_host, *server_user;
glibtop_sysdeps sysdeps;
memset (server, 0, sizeof (glibtop));
server->name = program_name;
/* Is the user allowed to override the server ? */
/* It is important to set _GLIBTOP_INIT_STATE_OPEN here when we
* do recursive calls to glibtop_init_r (). */
if ((flags & GLIBTOP_OPEN_NO_OVERRIDE) == 0) {
server->flags |= _GLIBTOP_INIT_STATE_OPEN;
/* Try to get data from environment. */
if (server->method == GLIBTOP_METHOD_INET) {
int connect_type;
fprintf (stderr, "Connecting to '%s' port %d.\n",
server->server_host, server->server_port);
temp = getenv ("LIBGTOP_SERVER") ?
getenv ("LIBGTOP_SERVER") : GTOP_SERVER;
connect_type = glibtop_make_connection
(server->server_host, server->server_port,
&server->socket);
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;
server->features = -1;
return;
}
/* Fork and exec server. */
/* If the server has been started, ask it for its features. */
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);
if (server->flags & _GLIBTOP_INIT_STATE_SERVER) {
glibtop_sysdeps sysdeps;
glibtop_call_l (server, GLIBTOP_CMND_SYSDEPS, 0, NULL,
sizeof (glibtop_sysdeps), &sysdeps);
server->features = sysdeps.features;
}
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);
server->features = sysdeps.features;
fprintf (stderr, "Features: %lu\n", server->features);
}

62
lib/parameter.c Normal file
View File

@@ -0,0 +1,62 @@
/* $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.h>
#include <glibtop/parameter.h>
#define _write_data(ptr,size) \
if ((data_ptr == NULL) || (data_size < size)) return -size; \
if (ptr == NULL) { strcpy (data_ptr, ""); return 1; } \
memcpy (data_ptr, ptr, size); \
return size;
#define _strlen(ptr) (ptr ? strlen (ptr) : 0)
size_t
glibtop_get_parameter_l (glibtop *server, const unsigned parameter,
void *data_ptr, size_t data_size)
{
switch (parameter) {
case GLIBTOP_PARAM_METHOD:
_write_data (&server->method,
sizeof (server->method));
case GLIBTOP_PARAM_FEATURES:
_write_data (&server->features,
sizeof (server->features));
case GLIBTOP_PARAM_COMMAND:
_write_data (server->server_command,
_strlen(server->server_command));
case GLIBTOP_PARAM_HOST:
_write_data (server->server_host,
_strlen(server->server_host));
case GLIBTOP_PARAM_PORT:
_write_data (&server->server_port,
sizeof (server->server_port));
}
return 0;
}
void
glibtop_set_parameter_l (glibtop *server, const unsigned parameter,
const void *data_ptr, size_t data_size)
{
}

View File

@@ -23,19 +23,48 @@
/* 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)
{
size_t ssize;
int ret = 0;
glibtop_init_r (&server, 0, 0);
if (read (server->input [0], &ssize, sizeof (size_t)) < 0)
glibtop_error_r (server, _("read size: %s"), strerror (errno));
if (size != ssize)
glibtop_error_r (server, _("got %d bytes but requested %d"), ssize, size);
if (read (server->input [0], buf, size) < 0)
glibtop_error_r (server, _("read %d bytes: %s"), size, strerror (errno));
#ifdef DEBUG
fprintf (stderr, "LIBRARY: really reading %d bytes.\n", size);
#endif
if (server->socket) {
do_read (server->socket, buf, size);
} else {
ret = read (server->input [0], buf, size);
}
if (ret < 0)
glibtop_error_io_r (server, _("read %d bytes"), size);
}

View File

@@ -29,20 +29,39 @@ glibtop_read_data_l (glibtop *server)
{
size_t size;
void *ptr;
int ret;
glibtop_init_r (&server, 0, 0);
if (read (server->input [0], &size, sizeof (size_t)) < 0)
glibtop_error_r (server, _("read data size: %s"),
strerror (errno));
#ifdef DEBUG
fprintf (stderr, "LIBRARY: reading %d data bytes.\n", sizeof (size_t));
#endif
if (server->socket) {
ret = recv (server->socket, &size, sizeof (size_t), 0);
} else {
ret = read (server->input [0], &size, sizeof (size_t));
}
if (ret < 0)
glibtop_error_io_r (server, _("read data size"));
#ifdef DEBUG
fprintf (stderr, "LIBRARY: really reading %d data bytes (ret = %d).\n", size, ret);
#endif
if (!size) return NULL;
ptr = glibtop_malloc_r (server, size);
if (read (server->input [0], ptr, size) < 0)
glibtop_error_r (server, _("read data %d bytes: %s"),
size, strerror (errno));
if (server->socket) {
ret = recv (server->socket, ptr, size, 0);
} else {
ret = read (server->input [0], ptr, size);
}
if (ret < 0)
glibtop_error_io_r (server, _("read data %d bytes"));
return ptr;
}

View File

@@ -26,13 +26,22 @@
void
glibtop_write_l (glibtop *server, size_t size, void *buf)
{
int ret;
glibtop_init_r (&server, 0, 0);
if (write (server->output [1], &size, sizeof (size_t)) < 0)
glibtop_error_r (server, _("write size: %s"), strerror (errno));
if (size == 0) return;
if (!size) return;
if (write (server->output [1], buf, size) < 0)
glibtop_error_r (server, _("write %d bytes: %s"), size, strerror (errno));
#ifdef DEBUG
fprintf (stderr, "LIBRARY: really writing %d bytes.\n", size);
#endif
if (server->socket) {
ret = send (server->socket, buf, size, 0);
} else {
ret = write (server->output [1], buf, size);
}
if (ret < 0)
glibtop_error_io_r (server, _("write %d bytes"), size);
}

1
perl/.cvsignore Normal file
View File

@@ -0,0 +1 @@
Libgtop.xs Makefile blib pm_to_blib Libgtop.c Libgtop.bs Makefile.PL

5
perl/Changes Normal file
View File

@@ -0,0 +1,5 @@
Revision history for Perl extension Libgtop.
0.01 Sun Jun 21 21:00:59 1998
- original version; created by h2xs 1.18

26
perl/Libgtop.pm Normal file
View File

@@ -0,0 +1,26 @@
package Libgtop;
use strict;
use vars qw($VERSION @ISA @EXPORT @EXPORT_OK);
require Exporter;
require DynaLoader;
require AutoLoader;
@ISA = qw(Exporter DynaLoader);
# Items to export into callers namespace by default. Note: do not export
# names by default without a very good reason. Use EXPORT_OK instead.
# Do not simply export all your public functions/methods/constants.
@EXPORT = qw(
);
$VERSION = '0.01';
bootstrap Libgtop $VERSION;
# Preloaded methods go here.
# Autoload methods go after __END__, and are processed by the autosplit program.
1;
__END__

8
perl/MANIFEST Normal file
View File

@@ -0,0 +1,8 @@
.cvsignore
Changes
Libgtop.pm
MANIFEST
Makefile.PL.in
new.pl
perl.awk
test.pl

10
perl/Makefile.PL.in Normal file
View File

@@ -0,0 +1,10 @@
# -*-cperl-*-
use ExtUtils::MakeMaker;
# See lib/ExtUtils/MakeMaker.pm for details of how to influence
# the contents of the Makefile that is written.
WriteMakefile('NAME' => 'Libgtop',
'VERSION_FROM' => 'Libgtop.pm',
'LIBS' => ['@LIBGTOP_GUILE_LIBS@'],
'DEFINE' => '',
'INC' => '@LIBGTOP_GUILE_INCS@',
);

13
perl/new.pl Executable file
View File

@@ -0,0 +1,13 @@
#!/usr/bin/perl -w
require 5.004;
use blib;
use strict;
use Libgtop;
print "CPU Usage: ".join (':', Libgtop::cpu)."\n";
print "Memory Usage: ".join (':', Libgtop::mem)."\n";
print "Swap Usage: ".join (':', Libgtop::swap)."\n";

86
perl/perl.awk Normal file
View File

@@ -0,0 +1,86 @@
BEGIN {
print "/* Libgtop.xs */";
print "/* This is a generated file. Please modify `perl.awk' */";
print "";
print "#ifdef __cplusplus";
print "extern \"C\" {";
print "#endif";
print "#include \"EXTERN.h\"";
print "#include \"perl.h\"";
print "#include \"XSUB.h\"";
print "#ifdef __cplusplus";
print "}";
print "#endif";
print "";
print "#undef PACKAGE";
print "";
print "#include <glibtop.h>";
print "#include <glibtop/union.h>";
print "";
print "MODULE = Libgtop\t\tPACKAGE = Libgtop";
print "";
convert["long"] = "newSViv";
convert["ulong"] = "newSViv";
convert["double"] = "newSVnv";
}
/^(\w+)/ {
feature = $1;
print "void";
if (feature ~ /^proc_/) {
print feature"(pid)";
print "\tunsigned\tpid;";
} else {
print feature"()";
}
print "PREINIT:";
print "\tglibtop_"feature" "feature";";
if (feature ~ /^proclist/) {
print "\tunsigned i, *ptr;";
print "PPCODE:";
print "\tptr = glibtop_get_proclist (&proclist);";
print "";
print "\tif (ptr) {";
print "\t\tfor (i = 0; i < proclist.number; i++)";
print "\t\t\tXPUSHs (sv_2mortal (newSViv (ptr [i])));";
print "\t}";
print "";
print "\tglibtop_free (ptr);";
} else {
print "PPCODE:";
if (feature ~ /^proc_/) {
print "\tglibtop_get_"feature" (&"feature", pid);";
} else {
print "\tglibtop_get_"feature" (&"feature");";
}
print "";
nr_elements = split ($2, elements, /:/);
for (element = 1; element <= nr_elements; element++) {
list = elements[element];
type = elements[element];
sub(/\(.*/, "", type);
sub(/^\w+\(/, "", list); sub(/\)$/, "", list);
count = split (list, fields, /,/);
for (field = 1; field <= count; field++) {
if (type ~ /^str$/) {
print "\tXPUSHs (sv_2mortal (newSVpv ("$1"."fields[field]", 0)));";
} else {
if (type ~ /^char$/) {
print "\tXPUSHs (sv_2mortal (newSVpv (&"$1"."fields[field]", 1)));";
} else {
print "\tXPUSHs (sv_2mortal ("convert[type]" ("$1"."fields[field]")));";
}
}
}
}
}
print "";
}

20
perl/test.pl Normal file
View File

@@ -0,0 +1,20 @@
# Before `make install' is performed this script should be runnable with
# `make test'. After `make install' it should work as `perl test.pl'
######################### We start with some black magic to print on failure.
# Change 1..1 below to 1..last_test_to_print .
# (It may become useful if the test is moved to ./t subdirectory.)
BEGIN { $| = 1; print "1..1\n"; }
END {print "not ok 1\n" unless $loaded;}
use Libgtop;
$loaded = 1;
print "ok 1\n";
######################### End of black magic.
# Insert your test code below (better if it prints "ok 13"
# (correspondingly "not ok 13") depending on the success of chunk 13
# of the test code):

124
po/fr.po
View File

@@ -6,7 +6,7 @@
msgid ""
msgstr ""
"Project-Id-Version: libgtop VERSION\n"
"POT-Creation-Date: 1998-05-31 22:31+0200\n"
"POT-Creation-Date: 1998-06-20 15:28+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: Vincent Renardias <vincent@waw.com>\n"
"Language-Team: Vincent Renardias <vincent@waw.com>\n"
@@ -17,67 +17,67 @@ msgstr ""
#: lib/open.c:36
#, c-format
msgid "cannot make a pipe: %s\n"
msgstr ""
msgstr "impossible de créér un tube: %s\n"
#: lib/open.c:41
#, c-format
msgid "%s: fork failed: %s\n"
msgstr ""
msgstr "%s: duplication échouée: %s\n"
#: lib/open.c:59
#, c-format
msgid "server version is not %s"
msgstr ""
msgstr "la version du serveur n'est pas %s"
#: lib/read.c:34
#, c-format
msgid "read size: %s"
msgstr ""
msgstr "taille lue: %s"
#: lib/read.c:37
#, c-format
msgid "got %d bytes but requested %d"
msgstr ""
msgstr "obtenu %d octets, mais %d étaient demandés"
#: lib/read.c:40
#, c-format
msgid "read %d bytes: %s"
msgstr ""
msgstr "lecture de %d octets: %s"
#: lib/write.c:32
#, c-format
msgid "write size: %s"
msgstr ""
msgstr "taille écrite: %s"
#: lib/write.c:37
#, c-format
msgid "write %d bytes: %s"
msgstr ""
msgstr "écrit %d octets: %s"
#: lib/read_data.c:36
#, c-format
msgid "read data size: %s"
msgstr ""
msgstr "taille de la lecture: %s"
#: lib/read_data.c:46
#, c-format
msgid "read data %d bytes: %s"
msgstr ""
msgstr "lecture de %d octets de données: %s"
#: sysdeps/common/xmalloc.c:32
#, c-format
msgid "malloc %d bytes: %s"
msgstr ""
msgstr "malloc de %d octets: %s"
#: sysdeps/common/xmalloc.c:44
#, c-format
msgid "calloc %d block (%d bytes each): %s"
msgstr ""
msgstr "calloc de %d blocks (%d octets chacuns): %s"
#: sysdeps/common/xmalloc.c:56
#, c-format
msgid "realloc %d bytes: %s"
msgstr ""
msgstr "realloc de %d octets: %s"
#: sysdeps/names/sysdeps.c:42 sysdeps/names/sysdeps.c:62
msgid "CPU Usage"
@@ -93,7 +93,7 @@ msgstr "Utilisation du Swap"
#: sysdeps/names/sysdeps.c:45 sysdeps/names/sysdeps.c:65
msgid "System Uptime"
msgstr ""
msgstr "Uptime du système"
#: sysdeps/names/sysdeps.c:46 sysdeps/names/sysdeps.c:66
msgid "Load Averange"
@@ -117,31 +117,31 @@ msgstr "Liste des taches en cours d'
#: sysdeps/names/sysdeps.c:51 sysdeps/names/sysdeps.c:71
msgid "Process Status information"
msgstr ""
msgstr "Information sur l'état du processus"
#: sysdeps/names/sysdeps.c:52 sysdeps/names/sysdeps.c:72
msgid "Process UID and TTY information"
msgstr ""
msgstr "Information UID et TTY du processus"
#: sysdeps/names/sysdeps.c:53 sysdeps/names/sysdeps.c:73
msgid "Process Memory information"
msgstr ""
msgstr "Information Mémoire du Processus"
#: sysdeps/names/sysdeps.c:54 sysdeps/names/sysdeps.c:74
msgid "Process Time information"
msgstr ""
msgstr "Information Temporelle sur le processus"
#: sysdeps/names/sysdeps.c:55 sysdeps/names/sysdeps.c:75
msgid "Process Signal information"
msgstr ""
msgstr "Information sur les signaux du processus"
#: sysdeps/names/sysdeps.c:56 sysdeps/names/sysdeps.c:76
msgid "Process Kernel Data information"
msgstr ""
msgstr "Information sur les données noyau du processus"
#: sysdeps/names/sysdeps.c:57 sysdeps/names/sysdeps.c:77
msgid "Process Segment information"
msgstr ""
msgstr "Information sur la segmentation du processus"
#: sysdeps/names/cpu.c:37
msgid "Total CPU Time"
@@ -153,7 +153,7 @@ msgstr "Temps CPU en mode utilisateur"
#: sysdeps/names/cpu.c:39
msgid "CPU Time in User Mode (nice)"
msgstr ""
msgstr "Temps CPU en mode utilisateur (nice)"
#: sysdeps/names/cpu.c:40
msgid "CPU Time in System Mode"
@@ -165,7 +165,7 @@ msgstr "Temps CPU pour la tache inactive"
#: sysdeps/names/cpu.c:42
msgid "Tick Frequency"
msgstr ""
msgstr "Fréquence des ticks"
#: sysdeps/names/cpu.c:47
msgid "The number of jiffies (1/100ths of a second) since system boot"
@@ -175,31 +175,31 @@ msgstr "Nombre de jiffies (1/100e de seconde) depuis le boot du syst
msgid ""
"The number of jiffies (1/100ths of a second) that the system spent in user "
"mode"
msgstr ""
msgstr "Le nombre de jiffies (1/100ème de seconde) que le systme a passé en mode utilisateur"
#: sysdeps/names/cpu.c:51
msgid ""
"The number of jiffies (1/100ths of a second) that the system spent in user "
"mode with low priority (nice)"
msgstr ""
msgstr "Le nombre de jiffies (1/100ème de seconde) que le système a passé en mode utilisateur en priorité basse (nice)"
#: sysdeps/names/cpu.c:53
msgid ""
"The number of jiffies (1/100ths of a second) that the system spent in system "
"mode"
msgstr ""
msgstr "Le nombre de jiffies (1/100ème de seconde) que le système a passé en mode système"
#: sysdeps/names/cpu.c:55
msgid ""
"The number of jiffies (1/100ths of a second) that the system spend in the "
"idle task"
msgstr ""
msgstr "Le nombre de jiffies (1/100ème de seconde) que le systme a passé dans le processus inactif (idle task)"
#: sysdeps/names/cpu.c:57
msgid ""
"All of the above values are in jiffies (1/100ths of a second) unless "
"otherwise stated in this field (i.e. 'frequency != 100')"
msgstr ""
msgstr "Toutes les valeurs ci-dessus sont exprimées en jiffies (1/100ème de seconde) sauf précision contraire (i.e.: fréquence != 100)"
#: sysdeps/names/loadavg.c:36
msgid "Load Average"
@@ -207,7 +207,7 @@ msgstr "Charge Moyenne"
#: sysdeps/names/loadavg.c:41
msgid "Number of jobs running simultaneously averaged over 1, 5 and 15 minutes"
msgstr ""
msgstr "Nombre de processus tournant simultannement en moyenne sur 1, 5 et 15 minutes"
#: sysdeps/names/mem.c:39
msgid "Total Memory"
@@ -231,7 +231,7 @@ msgstr "Tampons"
#: sysdeps/names/mem.c:44
msgid "Cached"
msgstr ""
msgstr "Dans le cache"
#: sysdeps/names/mem.c:45
msgid "User"
@@ -247,83 +247,83 @@ msgstr "M
#: sysdeps/names/mem.c:52
msgid "Used memory size in kB"
msgstr ""
msgstr "Mémoire utilisée en Ko"
#: sysdeps/names/mem.c:53
msgid "Free memory size in kB"
msgstr ""
msgstr "Mémoire libre en Ko"
#: sysdeps/names/mem.c:54
msgid "Shared memory size in kB"
msgstr ""
msgstr "Mémoire partagée en Ko"
#: sysdeps/names/mem.c:55
msgid "Size of buffers kB"
msgstr ""
msgstr "Taille des tampons en Ko"
#: sysdeps/names/mem.c:56
msgid "Size of cached memory in kB"
msgstr ""
msgstr "Taille de la mémoire dans le cache en Ko"
#: sysdeps/names/mem.c:57
msgid "Memory used from user processes in kB"
msgstr ""
msgstr "Mémoire utilisée par les processus utilisateurs en Ko"
#: sysdeps/names/mem.c:58
msgid "Memory in locked pages in kB"
msgstr ""
msgstr "Mémoire dans les pages vérouillées en Ko"
#: sysdeps/names/swap.c:36 sysdeps/names/swap.c:43
msgid "Total Swap Space"
msgstr ""
msgstr "Taille totalle de la zone d'échange"
#: sysdeps/names/swap.c:37 sysdeps/names/swap.c:44
msgid "Used Swap Space"
msgstr ""
msgstr "Taille utilisée de la zone d'échange"
#: sysdeps/names/swap.c:38 sysdeps/names/swap.c:45
msgid "Free Swap Space"
msgstr ""
msgstr "Espace libre de la zone d'échange"
#: sysdeps/names/uptime.c:36
msgid "Uptime"
msgstr ""
msgstr "Uptime"
#: sysdeps/names/uptime.c:37
msgid "Idletime"
msgstr ""
msgstr "Idletime"
#: sysdeps/names/uptime.c:42
msgid "Time in seconds since system boot"
msgstr ""
msgstr "Temps en secondes depuis le démarrage du système"
#: sysdeps/names/uptime.c:43
msgid "Time in seconds the system spent in the idle task since system boot"
msgstr ""
msgstr "Temps en secondes passé dans le processus inactif depuis le démarrage du système"
#: sysdeps/names/shm_limits.c:37 sysdeps/names/shm_limits.c:46
msgid "Max segment size"
msgstr ""
msgstr "Taille maximum des segments"
#: sysdeps/names/shm_limits.c:38 sysdeps/names/shm_limits.c:47
msgid "Min segment size"
msgstr ""
msgstr "Taille minimum des segments"
#: sysdeps/names/shm_limits.c:39 sysdeps/names/shm_limits.c:48
msgid "Max number of segments"
msgstr ""
msgstr "Nombre maximum des segments"
#: sysdeps/names/shm_limits.c:40 sysdeps/names/shm_limits.c:49
msgid "Max shared segments per process"
msgstr ""
msgstr "Nombre maximum de segments partagés par processus"
#: sysdeps/names/shm_limits.c:41 sysdeps/names/shm_limits.c:50
msgid "Max total shared memory"
msgstr ""
msgstr "Taille totalle de la mémoire partagée"
#: sysdeps/names/msg_limits.c:37 sysdeps/names/msg_limits.c:48
msgid "Size in kilobytes of message pool"
msgstr ""
msgstr "Taille en kilo-octets du pool de messages"
#: sysdeps/names/msg_limits.c:38 sysdeps/names/msg_limits.c:49
msgid "Number of entries in message map"
@@ -331,23 +331,23 @@ msgstr ""
#: sysdeps/names/msg_limits.c:39 sysdeps/names/msg_limits.c:50
msgid "Max size of message"
msgstr ""
msgstr "Taille maximum des messages"
#: sysdeps/names/msg_limits.c:40 sysdeps/names/msg_limits.c:51
msgid "Default max size of queue"
msgstr ""
msgstr "Taille maximum par défaut de la queue"
#: sysdeps/names/msg_limits.c:41 sysdeps/names/msg_limits.c:52
msgid "Max queues system wide"
msgstr ""
msgstr "Nombre maximum de queues dans le système"
#: sysdeps/names/msg_limits.c:42 sysdeps/names/msg_limits.c:53
msgid "Message segment size"
msgstr ""
msgstr "Taille des segments de messages"
#: sysdeps/names/msg_limits.c:43 sysdeps/names/msg_limits.c:54
msgid "Number of system message headers"
msgstr ""
msgstr "Nombre d'entetes de messages système"
#: sysdeps/names/sem_limits.c:39 sysdeps/names/sem_limits.c:53
msgid "Number of entries in semaphore map"
@@ -355,19 +355,19 @@ msgstr ""
#: sysdeps/names/sem_limits.c:40 sysdeps/names/sem_limits.c:54
msgid "Max number of arrays"
msgstr ""
msgstr "Nombre maximum de tables"
#: sysdeps/names/sem_limits.c:41 sysdeps/names/sem_limits.c:55
msgid "Max semaphores system wide"
msgstr ""
msgstr "Nombre maximum de sémaphores dans le système"
#: sysdeps/names/sem_limits.c:42 sysdeps/names/sem_limits.c:56
msgid "Number of undo structures system wide"
msgstr ""
msgstr "Nombre de structures 'undo' dans le système"
#: sysdeps/names/sem_limits.c:43 sysdeps/names/sem_limits.c:57
msgid "Max semaphores per array"
msgstr ""
msgstr "Nombre maximum de sémaphores par table"
#: sysdeps/names/sem_limits.c:44 sysdeps/names/sem_limits.c:58
msgid "Max ops per semop call"
@@ -379,11 +379,11 @@ msgstr ""
#: sysdeps/names/sem_limits.c:46 sysdeps/names/sem_limits.c:60
msgid "sizeof struct sem_undo"
msgstr ""
msgstr "sizeof struct sem_undo"
#: sysdeps/names/sem_limits.c:47 sysdeps/names/sem_limits.c:61
msgid "Semaphore max value"
msgstr ""
msgstr "Valeur maximum d'un sémaphore"
#: sysdeps/names/sem_limits.c:48 sysdeps/names/sem_limits.c:62
msgid "Adjust on exit max value"

View File

@@ -1 +1 @@
SUBDIRS = server proxy
SUBDIRS = server proxy daemon

3
src/daemon/.cvsignore Normal file
View File

@@ -0,0 +1,3 @@
Makefile.in
Makefile
gnuserv

25
src/daemon/Makefile.am Normal file
View File

@@ -0,0 +1,25 @@
LINK = $(LIBTOOL) --mode=link $(CC) $(CFLAGS) $(LDFLAGS) -o $@
INCLUDES = -I$(top_builddir) -I$(top_srcdir) @machine_incs@ \
-I$(top_srcdir)/include -I$(top_srcdir)/intl @GUILE_INCS@ \
-DGTOPLOCALEDIR=\"$(datadir)/locale\" -D_GNU_SOURCE
CFLAGS = -Wall -W @CFLAGS@ -DGTOP_SERVER=\""@LIBGTOP_SERVER@"\" -DDEBUG -DREAL_DEBUG
bin_PROGRAMS = gnuserv
EXTRA_PROGRAMS = gtop_daemon
gnuserv_SOURCES = gnuserv.c main.c
gnuserv_LDADD = $(top_builddir)/lib/libgtop.la \
$(top_builddir)/sysdeps/common/libgtop_common.la \
$(top_builddir)/sysdeps/@sysdeps_dir@/libgtop_sysdeps.la \
@INTLLIBS@ @LIBSUPPORT@ @X_LIBS@ -lXau
gnuserv_LDFLAGS = -static
gtop_daemon_SOURCES = main.c inet.c loop.c output.c version.c
gtop_daemon_LDADD = $(top_builddir)/lib/libgtop.la \
$(top_builddir)/sysdeps/common/libgtop_common.la \
$(top_builddir)/sysdeps/@sysdeps_dir@/libgtop_sysdeps.la \
@INTLLIBS@ @LIBSUPPORT@
gtop_daemon_LDFLAGS = -static

835
src/daemon/gnuserv.c Normal file
View File

@@ -0,0 +1,835 @@
/* -*-C-*-
Server code for handling requests from clients and forwarding them
on to the GNU Emacs process.
This file is part of GNU Emacs.
Copying is permitted under those conditions described by the GNU
General Public License.
Copyright (C) 1989 Free Software Foundation, Inc.
Author: Andy Norman (ange@hplb.hpl.hp.com), based on 'etc/server.c'
from the 18.52 GNU Emacs distribution.
Please mail bugs and suggestions to the author at the above address.
*/
/* HISTORY
* 11-Nov-1990 bristor@simba
* Added EOT stuff.
*/
/*
* This file incorporates new features added by Bob Weiner <weiner@mot.com>,
* Darrell Kindred <dkindred@cmu.edu> and Arup Mukherjee <arup@cmu.edu>.
* Please see the note at the end of the README file for details.
*
* (If gnuserv came bundled with your emacs, the README file is probably
* ../etc/gnuserv.README relative to the directory containing this file)
*/
#if 0
static char rcsid [] = "!Header: gnuserv.c,v 2.1 95/02/16 11:58:27 arup alpha !";
#endif
#define DEBUG
#include <glibtop/gnuserv.h>
#include <glibtop/open.h>
#ifdef AIX
#include <sys/select.h>
#endif
extern void handle_socket_connection __P((glibtop *, int));
#if !defined(SYSV_IPC) && !defined(UNIX_DOMAIN_SOCKETS) && !defined(INTERNET_DOMAIN_SOCKETS)
main ()
{
fprintf (stderr,"Sorry, the Emacs server is only supported on systems that have\n");
fprintf (stderr,"Unix Domain sockets, Internet Domain sockets or System V IPC\n");
exit (1);
} /* main */
#else /* SYSV_IPC || UNIX_DOMAIN_SOCKETS || INTERNET_DOMAIN_SOCKETS */
#ifdef SYSV_IPC
int ipc_qid = 0; /* ipc message queue id */
int ipc_wpid = 0; /* watchdog task pid */
/*
ipc_exit -- clean up the queue id and queue, then kill the watchdog task
if it exists. exit with the given status.
*/
void
ipc_exit (int stat)
{
msgctl (ipc_qid,IPC_RMID,0);
if (ipc_wpid != 0)
kill (ipc_wpid, SIGKILL);
exit (stat);
} /* ipc_exit */
/*
ipc_handle_signal -- catch the signal given and clean up.
*/
void
ipc_handle_signal(int sig)
{
ipc_exit (0);
} /* ipc_handle_signal */
/*
ipc_spawn_watchdog -- spawn a watchdog task to clean up the message queue should the
server process die.
*/
void
ipc_spawn_watchdog (void)
{
if ((ipc_wpid = fork ()) == 0)
{ /* child process */
int ppid = getppid (); /* parent's process id */
setpgrp(); /* gnu kills process group on exit */
while (1)
{
if (kill (ppid, 0) < 0) /* ppid is no longer valid, parent
may have died */
{
ipc_exit (0);
} /* if */
sleep(10); /* have another go later */
} /* while */
} /* if */
} /* ipc_spawn_watchdog */
/*
ipc_init -- initialize server, setting the global msqid that can be listened on.
*/
void
ipc_init (struct msgbuf **msgpp)
{
key_t key; /* messge key */
char buf[GSERV_BUFSZ]; /* pathname for key */
sprintf (buf,"/tmp/lgtd%d",(int)geteuid ());
creat (buf,0600);
key = ftok (buf,1);
if ((ipc_qid = msgget (key,0600|IPC_CREAT)) == -1)
glibtop_error_io ("unable to create msg queue");
ipc_spawn_watchdog ();
signal (SIGTERM,ipc_handle_signal);
signal (SIGINT,ipc_handle_signal);
if ((*msgpp = (struct msgbuf *)
malloc (sizeof **msgpp + GSERV_BUFSZ)) == NULL)
{
glibtop_warn_io ("unable to allocate space for message buffer");
ipc_exit(1);
} /* if */
} /* ipc_init */
/*
handle_ipc_request -- accept a request from a client, pass the request on
to the GNU Emacs process, then wait for its reply and
pass that on to the client.
*/
void
handle_ipc_request (struct msgbuf *msgp)
{
struct msqid_ds msg_st; /* message status */
char buf[GSERV_BUFSZ];
int len; /* length of message / read */
int s, result_len; /* tag fields on the response from emacs */
int offset = 0;
int total = 1; /* # bytes that will actually be sent off */
if ((len = msgrcv (ipc_qid, msgp, GSERV_BUFSZ - 1, 1, 0)) < 0)
{
glibtop_warn_io ("msgrcv");
ipc_exit (1);
} /* if */
msgctl (ipc_qid, IPC_STAT, &msg_st);
strncpy (buf, msgp->mtext, len);
buf[len] = '\0'; /* terminate */
printf ("%d %s", ipc_qid, buf);
fflush (stdout);
/* now for the response from gnu */
msgp->mtext[0] = '\0';
#if 0
if ((len = read(0,buf,GSERV_BUFSZ-1)) < 0)
{
glibtop_warn_io ("read");
ipc_exit (1);
} /* if */
sscanf (buf, "%d:%[^\n]\n", &junk, msgp->mtext);
#else
/* read in "n/m:" (n=client fd, m=message length) */
while (offset < (GSERV_BUFSZ-1) &&
((len = read (0, buf + offset, 1)) > 0) &&
buf[offset] != ':')
{
offset += len;
}
if (len < 0)
glibtop_error_io ("read");
/* parse the response from emacs, getting client fd & result length */
buf[offset] = '\0';
sscanf (buf, "%d/%d", &s, &result_len);
while (result_len > 0)
{
if ((len = read(0, buf, min2 (result_len, GSERV_BUFSZ - 1))) < 0)
glibtop_error_io ("read");
/* Send this string off, but only if we have enough space */
if (GSERV_BUFSZ > total)
{
if (total + len <= GSERV_BUFSZ)
buf[len] = 0;
else
buf[GSERV_BUFSZ - total] = 0;
send_string(s,buf);
total += strlen(buf);
}
result_len -= len;
}
/* eat the newline */
while ((len = read (0,buf,1)) == 0)
;
if (len < 0)
glibtop_error_io ("read");
if (buf[0] != '\n')
glibtop_error ("garbage after result [%c]", buf[0]);
#endif
/* Send a response back to the client. */
msgp->mtype = msg_st.msg_lspid;
if (msgsnd (ipc_qid,msgp,strlen(msgp->mtext)+1,0) < 0)
glibtop_warn_io ("msgsend(gnuserv)");
} /* handle_ipc_request */
#endif /* SYSV_IPC */
#if defined(INTERNET_DOMAIN_SOCKETS) || defined(UNIX_DOMAIN_SOCKETS)
/*
echo_request -- read request from a given socket descriptor, and send the information
to stdout (the gnu process).
*/
static void
echo_request (int s)
{
char buf[GSERV_BUFSZ];
int len;
printf("%d ",s);
/* read until we get a newline or no characters */
while ((len = recv(s,buf,GSERV_BUFSZ-1,0)) > 0) {
buf[len] = '\0';
printf("%s",buf);
if (buf[len-1] == EOT_CHR) {
fflush(stdout);
break; /* end of message */
}
} /* while */
if (len < 0)
glibtop_error_io ("recv");
} /* echo_request */
/*
handle_response -- accept a response from stdin (the gnu process) and pass the
information on to the relevant client.
*/
static void
handle_response (void)
{
#if 0
char buf[GSERV_BUFSZ+1];
int offset=0;
int s;
int len;
int result_len;
/* read in "n/m:" (n=client fd, m=message length) */
while (offset < GSERV_BUFSZ &&
((len = read(0,buf+offset,1)) > 0) &&
buf[offset] != ':') {
offset += len;
}
if (len < 0)
glibtop_error_io ("read");
/* parse the response from emacs, getting client fd & result length */
buf[offset] = '\0';
sscanf(buf,"%d/%d", &s, &result_len);
while (result_len > 0) {
if ((len = read(0,buf,min2(result_len,GSERV_BUFSZ))) < 0)
glibtop_error_io ("read");
buf[len] = '\0';
send_string(s,buf);
result_len -= len;
}
/* eat the newline */
while ((len = read(0,buf,1)) == 0)
;
if (len < 0)
glibtop_error_io ("read");
if (buf[0] != '\n')
glibtop_error ("garbage after result");
/* send the newline */
buf[1] = '\0';
send_string(s,buf);
close(s);
#else
glibtop_error ("handle_response (): Function not implemented");
#endif
} /* handle_response */
#endif /* INTERNET_DOMAIN_SOCKETS || UNIX_DOMAIN_SOCKETS */
#ifdef INTERNET_DOMAIN_SOCKETS
struct entry {
u_long host_addr;
struct entry *next;
};
struct entry *permitted_hosts[TABLE_SIZE];
#ifdef AUTH_MAGIC_COOKIE
# include <X11/X.h>
# include <X11/Xauth.h>
static Xauth *server_xauth = NULL;
#endif
static int
timed_read (int fd, char *buf, int max, int timeout, int one_line)
{
fd_set rmask;
struct timeval tv; /* = {timeout, 0}; */
char c = 0;
int nbytes = 0;
int r;
tv.tv_sec = timeout;
tv.tv_usec = 0;
FD_ZERO(&rmask);
FD_SET(fd, &rmask);
do
{
r = select(fd + 1, &rmask, NULL, NULL, &tv);
if (r > 0)
{
if (read (fd, &c, 1) == 1 )
{
*buf++ = c;
++nbytes;
}
else
{
glibtop_warn_io ("read error on socket");
return -1;
}
}
else if (r == 0)
{
glibtop_warn ("read timed out");
return -1;
}
else
{
glibtop_warn_io ("error in select");
return -1;
}
} while ((nbytes < max) && !(one_line && (c == '\n')));
--buf;
if (one_line && *buf == '\n')
{
*buf = 0;
}
return nbytes;
}
/*
permitted -- return whether a given host is allowed to connect to the server.
*/
static int
permitted (u_long host_addr, int fd)
{
int key;
struct entry *entry;
char auth_protocol[128];
char buf[1024];
int auth_data_len;
if (fd > 0)
{
/* we are checking permission on a real connection */
/* Read auth protocol name */
if (timed_read(fd, auth_protocol, AUTH_NAMESZ, AUTH_TIMEOUT, 1) <= 0)
return FALSE;
#ifdef DEBUG
fprintf (stderr, "Client sent authenticatin protocol '%s'\n", auth_protocol);
#endif
if (strcmp (auth_protocol, DEFAUTH_NAME) &&
strcmp (auth_protocol, MCOOKIE_NAME))
{
glibtop_warn ("Authentication protocol from client is invalid", auth_protocol);
return FALSE;
}
if (!strcmp (auth_protocol, MCOOKIE_NAME))
{
/*
* doing magic cookie auth
*/
if (timed_read (fd, buf, 10, AUTH_TIMEOUT, 1) <= 0)
return FALSE;
auth_data_len = atoi (buf);
if (timed_read (fd, buf, auth_data_len, AUTH_TIMEOUT, 0) != auth_data_len)
return FALSE;
#ifdef AUTH_MAGIC_COOKIE
if (server_xauth && server_xauth->data &&
!memcmp (buf, server_xauth->data, auth_data_len))
{
return TRUE;
}
#else
glibtop_warn ("client tried Xauth, but server is not compiled with Xauth");
#endif
/*
* auth failed, but allow this to fall through to the GNU_SECURE
* protocol....
*/
glibtop_warn ("Xauth authentication failed, trying GNU_SECURE auth...");
}
/* Other auth protocols go here, and should execute only if the
* auth_protocol name matches.
*/
}
/* Now, try the old GNU_SECURE stuff... */
/* First find the hash key */
key = HASH(host_addr) % TABLE_SIZE;
#ifdef DEBUG
fprintf (stderr, "Doing GNU_SECURE auth ...\n");
#endif
/* Now check the chain for that hash key */
for(entry = permitted_hosts [key]; entry != NULL; entry = entry->next) {
#ifdef DEBUG
fprintf (stderr, "Trying %ld\n", entry->host_addr);
#endif
if (host_addr == entry->host_addr)
return(TRUE);
}
return(FALSE);
} /* permitted */
/*
add_host -- add the given host to the list of permitted hosts, provided it isn't
already there.
*/
static void
add_host (u_long host_addr)
{
int key;
struct entry *new_entry;
if (!permitted (host_addr, -1))
{
if ((new_entry = (struct entry *) malloc(sizeof(struct entry))) == NULL)
glibtop_error_io ("unable to malloc space for permitted host entry");
new_entry->host_addr = host_addr;
key = HASH(host_addr) % TABLE_SIZE;
new_entry->next = permitted_hosts[key];
permitted_hosts[key] = new_entry;
} /* if */
} /* add_host */
/*
setup_table -- initialise the table of hosts allowed to contact the server,
by reading from the file specified by the GNU_SECURE
environment variable
Put in the local machine, and, if a security file is specifed,
add each host that is named in the file.
Return the number of hosts added.
*/
static int
setup_table (void)
{
FILE *host_file;
char *file_name;
char hostname[HOSTNAMSZ];
u_int host_addr;
int i, hosts=0;
/* Make sure every entry is null */
for (i = 0; i < TABLE_SIZE; i++)
permitted_hosts [i] = NULL;
gethostname (hostname, HOSTNAMSZ);
if (((long) host_addr = glibtop_internet_addr (hostname)) == -1)
glibtop_error ("unable to find %s in /etc/hosts or from YP", hostname);
#ifdef AUTH_MAGIC_COOKIE
server_xauth = XauGetAuthByAddr (FamilyInternet,
sizeof(host_addr), (char *)&host_addr,
strlen(MCOOKIE_SCREEN), MCOOKIE_SCREEN,
strlen(MCOOKIE_X_NAME), MCOOKIE_X_NAME);
hosts++;
#endif /* AUTH_MAGIC_COOKIE */
#if 0 /* Don't even want to allow access from the local host by default */
add_host (host_addr); /* add local host */
hosts++;
#endif
if (((file_name = getenv ("GNU_SECURE")) != NULL && /* security file */
(host_file = fopen (file_name, "r")) != NULL)) /* opened ok */
{
while ((fscanf (host_file, "%s", hostname) != EOF)) /* find a host */
if (((long) host_addr = glibtop_internet_addr (hostname)) != -1)/* get its addr */
{
add_host (host_addr); /* add the addr */
hosts++;
}
fclose (host_file);
} /* if */
return hosts;
} /* setup_table */
/*
internet_init -- initialize server, returning an internet socket that can
be listened on.
*/
static int
internet_init (void)
{
int ls; /* socket descriptor */
struct servent *sp; /* pointer to service information */
struct sockaddr_in server; /* for local socket address */
char *ptr; /* ptr to return from getenv */
if (setup_table() == 0)
return -1;
/* clear out address structure */
memset((char *)&server, 0, sizeof (struct sockaddr_in));
/* Set up address structure for the listen socket. */
server.sin_family = AF_INET;
server.sin_addr.s_addr = INADDR_ANY;
/* Find the information for the gnu server
* in order to get the needed port number.
*/
if ((ptr = getenv ("GNU_PORT")) != NULL)
server.sin_port = htons (atoi (ptr));
else if ((sp = getservbyname ("gnuserv", "tcp")) == NULL)
server.sin_port = htons (DEFAULT_PORT+getuid());
else
server.sin_port = sp->s_port;
/* Create the listen socket. */
if ((ls = socket (AF_INET,SOCK_STREAM, 0)) == -1)
glibtop_error_io ("unable to create socket");
/* Bind the listen address to the socket. */
if (bind(ls,(struct sockaddr *) &server,sizeof(struct sockaddr_in)) == -1)
glibtop_error_io ("bind");
/* Initiate the listen on the socket so remote users
* can connect.
*/
if (listen(ls,20) == -1)
glibtop_error_io ("listen");
return(ls);
} /* internet_init */
/*
handle_internet_request -- accept a request from a client and send the information
to stdout (the gnu process).
*/
static void
handle_internet_request (int ls)
{
int s;
size_t addrlen = sizeof(struct sockaddr_in);
struct sockaddr_in peer; /* for peer socket address */
memset((char *)&peer, 0, sizeof (struct sockaddr_in));
if ((s = accept (ls, (struct sockaddr *)&peer, (void *) &addrlen)) == -1)
glibtop_error_io ("accept");
#ifdef DEBUG
fprintf (stderr, "Connection was made from %s.\n", inet_ntoa (peer.sin_addr));
#endif
/* Check that access is allowed - if not return crud to the client */
if (!permitted (peer.sin_addr.s_addr, s))
{
close(s);
glibtop_warn ("Refused connection from %s.", inet_ntoa (peer.sin_addr));
return;
} /* if */
#ifdef DEBUG
fprintf (stderr, "Accepted connection from %s.\n", inet_ntoa (peer.sin_addr));
#endif
handle_socket_connection (&glibtop_global_server, s);
close (s);
#ifdef DEBUG
fprintf (stderr, "Closed connection to %s.\n", inet_ntoa (peer.sin_addr));
#endif
} /* handle_internet_request */
#endif /* INTERNET_DOMAIN_SOCKETS */
#ifdef UNIX_DOMAIN_SOCKETS
/*
unix_init -- initialize server, returning an unix-domain socket that can
be listened on.
*/
static int
unix_init (void)
{
int ls; /* socket descriptor */
struct sockaddr_un server; /* unix socket address */
int bindlen;
if ((ls = socket (AF_UNIX,SOCK_STREAM, 0)) < 0)
glibtop_error_io ("unable to create socket");
/* Set up address structure for the listen socket. */
#ifdef HIDE_UNIX_SOCKET
sprintf (server.sun_path, "/tmp/lgtddir%d", (int)geteuid());
if (mkdir (server.sun_path, 0700) < 0)
{
/* assume it already exists, and try to set perms */
if (chmod (server.sun_path, 0700) < 0)
glibtop_error_io ("Can't set permissions on %s", server.sun_path);
}
strcat(server.sun_path, "/lgtd");
unlink(server.sun_path); /* remove old file if it exists */
#else /* HIDE_UNIX_SOCKET */
sprintf(server.sun_path, "/tmp/lgtd%d", (int)geteuid());
unlink(server.sun_path); /* remove old file if it exists */
#endif /* HIDE_UNIX_SOCKET */
server.sun_family = AF_UNIX;
#ifdef HAVE_SOCKADDR_SUN_LEN
/* See W. R. Stevens "Advanced Programming in the Unix Environment"
p. 502 */
bindlen = (sizeof (server.sun_len) + sizeof (server.sun_family)
+ strlen (server.sun_path) + 1);
server.sun_len = bindlen;
#else
bindlen = strlen (server.sun_path) + sizeof (server.sun_family);
#endif
if (bind (ls, (struct sockaddr *)&server, bindlen) < 0)
glibtop_error_io ("bind");
chmod(server.sun_path,0700); /* only this user can send commands */
if (listen(ls,20) < 0)
glibtop_error_io ("listen");
/* #### there are also better ways of dealing with this when
sigvec() is present. */
#if defined (HAVE_SIGPROCMASK)
{
sigset_t _mask;
sigemptyset (&_mask);
sigaddset (&_mask, SIGPIPE);
sigprocmask (SIG_BLOCK, &_mask, NULL);
}
#else
signal (SIGPIPE, SIG_IGN); /* in case user kills client */
#endif
return (ls);
} /* unix_init */
/*
handle_unix_request -- accept a request from a client and send the information
to stdout (the gnu process).
*/
static void
handle_unix_request (int ls)
{
int s;
size_t len = sizeof(struct sockaddr_un);
struct sockaddr_un server; /* for unix socket address */
server.sun_family = AF_UNIX;
if ((s = accept (ls, (struct sockaddr *)&server, (void *)&len)) < 0)
glibtop_error_io ("accept");
echo_request(s);
} /* handle_unix_request */
#endif /* UNIX_DOMAIN_SOCKETS */
int
main(argc,argv)
int argc;
char *argv[];
{
int chan; /* temporary channel number */
int ils = -1; /* internet domain listen socket */
int uls = -1; /* unix domain listen socket */
#ifdef SYSV_IPC
struct msgbuf *msgp; /* message buffer */
#endif /* SYSV_IPC */
glibtop_init_r (&glibtop_global_server, 0, GLIBTOP_OPEN_NO_OVERRIDE);
for(chan=3; chan < _NFILE; close(chan++)) /* close unwanted channels */
;
#ifdef SYSV_IPC
ipc_init(&msgp); /* get a msqid to listen on, and a message buffer */
#endif /* SYSV_IPC */
#ifdef INTERNET_DOMAIN_SOCKETS
ils = internet_init(); /* get a internet domain socket to listen on */
#endif /* INTERNET_DOMAIN_SOCKETS */
#ifdef UNIX_DOMAIN_SOCKETS
uls = unix_init(); /* get a unix domain socket to listen on */
#endif /* UNIX_DOMAIN_SOCKETS */
while (1) {
#ifdef SYSV_IPC
handle_ipc_request(msgp);
#else /* NOT SYSV_IPC */
fd_set rmask;
FD_ZERO(&rmask);
FD_SET(fileno(stdin), &rmask);
if (uls >= 0)
FD_SET(uls, &rmask);
if (ils >= 0)
FD_SET(ils, &rmask);
#ifdef DEBUG
fprintf (stderr, "Server ready and waiting for connections.\n");
#endif
if (select(max2(fileno(stdin),max2(uls,ils)) + 1, &rmask,
(fd_set *)NULL, (fd_set *)NULL, (struct timeval *)NULL) < 0)
glibtop_error_io ("select");
#ifdef UNIX_DOMAIN_SOCKETS
if (uls > 0 && FD_ISSET(uls, &rmask))
handle_unix_request(uls);
#endif
#ifdef INTERNET_DOMAIN_SOCKETS
if (ils > 0 && FD_ISSET(ils, &rmask))
handle_internet_request(ils);
#endif /* INTERNET_DOMAIN_SOCKETS */
if (FD_ISSET(fileno(stdin), &rmask)) /* from stdin (gnu process) */
handle_response();
#endif /* NOT SYSV_IPC */
} /* while */
return 0;
} /* main */
#endif /* SYSV_IPC || UNIX_DOMAIN_SOCKETS || INTERNET_DOMAIN_SOCKETS */

218
src/daemon/main.c Normal file
View File

@@ -0,0 +1,218 @@
/* $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/gnuserv.h>
#include <glibtop/command.h>
#include <glibtop/version.h>
#include <glibtop/xmalloc.h>
#include <glibtop/union.h>
#include <glibtop/open.h>
#include <fcntl.h>
#include <locale.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
#define _offset_union(p) ((char *) &response.u.p - (char *) &response)
#define _offset_data(p) _offset_union (data.p)
static void
do_output (int s, glibtop_response *response, off_t offset,
size_t data_size, const void *data)
{
#ifdef REAL_DEBUG
fprintf (stderr, "Really writing %d bytes at offset %d.\n",
sizeof (glibtop_response), offset);
#endif
response->offset = offset;
response->data_size = data_size;
if (send (s, response, sizeof (glibtop_response), 0) < 0)
glibtop_warn_io ("send");
if (response->data_size) {
#ifdef REAL_DEBUG
fprintf (stderr, "Writing %d bytes of data.\n", response->data_size);
#endif
if (send (s, data, response->data_size, 0) , 0)
glibtop_warn_io ("send");
}
}
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) {
glibtop_error_io ("recv");
return;
}
already_read += nread;
remaining -= nread;
(char *) ptr += nread;
fprintf (stderr, "READ (%d): %d - %d - %d\n",
nread, already_read, remaining, total_size);
}
}
void
handle_socket_connection (glibtop *server, int s)
{
pid_t pid;
char parameter [BUFSIZ];
struct timeval tv;
glibtop_response response;
glibtop_command cmnd;
void *ptr;
tv.tv_sec = 5;
tv.tv_usec = 0;
while(1) {
do_read (s, &cmnd, sizeof (glibtop_command));
#ifdef REAL_DEBUG
fprintf (stderr, "Received command %d from client.\n", cmnd.command);
#endif
if (cmnd.data_size >= BUFSIZ) {
glibtop_warn ("Client sent %d bytes, but buffer is %d", cmnd.size, BUFSIZ);
return;
}
memset (parameter, 0, sizeof (parameter));
if (cmnd.data_size) {
#ifdef REAL_DEBUG
fprintf (stderr, "Client has %d bytes of data.\n", cmnd.data_size);
#endif
do_read (s, parameter, cmnd.data_size);
} else if (cmnd.size) {
memcpy (parameter, cmnd.parameter, cmnd.size);
}
switch (cmnd.command) {
case GLIBTOP_CMND_SYSDEPS:
response.u.sysdeps.features = GLIBTOP_SYSDEPS_ALL;
do_output (s, &response, _offset_union (sysdeps), 0, NULL);
break;
case GLIBTOP_CMND_CPU:
glibtop_get_cpu_l (server, &response.u.data.cpu);
do_output (s, &response, _offset_data (cpu), 0, NULL);
break;
case GLIBTOP_CMND_MEM:
glibtop_get_mem_l (server, &response.u.data.mem);
do_output (s, &response, _offset_data (mem), 0, NULL);
break;
case GLIBTOP_CMND_SWAP:
glibtop_get_swap_l (server, &response.u.data.swap);
do_output (s, &response, _offset_data (swap), 0, NULL);
break;
case GLIBTOP_CMND_UPTIME:
glibtop_get_uptime_l (server, &response.u.data.uptime);
do_output (s, &response, _offset_data (uptime), 0, NULL);
break;
case GLIBTOP_CMND_LOADAVG:
glibtop_get_loadavg_l (server, &response.u.data.loadavg);
do_output (s, &response, _offset_data (loadavg), 0, NULL);
break;
case GLIBTOP_CMND_SHM_LIMITS:
glibtop_get_shm_limits_l (server, &response.u.data.shm_limits);
do_output (s, &response, _offset_data (shm_limits), 0, NULL);
break;
case GLIBTOP_CMND_MSG_LIMITS:
glibtop_get_msg_limits_l (server, &response.u.data.msg_limits);
do_output (s, &response, _offset_data (msg_limits), 0, NULL);
break;
case GLIBTOP_CMND_SEM_LIMITS:
glibtop_get_sem_limits_l (server, &response.u.data.sem_limits);
do_output (s, &response, _offset_data (sem_limits), 0, NULL);
break;
case GLIBTOP_CMND_PROCLIST:
ptr = glibtop_get_proclist_l (server, &response.u.data.proclist);
do_output (s, &response, _offset_data (proclist),
response.u.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_l
(server, &response.u.data.proc_state, pid);
do_output (s, &response, _offset_data (proc_state), 0, NULL);
break;
case GLIBTOP_CMND_PROC_UID:
pid = 1;
memcpy (&pid, parameter, sizeof (pid_t));
glibtop_get_proc_uid_l
(server, &response.u.data.proc_uid, pid);
do_output (s, &response, _offset_data (proc_uid), 0, NULL);
break;
case GLIBTOP_CMND_PROC_MEM:
memcpy (&pid, parameter, sizeof (pid_t));
glibtop_get_proc_mem_l
(server, &response.u.data.proc_mem, pid);
do_output (s, &response, _offset_data (proc_mem), 0, NULL);
break;
case GLIBTOP_CMND_PROC_TIME:
memcpy (&pid, parameter, sizeof (pid_t));
glibtop_get_proc_time_l
(server, &response.u.data.proc_time, pid);
do_output (s, &response, _offset_data (proc_time), 0, NULL);
break;
case GLIBTOP_CMND_PROC_SIGNAL:
memcpy (&pid, parameter, sizeof (pid_t));
glibtop_get_proc_signal_l
(server, &response.u.data.proc_signal, pid);
do_output (s, &response, _offset_data (proc_signal), 0, NULL);
break;
case GLIBTOP_CMND_PROC_KERNEL:
memcpy (&pid, parameter, sizeof (pid_t));
glibtop_get_proc_kernel_l
(server, &response.u.data.proc_kernel, pid);
do_output (s, &response, _offset_data (proc_kernel), 0, NULL);
break;
case GLIBTOP_CMND_PROC_SEGMENT:
memcpy (&pid, parameter, sizeof (pid_t));
glibtop_get_proc_segment_l
(server, &response.u.data.proc_segment, pid);
do_output (s, &response, _offset_data (proc_segment), 0, NULL);
break;
}
}
}

View File

@@ -12,5 +12,5 @@ gtop_proxy_SOURCES = main.c output.c version.c
gtop_proxy_LDADD = $(top_builddir)/lib/libgtop.la \
$(top_builddir)/sysdeps/common/libgtop_common.la \
$(top_builddir)/sysdeps/@sysdeps_dir@/libgtop_sysdeps.la \
@INTLLIBS@ @LIBSUPPORT@
@INTLLIBS@ @LIBSUPPORT@ @libs_xauth@
gtop_proxy_LDFLAGS = -static

View File

@@ -8,5 +8,4 @@ CFLAGS = -Wall -W @CFLAGS@
lib_LTLIBRARIES = libgtop_common.la
libgtop_common_la_SOURCES = sysdeps.c xmalloc.c error.c
libgtop_common_la_SOURCES = sysdeps.c xmalloc.c error.c gnuslib.c

View File

@@ -37,3 +37,46 @@ glibtop_error_r (glibtop *server, char *format, ...)
va_end (ap);
exit (1);
}
void
glibtop_error_io_r (glibtop *server, char *format, ...)
{
va_list ap;
va_start (ap, format);
fprintf (stderr, "%s: ", server->name);
vfprintf (stderr, format, ap);
fprintf (stderr, ": %s\n", strerror (errno));
va_end (ap);
exit (1);
}
void
glibtop_warn_r (glibtop *server, char *format, ...)
{
va_list ap;
va_start (ap, format);
fprintf (stderr, "%s: ", server->name);
vfprintf (stderr, format, ap);
fprintf (stderr, "\n");
va_end (ap);
}
void
glibtop_warn_io_r (glibtop *server, char *format, ...)
{
va_list ap;
va_start (ap, format);
fprintf (stderr, "%s: ", server->name);
vfprintf (stderr, format, ap);
fprintf (stderr, ": %s\n", strerror (errno));
va_end (ap);
}

274
sysdeps/common/fsusage.c Normal file
View File

@@ -0,0 +1,274 @@
/* fsusage.c -- return space usage of mounted filesystems
Copyright (C) 1991, 1992, 1996 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
This program 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 General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software Foundation,
Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
#if HAVE_CONFIG_H
# include <config.h>
#endif
#include <sys/types.h>
#include <sys/stat.h>
#include "fsusage.h"
int statfs ();
#if HAVE_SYS_PARAM_H
# include <sys/param.h>
#endif
#if HAVE_SYS_MOUNT_H
# include <sys/mount.h>
#endif
#if HAVE_SYS_VFS_H
# include <sys/vfs.h>
#endif
#if HAVE_SYS_FS_S5PARAM_H /* Fujitsu UXP/V */
# include <sys/fs/s5param.h>
#endif
#if defined (HAVE_SYS_FILSYS_H) && !defined (_CRAY)
# include <sys/filsys.h> /* SVR2 */
#endif
#if HAVE_FCNTL_H
# include <fcntl.h>
#endif
#if HAVE_SYS_STATFS_H
# include <sys/statfs.h>
#endif
#if HAVE_DUSTAT_H /* AIX PS/2 */
# include <sys/dustat.h>
#endif
#if HAVE_SYS_STATVFS_H /* SVR4 */
# include <sys/statvfs.h>
int statvfs ();
#endif
int safe_read ();
/* Return the number of TOSIZE-byte blocks used by
BLOCKS FROMSIZE-byte blocks, rounding away from zero.
TOSIZE must be positive. Return -1 if FROMSIZE is not positive. */
static long
adjust_blocks (blocks, fromsize, tosize)
long blocks;
int fromsize, tosize;
{
if (tosize <= 0)
abort ();
if (fromsize <= 0)
return -1;
if (fromsize == tosize) /* e.g., from 512 to 512 */
return blocks;
else if (fromsize > tosize) /* e.g., from 2048 to 512 */
return blocks * (fromsize / tosize);
else /* e.g., from 256 to 512 */
return (blocks + (blocks < 0 ? -1 : 1)) / (tosize / fromsize);
}
/* Fill in the fields of FSP with information about space usage for
the filesystem on which PATH resides.
DISK is the device on which PATH is mounted, for space-getting
methods that need to know it.
Return 0 if successful, -1 if not. When returning -1, ensure that
ERRNO is either a system error value, or zero if DISK is NULL
on a system that requires a non-NULL value. */
int
get_fs_usage (path, disk, fsp)
const char *path;
const char *disk;
struct fs_usage *fsp;
{
#ifdef STAT_STATFS3_OSF1
# define CONVERT_BLOCKS(B) adjust_blocks ((B), fsd.f_fsize, 512)
struct statfs fsd;
if (statfs (path, &fsd, sizeof (struct statfs)) != 0)
return -1;
#endif /* STAT_STATFS3_OSF1 */
#ifdef STAT_STATFS2_FS_DATA /* Ultrix */
# define CONVERT_BLOCKS(B) adjust_blocks ((B), 1024, 512)
struct fs_data fsd;
if (statfs (path, &fsd) != 1)
return -1;
fsp->fsu_blocks = CONVERT_BLOCKS (fsd.fd_req.btot);
fsp->fsu_bfree = CONVERT_BLOCKS (fsd.fd_req.bfree);
fsp->fsu_bavail = CONVERT_BLOCKS (fsd.fd_req.bfreen);
fsp->fsu_files = fsd.fd_req.gtot;
fsp->fsu_ffree = fsd.fd_req.gfree;
#endif /* STAT_STATFS2_FS_DATA */
#ifdef STAT_READ_FILSYS /* SVR2 */
# ifndef SUPERBOFF
# define SUPERBOFF (SUPERB * 512)
# endif
# define CONVERT_BLOCKS(B) \
adjust_blocks ((B), (fsd.s_type == Fs2b ? 1024 : 512), 512)
struct filsys fsd;
int fd;
if (! disk)
{
errno = 0;
return -1;
}
fd = open (disk, O_RDONLY);
if (fd < 0)
return -1;
lseek (fd, (long) SUPERBOFF, 0);
if (safe_read (fd, (char *) &fsd, sizeof fsd) != sizeof fsd)
{
close (fd);
return -1;
}
close (fd);
fsp->fsu_blocks = CONVERT_BLOCKS (fsd.s_fsize);
fsp->fsu_bfree = CONVERT_BLOCKS (fsd.s_tfree);
fsp->fsu_bavail = CONVERT_BLOCKS (fsd.s_tfree);
fsp->fsu_files = (fsd.s_isize - 2) * INOPB * (fsd.s_type == Fs2b ? 2 : 1);
fsp->fsu_ffree = fsd.s_tinode;
#endif /* STAT_READ_FILSYS */
#ifdef STAT_STATFS2_BSIZE /* 4.3BSD, SunOS 4, HP-UX, AIX */
# define CONVERT_BLOCKS(B) adjust_blocks ((B), fsd.f_bsize, 512)
struct statfs fsd;
if (statfs (path, &fsd) < 0)
return -1;
# ifdef STATFS_TRUNCATES_BLOCK_COUNTS
/* In SunOS 4.1.2, 4.1.3, and 4.1.3_U1, the block counts in the
struct statfs are truncated to 2GB. These conditions detect that
truncation, presumably without botching the 4.1.1 case, in which
the values are not truncated. The correct counts are stored in
undocumented spare fields. */
if (fsd.f_blocks == 0x1fffff && fsd.f_spare[0] > 0)
{
fsd.f_blocks = fsd.f_spare[0];
fsd.f_bfree = fsd.f_spare[1];
fsd.f_bavail = fsd.f_spare[2];
}
# endif /* STATFS_TRUNCATES_BLOCK_COUNTS */
#endif /* STAT_STATFS2_BSIZE */
#ifdef STAT_STATFS2_FSIZE /* 4.4BSD */
# define CONVERT_BLOCKS(B) adjust_blocks ((B), fsd.f_fsize, 512)
struct statfs fsd;
if (statfs (path, &fsd) < 0)
return -1;
#endif /* STAT_STATFS2_FSIZE */
#ifdef STAT_STATFS4 /* SVR3, Dynix, Irix, AIX */
# if _AIX || defined(_CRAY)
# define CONVERT_BLOCKS(B) adjust_blocks ((B), fsd.f_bsize, 512)
# ifdef _CRAY
# define f_bavail f_bfree
# endif
# else
# define CONVERT_BLOCKS(B) (B)
# ifndef _SEQUENT_ /* _SEQUENT_ is DYNIX/ptx */
# ifndef DOLPHIN /* DOLPHIN 3.8.alfa/7.18 has f_bavail */
# define f_bavail f_bfree
# endif
# endif
# endif
struct statfs fsd;
if (statfs (path, &fsd, sizeof fsd, 0) < 0)
return -1;
/* Empirically, the block counts on most SVR3 and SVR3-derived
systems seem to always be in terms of 512-byte blocks,
no matter what value f_bsize has. */
#endif /* STAT_STATFS4 */
#ifdef STAT_STATVFS /* SVR4 */
# define CONVERT_BLOCKS(B) \
adjust_blocks ((B), fsd.f_frsize ? fsd.f_frsize : fsd.f_bsize, 512)
struct statvfs fsd;
if (statvfs (path, &fsd) < 0)
return -1;
/* f_frsize isn't guaranteed to be supported. */
#endif /* STAT_STATVFS */
#if !defined(STAT_STATFS2_FS_DATA) && !defined(STAT_READ_FILSYS)
/* !Ultrix && !SVR2 */
fsp->fsu_blocks = CONVERT_BLOCKS (fsd.f_blocks);
fsp->fsu_bfree = CONVERT_BLOCKS (fsd.f_bfree);
fsp->fsu_bavail = CONVERT_BLOCKS (fsd.f_bavail);
fsp->fsu_files = fsd.f_files;
fsp->fsu_ffree = fsd.f_ffree;
#endif /* not STAT_STATFS2_FS_DATA && not STAT_READ_FILSYS */
return 0;
}
#if defined(_AIX) && defined(_I386)
/* AIX PS/2 does not supply statfs. */
int
statfs (path, fsb)
char *path;
struct statfs *fsb;
{
struct stat stats;
struct dustat fsd;
if (stat (path, &stats))
return -1;
if (dustat (stats.st_dev, 0, &fsd, sizeof (fsd)))
return -1;
fsb->f_type = 0;
fsb->f_bsize = fsd.du_bsize;
fsb->f_blocks = fsd.du_fsize - fsd.du_isize;
fsb->f_bfree = fsd.du_tfree;
fsb->f_bavail = fsd.du_tfree;
fsb->f_files = (fsd.du_isize - 2) * fsd.du_inopb;
fsb->f_ffree = fsd.du_tinode;
fsb->f_fsid.val[0] = fsd.du_site;
fsb->f_fsid.val[1] = fsd.du_pckno;
return 0;
}
#endif /* _AIX && _I386 */

37
sysdeps/common/fsusage.h Normal file
View File

@@ -0,0 +1,37 @@
/* fsusage.h -- declarations for filesystem space usage info
Copyright (C) 1991, 1992 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
This program 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 General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software Foundation,
Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
/* Space usage statistics for a filesystem. Blocks are 512-byte. */
struct fs_usage
{
long fsu_blocks; /* Total blocks. */
long fsu_bfree; /* Free blocks available to superuser. */
long fsu_bavail; /* Free blocks available to non-superuser. */
long fsu_files; /* Total file nodes. */
long fsu_ffree; /* Free file nodes. */
};
#ifndef __P
#if defined (__GNUC__) || (defined (__STDC__) && __STDC__)
#define __P(args) args
#else
#define __P(args) ()
#endif /* GCC. */
#endif /* Not __P. */
int get_fs_usage __P ((const char *path, const char *disk,
struct fs_usage *fsp));

433
sysdeps/common/gnuslib.c Normal file
View File

@@ -0,0 +1,433 @@
/* -*-C-*-
Common library code for the GNU Emacs server and client.
This file is part of GNU Emacs.
Copying is permitted under those conditions described by the GNU
General Public License.
Copyright (C) 1989 Free Software Foundation, Inc.
Author: Andy Norman (ange@hplb.hpl.hp.com), based on
'etc/server.c' and 'etc/emacsclient.c' from the 18.52 GNU
Emacs distribution.
Please mail bugs and suggestions to the author at the above address.
*/
/* HISTORY
* 11-Nov-1990 bristor@simba
* Added EOT stuff.
*/
/*
* This file incorporates new features added by Bob Weiner <weiner@mot.com>,
* Darrell Kindred <dkindred@cmu.edu> and Arup Mukherjee <arup@cmu.edu>.
* Please see the note at the end of the README file for details.
*
* (If gnuserv came bundled with your emacs, the README file is probably
* ../etc/gnuserv.README relative to the directory containing this file)
*/
#if 0
static char rcsid [] = "!Header: gnuslib.c,v 2.4 95/02/16 11:57:37 arup alpha !";
#endif
#include <glibtop/gnuserv.h>
#include <fcntl.h>
#ifdef SYSV_IPC
static int connect_to_ipc_server (void);
#endif
#ifdef UNIX_DOMAIN_SOCKETS
static int connect_to_unix_server (void);
#endif
#ifdef INTERNET_DOMAIN_SOCKETS
static int connect_to_internet_server (const char *serverhost, u_short port);
#endif
/* On some systems, e.g. DGUX, inet_addr returns a 'struct in_addr'. */
#ifdef HAVE_BROKEN_INET_ADDR
# define IN_ADDR struct in_addr
# define NUMERIC_ADDR_ERROR (numeric_addr.s_addr == -1)
#else
# if (LONGBITS > 32)
# define IN_ADDR unsigned int
# else
# define IN_ADDR unsigned long
# endif
# define NUMERIC_ADDR_ERROR (numeric_addr == (IN_ADDR) -1)
#endif
#include <arpa/inet.h>
int
glibtop_make_connection (hostarg, portarg, s)
const char *hostarg;
int portarg;
int *s;
{
#ifdef INTERNET_DOMAIN_SOCKETS
char *ptr;
if (hostarg == NULL)
hostarg = getenv ("LIBGTOP_HOST");
if (portarg == 0 && (ptr = getenv("LIBGTOP_PORT")) != NULL)
portarg = atoi (ptr);
#endif
if (hostarg != NULL) {
/* hostname was given explicitly, via cmd line arg or LIBGTOP_HOST,
* so obey it. */
#ifdef UNIX_DOMAIN_SOCKETS
if (!strcmp (hostarg, "unix")) {
*s = connect_to_unix_server ();
return (int) CONN_UNIX;
}
#endif /* UNIX_DOMAIN_SOCKETS */
#ifdef INTERNET_DOMAIN_SOCKETS
*s = connect_to_internet_server (hostarg, portarg);
return (int) CONN_INTERNET;
#endif
#ifdef SYSV_IPC
return -1; /* hostarg should always be NULL for SYSV_IPC */
#endif
} else {
/* no hostname given. Use unix-domain/sysv-ipc, or
* internet-domain connection to local host if they're not available. */
#if defined(UNIX_DOMAIN_SOCKETS)
*s = connect_to_unix_server ();
return (int) CONN_UNIX;
#elif defined(SYSV_IPC)
*s = connect_to_ipc_server ();
return (int) CONN_IPC;
#elif defined(INTERNET_DOMAIN_SOCKETS)
{
char localhost [HOSTNAMSZ];
gethostname (localhost, HOSTNAMSZ); /* use this host by default */
*s = connect_to_internet_server (localhost, portarg);
return (int) CONN_INTERNET;
}
#endif /* IPC type */
}
}
#ifdef SYSV_IPC
/*
connect_to_ipc_server -- establish connection with server process via SYSV IPC
Returns msqid for server if successful.
*/
static int
connect_to_ipc_server (void)
{
int s; /* connected msqid */
key_t key; /* message key */
char buf [GSERV_BUFSZ+1]; /* buffer for filename */
sprintf (buf, "/tmp/lgtd%d", (int)geteuid());
creat (buf, 0600);
if ((key = ftok (buf, 1)) == -1)
glibtop_error_io ("unable to get ipc key from %s", buf);
if ((s = msgget (key, 0600)) == -1)
glibtop_error_io ("unable to access msg queue");
return(s);
} /* connect_to_ipc_server */
/*
disconnect_from_ipc_server -- inform the server that sending has finished,
and wait for its reply.
*/
void disconnect_from_ipc_server(s,msgp,echo)
int s;
struct msgbuf *msgp;
int echo;
{
int len; /* length of received message */
send_string(s,EOT_STR); /* EOT terminates this message */
msgp->mtype = 1;
if(msgsnd(s,msgp,strlen(msgp->mtext)+1,0) < 0) {
perror(progname);
fprintf(stderr,"%s: unable to send message to server\n",progname);
exit(1);
}; /* if */
if((len = msgrcv(s,msgp,GSERV_BUFSZ,getpid(),0)) < 0) {
perror(progname);
fprintf(stderr,"%s: unable to receive message from server\n",progname);
exit(1);
}; /* if */
if (echo) {
msgp->mtext[len] = '\0'; /* string terminate message */
fputs(msgp->mtext, stdout);
if (msgp->mtext[len-1] != '\n') putchar ('\n');
}; /* if */
} /* disconnect_from_ipc_server */
#endif /* SYSV_IPC */
#if defined(INTERNET_DOMAIN_SOCKETS) || defined(UNIX_DOMAIN_SOCKETS)
/*
send_string -- send string to socket.
*/
#if 0
static void
send_string(s,msg)
int s;
const char *msg;
{
#if 0
if (send(s,msg,strlen(msg),0) < 0) {
perror(progname);
fprintf(stderr,"%s: unable to send\n",progname);
exit(1);
}; /* if */
#else
int len, left=strlen(msg);
while (left > 0) {
if ((len=write(s,msg,min2(left,GSERV_BUFSZ))) < 0) {
/* XEmacs addition: robertl@arnet.com */
if (errno == EPIPE) {
return ;
}
perror(progname);
fprintf(stderr,"%s: unable to send\n",progname);
exit(1);
}; /* if */
left -= len;
msg += len;
}; /* while */
#endif
} /* send_string */
/*
read_line -- read a \n terminated line from a socket
*/
static int
read_line(int s, char *dest)
{
int length;
int offset=0;
char buffer[GSERV_BUFSZ+1];
while ((length=read(s,buffer+offset,1)>0) && buffer[offset]!='\n'
&& buffer[offset] != EOT_CHR) {
offset += length;
if (offset >= GSERV_BUFSZ)
break;
}
buffer[offset] = '\0';
strcpy(dest,buffer);
return 1;
} /* read_line */
#endif
#endif /* INTERNET_DOMAIN_SOCKETS || UNIX_DOMAIN_SOCKETS */
#ifdef UNIX_DOMAIN_SOCKETS
/*
connect_to_unix_server -- establish connection with server process via a unix-
domain socket. Returns socket descriptor for server
if successful.
*/
static int
connect_to_unix_server (void)
{
int s; /* connected socket descriptor */
struct sockaddr_un server; /* for unix connections */
if ((s = socket (AF_UNIX, SOCK_STREAM, 0)) < 0)
glibtop_error_io ("unable to create socket");
server.sun_family = AF_UNIX;
#ifdef HIDE_UNIX_SOCKET
sprintf(server.sun_path, "/tmp/lgtddir%d/lgtd", (int)geteuid());
#else /* HIDE_UNIX_SOCKET */
sprintf(server.sun_path, "/tmp/lgtd%d", (int)geteuid());
#endif /* HIDE_UNIX_SOCKET */
if (connect (s, (struct sockaddr *)&server, strlen(server.sun_path)+2) < 0)
glibtop_error_io ("unable to connect to local");
return(s);
} /* connect_to_unix_server */
#endif /* UNIX_DOMAIN_SOCKETS */
#ifdef INTERNET_DOMAIN_SOCKETS
/*
internet_addr -- return the internet addr of the hostname or
internet address passed. Return -1 on error.
*/
long glibtop_internet_addr (host)
const char *host;
{
struct hostent *hp; /* pointer to host info for remote host */
IN_ADDR numeric_addr; /* host address */
numeric_addr = inet_addr (host);
if (!NUMERIC_ADDR_ERROR)
return numeric_addr;
else if ((hp = gethostbyname (host)) != NULL)
return ((struct in_addr *)(hp->h_addr))->s_addr;
else {
glibtop_warn_io ("gethostbyname (%s)", host);
return -1;
}
} /* glibtop_internet_addr */
#ifdef AUTH_MAGIC_COOKIE
# include <X11/X.h>
# include <X11/Xauth.h>
static Xauth *server_xauth = NULL;
#endif
/*
connect_to_internet_server -- establish connection with server process via
an internet domain socket. Returns socket
descriptor for server if successful.
*/
static int
connect_to_internet_server (const char *serverhost, u_short port)
{
int s; /* connected socket descriptor */
struct servent *sp; /* pointer to service information */
struct sockaddr_in peeraddr_in; /* for peer socket address */
char buf[512]; /* temporary buffer */
/* clear out address structures */
memset((char *)&peeraddr_in, 0, sizeof(struct sockaddr_in));
/* Set up the peer address to which we will connect. */
peeraddr_in.sin_family = AF_INET;
/* look up the server host's internet address */
if (((long) peeraddr_in.sin_addr.s_addr = glibtop_internet_addr (serverhost)) == -1)
glibtop_error ("unable to find %s in /etc/hosts or from YP", serverhost);
if (port == 0) {
if ((sp = getservbyname ("gtopd","tcp")) == NULL)
peeraddr_in.sin_port = htons (DEFAULT_PORT+getuid());
else
peeraddr_in.sin_port = sp->s_port;
} /* if */
else
peeraddr_in.sin_port = htons (port);
/* Create the socket. */
if ((s = socket (AF_INET, SOCK_STREAM, 0))== -1)
glibtop_error_io ("unable to create socket");
/* Try to connect to the remote server at the address
* which was just built into peeraddr.
*/
if (connect(s, (struct sockaddr *)&peeraddr_in,
sizeof(struct sockaddr_in)) == -1)
glibtop_error_io ("unable to connect to remote");
#ifdef AUTH_MAGIC_COOKIE
/* send credentials using MIT-MAGIC-COOKIE-1 protocol */
server_xauth =
XauGetAuthByAddr(FamilyInternet,
sizeof(peeraddr_in.sin_addr.s_addr),
(char *) &peeraddr_in.sin_addr.s_addr,
strlen(MCOOKIE_SCREEN), MCOOKIE_SCREEN,
strlen(MCOOKIE_X_NAME), MCOOKIE_X_NAME);
if (server_xauth && server_xauth->data) {
sprintf(buf, "%s\n%d\n", MCOOKIE_NAME, server_xauth->data_length);
write (s, buf, strlen(buf));
write (s, server_xauth->data, server_xauth->data_length);
return (s);
}
#endif /* AUTH_MAGIC_COOKIE */
sprintf (buf, "%s\n", DEFAUTH_NAME);
write (s, buf, strlen(buf));
return(s);
} /* connect_to_internet_server */
#endif /* INTERNET_DOMAIN_SOCKETS */
#if defined(INTERNET_DOMAIN_SOCKETS) || defined(UNIX_DOMAIN_SOCKETS)
/*
disconnect_from_server -- inform the server that sending has finished, and wait for
its reply.
*/
#if 0
static void
disconnect_from_server(s,echo)
int s;
int echo;
{
#if 0
char buffer[REPLYSIZ+1];
#else
char buffer[GSERV_BUFSZ+1];
#endif
int add_newline = 1;
int length;
send_string(s,EOT_STR); /* make sure server gets string */
#if !defined (linux) && !defined (_SCO_DS)
/*
* shutdown is completely hozed under linux. If s is a unix domain socket,
* you'll get EOPNOTSUPP back from it. If s is an internet socket, you get
* a broken pipe when you try to read a bit later. The latter
* problem is fixed for linux versions >= 1.1.46, but the problem
* with unix sockets persists. Sigh.
*/
if (shutdown(s,1) == -1) {
perror(progname);
fprintf(stderr, "%s: unable to shutdown socket\n",progname);
exit(1);
}; /* if */
#endif
#if 0
while((length = recv(s,buffer,REPLYSIZ,0)) > 0) {
buffer[length] = '\0';
if (echo) fputs(buffer,stdout);
add_newline = (buffer[length-1] != '\n');
}; /* while */
#else
while ((length = read(s,buffer,GSERV_BUFSZ)) > 0 ||
(length == -1 && errno == EINTR)) {
if (length) {
buffer[length] = '\0';
if (echo) {
fputs(buffer,stdout);
add_newline = (buffer[length-1] != '\n');
}; /* if */
}; /* if */
}; /* while */
#endif
if (echo && add_newline) putchar('\n');
if(length < 0) {
perror(progname);
fprintf(stderr,"%s: unable to read the reply from the server\n",progname);
exit(1);
}; /* if */
} /* disconnect_from_server */
#endif
#endif /* INTERNET_DOMAIN_SOCKETS || UNIX_DOMAIN_SOCKETS */

577
sysdeps/common/mountlist.c Normal file
View File

@@ -0,0 +1,577 @@
/* mountlist.c -- return a list of mounted filesystems
Copyright (C) 1991, 1992 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
This program 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 General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software Foundation,
Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <stdio.h>
#include <sys/types.h>
#include "mountlist.h"
#ifdef STDC_HEADERS
#include <stdlib.h>
#else
void free ();
#endif
#if defined(STDC_HEADERS) || defined(HAVE_STRING_H)
#include <string.h>
#else
#include <strings.h>
#endif
char *strstr ();
char *xmalloc ();
char *xrealloc ();
char *xstrdup ();
void error ();
#ifdef HAVE_SYS_PARAM_H
#include <sys/param.h>
#endif
#if defined (MOUNTED_GETFSSTAT) /* __alpha running OSF_1 */
# include <sys/mount.h>
# include <sys/fs_types.h>
#endif /* MOUNTED_GETFSSTAT */
#ifdef MOUNTED_GETMNTENT1 /* 4.3BSD, SunOS, HP-UX, Dynix, Irix. */
#include <mntent.h>
#if !defined(MOUNTED)
# if defined(MNT_MNTTAB) /* HP-UX. */
# define MOUNTED MNT_MNTTAB
# endif
# if defined(MNTTABNAME) /* Dynix. */
# define MOUNTED MNTTABNAME
# endif
#endif
#endif
#ifdef MOUNTED_GETMNTINFO /* 4.4BSD. */
#include <sys/mount.h>
#endif
#ifdef MOUNTED_GETMNT /* Ultrix. */
#include <sys/mount.h>
#include <sys/fs_types.h>
#endif
#ifdef MOUNTED_FREAD /* SVR2. */
#include <mnttab.h>
#endif
#ifdef MOUNTED_FREAD_FSTYP /* SVR3. */
#include <mnttab.h>
#include <sys/fstyp.h>
#include <sys/statfs.h>
#endif
#ifdef MOUNTED_LISTMNTENT
#include <mntent.h>
#endif
#ifdef MOUNTED_GETMNTENT2 /* SVR4. */
#include <sys/mnttab.h>
#endif
#ifdef MOUNTED_VMOUNT /* AIX. */
#include <fshelp.h>
#include <sys/vfs.h>
#endif
#ifdef DOLPHIN
/* So special that it's not worth putting this in autoconf. */
#undef MOUNTED_FREAD_FSTYP
#define MOUNTED_GETMNTTBL
#endif
#ifdef MOUNTED_GETMNTENT1 /* 4.3BSD, SunOS, HP-UX, Dynix, Irix. */
/* Return the value of the hexadecimal number represented by CP.
No prefix (like '0x') or suffix (like 'h') is expected to be
part of CP. */
static int
xatoi (cp)
char *cp;
{
int val;
val = 0;
while (*cp)
{
if (*cp >= 'a' && *cp <= 'f')
val = val * 16 + *cp - 'a' + 10;
else if (*cp >= 'A' && *cp <= 'F')
val = val * 16 + *cp - 'A' + 10;
else if (*cp >= '0' && *cp <= '9')
val = val * 16 + *cp - '0';
else
break;
cp++;
}
return val;
}
#endif /* MOUNTED_GETMNTENT1. */
#if defined (MOUNTED_GETMNTINFO) && !defined (__NetBSD__)
static char *
fstype_to_string (t)
short t;
{
switch (t)
{
#ifdef MOUNT_PC
case MOUNT_PC:
return "pc";
#endif
#ifdef MOUNT_MFS
case MOUNT_MFS:
return "mfs";
#endif
#ifdef MOUNT_LO
case MOUNT_LO:
return "lo";
#endif
#ifdef MOUNT_TFS
case MOUNT_TFS:
return "tfs";
#endif
#ifdef MOUNT_TMP
case MOUNT_TMP:
return "tmp";
#endif
#ifdef MOUNT_UFS
case MOUNT_UFS:
return "ufs" ;
#endif
#ifdef MOUNT_NFS
case MOUNT_NFS:
return "nfs" ;
#endif
#ifdef MOUNT_MSDOS
case MOUNT_MSDOS:
return "msdos" ;
#endif
#ifdef MOUNT_LFS
case MOUNT_LFS:
return "lfs" ;
#endif
#ifdef MOUNT_LOFS
case MOUNT_LOFS:
return "lofs" ;
#endif
#ifdef MOUNT_FDESC
case MOUNT_FDESC:
return "fdesc" ;
#endif
#ifdef MOUNT_PORTAL
case MOUNT_PORTAL:
return "portal" ;
#endif
#ifdef MOUNT_NULL
case MOUNT_NULL:
return "null" ;
#endif
#ifdef MOUNT_UMAP
case MOUNT_UMAP:
return "umap" ;
#endif
#ifdef MOUNT_KERNFS
case MOUNT_KERNFS:
return "kernfs" ;
#endif
#ifdef MOUNT_PROCFS
case MOUNT_PROCFS:
return "procfs" ;
#endif
#ifdef MOUNT_AFS
case MOUNT_AFS:
return "afs" ;
#endif
#ifdef MOUNT_CD9660
case MOUNT_CD9660:
return "cd9660" ;
#endif
#ifdef MOUNT_UNION
case MOUNT_UNION:
return "union" ;
#endif
#ifdef MOUNT_DEVFS
case MOUNT_DEVFS:
return "devfs" ;
#endif
#ifdef MOUNT_EXT2FS
case MOUNT_EXT2FS:
return "ext2fs" ;
#endif
default:
return "?";
}
}
#endif /* MOUNTED_GETMNTINFO */
#ifdef MOUNTED_VMOUNT /* AIX. */
static char *
fstype_to_string (t)
int t;
{
struct vfs_ent *e;
e = getvfsbytype (t);
if (!e || !e->vfsent_name)
return "none";
else
return e->vfsent_name;
}
#endif /* MOUNTED_VMOUNT */
/* Return a list of the currently mounted filesystems, or NULL on error.
Add each entry to the tail of the list so that they stay in order.
If NEED_FS_TYPE is nonzero, ensure that the filesystem type fields in
the returned list are valid. Otherwise, they might not be.
If ALL_FS is zero, do not return entries for filesystems that
are automounter (dummy) entries. */
struct mount_entry *
read_filesystem_list (need_fs_type, all_fs)
int need_fs_type, all_fs;
{
struct mount_entry *mount_list;
struct mount_entry *me;
struct mount_entry *mtail;
/* Start the list off with a dummy entry. */
me = (struct mount_entry *) xmalloc (sizeof (struct mount_entry));
me->me_next = NULL;
mount_list = mtail = me;
#ifdef MOUNTED_LISTMNTENT
{
struct tabmntent *mntlist, *p;
struct mntent *mnt;
struct mount_entry *me;
/* the third and fourth arguments could be used to filter mounts,
but Crays doesn't seem to have any mounts that we want to
remove. Specifically, automount create normal NFS mounts.
*/
if(listmntent(&mntlist, KMTAB, NULL, NULL) < 0)
return NULL;
p = mntlist;
while(p){
mnt = p->ment;
me = (struct mount_entry*) xmalloc(sizeof (struct mount_entry));
me->me_devname = xstrdup(mnt->mnt_fsname);
me->me_mountdir = xstrdup(mnt->mnt_dir);
me->me_type = xstrdup(mnt->mnt_type);
me->me_dev = -1;
me->me_next = NULL;
mtail->me_next = me;
mtail = me;
p = p->next;
}
freemntlist(mntlist);
}
#endif
#ifdef MOUNTED_GETMNTENT1 /* 4.3BSD, SunOS, HP-UX, Dynix, Irix. */
{
struct mntent *mnt;
char *table = MOUNTED;
FILE *fp;
char *devopt;
fp = setmntent (table, "r");
if (fp == NULL)
return NULL;
while ((mnt = getmntent (fp)))
{
if (!all_fs && (!strcmp (mnt->mnt_type, "ignore")
|| !strcmp (mnt->mnt_type, "auto")))
continue;
me = (struct mount_entry *) xmalloc (sizeof (struct mount_entry));
me->me_devname = xstrdup (mnt->mnt_fsname);
me->me_mountdir = xstrdup (mnt->mnt_dir);
me->me_type = xstrdup (mnt->mnt_type);
devopt = strstr (mnt->mnt_opts, "dev=");
if (devopt)
{
if (devopt[4] == '0' && (devopt[5] == 'x' || devopt[5] == 'X'))
me->me_dev = xatoi (devopt + 6);
else
me->me_dev = xatoi (devopt + 4);
}
else
me->me_dev = (dev_t) -1; /* Magic; means not known yet. */
me->me_next = NULL;
/* Add to the linked list. */
mtail->me_next = me;
mtail = me;
}
if (endmntent (fp) == 0)
return NULL;
}
#endif /* MOUNTED_GETMNTENT1. */
#ifdef MOUNTED_GETMNTINFO /* 4.4BSD. */
{
struct statfs *fsp;
int entries;
entries = getmntinfo (&fsp, MNT_NOWAIT);
if (entries < 0)
return NULL;
while (entries-- > 0)
{
me = (struct mount_entry *) xmalloc (sizeof (struct mount_entry));
me->me_devname = xstrdup (fsp->f_mntfromname);
me->me_mountdir = xstrdup (fsp->f_mntonname);
#ifdef __NetBSD__
me->me_type = xstrdup (fsp->f_fstypename);
#else
me->me_type = fstype_to_string (fsp->f_type);
#endif
me->me_dev = (dev_t) -1; /* Magic; means not known yet. */
me->me_next = NULL;
/* Add to the linked list. */
mtail->me_next = me;
mtail = me;
fsp++;
}
}
#endif /* MOUNTED_GETMNTINFO */
#ifdef MOUNTED_GETMNT /* Ultrix. */
{
int offset = 0;
int val;
struct fs_data fsd;
while ((val = getmnt (&offset, &fsd, sizeof (fsd), NOSTAT_MANY,
(char *) 0)) > 0)
{
me = (struct mount_entry *) xmalloc (sizeof (struct mount_entry));
me->me_devname = xstrdup (fsd.fd_req.devname);
me->me_mountdir = xstrdup (fsd.fd_req.path);
me->me_type = gt_names[fsd.fd_req.fstype];
me->me_dev = fsd.fd_req.dev;
me->me_next = NULL;
/* Add to the linked list. */
mtail->me_next = me;
mtail = me;
}
if (val < 0)
return NULL;
}
#endif /* MOUNTED_GETMNT. */
#if defined (MOUNTED_GETFSSTAT) /* __alpha running OSF_1 */
{
int numsys, counter, bufsize;
struct statfs *stats;
numsys = getfsstat ((struct statfs *)0, 0L, MNT_WAIT);
if (numsys < 0)
return (NULL);
bufsize = (1 + numsys) * sizeof (struct statfs);
stats = (struct statfs *)xmalloc (bufsize);
numsys = getfsstat (stats, bufsize, MNT_WAIT);
if (numsys < 0)
{
free (stats);
return (NULL);
}
for (counter = 0; counter < numsys; counter++)
{
me = (struct mount_entry *) xmalloc (sizeof (struct mount_entry));
me->me_devname = xstrdup (stats[counter].f_mntfromname);
me->me_mountdir = xstrdup (stats[counter].f_mntonname);
me->me_type = mnt_names[stats[counter].f_type];
me->me_dev = (dev_t) -1; /* Magic; means not known yet. */
me->me_next = NULL;
/* Add to the linked list. */
mtail->me_next = me;
mtail = me;
}
free (stats);
}
#endif /* MOUNTED_GETFSSTAT */
#if defined (MOUNTED_FREAD) || defined (MOUNTED_FREAD_FSTYP) /* SVR[23]. */
{
struct mnttab mnt;
char *table = "/etc/mnttab";
FILE *fp;
fp = fopen (table, "r");
if (fp == NULL)
return NULL;
while (fread (&mnt, sizeof mnt, 1, fp) > 0)
{
me = (struct mount_entry *) xmalloc (sizeof (struct mount_entry));
#ifdef GETFSTYP /* SVR3. */
me->me_devname = xstrdup (mnt.mt_dev);
#else
me->me_devname = xmalloc (strlen (mnt.mt_dev) + 6);
strcpy (me->me_devname, "/dev/");
strcpy (me->me_devname + 5, mnt.mt_dev);
#endif
me->me_mountdir = xstrdup (mnt.mt_filsys);
me->me_dev = (dev_t) -1; /* Magic; means not known yet. */
me->me_type = "";
#ifdef GETFSTYP /* SVR3. */
if (need_fs_type)
{
struct statfs fsd;
char typebuf[FSTYPSZ];
if (statfs (me->me_mountdir, &fsd, sizeof fsd, 0) != -1
&& sysfs (GETFSTYP, fsd.f_fstyp, typebuf) != -1)
me->me_type = xstrdup (typebuf);
}
#endif
me->me_next = NULL;
/* Add to the linked list. */
mtail->me_next = me;
mtail = me;
}
if (fclose (fp) == EOF)
return NULL;
}
#endif /* MOUNTED_FREAD || MOUNTED_FREAD_FSTYP. */
#ifdef MOUNTED_GETMNTTBL /* DolphinOS goes it's own way */
{
struct mntent **mnttbl=getmnttbl(),**ent;
for (ent=mnttbl;*ent;ent++)
{
me = (struct mount_entry *) xmalloc (sizeof (struct mount_entry));
me->me_devname = xstrdup ( (*ent)->mt_resource);
me->me_mountdir = xstrdup( (*ent)->mt_directory);
me->me_type = xstrdup ((*ent)->mt_fstype);
me->me_dev = (dev_t) -1; /* Magic; means not known yet. */
me->me_next = NULL;
/* Add to the linked list. */
mtail->me_next = me;
mtail = me;
}
endmnttbl();
}
#endif
#ifdef MOUNTED_GETMNTENT2 /* SVR4. */
{
struct mnttab mnt;
char *table = MNTTAB;
FILE *fp;
int ret;
fp = fopen (table, "r");
if (fp == NULL)
return NULL;
while ((ret = getmntent (fp, &mnt)) == 0)
{
me = (struct mount_entry *) xmalloc (sizeof (struct mount_entry));
me->me_devname = xstrdup (mnt.mnt_special);
me->me_mountdir = xstrdup (mnt.mnt_mountp);
me->me_type = xstrdup (mnt.mnt_fstype);
me->me_dev = (dev_t) -1; /* Magic; means not known yet. */
me->me_next = NULL;
/* Add to the linked list. */
mtail->me_next = me;
mtail = me;
}
if (ret > 0)
return NULL;
if (fclose (fp) == EOF)
return NULL;
}
#endif /* MOUNTED_GETMNTENT2. */
#ifdef MOUNTED_VMOUNT /* AIX. */
{
int bufsize;
char *entries, *thisent;
struct vmount *vmp;
/* Ask how many bytes to allocate for the mounted filesystem info. */
mntctl (MCTL_QUERY, sizeof bufsize, (struct vmount *) &bufsize);
entries = xmalloc (bufsize);
/* Get the list of mounted filesystems. */
mntctl (MCTL_QUERY, bufsize, (struct vmount *) entries);
for (thisent = entries; thisent < entries + bufsize;
thisent += vmp->vmt_length)
{
vmp = (struct vmount *) thisent;
me = (struct mount_entry *) xmalloc (sizeof (struct mount_entry));
if (vmp->vmt_flags & MNT_REMOTE)
{
char *host, *path;
/* Prepend the remote pathname. */
host = thisent + vmp->vmt_data[VMT_HOSTNAME].vmt_off;
path = thisent + vmp->vmt_data[VMT_OBJECT].vmt_off;
me->me_devname = xmalloc (strlen (host) + strlen (path) + 2);
strcpy (me->me_devname, host);
strcat (me->me_devname, ":");
strcat (me->me_devname, path);
}
else
{
me->me_devname = xstrdup (thisent +
vmp->vmt_data[VMT_OBJECT].vmt_off);
}
me->me_mountdir = xstrdup (thisent + vmp->vmt_data[VMT_STUB].vmt_off);
me->me_type = xstrdup (fstype_to_string (vmp->vmt_gfstype));
me->me_dev = (dev_t) -1; /* vmt_fsid might be the info we want. */
me->me_next = NULL;
/* Add to the linked list. */
mtail->me_next = me;
mtail = me;
}
free (entries);
}
#endif /* MOUNTED_VMOUNT. */
/* Free the dummy head. */
me = mount_list;
mount_list = mount_list->me_next;
free (me);
return mount_list;
}

View File

@@ -0,0 +1,32 @@
/* mountlist.h -- declarations for list of mounted filesystems
Copyright (C) 1991, 1992 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
This program 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 General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software Foundation,
Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
/* A mount table entry. */
struct mount_entry
{
char *me_devname; /* Device node pathname, including "/dev/". */
char *me_mountdir; /* Mount point directory pathname. */
char *me_type; /* "nfs", "4.2", etc. */
dev_t me_dev; /* Device number of me_mountdir. */
struct mount_entry *me_next;
};
#if __STDC__
struct mount_entry *read_filesystem_list (int need_fs_type, int all_fs);
#else
struct mount_entry *read_filesystem_list ();
#endif

View File

@@ -59,6 +59,12 @@ glibtop_realloc_r (glibtop *server, void *ptr, size_t size)
return buf;
}
char *
glibtop_strdup_r (glibtop *server, const char *string)
{
return strcpy (glibtop_malloc_r (server, strlen (string) + 1), string);
}
void
glibtop_free_r (glibtop *server, void *ptr)
{

View File

@@ -55,7 +55,7 @@ BEGIN {
print "";
print "\tif (ptr) {";
print "\t\tfor (i = 0; i < proclist.number; i++)";
print "\t\t\tlist = gh_append";
print "\t\t\tlist = scm_append";
print "\t\t\t\t(gh_list (list,";
print "\t\t\t\t\t gh_list (gh_ulong2scm ((unsigned long) ptr [i])),";
print "\t\t\t\t\t SCM_UNDEFINED));";

View File

@@ -22,7 +22,7 @@ function output(feature) {
print "\tlist = gh_list (SCM_UNDEFINED);";
print "";
print "\tfor (i = 0; i < GLIBTOP_MAX_"toupper(feature)"; i++)";
print "\t\tlist = gh_append";
print "\t\tlist = scm_append";
print "\t\t\t(gh_list (list,";
print "\t\t\t\t gh_list (gh_str02scm ((char *) glibtop_names_"feature" [i])),";
print "\t\t\t\t SCM_UNDEFINED));";
@@ -41,7 +41,7 @@ function output(feature) {
print "\tlist = gh_list (SCM_UNDEFINED);";
print "";
print "\tfor (i = 0; i < GLIBTOP_MAX_"toupper(feature)"; i++)";
print "\t\tlist = gh_append";
print "\t\tlist = scm_append";
print "\t\t\t(gh_list (list,";
print "\t\t\t\t gh_list (gh_ulong2scm (glibtop_types_"feature" [i])),";
print "\t\t\t\t SCM_UNDEFINED));";
@@ -60,7 +60,7 @@ function output(feature) {
print "\tlist = gh_list (SCM_UNDEFINED);";
print "";
print "\tfor (i = 0; i < GLIBTOP_MAX_"toupper(feature)"; i++)";
print "\t\tlist = gh_append";
print "\t\tlist = scm_append";
print "\t\t\t(gh_list (list,";
print "\t\t\t\t gh_list (gh_str02scm (gettext";
print "\t\t\t\t\t\t\t(glibtop_labels_"feature" [i]))),";
@@ -80,7 +80,7 @@ function output(feature) {
print "\tlist = gh_list (SCM_UNDEFINED);";
print "";
print "\tfor (i = 0; i < GLIBTOP_MAX_"toupper(feature)"; i++)";
print "\t\tlist = gh_append";
print "\t\tlist = scm_append";
print "\t\t\t(gh_list (list,";
print "\t\t\t\t gh_list (gh_str02scm (gettext";
print "\t\t\t\t\t\t\t(glibtop_descriptions_"feature" [i]))),";

View File

@@ -14,4 +14,4 @@ libgtop_sysdeps_la_SOURCES = init.c open.c close.c cpu.c mem.c swap.c \
proctime.c procmem.c procsignal.c prockernel.c \
procsegment.c
include_HEADERS = glibtop_server.h
include_HEADERS = glibtop_server.h glibtop_machine.h

View File

@@ -35,8 +35,7 @@ static const unsigned long _glibtop_sysdeps_cpu =
void
glibtop_get_cpu_s (glibtop *server, glibtop_cpu *buf)
{
char buffer [BUFSIZ], *tmp;
int fd = 0, ret;
FILE *f;
glibtop_init_r (&server, 0, 0);
@@ -44,37 +43,15 @@ glibtop_get_cpu_s (glibtop *server, glibtop_cpu *buf)
buf->flags = _glibtop_sysdeps_cpu;
#ifdef GLIBTOP_CACHE_OPEN
fd = server->machine.fd_stat;
#endif
if (fd == 0) {
fd = open (FILENAME, O_RDONLY);
if (fd == -1)
glibtop_error_r (server, "open (%s): %s",
FILENAME, strerror (errno));
} else {
lseek (fd, 0, SEEK_SET);
}
f = fopen ("/proc/stat", "r");
if (!f) return;
ret = read (fd, buffer, BUFSIZ);
if (ret == -1)
glibtop_error_r (server, "read (%s): %s",
FILENAME, strerror (errno));
tmp = strchr (buffer, '\n');
tmp = skip_token (tmp); /* "cpu" */
buf->user = strtoul (tmp, &tmp, 10);
buf->nice = strtoul (tmp, &tmp, 10);
buf->sys = strtoul (tmp, &tmp, 10);
buf->idle = strtoul (tmp, &tmp, 10);
fscanf (f, "cpu %lu %lu %lu %lu\n",
&buf->user, &buf->nice, &buf->sys, &buf->idle);
buf->total = buf->user + buf->nice + buf->sys + buf->idle;
buf->frequency = 100;
#ifdef GLIBTOP_CACHE_OPEN
server->machine.fd_stat = fd;
#else
close (fd);
#endif
fclose (f);
}

View File

@@ -33,8 +33,7 @@ static const unsigned long _glibtop_sysdeps_loadavg =
void
glibtop_get_loadavg_s (glibtop *server, glibtop_loadavg *buf)
{
char buffer [BUFSIZ], *tmp;
int fd = 0, ret;
FILE *f;
glibtop_init_r (&server, 0, 0);
@@ -42,30 +41,11 @@ glibtop_get_loadavg_s (glibtop *server, glibtop_loadavg *buf)
buf->flags = _glibtop_sysdeps_loadavg;
#ifdef GLIBTOP_CACHE_OPEN
fd = server->machine.fd_loadavg;
#endif
if (fd == 0) {
fd = open (FILENAME, O_RDONLY);
if (fd == -1)
glibtop_error_r (server, "open (%s): %s",
FILENAME, strerror (errno));
} else {
lseek (fd, 0, SEEK_SET);
}
f = fopen ("/proc/loadavg", "r");
if (!f) return;
ret = read (fd, buffer, BUFSIZ);
if (ret == -1)
glibtop_error_r (server, "read (%s): %s",
FILENAME, strerror (errno));
buf->loadavg [0] = strtod (buffer, &tmp);
buf->loadavg [1] = strtod (tmp, &tmp);
buf->loadavg [2] = strtod (tmp, &tmp);
#ifdef GLIBTOP_CACHE_OPEN
server->machine.fd_loadavg = fd;
#else
close (fd);
#endif
fscanf (f, "%lf %lf %lf\n",
&buf->loadavg [0], &buf->loadavg [1], &buf->loadavg [2]);
fclose (f);
}

View File

@@ -36,8 +36,7 @@ static const unsigned long _glibtop_sysdeps_mem =
void
glibtop_get_mem_s (glibtop *server, glibtop_mem *buf)
{
char buffer [BUFSIZ], *tmp;
int fd = 0, ret;
FILE *f;
glibtop_init_r (&server, 0, 0);
@@ -45,39 +44,13 @@ glibtop_get_mem_s (glibtop *server, glibtop_mem *buf)
buf->flags = _glibtop_sysdeps_mem;
#ifdef GLIBTOP_CACHE_OPEN
fd = server->machine.fd_meminfo;
#endif
if (fd == 0) {
fd = open (FILENAME, O_RDONLY);
if (fd == -1)
glibtop_error_r (server, "open (%s): %s",
FILENAME, strerror (errno));
} else {
lseek (fd, 0, SEEK_SET);
}
f = fopen ("/proc/meminfo", "r");
if (!f) return;
ret = read (fd, buffer, BUFSIZ);
if (ret == -1)
glibtop_error_r (server, "read (%s): %s",
FILENAME, strerror (errno));
tmp = strchr (buffer, '\n');
tmp = skip_token (tmp); /* "Mem:" */
tmp = skip_token (tmp); /* total memory */
buf->total = strtoul (tmp, &tmp, 10);
buf->used = strtoul (tmp, &tmp, 10);
buf->free = strtoul (tmp, &tmp, 10);
buf->shared = strtoul (tmp, &tmp, 10);
buf->buffer = strtoul (tmp, &tmp, 10);
buf->cached = strtoul (tmp, &tmp, 10);
fscanf (f, "%*[^\n]\nMem: %lu %lu %lu %lu %lu %lu\n",
&buf->total, &buf->used, &buf->free, &buf->shared, &buf->buffer, &buf->cached);
buf->user = buf->total - buf->free - buf->shared - buf->buffer;
#ifdef GLIBTOP_CACHE_OPEN
server->machine.fd_meminfo = fd;
#else
close (fd);
#endif
fclose (f);
}

View File

@@ -34,8 +34,9 @@ static const unsigned long _glibtop_sysdeps_proc_kernel =
void
glibtop_get_proc_kernel_s (glibtop *server, glibtop_proc_kernel *buf, pid_t pid)
{
char buffer [BUFSIZ], input [BUFSIZ], *tmp;
int fd = 0, nread;
char input [BUFSIZ], *tmp;
int nread;
FILE *f;
glibtop_init_r (&server, 0, 0);
@@ -47,41 +48,24 @@ glibtop_get_proc_kernel_s (glibtop *server, glibtop_proc_kernel *buf, pid_t pid)
return;
}
if (pid != server->machine.last_pid) {
server->machine.last_pid = pid;
server->machine.no_update = 0;
}
sprintf (input, "/proc/%d/stat", pid);
if (!server->machine.no_update) {
server->machine.proc_status [0] = 0;
server->machine.proc_statm [0] = 0;
server->machine.proc_stat [0] = 0;
f = fopen (input, "r");
if (!f) return;
nread = fread (input, 1, BUFSIZ, f);
if (nread < 0) {
fclose (f);
return;
}
if (server->machine.proc_stat [0]) {
strcpy (buffer, server->machine.proc_stat);
} else {
sprintf (input, "/proc/%d/stat", pid);
fd = open (input, O_RDONLY);
if (fd == -1)
glibtop_error_r (server, "open (%s): %s",
input, strerror (errno));
nread = read (fd, buffer, BUFSIZ);
if (nread == -1)
glibtop_error_r (server, "read (%s): %s",
input, strerror (errno));
buffer [nread] = 0;
strcpy (server->machine.proc_stat, buffer);
close (fd);
}
input [nread] = 0;
/* This is from guile-utils/gtop/proc/readproc.c */
/* split into "PID (cmd" and "<rest>" */
tmp = strrchr (buffer, ')');
tmp = strrchr (input, ')');
*tmp = '\0'; /* replace trailing ')' with NUL */
/* parse these two strings separately, skipping the leading "(". */
@@ -92,6 +76,8 @@ glibtop_get_proc_kernel_s (glibtop *server, glibtop_proc_kernel *buf, pid_t pid)
&buf->k_flags, &buf->min_flt, &buf->cmin_flt,
&buf->maj_flt, &buf->cmaj_flt, &buf->kstk_esp,
&buf->kstk_eip, &buf->wchan);
fclose (f);
buf->flags = _glibtop_sysdeps_proc_kernel;
}

View File

@@ -33,8 +33,9 @@ static const unsigned long _glibtop_sysdeps_proc_mem =
void
glibtop_get_proc_mem_s (glibtop *server, glibtop_proc_mem *buf, pid_t pid)
{
char buffer [BUFSIZ], input [BUFSIZ], *tmp;
int fd = 0, nread;
char input [BUFSIZ], *tmp;
int nread;
FILE *f;
glibtop_init_r (&server, 0, 0);
@@ -46,41 +47,24 @@ glibtop_get_proc_mem_s (glibtop *server, glibtop_proc_mem *buf, pid_t pid)
return;
}
if (pid != server->machine.last_pid) {
server->machine.last_pid = pid;
server->machine.no_update = 0;
}
sprintf (input, "/proc/%d/stat", pid);
if (!server->machine.no_update) {
server->machine.proc_status [0] = 0;
server->machine.proc_statm [0] = 0;
server->machine.proc_stat [0] = 0;
}
if (server->machine.proc_stat [0]) {
strcpy (buffer, server->machine.proc_stat);
} else {
sprintf (input, "/proc/%d/stat", pid);
fd = open (input, O_RDONLY);
if (fd == -1)
glibtop_error_r (server, "open (%s): %s",
input, strerror (errno));
nread = read (fd, buffer, BUFSIZ);
if (nread == -1)
glibtop_error_r (server, "read (%s): %s",
input, strerror (errno));
buffer [nread] = 0;
strcpy (server->machine.proc_stat, buffer);
close (fd);
f = fopen (input, "r");
if (!f) return;
nread = fread (input, 1, BUFSIZ, f);
if (nread < 0) {
fclose (f);
return;
}
input [nread] = 0;
/* This is from guile-utils/gtop/proc/readproc.c */
/* split into "PID (cmd" and "<rest>" */
tmp = strrchr (buffer, ')');
tmp = strrchr (input, ')');
*tmp = '\0'; /* replace trailing ')' with NUL */
/* parse these two strings separately, skipping the leading "(". */
sscanf(tmp + 2, /* skip space after ')' too */
@@ -88,28 +72,26 @@ glibtop_get_proc_mem_s (glibtop *server, glibtop_proc_mem *buf, pid_t pid)
"%*d %*d %*d %*d %*d %*d %*u %*u %*d %lu "
"%lu %lu", &buf->vsize, &buf->rss, &buf->rss_rlim);
if (server->machine.proc_statm [0]) {
strcpy (buffer, server->machine.proc_statm);
} else {
sprintf (input, "/proc/%d/statm", pid);
fd = open (input, O_RDONLY);
if (fd == -1)
glibtop_error_r (server, "open (%s): %s",
input, strerror (errno));
nread = read (fd, buffer, BUFSIZ);
if (nread == -1)
glibtop_error_r (server, "read (%s): %s",
input, strerror (errno));
fclose (f);
buffer [nread] = 0;
strcpy (server->machine.proc_statm, buffer);
close (fd);
sprintf (input, "/proc/%d/statm", pid);
f = fopen (input, "r");
if (!f) return;
nread = fread (input, 1, BUFSIZ, f);
if (nread < 0) {
fclose (f);
return;
}
sscanf (buffer, "%ld %ld %ld",
input [nread] = 0;
sscanf (input, "%ld %ld %ld",
&buf->size, &buf->resident, &buf->share);
fclose (f);
buf->flags = _glibtop_sysdeps_proc_mem;
}

View File

@@ -35,8 +35,9 @@ void
glibtop_get_proc_segment_s (glibtop *server, glibtop_proc_segment *buf,
pid_t pid)
{
char buffer [BUFSIZ], input [BUFSIZ], *tmp;
int fd = 0, nread;
char input [BUFSIZ], *tmp;
int nread;
FILE *f;
glibtop_init_r (&server, 0, 0);
@@ -48,41 +49,24 @@ glibtop_get_proc_segment_s (glibtop *server, glibtop_proc_segment *buf,
return;
}
if (pid != server->machine.last_pid) {
server->machine.last_pid = pid;
server->machine.no_update = 0;
}
sprintf (input, "/proc/%d/stat", pid);
if (!server->machine.no_update) {
server->machine.proc_status [0] = 0;
server->machine.proc_statm [0] = 0;
server->machine.proc_stat [0] = 0;
f = fopen (input, "r");
if (!f) return;
nread = fread (input, 1, BUFSIZ, f);
if (nread < 0) {
fclose (f);
return;
}
if (server->machine.proc_stat [0]) {
strcpy (buffer, server->machine.proc_stat);
} else {
sprintf (input, "/proc/%d/stat", pid);
fd = open (input, O_RDONLY);
if (fd == -1)
glibtop_error_r (server, "open (%s): %s",
input, strerror (errno));
nread = read (fd, buffer, BUFSIZ);
if (nread == -1)
glibtop_error_r (server, "read (%s): %s",
input, strerror (errno));
buffer [nread] = 0;
strcpy (server->machine.proc_stat, buffer);
close (fd);
}
input [nread] = 0;
/* This is from guile-utils/gtop/proc/readproc.c */
/* split into "PID (cmd" and "<rest>" */
tmp = strrchr (buffer, ')');
tmp = strrchr (input, ')');
*tmp = '\0'; /* replace trailing ')' with NUL */
/* parse these two strings separately, skipping the leading "(". */
sscanf(tmp + 2, /* skip space after ')' too */
@@ -91,28 +75,26 @@ glibtop_get_proc_segment_s (glibtop *server, glibtop_proc_segment *buf,
"%*u %*u %lu %lu %lu", &buf->start_code,
&buf->end_code, &buf->start_stack);
if (server->machine.proc_statm [0]) {
strcpy (buffer, server->machine.proc_statm);
} else {
sprintf (input, "/proc/%d/statm", pid);
fd = open (input, O_RDONLY);
if (fd == -1)
glibtop_error_r (server, "open (%s): %s",
input, strerror (errno));
nread = read (fd, buffer, BUFSIZ);
if (nread == -1)
glibtop_error_r (server, "read (%s): %s",
input, strerror (errno));
buffer [nread] = 0;
strcpy (server->machine.proc_statm, buffer);
close (fd);
fclose (f);
sprintf (input, "/proc/%d/statm", pid);
f = fopen (input, "r");
if (!f) return;
nread = fread (input, 1, BUFSIZ, f);
if (nread < 0) {
fclose (f);
return;
}
sscanf (buffer, "%*d %*d %*d %ld %ld %ld %ld",
input [nread] = 0;
sscanf (input, "%*d %*d %*d %ld %ld %ld %ld",
&buf->trs, &buf->lrs, &buf->drs, &buf->dt);
fclose (f);
buf->flags = _glibtop_sysdeps_proc_segment;
}

View File

@@ -32,8 +32,9 @@ static const unsigned long _glibtop_sysdeps_proc_signal =
void
glibtop_get_proc_signal_s (glibtop *server, glibtop_proc_signal *buf, pid_t pid)
{
char buffer [BUFSIZ], input [BUFSIZ], *tmp;
int fd = 0, nread;
char input [BUFSIZ], *tmp;
int nread;
FILE *f;
glibtop_init_r (&server, 0, 0);
@@ -45,41 +46,24 @@ glibtop_get_proc_signal_s (glibtop *server, glibtop_proc_signal *buf, pid_t pid)
return;
}
if (pid != server->machine.last_pid) {
server->machine.last_pid = pid;
server->machine.no_update = 0;
}
sprintf (input, "/proc/%d/stat", pid);
if (!server->machine.no_update) {
server->machine.proc_status [0] = 0;
server->machine.proc_statm [0] = 0;
server->machine.proc_stat [0] = 0;
f = fopen (input, "r");
if (!f) return;
nread = fread (input, 1, BUFSIZ, f);
if (nread < 0) {
fclose (f);
return;
}
if (server->machine.proc_stat [0]) {
strcpy (buffer, server->machine.proc_stat);
} else {
sprintf (input, "/proc/%d/stat", pid);
fd = open (input, O_RDONLY);
if (fd == -1)
glibtop_error_r (server, "open (%s): %s",
input, strerror (errno));
nread = read (fd, buffer, BUFSIZ);
if (nread == -1)
glibtop_error_r (server, "read (%s): %s",
input, strerror (errno));
buffer [nread] = 0;
strcpy (server->machine.proc_stat, buffer);
close (fd);
}
input [nread] = 0;
/* This is from guile-utils/gtop/proc/readproc.c */
/* split into "PID (cmd" and "<rest>" */
tmp = strrchr (buffer, ')');
tmp = strrchr (input, ')');
*tmp = '\0'; /* replace trailing ')' with NUL */
/* parse these two strings separately, skipping the leading "(". */
sscanf(tmp + 2, /* skip space after ')' too */
@@ -89,5 +73,7 @@ glibtop_get_proc_signal_s (glibtop *server, glibtop_proc_signal *buf, pid_t pid)
&buf->signal, &buf->blocked, &buf->sigignore,
&buf->sigcatch);
fclose (f);
buf->flags = _glibtop_sysdeps_proc_signal;
}

View File

@@ -34,9 +34,10 @@ static const unsigned long _glibtop_sysdeps_proc_state =
void
glibtop_get_proc_state_s (glibtop *server, glibtop_proc_state *buf, pid_t pid)
{
char buffer [BUFSIZ], input [BUFSIZ], *tmp;
char input [BUFSIZ], *tmp;
struct stat statb;
int fd, nread;
int nread;
FILE *f;
glibtop_init_r (&server, 0, 0);
@@ -48,12 +49,6 @@ glibtop_get_proc_state_s (glibtop *server, glibtop_proc_state *buf, pid_t pid)
return;
}
server->machine.last_pid = pid;
server->machine.no_update = 0;
server->machine.proc_status [0] = 0;
server->machine.proc_statm [0] = 0;
server->machine.proc_stat [0] = 0;
sprintf (input, "/proc/%d/stat", pid);
/* IMPORTANT NOTICE: For security reasons it is extremely important
@@ -67,33 +62,28 @@ glibtop_get_proc_state_s (glibtop *server, glibtop_proc_state *buf, pid_t pid)
buf->uid = statb.st_uid;
buf->gid = statb.st_gid;
fd = open (input, O_RDONLY);
if (fd == -1)
glibtop_error_r (server, "open (%s): %s",
input, strerror (errno));
nread = read (fd, buffer, BUFSIZ);
if (nread == -1)
glibtop_error_r (server, "read (%s): %s",
input, strerror (errno));
buffer [nread] = 0;
server->machine.last_pid = pid;
strcpy (server->machine.proc_stat, buffer);
f = fopen (input, "r");
if (!f) return;
nread = fread (input, 1, BUFSIZ, f);
if (nread < 0) {
fclose (f);
return;
}
input [nread] = 0;
/* This is from guile-utils/gtop/proc/readproc.c */
/* split into "PID (cmd" and "<rest>" */
tmp = strrchr (buffer, ')');
tmp = strrchr (input, ')');
*tmp = '\0'; /* replace trailing ')' with NUL */
/* parse these two strings separately, skipping the leading "(". */
memset (buf->cmd, 0, sizeof (buf->cmd));
sscanf (buffer, "%d (%39c", &pid, buf->cmd);
sscanf (input, "%d (%39c", &pid, buf->cmd);
sscanf(tmp + 2, "%c", &buf->state); /* skip space after ')' too */
close (fd);
buf->flags = _glibtop_sysdeps_proc_state;
}

View File

@@ -34,8 +34,9 @@ static const unsigned long _glibtop_sysdeps_proc_time =
void
glibtop_get_proc_time_s (glibtop *server, glibtop_proc_time *buf, pid_t pid)
{
char buffer [BUFSIZ], input [BUFSIZ], *tmp;
int fd = 0, nread;
char input [BUFSIZ], *tmp;
int nread;
FILE *f;
glibtop_init_r (&server, 0, 0);
@@ -47,41 +48,24 @@ glibtop_get_proc_time_s (glibtop *server, glibtop_proc_time *buf, pid_t pid)
return;
}
if (pid != server->machine.last_pid) {
server->machine.last_pid = pid;
server->machine.no_update = 0;
}
sprintf (input, "/proc/%d/stat", pid);
if (!server->machine.no_update) {
server->machine.proc_status [0] = 0;
server->machine.proc_statm [0] = 0;
server->machine.proc_stat [0] = 0;
f = fopen (input, "r");
if (!f) return;
nread = fread (input, 1, BUFSIZ, f);
if (nread < 0) {
fclose (f);
return;
}
if (server->machine.proc_stat [0]) {
strcpy (buffer, server->machine.proc_stat);
} else {
sprintf (input, "/proc/%d/stat", pid);
fd = open (input, O_RDONLY);
if (fd == -1)
glibtop_error_r (server, "open (%s): %s",
input, strerror (errno));
nread = read (fd, buffer, BUFSIZ);
if (nread == -1)
glibtop_error_r (server, "read (%s): %s",
input, strerror (errno));
buffer [nread] = 0;
strcpy (server->machine.proc_stat, buffer);
close (fd);
}
input [nread] = 0;
/* This is from guile-utils/gtop/proc/readproc.c */
/* split into "PID (cmd" and "<rest>" */
tmp = strrchr (buffer, ')');
tmp = strrchr (input, ')');
*tmp = '\0'; /* replace trailing ')' with NUL */
/* parse these two strings separately, skipping the leading "(". */
sscanf(tmp + 2, /* skip space after ')' too */
@@ -90,5 +74,7 @@ glibtop_get_proc_time_s (glibtop *server, glibtop_proc_time *buf, pid_t pid)
&buf->utime, &buf->stime, &buf->cutime, &buf->cstime,
&buf->timeout, &buf->it_real_value, &buf->start_time);
fclose (f);
buf->flags = _glibtop_sysdeps_proc_time;
}

View File

@@ -38,8 +38,9 @@ static const unsigned long _glibtop_sysdeps_proc_uid =
void
glibtop_get_proc_uid_s (glibtop *server, glibtop_proc_uid *buf, pid_t pid)
{
char buffer [BUFSIZ], input [BUFSIZ], *tmp;
int fd = 0, nread;
char input [BUFSIZ], *tmp;
int nread;
FILE *f;
glibtop_init_r (&server, 0, 0);
@@ -51,40 +52,23 @@ glibtop_get_proc_uid_s (glibtop *server, glibtop_proc_uid *buf, pid_t pid)
return;
}
if (pid != server->machine.last_pid) {
server->machine.last_pid = pid;
server->machine.no_update = 0;
}
if (!server->machine.no_update) {
server->machine.proc_status [0] = 0;
server->machine.proc_statm [0] = 0;
server->machine.proc_stat [0] = 0;
}
if (server->machine.proc_status [0]) {
strcpy (buffer, server->machine.proc_status);
} else {
sprintf (input, "/proc/%d/status", pid);
fd = open (input, O_RDONLY);
if (fd == -1)
glibtop_error_r (server, "open (%s): %s",
input, strerror (errno));
nread = read (fd, buffer, BUFSIZ);
if (nread == -1)
glibtop_error_r (server, "read (%s): %s",
input, strerror (errno));
sprintf (input, "/proc/%d/status", pid);
buffer [nread] = 0;
strcpy (server->machine.proc_status, buffer);
close (fd);
f = fopen (input, "r");
if (!f) return;
nread = fread (input, 1, BUFSIZ, f);
if (nread < 0) {
fclose (f);
return;
}
input [nread] = 0;
/* Search substring 'Pid:' */
tmp = strstr (buffer, "Pid:");
tmp = strstr (input, "Pid:");
if (tmp == NULL) return;
@@ -92,30 +76,26 @@ glibtop_get_proc_uid_s (glibtop *server, glibtop_proc_uid *buf, pid_t pid)
"Gid: %u %u %*u %*u\n", &buf->pid, &buf->ppid,
&buf->uid, &buf->euid, &buf->gid, &buf->egid);
if (server->machine.proc_stat [0]) {
strcpy (buffer, server->machine.proc_stat);
} else {
sprintf (input, "/proc/%d/stat", pid);
fd = open (input, O_RDONLY);
if (fd == -1)
glibtop_error_r (server, "open (%s): %s",
input, strerror (errno));
nread = read (fd, buffer, BUFSIZ);
if (nread == -1)
glibtop_error_r (server, "read (%s): %s",
input, strerror (errno));
buffer [nread] = 0;
strcpy (server->machine.proc_stat, buffer);
close (fd);
fclose (f);
sprintf (input, "/proc/%d/stat", pid);
f = fopen (input, "r");
if (!f) return;
nread = fread (input, 1, BUFSIZ, f);
if (nread < 0) {
fclose (f);
return;
}
input [nread] = 0;
/* This is from guile-utils/gtop/proc/readproc.c */
/* split into "PID (cmd" and "<rest>" */
tmp = strrchr (buffer, ')');
tmp = strrchr (input, ')');
*tmp = '\0'; /* replace trailing ')' with NUL */
/* parse these two strings separately, skipping the leading "(". */
sscanf(tmp + 2, /* skip space after ')' too */
@@ -137,5 +117,7 @@ glibtop_get_proc_uid_s (glibtop *server, glibtop_proc_uid *buf, pid_t pid)
/* when tty wasn't full devno */
buf->tty = 4*0x100 + buf->tty;
fclose (f);
buf->flags = _glibtop_sysdeps_proc_uid;
}

View File

@@ -34,8 +34,7 @@ static unsigned long _glibtop_sysdeps_swap =
void
glibtop_get_swap_s (glibtop *server, glibtop_swap *buf)
{
char buffer [BUFSIZ], *tmp;
int fd = 0, ret;
FILE *f;
glibtop_init_r (&server, 0, 0);
@@ -43,34 +42,11 @@ glibtop_get_swap_s (glibtop *server, glibtop_swap *buf)
buf->flags = _glibtop_sysdeps_swap;
#ifdef GLIBTOP_CACHE_OPEN
fd = server->machine.fd_meminfo;
#endif
if (fd == 0) {
fd = open (FILENAME, O_RDONLY);
if (fd == -1)
glibtop_error_r (server, "open (%s): %s",
FILENAME, strerror (errno));
} else {
lseek (fd, 0, SEEK_SET);
}
f = fopen ("/proc/meminfo", "r");
if (!f) return;
ret = read (fd, buffer, BUFSIZ);
if (ret == -1)
glibtop_error_r (server, "read (%s): %s",
FILENAME, strerror (errno));
fscanf (f, "%*[^\n]\n%*[^\n]\nSwap: %lu %lu %lu\n",
&buf->total, &buf->used, &buf->free);
tmp = strchr (buffer, '\n');
tmp = strchr (tmp+1, '\n');
tmp = skip_token (tmp); /* "Swap:" */
buf->total = strtoul (tmp, &tmp, 10);
buf->used = strtoul (tmp, &tmp, 10);
buf->free = strtoul (tmp, &tmp, 10);
#ifdef GLIBTOP_CACHE_OPEN
server->machine.fd_meminfo = fd;
#else
close (fd);
#endif
fclose (f);
}

View File

@@ -33,8 +33,7 @@ static unsigned long _glibtop_sysdeps_uptime =
void
glibtop_get_uptime_s (glibtop *server, glibtop_uptime *buf)
{
int fd, ret;
char buffer [BUFSIZ];
FILE *f;
glibtop_init_r (&server, 0, 0);
@@ -42,17 +41,10 @@ glibtop_get_uptime_s (glibtop *server, glibtop_uptime *buf)
buf->flags = _glibtop_sysdeps_uptime;
fd = open (FILENAME, O_RDONLY);
if (fd == -1)
glibtop_error_r (server, "open (%s): %s",
FILENAME, strerror (errno));
f = fopen ("/proc/uptime", "r");
if (!f) return;
ret = read (fd, buffer, BUFSIZ);
if (ret == -1)
glibtop_error_r (server, "read (%s): %s",
FILENAME, strerror (errno));
fscanf (f, "%lf %lf\n", &buf->uptime, &buf->idletime);
sscanf (buffer, "%lf %lf\n", &buf->uptime, &buf->idletime);
close (fd);
fclose (f);
}