Compare commits
	
		
			136 Commits
		
	
	
		
			GNOME_0_20
			...
			procps_1_2
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					fe56feb875 | ||
| 
						 | 
					5e9d34c91a | ||
| 
						 | 
					0e086aef25 | ||
| 
						 | 
					540385da7e | ||
| 
						 | 
					540cd68691 | ||
| 
						 | 
					c41d6e5a77 | ||
| 
						 | 
					74ca45f795 | ||
| 
						 | 
					5f4131f248 | ||
| 
						 | 
					4bfef8c254 | ||
| 
						 | 
					f77eba3d57 | ||
| 
						 | 
					f18952a9d8 | ||
| 
						 | 
					16cb163bb0 | ||
| 
						 | 
					f8bdfa9a43 | ||
| 
						 | 
					61f887fc67 | ||
| 
						 | 
					9fd8936e93 | ||
| 
						 | 
					ef693a93bc | ||
| 
						 | 
					aa04293fc3 | ||
| 
						 | 
					345a657d2c | ||
| 
						 | 
					da7d7ff116 | ||
| 
						 | 
					c5263a881e | ||
| 
						 | 
					49adb94af0 | ||
| 
						 | 
					b991ecaf9a | ||
| 
						 | 
					2c8ae09776 | ||
| 
						 | 
					8ecb7f296e | ||
| 
						 | 
					3477d30dc5 | ||
| 
						 | 
					f30dfecaf7 | ||
| 
						 | 
					8a666eb5a4 | ||
| 
						 | 
					61071132bf | ||
| 
						 | 
					b177c3930d | ||
| 
						 | 
					eb8d28b694 | ||
| 
						 | 
					0b4f757b2b | ||
| 
						 | 
					2aa20e2060 | ||
| 
						 | 
					7d8ff8f72e | ||
| 
						 | 
					576dde394a | ||
| 
						 | 
					1d7491be0d | ||
| 
						 | 
					15cc0113a9 | ||
| 
						 | 
					9532dadc2e | ||
| 
						 | 
					94715ef718 | ||
| 
						 | 
					44bb75cf6e | ||
| 
						 | 
					4d2072ce65 | ||
| 
						 | 
					eb36f97c50 | ||
| 
						 | 
					a76522a990 | ||
| 
						 | 
					71187a5e51 | ||
| 
						 | 
					b54a5d2dfd | ||
| 
						 | 
					134ec106b3 | ||
| 
						 | 
					1b90ed4fcc | ||
| 
						 | 
					3fcc477b25 | ||
| 
						 | 
					81c75477f4 | ||
| 
						 | 
					8b025ff2c2 | ||
| 
						 | 
					2de9ea5c7d | ||
| 
						 | 
					d9e6288b7a | ||
| 
						 | 
					8d78559597 | ||
| 
						 | 
					2a281d0a53 | ||
| 
						 | 
					28dfff5752 | ||
| 
						 | 
					7d0d3db11c | ||
| 
						 | 
					63c475d400 | ||
| 
						 | 
					d334a77447 | ||
| 
						 | 
					1b7d7976b1 | ||
| 
						 | 
					d7770a12c6 | ||
| 
						 | 
					5fef6560bf | ||
| 
						 | 
					75605116d0 | ||
| 
						 | 
					35943ea8fc | ||
| 
						 | 
					e166f54328 | ||
| 
						 | 
					c1cc35ac17 | ||
| 
						 | 
					0acb497216 | ||
| 
						 | 
					58707dac42 | ||
| 
						 | 
					8f14d30d11 | ||
| 
						 | 
					bde0d74282 | ||
| 
						 | 
					026e93121e | ||
| 
						 | 
					f87722233a | ||
| 
						 | 
					03c5a235ef | ||
| 
						 | 
					215ab9f17b | ||
| 
						 | 
					794a8efaed | ||
| 
						 | 
					b56c327ccc | ||
| 
						 | 
					8f43551d68 | ||
| 
						 | 
					23cccaf87f | ||
| 
						 | 
					c75b77affc | ||
| 
						 | 
					7ffc53f45e | ||
| 
						 | 
					6ea7e47194 | ||
| 
						 | 
					6130f0a4f9 | ||
| 
						 | 
					44dcb69c41 | ||
| 
						 | 
					13148c632f | ||
| 
						 | 
					6fd3c113ec | ||
| 
						 | 
					9661c4becc | ||
| 
						 | 
					c60d1d5449 | ||
| 
						 | 
					eedc64096c | ||
| 
						 | 
					cf8068049f | ||
| 
						 | 
					5e3d6bdf18 | ||
| 
						 | 
					aff6786e71 | ||
| 
						 | 
					2408a0731c | ||
| 
						 | 
					a3c345e79e | ||
| 
						 | 
					b2950457ce | ||
| 
						 | 
					9ce768bc4b | ||
| 
						 | 
					c9e7e3a862 | ||
| 
						 | 
					33eefd46c7 | ||
| 
						 | 
					be91463190 | ||
| 
						 | 
					28324c38cc | ||
| 
						 | 
					4cb95e1477 | ||
| 
						 | 
					691cd81192 | ||
| 
						 | 
					9c9ad03d60 | ||
| 
						 | 
					c84923132a | ||
| 
						 | 
					85f31a1707 | ||
| 
						 | 
					92ec7c6d33 | ||
| 
						 | 
					0a323e5080 | ||
| 
						 | 
					222df2c7d6 | ||
| 
						 | 
					f92d7f9ee7 | ||
| 
						 | 
					de5cf356c9 | ||
| 
						 | 
					d3f9cb80d7 | ||
| 
						 | 
					fb61de47a0 | ||
| 
						 | 
					0727d0911c | ||
| 
						 | 
					fbb3070abe | ||
| 
						 | 
					402c96e473 | ||
| 
						 | 
					44f28a486b | ||
| 
						 | 
					4aeb33b2b9 | ||
| 
						 | 
					3728e4c34e | ||
| 
						 | 
					e71eb0e75b | ||
| 
						 | 
					f233a1673f | ||
| 
						 | 
					b96843a960 | ||
| 
						 | 
					eb69a5547f | ||
| 
						 | 
					7f39d62371 | ||
| 
						 | 
					6f179a3141 | ||
| 
						 | 
					cad4b8f2f5 | ||
| 
						 | 
					beb68e2fc4 | ||
| 
						 | 
					b4a16ccd89 | ||
| 
						 | 
					15e73d9b7d | ||
| 
						 | 
					344bdd330f | ||
| 
						 | 
					2546fa37eb | ||
| 
						 | 
					080dd0850b | ||
| 
						 | 
					b7be9a7141 | ||
| 
						 | 
					67798e0d7d | ||
| 
						 | 
					6de9ad750b | ||
| 
						 | 
					68162783dc | ||
| 
						 | 
					95b9d824ea | ||
| 
						 | 
					7dd0c2eac3 | ||
| 
						 | 
					62dda3b782 | ||
| 
						 | 
					4e1e1ccb9f | 
@@ -24,3 +24,4 @@ stamp-h
 | 
			
		||||
sun4
 | 
			
		||||
sun4sol2
 | 
			
		||||
support
 | 
			
		||||
i386-freebsd
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										449
									
								
								ChangeLog
									
									
									
									
									
								
							
							
						
						
									
										449
									
								
								ChangeLog
									
									
									
									
									
								
							@@ -1,3 +1,452 @@
 | 
			
		||||
1998-07-18  Martin Baulig  <martin@home-of-linux.org>
 | 
			
		||||
 | 
			
		||||
	* lib/{init, open}.c: Added `GLIBTOP_METHOD_PIPE' again.
 | 
			
		||||
	
 | 
			
		||||
	* src/server/main.c: Removed gettext stuff.
 | 
			
		||||
 | 
			
		||||
1998-07-17  Martin Baulig  <baulig@Stud.Informatik.uni-trier.de>
 | 
			
		||||
 | 
			
		||||
	* sysdeps/common/sysdeps.c (glibtop_get_sysdeps_r): Using
 | 
			
		||||
	library functions with '_l' prefix instead of directly calling
 | 
			
		||||
	sysdeps code with '_r' prefix. This is necessary for client/server
 | 
			
		||||
	mode.
 | 
			
		||||
	
 | 
			
		||||
	* lib/lib.awk (glibtop_get_*): Now correctly using
 | 
			
		||||
	`(1 << GLIBTOP_SYSDEPS_*)' instead of `GLIBTOP_SYSDEPS_*'.
 | 
			
		||||
	
 | 
			
		||||
	* sysdeps/sun4/proclist.c (glibtop_get_proclist_p): Added
 | 
			
		||||
	implementation of that feature.
 | 
			
		||||
 | 
			
		||||
	* sysdeps/sun4/proc_{uid, state}.c: Now working quite well.
 | 
			
		||||
 | 
			
		||||
	* sysdeps/sun4/proc_{mem, time, signal, kernel, segment}.c: Added
 | 
			
		||||
	some basic implementation; this isn't really working yet.
 | 
			
		||||
	
 | 
			
		||||
	* sysdeps/linux/sem_limits.c: Applied patch from Albert K T Hui
 | 
			
		||||
	<avatar@deva.net> for glibc 2.1.
 | 
			
		||||
 | 
			
		||||
1998-07-15  Martin Baulig  <martin@home-of-linux.org>
 | 
			
		||||
 | 
			
		||||
	* sysdeps/sun4/loadavg.h: New file. Imported from top 3.4.
 | 
			
		||||
 | 
			
		||||
	* sysdeps/sun4/uptime.c (glibtop_get_uptime_p): Added
 | 
			
		||||
	implementation of that function using glibtop_get_cpu ().
 | 
			
		||||
 | 
			
		||||
	* sysdeps/sun4/loadavg.c (glibtop_get_loadavg_p): Added
 | 
			
		||||
	implementation of that feature.
 | 
			
		||||
 | 
			
		||||
	* sysdeps/sun4/{shm_limits.c, msg_limits.c, shm_limits.c}:
 | 
			
		||||
	Added implementation of this features.
 | 
			
		||||
 | 
			
		||||
1998-07-14  Martin Baulig  <baulig@Stud.Informatik.uni-trier.de>
 | 
			
		||||
 | 
			
		||||
	* src/daemon/server_config.h.in: Added some comments.
 | 
			
		||||
	
 | 
			
		||||
	* src/daemon/server_config.pl: New file. This is a script you can use
 | 
			
		||||
	to create `server_config.h'. It will query you for some configuration
 | 
			
		||||
	options.
 | 
			
		||||
 | 
			
		||||
	* configure.in (AC_PROG_AWK): Replaced this test with explicit test
 | 
			
		||||
	for `gawk' and `awk' since `mawk' doesn't work.
 | 
			
		||||
 | 
			
		||||
1998-07-14  Martin Baulig  <martin@home-of-linux.org>
 | 
			
		||||
 | 
			
		||||
	* src/daemon/gnuserv.c: Doing correct server initialization
 | 
			
		||||
	using `glibtop_set_parameter_l' and `glibtop_init_r'.
 | 
			
		||||
 | 
			
		||||
	* src/daemon/main.c: Removed call to `glibtop_init_r'.
 | 
			
		||||
 | 
			
		||||
	* lib/open.c (glibtop_open_l): We now call the open function
 | 
			
		||||
	of the sysdeps directory (glibtop_open_r) for server method
 | 
			
		||||
	`GLIBTOP_METHOD_DIRECT'.
 | 
			
		||||
 | 
			
		||||
	* sysdeps/{linux, sun4, stub}/open.c: No longer `memset'
 | 
			
		||||
	server to zero.
 | 
			
		||||
 | 
			
		||||
	* src/daemon/slave.c: New file.
 | 
			
		||||
 | 
			
		||||
	* src/daemon/*.c: Done some more work on the daemon.
 | 
			
		||||
	
 | 
			
		||||
	* sysdeps/common/gnuslib.c: Removed IPC stuff.
 | 
			
		||||
	
 | 
			
		||||
	* include/glibtop/gnuserv.h: Removed IPC stuff.
 | 
			
		||||
	
 | 
			
		||||
	* include/glibtop/command.h (glibtop_response_unit): Added
 | 
			
		||||
	typedef for `struct _glibtop_response_unit'.
 | 
			
		||||
 | 
			
		||||
	* lib/Makefile.am: Using `$(top_srcdir)/features.def'
 | 
			
		||||
	instead of `$(top_builddir)/features.def'.
 | 
			
		||||
 | 
			
		||||
	* sysdeps/guile/Makefile.am: Using `$(top_srcdir)/features.def'
 | 
			
		||||
	instead of `$(top_builddir)/features.def'.
 | 
			
		||||
 | 
			
		||||
	* sysdeps/guile/names/Makefile.am: Dito.
 | 
			
		||||
 | 
			
		||||
	* sysdeps/stub/*.c: changed suffix of all functions
 | 
			
		||||
	from '_s' to '_r'; see also ChangeLog entry from Jun 6.
 | 
			
		||||
 | 
			
		||||
1998-07-13  Martin Baulig  <baulig@merkur.uni-trier.de>
 | 
			
		||||
 | 
			
		||||
	* src/daemon/server_config.h: Removed from CVS.
 | 
			
		||||
	This is a config file which needs to be edited.
 | 
			
		||||
 | 
			
		||||
	* src/daemon/server_config.h.in: Added. This is just
 | 
			
		||||
	an example for `server_config.h'.
 | 
			
		||||
 | 
			
		||||
1998-07-13  Martin Baulig  <martin@home-of-linux.org>
 | 
			
		||||
 | 
			
		||||
	* glibtop.h: Fixed invocation of `glibtop_close_r'.
 | 
			
		||||
 | 
			
		||||
	* sysdeps/linux/procstate.c: Added missing `fclose'.
 | 
			
		||||
 | 
			
		||||
	* include/glibtop/gnuserv.h (UNIX_DOMAIN_SOCKETS): Defining.
 | 
			
		||||
	
 | 
			
		||||
	* include/glibtop/open.h (GLIBTOP_METHOD_UNIX): Added.
 | 
			
		||||
 | 
			
		||||
	* lib/init.c: Added new method `GLIBTOP_METHOD_UNIX'.
 | 
			
		||||
 | 
			
		||||
	* lib/open.c: Added support for Unix Domain Sockets.
 | 
			
		||||
 | 
			
		||||
	* lib/close.c: Now closing inet and unix connections.
 | 
			
		||||
 | 
			
		||||
	* lib/parameter.c (glibtop_set_parameter_l): You can now
 | 
			
		||||
	set the `method' and `features' fields.
 | 
			
		||||
 | 
			
		||||
	* src/daemon/server_config.h: New file.
 | 
			
		||||
 | 
			
		||||
	* src/daemon/{gnuserv.c, main.c}: More work on the server.
 | 
			
		||||
 | 
			
		||||
1998-07-10  Martin Baulig  <martin@home-of-linux.org>
 | 
			
		||||
 | 
			
		||||
	* src/Makefile.am (SUBDIRS): Removed `proxy'. This directory
 | 
			
		||||
	is considered obsolete and will be removed soon.
 | 
			
		||||
 | 
			
		||||
1998-07-06  Martin Baulig  <martin@home-of-linux.org>
 | 
			
		||||
 | 
			
		||||
	* sysdeps/common/mountlist.c: using functions from `xmalloc.c'.
 | 
			
		||||
 | 
			
		||||
	* sysdeps/common/error.c: all functions now accept NULL as
 | 
			
		||||
	`server' argument.
 | 
			
		||||
 | 
			
		||||
	* acconfig.h (AFS, MOUNTED_FREAD, MOUNTED_FREAD_FSTYP,
 | 
			
		||||
	MOUNTED_GETFSSTAT, MOUNTED_GETMNT, MOUNTED_GETMNTENT1,
 | 
			
		||||
	MOUNTED_GETMNTENT2, MOUNTED_GETMNTINFO, MOUNTED_LISTMNTENT,
 | 
			
		||||
        MOUNTED_VMOUNT, STAT_STATFS3_OSF1, STAT_READ_FILSYS,
 | 
			
		||||
        STAT_STATFS2_BSIZE, STAT_STATFS2_FSIZE, STAT_STATFS2_FS_DATA,
 | 
			
		||||
        STAT_STATFS4, STAT_STATVFS, STATFS_TRUNCATES_BLOCK_COUNTS):
 | 
			
		||||
        New macros.
 | 
			
		||||
 | 
			
		||||
	* configure.in: added GNOME_FILEUTILS_CHECKS.
 | 
			
		||||
 | 
			
		||||
	* sysdeps/common/{fsusage, mountlist}.[ch]:
 | 
			
		||||
	Imported from GNU Fileutils 3.16.
 | 
			
		||||
 | 
			
		||||
	* sysdeps/common/mountlist.c: using g_malloc, g_realloc and g_strdup.
 | 
			
		||||
 | 
			
		||||
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.
 | 
			
		||||
	Creates `lib.c' depending upon `features.def'.
 | 
			
		||||
 | 
			
		||||
	* lib/<feature>.c: Removed.
 | 
			
		||||
 | 
			
		||||
	* sysdeps/guile/guile.awk: New file.
 | 
			
		||||
	Creates `guile.c' depending upon `features.def'.
 | 
			
		||||
 | 
			
		||||
	* sysdeps/guile/*.c: Removed.
 | 
			
		||||
 | 
			
		||||
1998-06-13  Martin Baulig  <martin@home-of-linux.org>
 | 
			
		||||
 | 
			
		||||
	* features.def: List of features for `guile-names.awk'.
 | 
			
		||||
 | 
			
		||||
	* sysdeps/guile/names/guile-names.awk: New file.
 | 
			
		||||
	Creates `guile-names.c' depending upon `features.def'.
 | 
			
		||||
 | 
			
		||||
	* sysdeps/guile/names/*.c: Removed.
 | 
			
		||||
 | 
			
		||||
	* kernel: New directory. Contains some kernel code to
 | 
			
		||||
	implement a new system call table () to fetch information
 | 
			
		||||
	directly from the Linux kernel.
 | 
			
		||||
 | 
			
		||||
	* sysdeps/kernel: New directory. Uses the table () function
 | 
			
		||||
	from the `kernel' directory to fetch things directly from
 | 
			
		||||
	the Linux kernel.
 | 
			
		||||
 | 
			
		||||
	* sysdeps/Makefile.am (DIST_SUBDIRS): Added `kernel'.
 | 
			
		||||
 | 
			
		||||
	* configure.in: Removed `build_CC' again.
 | 
			
		||||
 | 
			
		||||
1998-06-12  Martin Baulig  <baulig@taurus.uni-trier.de>
 | 
			
		||||
 | 
			
		||||
	* include/glibtop/sysdeps.h (glibtop_types_sysdeps):
 | 
			
		||||
	Forgot to change declaration on Jun 6.
 | 
			
		||||
	
 | 
			
		||||
	* sysdeps/names/sysdeps.c (glibtop_types_sysdeps):
 | 
			
		||||
	Using numeric constants from `types.h' instead of string
 | 
			
		||||
	constants; forgot to change this on Jun 6. Added information
 | 
			
		||||
	about new `features' field of `_glibtop_sysdeps'.
 | 
			
		||||
 | 
			
		||||
	* sysdeps/guile/names/*.c (glibtop_guile_types_*):
 | 
			
		||||
	Using `gh_ulong2scm' instead of `gh_str02scm'.
 | 
			
		||||
 | 
			
		||||
	* sysdeps/guile/proclist.c: Replaced call to
 | 
			
		||||
	`gh_append2 ()' with `gh_append ()'.
 | 
			
		||||
 | 
			
		||||
	* sysdeps/guile/names/*.c: dito.
 | 
			
		||||
 | 
			
		||||
1998-06-08  Martin Baulig  <martin@home-of-linux.org>
 | 
			
		||||
 | 
			
		||||
	* support: Added again.
 | 
			
		||||
 | 
			
		||||
	* Makefile.am (SUBDIRS): Added `support' again.
 | 
			
		||||
 | 
			
		||||
	* configure.in: First, we check for gnome. If it is not
 | 
			
		||||
	found, we run GNOME_SUPPORT_CHECKS; otherwise use
 | 
			
		||||
	`$GNOME_LIBDIR -lgnomesupport'.
 | 
			
		||||
 | 
			
		||||
1998-06-07  Martin Baulig  <martin@home-of-linux.org>
 | 
			
		||||
 | 
			
		||||
	* examples/ChangeLog: New file.
 | 
			
		||||
	
 | 
			
		||||
	* macros/gnome-libgtop-sysdeps.m4: Include
 | 
			
		||||
	`glibtop_machine.h' for Linux.
 | 
			
		||||
	
 | 
			
		||||
	* sysdeps/linux/glibtop_machine.h: New file.
 | 
			
		||||
	
 | 
			
		||||
	* sysdeps/linux/*.c: Performance optimizations. We now use
 | 
			
		||||
	`open' and `read' instead of `fopen' and `fscanf'.
 | 
			
		||||
	
 | 
			
		||||
	* *.[ch]: Using single underscore instead of two underscores
 | 
			
		||||
	for function prefixes (regexp: ``s,__([rspl])\b,_$1,g'') to
 | 
			
		||||
	avoid ambiguity with mangled C++ names.
 | 
			
		||||
	
 | 
			
		||||
1998-06-06  Martin Baulig  <martin@home-of-linux.org>
 | 
			
		||||
 | 
			
		||||
	* sysdeps/osf1/glibtop_server.h: New file.
 | 
			
		||||
	
 | 
			
		||||
	* sysdeps/osf1/*.c: renamed all functions implementing
 | 
			
		||||
	features that don't need to be suid to '__s'.
 | 
			
		||||
 | 
			
		||||
	* sysdeps/names/procdata.c: Removed that file.
 | 
			
		||||
	
 | 
			
		||||
	* include/glibtop/*.h (glibtop_types_*): Changed declaration.
 | 
			
		||||
	
 | 
			
		||||
	* glibtop.h: Added `#include <types.h>'.
 | 
			
		||||
 | 
			
		||||
	* include/glibtop/types.h: New file - numeric constants
 | 
			
		||||
	for `glibtop_types_<feature>'.
 | 
			
		||||
 | 
			
		||||
	* sysdeps/names/*.c (glibtop_types_*): Using numeric
 | 
			
		||||
	constants from `types.h' instead of string constants.
 | 
			
		||||
 | 
			
		||||
1998-06-05  Martin Baulig  <baulig@taurus.uni-trier.de>
 | 
			
		||||
 | 
			
		||||
	* support: removed that directory.
 | 
			
		||||
 | 
			
		||||
	* configure.in: we check whether '-lgnomesupport' is
 | 
			
		||||
	included in $GNOME_LIBS and add it together with
 | 
			
		||||
	$GNOME_LIBDIR to LIBSUPPORT in this case.
 | 
			
		||||
 | 
			
		||||
	Gnome (gnome-libs) is now required to build libgtop,
 | 
			
		||||
	added short comment to configure.in how to revert this
 | 
			
		||||
	change.
 | 
			
		||||
 | 
			
		||||
	* Makefile.am: removed `support' subdir.
 | 
			
		||||
 | 
			
		||||
1998-06-03  Martin Baulig  <baulig@merkur.uni-trier.de>
 | 
			
		||||
 | 
			
		||||
	* libgtop.spec: New file.
 | 
			
		||||
	
 | 
			
		||||
	* Makefile.am (EXTRA_DIST): Added `autogen.sh' and
 | 
			
		||||
	`libgtop.spec'.
 | 
			
		||||
	
 | 
			
		||||
	* configure.in (LIBGTOP_INCS): is now identically to
 | 
			
		||||
	`LIBGTOP_GUILE_INCS'.
 | 
			
		||||
 | 
			
		||||
	* include/glibtop/global.h: only including intl headers
 | 
			
		||||
	while compiling libgtop.
 | 
			
		||||
 | 
			
		||||
1998-06-02  Federico Mena Quintero  <federico@nuclecu.unam.mx>
 | 
			
		||||
 | 
			
		||||
	* src/server/main.c: #include <locale.h>
 | 
			
		||||
 | 
			
		||||
1998-06-02  Martin Baulig  <baulig@merkur.uni-trier.de>
 | 
			
		||||
 | 
			
		||||
	* lib/open.c (glibtop_open): renamed to `glibtop_open__l'.
 | 
			
		||||
 | 
			
		||||
	* sysdeps/linux/open.c (glibtop_open): renamed to
 | 
			
		||||
	`glibtop_open__r'.
 | 
			
		||||
 | 
			
		||||
	* include/glibtop/open.h (GLIBTOP_OPEN_NO_OVERRIDE):
 | 
			
		||||
	tells `glibtop_open' to use the default server and not
 | 
			
		||||
	to check the environment variables.
 | 
			
		||||
 | 
			
		||||
	* include/glibtop/sysdeps.h (_glibtop_sysdeps):
 | 
			
		||||
	renamed 'dummy' member to 'features'.
 | 
			
		||||
 | 
			
		||||
	* src/proxy/*: new directory - proxy server.
 | 
			
		||||
 | 
			
		||||
	* include/glibtop/command.h (GLIBTOP_CMND_SYSDEPS):
 | 
			
		||||
	added definition here.
 | 
			
		||||
 | 
			
		||||
	* src/server/main.c (GLIBTOP_CMND_SYSDEPS): new
 | 
			
		||||
	command to get glibtop_server_features.
 | 
			
		||||
 | 
			
		||||
1998-06-01  Martin Baulig  <martin@home-of-linux.org>
 | 
			
		||||
 | 
			
		||||
	* NEWS: added more detailed description of today's and
 | 
			
		||||
	yesterday's changes.
 | 
			
		||||
	
 | 
			
		||||
	* include/glibtop/*.h: to use the ChangeLog entry from May 28:
 | 
			
		||||
	'__l' is a function defined in the client part;
 | 
			
		||||
	'__s' is a function defined in the sysdeps part and
 | 
			
		||||
	'__p' is a function that needs special priviledges.
 | 
			
		||||
	'__r' is mapped either on '__p' or on '__s'.
 | 
			
		||||
	the function without suffix is mapped on '__l'.
 | 
			
		||||
 | 
			
		||||
	* sysdeps/common/sysdeps.c: now using '__r' functions,
 | 
			
		||||
	they are #defined either as the '__p' or the '__s' ones.
 | 
			
		||||
 | 
			
		||||
	* sysdeps/linux/*.c: changed call of 'glibtop_init__r',
 | 
			
		||||
	it now takes two additional arguments.
 | 
			
		||||
 | 
			
		||||
	* examples/{first.c, second.c}: now using 'glibtop_init'
 | 
			
		||||
	instead of 'glibtop_init__r'.
 | 
			
		||||
 | 
			
		||||
	* include/glibtop/sysdeps.h: added 'dummy' member so
 | 
			
		||||
	'GLIBTOP_SYSDEPS_<feature>' now start with 1.
 | 
			
		||||
 | 
			
		||||
	* include/glibtop/*.h: we now #define 'glibtop_get_<feature>'
 | 
			
		||||
	as 'glibtop_get_<feature>__l' and 'glibtop_get_<feature>__r'
 | 
			
		||||
	either as the '__p' or the '__s' function.
 | 
			
		||||
 | 
			
		||||
	* lib/*.c: removed #if's - we now decide at runtime
 | 
			
		||||
	whether to use the server or to call the appropriate
 | 
			
		||||
	function for the sysdeps directory.
 | 
			
		||||
 | 
			
		||||
1998-05-28  Martin Baulig  <baulig@merkur.uni-trier.de>
 | 
			
		||||
 | 
			
		||||
	* src/server/main.c: we now use the '__p' functions,
 | 
			
		||||
	but only if the appropriate 'GLIBTOP_SUID_<feature>'
 | 
			
		||||
	has a non-zero value.
 | 
			
		||||
	
 | 
			
		||||
	* configure.in (@machine_incs@): always use 
 | 
			
		||||
	`-I$(top_srcdir)/sysdeps/@sysdeps_dir@'; it's no
 | 
			
		||||
	longer conditional.
 | 
			
		||||
 | 
			
		||||
	* examples/Makefile.am: removed the '_linux' examples.
 | 
			
		||||
	
 | 
			
		||||
	* sysdeps/linux/*.c: renamed all functions implementing
 | 
			
		||||
	features to '__s'.
 | 
			
		||||
	
 | 
			
		||||
	* lib/*.c: renamed all functions implementing features
 | 
			
		||||
	to '__l'; we only emit code for those functions if the
 | 
			
		||||
 	corresponding 'GLIBTOP_SUID_<feature>' has a positive value.
 | 
			
		||||
	
 | 
			
		||||
	* include/glibtop/*.h: added some new function suffixes:
 | 
			
		||||
	'__l' is a function defined in the client part;
 | 
			
		||||
	'__s' is a function defined in the sysdeps part and
 | 
			
		||||
	'__p' is a function that needs special priviledges.
 | 
			
		||||
	'__r' is mapped either on '__l' or on '__s'.
 | 
			
		||||
	
 | 
			
		||||
	* sysdeps/linux/glibtop_server.h: New file -
 | 
			
		||||
	defines system dependent constants 'GLIBTOP_SUID_<feature>'
 | 
			
		||||
	being either 'GLIBTOP_SYSDEPS_<feature>'+1 depending upon
 | 
			
		||||
 	whether or not this feature requires using the server.
 | 
			
		||||
 | 
			
		||||
	* lib/sysdeps.c: removed that file; it is no longer
 | 
			
		||||
	needed.
 | 
			
		||||
 | 
			
		||||
1998-05-25  Martin Baulig  <baulig@merkur.uni-trier.de>
 | 
			
		||||
 | 
			
		||||
	* src/server/main.c: Fixed `broken pipe' error when server
 | 
			
		||||
	is running SUID; accidentally uses setreuid () instead of
 | 
			
		||||
	setregid ().
 | 
			
		||||
 | 
			
		||||
1998-05-24  Martin Baulig  <martin@home-of-linux.org>
 | 
			
		||||
 | 
			
		||||
	* sysdeps/sun4/{open.c, mem.c, glibtop_machine.h}: added
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										33
									
								
								Makefile.am
									
									
									
									
									
								
							
							
						
						
									
										33
									
								
								Makefile.am
									
									
									
									
									
								
							@@ -4,15 +4,15 @@ if GLIBTOP_EXAMPLES
 | 
			
		||||
examples_SUBDIRS	= examples
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
built_SUBDIRS = include sysdeps src lib
 | 
			
		||||
built_SUBDIRS = include sysdeps lib src
 | 
			
		||||
 | 
			
		||||
SUBDIRS = po intl support macros $(built_SUBDIRS) $(examples_SUBDIRS)
 | 
			
		||||
 | 
			
		||||
DIST_SUBDIRS = po intl support macros include sysdeps src lib examples
 | 
			
		||||
DIST_SUBDIRS = po intl macros include sysdeps src lib examples
 | 
			
		||||
 | 
			
		||||
include_HEADERS = glibtop.h
 | 
			
		||||
 | 
			
		||||
EXTRA_DIST = copyright.txt libgtopConf.sh.in
 | 
			
		||||
EXTRA_DIST = autogen.sh libgtop.spec copyright.txt libgtopConf.sh.in
 | 
			
		||||
 | 
			
		||||
release:
 | 
			
		||||
	$(MAKE) dist distdir=$(PACKAGE)$(VERSION)
 | 
			
		||||
@@ -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
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										111
									
								
								NEWS
									
									
									
									
									
								
							
							
						
						
									
										111
									
								
								NEWS
									
									
									
									
									
								
							@@ -1,5 +1,116 @@
 | 
			
		||||
$Id$
 | 
			
		||||
 | 
			
		||||
Jun/01/1998
 | 
			
		||||
===========
 | 
			
		||||
 | 
			
		||||
	* We have some new ``suffix rules'':
 | 
			
		||||
 | 
			
		||||
	  '__l' is a function defined in the client part;
 | 
			
		||||
	  '__s' is a function defined in the sysdeps part and
 | 
			
		||||
	  '__p' is a function that needs special priviledges.
 | 
			
		||||
	  '__r' is mapped either on '__p' or on '__s'.
 | 
			
		||||
	  the function without suffix is mapped on '__l'.
 | 
			
		||||
 | 
			
		||||
	* We now decide at runtime whether or not using the server
 | 
			
		||||
	is required for a particular function. All user programs
 | 
			
		||||
	now call the '__l' function defined in '-lgtop' (in the lib
 | 
			
		||||
	subdir). These functions either use 'glibtop_call__l' to
 | 
			
		||||
	call the server or call the '__r' function.
 | 
			
		||||
 | 
			
		||||
	* A function in the sysdeps directory now has the '__s' suffix
 | 
			
		||||
	if it do not need any priviledges (and thus can be called directly
 | 
			
		||||
	from client code) and the '__p' suffix otherwise (when it has to
 | 
			
		||||
	be called from the server).
 | 
			
		||||
 | 
			
		||||
	* If you call one of these functions:
 | 
			
		||||
 | 
			
		||||
	  -> use the '__p' suffix to be sure to get the SUID-safe one
 | 
			
		||||
	     (used in the server).
 | 
			
		||||
	  -> use the '__s' suffix to be sure to get a function that
 | 
			
		||||
	     doesn't need any priviledges.
 | 
			
		||||
	  -> use the '__r' suffix otherwise (it is mapped either on the
 | 
			
		||||
	     '__p' or on the '__s' one).
 | 
			
		||||
 | 
			
		||||
	Only use the '__p' and '__s' functions in a 'GLIBTOP_SUID_<feature>'
 | 
			
		||||
	conditional, otherwise you'll get undefined symbols !
 | 
			
		||||
 | 
			
		||||
	* The server is now started from 'glibtop_init__r', but only when
 | 
			
		||||
	it's really needed; for instance on DEC OSF/1 you only need it
 | 
			
		||||
	for the proc* features - if you program only fetches the CPU usage,
 | 
			
		||||
	now server will be started.
 | 
			
		||||
 | 
			
		||||
	* Sorry, at the moment everything is a little bit unstable, I'm doing
 | 
			
		||||
	heavy changes. I've just some great ideas which still need some work:
 | 
			
		||||
 | 
			
		||||
	  -> I want to have a SUID server that only implements those features
 | 
			
		||||
	     that need to be SUID; everything else uses the sysdeps code directly.
 | 
			
		||||
 | 
			
		||||
	  -> If a program only uses stuff that do not need the server, the
 | 
			
		||||
	     server will not be started at all.
 | 
			
		||||
 | 
			
		||||
	  -> I'm working on some kind of proxy server that can be used on a remote
 | 
			
		||||
	     host; in feature one can then use the MDI stuff from ghex in gtop to
 | 
			
		||||
	     have notebook pages displaying processes from different hosts.
 | 
			
		||||
 | 
			
		||||
	* Well it is as much unstable that it only works under Linux at the moment.
 | 
			
		||||
 | 
			
		||||
1998-06-01  Martin Baulig  <martin@home-of-linux.org>
 | 
			
		||||
 | 
			
		||||
	* sysdeps/common/sysdeps.c: now using '__r' functions,
 | 
			
		||||
	they are #defined either as the '__p' or the '__s' ones.
 | 
			
		||||
 | 
			
		||||
	* sysdeps/linux/*.c: changed call of 'glibtop_init__r',
 | 
			
		||||
	it now takes two additional arguments.
 | 
			
		||||
 | 
			
		||||
	* examples/{first.c, second.c}: now using 'glibtop_init'
 | 
			
		||||
	instead of 'glibtop_init__r'.
 | 
			
		||||
 | 
			
		||||
	* include/glibtop/sysdeps.h: added 'dummy' member so
 | 
			
		||||
	'GLIBTOP_SYSDEPS_<feature>' now start with 1.
 | 
			
		||||
 | 
			
		||||
	* include/glibtop/*.h: we now #define 'glibtop_get_<feature>'
 | 
			
		||||
	as 'glibtop_get_<feature>__l' and 'glibtop_get_<feature>__r'
 | 
			
		||||
	either as the '__p' or the '__s' function.
 | 
			
		||||
 | 
			
		||||
	* lib/*.c: removed #if's - we now decide at runtime
 | 
			
		||||
	whether to use the server or to call the appropriate
 | 
			
		||||
	function for the sysdeps directory.
 | 
			
		||||
 | 
			
		||||
1998-05-28  Martin Baulig  <baulig@merkur.uni-trier.de>
 | 
			
		||||
 | 
			
		||||
	* src/server/main.c: we now use the '__p' functions,
 | 
			
		||||
	but only if the appropriate 'GLIBTOP_SUID_<feature>'
 | 
			
		||||
	has a non-zero value.
 | 
			
		||||
	
 | 
			
		||||
	* configure.in (@machine_incs@): always use 
 | 
			
		||||
	`-I$(top_srcdir)/sysdeps/@sysdeps_dir@'; it's no
 | 
			
		||||
	longer conditional.
 | 
			
		||||
 | 
			
		||||
	* examples/Makefile.am: removed the '_linux' examples.
 | 
			
		||||
	
 | 
			
		||||
	* sysdeps/linux/*.c: renamed all functions implementing
 | 
			
		||||
	features to '__s'.
 | 
			
		||||
	
 | 
			
		||||
	* lib/*.c: renamed all functions implementing features
 | 
			
		||||
	to '__l'; we only emit code for those functions if the
 | 
			
		||||
 	corresponding 'GLIBTOP_SUID_<feature>' has a positive value.
 | 
			
		||||
	
 | 
			
		||||
	* include/glibtop/*.h: added some new function suffixes:
 | 
			
		||||
	'__l' is a function defined in the client part;
 | 
			
		||||
	'__s' is a function defined in the sysdeps part and
 | 
			
		||||
	'__p' is a function that needs special priviledges.
 | 
			
		||||
	'__r' is mapped either on '__l' or on '__s'.
 | 
			
		||||
	
 | 
			
		||||
	* sysdeps/linux/glibtop_server.h: New file -
 | 
			
		||||
	defines system dependent constants 'GLIBTOP_SUID_<feature>'
 | 
			
		||||
	being either 'GLIBTOP_SYSDEPS_<feature>'+1 depending upon
 | 
			
		||||
 	whether or not this feature requires using the server.
 | 
			
		||||
 | 
			
		||||
	* lib/sysdeps.c: removed that file; it is no longer
 | 
			
		||||
	needed.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
May/21/1998
 | 
			
		||||
===========
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										83
									
								
								acconfig.h
									
									
									
									
									
								
							
							
						
						
									
										83
									
								
								acconfig.h
									
									
									
									
									
								
							@@ -12,6 +12,85 @@
 | 
			
		||||
 | 
			
		||||
/* Do not remove this comments and the empty lines; they are needed */
 | 
			
		||||
#undef HAVE_PROGRAM_INVOCATION_SHORT_NAME
 | 
			
		||||
/* Define if you have the Andrew File System.  */
 | 
			
		||||
#undef AFS
 | 
			
		||||
 | 
			
		||||
/* Define one of the following to indicate how a program can
 | 
			
		||||
   get a list of mounted filesystems.  */
 | 
			
		||||
 | 
			
		||||
/* Define if there is no specific function for reading the list of
 | 
			
		||||
   mounted filesystems.  fread will be used to read /etc/mnttab.  [SVR2]  */
 | 
			
		||||
#undef MOUNTED_FREAD
 | 
			
		||||
 | 
			
		||||
/* Define if (like SVR2) there is no specific function for reading the
 | 
			
		||||
   list of mounted filesystems, and your system has these header files:
 | 
			
		||||
   <sys/fstyp.h> and <sys/statfs.h>.  [SVR3]  */
 | 
			
		||||
#undef MOUNTED_FREAD_FSTYP
 | 
			
		||||
 | 
			
		||||
/* Define if there is a function named getfsstat for reading the list
 | 
			
		||||
   of mounted filesystems.  [DEC Alpha running OSF/1]  */
 | 
			
		||||
#undef MOUNTED_GETFSSTAT
 | 
			
		||||
 | 
			
		||||
/* Define if there is a function named getmnt for reading the list of
 | 
			
		||||
   mounted filesystems.  [Ultrix]  */
 | 
			
		||||
#undef MOUNTED_GETMNT
 | 
			
		||||
 | 
			
		||||
/* Define if there is a function named getmntent for reading the list
 | 
			
		||||
   of mounted filesystems, and that function takes a single argument.
 | 
			
		||||
   [4.3BSD, SunOS, HP-UX, Dynix, Irix]  */
 | 
			
		||||
#undef MOUNTED_GETMNTENT1
 | 
			
		||||
 | 
			
		||||
/* Define if there is a function named getmntent for reading the list of
 | 
			
		||||
   mounted filesystems, and that function takes two arguments.  [SVR4]  */
 | 
			
		||||
#undef MOUNTED_GETMNTENT2
 | 
			
		||||
 | 
			
		||||
/* Define if there is a function named getmntinfo for reading the list
 | 
			
		||||
   of mounted filesystems.  [4.4BSD]  */
 | 
			
		||||
#undef MOUNTED_GETMNTINFO
 | 
			
		||||
 | 
			
		||||
/* Define if there is a function named listmntent that can be used to
 | 
			
		||||
   list all mounted filesystems. [UNICOS] */
 | 
			
		||||
#undef MOUNTED_LISTMNTENT
 | 
			
		||||
 | 
			
		||||
/* Define if there is a function named mntctl that can be used to read
 | 
			
		||||
   the list of mounted filesystems, and there is a system header file
 | 
			
		||||
   that declares `struct vmount.'  [AIX]  */
 | 
			
		||||
#undef MOUNTED_VMOUNT
 | 
			
		||||
 | 
			
		||||
/* Define one of the following to indicate how a program can obtain
 | 
			
		||||
   filesystems usage information.  */
 | 
			
		||||
 | 
			
		||||
/*  Define if  statfs takes 3 args.  [DEC Alpha running OSF/1]  */
 | 
			
		||||
#undef STAT_STATFS3_OSF1
 | 
			
		||||
 | 
			
		||||
/* Define if there is no specific function for reading filesystems usage
 | 
			
		||||
   information and you have the <sys/filsys.h> header file.  [SVR2]  */
 | 
			
		||||
#undef STAT_READ_FILSYS
 | 
			
		||||
 | 
			
		||||
/* Define if statfs takes 2 args and struct statfs has a field named f_bsize.
 | 
			
		||||
   [4.3BSD, SunOS 4, HP-UX, AIX PS/2]  */
 | 
			
		||||
#undef STAT_STATFS2_BSIZE
 | 
			
		||||
 | 
			
		||||
/* Define if statfs takes 2 args and struct statfs has a field named f_fsize.
 | 
			
		||||
   [4.4BSD, NetBSD]  */
 | 
			
		||||
#undef STAT_STATFS2_FSIZE
 | 
			
		||||
 | 
			
		||||
/* Define if statfs takes 2 args and the second argument has
 | 
			
		||||
   type struct fs_data.  [Ultrix]  */
 | 
			
		||||
#undef STAT_STATFS2_FS_DATA
 | 
			
		||||
 | 
			
		||||
/* Define if statfs takes 4 args.  [SVR3, Dynix, Irix, Dolphin]  */
 | 
			
		||||
#undef STAT_STATFS4
 | 
			
		||||
 | 
			
		||||
/* Define if there is a function named statvfs.  [SVR4]  */
 | 
			
		||||
#undef STAT_STATVFS
 | 
			
		||||
 | 
			
		||||
/* Define if the block counts reported by statfs may be truncated to 2GB
 | 
			
		||||
   and the correct values may be stored in the f_spare array.
 | 
			
		||||
   [SunOS 4.1.2, 4.1.3, and 4.1.3_U1 are reported to have this problem.
 | 
			
		||||
   SunOS 4.1.1 seems not to be affected.]  */
 | 
			
		||||
#undef STATFS_TRUNCATES_BLOCK_COUNTS
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* to fix a bug in autoheader on DEC OSF1. */
 | 
			
		||||
#undef HAVE_PROGRAM_INVOCATION_NAME
 | 
			
		||||
@@ -33,3 +112,7 @@
 | 
			
		||||
#undef GLIBTOP_EXAMPLES
 | 
			
		||||
 | 
			
		||||
#undef NEED_LIBGTOP
 | 
			
		||||
 | 
			
		||||
#undef HAVE_LINUX_TABLE
 | 
			
		||||
 | 
			
		||||
#undef HAVE_XAUTH
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										611
									
								
								acinclude.m4
									
									
									
									
									
								
							
							
						
						
									
										611
									
								
								acinclude.m4
									
									
									
									
									
								
							@@ -101,512 +101,86 @@ AC_DEFUN([AC_LC_SYSDEPS],[
 | 
			
		||||
	AC_SUBST(libgtop_want_examples)
 | 
			
		||||
])
 | 
			
		||||
 | 
			
		||||
# Like AC_CONFIG_HEADER, but automatically create stamp file.
 | 
			
		||||
 | 
			
		||||
AC_DEFUN(AM_CONFIG_HEADER,
 | 
			
		||||
[AC_PREREQ([2.12])
 | 
			
		||||
AC_CONFIG_HEADER([$1])
 | 
			
		||||
dnl When config.status generates a header, we must update the stamp-h file.
 | 
			
		||||
dnl This file resides in the same directory as the config header
 | 
			
		||||
dnl that is generated.  We must strip everything past the first ":",
 | 
			
		||||
dnl and everything past the last "/".
 | 
			
		||||
AC_OUTPUT_COMMANDS(changequote(<<,>>)dnl
 | 
			
		||||
ifelse(patsubst(<<$1>>, <<[^ ]>>, <<>>), <<>>,
 | 
			
		||||
<<test -z "<<$>>CONFIG_HEADERS" || echo timestamp > patsubst(<<$1>>, <<^\([^:]*/\)?.*>>, <<\1>>)stamp-h<<>>dnl>>,
 | 
			
		||||
<<am_indx=1
 | 
			
		||||
for am_file in <<$1>>; do
 | 
			
		||||
  case " <<$>>CONFIG_HEADERS " in
 | 
			
		||||
  *" <<$>>am_file "*<<)>>
 | 
			
		||||
    echo timestamp > `echo <<$>>am_file | sed -e 's%:.*%%' -e 's%[^/]*$%%'`stamp-h$am_indx
 | 
			
		||||
    ;;
 | 
			
		||||
  esac
 | 
			
		||||
  am_indx=`expr "<<$>>am_indx" + 1`
 | 
			
		||||
done<<>>dnl>>)
 | 
			
		||||
changequote([,]))])
 | 
			
		||||
 | 
			
		||||
# Do all the work for Automake.  This macro actually does too much --
 | 
			
		||||
# some checks are only needed if your package does certain things.
 | 
			
		||||
# But this isn't really a big deal.
 | 
			
		||||
 | 
			
		||||
# serial 1
 | 
			
		||||
 | 
			
		||||
dnl Usage:
 | 
			
		||||
dnl AM_INIT_AUTOMAKE(package,version, [no-define])
 | 
			
		||||
 | 
			
		||||
AC_DEFUN(AM_INIT_AUTOMAKE,
 | 
			
		||||
[AC_REQUIRE([AM_PROG_INSTALL])
 | 
			
		||||
PACKAGE=[$1]
 | 
			
		||||
AC_SUBST(PACKAGE)
 | 
			
		||||
VERSION=[$2]
 | 
			
		||||
AC_SUBST(VERSION)
 | 
			
		||||
dnl test to see if srcdir already configured
 | 
			
		||||
if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then
 | 
			
		||||
  AC_MSG_ERROR([source directory already configured; run "make distclean" there first])
 | 
			
		||||
fi
 | 
			
		||||
ifelse([$3],,
 | 
			
		||||
AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE")
 | 
			
		||||
AC_DEFINE_UNQUOTED(VERSION, "$VERSION"))
 | 
			
		||||
AC_REQUIRE([AM_SANITY_CHECK])
 | 
			
		||||
AC_REQUIRE([AC_ARG_PROGRAM])
 | 
			
		||||
dnl FIXME This is truly gross.
 | 
			
		||||
missing_dir=`cd $ac_aux_dir && pwd`
 | 
			
		||||
AM_MISSING_PROG(ACLOCAL, aclocal, $missing_dir)
 | 
			
		||||
AM_MISSING_PROG(AUTOCONF, autoconf, $missing_dir)
 | 
			
		||||
AM_MISSING_PROG(AUTOMAKE, automake, $missing_dir)
 | 
			
		||||
AM_MISSING_PROG(AUTOHEADER, autoheader, $missing_dir)
 | 
			
		||||
AM_MISSING_PROG(MAKEINFO, makeinfo, $missing_dir)
 | 
			
		||||
AC_REQUIRE([AC_PROG_MAKE_SET])])
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# serial 1
 | 
			
		||||
 | 
			
		||||
AC_DEFUN(AM_PROG_INSTALL,
 | 
			
		||||
[AC_REQUIRE([AC_PROG_INSTALL])
 | 
			
		||||
test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL_PROGRAM}'
 | 
			
		||||
AC_SUBST(INSTALL_SCRIPT)dnl
 | 
			
		||||
])
 | 
			
		||||
 | 
			
		||||
######################################################################
 | 
			
		||||
# progtest.m4 from gettext 0.32
 | 
			
		||||
######################################################################
 | 
			
		||||
# Search path for a program which passes the given test.
 | 
			
		||||
# Ulrich Drepper <drepper@cygnus.com>, 1996.
 | 
			
		||||
#
 | 
			
		||||
# Check to make sure that the build environment is sane.
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
AC_DEFUN(AM_SANITY_CHECK,
 | 
			
		||||
[AC_MSG_CHECKING([whether build environment is sane])
 | 
			
		||||
# Just in case
 | 
			
		||||
sleep 1
 | 
			
		||||
echo timestamp > conftestfile
 | 
			
		||||
# Do `set' in a subshell so we don't clobber the current shell's
 | 
			
		||||
# arguments.  Must try -L first in case configure is actually a
 | 
			
		||||
# symlink; some systems play weird games with the mod time of symlinks
 | 
			
		||||
# (eg FreeBSD returns the mod time of the symlink's containing
 | 
			
		||||
# directory).
 | 
			
		||||
if (
 | 
			
		||||
   set X `ls -Lt $srcdir/configure conftestfile 2> /dev/null`
 | 
			
		||||
   if test "[$]*" = "X"; then
 | 
			
		||||
      # -L didn't work.
 | 
			
		||||
      set X `ls -t $srcdir/configure conftestfile`
 | 
			
		||||
   fi
 | 
			
		||||
   if test "[$]*" != "X $srcdir/configure conftestfile" \
 | 
			
		||||
      && test "[$]*" != "X conftestfile $srcdir/configure"; then
 | 
			
		||||
 | 
			
		||||
      # If neither matched, then we have a broken ls.  This can happen
 | 
			
		||||
      # if, for instance, CONFIG_SHELL is bash and it inherits a
 | 
			
		||||
      # broken ls alias from the environment.  This has actually
 | 
			
		||||
      # happened.  Such a system could not be considered "sane".
 | 
			
		||||
      AC_MSG_ERROR([ls -t appears to fail.  Make sure there is not a broken
 | 
			
		||||
alias in your environment])
 | 
			
		||||
   fi
 | 
			
		||||
 | 
			
		||||
   test "[$]2" = conftestfile
 | 
			
		||||
   )
 | 
			
		||||
then
 | 
			
		||||
   # Ok.
 | 
			
		||||
   :
 | 
			
		||||
else
 | 
			
		||||
   AC_MSG_ERROR([newly created file is older than distributed files!
 | 
			
		||||
Check your system clock])
 | 
			
		||||
fi
 | 
			
		||||
rm -f conftest*
 | 
			
		||||
AC_MSG_RESULT(yes)])
 | 
			
		||||
 | 
			
		||||
dnl AM_MISSING_PROG(NAME, PROGRAM, DIRECTORY)
 | 
			
		||||
dnl The program must properly implement --version.
 | 
			
		||||
AC_DEFUN(AM_MISSING_PROG,
 | 
			
		||||
[AC_MSG_CHECKING(for working $2)
 | 
			
		||||
# Run test in a subshell; some versions of sh will print an error if
 | 
			
		||||
# an executable is not found, even if stderr is redirected.
 | 
			
		||||
# Redirect stdin to placate older versions of autoconf.  Sigh.
 | 
			
		||||
if ($2 --version) < /dev/null > /dev/null 2>&1; then
 | 
			
		||||
   $1=$2
 | 
			
		||||
   AC_MSG_RESULT(found)
 | 
			
		||||
else
 | 
			
		||||
   $1="$3/missing $2"
 | 
			
		||||
   AC_MSG_RESULT(missing)
 | 
			
		||||
fi
 | 
			
		||||
AC_SUBST($1)])
 | 
			
		||||
 | 
			
		||||
# Add --enable-maintainer-mode option to configure.
 | 
			
		||||
# From Jim Meyering
 | 
			
		||||
# This file file be copied and used freely without restrictions.  It can
 | 
			
		||||
# be used in projects which are not available under the GNU Public License
 | 
			
		||||
# but which still want to provide support for the GNU gettext functionality.
 | 
			
		||||
# Please note that the actual code is *not* freely available.
 | 
			
		||||
 | 
			
		||||
# serial 1
 | 
			
		||||
 | 
			
		||||
AC_DEFUN(AM_MAINTAINER_MODE,
 | 
			
		||||
[AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles])
 | 
			
		||||
  dnl maintainer-mode is disabled by default
 | 
			
		||||
  AC_ARG_ENABLE(maintainer-mode,
 | 
			
		||||
[  --enable-maintainer-mode enable make rules and dependencies not useful
 | 
			
		||||
                          (and sometimes confusing) to the casual installer],
 | 
			
		||||
      USE_MAINTAINER_MODE=$enableval,
 | 
			
		||||
      USE_MAINTAINER_MODE=no)
 | 
			
		||||
  AC_MSG_RESULT($USE_MAINTAINER_MODE)
 | 
			
		||||
  if test $USE_MAINTAINER_MODE = yes; then
 | 
			
		||||
    MAINT=
 | 
			
		||||
  else
 | 
			
		||||
    MAINT='#M#'
 | 
			
		||||
  fi
 | 
			
		||||
  AC_SUBST(MAINT)dnl
 | 
			
		||||
]
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
# aclocal-include.m4
 | 
			
		||||
# 
 | 
			
		||||
# This macro adds the name macrodir to the set of directories
 | 
			
		||||
# that `aclocal' searches for macros.  
 | 
			
		||||
 | 
			
		||||
# serial 1
 | 
			
		||||
 | 
			
		||||
dnl AM_ACLOCAL_INCLUDE(macrodir)
 | 
			
		||||
AC_DEFUN([AM_ACLOCAL_INCLUDE],
 | 
			
		||||
[ACLOCAL="$ACLOCAL -I $1"])
 | 
			
		||||
 | 
			
		||||
dnl
 | 
			
		||||
dnl GNOME_CHECK_GUILE (failflag)
 | 
			
		||||
dnl
 | 
			
		||||
dnl if failflag is "fail" then GNOME_CHECK_GUILE will abort if guile is not found.
 | 
			
		||||
dnl
 | 
			
		||||
 | 
			
		||||
AC_DEFUN([GNOME_CHECK_GUILE],
 | 
			
		||||
[
 | 
			
		||||
	saved_ldflags="$LDFLAGS"
 | 
			
		||||
	saved_cppflags="$CPPFLAGS"
 | 
			
		||||
	LDFLAGS="$LDFLAGS $GNOME_LIBDIR"
 | 
			
		||||
 | 
			
		||||
	AC_CHECK_LIB(qthreads,main,[
 | 
			
		||||
		QTTHREADS_LIB="-lqthreads"
 | 
			
		||||
	],[
 | 
			
		||||
		AC_CHECK_LIB(qt, qt_null, QTTHREADS_LIB="-lqt")
 | 
			
		||||
	],$LIBS)
 | 
			
		||||
	AC_SUBST(QTTHREADS_LIB)
 | 
			
		||||
 | 
			
		||||
	AC_CHECK_LIB(termcap,main,TERMCAP_LIB="-ltermcap")
 | 
			
		||||
	AC_CHECK_LIB(readline,main,READLINE_LIB="-lreadline",,$TERMCAP_LIB)
 | 
			
		||||
 | 
			
		||||
	AC_SUBST(TERMCAP_LIB)
 | 
			
		||||
	AC_SUBST(READLINE_LIB)
 | 
			
		||||
 | 
			
		||||
	AC_CHECK_PROG(BUILD_GUILE, build-guile, yes, no)
 | 
			
		||||
 | 
			
		||||
	if test "x$BUILD_GUILE" = "xyes"; then
 | 
			
		||||
		AC_MSG_CHECKING(whether build-guile works)
 | 
			
		||||
		if test x`build-guile --version >/dev/null 2>&1 || \
 | 
			
		||||
				echo no` = xno; then
 | 
			
		||||
			BUILD_GUILE=no
 | 
			
		||||
		fi
 | 
			
		||||
		AC_MSG_RESULT($BUILD_GUILE)
 | 
			
		||||
	fi
 | 
			
		||||
 | 
			
		||||
	AC_CHECK_LIB(m, sin)
 | 
			
		||||
 | 
			
		||||
	if test "x$BUILD_GUILE" = "xyes"; then
 | 
			
		||||
		AC_MSG_CHECKING(for guile libraries)
 | 
			
		||||
		GUILE_LIBS="-L`build-guile info libdir` `build-guile link`"
 | 
			
		||||
		AC_MSG_RESULT($GUILE_LIBS)
 | 
			
		||||
		AC_MSG_CHECKING(for guile headers)
 | 
			
		||||
		GUILE_INCS="-I`build-guile info includedir`"
 | 
			
		||||
		AC_MSG_RESULT($GUILE_INCS)
 | 
			
		||||
	else
 | 
			
		||||
		GUILE_LIBS="$GNOME_LIBDIR"
 | 
			
		||||
		GUILE_INCS="$GNOME_INCLUDEDIR"
 | 
			
		||||
		AC_CHECK_LIB(rx, main, GUILE_LIBS="-lrx $GUILE_LIBS")
 | 
			
		||||
		AC_CHECK_LIB(qt, main, GUILE_LIBS="-lqt $GUILE_LIBS")
 | 
			
		||||
		AC_CHECK_LIB(dl, dlopen, GUILE_LIBS="-ldl $GUILE_LIBS")
 | 
			
		||||
		GUILE_LIBS="-lguile $GUILE_LIBS $QTTHREADS_LIB $TERMCAP_LIB $READLINE_LIB"
 | 
			
		||||
	fi
 | 
			
		||||
 | 
			
		||||
	AC_SUBST(GUILE_LIBS)
 | 
			
		||||
	AC_SUBST(GUILE_INCS)
 | 
			
		||||
 | 
			
		||||
	LDFLAGS="$saved_ldflags $GUILE_LIBS"
 | 
			
		||||
	CPPFLAGS="$saved_cppflags $GUILE_INCS"
 | 
			
		||||
 | 
			
		||||
	AC_MSG_CHECKING(whether guile works)
 | 
			
		||||
	AC_TRY_LINK([
 | 
			
		||||
		#include <libguile.h>
 | 
			
		||||
		#include <guile/gh.h>
 | 
			
		||||
	],[
 | 
			
		||||
		gh_eval_str("(newline)");
 | 
			
		||||
		scm_boot_guile(0,NULL,NULL,NULL);
 | 
			
		||||
	],[
 | 
			
		||||
		ac_cv_guile_found=yes
 | 
			
		||||
		AC_DEFINE(HAVE_GUILE)
 | 
			
		||||
	],[
 | 
			
		||||
		ac_cv_guile_found=no
 | 
			
		||||
	])
 | 
			
		||||
	AC_MSG_RESULT($ac_cv_guile_found)
 | 
			
		||||
 | 
			
		||||
	if test x$ac_cv_guile_found = xno ; then
 | 
			
		||||
		if test x$1 = xfail ; then
 | 
			
		||||
		  AC_MSG_ERROR(Can not find Guile 1.2 on this system)
 | 
			
		||||
		else
 | 
			
		||||
		  AC_MSG_WARN(Can not find Guile 1.2 on this system)
 | 
			
		||||
		fi
 | 
			
		||||
		ac_cv_guile_found=no
 | 
			
		||||
	fi
 | 
			
		||||
 | 
			
		||||
	LDFLAGS="$saved_ldflags"
 | 
			
		||||
	CPPFLAGS="$saved_cppflags"
 | 
			
		||||
 | 
			
		||||
	AC_SUBST(GUILE_LIBS)
 | 
			
		||||
	AM_CONDITIONAL(GUILE, test x$ac_cv_guile_found = xyes)
 | 
			
		||||
])
 | 
			
		||||
 | 
			
		||||
# Define a conditional.
 | 
			
		||||
 | 
			
		||||
AC_DEFUN(AM_CONDITIONAL,
 | 
			
		||||
[AC_SUBST($1_TRUE)
 | 
			
		||||
AC_SUBST($1_FALSE)
 | 
			
		||||
if $2; then
 | 
			
		||||
  $1_TRUE=
 | 
			
		||||
  $1_FALSE='#'
 | 
			
		||||
else
 | 
			
		||||
  $1_TRUE='#'
 | 
			
		||||
  $1_FALSE=
 | 
			
		||||
fi])
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
dnl AM_PROG_LEX
 | 
			
		||||
dnl Look for flex, lex or missing, then run AC_PROG_LEX and AC_DECL_YYTEXT
 | 
			
		||||
AC_DEFUN(AM_PROG_LEX,
 | 
			
		||||
[AC_CHECK_PROGS(LEX, flex lex, "$1/missing flex")
 | 
			
		||||
AC_PROG_LEX
 | 
			
		||||
AC_DECL_YYTEXT])
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# serial 18 AM_PROG_LIBTOOL
 | 
			
		||||
AC_DEFUN(AM_PROG_LIBTOOL,
 | 
			
		||||
[AC_REQUIRE([AC_CANONICAL_HOST])
 | 
			
		||||
AC_REQUIRE([AC_PROG_RANLIB])
 | 
			
		||||
AC_REQUIRE([AC_PROG_CC])
 | 
			
		||||
AC_REQUIRE([AM_PROG_LD])
 | 
			
		||||
AC_REQUIRE([AM_PROG_NM])
 | 
			
		||||
AC_REQUIRE([AC_PROG_LN_S])
 | 
			
		||||
 | 
			
		||||
# Always use our own libtool.
 | 
			
		||||
LIBTOOL='$(SHELL) $(top_builddir)/libtool'
 | 
			
		||||
AC_SUBST(LIBTOOL)
 | 
			
		||||
 | 
			
		||||
dnl Allow the --disable-shared flag to stop us from building shared libs.
 | 
			
		||||
AC_ARG_ENABLE(shared,
 | 
			
		||||
[  --enable-shared         build shared libraries [default=yes]],
 | 
			
		||||
[if test "$enableval" = no; then
 | 
			
		||||
  libtool_enable_shared=no
 | 
			
		||||
else
 | 
			
		||||
  libtool_enable_shared=yes
 | 
			
		||||
fi])
 | 
			
		||||
test -n "$libtool_enable_shared" && enable_shared="$libtool_enable_shared"
 | 
			
		||||
libtool_shared=
 | 
			
		||||
test "$enable_shared" = no && libtool_shared=" --disable-shared"
 | 
			
		||||
 | 
			
		||||
dnl Allow the --disable-static flag to stop us from building static libs.
 | 
			
		||||
AC_ARG_ENABLE(static,
 | 
			
		||||
[  --enable-static         build static libraries [default=yes]],
 | 
			
		||||
[if test "$enableval" = no; then
 | 
			
		||||
  libtool_enable_static=no
 | 
			
		||||
else
 | 
			
		||||
  libtool_enable_static=yes
 | 
			
		||||
fi])
 | 
			
		||||
test -n "$libtool_enable_static" && enable_static="$libtool_enable_static"
 | 
			
		||||
libtool_static=
 | 
			
		||||
test "$enable_static" = no && libtool_static=" --disable-static"
 | 
			
		||||
 | 
			
		||||
libtool_flags="$libtool_shared$libtool_static"
 | 
			
		||||
test "$silent" = yes && libtool_flags="$libtool_flags --silent"
 | 
			
		||||
test "$ac_cv_prog_gcc" = yes && libtool_flags="$libtool_flags --with-gcc"
 | 
			
		||||
test "$ac_cv_prog_gnu_ld" = yes && libtool_flags="$libtool_flags --with-gnu-ld"
 | 
			
		||||
 | 
			
		||||
# Some flags need to be propagated to the compiler or linker for good
 | 
			
		||||
# libtool support.
 | 
			
		||||
[case "$host" in
 | 
			
		||||
*-*-irix6*)
 | 
			
		||||
  ac_save_CFLAGS="$CFLAGS"
 | 
			
		||||
  flag_passed=no
 | 
			
		||||
  for f in -32 -64 -n32 ABI -cckr -mips1 -mips2 -mips3 -mips4; do
 | 
			
		||||
    case "$f" in
 | 
			
		||||
    ABI)
 | 
			
		||||
      test -n "$SGI_ABI" && flag_passed=yes
 | 
			
		||||
      if test "$flag_passed" = no && test "$ac_cv_prog_gcc" = yes; then
 | 
			
		||||
	# Choose the ABI flag according to GCC's specs.
 | 
			
		||||
	if $CC -dumpspecs 2>&1 | sed '/^\*link:$/,/^$/!d' | egrep -e '[ 	]-32' >/dev/null; then
 | 
			
		||||
	  LD="${LD-ld} -32"
 | 
			
		||||
	else
 | 
			
		||||
	  LD="${LD-ld} -n32"
 | 
			
		||||
	fi
 | 
			
		||||
      fi
 | 
			
		||||
      ;;
 | 
			
		||||
 | 
			
		||||
    *)
 | 
			
		||||
      if echo " $CC $CFLAGS " | egrep -e "[ 	]$f[	 ]" > /dev/null; then
 | 
			
		||||
	flag_passed=yes
 | 
			
		||||
	LD="${LD-ld} $f"
 | 
			
		||||
      fi
 | 
			
		||||
      ;;
 | 
			
		||||
    esac
 | 
			
		||||
  done
 | 
			
		||||
  CFLAGS="$ac_save_CFLAGS"
 | 
			
		||||
  ;;
 | 
			
		||||
 | 
			
		||||
*-*-sco3.2v5*)
 | 
			
		||||
  # On SCO OpenServer 5, we need -belf to get full-featured binaries.
 | 
			
		||||
  CFLAGS="$CFLAGS -belf"
 | 
			
		||||
  ;;
 | 
			
		||||
esac]
 | 
			
		||||
 | 
			
		||||
# Actually configure libtool.  ac_aux_dir is where install-sh is found.
 | 
			
		||||
CC="$CC" CFLAGS="$CFLAGS" CPPFLAGS="$CPPFLAGS" \
 | 
			
		||||
LD="$LD" NM="$NM" RANLIB="$RANLIB" LN_S="$LN_S" \
 | 
			
		||||
${CONFIG_SHELL-/bin/sh} $ac_aux_dir/ltconfig \
 | 
			
		||||
$libtool_flags --no-verify $ac_aux_dir/ltmain.sh $host \
 | 
			
		||||
|| AC_MSG_ERROR([libtool configure failed])
 | 
			
		||||
])
 | 
			
		||||
 | 
			
		||||
# AM_PROG_LD - find the path to the GNU or non-GNU linker
 | 
			
		||||
AC_DEFUN(AM_PROG_LD,
 | 
			
		||||
[AC_ARG_WITH(gnu-ld,
 | 
			
		||||
[  --with-gnu-ld           assume the C compiler uses GNU ld [default=no]],
 | 
			
		||||
test "$withval" = no || with_gnu_ld=yes, with_gnu_ld=no)
 | 
			
		||||
AC_REQUIRE([AC_PROG_CC])
 | 
			
		||||
ac_prog=ld
 | 
			
		||||
if test "$ac_cv_prog_gcc" = yes; then
 | 
			
		||||
  # Check if gcc -print-prog-name=ld gives a path.
 | 
			
		||||
  AC_MSG_CHECKING([for ld used by GCC])
 | 
			
		||||
  ac_prog=`($CC -print-prog-name=ld) 2>&5`
 | 
			
		||||
  case "$ac_prog" in
 | 
			
		||||
  # Accept absolute paths.
 | 
			
		||||
dnl AM_PATH_PROG_WITH_TEST(VARIABLE, PROG-TO-CHECK-FOR,
 | 
			
		||||
dnl   TEST-PERFORMED-ON-FOUND_PROGRAM [, VALUE-IF-NOT-FOUND [, PATH]])
 | 
			
		||||
AC_DEFUN(AM_PATH_PROG_WITH_TEST,
 | 
			
		||||
[# Extract the first word of "$2", so it can be a program name with args.
 | 
			
		||||
set dummy $2; ac_word=[$]2
 | 
			
		||||
AC_MSG_CHECKING([for $ac_word])
 | 
			
		||||
AC_CACHE_VAL(ac_cv_path_$1,
 | 
			
		||||
[case "[$]$1" in
 | 
			
		||||
  /*)
 | 
			
		||||
    test -z "$LD" && LD="$ac_prog"
 | 
			
		||||
    ;;
 | 
			
		||||
  "")
 | 
			
		||||
    # If it fails, then pretend we aren't using GCC.
 | 
			
		||||
    ac_prog=ld
 | 
			
		||||
    ;;
 | 
			
		||||
  ac_cv_path_$1="[$]$1" # Let the user override the test with a path.
 | 
			
		||||
  ;;
 | 
			
		||||
  *)
 | 
			
		||||
    # If it is relative, then search for the first ld in PATH.
 | 
			
		||||
    with_gnu_ld=unknown
 | 
			
		||||
    ;;
 | 
			
		||||
  esac
 | 
			
		||||
elif test "$with_gnu_ld" = yes; then
 | 
			
		||||
  AC_MSG_CHECKING([for GNU ld])
 | 
			
		||||
else
 | 
			
		||||
  AC_MSG_CHECKING([for non-GNU ld])
 | 
			
		||||
fi
 | 
			
		||||
AC_CACHE_VAL(ac_cv_path_LD,
 | 
			
		||||
[if test -z "$LD"; then
 | 
			
		||||
  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS="${IFS}:"
 | 
			
		||||
  for ac_dir in $PATH; do
 | 
			
		||||
  for ac_dir in ifelse([$5], , $PATH, [$5]); do
 | 
			
		||||
    test -z "$ac_dir" && ac_dir=.
 | 
			
		||||
    if test -f "$ac_dir/$ac_prog"; then
 | 
			
		||||
      ac_cv_path_LD="$ac_dir/$ac_prog"
 | 
			
		||||
      # Check to see if the program is GNU ld.  I'd rather use --version,
 | 
			
		||||
      # but apparently some GNU ld's only accept -v.
 | 
			
		||||
      # Break only if it was the GNU/non-GNU ld that we prefer.
 | 
			
		||||
      if "$ac_cv_path_LD" -v 2>&1 < /dev/null | egrep '(GNU|with BFD)' > /dev/null; then
 | 
			
		||||
	test "$with_gnu_ld" != no && break
 | 
			
		||||
      else
 | 
			
		||||
        test "$with_gnu_ld" != yes && break
 | 
			
		||||
    if test -f $ac_dir/$ac_word; then
 | 
			
		||||
      if [$3]; then
 | 
			
		||||
	ac_cv_path_$1="$ac_dir/$ac_word"
 | 
			
		||||
	break
 | 
			
		||||
      fi
 | 
			
		||||
    fi
 | 
			
		||||
  done
 | 
			
		||||
  IFS="$ac_save_ifs"
 | 
			
		||||
else
 | 
			
		||||
  ac_cv_path_LD="$LD" # Let the user override the test with a path.
 | 
			
		||||
fi])
 | 
			
		||||
LD="$ac_cv_path_LD"
 | 
			
		||||
if test -n "$LD"; then
 | 
			
		||||
  AC_MSG_RESULT($LD)
 | 
			
		||||
dnl If no 4th arg is given, leave the cache variable unset,
 | 
			
		||||
dnl so AC_PATH_PROGS will keep looking.
 | 
			
		||||
ifelse([$4], , , [  test -z "[$]ac_cv_path_$1" && ac_cv_path_$1="$4"
 | 
			
		||||
])dnl
 | 
			
		||||
  ;;
 | 
			
		||||
esac])dnl
 | 
			
		||||
$1="$ac_cv_path_$1"
 | 
			
		||||
if test -n "[$]$1"; then
 | 
			
		||||
  AC_MSG_RESULT([$]$1)
 | 
			
		||||
else
 | 
			
		||||
  AC_MSG_RESULT(no)
 | 
			
		||||
fi
 | 
			
		||||
test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH])
 | 
			
		||||
AC_SUBST(LD)
 | 
			
		||||
AM_PROG_LD_GNU
 | 
			
		||||
AC_SUBST($1)dnl
 | 
			
		||||
])
 | 
			
		||||
 | 
			
		||||
AC_DEFUN(AM_PROG_LD_GNU,
 | 
			
		||||
[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], ac_cv_prog_gnu_ld,
 | 
			
		||||
[# I'd rather use --version here, but apparently some GNU ld's only accept -v.
 | 
			
		||||
if $LD -v 2>&1 </dev/null | egrep '(GNU|with BFD)' 1>&5; then
 | 
			
		||||
  ac_cv_prog_gnu_ld=yes
 | 
			
		||||
else
 | 
			
		||||
  ac_cv_prog_gnu_ld=no
 | 
			
		||||
fi])
 | 
			
		||||
])
 | 
			
		||||
 | 
			
		||||
# AM_PROG_NM - find the path to a BSD-compatible name lister
 | 
			
		||||
AC_DEFUN(AM_PROG_NM,
 | 
			
		||||
[AC_MSG_CHECKING([for BSD-compatible nm])
 | 
			
		||||
AC_CACHE_VAL(ac_cv_path_NM,
 | 
			
		||||
[case "$NM" in
 | 
			
		||||
/*)
 | 
			
		||||
  ac_cv_path_NM="$NM" # Let the user override the test with a path.
 | 
			
		||||
  ;;
 | 
			
		||||
*)
 | 
			
		||||
  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS="${IFS}:"
 | 
			
		||||
  for ac_dir in /usr/ucb /usr/ccs/bin $PATH /bin; do
 | 
			
		||||
    test -z "$ac_dir" && dir=.
 | 
			
		||||
    if test -f $ac_dir/nm; then
 | 
			
		||||
      # Check to see if the nm accepts a BSD-compat flag.
 | 
			
		||||
      # Adding the `sed 1!d' prevents false positives on HP-UX, which says:
 | 
			
		||||
      #   nm: unknown option "B" ignored
 | 
			
		||||
      if ($ac_dir/nm -B /dev/null 2>&1 | sed '1!d'; exit 0) | egrep /dev/null >/dev/null; then
 | 
			
		||||
        ac_cv_path_NM="$ac_dir/nm -B"
 | 
			
		||||
      elif ($ac_dir/nm -p /dev/null 2>&1 | sed '1!d'; exit 0) | egrep /dev/null >/dev/null; then
 | 
			
		||||
        ac_cv_path_NM="$ac_dir/nm -p"
 | 
			
		||||
      else
 | 
			
		||||
        ac_cv_path_NM="$ac_dir/nm"
 | 
			
		||||
      fi
 | 
			
		||||
      break
 | 
			
		||||
######################################################################
 | 
			
		||||
# lcmessage.m4 from gettext 0.32
 | 
			
		||||
######################################################################
 | 
			
		||||
# Check whether LC_MESSAGES is available in <locale.h>.
 | 
			
		||||
# Ulrich Drepper <drepper@cygnus.com>, 1995.
 | 
			
		||||
#
 | 
			
		||||
# This file file be copied and used freely without restrictions.  It can
 | 
			
		||||
# be used in projects which are not available under the GNU Public License
 | 
			
		||||
# but which still want to provide support for the GNU gettext functionality.
 | 
			
		||||
# Please note that the actual code is *not* freely available.
 | 
			
		||||
 | 
			
		||||
# serial 1
 | 
			
		||||
 | 
			
		||||
AC_DEFUN(AM_LC_MESSAGES,
 | 
			
		||||
  [if test $ac_cv_header_locale_h = yes; then
 | 
			
		||||
    AC_CACHE_CHECK([for LC_MESSAGES], am_cv_val_LC_MESSAGES,
 | 
			
		||||
      [AC_TRY_LINK([#include <locale.h>], [return LC_MESSAGES],
 | 
			
		||||
       am_cv_val_LC_MESSAGES=yes, am_cv_val_LC_MESSAGES=no)])
 | 
			
		||||
    if test $am_cv_val_LC_MESSAGES = yes; then
 | 
			
		||||
      AC_DEFINE(HAVE_LC_MESSAGES)
 | 
			
		||||
    fi
 | 
			
		||||
  done
 | 
			
		||||
  IFS="$ac_save_ifs"
 | 
			
		||||
  test -z "$ac_cv_path_NM" && ac_cv_path_NM=nm
 | 
			
		||||
  ;;
 | 
			
		||||
esac])
 | 
			
		||||
NM="$ac_cv_path_NM"
 | 
			
		||||
AC_MSG_RESULT([$NM])
 | 
			
		||||
AC_SUBST(NM)
 | 
			
		||||
])
 | 
			
		||||
  fi])
 | 
			
		||||
 | 
			
		||||
dnl LIBGTOP_SUPPORT_CHECKS
 | 
			
		||||
dnl    Check for various support functions needed by the standard
 | 
			
		||||
dnl    Gnome libraries.  Sets LIBOBJS, might define some macros,
 | 
			
		||||
dnl    and will set the need_libgtop_support shell variable to "yes"
 | 
			
		||||
dnl    or "no".  Also sets up the Automake BUILD_LIBGTOP_SUPPORT
 | 
			
		||||
dnl    conditional.
 | 
			
		||||
AC_DEFUN([LIBGTOP_SUPPORT_CHECKS],[
 | 
			
		||||
  need_libgtop_support=no
 | 
			
		||||
  save_LIBOBJS="$LIBOBJS"
 | 
			
		||||
  LIBOBJS=
 | 
			
		||||
 | 
			
		||||
  AC_CACHE_CHECK([for program_invocation_short_name], libgtop_cv_short_name, [
 | 
			
		||||
    AC_TRY_LINK([#include <errno.h>],[
 | 
			
		||||
      char *foo = program_invocation_short_name],
 | 
			
		||||
      libgtop_cv_short_name=yes, libgtop_cv_short_name=no)])
 | 
			
		||||
  if test "$libgtop_cv_short_name" = yes; then
 | 
			
		||||
     AC_DEFINE(HAVE_PROGRAM_INVOCATION_SHORT_NAME)
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  AC_CACHE_CHECK([for program_invocation_name], libgtop_cv_invocation_name, [
 | 
			
		||||
    AC_TRY_LINK([#include <errno.h>],[
 | 
			
		||||
      char *foo = program_invocation_name],
 | 
			
		||||
      libgtop_cv_invocation_name=yes, libgtop_cv_invocation_name=no)])
 | 
			
		||||
  if test "$libgtop_cv_invocation_name" = yes; then
 | 
			
		||||
     AC_DEFINE(HAVE_PROGRAM_INVOCATION_NAME)
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  AC_REPLACE_FUNCS(strtok_r strcasecmp strndup strnlen strerror)
 | 
			
		||||
 | 
			
		||||
  if test "$LIBOBJS" != ""; then
 | 
			
		||||
     need_libgtop_support=yes
 | 
			
		||||
  fi
 | 
			
		||||
  # Turn our LIBOBJS into libtool objects.  This is gross, but it
 | 
			
		||||
  # requires changes to autoconf before it goes away.
 | 
			
		||||
  LTLIBOBJS=`echo "$LIBOBJS" | sed 's/\.o/.lo/g'`
 | 
			
		||||
  AC_SUBST(LTLIBOBJS)
 | 
			
		||||
 | 
			
		||||
  LIBOBJS="$save_LIBOBJS"
 | 
			
		||||
  AM_CONDITIONAL(BUILD_LIBGTOP_SUPPORT, test "$need_libgtop_support" = yes)
 | 
			
		||||
])
 | 
			
		||||
 | 
			
		||||
######################################################################
 | 
			
		||||
# gettext.m4 from gettext 0.32
 | 
			
		||||
######################################################################
 | 
			
		||||
# Macro to add for using GNU gettext.
 | 
			
		||||
# Ulrich Drepper <drepper@cygnus.com>, 1995.
 | 
			
		||||
#
 | 
			
		||||
@@ -915,72 +489,3 @@ __argz_count __argz_stringify __argz_next])
 | 
			
		||||
   sed -e "/^#/d" -e "/^\$/d" -e "s,.*,	$posrcprefix& \\\\," -e "\$s/\(.*\) \\\\/\1/" \
 | 
			
		||||
	< $srcdir/po/POTFILES.in > po/POTFILES
 | 
			
		||||
  ])
 | 
			
		||||
 | 
			
		||||
# Search path for a program which passes the given test.
 | 
			
		||||
# Ulrich Drepper <drepper@cygnus.com>, 1996.
 | 
			
		||||
#
 | 
			
		||||
# This file file be copied and used freely without restrictions.  It can
 | 
			
		||||
# be used in projects which are not available under the GNU Public License
 | 
			
		||||
# but which still want to provide support for the GNU gettext functionality.
 | 
			
		||||
# Please note that the actual code is *not* freely available.
 | 
			
		||||
 | 
			
		||||
# serial 1
 | 
			
		||||
 | 
			
		||||
dnl AM_PATH_PROG_WITH_TEST(VARIABLE, PROG-TO-CHECK-FOR,
 | 
			
		||||
dnl   TEST-PERFORMED-ON-FOUND_PROGRAM [, VALUE-IF-NOT-FOUND [, PATH]])
 | 
			
		||||
AC_DEFUN(AM_PATH_PROG_WITH_TEST,
 | 
			
		||||
[# Extract the first word of "$2", so it can be a program name with args.
 | 
			
		||||
set dummy $2; ac_word=[$]2
 | 
			
		||||
AC_MSG_CHECKING([for $ac_word])
 | 
			
		||||
AC_CACHE_VAL(ac_cv_path_$1,
 | 
			
		||||
[case "[$]$1" in
 | 
			
		||||
  /*)
 | 
			
		||||
  ac_cv_path_$1="[$]$1" # Let the user override the test with a path.
 | 
			
		||||
  ;;
 | 
			
		||||
  *)
 | 
			
		||||
  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS="${IFS}:"
 | 
			
		||||
  for ac_dir in ifelse([$5], , $PATH, [$5]); do
 | 
			
		||||
    test -z "$ac_dir" && ac_dir=.
 | 
			
		||||
    if test -f $ac_dir/$ac_word; then
 | 
			
		||||
      if [$3]; then
 | 
			
		||||
	ac_cv_path_$1="$ac_dir/$ac_word"
 | 
			
		||||
	break
 | 
			
		||||
      fi
 | 
			
		||||
    fi
 | 
			
		||||
  done
 | 
			
		||||
  IFS="$ac_save_ifs"
 | 
			
		||||
dnl If no 4th arg is given, leave the cache variable unset,
 | 
			
		||||
dnl so AC_PATH_PROGS will keep looking.
 | 
			
		||||
ifelse([$4], , , [  test -z "[$]ac_cv_path_$1" && ac_cv_path_$1="$4"
 | 
			
		||||
])dnl
 | 
			
		||||
  ;;
 | 
			
		||||
esac])dnl
 | 
			
		||||
$1="$ac_cv_path_$1"
 | 
			
		||||
if test -n "[$]$1"; then
 | 
			
		||||
  AC_MSG_RESULT([$]$1)
 | 
			
		||||
else
 | 
			
		||||
  AC_MSG_RESULT(no)
 | 
			
		||||
fi
 | 
			
		||||
AC_SUBST($1)dnl
 | 
			
		||||
])
 | 
			
		||||
 | 
			
		||||
# Check whether LC_MESSAGES is available in <locale.h>.
 | 
			
		||||
# Ulrich Drepper <drepper@cygnus.com>, 1995.
 | 
			
		||||
#
 | 
			
		||||
# This file file be copied and used freely without restrictions.  It can
 | 
			
		||||
# be used in projects which are not available under the GNU Public License
 | 
			
		||||
# but which still want to provide support for the GNU gettext functionality.
 | 
			
		||||
# Please note that the actual code is *not* freely available.
 | 
			
		||||
 | 
			
		||||
# serial 1
 | 
			
		||||
 | 
			
		||||
AC_DEFUN(AM_LC_MESSAGES,
 | 
			
		||||
  [if test $ac_cv_header_locale_h = yes; then
 | 
			
		||||
    AC_CACHE_CHECK([for LC_MESSAGES], am_cv_val_LC_MESSAGES,
 | 
			
		||||
      [AC_TRY_LINK([#include <locale.h>], [return LC_MESSAGES],
 | 
			
		||||
       am_cv_val_LC_MESSAGES=yes, am_cv_val_LC_MESSAGES=no)])
 | 
			
		||||
    if test $am_cv_val_LC_MESSAGES = yes; then
 | 
			
		||||
      AC_DEFINE(HAVE_LC_MESSAGES)
 | 
			
		||||
    fi
 | 
			
		||||
  fi])
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										128
									
								
								configure.in
									
									
									
									
									
								
							
							
						
						
									
										128
									
								
								configure.in
									
									
									
									
									
								
							@@ -4,19 +4,24 @@ dnl
 | 
			
		||||
 | 
			
		||||
AC_INIT(copyright.txt)
 | 
			
		||||
AM_CONFIG_HEADER(config.h)
 | 
			
		||||
AC_CANONICAL_SYSTEM
 | 
			
		||||
 | 
			
		||||
AM_INIT_AUTOMAKE(libgtop, 0.01)
 | 
			
		||||
 | 
			
		||||
AM_MAINTAINER_MODE
 | 
			
		||||
 | 
			
		||||
AM_ACLOCAL_INCLUDE(macros)
 | 
			
		||||
 | 
			
		||||
AC_CANONICAL_HOST
 | 
			
		||||
AC_ISC_POSIX
 | 
			
		||||
AC_PROG_CC
 | 
			
		||||
AC_STDC_HEADERS
 | 
			
		||||
AC_ARG_PROGRAM
 | 
			
		||||
 | 
			
		||||
dnl We don't use `AC_PROG_AWK' since it checks for mawk first which
 | 
			
		||||
dnl does not work for libgtop.
 | 
			
		||||
AC_CHECK_PROGS(AWK, gawk awk, )
 | 
			
		||||
test -z "$AWK" && AC_MSG_ERROR([Sorry, you need a working awk interpreter.])
 | 
			
		||||
 | 
			
		||||
AC_CHECK_TOOL(CC,gcc)
 | 
			
		||||
AC_CHECK_TOOL(CXX,g++)
 | 
			
		||||
AC_CHECK_TOOL(RANLIB,ranlib)
 | 
			
		||||
AC_CHECK_TOOL(LD,ld)
 | 
			
		||||
AC_CHECK_TOOL(AS,as)
 | 
			
		||||
AC_CHECK_TOOL(AR,ar)
 | 
			
		||||
AC_CHECK_TOOL(NM,nm)
 | 
			
		||||
@@ -24,6 +29,24 @@ AC_CHECK_TOOL(NM,nm)
 | 
			
		||||
NM=`which $NM`
 | 
			
		||||
export CC CXX RANLIB LD AS AR NM
 | 
			
		||||
 | 
			
		||||
AC_PROG_INSTALL
 | 
			
		||||
AC_PROG_LN_S
 | 
			
		||||
AC_PROG_MAKE_SET
 | 
			
		||||
 | 
			
		||||
export cross_compiling
 | 
			
		||||
 | 
			
		||||
AM_PROG_LIBTOOL
 | 
			
		||||
 | 
			
		||||
dnl If you want to use libgtop without gnome, comment the following line out.
 | 
			
		||||
GNOME_INIT_HOOK(gnome_found=yes)
 | 
			
		||||
 | 
			
		||||
if test "x$gnome_found" != xyes; then
 | 
			
		||||
  GNOME_SUPPORT_CHECKS
 | 
			
		||||
else
 | 
			
		||||
  AM_CONDITIONAL(BUILD_GNOME_SUPPORT, false)
 | 
			
		||||
  AM_CONDITIONAL(CROSS_COMPILING, test "x$cross_compiling" = xyes)
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
AC_LC_SYSDEPS
 | 
			
		||||
 | 
			
		||||
if test x$libgtop_want_guile = xyes ; then
 | 
			
		||||
@@ -32,7 +55,7 @@ if test x$libgtop_want_guile = xyes ; then
 | 
			
		||||
    if test x$libgtop_want_names = xyes ; then
 | 
			
		||||
      AC_DEFINE(GLIBTOP_GUILE_NAMES)
 | 
			
		||||
    fi
 | 
			
		||||
    guile_examples='third third_static third_linux'
 | 
			
		||||
    guile_examples='third third_static'
 | 
			
		||||
    guile_subdirs='guile'
 | 
			
		||||
  else
 | 
			
		||||
    guile_examples=
 | 
			
		||||
@@ -46,21 +69,10 @@ fi
 | 
			
		||||
AC_SUBST(guile_examples)
 | 
			
		||||
AC_SUBST(guile_subdirs)
 | 
			
		||||
 | 
			
		||||
AC_ISC_POSIX
 | 
			
		||||
AC_PROG_CXX
 | 
			
		||||
AC_PROG_CC
 | 
			
		||||
AC_PROG_CPP
 | 
			
		||||
AC_STDC_HEADERS
 | 
			
		||||
AC_ARG_PROGRAM
 | 
			
		||||
AM_PROG_LEX
 | 
			
		||||
AC_PROG_INSTALL
 | 
			
		||||
AC_PROG_LN_S
 | 
			
		||||
AC_PROG_MAKE_SET
 | 
			
		||||
 | 
			
		||||
export cross_compiling
 | 
			
		||||
AM_PROG_LIBTOOL
 | 
			
		||||
 | 
			
		||||
GNOME_SUPPORT_CHECKS
 | 
			
		||||
dnl You need to uncomment the following line if you want to use libgtop without Gnome.
 | 
			
		||||
dnl GNOME_SUPPORT_CHECKS
 | 
			
		||||
 | 
			
		||||
dnl Checks for typedefs, structures, and compiler characteristics.
 | 
			
		||||
AC_C_CONST
 | 
			
		||||
@@ -90,9 +102,35 @@ AC_TYPE_SIGNAL
 | 
			
		||||
AC_FUNC_STRFTIME
 | 
			
		||||
AC_CHECK_FUNCS(getcwd gettimeofday getwd putenv strdup strtoul uname)
 | 
			
		||||
 | 
			
		||||
ALL_LINGUAS=""
 | 
			
		||||
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)
 | 
			
		||||
 | 
			
		||||
dnl For diskusage stuff
 | 
			
		||||
GNOME_FILEUTILS_CHECKS
 | 
			
		||||
 | 
			
		||||
CFLAGS="$CFLAGS -D_IN_LIBGTOP"
 | 
			
		||||
 | 
			
		||||
AC_SUBST(CFLAGS)
 | 
			
		||||
@@ -101,15 +139,27 @@ AC_SUBST(LDFLAGS)
 | 
			
		||||
 | 
			
		||||
AC_ARG_ENABLE(debug, [  --enable-debug          turn on debugging [default=no]],AC_DEFINE(GNOME_ENABLE_DEBUG),)
 | 
			
		||||
 | 
			
		||||
LIBSUPPORT=
 | 
			
		||||
SUPPORTINCS=
 | 
			
		||||
if test "$need_gnome_support" = yes; then
 | 
			
		||||
   LIBSUPPORT='$(top_builddir)/support/libgnomesupport.la'
 | 
			
		||||
   SUPPORTINCS='-I$(top_srcdir)/support'
 | 
			
		||||
dnl If you want to use libgtop without gnome, uncomment the following paragraph:
 | 
			
		||||
dnl LIBSUPPORT=
 | 
			
		||||
dnl SUPPORTINCS=
 | 
			
		||||
dnl if test "$need_gnome_support" = yes; then
 | 
			
		||||
dnl    LIBSUPPORT='$(top_builddir)/support/libgnomesupport.la'
 | 
			
		||||
dnl    SUPPORTINCS='-I$(top_srcdir)/support'
 | 
			
		||||
dnl fi
 | 
			
		||||
dnl AC_SUBST(LIBSUPPORT)
 | 
			
		||||
dnl AC_SUBST(SUPPORTINCS)
 | 
			
		||||
 | 
			
		||||
dnl Some ugly hack; if '-lgnomesupport' is part of $GNOME_LIBS, we include it here.
 | 
			
		||||
echo "$GNOME_LIBS" | grep -q -e '-lgnomesupport'
 | 
			
		||||
if test $? = 0 ; then
 | 
			
		||||
  LIBSUPPORT="$GNOME_LIBDIR -lgnomesupport"
 | 
			
		||||
  SUPPORTINCS="$GNOME_INCLUDEDIR"
 | 
			
		||||
fi
 | 
			
		||||
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"
 | 
			
		||||
@@ -141,8 +191,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"
 | 
			
		||||
@@ -153,13 +203,12 @@ else
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
if test "x$ac_cv_guile_found" = "xyes" ; then
 | 
			
		||||
  LIBGTOP_INCS="$LIBGTOP_INCS $GUILE_INCS"
 | 
			
		||||
  LIBGTOP_GUILE_INCS="$LIBGTOP_INCS $GUILE_INCS"
 | 
			
		||||
  LIBGTOP_GUILE_LIBS="$LIBGTOP_GUILE_LIBS $GUILE_LIBS"
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
if test "x$libgtop_use_machine_h" = "xyes" ; then
 | 
			
		||||
  machine_incs='-I$(top_srcdir)/sysdeps/@sysdeps_dir@'
 | 
			
		||||
fi
 | 
			
		||||
machine_incs='-I$(top_srcdir)/sysdeps/@sysdeps_dir@'
 | 
			
		||||
 | 
			
		||||
AC_SUBST(machine_incs)
 | 
			
		||||
 | 
			
		||||
@@ -170,8 +219,17 @@ AC_SUBST(LIBGTOP_GUILE_INCS)
 | 
			
		||||
AC_SUBST(LIBGTOP_BINDIR)
 | 
			
		||||
AC_SUBST(LIBGTOP_SERVER)
 | 
			
		||||
 | 
			
		||||
AC_SUBST(LIBSUPPORT)
 | 
			
		||||
AC_SUBST(SUPPORTINCS)
 | 
			
		||||
LIBSUPPORT=
 | 
			
		||||
SUPPORTINCS=
 | 
			
		||||
if test "$need_gnome_support" = yes; then
 | 
			
		||||
   if test "x$gnome_found" = xyes ; then
 | 
			
		||||
     LIBSUPPORT="$GNOME_LIBDIR -lgnomesupport"
 | 
			
		||||
     SUPPORTINCS="$GNOME_INCLUDEDIR"
 | 
			
		||||
   else
 | 
			
		||||
     LIBSUPPORT='$(top_builddir)/support/libgnomesupport.la'
 | 
			
		||||
     SUPPORTINCS='-DNEED_GNOMESUPPORT_H -I$(top_builddir)/support -I$(top_srcdir)/support'
 | 
			
		||||
   fi
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
AC_OUTPUT([
 | 
			
		||||
Makefile
 | 
			
		||||
@@ -188,9 +246,13 @@ sysdeps/stub/Makefile
 | 
			
		||||
sysdeps/sun4/Makefile
 | 
			
		||||
sysdeps/osf1/Makefile
 | 
			
		||||
sysdeps/linux/Makefile
 | 
			
		||||
sysdeps/kernel/Makefile
 | 
			
		||||
src/Makefile
 | 
			
		||||
src/server/Makefile
 | 
			
		||||
src/proxy/Makefile
 | 
			
		||||
src/daemon/Makefile
 | 
			
		||||
lib/Makefile
 | 
			
		||||
examples/Makefile
 | 
			
		||||
perl/Makefile.PL
 | 
			
		||||
support/Makefile
 | 
			
		||||
macros/Makefile],[sed -e "/POTFILES =/r po/POTFILES" po/Makefile.in > po/Makefile])
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										11
									
								
								examples/ChangeLog
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								examples/ChangeLog
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,11 @@
 | 
			
		||||
1998-06-12  Martin Baulig  <martin@home-of-linux.org>
 | 
			
		||||
 | 
			
		||||
	* test.scm: New file.
 | 
			
		||||
	
 | 
			
		||||
1998-06-07  Martin Baulig  <martin@home-of-linux.org>
 | 
			
		||||
 | 
			
		||||
	* Makefile.am (CFLAGS): Disable optimize.
 | 
			
		||||
	
 | 
			
		||||
	* first.c (PROFILE_COUNT): Number of times each function
 | 
			
		||||
	should be called. Defaults to 1; to profile the code, you
 | 
			
		||||
	can increase this when compiling.
 | 
			
		||||
@@ -6,46 +6,35 @@ 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@
 | 
			
		||||
CFLAGS			= -Wall -W @CFLAGS@ -O0
 | 
			
		||||
 | 
			
		||||
DEFS			= @DEFS@
 | 
			
		||||
 | 
			
		||||
bin_PROGRAMS		= first first_static first_linux \
 | 
			
		||||
			  second second_static second_linux \
 | 
			
		||||
bin_PROGRAMS		= first first_static second second_static \
 | 
			
		||||
			  @guile_examples@
 | 
			
		||||
 | 
			
		||||
EXTRA_PROGRAMS		= third third_static third_linux
 | 
			
		||||
EXTRA_PROGRAMS		= third third_static
 | 
			
		||||
 | 
			
		||||
first_SOURCES		= first.c
 | 
			
		||||
first_LDADD		= $(top_builddir)/sysdeps/common/libgtop_common.la \
 | 
			
		||||
			  $(top_builddir)/lib/libgtop.la \
 | 
			
		||||
			  @INTLLIBS@ @LIBSUPPORT@
 | 
			
		||||
first_LDADD		= $(top_builddir)/lib/libgtop.la \
 | 
			
		||||
			  $(top_builddir)/sysdeps/common/libgtop_common.la \
 | 
			
		||||
			  $(top_builddir)/sysdeps/@sysdeps_dir@/libgtop_sysdeps.la \
 | 
			
		||||
			  @INTLLIBS@ @LIBSUPPORT@ @libs_xauth@
 | 
			
		||||
 | 
			
		||||
first_static_SOURCES	= $(first_SOURCES)
 | 
			
		||||
first_static_LDADD	= $(first_LDADD)
 | 
			
		||||
first_static_LDFLAGS	= -static
 | 
			
		||||
 | 
			
		||||
first_linux_SOURCES	= $(first_SOURCES)
 | 
			
		||||
first_linux_LDADD	= $(top_builddir)/sysdeps/common/libgtop_common.la \
 | 
			
		||||
			  $(top_builddir)/sysdeps/@sysdeps_dir@/libgtop_sysdeps.la \
 | 
			
		||||
			  @INTLLIBS@ @LIBSUPPORT@
 | 
			
		||||
first_linux_LDFLAGS	= -static
 | 
			
		||||
 | 
			
		||||
second_SOURCES		= second.c
 | 
			
		||||
second_LDADD		= $(top_builddir)/sysdeps/common/libgtop_common.la \
 | 
			
		||||
			  $(top_builddir)/lib/libgtop.la \
 | 
			
		||||
			  @INTLLIBS@ @LIBSUPPORT@
 | 
			
		||||
second_LDADD		= $(top_builddir)/lib/libgtop.la \
 | 
			
		||||
			  $(top_builddir)/sysdeps/common/libgtop_common.la \
 | 
			
		||||
			  $(top_builddir)/sysdeps/@sysdeps_dir@/libgtop_sysdeps.la \
 | 
			
		||||
			  @INTLLIBS@ @LIBSUPPORT@ @libs_xauth@
 | 
			
		||||
 | 
			
		||||
second_static_SOURCES	= $(second_SOURCES)
 | 
			
		||||
second_static_LDADD	= $(second_LDADD)
 | 
			
		||||
second_static_LDFLAGS	= -static
 | 
			
		||||
 | 
			
		||||
second_linux_SOURCES	= $(second_SOURCES)
 | 
			
		||||
second_linux_LDADD	= $(top_builddir)/sysdeps/common/libgtop_common.la \
 | 
			
		||||
			  $(top_builddir)/sysdeps/@sysdeps_dir@/libgtop_sysdeps.la \
 | 
			
		||||
			  @INTLLIBS@ @LIBSUPPORT@
 | 
			
		||||
second_linux_LDFLAGS	= -static
 | 
			
		||||
 | 
			
		||||
if GLIBTOP_NAMES
 | 
			
		||||
third_guile_names_LIBS	= $(top_builddir)/sysdeps/guile/names/libgtop_guile_names.la
 | 
			
		||||
third_names_LIBS	= $(top_builddir)/sysdeps/names/libgtop_names.la
 | 
			
		||||
@@ -54,18 +43,11 @@ endif
 | 
			
		||||
third_SOURCES		= third.c
 | 
			
		||||
third_LDADD		= $(top_builddir)/sysdeps/guile/libgtop_guile.la \
 | 
			
		||||
			  $(third_guile_names_LIBS) $(third_names_LIBS) \
 | 
			
		||||
			  $(top_builddir)/sysdeps/common/libgtop_common.la \
 | 
			
		||||
			  $(top_builddir)/lib/libgtop.la \
 | 
			
		||||
			  @GUILE_LIBS@ @INTLLIBS@ @LIBSUPPORT@
 | 
			
		||||
			  $(top_builddir)/sysdeps/common/libgtop_common.la \
 | 
			
		||||
			  $(top_builddir)/sysdeps/@sysdeps_dir@/libgtop_sysdeps.la \
 | 
			
		||||
			  @GUILE_LIBS@ @INTLLIBS@ @LIBSUPPORT@ @libs_xauth@
 | 
			
		||||
 | 
			
		||||
third_static_SOURCES	= $(third_SOURCES)
 | 
			
		||||
third_static_LDADD	= $(third_LDADD)
 | 
			
		||||
third_static_LDFLAGS	= -static
 | 
			
		||||
 | 
			
		||||
third_linux_SOURCES	= $(third_SOURCES)
 | 
			
		||||
third_linux_LDADD	= $(top_builddir)/sysdeps/guile/libgtop_guile.la \
 | 
			
		||||
			  $(third_guile_names_LIBS) $(third_names_LIBS) \
 | 
			
		||||
			  $(top_builddir)/sysdeps/common/libgtop_common.la \
 | 
			
		||||
			  $(top_builddir)/sysdeps/@sysdeps_dir@/libgtop_sysdeps.la \
 | 
			
		||||
			  @GUILE_LIBS@ @INTLLIBS@ @LIBSUPPORT@
 | 
			
		||||
third_linux_LDFLAGS	= -static
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										468
									
								
								examples/first.c
									
									
									
									
									
								
							
							
						
						
									
										468
									
								
								examples/first.c
									
									
									
									
									
								
							@@ -19,110 +19,145 @@
 | 
			
		||||
   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
 | 
			
		||||
   Boston, MA 02111-1307, USA.  */
 | 
			
		||||
 | 
			
		||||
#include <locale.h>
 | 
			
		||||
 | 
			
		||||
#include <glibtop.h>
 | 
			
		||||
#include <glibtop/open.h>
 | 
			
		||||
#include <glibtop/close.h>
 | 
			
		||||
#include <glibtop/xmalloc.h>
 | 
			
		||||
 | 
			
		||||
#include <glibtop/parameter.h>
 | 
			
		||||
 | 
			
		||||
#include <glibtop/union.h>
 | 
			
		||||
#include <glibtop/sysdeps.h>
 | 
			
		||||
 | 
			
		||||
#ifndef PROFILE_COUNT
 | 
			
		||||
#define PROFILE_COUNT	1
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
int
 | 
			
		||||
main (int argc, char *argv [])
 | 
			
		||||
{
 | 
			
		||||
	glibtop_union data;
 | 
			
		||||
	glibtop_sysdeps sysdeps;
 | 
			
		||||
	unsigned i, *ptr;
 | 
			
		||||
	unsigned c, method, count, port, i, *ptr;
 | 
			
		||||
	char buffer [BUFSIZ];
 | 
			
		||||
	pid_t pid, ppid;
 | 
			
		||||
 | 
			
		||||
	count = PROFILE_COUNT;
 | 
			
		||||
 | 
			
		||||
	setlocale (LC_ALL, "");
 | 
			
		||||
	bindtextdomain (PACKAGE, GTOPLOCALEDIR);
 | 
			
		||||
	textdomain (PACKAGE);
 | 
			
		||||
	
 | 
			
		||||
	glibtop_init__r (&glibtop_global_server);
 | 
			
		||||
	glibtop_init_r (&glibtop_global_server, 0, GLIBTOP_INIT_NO_OPEN);
 | 
			
		||||
 | 
			
		||||
	glibtop_get_cpu (&data.cpu);
 | 
			
		||||
	glibtop_get_parameter (GLIBTOP_PARAM_METHOD, &method, sizeof (method));
 | 
			
		||||
 | 
			
		||||
	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 ("Method = %d\n", method);
 | 
			
		||||
 | 
			
		||||
	glibtop_get_mem (&data.mem);
 | 
			
		||||
	count = glibtop_get_parameter (GLIBTOP_PARAM_COMMAND, buffer, BUFSIZ);
 | 
			
		||||
	buffer [count] = 0;
 | 
			
		||||
 | 
			
		||||
	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 ("Command = '%s'\n", buffer);
 | 
			
		||||
 | 
			
		||||
	glibtop_get_swap (&data.swap);
 | 
			
		||||
	count = glibtop_get_parameter (GLIBTOP_PARAM_HOST, buffer, BUFSIZ);
 | 
			
		||||
	buffer [count] = 0;
 | 
			
		||||
 | 
			
		||||
	fprintf (stderr, "Swap         (0x%08lx): %lu, %lu, %lu\n", data.swap.flags,
 | 
			
		||||
		 data.swap.total, data.swap.used, data.swap.free);
 | 
			
		||||
	glibtop_get_parameter (GLIBTOP_PARAM_PORT, &port, sizeof (port));
 | 
			
		||||
 | 
			
		||||
	glibtop_get_uptime (&data.uptime);
 | 
			
		||||
	printf ("Host = '%s' - %u\n\n", buffer, port);
 | 
			
		||||
 | 
			
		||||
	fprintf (stderr, "Uptime       (0x%08lx): %f, %f\n", data.uptime.flags,
 | 
			
		||||
		 data.uptime.uptime, data.uptime.idletime);
 | 
			
		||||
	for (c = 0; c < PROFILE_COUNT; c++)
 | 
			
		||||
	  	glibtop_get_cpu (&data.cpu);
 | 
			
		||||
 | 
			
		||||
	glibtop_get_loadavg (&data.loadavg);
 | 
			
		||||
	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);
 | 
			
		||||
 | 
			
		||||
	fprintf (stderr, "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 < PROFILE_COUNT; c++)
 | 
			
		||||
		glibtop_get_mem (&data.mem);
 | 
			
		||||
 | 
			
		||||
	glibtop_get_shm_limits (&data.shm_limits);
 | 
			
		||||
	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 < PROFILE_COUNT; c++)
 | 
			
		||||
		glibtop_get_swap (&data.swap);
 | 
			
		||||
 | 
			
		||||
	printf ("Swap         (0x%08lx): %lu, %lu, %lu\n", data.swap.flags,
 | 
			
		||||
		data.swap.total, data.swap.used, data.swap.free);
 | 
			
		||||
 | 
			
		||||
	for (c = 0; c < PROFILE_COUNT; c++)
 | 
			
		||||
		glibtop_get_uptime (&data.uptime);
 | 
			
		||||
 | 
			
		||||
	printf ("Uptime       (0x%08lx): %f, %f\n", data.uptime.flags,
 | 
			
		||||
		data.uptime.uptime, data.uptime.idletime);
 | 
			
		||||
 | 
			
		||||
	for (c = 0; c < PROFILE_COUNT; c++)
 | 
			
		||||
		glibtop_get_loadavg (&data.loadavg);
 | 
			
		||||
 | 
			
		||||
	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 < PROFILE_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);
 | 
			
		||||
 | 
			
		||||
	glibtop_get_msg_limits (&data.msg_limits);
 | 
			
		||||
	for (c = 0; c < PROFILE_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);
 | 
			
		||||
 | 
			
		||||
	glibtop_get_sem_limits (&data.sem_limits);
 | 
			
		||||
	for (c = 0; c < PROFILE_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);
 | 
			
		||||
@@ -130,197 +165,220 @@ main (int argc, char *argv [])
 | 
			
		||||
	pid = getpid ();
 | 
			
		||||
	ppid = getppid ();
 | 
			
		||||
 | 
			
		||||
	fprintf (stderr, "\n");
 | 
			
		||||
	printf ("\n");
 | 
			
		||||
 | 
			
		||||
	glibtop_get_proc_state (&data.proc_state, pid);
 | 
			
		||||
	for (c = 0; c < PROFILE_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);
 | 
			
		||||
 | 
			
		||||
	glibtop_get_proc_uid (&data.proc_uid, pid);
 | 
			
		||||
	for (c = 0; c < PROFILE_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);
 | 
			
		||||
 | 
			
		||||
	glibtop_get_proc_mem (&data.proc_mem, pid);
 | 
			
		||||
	for (c = 0; c < PROFILE_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);
 | 
			
		||||
 | 
			
		||||
	glibtop_get_proc_time (&data.proc_time, pid);
 | 
			
		||||
	for (c = 0; c < PROFILE_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);
 | 
			
		||||
 | 
			
		||||
	glibtop_get_proc_signal (&data.proc_signal, pid);
 | 
			
		||||
	for (c = 0; c < PROFILE_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);
 | 
			
		||||
 | 
			
		||||
	glibtop_get_proc_kernel (&data.proc_kernel, pid);
 | 
			
		||||
	for (c = 0; c < PROFILE_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);
 | 
			
		||||
 | 
			
		||||
	glibtop_get_proc_segment (&data.proc_segment, pid);
 | 
			
		||||
	for (c = 0; c < PROFILE_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");
 | 
			
		||||
 | 
			
		||||
	glibtop_get_proc_state (&data.proc_state, ppid);
 | 
			
		||||
	for (c = 0; c < PROFILE_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);
 | 
			
		||||
 | 
			
		||||
	glibtop_get_proc_uid (&data.proc_uid, ppid);
 | 
			
		||||
	for (c = 0; c < PROFILE_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);
 | 
			
		||||
 | 
			
		||||
	glibtop_get_proc_mem (&data.proc_mem, ppid);
 | 
			
		||||
	for (c = 0; c < PROFILE_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);
 | 
			
		||||
 | 
			
		||||
	glibtop_get_proc_time (&data.proc_time, ppid);
 | 
			
		||||
	for (c = 0; c < PROFILE_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);
 | 
			
		||||
 | 
			
		||||
	glibtop_get_proc_signal (&data.proc_signal, ppid);
 | 
			
		||||
	for (c = 0; c < PROFILE_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);
 | 
			
		||||
 | 
			
		||||
	glibtop_get_proc_kernel (&data.proc_kernel, ppid);
 | 
			
		||||
	for (c = 0; c < PROFILE_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);
 | 
			
		||||
 | 
			
		||||
	glibtop_get_proc_segment (&data.proc_segment, ppid);
 | 
			
		||||
	for (c = 0; c < PROFILE_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");
 | 
			
		||||
 | 
			
		||||
	glibtop_get_proc_state (&data.proc_state, 1);
 | 
			
		||||
	for (c = 0; c < PROFILE_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);
 | 
			
		||||
 | 
			
		||||
	glibtop_get_proc_uid (&data.proc_uid, 1);
 | 
			
		||||
	for (c = 0; c < PROFILE_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);
 | 
			
		||||
 | 
			
		||||
	glibtop_get_proc_mem (&data.proc_mem, 1);
 | 
			
		||||
	for (c = 0; c < PROFILE_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);
 | 
			
		||||
 | 
			
		||||
	glibtop_get_proc_time (&data.proc_time, 1);
 | 
			
		||||
	for (c = 0; c < PROFILE_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);
 | 
			
		||||
 | 
			
		||||
	glibtop_get_proc_signal (&data.proc_signal, 1);
 | 
			
		||||
	for (c = 0; c < PROFILE_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);
 | 
			
		||||
 | 
			
		||||
	glibtop_get_proc_kernel (&data.proc_kernel, 1);
 | 
			
		||||
	for (c = 0; c < PROFILE_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);
 | 
			
		||||
 | 
			
		||||
	glibtop_get_proc_segment (&data.proc_segment, 1);
 | 
			
		||||
	for (c = 0; c < PROFILE_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);
 | 
			
		||||
 | 
			
		||||
	glibtop_close ();
 | 
			
		||||
 | 
			
		||||
	exit (0);
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -19,6 +19,8 @@
 | 
			
		||||
   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
 | 
			
		||||
   Boston, MA 02111-1307, USA.  */
 | 
			
		||||
 | 
			
		||||
#include <locale.h>
 | 
			
		||||
 | 
			
		||||
#include <glibtop.h>
 | 
			
		||||
#include <glibtop/open.h>
 | 
			
		||||
#include <glibtop/close.h>
 | 
			
		||||
@@ -39,7 +41,7 @@ main (int argc, char *argv [])
 | 
			
		||||
	bindtextdomain (PACKAGE, GTOPLOCALEDIR);
 | 
			
		||||
	textdomain (PACKAGE);
 | 
			
		||||
	
 | 
			
		||||
	glibtop_init__r (&glibtop_global_server);
 | 
			
		||||
	glibtop_init ();
 | 
			
		||||
 | 
			
		||||
	glibtop_get_sysdeps (&sysdeps);
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										80
									
								
								examples/test.scm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										80
									
								
								examples/test.scm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,80 @@
 | 
			
		||||
(display (glibtop-names-sysdeps)) (newline)
 | 
			
		||||
(display (glibtop-labels-sysdeps)) (newline)
 | 
			
		||||
(display (glibtop-descriptions-sysdeps)) (newline)
 | 
			
		||||
(display (glibtop-types-sysdeps)) (newline)
 | 
			
		||||
 | 
			
		||||
(newline)
 | 
			
		||||
 | 
			
		||||
(display (glibtop-names-cpu)) (newline)
 | 
			
		||||
(display (glibtop-names-mem)) (newline)
 | 
			
		||||
(display (glibtop-names-swap)) (newline)
 | 
			
		||||
(display (glibtop-names-uptime)) (newline)
 | 
			
		||||
(display (glibtop-names-loadavg)) (newline)
 | 
			
		||||
(display (glibtop-names-shm_limits)) (newline)
 | 
			
		||||
(display (glibtop-names-msg_limits)) (newline)
 | 
			
		||||
(display (glibtop-names-sem_limits)) (newline)
 | 
			
		||||
(display (glibtop-names-proclist)) (newline)
 | 
			
		||||
(display (glibtop-names-proc_state)) (newline)
 | 
			
		||||
(display (glibtop-names-proc_uid)) (newline)
 | 
			
		||||
(display (glibtop-names-proc_mem)) (newline)
 | 
			
		||||
(display (glibtop-names-proc_time)) (newline)
 | 
			
		||||
(display (glibtop-names-proc_signal)) (newline)
 | 
			
		||||
(display (glibtop-names-proc_kernel)) (newline)
 | 
			
		||||
(display (glibtop-names-proc_segment)) (newline)
 | 
			
		||||
 | 
			
		||||
(newline)
 | 
			
		||||
 | 
			
		||||
(display (glibtop-labels-cpu)) (newline)
 | 
			
		||||
(display (glibtop-labels-mem)) (newline)
 | 
			
		||||
(display (glibtop-labels-swap)) (newline)
 | 
			
		||||
(display (glibtop-labels-uptime)) (newline)
 | 
			
		||||
(display (glibtop-labels-loadavg)) (newline)
 | 
			
		||||
(display (glibtop-labels-shm_limits)) (newline)
 | 
			
		||||
(display (glibtop-labels-msg_limits)) (newline)
 | 
			
		||||
(display (glibtop-labels-sem_limits)) (newline)
 | 
			
		||||
(display (glibtop-labels-proclist)) (newline)
 | 
			
		||||
(display (glibtop-labels-proc_state)) (newline)
 | 
			
		||||
(display (glibtop-labels-proc_uid)) (newline)
 | 
			
		||||
(display (glibtop-labels-proc_mem)) (newline)
 | 
			
		||||
(display (glibtop-labels-proc_time)) (newline)
 | 
			
		||||
(display (glibtop-labels-proc_signal)) (newline)
 | 
			
		||||
(display (glibtop-labels-proc_kernel)) (newline)
 | 
			
		||||
(display (glibtop-labels-proc_segment)) (newline)
 | 
			
		||||
 | 
			
		||||
(newline)
 | 
			
		||||
 | 
			
		||||
(display (glibtop-descriptions-cpu)) (newline)
 | 
			
		||||
(display (glibtop-descriptions-mem)) (newline)
 | 
			
		||||
(display (glibtop-descriptions-swap)) (newline)
 | 
			
		||||
(display (glibtop-descriptions-uptime)) (newline)
 | 
			
		||||
(display (glibtop-descriptions-loadavg)) (newline)
 | 
			
		||||
(display (glibtop-descriptions-shm_limits)) (newline)
 | 
			
		||||
(display (glibtop-descriptions-msg_limits)) (newline)
 | 
			
		||||
(display (glibtop-descriptions-sem_limits)) (newline)
 | 
			
		||||
(display (glibtop-descriptions-proclist)) (newline)
 | 
			
		||||
(display (glibtop-descriptions-proc_state)) (newline)
 | 
			
		||||
(display (glibtop-descriptions-proc_uid)) (newline)
 | 
			
		||||
(display (glibtop-descriptions-proc_mem)) (newline)
 | 
			
		||||
(display (glibtop-descriptions-proc_time)) (newline)
 | 
			
		||||
(display (glibtop-descriptions-proc_signal)) (newline)
 | 
			
		||||
(display (glibtop-descriptions-proc_kernel)) (newline)
 | 
			
		||||
(display (glibtop-descriptions-proc_segment)) (newline)
 | 
			
		||||
 | 
			
		||||
(newline)
 | 
			
		||||
 | 
			
		||||
(display (glibtop-types-cpu)) (newline)
 | 
			
		||||
(display (glibtop-types-mem)) (newline)
 | 
			
		||||
(display (glibtop-types-swap)) (newline)
 | 
			
		||||
(display (glibtop-types-uptime)) (newline)
 | 
			
		||||
(display (glibtop-types-loadavg)) (newline)
 | 
			
		||||
(display (glibtop-types-shm_limits)) (newline)
 | 
			
		||||
(display (glibtop-types-msg_limits)) (newline)
 | 
			
		||||
(display (glibtop-types-sem_limits)) (newline)
 | 
			
		||||
(display (glibtop-types-proclist)) (newline)
 | 
			
		||||
(display (glibtop-types-proc_state)) (newline)
 | 
			
		||||
(display (glibtop-types-proc_uid)) (newline)
 | 
			
		||||
(display (glibtop-types-proc_mem)) (newline)
 | 
			
		||||
(display (glibtop-types-proc_time)) (newline)
 | 
			
		||||
(display (glibtop-types-proc_signal)) (newline)
 | 
			
		||||
(display (glibtop-types-proc_kernel)) (newline)
 | 
			
		||||
(display (glibtop-types-proc_segment)) (newline)
 | 
			
		||||
@@ -19,6 +19,8 @@
 | 
			
		||||
   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
 | 
			
		||||
   Boston, MA 02111-1307, USA.  */
 | 
			
		||||
 | 
			
		||||
#include <locale.h>
 | 
			
		||||
 | 
			
		||||
#include <glibtop.h>
 | 
			
		||||
     
 | 
			
		||||
#include <glibtop/open.h>
 | 
			
		||||
 
 | 
			
		||||
@@ -1,10 +0,0 @@
 | 
			
		||||
(display (get-cpu)) (newline)
 | 
			
		||||
(display (get-mem)) (newline)
 | 
			
		||||
(display (get-swap)) (newline)
 | 
			
		||||
(display (get-uptime)) (newline)
 | 
			
		||||
(display (get-loadavg)) (newline)
 | 
			
		||||
(display (get-shm_limits)) (newline)
 | 
			
		||||
(display (get-msg_limits)) (newline)
 | 
			
		||||
(display (get-sem_limits)) (newline)
 | 
			
		||||
(display (get-sysdeps)) (newline)
 | 
			
		||||
(display (get-proclist)) (newline)
 | 
			
		||||
							
								
								
									
										16
									
								
								features.def
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								features.def
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,16 @@
 | 
			
		||||
cpu		ulong(total,user,nice,sys,idle,frequency)
 | 
			
		||||
mem		ulong(total,used,free,shared,buffer,cached,user,locked)
 | 
			
		||||
swap		ulong(total,used,free)
 | 
			
		||||
uptime		double(uptime,idletime)
 | 
			
		||||
loadavg		double(loadavg[0],loadavg[1],loadavg[2])
 | 
			
		||||
shm_limits	ulong(shmmax,shmmin,shmmni,shmseg,shmall)
 | 
			
		||||
msg_limits	ulong(msgpool,msgmap,msgmax,msgmnb,msgmni,msgssz,msgtql)
 | 
			
		||||
sem_limits	ulong(semmap,semmni,semmns,semmnu,semmsl,semopm,semume,semusz,semvmx,semaem)
 | 
			
		||||
proclist	ulong(number,size,total)
 | 
			
		||||
proc_state	str(cmd):char(state):ulong(uid,gid)
 | 
			
		||||
proc_uid	long(uid,euid,gid,egid,pid,ppid,pgrp,session,tty,tpgid,priority,nice)
 | 
			
		||||
proc_mem	long(size,vsize,resident,share,rss,rss_rlim)
 | 
			
		||||
proc_time	long(start_time,utime,stime,cutime,cstime,timeout,it_real_value)
 | 
			
		||||
proc_signal	long(signal,blocked,sigignore,sigcatch)
 | 
			
		||||
proc_kernel	ulong(k_flags,min_flt,maj_flt,cmin_flt,cmaj_flt,kstk_esp,kstk_eip,wchan)
 | 
			
		||||
proc_segment	long(trs,lrs,drs,dt):ulong(start_code,end_code,start_stack)
 | 
			
		||||
							
								
								
									
										21
									
								
								glibtop.h
									
									
									
									
									
								
							
							
						
						
									
										21
									
								
								glibtop.h
									
									
									
									
									
								
							@@ -24,6 +24,9 @@
 | 
			
		||||
 | 
			
		||||
#include <glibtop/global.h>
 | 
			
		||||
 | 
			
		||||
#include <glibtop_server.h>
 | 
			
		||||
#include <glibtop/types.h>
 | 
			
		||||
 | 
			
		||||
#ifdef HAVE_GLIBTOP_MACHINE_H
 | 
			
		||||
#include <glibtop_machine.h>
 | 
			
		||||
#endif
 | 
			
		||||
@@ -32,22 +35,34 @@ 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 */
 | 
			
		||||
	const char *server_host;	/* Host the server should run on */
 | 
			
		||||
	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 */
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
extern glibtop *glibtop_global_server;
 | 
			
		||||
 | 
			
		||||
#define glibtop_init()	glibtop_init__r(&glibtop_global_server);
 | 
			
		||||
extern const unsigned long glibtop_server_features;
 | 
			
		||||
 | 
			
		||||
extern glibtop *glibtop_init__r __P((glibtop **));
 | 
			
		||||
#define glibtop_init()	glibtop_init_r(&glibtop_global_server, 0, 0);
 | 
			
		||||
 | 
			
		||||
#define glibtop_close()	glibtop_close_r(glibtop_global_server);
 | 
			
		||||
 | 
			
		||||
extern glibtop *glibtop_init_r __P((glibtop **, const unsigned long, const unsigned));
 | 
			
		||||
 | 
			
		||||
#ifdef HAVE_GUILE
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -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
 | 
			
		||||
 
 | 
			
		||||
@@ -26,7 +26,7 @@
 | 
			
		||||
 | 
			
		||||
__BEGIN_DECLS
 | 
			
		||||
 | 
			
		||||
extern void glibtop_close __P((glibtop *));
 | 
			
		||||
extern void glibtop_close_r __P((glibtop *));
 | 
			
		||||
 | 
			
		||||
__END_DECLS
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -29,6 +29,7 @@ __BEGIN_DECLS
 | 
			
		||||
 | 
			
		||||
#define GLIBTOP_CMND_QUIT		0
 | 
			
		||||
#define GLIBTOP_CMND_SYSDEPS		1
 | 
			
		||||
 | 
			
		||||
#define GLIBTOP_CMND_CPU		2
 | 
			
		||||
#define GLIBTOP_CMND_MEM		3
 | 
			
		||||
#define GLIBTOP_CMND_SWAP		4
 | 
			
		||||
@@ -49,18 +50,38 @@ __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;
 | 
			
		||||
typedef union  _glibtop_response_union	glibtop_response_union;
 | 
			
		||||
 | 
			
		||||
struct _glibtop_command
 | 
			
		||||
{
 | 
			
		||||
  glibtop	server;
 | 
			
		||||
  unsigned	command;
 | 
			
		||||
  size_t	size;
 | 
			
		||||
	glibtop		server;
 | 
			
		||||
	unsigned	command;
 | 
			
		||||
	size_t		size, data_size;
 | 
			
		||||
	char		parameter [_GLIBTOP_PARAM_SIZE];
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#define glibtop_call(p1, p2, p3, p4)	glibtop_call__r(glibtop_global_server, p1, p2, p3, p4)
 | 
			
		||||
union _glibtop_response_union
 | 
			
		||||
{
 | 
			
		||||
	glibtop_union	data;
 | 
			
		||||
	glibtop_sysdeps	sysdeps;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
extern void *glibtop_call__r __P((glibtop *, unsigned, size_t, void *, size_t, void *));
 | 
			
		||||
struct _glibtop_response
 | 
			
		||||
{
 | 
			
		||||
	off_t offset;
 | 
			
		||||
	size_t size, data_size;
 | 
			
		||||
	glibtop_response_union u;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#define glibtop_call(p1, p2, p3, p4)	glibtop_call_r(glibtop_global_server, p1, p2, p3, p4)
 | 
			
		||||
 | 
			
		||||
extern void *glibtop_call_l __P((glibtop *, unsigned, size_t, void *, size_t, void *));
 | 
			
		||||
extern void *glibtop_call_s __P((glibtop *, unsigned, size_t, void *, size_t, void *));
 | 
			
		||||
 | 
			
		||||
__END_DECLS
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -49,9 +49,21 @@ struct _glibtop_cpu
 | 
			
		||||
		frequency;	/* GLIBTOP_CPU_FREQUENCY	*/
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#define glibtop_get_cpu(cpu)	glibtop_get_cpu__r(glibtop_global_server, cpu)
 | 
			
		||||
#define glibtop_get_cpu(cpu)	glibtop_get_cpu_l(glibtop_global_server, cpu)
 | 
			
		||||
 | 
			
		||||
extern void glibtop_get_cpu__r __P((glibtop *, glibtop_cpu *));
 | 
			
		||||
#if GLIBTOP_SUID_CPU
 | 
			
		||||
#define glibtop_get_cpu_r	glibtop_get_cpu_p
 | 
			
		||||
#else
 | 
			
		||||
#define glibtop_get_cpu_r	glibtop_get_cpu_s
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
extern void glibtop_get_cpu_l __P((glibtop *, glibtop_cpu *));
 | 
			
		||||
 | 
			
		||||
#if GLIBTOP_SUID_CPU
 | 
			
		||||
extern void glibtop_get_cpu_p __P((glibtop *, glibtop_cpu *));
 | 
			
		||||
#else
 | 
			
		||||
extern void glibtop_get_cpu_s __P((glibtop *, glibtop_cpu *));
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef HAVE_GUILE
 | 
			
		||||
 | 
			
		||||
@@ -77,7 +89,7 @@ extern SCM glibtop_guile_descriptions_cpu __P((void));
 | 
			
		||||
/* You need to link with -lgtop_names to get this stuff here. */
 | 
			
		||||
 | 
			
		||||
extern const char *glibtop_names_cpu [];
 | 
			
		||||
extern const char *glibtop_types_cpu [];
 | 
			
		||||
extern const unsigned glibtop_types_cpu [];
 | 
			
		||||
extern const char *glibtop_labels_cpu [];
 | 
			
		||||
extern const char *glibtop_descriptions_cpu [];
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -26,9 +26,17 @@
 | 
			
		||||
 | 
			
		||||
__BEGIN_DECLS
 | 
			
		||||
 | 
			
		||||
#define glibtop_error(p1, args...)	glibtop_error__r(glibtop_global_server , p1 , ## args)
 | 
			
		||||
#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)
 | 
			
		||||
 | 
			
		||||
extern void glibtop_error__r __P((glibtop *, char *, ...));
 | 
			
		||||
#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
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -51,21 +51,42 @@
 | 
			
		||||
# 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
 | 
			
		||||
 | 
			
		||||
#ifdef _IN_LIBGTOP
 | 
			
		||||
#if (defined HAVE_LIBINTL_H) || (defined HAVE_GETTEXT)
 | 
			
		||||
#include <libintl.h>
 | 
			
		||||
#else
 | 
			
		||||
#include <libgettext.h>
 | 
			
		||||
#endif
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
 | 
			
		||||
#include <stdarg.h>
 | 
			
		||||
 | 
			
		||||
#ifdef HAVE_UNISTD_H
 | 
			
		||||
#include <unistd.h>
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef HAVE_MEMORY_H
 | 
			
		||||
#include <memory.h>
 | 
			
		||||
@@ -73,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>
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										158
									
								
								include/glibtop/gnuserv.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										158
									
								
								include/glibtop/gnuserv.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,158 @@
 | 
			
		||||
/* -*-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 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(UNIX_DOMAIN_SOCKETS) && !defined(INTERNET_DOMAIN_SOCKETS)
 | 
			
		||||
 | 
			
		||||
/* BSD systems use Unix Domain sockets by default */
 | 
			
		||||
 | 
			
		||||
#ifdef BSD
 | 
			
		||||
#define UNIX_DOMAIN_SOCKETS
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#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. 
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#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
 | 
			
		||||
 | 
			
		||||
/* 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 INTERNET_DOMAIN_SOCKETS
 | 
			
		||||
extern long glibtop_internet_addr __P((const char *));
 | 
			
		||||
#endif
 | 
			
		||||
@@ -39,9 +39,21 @@ struct _glibtop_loadavg
 | 
			
		||||
	double loadavg [3];		/* GLIBTOP_LOADAVG_LOADAVG	*/
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#define glibtop_get_loadavg(loadavg)	glibtop_get_loadavg__r(glibtop_global_server, loadavg)
 | 
			
		||||
#define glibtop_get_loadavg(loadavg)	glibtop_get_loadavg_l(glibtop_global_server, loadavg)
 | 
			
		||||
 | 
			
		||||
extern void glibtop_get_loadavg__r __P((glibtop *, glibtop_loadavg *));
 | 
			
		||||
#if GLIBTOP_SUID_LOADAVG
 | 
			
		||||
#define glibtop_get_loadavg_r		glibtop_get_loadavg_p
 | 
			
		||||
#else
 | 
			
		||||
#define glibtop_get_loadavg_r		glibtop_get_loadavg_s
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
extern void glibtop_get_loadavg_l __P((glibtop *, glibtop_loadavg *));
 | 
			
		||||
 | 
			
		||||
#if GLIBTOP_SUID_LOADAVG
 | 
			
		||||
extern void glibtop_get_loadavg_p __P((glibtop *, glibtop_loadavg *));
 | 
			
		||||
#else
 | 
			
		||||
extern void glibtop_get_loadavg_s __P((glibtop *, glibtop_loadavg *));
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef HAVE_GUILE
 | 
			
		||||
 | 
			
		||||
@@ -67,7 +79,7 @@ extern SCM glibtop_guile_descriptions_loadavg __P((void));
 | 
			
		||||
/* You need to link with -lgtop_names to get this stuff here. */
 | 
			
		||||
 | 
			
		||||
extern const char *glibtop_names_loadavg [];
 | 
			
		||||
extern const char *glibtop_types_loadavg [];
 | 
			
		||||
extern const unsigned glibtop_types_loadavg [];
 | 
			
		||||
extern const char *glibtop_labels_loadavg [];
 | 
			
		||||
extern const char *glibtop_descriptions_loadavg [];
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -53,9 +53,21 @@ struct _glibtop_mem
 | 
			
		||||
		locked;		/* GLIBTOP_MEM_LOCKED	*/
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#define glibtop_get_mem(mem)	glibtop_get_mem__r(glibtop_global_server, mem)
 | 
			
		||||
#define glibtop_get_mem(mem)	glibtop_get_mem_l(glibtop_global_server, mem)
 | 
			
		||||
 | 
			
		||||
extern void glibtop_get_mem__r __P((glibtop *, glibtop_mem *));
 | 
			
		||||
#if GLIBTOP_SUID_MEM
 | 
			
		||||
#define glibtop_get_mem_r		glibtop_get_mem_p
 | 
			
		||||
#else
 | 
			
		||||
#define glibtop_get_mem_r		glibtop_get_mem_s
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
extern void glibtop_get_mem_l __P((glibtop *, glibtop_mem *));
 | 
			
		||||
 | 
			
		||||
#if GLIBTOP_SUID_MEM
 | 
			
		||||
extern void glibtop_get_mem_p __P((glibtop *, glibtop_mem *));
 | 
			
		||||
#else
 | 
			
		||||
extern void glibtop_get_mem_s __P((glibtop *, glibtop_mem *));
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef HAVE_GUILE
 | 
			
		||||
 | 
			
		||||
@@ -81,7 +93,7 @@ extern SCM glibtop_guile_descriptions_mem __P((void));
 | 
			
		||||
/* You need to link with -lgtop_names to get this stuff here. */
 | 
			
		||||
 | 
			
		||||
extern const char *glibtop_names_mem [];
 | 
			
		||||
extern const char *glibtop_types_mem [];
 | 
			
		||||
extern const unsigned glibtop_types_mem [];
 | 
			
		||||
extern const char *glibtop_labels_mem [];
 | 
			
		||||
extern const char *glibtop_descriptions_mem [];
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -51,9 +51,21 @@ struct _glibtop_msg_limits
 | 
			
		||||
		msgtql;		/* GLIBTOP_IPC_MSGTQL	*/
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#define glibtop_get_msg_limits(msg)	glibtop_get_msg_limits__r(glibtop_global_server, msg)
 | 
			
		||||
#define glibtop_get_msg_limits(msg)	glibtop_get_msg_limits_l(glibtop_global_server, msg)
 | 
			
		||||
 | 
			
		||||
extern void glibtop_get_msg_limits__r __P((glibtop *, glibtop_msg_limits *));
 | 
			
		||||
#if GLIBTOP_SUID_MSG_LIMITS
 | 
			
		||||
#define glibtop_get_msg_limits_r	glibtop_get_msg_limits_p
 | 
			
		||||
#else
 | 
			
		||||
#define glibtop_get_msg_limits_r	glibtop_get_msg_limits_s
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
extern void glibtop_get_msg_limits_l __P((glibtop *, glibtop_msg_limits *));
 | 
			
		||||
 | 
			
		||||
#if GLIBTOP_SUID_MSG_LIMITS
 | 
			
		||||
extern void glibtop_get_msg_limits_p __P((glibtop *, glibtop_msg_limits *));
 | 
			
		||||
#else
 | 
			
		||||
extern void glibtop_get_msg_limits_s __P((glibtop *, glibtop_msg_limits *));
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef HAVE_GUILE
 | 
			
		||||
 | 
			
		||||
@@ -79,7 +91,7 @@ extern SCM glibtop_guile_descriptions_msg_limits __P((void));
 | 
			
		||||
/* You need to link with -lgtop_names to get this stuff here. */
 | 
			
		||||
 | 
			
		||||
extern const char *glibtop_names_msg_limits [];
 | 
			
		||||
extern const char *glibtop_types_msg_limits [];
 | 
			
		||||
extern const unsigned glibtop_types_msg_limits [];
 | 
			
		||||
extern const char *glibtop_labels_msg_limits [];
 | 
			
		||||
extern const char *glibtop_descriptions_msg_limits [];
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -26,7 +26,23 @@
 | 
			
		||||
 | 
			
		||||
__BEGIN_DECLS
 | 
			
		||||
 | 
			
		||||
extern void glibtop_open __P((glibtop *, const char *));
 | 
			
		||||
#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
 | 
			
		||||
#define GLIBTOP_METHOD_UNIX		4
 | 
			
		||||
 | 
			
		||||
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));
 | 
			
		||||
 | 
			
		||||
__END_DECLS
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,3 @@
 | 
			
		||||
/* $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.
 | 
			
		||||
@@ -19,34 +17,26 @@
 | 
			
		||||
   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/xmalloc.h>
 | 
			
		||||
#include <glibtop/proclist.h>
 | 
			
		||||
#include <glibtop/open.h>
 | 
			
		||||
 | 
			
		||||
#include <guile/gh.h>
 | 
			
		||||
__BEGIN_DECLS
 | 
			
		||||
 | 
			
		||||
SCM
 | 
			
		||||
glibtop_guile_get_proclist (void)
 | 
			
		||||
{
 | 
			
		||||
	glibtop_proclist proclist;
 | 
			
		||||
	unsigned *ptr;
 | 
			
		||||
	unsigned i;
 | 
			
		||||
	SCM list;
 | 
			
		||||
#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
 | 
			
		||||
 | 
			
		||||
	ptr = glibtop_get_proclist (&proclist);
 | 
			
		||||
#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)
 | 
			
		||||
 | 
			
		||||
	list = gh_list (gh_ulong2scm (proclist.flags),
 | 
			
		||||
			gh_ulong2scm (proclist.number),
 | 
			
		||||
			gh_ulong2scm (proclist.size),
 | 
			
		||||
			gh_ulong2scm (proclist.total),
 | 
			
		||||
			SCM_UNDEFINED);
 | 
			
		||||
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));
 | 
			
		||||
 | 
			
		||||
	if (ptr) {
 | 
			
		||||
		for (i = 0; i < proclist.number; i++)
 | 
			
		||||
			list = gh_append2 (list, gh_list (gh_ulong2scm ((unsigned long) ptr [i]), SCM_UNDEFINED));
 | 
			
		||||
	}
 | 
			
		||||
__END_DECLS
 | 
			
		||||
 | 
			
		||||
	glibtop_free (ptr);
 | 
			
		||||
 | 
			
		||||
	return list;
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
@@ -60,9 +60,21 @@ struct _glibtop_proc_kernel
 | 
			
		||||
				 * proc is sleeping in */
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#define glibtop_get_proc_kernel(p1, p2)	glibtop_get_proc_kernel__r(glibtop_global_server, p1, p2)
 | 
			
		||||
#define glibtop_get_proc_kernel(p1, p2)	glibtop_get_proc_kernel_l(glibtop_global_server, p1, p2)
 | 
			
		||||
 | 
			
		||||
extern void glibtop_get_proc_kernel__r __P((glibtop *, glibtop_proc_kernel *, pid_t));
 | 
			
		||||
#if GLIBTOP_SUID_PROC_KERNEL
 | 
			
		||||
#define glibtop_get_proc_kernel_r	glibtop_get_proc_kernel_p
 | 
			
		||||
#else
 | 
			
		||||
#define glibtop_get_proc_kernel_r	glibtop_get_proc_kernel_s
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
extern void glibtop_get_proc_kernel_l __P((glibtop *, glibtop_proc_kernel *, pid_t));
 | 
			
		||||
 | 
			
		||||
#if GLIBTOP_SUID_PROC_KERNEL
 | 
			
		||||
extern void glibtop_get_proc_kernel_p __P((glibtop *, glibtop_proc_kernel *, pid_t));
 | 
			
		||||
#else
 | 
			
		||||
extern void glibtop_get_proc_kernel_s __P((glibtop *, glibtop_proc_kernel *, pid_t));
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef HAVE_GUILE
 | 
			
		||||
 | 
			
		||||
@@ -87,8 +99,8 @@ extern SCM glibtop_guile_descriptions_proc_kernel __P((void));
 | 
			
		||||
 | 
			
		||||
/* You need to link with -lgtop_names to get this stuff here. */
 | 
			
		||||
 | 
			
		||||
extern const char *glibtop_types_proc_kernel [];
 | 
			
		||||
extern const char *glibtop_names_proc_kernel [];
 | 
			
		||||
extern const unsigned glibtop_types_proc_kernel [];
 | 
			
		||||
extern const char *glibtop_labels_proc_kernel [];
 | 
			
		||||
extern const char *glibtop_descriptions_proc_kernel [];
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -43,9 +43,21 @@ struct _glibtop_proclist
 | 
			
		||||
		size;			/* GLIBTOP_PROCLIST_SIZE	*/
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#define glibtop_get_proclist(proclist)	glibtop_get_proclist__r(glibtop_global_server, proclist)
 | 
			
		||||
#define glibtop_get_proclist(proclist)	glibtop_get_proclist_l(glibtop_global_server, proclist)
 | 
			
		||||
 | 
			
		||||
extern unsigned *glibtop_get_proclist__r __P((glibtop *, glibtop_proclist *));
 | 
			
		||||
#if GLIBTOP_SUID_PROCLIST
 | 
			
		||||
#define glibtop_get_proclist_r		glibtop_get_proclist_p
 | 
			
		||||
#else
 | 
			
		||||
#define glibtop_get_proclist_r		glibtop_get_proclist_s
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
extern unsigned *glibtop_get_proclist_l __P((glibtop *, glibtop_proclist *));
 | 
			
		||||
 | 
			
		||||
#if GLIBTOP_SUID_PROCLIST
 | 
			
		||||
extern unsigned *glibtop_get_proclist_p __P((glibtop *, glibtop_proclist *));
 | 
			
		||||
#else
 | 
			
		||||
extern unsigned *glibtop_get_proclist_s __P((glibtop *, glibtop_proclist *));
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef HAVE_GUILE
 | 
			
		||||
 | 
			
		||||
@@ -71,7 +83,7 @@ extern SCM glibtop_guile_descriptions_proclist __P((void));
 | 
			
		||||
/* You need to link with -lgtop_names to get this stuff here. */
 | 
			
		||||
 | 
			
		||||
extern const char *glibtop_names_proclist [];
 | 
			
		||||
extern const char *glibtop_types_proclist [];
 | 
			
		||||
extern const unsigned glibtop_types_proclist [];
 | 
			
		||||
extern const char *glibtop_labels_proclist [];
 | 
			
		||||
extern const char *glibtop_descriptions_proclist [];
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -53,9 +53,21 @@ struct _glibtop_proc_mem
 | 
			
		||||
				 * of the process; usually 2,147,483,647 */
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#define glibtop_get_proc_mem(p1, p2)	glibtop_get_proc_mem__r(glibtop_global_server, p1, p2)
 | 
			
		||||
#define glibtop_get_proc_mem(p1, p2)	glibtop_get_proc_mem_l(glibtop_global_server, p1, p2)
 | 
			
		||||
 | 
			
		||||
extern void glibtop_get_proc_mem__r __P((glibtop *, glibtop_proc_mem *, pid_t));
 | 
			
		||||
#if GLIBTOP_SUID_PROC_MEM
 | 
			
		||||
#define glibtop_get_proc_mem_r		glibtop_get_proc_mem_p
 | 
			
		||||
#else
 | 
			
		||||
#define glibtop_get_proc_mem_r		glibtop_get_proc_mem_s
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
extern void glibtop_get_proc_mem_l __P((glibtop *, glibtop_proc_mem *, pid_t));
 | 
			
		||||
 | 
			
		||||
#if GLIBTOP_SUID_PROC_MEM
 | 
			
		||||
extern void glibtop_get_proc_mem_p __P((glibtop *, glibtop_proc_mem *, pid_t));
 | 
			
		||||
#else
 | 
			
		||||
extern void glibtop_get_proc_mem_s __P((glibtop *, glibtop_proc_mem *, pid_t));
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef HAVE_GUILE
 | 
			
		||||
 | 
			
		||||
@@ -81,7 +93,7 @@ extern SCM glibtop_guile_descriptions_proc_mem __P((void));
 | 
			
		||||
/* You need to link with -lgtop_names to get this stuff here. */
 | 
			
		||||
 | 
			
		||||
extern const char *glibtop_names_proc_mem [];
 | 
			
		||||
extern const char *glibtop_types_proc_mem [];
 | 
			
		||||
extern const unsigned glibtop_types_proc_mem [];
 | 
			
		||||
extern const char *glibtop_labels_proc_mem [];
 | 
			
		||||
extern const char *glibtop_descriptions_proc_mem [];
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -54,9 +54,21 @@ struct _glibtop_proc_segment
 | 
			
		||||
		start_stack;	/* address of the bottom of stack segment */
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#define glibtop_get_proc_segment(p1, p2)	glibtop_get_proc_segment__r(glibtop_global_server, p1, p2)
 | 
			
		||||
#define glibtop_get_proc_segment(p1, p2)	glibtop_get_proc_segment_l(glibtop_global_server, p1, p2)
 | 
			
		||||
 | 
			
		||||
extern void glibtop_get_proc_segment__r __P((glibtop *, glibtop_proc_segment *, pid_t));
 | 
			
		||||
#if GLIBTOP_SUID_PROC_SEGMENT
 | 
			
		||||
#define glibtop_get_proc_segment_r	glibtop_get_proc_segment_p
 | 
			
		||||
#else
 | 
			
		||||
#define glibtop_get_proc_segment_r	glibtop_get_proc_segment_s
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
extern void glibtop_get_proc_segment_l __P((glibtop *, glibtop_proc_segment *, pid_t));
 | 
			
		||||
 | 
			
		||||
#if GLIBTOP_SUID_PROC_SEGMENT
 | 
			
		||||
extern void glibtop_get_proc_segment_p __P((glibtop *, glibtop_proc_segment *, pid_t));
 | 
			
		||||
#else
 | 
			
		||||
extern void glibtop_get_proc_segment_s __P((glibtop *, glibtop_proc_segment *, pid_t));
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef HAVE_GUILE
 | 
			
		||||
 | 
			
		||||
@@ -81,8 +93,8 @@ extern SCM glibtop_guile_descriptions_proc_segment __P((void));
 | 
			
		||||
 | 
			
		||||
/* You need to link with -lgtop_names to get this stuff here. */
 | 
			
		||||
 | 
			
		||||
extern const char *glibtop_types_proc_segment [];
 | 
			
		||||
extern const char *glibtop_names_proc_segment [];
 | 
			
		||||
extern const unsigned glibtop_types_proc_segment [];
 | 
			
		||||
extern const char *glibtop_labels_proc_segment [];
 | 
			
		||||
extern const char *glibtop_descriptions_proc_segment [];
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -47,9 +47,21 @@ struct _glibtop_proc_signal
 | 
			
		||||
		sigcatch;	/* mask of caught  signals */
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#define glibtop_get_proc_signal(p1, p2)	glibtop_get_proc_signal__r(glibtop_global_server, p1, p2)
 | 
			
		||||
#define glibtop_get_proc_signal(p1, p2)	glibtop_get_proc_signal_l(glibtop_global_server, p1, p2)
 | 
			
		||||
 | 
			
		||||
extern void glibtop_get_proc_signal__r __P((glibtop *, glibtop_proc_signal *, pid_t));
 | 
			
		||||
#if GLIBTOP_SUID_PROC_SIGNAL
 | 
			
		||||
#define glibtop_get_proc_signal_r	glibtop_get_proc_signal_p
 | 
			
		||||
#else
 | 
			
		||||
#define glibtop_get_proc_signal_r	glibtop_get_proc_signal_s
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
extern void glibtop_get_proc_signal_l __P((glibtop *, glibtop_proc_signal *, pid_t));
 | 
			
		||||
 | 
			
		||||
#if GLIBTOP_SUID_PROC_SIGNAL
 | 
			
		||||
extern void glibtop_get_proc_signal_p __P((glibtop *, glibtop_proc_signal *, pid_t));
 | 
			
		||||
#else
 | 
			
		||||
extern void glibtop_get_proc_signal_s __P((glibtop *, glibtop_proc_signal *, pid_t));
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef HAVE_GUILE
 | 
			
		||||
 | 
			
		||||
@@ -75,7 +87,7 @@ extern SCM glibtop_guile_descriptions_proc_signal __P((void));
 | 
			
		||||
/* You need to link with -lgtop_names to get this stuff here. */
 | 
			
		||||
 | 
			
		||||
extern const char *glibtop_names_proc_signal [];
 | 
			
		||||
extern const char *glibtop_types_proc_signal [];
 | 
			
		||||
extern const unsigned glibtop_types_proc_signal [];
 | 
			
		||||
extern const char *glibtop_labels_proc_signal [];
 | 
			
		||||
extern const char *glibtop_descriptions_proc_signal [];
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -54,9 +54,21 @@ struct _glibtop_proc_state
 | 
			
		||||
		gid;		/* GID of process */
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#define glibtop_get_proc_state(p1, p2)	glibtop_get_proc_state__r(glibtop_global_server, p1, p2)
 | 
			
		||||
#define glibtop_get_proc_state(p1, p2)	glibtop_get_proc_state_l(glibtop_global_server, p1, p2)
 | 
			
		||||
 | 
			
		||||
extern void glibtop_get_proc_state__r __P((glibtop *, glibtop_proc_state *, pid_t));
 | 
			
		||||
#if GLIBTOP_SUID_PROC_STATE
 | 
			
		||||
#define glibtop_get_proc_state_r	glibtop_get_proc_state_p
 | 
			
		||||
#else
 | 
			
		||||
#define glibtop_get_proc_state_r	glibtop_get_proc_state_s
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
extern void glibtop_get_proc_state_l __P((glibtop *, glibtop_proc_state *, pid_t));
 | 
			
		||||
 | 
			
		||||
#if GLIBTOP_SUID_PROC_STATE
 | 
			
		||||
extern void glibtop_get_proc_state_p __P((glibtop *, glibtop_proc_state *, pid_t));
 | 
			
		||||
#else
 | 
			
		||||
extern void glibtop_get_proc_state_s __P((glibtop *, glibtop_proc_state *, pid_t));
 | 
			
		||||
#endif
 | 
			
		||||
     
 | 
			
		||||
#ifdef HAVE_GUILE
 | 
			
		||||
 | 
			
		||||
@@ -82,7 +94,7 @@ extern SCM glibtop_guile_descriptions_proc_state __P((void));
 | 
			
		||||
/* You need to link with -lgtop_names to get this stuff here. */
 | 
			
		||||
 | 
			
		||||
extern const char *glibtop_names_proc_state [];
 | 
			
		||||
extern const char *glibtop_types_proc_state [];
 | 
			
		||||
extern const unsigned glibtop_types_proc_state [];
 | 
			
		||||
extern const char *glibtop_labels_proc_state [];
 | 
			
		||||
extern const char *glibtop_descriptions_proc_state [];
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -59,9 +59,21 @@ struct _glibtop_proc_time
 | 
			
		||||
				 * due to an interval timer. */
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#define glibtop_get_proc_time(p1, p2)	glibtop_get_proc_time__r(glibtop_global_server, p1, p2)
 | 
			
		||||
#define glibtop_get_proc_time(p1, p2)	glibtop_get_proc_time_l(glibtop_global_server, p1, p2)
 | 
			
		||||
 | 
			
		||||
extern void glibtop_get_proc_time__r __P((glibtop *, glibtop_proc_time *, pid_t));
 | 
			
		||||
#if GLIBTOP_SUID_PROC_TIME
 | 
			
		||||
#define glibtop_get_proc_time_r	glibtop_get_proc_time_p
 | 
			
		||||
#else
 | 
			
		||||
#define glibtop_get_proc_time_r	glibtop_get_proc_time_s
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
extern void glibtop_get_proc_time_l __P((glibtop *, glibtop_proc_time *, pid_t));
 | 
			
		||||
 | 
			
		||||
#if GLIBTOP_SUID_PROC_TIME
 | 
			
		||||
extern void glibtop_get_proc_time_p __P((glibtop *, glibtop_proc_time *, pid_t));
 | 
			
		||||
#else
 | 
			
		||||
extern void glibtop_get_proc_time_s __P((glibtop *, glibtop_proc_time *, pid_t));
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef HAVE_GUILE
 | 
			
		||||
 | 
			
		||||
@@ -87,7 +99,7 @@ extern SCM glibtop_guile_descriptions_proc_time __P((void));
 | 
			
		||||
/* You need to link with -lgtop_names to get this stuff here. */
 | 
			
		||||
 | 
			
		||||
extern const char *glibtop_names_proc_time [];
 | 
			
		||||
extern const char *glibtop_types_proc_time [];
 | 
			
		||||
extern const unsigned glibtop_types_proc_time [];
 | 
			
		||||
extern const char *glibtop_labels_proc_time [];
 | 
			
		||||
extern const char *glibtop_descriptions_proc_time [];
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -63,9 +63,21 @@ struct _glibtop_proc_uid
 | 
			
		||||
		nice;		/* standard unix nice level of process */
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#define glibtop_get_proc_uid(p1, p2)	glibtop_get_proc_uid__r(glibtop_global_server, p1, p2)
 | 
			
		||||
#define glibtop_get_proc_uid(p1, p2)	glibtop_get_proc_uid_l(glibtop_global_server, p1, p2)
 | 
			
		||||
 | 
			
		||||
extern void glibtop_get_proc_uid__r __P((glibtop *, glibtop_proc_uid *, pid_t));
 | 
			
		||||
#if GLIBTOP_SUID_PROC_UID
 | 
			
		||||
#define glibtop_get_proc_uid_r		glibtop_get_proc_uid_p
 | 
			
		||||
#else
 | 
			
		||||
#define glibtop_get_proc_uid_r		glibtop_get_proc_uid_s
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
extern void glibtop_get_proc_uid_l __P((glibtop *, glibtop_proc_uid *, pid_t));
 | 
			
		||||
 | 
			
		||||
#if GLIBTOP_SUID_PROC_UID
 | 
			
		||||
extern void glibtop_get_proc_uid_p __P((glibtop *, glibtop_proc_uid *, pid_t));
 | 
			
		||||
#else
 | 
			
		||||
extern void glibtop_get_proc_uid_s __P((glibtop *, glibtop_proc_uid *, pid_t));
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef HAVE_GUILE
 | 
			
		||||
 | 
			
		||||
@@ -91,7 +103,7 @@ extern SCM glibtop_guile_descriptions_proc_uid __P((void));
 | 
			
		||||
/* You need to link with -lgtop_names to get this stuff here. */
 | 
			
		||||
 | 
			
		||||
extern const char *glibtop_names_proc_uid [];
 | 
			
		||||
extern const char *glibtop_types_proc_uid [];
 | 
			
		||||
extern const unsigned glibtop_types_proc_uid [];
 | 
			
		||||
extern const char *glibtop_labels_proc_uid [];
 | 
			
		||||
extern const char *glibtop_descriptions_proc_uid [];
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -29,7 +29,8 @@ __BEGIN_DECLS
 | 
			
		||||
 | 
			
		||||
#define glibtop_read(p1, p2)	glibtop_read(glibtop_global_server, p1, p2)
 | 
			
		||||
 | 
			
		||||
extern void glibtop_read__r __P((glibtop *, size_t, void *));
 | 
			
		||||
extern void glibtop_read_l __P((glibtop *, size_t, void *));
 | 
			
		||||
extern void glibtop_read_s __P((glibtop *, size_t, void *));
 | 
			
		||||
 | 
			
		||||
__END_DECLS
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -27,9 +27,10 @@
 | 
			
		||||
 | 
			
		||||
__BEGIN_DECLS
 | 
			
		||||
 | 
			
		||||
#define glibtop_read_data()	glibtop_read_data__r(glibtop_global_server)
 | 
			
		||||
#define glibtop_read_data()	glibtop_read_data_r(glibtop_global_server)
 | 
			
		||||
 | 
			
		||||
extern void *glibtop_read_data__r __P((glibtop *));
 | 
			
		||||
extern void *glibtop_read_data_l __P((glibtop *));
 | 
			
		||||
extern void *glibtop_read_data_s __P((glibtop *));
 | 
			
		||||
 | 
			
		||||
__END_DECLS
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -57,9 +57,21 @@ struct _glibtop_sem_limits
 | 
			
		||||
		semaem;		/* GLIBTOP_IPC_SEMAEM	*/
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#define glibtop_get_sem_limits(sem)	glibtop_get_sem_limits__r(glibtop_global_server, sem)
 | 
			
		||||
#define glibtop_get_sem_limits(sem)	glibtop_get_sem_limits_l(glibtop_global_server, sem)
 | 
			
		||||
 | 
			
		||||
extern void glibtop_get_sem_limits__r __P((glibtop *, glibtop_sem_limits *));
 | 
			
		||||
#if GLIBTOP_SUID_SEM_LIMITS
 | 
			
		||||
#define glibtop_get_sem_limits_r	glibtop_get_sem_limits_p
 | 
			
		||||
#else
 | 
			
		||||
#define glibtop_get_sem_limits_r	glibtop_get_sem_limits_s
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
extern void glibtop_get_sem_limits_l __P((glibtop *, glibtop_sem_limits *));
 | 
			
		||||
 | 
			
		||||
#if GLIBTOP_SUID_SEM_LIMITS
 | 
			
		||||
extern void glibtop_get_sem_limits_p __P((glibtop *, glibtop_sem_limits *));
 | 
			
		||||
#else
 | 
			
		||||
extern void glibtop_get_sem_limits_s __P((glibtop *, glibtop_sem_limits *));
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef HAVE_GUILE
 | 
			
		||||
 | 
			
		||||
@@ -85,7 +97,7 @@ extern SCM glibtop_guile_descriptions_sem_limits __P((void));
 | 
			
		||||
/* You need to link with -lgtop_names to get this stuff here. */
 | 
			
		||||
 | 
			
		||||
extern const char *glibtop_names_sem_limits [];
 | 
			
		||||
extern const char *glibtop_types_sem_limits [];
 | 
			
		||||
extern const unsigned glibtop_types_sem_limits [];
 | 
			
		||||
extern const char *glibtop_labels_sem_limits [];
 | 
			
		||||
extern const char *glibtop_descriptions_sem_limits [];
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -47,9 +47,21 @@ struct _glibtop_shm_limits
 | 
			
		||||
		shmall;		/* GLIBTOP_IPC_SHMALL	*/
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#define glibtop_get_shm_limits(shm)	glibtop_get_shm_limits__r(glibtop_global_server, shm)
 | 
			
		||||
#define glibtop_get_shm_limits(shm)	glibtop_get_shm_limits_l(glibtop_global_server, shm)
 | 
			
		||||
 | 
			
		||||
extern void glibtop_get_shm_limits__r __P((glibtop *, glibtop_shm_limits *));
 | 
			
		||||
#if GLIBTOP_SUID_SHM_LIMITS
 | 
			
		||||
#define glibtop_get_shm_limits_r	glibtop_get_shm_limits_p
 | 
			
		||||
#else
 | 
			
		||||
#define glibtop_get_shm_limits_r	glibtop_get_shm_limits_s
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
extern void glibtop_get_shm_limits_l __P((glibtop *, glibtop_shm_limits *));
 | 
			
		||||
 | 
			
		||||
#if GLIBTOP_SUID_SHM_LIMITS
 | 
			
		||||
extern void glibtop_get_shm_limits_p __P((glibtop *, glibtop_shm_limits *));
 | 
			
		||||
#else
 | 
			
		||||
extern void glibtop_get_shm_limits_s __P((glibtop *, glibtop_shm_limits *));
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef HAVE_GUILE
 | 
			
		||||
 | 
			
		||||
@@ -75,7 +87,7 @@ extern SCM glibtop_guile_descriptions_shm_limits __P((void));
 | 
			
		||||
/* You need to link with -lgtop_names to get this stuff here. */
 | 
			
		||||
 | 
			
		||||
extern const char *glibtop_names_shm_limits [];
 | 
			
		||||
extern const char *glibtop_types_shm_limits [];
 | 
			
		||||
extern const unsigned glibtop_types_shm_limits [];
 | 
			
		||||
extern const char *glibtop_labels_shm_limits [];
 | 
			
		||||
extern const char *glibtop_descriptions_shm_limits [];
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -43,9 +43,21 @@ struct _glibtop_swap
 | 
			
		||||
		free;		/* GLIBTOP_SWAP_FREE	*/
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#define glibtop_get_swap(swap)	glibtop_get_swap__r(glibtop_global_server, swap)
 | 
			
		||||
#define glibtop_get_swap(swap)	glibtop_get_swap_l(glibtop_global_server, swap)
 | 
			
		||||
 | 
			
		||||
extern void glibtop_get_swap__r __P((glibtop *, glibtop_swap *));
 | 
			
		||||
#if GLIBTOP_SUID_SWAP
 | 
			
		||||
#define glibtop_get_swap_r		glibtop_get_swap_p
 | 
			
		||||
#else
 | 
			
		||||
#define glibtop_get_swap_r		glibtop_get_swap_s
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
extern void glibtop_get_swap_l __P((glibtop *, glibtop_swap *));
 | 
			
		||||
 | 
			
		||||
#if GLIBTOP_SUID_SWAP
 | 
			
		||||
extern void glibtop_get_swap_p __P((glibtop *, glibtop_swap *));
 | 
			
		||||
#else
 | 
			
		||||
extern void glibtop_get_swap_s __P((glibtop *, glibtop_swap *));
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef HAVE_GUILE
 | 
			
		||||
 | 
			
		||||
@@ -71,7 +83,7 @@ extern SCM glibtop_guile_descriptions_swap __P((void));
 | 
			
		||||
/* You need to link with -lgtop_names to get this stuff here. */
 | 
			
		||||
 | 
			
		||||
extern const char *glibtop_names_swap [];
 | 
			
		||||
extern const char *glibtop_types_swap [];
 | 
			
		||||
extern const unsigned glibtop_types_swap [];
 | 
			
		||||
extern const char *glibtop_labels_swap [];
 | 
			
		||||
extern const char *glibtop_descriptions_swap [];
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -27,30 +27,34 @@
 | 
			
		||||
 | 
			
		||||
__BEGIN_DECLS
 | 
			
		||||
 | 
			
		||||
#define GLIBTOP_SYSDEPS_CPU		0
 | 
			
		||||
#define GLIBTOP_SYSDEPS_MEM		1
 | 
			
		||||
#define GLIBTOP_SYSDEPS_SWAP		2
 | 
			
		||||
#define GLIBTOP_SYSDEPS_UPTIME		3
 | 
			
		||||
#define GLIBTOP_SYSDEPS_LOADAVG		4
 | 
			
		||||
#define GLIBTOP_SYSDEPS_SHM_LIMITS	5
 | 
			
		||||
#define GLIBTOP_SYSDEPS_MSG_LIMITS	6
 | 
			
		||||
#define GLIBTOP_SYSDEPS_SEM_LIMITS	7
 | 
			
		||||
#define GLIBTOP_SYSDEPS_PROCLIST	8
 | 
			
		||||
#define GLIBTOP_SYSDEPS_PROC_STATE	9
 | 
			
		||||
#define GLIBTOP_SYSDEPS_PROC_UID	10
 | 
			
		||||
#define GLIBTOP_SYSDEPS_PROC_MEM	11
 | 
			
		||||
#define GLIBTOP_SYSDEPS_PROC_TIME	12
 | 
			
		||||
#define GLIBTOP_SYSDEPS_PROC_SIGNAL	13
 | 
			
		||||
#define GLIBTOP_SYSDEPS_PROC_KERNEL	14
 | 
			
		||||
#define GLIBTOP_SYSDEPS_PROC_SEGMENT	15
 | 
			
		||||
#define GLIBTOP_SYSDEPS_FEATURES	0
 | 
			
		||||
#define GLIBTOP_SYSDEPS_CPU		1
 | 
			
		||||
#define GLIBTOP_SYSDEPS_MEM		2
 | 
			
		||||
#define GLIBTOP_SYSDEPS_SWAP		3
 | 
			
		||||
#define GLIBTOP_SYSDEPS_UPTIME		4
 | 
			
		||||
#define GLIBTOP_SYSDEPS_LOADAVG		5
 | 
			
		||||
#define GLIBTOP_SYSDEPS_SHM_LIMITS	6
 | 
			
		||||
#define GLIBTOP_SYSDEPS_MSG_LIMITS	7
 | 
			
		||||
#define GLIBTOP_SYSDEPS_SEM_LIMITS	8
 | 
			
		||||
#define GLIBTOP_SYSDEPS_PROCLIST	9
 | 
			
		||||
#define GLIBTOP_SYSDEPS_PROC_STATE	10
 | 
			
		||||
#define GLIBTOP_SYSDEPS_PROC_UID	11
 | 
			
		||||
#define GLIBTOP_SYSDEPS_PROC_MEM	12
 | 
			
		||||
#define GLIBTOP_SYSDEPS_PROC_TIME	13
 | 
			
		||||
#define GLIBTOP_SYSDEPS_PROC_SIGNAL	14
 | 
			
		||||
#define GLIBTOP_SYSDEPS_PROC_KERNEL	15
 | 
			
		||||
#define GLIBTOP_SYSDEPS_PROC_SEGMENT	16
 | 
			
		||||
 | 
			
		||||
#define GLIBTOP_MAX_SYSDEPS		16
 | 
			
		||||
#define GLIBTOP_MAX_SYSDEPS		17
 | 
			
		||||
 | 
			
		||||
#define GLIBTOP_SYSDEPS_ALL		((1 << GLIBTOP_MAX_SYSDEPS) - 1)
 | 
			
		||||
 | 
			
		||||
typedef struct _glibtop_sysdeps	glibtop_sysdeps;
 | 
			
		||||
 | 
			
		||||
struct _glibtop_sysdeps
 | 
			
		||||
{
 | 
			
		||||
	unsigned long	flags,
 | 
			
		||||
		features,		/* server features	*/
 | 
			
		||||
		cpu,			/* glibtop_cpu		*/
 | 
			
		||||
		mem,			/* glibtop_mem		*/
 | 
			
		||||
		swap,			/* glibtop_swap		*/
 | 
			
		||||
@@ -69,9 +73,9 @@ struct _glibtop_sysdeps
 | 
			
		||||
		proc_segment;		/* glibtop_proc_segment	*/
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#define glibtop_get_sysdeps(sysdeps)	glibtop_get_sysdeps__r(glibtop_global_server,sysdeps)
 | 
			
		||||
#define glibtop_get_sysdeps(sysdeps)	glibtop_get_sysdeps_r(glibtop_global_server,sysdeps)
 | 
			
		||||
 | 
			
		||||
extern void glibtop_get_sysdeps__r __P((glibtop *, glibtop_sysdeps *));
 | 
			
		||||
extern void glibtop_get_sysdeps_r __P((glibtop *, glibtop_sysdeps *));
 | 
			
		||||
 | 
			
		||||
#ifdef HAVE_GUILE
 | 
			
		||||
 | 
			
		||||
@@ -97,7 +101,7 @@ extern SCM glibtop_guile_descriptions_sysdeps __P((void));
 | 
			
		||||
/* You need to link with -lgtop_names to get this stuff here. */
 | 
			
		||||
 | 
			
		||||
extern const char *glibtop_names_sysdeps [];
 | 
			
		||||
extern const char *glibtop_types_sysdeps [];
 | 
			
		||||
extern const unsigned glibtop_types_sysdeps [];
 | 
			
		||||
extern const char *glibtop_labels_sysdeps [];
 | 
			
		||||
extern const char *glibtop_descriptions_sysdeps [];
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -19,14 +19,18 @@
 | 
			
		||||
   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
 | 
			
		||||
   Boston, MA 02111-1307, USA.  */
 | 
			
		||||
 | 
			
		||||
#include <glibtop/sysdeps.h>
 | 
			
		||||
#include <glibtop/command.h>
 | 
			
		||||
#ifndef __GLIBTOP_TYPES_H__
 | 
			
		||||
#define __GLIBTOP_TYPES_H__
 | 
			
		||||
 | 
			
		||||
/* Checks which features are implemented. */
 | 
			
		||||
__BEGIN_DECLS
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
glibtop_get_sysdeps__r (glibtop *server, glibtop_sysdeps *buf)
 | 
			
		||||
{
 | 
			
		||||
	glibtop_init__r (&server);
 | 
			
		||||
	glibtop_call__r (server, GLIBTOP_CMND_SYSDEPS, 0, NULL, sizeof (glibtop_sysdeps), buf);
 | 
			
		||||
}
 | 
			
		||||
#define GLIBTOP_TYPE_LONG	1
 | 
			
		||||
#define GLIBTOP_TYPE_ULONG	2
 | 
			
		||||
#define GLIBTOP_TYPE_DOUBLE	3
 | 
			
		||||
#define GLIBTOP_TYPE_INT	4
 | 
			
		||||
#define GLIBTOP_TYPE_CHAR	5
 | 
			
		||||
#define GLIBTOP_TYPE_STRING	6
 | 
			
		||||
 | 
			
		||||
__END_DECLS
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
@@ -41,9 +41,21 @@ struct _glibtop_uptime
 | 
			
		||||
		idletime;	/* GLIBTOP_UPTIME_IDLETIME	*/
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#define glibtop_get_uptime(uptime)	glibtop_get_uptime__r(glibtop_global_server, uptime)
 | 
			
		||||
#define glibtop_get_uptime(uptime)	glibtop_get_uptime_l(glibtop_global_server, uptime)
 | 
			
		||||
 | 
			
		||||
extern void glibtop_get_uptime__r __P((glibtop *, glibtop_uptime *));
 | 
			
		||||
#if GLIBTOP_SUID_UPTIME
 | 
			
		||||
#define glibtop_get_uptime_r		glibtop_get_uptime_p
 | 
			
		||||
#else
 | 
			
		||||
#define glibtop_get_uptime_r		glibtop_get_uptime_s
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
extern void glibtop_get_uptime_l __P((glibtop *, glibtop_uptime *));
 | 
			
		||||
 | 
			
		||||
#if GLIBTOP_SUID_UPTIME
 | 
			
		||||
extern void glibtop_get_uptime_p __P((glibtop *, glibtop_uptime *));
 | 
			
		||||
#else
 | 
			
		||||
extern void glibtop_get_uptime_s __P((glibtop *, glibtop_uptime *));
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef HAVE_GUILE
 | 
			
		||||
 | 
			
		||||
@@ -69,7 +81,7 @@ extern SCM glibtop_guile_descriptions_uptime __P((void));
 | 
			
		||||
/* You need to link with -lgtop_names to get this stuff here. */
 | 
			
		||||
 | 
			
		||||
extern const char *glibtop_names_uptime [];
 | 
			
		||||
extern const char *glibtop_types_uptime [];
 | 
			
		||||
extern const unsigned glibtop_types_uptime [];
 | 
			
		||||
extern const char *glibtop_labels_uptime [];
 | 
			
		||||
extern const char *glibtop_descriptions_uptime [];
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -29,7 +29,8 @@ __BEGIN_DECLS
 | 
			
		||||
 | 
			
		||||
#define glibtop_write(p1, p2)	glibtop_write(glibtop_global_server, p1, p2)
 | 
			
		||||
 | 
			
		||||
extern void glibtop_write__r __P((glibtop *, size_t, void *));
 | 
			
		||||
extern void glibtop_write_l __P((glibtop *, size_t, void *));
 | 
			
		||||
extern void glibtop_write_s __P((glibtop *, size_t, void *));
 | 
			
		||||
 | 
			
		||||
__END_DECLS
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -27,15 +27,17 @@
 | 
			
		||||
 | 
			
		||||
__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_free(p1)	glibtop_free__r(glibtop_global_server, p1)
 | 
			
		||||
#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 void glibtop_free__r	__P((glibtop *, void *));
 | 
			
		||||
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
									
								
							
							
						
						
									
										6
									
								
								kernel/ChangeLog
									
									
									
									
									
										Normal 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.
 | 
			
		||||
							
								
								
									
										13
									
								
								kernel/Makefile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								kernel/Makefile
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,13 @@
 | 
			
		||||
#
 | 
			
		||||
# Makefile for the linux system information tables.
 | 
			
		||||
#
 | 
			
		||||
# Note! Dependencies are done automagically by 'make dep', which also
 | 
			
		||||
# removes any old dependencies. DON'T put your own dependencies here
 | 
			
		||||
# unless it's something special (ie not a .c file).
 | 
			
		||||
#
 | 
			
		||||
# Note 2! The CFLAGS definition is now in the main makefile...
 | 
			
		||||
 | 
			
		||||
O_TARGET := table.o
 | 
			
		||||
O_OBJS   := main.o
 | 
			
		||||
 | 
			
		||||
include $(TOPDIR)/Rules.make
 | 
			
		||||
							
								
								
									
										21
									
								
								kernel/README
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								kernel/README
									
									
									
									
									
										Normal 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
									
								
							
							
						
						
									
										49
									
								
								kernel/kernel.patch
									
									
									
									
									
										Normal 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) \
 | 
			
		||||
							
								
								
									
										423
									
								
								kernel/main.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										423
									
								
								kernel/main.c
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,423 @@
 | 
			
		||||
/*
 | 
			
		||||
 * linux/table/table_impl.c
 | 
			
		||||
 * Copyright (C) 1998 Martin Baulig
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include <linux/types.h>
 | 
			
		||||
#include <linux/errno.h>
 | 
			
		||||
#include <linux/sched.h>
 | 
			
		||||
#include <linux/kernel.h>
 | 
			
		||||
#include <linux/kernel_stat.h>
 | 
			
		||||
#include <linux/tty.h>
 | 
			
		||||
#include <linux/user.h>
 | 
			
		||||
#include <linux/a.out.h>
 | 
			
		||||
#include <linux/string.h>
 | 
			
		||||
#include <linux/mman.h>
 | 
			
		||||
#include <linux/proc_fs.h>
 | 
			
		||||
#include <linux/ioport.h>
 | 
			
		||||
#include <linux/config.h>
 | 
			
		||||
#include <linux/mm.h>
 | 
			
		||||
#include <linux/pagemap.h>
 | 
			
		||||
#include <linux/swap.h>
 | 
			
		||||
 | 
			
		||||
#include <asm/segment.h>
 | 
			
		||||
#include <asm/pgtable.h>
 | 
			
		||||
#include <asm/io.h>
 | 
			
		||||
 | 
			
		||||
#include <linux/table.h>
 | 
			
		||||
 | 
			
		||||
#include "version.h"
 | 
			
		||||
 | 
			
		||||
#if defined(__i386__)
 | 
			
		||||
# define KSTK_EIP(tsk)	(((unsigned long *)tsk->kernel_stack_page)[1019])
 | 
			
		||||
# define KSTK_ESP(tsk)	(((unsigned long *)tsk->kernel_stack_page)[1022])
 | 
			
		||||
#elif defined(__alpha__)
 | 
			
		||||
  /*
 | 
			
		||||
   * See arch/alpha/kernel/ptrace.c for details.
 | 
			
		||||
   */
 | 
			
		||||
# define PT_REG(reg)		(PAGE_SIZE - sizeof(struct pt_regs)	\
 | 
			
		||||
				 + (long)&((struct pt_regs *)0)->reg)
 | 
			
		||||
# define KSTK_EIP(tsk)	(*(unsigned long *)(tsk->kernel_stack_page + PT_REG(pc)))
 | 
			
		||||
# define KSTK_ESP(tsk)	((tsk) == current ? rdusp() : (tsk)->tss.usp)
 | 
			
		||||
#elif defined(__sparc__)
 | 
			
		||||
# define PT_REG(reg)            (PAGE_SIZE - sizeof(struct pt_regs)     \
 | 
			
		||||
                                 + (long)&((struct pt_regs *)0)->reg)
 | 
			
		||||
# define KSTK_EIP(tsk)  (*(unsigned long *)(tsk->kernel_stack_page + PT_REG(pc)))
 | 
			
		||||
# define KSTK_ESP(tsk)  (*(unsigned long *)(tsk->kernel_stack_page + PT_REG(u_regs[UREG_FP])))
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
static struct task_struct *
 | 
			
		||||
get_task (pid_t pid)
 | 
			
		||||
{
 | 
			
		||||
	struct task_struct ** p;
 | 
			
		||||
	
 | 
			
		||||
	p = task;
 | 
			
		||||
	while (++p < task+NR_TASKS) {
 | 
			
		||||
		if (*p && (*p)->pid == pid)
 | 
			
		||||
			return *p;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return NULL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline void statm_pte_range(pmd_t * pmd, unsigned long address, unsigned long size,
 | 
			
		||||
	int * pages, int * shared, int * dirty, int * total)
 | 
			
		||||
{
 | 
			
		||||
	pte_t * pte;
 | 
			
		||||
	unsigned long end;
 | 
			
		||||
 | 
			
		||||
	if (pmd_none(*pmd))
 | 
			
		||||
		return;
 | 
			
		||||
	if (pmd_bad(*pmd)) {
 | 
			
		||||
		printk("statm_pte_range: bad pmd (%08lx)\n", pmd_val(*pmd));
 | 
			
		||||
		pmd_clear(pmd);
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
	pte = pte_offset(pmd, address);
 | 
			
		||||
	address &= ~PMD_MASK;
 | 
			
		||||
	end = address + size;
 | 
			
		||||
	if (end > PMD_SIZE)
 | 
			
		||||
		end = PMD_SIZE;
 | 
			
		||||
	do {
 | 
			
		||||
		pte_t page = *pte;
 | 
			
		||||
 | 
			
		||||
		address += PAGE_SIZE;
 | 
			
		||||
		pte++;
 | 
			
		||||
		if (pte_none(page))
 | 
			
		||||
			continue;
 | 
			
		||||
		++*total;
 | 
			
		||||
		if (!pte_present(page))
 | 
			
		||||
			continue;
 | 
			
		||||
		++*pages;
 | 
			
		||||
		if (pte_dirty(page))
 | 
			
		||||
			++*dirty;
 | 
			
		||||
		if (pte_page(page) >= high_memory)
 | 
			
		||||
			continue;
 | 
			
		||||
		if (mem_map[MAP_NR(pte_page(page))].count > 1)
 | 
			
		||||
			++*shared;
 | 
			
		||||
	} while (address < end);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline void statm_pmd_range(pgd_t * pgd, unsigned long address, unsigned long size,
 | 
			
		||||
	int * pages, int * shared, int * dirty, int * total)
 | 
			
		||||
{
 | 
			
		||||
	pmd_t * pmd;
 | 
			
		||||
	unsigned long end;
 | 
			
		||||
 | 
			
		||||
	if (pgd_none(*pgd))
 | 
			
		||||
		return;
 | 
			
		||||
	if (pgd_bad(*pgd)) {
 | 
			
		||||
		printk("statm_pmd_range: bad pgd (%08lx)\n", pgd_val(*pgd));
 | 
			
		||||
		pgd_clear(pgd);
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
	pmd = pmd_offset(pgd, address);
 | 
			
		||||
	address &= ~PGDIR_MASK;
 | 
			
		||||
	end = address + size;
 | 
			
		||||
	if (end > PGDIR_SIZE)
 | 
			
		||||
		end = PGDIR_SIZE;
 | 
			
		||||
	do {
 | 
			
		||||
		statm_pte_range(pmd, address, end - address, pages, shared, dirty, total);
 | 
			
		||||
		address = (address + PMD_SIZE) & PMD_MASK;
 | 
			
		||||
		pmd++;
 | 
			
		||||
	} while (address < end);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void statm_pgd_range(pgd_t * pgd, unsigned long address, unsigned long end,
 | 
			
		||||
	int * pages, int * shared, int * dirty, int * total)
 | 
			
		||||
{
 | 
			
		||||
	while (address < end) {
 | 
			
		||||
		statm_pmd_range(pgd, address, end - address, pages, shared, dirty, total);
 | 
			
		||||
		address = (address + PGDIR_SIZE) & PGDIR_MASK;
 | 
			
		||||
		pgd++;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static unsigned long
 | 
			
		||||
get_wchan (struct task_struct *p)
 | 
			
		||||
{
 | 
			
		||||
	if (!p || p == current || p->state == TASK_RUNNING)
 | 
			
		||||
		return 0;
 | 
			
		||||
#if defined(__i386__)
 | 
			
		||||
	{
 | 
			
		||||
		unsigned long ebp, eip;
 | 
			
		||||
		unsigned long stack_page;
 | 
			
		||||
		int count = 0;
 | 
			
		||||
 | 
			
		||||
		stack_page = p->kernel_stack_page;
 | 
			
		||||
		if (!stack_page)
 | 
			
		||||
			return 0;
 | 
			
		||||
		ebp = p->tss.ebp;
 | 
			
		||||
		do {
 | 
			
		||||
			if (ebp < stack_page || ebp >= 4092+stack_page)
 | 
			
		||||
				return 0;
 | 
			
		||||
			eip = *(unsigned long *) (ebp+4);
 | 
			
		||||
			if (eip < (unsigned long) interruptible_sleep_on
 | 
			
		||||
			    || eip >= (unsigned long) add_timer)
 | 
			
		||||
				return eip;
 | 
			
		||||
			ebp = *(unsigned long *) ebp;
 | 
			
		||||
		} while (count++ < 16);
 | 
			
		||||
	}
 | 
			
		||||
#elif defined(__alpha__)
 | 
			
		||||
	/*
 | 
			
		||||
	 * This one depends on the frame size of schedule().  Do a
 | 
			
		||||
	 * "disass schedule" in gdb to find the frame size.  Also, the
 | 
			
		||||
	 * code assumes that sleep_on() follows immediately after
 | 
			
		||||
	 * interruptible_sleep_on() and that add_timer() follows
 | 
			
		||||
	 * immediately after interruptible_sleep().  Ugly, isn't it?
 | 
			
		||||
	 * Maybe adding a wchan field to task_struct would be better,
 | 
			
		||||
	 * after all...
 | 
			
		||||
	 */
 | 
			
		||||
	{
 | 
			
		||||
		unsigned long schedule_frame;
 | 
			
		||||
		unsigned long pc;
 | 
			
		||||
		
 | 
			
		||||
		pc = thread_saved_pc(&p->tss);
 | 
			
		||||
		if (pc >= (unsigned long) interruptible_sleep_on && pc < (unsigned long) add_timer) {
 | 
			
		||||
			schedule_frame = ((unsigned long *)p->tss.ksp)[6];
 | 
			
		||||
			return ((unsigned long *)schedule_frame)[12];
 | 
			
		||||
		}
 | 
			
		||||
		return pc;
 | 
			
		||||
	}
 | 
			
		||||
#endif
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
asmlinkage int
 | 
			
		||||
sys_table (int type, union table *buf, const void *param)
 | 
			
		||||
{
 | 
			
		||||
	union table tbl;
 | 
			
		||||
	struct sysinfo i;
 | 
			
		||||
	struct task_struct *tsk = NULL;
 | 
			
		||||
	pid_t pid;
 | 
			
		||||
	int err;
 | 
			
		||||
 | 
			
		||||
	if (type == TABLE_VERSION)
 | 
			
		||||
		return _TABLE_VERSION;
 | 
			
		||||
 | 
			
		||||
	if (!buf)
 | 
			
		||||
		return -EFAULT;
 | 
			
		||||
 | 
			
		||||
	memset (&tbl, 0, sizeof (union table));
 | 
			
		||||
 | 
			
		||||
	/* For TABLE_PROC_*, read pid and get task_struct */
 | 
			
		||||
 | 
			
		||||
	switch (type) {
 | 
			
		||||
	case TABLE_PROC_UID:
 | 
			
		||||
	case TABLE_PROC_MEM:
 | 
			
		||||
	case TABLE_PROC_SEGMENT:
 | 
			
		||||
	case TABLE_PROC_TIME:
 | 
			
		||||
	case TABLE_PROC_STATE:
 | 
			
		||||
	case TABLE_PROC_SIGNAL:
 | 
			
		||||
	case TABLE_PROC_KERNEL:
 | 
			
		||||
	  err = verify_area (VERIFY_READ, param, sizeof (pid_t));
 | 
			
		||||
		if (err)
 | 
			
		||||
			return err;
 | 
			
		||||
		memcpy_fromfs (&pid, param, sizeof (pid_t));
 | 
			
		||||
 | 
			
		||||
		tsk = get_task (pid);
 | 
			
		||||
		if (tsk == NULL)
 | 
			
		||||
			return -ESRCH;
 | 
			
		||||
		break;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* Main function dispatcher */
 | 
			
		||||
 | 
			
		||||
	switch (type) {
 | 
			
		||||
	case TABLE_CPU:
 | 
			
		||||
		tbl.cpu.total = jiffies;    
 | 
			
		||||
		tbl.cpu.user  = kstat.cpu_user;
 | 
			
		||||
		tbl.cpu.nice  = kstat.cpu_nice;
 | 
			
		||||
		tbl.cpu.sys   = kstat.cpu_system;
 | 
			
		||||
		tbl.cpu.idle  = tbl.cpu.total - (tbl.cpu.user + tbl.cpu.nice + tbl.cpu.sys);
 | 
			
		||||
		tbl.cpu.frequency = HZ;
 | 
			
		||||
		break;
 | 
			
		||||
	case TABLE_MEM:
 | 
			
		||||
		si_meminfo (&i);
 | 
			
		||||
		tbl.mem.total  = i.totalram;
 | 
			
		||||
		tbl.mem.used   = i.totalram - i.freeram;
 | 
			
		||||
		tbl.mem.free   = i.freeram;
 | 
			
		||||
		tbl.mem.shared = i.sharedram;
 | 
			
		||||
		tbl.mem.buffer = i.bufferram;
 | 
			
		||||
		tbl.mem.cached = page_cache_size << PAGE_SHIFT;
 | 
			
		||||
		break;
 | 
			
		||||
	case TABLE_SWAP:
 | 
			
		||||
		si_swapinfo (&i);
 | 
			
		||||
		tbl.swap.total = i.totalswap;
 | 
			
		||||
		tbl.swap.used  = i.totalswap - i.freeswap;
 | 
			
		||||
		tbl.swap.free  = i.freeswap;
 | 
			
		||||
		break;
 | 
			
		||||
	case TABLE_LOADAVG:
 | 
			
		||||
		tbl.loadavg.loadavg [0] = (double) avenrun [0] / (1 << FSHIFT);
 | 
			
		||||
		tbl.loadavg.loadavg [1] = (double) avenrun [1] / (1 << FSHIFT);
 | 
			
		||||
		tbl.loadavg.loadavg [2] = (double) avenrun [2] / (1 << FSHIFT);
 | 
			
		||||
		tbl.loadavg.nr_running = nr_running;
 | 
			
		||||
		tbl.loadavg.nr_tasks = nr_tasks;
 | 
			
		||||
		tbl.loadavg.last_pid = last_pid;
 | 
			
		||||
		break;
 | 
			
		||||
	case TABLE_UPTIME:
 | 
			
		||||
		tbl.uptime.uptime = jiffies;
 | 
			
		||||
		tbl.uptime.idle   = task[0]->utime + task[0]->stime;
 | 
			
		||||
		break;
 | 
			
		||||
	case TABLE_PROC_STATE:
 | 
			
		||||
		tbl.proc_state.state = tsk->state;
 | 
			
		||||
		tbl.proc_state.flags = tsk->flags;
 | 
			
		||||
		memcpy (tbl.proc_state.comm, tsk->comm, sizeof (tbl.proc_state.comm));
 | 
			
		||||
		break;
 | 
			
		||||
	case TABLE_PROC_UID:
 | 
			
		||||
		tbl.proc_uid.uid = tsk->uid;
 | 
			
		||||
		tbl.proc_uid.euid = tsk->euid;
 | 
			
		||||
		tbl.proc_uid.suid = tsk->suid;
 | 
			
		||||
		tbl.proc_uid.fsuid = tsk->fsuid;
 | 
			
		||||
		
 | 
			
		||||
		tbl.proc_uid.gid = tsk->gid;
 | 
			
		||||
		tbl.proc_uid.egid = tsk->egid;
 | 
			
		||||
		tbl.proc_uid.sgid = tsk->sgid;
 | 
			
		||||
		tbl.proc_uid.fsgid = tsk->fsgid;
 | 
			
		||||
		
 | 
			
		||||
		tbl.proc_uid.pid = tsk->pid;
 | 
			
		||||
		tbl.proc_uid.pgrp = tsk->pgrp;
 | 
			
		||||
		tbl.proc_uid.ppid = tsk->p_pptr->pid;
 | 
			
		||||
		
 | 
			
		||||
		tbl.proc_uid.session = tsk->session;
 | 
			
		||||
	        tbl.proc_uid.tty = tsk->tty ? kdev_t_to_nr (tsk->tty->device) : 0;
 | 
			
		||||
		tbl.proc_uid.tpgid = tsk->tty ? tsk->tty->pgrp : -1;
 | 
			
		||||
		
 | 
			
		||||
		tbl.proc_uid.priority = tsk->priority;
 | 
			
		||||
		tbl.proc_uid.counter = tsk->counter;
 | 
			
		||||
		tbl.proc_uid.def_priority = DEF_PRIORITY;
 | 
			
		||||
		break;
 | 
			
		||||
	case TABLE_PROC_SIGNAL:
 | 
			
		||||
		tbl.proc_signal.signal = tsk->signal;
 | 
			
		||||
		tbl.proc_signal.blocked = tsk->blocked;
 | 
			
		||||
 | 
			
		||||
		if (tsk->sig) {
 | 
			
		||||
			struct sigaction * action = tsk->sig->action;
 | 
			
		||||
			unsigned long sig_ign = 0, sig_caught = 0;
 | 
			
		||||
			unsigned long bit = 1;
 | 
			
		||||
			int i;
 | 
			
		||||
			
 | 
			
		||||
			for (i = 0; i < 32; i++) {
 | 
			
		||||
				switch((unsigned long) action->sa_handler) {
 | 
			
		||||
				case 0:
 | 
			
		||||
					break;
 | 
			
		||||
				case 1:
 | 
			
		||||
					sig_ign |= bit;
 | 
			
		||||
					break;
 | 
			
		||||
				default:
 | 
			
		||||
					sig_caught |= bit;
 | 
			
		||||
				}
 | 
			
		||||
				bit <<= 1;
 | 
			
		||||
				action++;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			tbl.proc_signal.ignored = sig_ign;
 | 
			
		||||
			tbl.proc_signal.caught  = sig_caught;
 | 
			
		||||
		} else {
 | 
			
		||||
			tbl.proc_signal.ignored = 0;
 | 
			
		||||
			tbl.proc_signal.caught  = 0;
 | 
			
		||||
		}
 | 
			
		||||
		break;
 | 
			
		||||
	case TABLE_PROC_MEM:
 | 
			
		||||
		if (tsk->mm && tsk->mm != &init_mm) {
 | 
			
		||||
			tbl.proc_mem.context = tsk->mm->context;
 | 
			
		||||
			tbl.proc_mem.start_code = tsk->mm->start_code;
 | 
			
		||||
			tbl.proc_mem.end_code = tsk->mm->end_code;
 | 
			
		||||
			tbl.proc_mem.start_data = tsk->mm-> start_data;
 | 
			
		||||
			tbl.proc_mem.end_data = tsk->mm->end_data;
 | 
			
		||||
			tbl.proc_mem.start_brk = tsk->mm->start_brk;
 | 
			
		||||
			tbl.proc_mem.brk = tsk->mm->brk;
 | 
			
		||||
			tbl.proc_mem.start_stack = tsk->mm->start_stack;
 | 
			
		||||
			tbl.proc_mem.start_mmap = tsk->mm->start_mmap;
 | 
			
		||||
			tbl.proc_mem.arg_start = tsk->mm->arg_start;
 | 
			
		||||
			tbl.proc_mem.arg_end = tsk->mm->arg_end;
 | 
			
		||||
			tbl.proc_mem.env_start = tsk->mm->env_start;
 | 
			
		||||
			tbl.proc_mem.env_end = tsk->mm->env_end;
 | 
			
		||||
			tbl.proc_mem.rss = tsk->mm->rss;
 | 
			
		||||
			tbl.proc_mem.total_vm = tsk->mm->total_vm;
 | 
			
		||||
			tbl.proc_mem.locked_vm = tsk->mm->locked_vm;
 | 
			
		||||
		}
 | 
			
		||||
		tbl.proc_mem.rlim = tsk->rlim ? tsk->rlim[RLIMIT_RSS].rlim_cur : 0;
 | 
			
		||||
		break;
 | 
			
		||||
	case TABLE_PROC_SEGMENT:
 | 
			
		||||
		if (tsk->mm && tsk->mm != &init_mm) {
 | 
			
		||||
			unsigned long vsize = 0;
 | 
			
		||||
			int size = 0, resident = 0, share = 0;
 | 
			
		||||
			int trs = 0, lrs = 0, drs = 0, dt = 0;
 | 
			
		||||
			struct vm_area_struct * vma = tsk->mm->mmap;
 | 
			
		||||
 | 
			
		||||
			while (vma) {
 | 
			
		||||
				pgd_t *pgd = pgd_offset(tsk->mm, vma->vm_start);
 | 
			
		||||
				int pages = 0, shared = 0, dirty = 0, total = 0;
 | 
			
		||||
				
 | 
			
		||||
				vsize += vma->vm_end - vma->vm_start;
 | 
			
		||||
 | 
			
		||||
				statm_pgd_range (pgd, vma->vm_start, vma->vm_end,
 | 
			
		||||
						 &pages, &shared, &dirty, &total);
 | 
			
		||||
				resident += pages;
 | 
			
		||||
				share += shared;
 | 
			
		||||
				dt += dirty;
 | 
			
		||||
				size += total;
 | 
			
		||||
				if (vma->vm_flags & VM_EXECUTABLE)
 | 
			
		||||
					trs += pages;	/* text */
 | 
			
		||||
				else if (vma->vm_flags & VM_GROWSDOWN)
 | 
			
		||||
					drs += pages;	/* stack */
 | 
			
		||||
				else if (vma->vm_end > 0x60000000)
 | 
			
		||||
					lrs += pages;	/* library */
 | 
			
		||||
				else
 | 
			
		||||
					drs += pages;
 | 
			
		||||
				vma = vma->vm_next;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			tbl.proc_segment.vsize = vsize;
 | 
			
		||||
			tbl.proc_segment.size = size;
 | 
			
		||||
			tbl.proc_segment.resident = resident;
 | 
			
		||||
			tbl.proc_segment.shared = share;
 | 
			
		||||
			tbl.proc_segment.trs = trs;
 | 
			
		||||
			tbl.proc_segment.lrs = lrs;
 | 
			
		||||
			tbl.proc_segment.dt = dt;
 | 
			
		||||
		}
 | 
			
		||||
		break;
 | 
			
		||||
	case TABLE_PROC_TIME:
 | 
			
		||||
		tbl.proc_time.utime = tsk->utime;
 | 
			
		||||
		tbl.proc_time.stime = tsk->stime;
 | 
			
		||||
		tbl.proc_time.cutime = tsk->cutime;
 | 
			
		||||
		tbl.proc_time.cstime = tsk->cstime;
 | 
			
		||||
 | 
			
		||||
		tbl.proc_time.start_time = tsk->start_time;
 | 
			
		||||
		tbl.proc_time.timeout = tsk->timeout;
 | 
			
		||||
		tbl.proc_time.policy = tsk->policy;
 | 
			
		||||
		tbl.proc_time.rt_priority = tsk->rt_priority;
 | 
			
		||||
 | 
			
		||||
		tbl.proc_time.it_real_value = tsk->it_real_value;
 | 
			
		||||
		tbl.proc_time.it_prof_value = tsk->it_prof_value;
 | 
			
		||||
		tbl.proc_time.it_virt_value = tsk->it_virt_value;
 | 
			
		||||
		tbl.proc_time.it_real_incr = tsk->it_real_incr;
 | 
			
		||||
		tbl.proc_time.it_prof_incr = tsk->it_prof_incr;
 | 
			
		||||
		tbl.proc_time.it_virt_incr = tsk->it_virt_incr;
 | 
			
		||||
		break;
 | 
			
		||||
	case TABLE_PROC_KERNEL:
 | 
			
		||||
		tbl.proc_kernel.min_flt = tsk->min_flt;
 | 
			
		||||
		tbl.proc_kernel.cmin_flt = tsk->cmin_flt;
 | 
			
		||||
		tbl.proc_kernel.maj_flt = tsk->maj_flt;
 | 
			
		||||
		tbl.proc_kernel.cmaj_flt = tsk->cmaj_flt;
 | 
			
		||||
		
 | 
			
		||||
		tbl.proc_kernel.kesp = tsk->kernel_stack_page ? KSTK_EIP(tsk) : 0;
 | 
			
		||||
		tbl.proc_kernel.keip = tsk->kernel_stack_page ? KSTK_ESP(tsk) : 0;
 | 
			
		||||
		
 | 
			
		||||
		tbl.proc_kernel.nswap = tsk->nswap;
 | 
			
		||||
		tbl.proc_kernel.cnswap = tsk->cnswap;
 | 
			
		||||
 | 
			
		||||
		tbl.proc_kernel.wchan = get_wchan (tsk);
 | 
			
		||||
		break;
 | 
			
		||||
	default:
 | 
			
		||||
		return -EINVAL;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	err = verify_area (VERIFY_WRITE, buf, sizeof (struct table));
 | 
			
		||||
	if (err)
 | 
			
		||||
		return err;
 | 
			
		||||
 | 
			
		||||
	memcpy_tofs (buf, &tbl, sizeof (union table));
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										154
									
								
								kernel/table.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										154
									
								
								kernel/table.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,154 @@
 | 
			
		||||
#ifndef _LINUX_TABLE_H
 | 
			
		||||
#define _LINUX_TABLE_H
 | 
			
		||||
 | 
			
		||||
#ifdef _KERNEL
 | 
			
		||||
#include <linux/types.h>
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#define TABLE_VERSION		0
 | 
			
		||||
#define TABLE_CPU		1
 | 
			
		||||
#define TABLE_MEM		2
 | 
			
		||||
#define TABLE_SWAP		3
 | 
			
		||||
#define TABLE_LOADAVG		4
 | 
			
		||||
#define TABLE_UPTIME		5
 | 
			
		||||
#define TABLE_PROC_UID		6
 | 
			
		||||
#define TABLE_PROC_MEM		7
 | 
			
		||||
#define TABLE_PROC_SEGMENT	8
 | 
			
		||||
#define TABLE_PROC_TIME		9
 | 
			
		||||
#define TABLE_PROC_STATE	10
 | 
			
		||||
#define TABLE_PROC_SIGNAL	11
 | 
			
		||||
#define TABLE_PROC_KERNEL	12
 | 
			
		||||
 | 
			
		||||
/* CPU Usage (in jiffies = 1/100th seconds) */
 | 
			
		||||
 | 
			
		||||
struct table_cpu
 | 
			
		||||
{
 | 
			
		||||
	unsigned long total;		/* Total CPU Time		*/
 | 
			
		||||
	unsigned long user;		/* CPU Time in User Mode	*/
 | 
			
		||||
	unsigned long nice;		/* CPU Time in User Mode (nice)	*/
 | 
			
		||||
	unsigned long sys;		/* CPU Time in System Mode	*/
 | 
			
		||||
	unsigned long idle;		/* CPU Time in the Idle Task	*/
 | 
			
		||||
	unsigned long frequency;	/* Tick frequency		*/
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* Memory Usage (in bytes) */
 | 
			
		||||
 | 
			
		||||
struct table_mem
 | 
			
		||||
{
 | 
			
		||||
	unsigned long total;		/* Total physical memory	*/
 | 
			
		||||
	unsigned long used;		/* Used memory size		*/
 | 
			
		||||
	unsigned long free;		/* Free memory size		*/
 | 
			
		||||
	unsigned long shared;		/* Shared memory size		*/
 | 
			
		||||
	unsigned long buffer;		/* Size of buffers		*/
 | 
			
		||||
	unsigned long cached;		/* Size of cached memory       	*/
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* Swap Space (in bytes) */
 | 
			
		||||
 | 
			
		||||
struct table_swap
 | 
			
		||||
{
 | 
			
		||||
	unsigned long total;		/* Total swap space		*/
 | 
			
		||||
	unsigned long used;		/* Used swap space		*/
 | 
			
		||||
	unsigned long free;		/* Free swap space		*/
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* Load average */
 | 
			
		||||
 | 
			
		||||
struct table_loadavg
 | 
			
		||||
{
 | 
			
		||||
	double loadavg [3];
 | 
			
		||||
	unsigned nr_running;
 | 
			
		||||
	unsigned nr_tasks;
 | 
			
		||||
	unsigned last_pid;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* Uptime */
 | 
			
		||||
 | 
			
		||||
struct table_uptime
 | 
			
		||||
{
 | 
			
		||||
	unsigned long uptime;
 | 
			
		||||
	unsigned long idle;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* Information about processes. */
 | 
			
		||||
 | 
			
		||||
struct table_proc_state
 | 
			
		||||
{
 | 
			
		||||
	long state;
 | 
			
		||||
	unsigned long flags;
 | 
			
		||||
	char comm[16];
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct table_proc_uid
 | 
			
		||||
{
 | 
			
		||||
	int uid, euid, suid, fsuid;
 | 
			
		||||
	int gid, egid, sgid, fsgid;
 | 
			
		||||
	int pid, pgrp, ppid;
 | 
			
		||||
	int session;
 | 
			
		||||
	unsigned int tty;
 | 
			
		||||
	int tpgid;
 | 
			
		||||
	long priority;
 | 
			
		||||
	long counter;
 | 
			
		||||
	long def_priority;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct table_proc_mem
 | 
			
		||||
{
 | 
			
		||||
	unsigned long context;
 | 
			
		||||
	unsigned long start_code, end_code, start_data, end_data;
 | 
			
		||||
	unsigned long start_brk, brk, start_stack, start_mmap;
 | 
			
		||||
	unsigned long arg_start, arg_end, env_start, env_end;
 | 
			
		||||
	unsigned long rss, rlim, total_vm, locked_vm;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct table_proc_segment
 | 
			
		||||
{
 | 
			
		||||
	unsigned long vsize;
 | 
			
		||||
	int size, resident, shared;
 | 
			
		||||
	int trs, lrs, drs, dt;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct table_proc_time
 | 
			
		||||
{
 | 
			
		||||
	long utime, stime, cutime, cstime, start_time;
 | 
			
		||||
	unsigned long timeout, policy, rt_priority;
 | 
			
		||||
	unsigned long it_real_value, it_prof_value, it_virt_value;
 | 
			
		||||
	unsigned long it_real_incr, it_prof_incr, it_virt_incr;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct table_proc_signal
 | 
			
		||||
{
 | 
			
		||||
	unsigned long signal;
 | 
			
		||||
	unsigned long blocked;	/* bitmap of masked signals */
 | 
			
		||||
	unsigned long ignored;  /* mask of ignored signals */
 | 
			
		||||
	unsigned long caught;   /* mask of caught signals */
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct table_proc_kernel
 | 
			
		||||
{
 | 
			
		||||
	unsigned long keip, kesp, wchan;
 | 
			
		||||
	unsigned long min_flt, maj_flt, cmin_flt, cmaj_flt;
 | 
			
		||||
	unsigned long nswap, cnswap;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* Union */
 | 
			
		||||
 | 
			
		||||
union table
 | 
			
		||||
{
 | 
			
		||||
	struct table_cpu cpu;
 | 
			
		||||
	struct table_mem mem;
 | 
			
		||||
	struct table_swap swap;
 | 
			
		||||
	struct table_loadavg loadavg;
 | 
			
		||||
	struct table_uptime uptime;
 | 
			
		||||
	struct table_proc_uid proc_uid;
 | 
			
		||||
	struct table_proc_mem proc_mem;
 | 
			
		||||
	struct table_proc_segment proc_segment;
 | 
			
		||||
	struct table_proc_time proc_time;
 | 
			
		||||
	struct table_proc_state proc_state;	
 | 
			
		||||
	struct table_proc_signal proc_signal;
 | 
			
		||||
	struct table_proc_kernel proc_kernel;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#endif /* _LINUX_IPC_H */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										85
									
								
								kernel/test.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										85
									
								
								kernel/test.c
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,85 @@
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
 | 
			
		||||
#include <unistd.h>
 | 
			
		||||
#include <linux/unistd.h>
 | 
			
		||||
#include <linux/table.h>
 | 
			
		||||
 | 
			
		||||
#include <syscall.h>
 | 
			
		||||
 | 
			
		||||
static inline _syscall3 (int, table, int, type, union table *, tbl, const void *, param);
 | 
			
		||||
 | 
			
		||||
int
 | 
			
		||||
main (void)
 | 
			
		||||
{
 | 
			
		||||
	union table tbl;
 | 
			
		||||
	unsigned count;
 | 
			
		||||
	int ret;
 | 
			
		||||
 | 
			
		||||
	ret = table (TABLE_VERSION, NULL, NULL);
 | 
			
		||||
 | 
			
		||||
	if (ret == -1) {
 | 
			
		||||
		fprintf (stderr, "table(%u): %s\n", TABLE_VERSION, sys_errlist [errno]);
 | 
			
		||||
		exit (-errno);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	fprintf (stderr, "Table (%u) = %u\n", TABLE_VERSION, ret);
 | 
			
		||||
 | 
			
		||||
	for (count = 0; count < 5; count++) {
 | 
			
		||||
		ret = table (TABLE_CPU, &tbl, NULL);
 | 
			
		||||
 | 
			
		||||
		if (ret == -1) {
 | 
			
		||||
			fprintf (stderr, "table(%u): %s\n", TABLE_CPU, sys_errlist [errno]);
 | 
			
		||||
			exit (-errno);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		fprintf (stderr, "Table (%u) = %lu, %lu, %lu, %lu, %lu, %lu\n",
 | 
			
		||||
			 TABLE_CPU, tbl.cpu.total, tbl.cpu.user, tbl.cpu.nice,
 | 
			
		||||
			 tbl.cpu.sys, tbl.cpu.idle, tbl.cpu.frequency);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	ret = table (TABLE_MEM, &tbl, NULL);
 | 
			
		||||
 | 
			
		||||
	if (ret == -1) {
 | 
			
		||||
		fprintf (stderr, "table(%u): %s\n", TABLE_MEM, sys_errlist [errno]);
 | 
			
		||||
		exit (-errno);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	fprintf (stderr, "Table (%u) = %lu, %lu, %lu, %lu, %lu, %lu\n",
 | 
			
		||||
		 TABLE_MEM, tbl.mem.total, tbl.mem.used, tbl.mem.free,
 | 
			
		||||
		 tbl.mem.shared, tbl.mem.buffer, tbl.mem.cached);
 | 
			
		||||
 | 
			
		||||
	ret = table (TABLE_SWAP, &tbl, NULL);
 | 
			
		||||
 | 
			
		||||
	if (ret == -1) {
 | 
			
		||||
		fprintf (stderr, "table(%u): %s\n", TABLE_SWAP, sys_errlist [errno]);
 | 
			
		||||
		exit (-errno);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	fprintf (stderr, "Table (%u) = %lu, %lu, %lu\n",
 | 
			
		||||
		 TABLE_SWAP, tbl.swap.total, tbl.swap.used, tbl.swap.free);
 | 
			
		||||
	
 | 
			
		||||
	ret = table (TABLE_LOADAVG, &tbl, NULL);
 | 
			
		||||
 | 
			
		||||
	if (ret == -1) {
 | 
			
		||||
		fprintf (stderr, "table(%u): %s\n", TABLE_LOADAVG, sys_errlist [errno]);
 | 
			
		||||
		exit (-errno);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	fprintf (stderr, "Table (%u) = (%lu, %lu, %lu) - %u, %u, %u\n",
 | 
			
		||||
		 TABLE_LOADAVG, tbl.loadavg.loadavg [0], tbl.loadavg.loadavg [1],
 | 
			
		||||
		 tbl.loadavg.loadavg [2], tbl.loadavg.nr_running,
 | 
			
		||||
		 tbl.loadavg.nr_tasks, tbl.loadavg.last_pid);
 | 
			
		||||
	
 | 
			
		||||
	ret = table (TABLE_UPTIME, &tbl, NULL);
 | 
			
		||||
 | 
			
		||||
	if (ret == -1) {
 | 
			
		||||
		fprintf (stderr, "table(%u): %s\n", TABLE_UPTIME, sys_errlist [errno]);
 | 
			
		||||
		exit (-errno);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	fprintf (stderr, "Table (%u) = %lu, %lu\n",
 | 
			
		||||
		 TABLE_UPTIME, tbl.uptime.uptime, tbl.uptime.idle);
 | 
			
		||||
	
 | 
			
		||||
	exit (0);
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										1
									
								
								kernel/version.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								kernel/version.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
			
		||||
#define _TABLE_VERSION	1
 | 
			
		||||
@@ -32,3 +32,4 @@ sysinfo.lo
 | 
			
		||||
uptime.lo
 | 
			
		||||
write.lo
 | 
			
		||||
xmalloc.lo
 | 
			
		||||
lib.c
 | 
			
		||||
 
 | 
			
		||||
@@ -8,10 +8,16 @@ CFLAGS				= -Wall -W @CFLAGS@ -DGTOP_SERVER=\""@LIBGTOP_SERVER@"\"
 | 
			
		||||
 | 
			
		||||
lib_LTLIBRARIES			= libgtop.la
 | 
			
		||||
 | 
			
		||||
libgtop_la_SOURCES		= init.c open.c close.c read.c read_data.c \
 | 
			
		||||
				  write.c command.c cpu.c mem.c swap.c uptime.c \
 | 
			
		||||
				  loadavg.c shm_limits.c msg_limits.c \
 | 
			
		||||
				  sem_limits.c proclist.c procstate.c procuid.c \
 | 
			
		||||
				  proctime.c procmem.c procsignal.c prockernel.c \
 | 
			
		||||
				  procsegment.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
 | 
			
		||||
 | 
			
		||||
lib.c: lib.awk $(top_builddir)/config.h $(top_srcdir)/features.def
 | 
			
		||||
	$(AWK) -f $(srcdir)/lib.awk < $(top_srcdir)/features.def > lib-t
 | 
			
		||||
	mv lib-t lib.c
 | 
			
		||||
 | 
			
		||||
EXTRA_DIST			= lib.awk
 | 
			
		||||
 | 
			
		||||
CLEANFILES			= lib.c
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										26
									
								
								lib/close.c
									
									
									
									
									
								
							
							
						
						
									
										26
									
								
								lib/close.c
									
									
									
									
									
								
							@@ -19,14 +19,30 @@
 | 
			
		||||
   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
 | 
			
		||||
   Boston, MA 02111-1307, USA.  */
 | 
			
		||||
 | 
			
		||||
#include <glibtop.h>
 | 
			
		||||
#include <glibtop/open.h>
 | 
			
		||||
#include <glibtop/close.h>
 | 
			
		||||
#include <glibtop/command.h>
 | 
			
		||||
 | 
			
		||||
/* Closes pipe to gtop server. */
 | 
			
		||||
/* Closes server. */
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
glibtop_close (glibtop *server)
 | 
			
		||||
glibtop_close_r (glibtop *server)
 | 
			
		||||
{
 | 
			
		||||
	kill (server->pid, SIGKILL);
 | 
			
		||||
	close (server->input [0]);
 | 
			
		||||
	close (server->output [1]);
 | 
			
		||||
	switch (server->method) {
 | 
			
		||||
	case GLIBTOP_METHOD_UNIX:
 | 
			
		||||
	case GLIBTOP_METHOD_INET:
 | 
			
		||||
		glibtop_call_l (server, GLIBTOP_CMND_QUIT,
 | 
			
		||||
				0, NULL, 0, NULL);
 | 
			
		||||
 | 
			
		||||
		if (close (server->socket))
 | 
			
		||||
			glibtop_warn_io ("close");
 | 
			
		||||
 | 
			
		||||
		break;
 | 
			
		||||
	case GLIBTOP_METHOD_PIPE:
 | 
			
		||||
		kill (server->pid, SIGKILL);
 | 
			
		||||
		close (server->input [0]);
 | 
			
		||||
		close (server->output [1]);
 | 
			
		||||
		break;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -27,28 +27,51 @@
 | 
			
		||||
#include <glibtop/xmalloc.h>
 | 
			
		||||
 | 
			
		||||
void *
 | 
			
		||||
glibtop_call__r (glibtop *server, unsigned command, size_t send_size, void *send_buf,
 | 
			
		||||
		 size_t recv_size, void *recv_buf)
 | 
			
		||||
glibtop_call_l (glibtop *server, unsigned command, size_t send_size,
 | 
			
		||||
		void *send_buf, size_t recv_size, void *recv_buf)
 | 
			
		||||
{
 | 
			
		||||
	glibtop_command *cmnd;
 | 
			
		||||
	void *ptr;
 | 
			
		||||
	glibtop_command cmnd;
 | 
			
		||||
	glibtop_response response;
 | 
			
		||||
 | 
			
		||||
	glibtop_init__r (&server);
 | 
			
		||||
	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. */
 | 
			
		||||
 | 
			
		||||
	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__r (server, sizeof (glibtop_command), cmnd);
 | 
			
		||||
	glibtop_write__r (server, send_size, send_buf);
 | 
			
		||||
	glibtop_read__r  (server, recv_size, recv_buf);
 | 
			
		||||
	
 | 
			
		||||
	ptr = glibtop_read_data__r (server);
 | 
			
		||||
	
 | 
			
		||||
	glibtop_free__r (server, cmnd);
 | 
			
		||||
	
 | 
			
		||||
	return ptr;
 | 
			
		||||
	glibtop_write_l (server, sizeof (glibtop_command), &cmnd);
 | 
			
		||||
 | 
			
		||||
	glibtop_read_l (server, sizeof (glibtop_response), &response);
 | 
			
		||||
 | 
			
		||||
#ifdef DEBUG
 | 
			
		||||
	fprintf (stderr, "RESPONSE: %lu - %d\n",
 | 
			
		||||
		 response.offset, response.data_size);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
	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;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										173
									
								
								lib/init.c
									
									
									
									
									
								
							
							
						
						
									
										173
									
								
								lib/init.c
									
									
									
									
									
								
							@@ -20,21 +20,174 @@
 | 
			
		||||
   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 if (!strcmp (command, "unix")) {
 | 
			
		||||
 | 
			
		||||
		/* Connect to unix domain socket. */
 | 
			
		||||
		server->method = GLIBTOP_METHOD_UNIX;
 | 
			
		||||
 | 
			
		||||
	} else if (!strcmp (command, "pipe")) {
 | 
			
		||||
 | 
			
		||||
		/* Open pipe to server. */
 | 
			
		||||
		server->method = GLIBTOP_METHOD_PIPE;
 | 
			
		||||
 | 
			
		||||
	} else {
 | 
			
		||||
 | 
			
		||||
		glibtop_error_r (server, "Unknown server method '%s'",
 | 
			
		||||
				 server->server_command+1);
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
			
 | 
			
		||||
	glibtop_free_r (server, command);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
glibtop *
 | 
			
		||||
glibtop_init__r (glibtop **server)
 | 
			
		||||
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 (glibtop_global_server, "glibtop");
 | 
			
		||||
	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;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										55
									
								
								lib/lib.awk
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										55
									
								
								lib/lib.awk
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,55 @@
 | 
			
		||||
BEGIN {
 | 
			
		||||
  print "/* lib.c */";
 | 
			
		||||
  print "/* This is a generated file.  Please modify `lib.awk' */";
 | 
			
		||||
  print "";
 | 
			
		||||
 | 
			
		||||
  print "#include <glibtop.h>";
 | 
			
		||||
  print "#include <glibtop/open.h>";
 | 
			
		||||
  print "#include <glibtop/sysdeps.h>";
 | 
			
		||||
  print "#include <glibtop/command.h>";
 | 
			
		||||
 | 
			
		||||
  print "";
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function output(feature) {
 | 
			
		||||
  if (feature ~ /^proclist$/) {
 | 
			
		||||
    print "unsigned *";
 | 
			
		||||
    prefix = "return ";
 | 
			
		||||
  } else {
 | 
			
		||||
    prefix = "";
 | 
			
		||||
    print "void";
 | 
			
		||||
  }
 | 
			
		||||
  if (feature ~ /^proc_/) {
 | 
			
		||||
    param = ", pid_t pid";
 | 
			
		||||
  } else {
 | 
			
		||||
    param = "";
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  print "glibtop_get_"feature"_l (glibtop *server, glibtop_"feature" *buf"param")";
 | 
			
		||||
  print "{";
 | 
			
		||||
  print "\tglibtop_init_r (&server, GLIBTOP_SYSDEPS_"toupper(feature)", 0);";
 | 
			
		||||
  print "";
 | 
			
		||||
  print "\tif ((server->flags & _GLIBTOP_INIT_STATE_SERVER) &&";
 | 
			
		||||
  print "\t    (server->features & (1 << GLIBTOP_SYSDEPS_"toupper(feature)")))";
 | 
			
		||||
  print "\t{";
 | 
			
		||||
 | 
			
		||||
  if (feature ~ /^proc_/) {
 | 
			
		||||
    print "\t\t"prefix"glibtop_call_l (server, GLIBTOP_CMND_"toupper(feature)", sizeof (pid_t),";
 | 
			
		||||
    print "\t\t\t\t&pid, sizeof (glibtop_"feature"), buf);";
 | 
			
		||||
    print "\t} else {";
 | 
			
		||||
    print "\t\t"prefix"glibtop_get_"feature"_r (server, buf, pid);";
 | 
			
		||||
  } else {
 | 
			
		||||
    print "\t\t"prefix"glibtop_call_l (server, GLIBTOP_CMND_"toupper(feature)", 0, NULL,";
 | 
			
		||||
    print "\t\t\t  sizeof (glibtop_"feature"), buf);";
 | 
			
		||||
    print "\t} else {";
 | 
			
		||||
    print "\t\t"prefix"glibtop_get_"feature"_r (server, buf);";
 | 
			
		||||
  }
 | 
			
		||||
  print "\t}";
 | 
			
		||||
  print "}";
 | 
			
		||||
  print "";
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/^(\w+)/	{ output($1) }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										127
									
								
								lib/open.c
									
									
									
									
									
								
							
							
						
						
									
										127
									
								
								lib/open.c
									
									
									
									
									
								
							@@ -19,42 +19,123 @@
 | 
			
		||||
   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
 | 
			
		||||
   Boston, MA 02111-1307, USA.  */
 | 
			
		||||
 | 
			
		||||
#include <glibtop.h>
 | 
			
		||||
#include <glibtop/open.h>
 | 
			
		||||
#include <glibtop/sysdeps.h>
 | 
			
		||||
#include <glibtop/command.h>
 | 
			
		||||
#include <glibtop/xmalloc.h>
 | 
			
		||||
 | 
			
		||||
#include <glibtop/gnuserv.h>
 | 
			
		||||
 | 
			
		||||
/* Opens pipe to gtop server. Returns 0 on success and -1 on error. */
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
glibtop_open (glibtop *server, const char *program_name)
 | 
			
		||||
glibtop_open_l (glibtop *server, const char *program_name,
 | 
			
		||||
		const unsigned long features, const unsigned flags)
 | 
			
		||||
{
 | 
			
		||||
	char	version [BUFSIZ], buffer [BUFSIZ];
 | 
			
		||||
 | 
			
		||||
	memset (server, 0, sizeof (glibtop));
 | 
			
		||||
	char version [BUFSIZ], buffer [BUFSIZ];
 | 
			
		||||
	int connect_type;
 | 
			
		||||
	unsigned nbytes;
 | 
			
		||||
 | 
			
		||||
	server->name = program_name;
 | 
			
		||||
 | 
			
		||||
	if (pipe (server->input) || pipe (server->output))
 | 
			
		||||
		glibtop_error__r (server, _("cannot make a pipe: %s\n"), strerror (errno));
 | 
			
		||||
	/* It is important to set _GLIBTOP_INIT_STATE_OPEN here when we
 | 
			
		||||
	 * do recursive calls to glibtop_init_r (). */
 | 
			
		||||
 | 
			
		||||
	server->pid  = fork ();
 | 
			
		||||
	server->flags |= _GLIBTOP_INIT_STATE_OPEN;
 | 
			
		||||
 | 
			
		||||
	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);
 | 
			
		||||
		execl (GTOP_SERVER, NULL);
 | 
			
		||||
		_exit (2);
 | 
			
		||||
	switch (server->method) {
 | 
			
		||||
	case GLIBTOP_METHOD_DIRECT:
 | 
			
		||||
		fprintf (stderr, "Calling sysdeps open function.\n");
 | 
			
		||||
 | 
			
		||||
		glibtop_open_r (server, program_name, features, flags);
 | 
			
		||||
 | 
			
		||||
		break;
 | 
			
		||||
	case GLIBTOP_METHOD_INET:
 | 
			
		||||
		fprintf (stderr, "Connecting to '%s' port %ld.\n",
 | 
			
		||||
			 server->server_host, server->server_port);
 | 
			
		||||
		
 | 
			
		||||
		connect_type = glibtop_make_connection
 | 
			
		||||
			(server->server_host, server->server_port,
 | 
			
		||||
			 &server->socket);
 | 
			
		||||
 | 
			
		||||
		fprintf (stderr, "Connect Type is %d.\n", connect_type);
 | 
			
		||||
 | 
			
		||||
		server->flags |= _GLIBTOP_INIT_STATE_SERVER;
 | 
			
		||||
		
 | 
			
		||||
		server->features = -1;
 | 
			
		||||
		break;
 | 
			
		||||
	case GLIBTOP_METHOD_UNIX:
 | 
			
		||||
		fprintf (stderr, "Connecting to Unix Domain Socket.\n");
 | 
			
		||||
 | 
			
		||||
		connect_type = glibtop_make_connection
 | 
			
		||||
			("unix", 0, &server->socket);
 | 
			
		||||
		
 | 
			
		||||
		fprintf (stderr, "Connect Type is %d.\n", connect_type);
 | 
			
		||||
 | 
			
		||||
		server->flags |= _GLIBTOP_INIT_STATE_SERVER;
 | 
			
		||||
 | 
			
		||||
		server->features = -1;
 | 
			
		||||
		break;
 | 
			
		||||
	case GLIBTOP_METHOD_PIPE:
 | 
			
		||||
		fprintf (stderr, "Opening pipe to server (%s).\n",
 | 
			
		||||
			 GTOP_SERVER);
 | 
			
		||||
 | 
			
		||||
#if 0
 | 
			
		||||
		if (socketpair (AF_UNIX, SOCK_STREAM, 0, server->input))
 | 
			
		||||
			glibtop_error_io_r (server, "socketpair");
 | 
			
		||||
 | 
			
		||||
		if (socketpair (AF_UNIX, SOCK_STREAM, 0, server->output))
 | 
			
		||||
			glibtop_error_io_r (server, "socketpair");
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
		if (pipe (server->input) || pipe (server->output))
 | 
			
		||||
			glibtop_error_io_r (server, "cannot make a pipe");
 | 
			
		||||
 | 
			
		||||
		server->pid  = fork ();
 | 
			
		||||
		
 | 
			
		||||
		if (server->pid < 0) {
 | 
			
		||||
			glibtop_error_io_r (server, "fork failed");
 | 
			
		||||
		} else if (server->pid == 0) {
 | 
			
		||||
			close (0); close (1);
 | 
			
		||||
			close (server->input [0]); close (server->output [1]);
 | 
			
		||||
			dup2 (server->input [1], 1);
 | 
			
		||||
			dup2 (server->output [0], 0);
 | 
			
		||||
			execl (GTOP_SERVER, NULL);
 | 
			
		||||
			glibtop_error_io_r (server, "execl %s", GTOP_SERVER);
 | 
			
		||||
			_exit (2);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		close (server->input [1]);
 | 
			
		||||
		close (server->output [0]);
 | 
			
		||||
 | 
			
		||||
		sprintf (version, "%s server %s ready.\n", PACKAGE, VERSION);
 | 
			
		||||
 | 
			
		||||
		glibtop_read_l (server, sizeof (nbytes), &nbytes);
 | 
			
		||||
 | 
			
		||||
		if (nbytes != strlen (version))
 | 
			
		||||
			glibtop_error_r (server, "Requested %u bytes but got %u",
 | 
			
		||||
					 strlen (version), nbytes);
 | 
			
		||||
		
 | 
			
		||||
		glibtop_read_l (server, nbytes, buffer);
 | 
			
		||||
		
 | 
			
		||||
		if (memcmp (version, buffer, strlen (version)))
 | 
			
		||||
			glibtop_error_r (server, "server version is not %s",
 | 
			
		||||
					 VERSION);
 | 
			
		||||
		break;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	close (server->input [1]);
 | 
			
		||||
	close (server->output [0]);
 | 
			
		||||
	/* If the server has been started, ask it for its features. */
 | 
			
		||||
 | 
			
		||||
	sprintf (version, "%s server %s ready.\n", PACKAGE, VERSION);
 | 
			
		||||
	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;
 | 
			
		||||
 | 
			
		||||
	glibtop_read__r (server, strlen (version), buffer);
 | 
			
		||||
 | 
			
		||||
	if (memcmp (version, buffer, strlen (version)))
 | 
			
		||||
		glibtop_error__r (server, _("server version is not %s"), VERSION);
 | 
			
		||||
		fprintf (stderr, "Server features are %lu.\n",
 | 
			
		||||
			 server->features);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										80
									
								
								lib/parameter.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										80
									
								
								lib/parameter.c
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,80 @@
 | 
			
		||||
/* $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 _check_data(size)	\
 | 
			
		||||
	if ((data_ptr == NULL) || (data_size != size)) { \
 | 
			
		||||
		glibtop_error_r (server, "glibtop_set_parameter (%d): " \
 | 
			
		||||
				 "Expected %lu bytes but got %lu.", \
 | 
			
		||||
				 parameter, size, data_size); \
 | 
			
		||||
		return; \
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
#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)
 | 
			
		||||
{
 | 
			
		||||
	switch (parameter) {
 | 
			
		||||
	case GLIBTOP_PARAM_METHOD:
 | 
			
		||||
		_check_data (sizeof (server->method));
 | 
			
		||||
		memcpy (&server->method, data_ptr, data_size);
 | 
			
		||||
		break;
 | 
			
		||||
	case GLIBTOP_PARAM_FEATURES:
 | 
			
		||||
		_check_data (sizeof (server->features));
 | 
			
		||||
		memcpy (&server->features, data_ptr, data_size);
 | 
			
		||||
		break;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
@@ -1,35 +0,0 @@
 | 
			
		||||
/* $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/prockernel.h>
 | 
			
		||||
#include <glibtop/command.h>
 | 
			
		||||
 | 
			
		||||
/* Provides detailed information about a process. */
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
glibtop_get_proc_kernel__r (glibtop *server, glibtop_proc_kernel *buf,
 | 
			
		||||
			   pid_t pid)
 | 
			
		||||
{
 | 
			
		||||
	glibtop_init__r (&server);
 | 
			
		||||
	glibtop_call__r (server, GLIBTOP_CMND_PROC_KERNEL, sizeof (pid_t),
 | 
			
		||||
			 &pid, sizeof (glibtop_proc_kernel), buf);
 | 
			
		||||
}
 | 
			
		||||
@@ -1,32 +0,0 @@
 | 
			
		||||
/* $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/proclist.h>
 | 
			
		||||
#include <glibtop/command.h>
 | 
			
		||||
 | 
			
		||||
/* Fetch list of currently running processes. */
 | 
			
		||||
 | 
			
		||||
unsigned *
 | 
			
		||||
glibtop_get_proclist__r (glibtop *server, glibtop_proclist *buf)
 | 
			
		||||
{
 | 
			
		||||
	glibtop_init__r (&server);
 | 
			
		||||
	return glibtop_call__r (server, GLIBTOP_CMND_PROCLIST, 0, NULL, sizeof (glibtop_proclist), buf);
 | 
			
		||||
}
 | 
			
		||||
@@ -1,35 +0,0 @@
 | 
			
		||||
/* $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/procsegment.h>
 | 
			
		||||
#include <glibtop/command.h>
 | 
			
		||||
 | 
			
		||||
/* Provides detailed information about a process. */
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
glibtop_get_proc_segment__r (glibtop *server, glibtop_proc_segment *buf,
 | 
			
		||||
			   pid_t pid)
 | 
			
		||||
{
 | 
			
		||||
	glibtop_init__r (&server);
 | 
			
		||||
	glibtop_call__r (server, GLIBTOP_CMND_PROC_SEGMENT, sizeof (pid_t),
 | 
			
		||||
			 &pid, sizeof (glibtop_proc_segment), buf);
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										55
									
								
								lib/read.c
									
									
									
									
									
								
							
							
						
						
									
										55
									
								
								lib/read.c
									
									
									
									
									
								
							@@ -23,19 +23,48 @@
 | 
			
		||||
 | 
			
		||||
/* Reads some data from server. */
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
glibtop_read__r (glibtop *server, size_t size, void *buf)
 | 
			
		||||
static void
 | 
			
		||||
do_read (int s, void *ptr, size_t total_size)
 | 
			
		||||
{
 | 
			
		||||
	size_t	ssize;
 | 
			
		||||
	int nread;
 | 
			
		||||
	size_t already_read = 0, remaining = total_size;
 | 
			
		||||
	
 | 
			
		||||
	while (already_read < total_size) {
 | 
			
		||||
		nread = recv (s, ptr, remaining, 0);
 | 
			
		||||
 | 
			
		||||
	glibtop_init__r (&server);
 | 
			
		||||
	
 | 
			
		||||
	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));
 | 
			
		||||
		if (nread == 0) {
 | 
			
		||||
			close (s);
 | 
			
		||||
			continue;
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		if (nread <= 0) {
 | 
			
		||||
			glibtop_error_io ("recv");
 | 
			
		||||
			return;
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		already_read += nread;
 | 
			
		||||
		remaining -= nread;
 | 
			
		||||
		(char *) ptr += nread;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
glibtop_read_l (glibtop *server, size_t size, void *buf)
 | 
			
		||||
{
 | 
			
		||||
	int ret = 0;
 | 
			
		||||
 | 
			
		||||
	glibtop_init_r (&server, 0, 0);
 | 
			
		||||
 | 
			
		||||
#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);
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -25,24 +25,43 @@
 | 
			
		||||
/* Reads some data from server. */
 | 
			
		||||
 | 
			
		||||
void *
 | 
			
		||||
glibtop_read_data__r (glibtop *server)
 | 
			
		||||
glibtop_read_data_l (glibtop *server)
 | 
			
		||||
{
 | 
			
		||||
	size_t	size;
 | 
			
		||||
	void *ptr;
 | 
			
		||||
	int ret;
 | 
			
		||||
 | 
			
		||||
	glibtop_init__r (&server);
 | 
			
		||||
	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;	
 | 
			
		||||
 | 
			
		||||
	fprintf (stderr, "Server has %d bytes of data.\n", size);
 | 
			
		||||
	ptr = glibtop_malloc_r (server, size);
 | 
			
		||||
	
 | 
			
		||||
	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;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										25
									
								
								lib/write.c
									
									
									
									
									
								
							
							
						
						
									
										25
									
								
								lib/write.c
									
									
									
									
									
								
							@@ -24,15 +24,24 @@
 | 
			
		||||
/* Writes some data to server. */
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
glibtop_write__r (glibtop *server, size_t size, void *buf)
 | 
			
		||||
glibtop_write_l (glibtop *server, size_t size, void *buf)
 | 
			
		||||
{
 | 
			
		||||
	glibtop_init__r (&server);
 | 
			
		||||
	int ret;
 | 
			
		||||
 | 
			
		||||
	if (write (server->output [1], &size, sizeof (size_t)) < 0)
 | 
			
		||||
		glibtop_error__r (server, _("write size: %s"), strerror (errno));
 | 
			
		||||
	glibtop_init_r (&server, 0, 0);
 | 
			
		||||
 | 
			
		||||
	if (!size) return;
 | 
			
		||||
	
 | 
			
		||||
	if (write (server->output [1], buf, size) < 0)
 | 
			
		||||
		glibtop_error__r (server, _("write %d bytes: %s"), size, strerror (errno));
 | 
			
		||||
	if (size == 0) return;
 | 
			
		||||
 | 
			
		||||
#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);
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										81
									
								
								libgtop.spec
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										81
									
								
								libgtop.spec
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,81 @@
 | 
			
		||||
# Note that this is NOT a relocatable package
 | 
			
		||||
%define ver      0.01
 | 
			
		||||
%define rel      SNAP
 | 
			
		||||
%define prefix   /usr
 | 
			
		||||
 | 
			
		||||
Summary: libgtop library
 | 
			
		||||
Name: libgtop
 | 
			
		||||
Version: %ver
 | 
			
		||||
Release: %rel
 | 
			
		||||
Copyright: LGPL
 | 
			
		||||
Group: X11/Libraries
 | 
			
		||||
Source: ftp://ftp.gnome.org/pub/libgtop-%{ver}.tar.gz
 | 
			
		||||
BuildRoot: /tmp/libgtop-root
 | 
			
		||||
Packager: Michael Fulbright <msf@redhat.com>
 | 
			
		||||
URL: http://www.gnome.org
 | 
			
		||||
Prereq: /sbin/install-info
 | 
			
		||||
Docdir: %{prefix}/doc
 | 
			
		||||
 | 
			
		||||
%description
 | 
			
		||||
 | 
			
		||||
A library that fetches 
 | 
			
		||||
information about the running system such as cpu and memory usage,
 | 
			
		||||
active processes etc. On Linux systems, these information are taken
 | 
			
		||||
directly from the /proc filesystem. 
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
%changelog
 | 
			
		||||
 | 
			
		||||
* Tue Jun  2 1998 Michael Fulbright <msf@redhat.com>
 | 
			
		||||
 | 
			
		||||
- first version of the RPM
 | 
			
		||||
 | 
			
		||||
%prep
 | 
			
		||||
%setup
 | 
			
		||||
 | 
			
		||||
%build
 | 
			
		||||
# Needed for snapshot releases.
 | 
			
		||||
if [ ! -f configure ]; then
 | 
			
		||||
  CFLAGS="$RPM_OPT_FLAGS" ./autogen.sh --prefix=%prefix --disable-libgtop-examples
 | 
			
		||||
else
 | 
			
		||||
  CFLAGS="$RPM_OPT_FLAGS" ./configure --prefix=%prefix --disable-libgtop-examples
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
if [ "$SMP" != "" ]; then
 | 
			
		||||
  (make "MAKE=make -k -j $SMP"; exit 0)
 | 
			
		||||
  make
 | 
			
		||||
else
 | 
			
		||||
  make
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
%install
 | 
			
		||||
rm -rf $RPM_BUILD_ROOT
 | 
			
		||||
 | 
			
		||||
make prefix=$RPM_BUILD_ROOT%{prefix} install
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
# msf - remove these as they are really supposed to come from gnome-libs
 | 
			
		||||
#
 | 
			
		||||
rm -f $RPM_BUILD_ROOT/%{prefix}/lib/libgnomesupport.a
 | 
			
		||||
rm -f $RPM_BUILD_ROOT/%{prefix}/lib/libgnomesupport.la
 | 
			
		||||
rm -f $RPM_BUILD_ROOT/%{prefix}/lib/libgnomesupport.so.0
 | 
			
		||||
rm -f $RPM_BUILD_ROOT/%{prefix}/lib/libgnomesupport.so.0.0.0
 | 
			
		||||
 | 
			
		||||
rm -fr $RPM_BUILD_ROOT/%{prefix}/include/libgtop
 | 
			
		||||
 | 
			
		||||
%clean
 | 
			
		||||
#rm -rf $RPM_BUILD_ROOT
 | 
			
		||||
 | 
			
		||||
%post -p /sbin/ldconfig
 | 
			
		||||
 | 
			
		||||
%postun -p /sbin/ldconfig
 | 
			
		||||
 | 
			
		||||
%files
 | 
			
		||||
%defattr(-, root, root)
 | 
			
		||||
 | 
			
		||||
%doc ANNOUNCE AUTHORS ChangeLog NEWS README README.LATEST copyright.txt doc
 | 
			
		||||
%{prefix}/bin/*
 | 
			
		||||
%{prefix}/lib/lib*.so.*
 | 
			
		||||
%{prefix}/lib/libgtopConf.sh
 | 
			
		||||
%{prefix}/lib/*a
 | 
			
		||||
%{prefix}/include/*
 | 
			
		||||
							
								
								
									
										111
									
								
								libproc/Makefile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										111
									
								
								libproc/Makefile
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,111 @@
 | 
			
		||||
# Auto-adaptive C library Makefile adapted for libproc, Chuck Blake.
 | 
			
		||||
# Assumptions are basically that all the .c files in the CWD are modules
 | 
			
		||||
# for the library and that all .h files are the interface to the library.
 | 
			
		||||
 | 
			
		||||
# PROJECT SPECIFIC MACROS
 | 
			
		||||
NAME       =  proc
 | 
			
		||||
 | 
			
		||||
# INSTALLATION OPTIONS
 | 
			
		||||
TOPDIR     = /usr
 | 
			
		||||
HDRDIR     = $(TOPDIR)/include/$(NAME)#	where to put .h files
 | 
			
		||||
LIBDIR     = $(TOPDIR)/lib#		where to put library files
 | 
			
		||||
SHLIBDIR   = /lib#			where to put shared library files
 | 
			
		||||
HDROWN     = -o root -g root #		owner of header files
 | 
			
		||||
LIBOWN     = -o root -g root #		owner of library files
 | 
			
		||||
INSTALL    = install
 | 
			
		||||
 | 
			
		||||
# COMPILATION OPTIONS
 | 
			
		||||
CC         =  gcc -O2 -D_GNU_SOURCE #-ggdb # easy to command-line override
 | 
			
		||||
CFLAGS     =  -I.. -Wall
 | 
			
		||||
 | 
			
		||||
# ----------------------------------------------------------------#
 | 
			
		||||
# The rest is the auto-magic section -- highly GNU make dependent #
 | 
			
		||||
# You should never need to edit this.                             #
 | 
			
		||||
# ----------------------------------------------------------------#
 | 
			
		||||
 | 
			
		||||
VC_SUF     =  ,v
 | 
			
		||||
VC_PFX     =  RCS/
 | 
			
		||||
RCSFILES   =  $(patsubst $(VC_PFX)%$(VC_SUF),%,$(wildcard $(VC_PFX)*$(VC_SUF)))
 | 
			
		||||
 | 
			
		||||
# We take the union of RCS files and other files in CWD so that new files do
 | 
			
		||||
# not need to alter this makefile.  'sort' removes duplicates.  This allows the
 | 
			
		||||
# convenience of compiling and testing new files before the initial check-in.
 | 
			
		||||
 | 
			
		||||
SRC        =  $(sort $(wildcard *.c) $(filter %.c,$(RCSFILES)))
 | 
			
		||||
HDR        =  $(sort $(wildcard *.h) $(filter %.h,$(RCSFILES)))
 | 
			
		||||
 | 
			
		||||
OBJ        =  $(SRC:.c=.o)
 | 
			
		||||
SONAME     =  lib$(NAME).so.$(LIBVERSION)
 | 
			
		||||
 | 
			
		||||
ifeq ($(SHARED),1)
 | 
			
		||||
CFLAGS += -fpic
 | 
			
		||||
all: lib$(NAME).a $(SONAME)
 | 
			
		||||
else
 | 
			
		||||
all: lib$(NAME).a
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
lib$(NAME).a: $(OBJ)
 | 
			
		||||
	$(AR) rcs $@ $^
 | 
			
		||||
 | 
			
		||||
$(SONAME): $(OBJ)
 | 
			
		||||
	gcc -Wl,-shared -Wl,-soname,$(SONAME) -o $@ $^ -lc
 | 
			
		||||
	ln -sf $(SONAME) lib$(NAME).so
 | 
			
		||||
 | 
			
		||||
# AUTOMATIC DEPENDENCY GENERATION -- GCC AND GNUMAKE DEPENDENT
 | 
			
		||||
 | 
			
		||||
.depend:
 | 
			
		||||
	$(strip $(CC) $(CFLAGS) -MM -MG $(SRC) > .depend)
 | 
			
		||||
include .depend
 | 
			
		||||
 | 
			
		||||
# INSTALLATION
 | 
			
		||||
 | 
			
		||||
install: all
 | 
			
		||||
	if ! [ -d $(HDRDIR) ] ; then mkdir $(HDRDIR) ; fi
 | 
			
		||||
	$(INSTALL) $(HDROWN) $(HDR) $(TOPDIR)/include/$(NAME)
 | 
			
		||||
	$(INSTALL) $(LIBOWN) lib$(NAME).a $(LIBDIR)
 | 
			
		||||
ifeq ($(SHARED),1)
 | 
			
		||||
	$(INSTALL) $(LIBOWN) $(SONAME) $(SHLIBDIR)
 | 
			
		||||
	ln -sf $(SHLIBDIR)/$(SONAME) $(SHLIBDIR)/lib$(NAME).so
 | 
			
		||||
	ldconfig
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
# VARIOUS SHORT CUT TARGETS
 | 
			
		||||
.PHONY:	all install dep clean distclean checkout checkclean
 | 
			
		||||
 | 
			
		||||
dep:	.depend
 | 
			
		||||
 | 
			
		||||
clean:
 | 
			
		||||
	$(RM) lib$(NAME).* *.o
 | 
			
		||||
 | 
			
		||||
distclean:	clean
 | 
			
		||||
	$(RM) .depend signames.h
 | 
			
		||||
 | 
			
		||||
checkout:
 | 
			
		||||
	$(CO) $(RCSFILES)
 | 
			
		||||
 | 
			
		||||
checkclean:
 | 
			
		||||
	$(RM) $(RCSFILES)
 | 
			
		||||
 | 
			
		||||
# CUSTOM c -> o rule so that command-line has minimal whitespace
 | 
			
		||||
 | 
			
		||||
%.o : %.c
 | 
			
		||||
	$(strip $(CC) $(CFLAGS) -c $<)
 | 
			
		||||
 | 
			
		||||
# PROJECT SPECIFIC DEPENDENCIES/BUILD RULES
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
version.o:	version.c version.h
 | 
			
		||||
ifdef MINORVERSION
 | 
			
		||||
	$(strip $(CC) $(CFLAGS) -DVERSION=\"$(VERSION)\" -DSUBVERSION=\"$(SUBVERSION)\" -DMINORVERSION=\"$(MINORVERSION)\" -c version.c)
 | 
			
		||||
else
 | 
			
		||||
	$(strip $(CC) $(CFLAGS) -DVERSION=\"$(VERSION)\" -DSUBVERSION=\"$(SUBVERSION)\" -c version.c)
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
signals.o : signames.h
 | 
			
		||||
 | 
			
		||||
signames.h ../proc/signames.h : /usr/include/signal.h
 | 
			
		||||
	/lib/cpp -dM </usr/include/signal.h |	\
 | 
			
		||||
	tr -s '\t ' '  ' | sort -n +2 | sed		\
 | 
			
		||||
	's:#define SIG\([A-Z]\+[0-9]*\) \([0-9]\+\) *\(\|/\*.*\)$$:{\
 | 
			
		||||
\2,"\1" },:p;d'  > signames.h
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										49
									
								
								libproc/alloc.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										49
									
								
								libproc/alloc.c
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,49 @@
 | 
			
		||||
/***********************************************************************\
 | 
			
		||||
*   Copyright (C) 1992 by Michael K. Johnson, johnsonm@sunsite.unc.edu	*
 | 
			
		||||
*									*
 | 
			
		||||
*	This file is placed under the conditions of the GNU public	*
 | 
			
		||||
*	license, version 2, or any later version.  See file COPYING	*
 | 
			
		||||
*	for information on distribution conditions.			*
 | 
			
		||||
\***********************************************************************/
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
 | 
			
		||||
void *xcalloc(void *pointer, int size) {
 | 
			
		||||
    void * ret;
 | 
			
		||||
    if (pointer)
 | 
			
		||||
        free(pointer);
 | 
			
		||||
    if (!(ret = calloc(1, size))) {
 | 
			
		||||
        fprintf(stderr, "xcalloc: allocation error, size = %d\n", size);
 | 
			
		||||
        exit(1);
 | 
			
		||||
    } else {
 | 
			
		||||
        return ret;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void *xmalloc(unsigned int size) {
 | 
			
		||||
    void *p;
 | 
			
		||||
 | 
			
		||||
    if (size == 0)
 | 
			
		||||
        ++size;
 | 
			
		||||
    p = malloc(size);
 | 
			
		||||
    if (!p) {
 | 
			
		||||
	fprintf(stderr, "xmalloc: malloc(%d) failed", size);
 | 
			
		||||
	perror(NULL);
 | 
			
		||||
	exit(1);
 | 
			
		||||
    }
 | 
			
		||||
    return(p);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void *xrealloc(void *oldp, unsigned int size) {
 | 
			
		||||
    void *p;
 | 
			
		||||
 | 
			
		||||
    if (size == 0)
 | 
			
		||||
        ++size;
 | 
			
		||||
    p = realloc(oldp, size);
 | 
			
		||||
    if (!p) {
 | 
			
		||||
	fprintf(stderr, "xrealloc: realloc(%d) failed", size);
 | 
			
		||||
	perror(NULL);
 | 
			
		||||
	exit(1);
 | 
			
		||||
    }
 | 
			
		||||
    return(p);
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										307
									
								
								libproc/compare.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										307
									
								
								libproc/compare.c
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,307 @@
 | 
			
		||||
/*
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright 1994 Charles Blake and Michael K. Johnson
 | 
			
		||||
 * This file is a part of procps, which is distributable
 | 
			
		||||
 * under the conditions of the GNU Public License.  See the
 | 
			
		||||
 * file COPYING for details.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include <string.h>		/* for strcmp */
 | 
			
		||||
#include <stdio.h>		/* for parse error output */
 | 
			
		||||
#include "proc/readproc.h"	/* for proc_t */
 | 
			
		||||
#include "proc/tree.h"		/* for struct tree_node */
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
  This module was written by Charles Blake for procps.
 | 
			
		||||
 | 
			
		||||
mult_lvl_cmp:
 | 
			
		||||
    slick general purpose multi-level compare function I invented.
 | 
			
		||||
sort_depth:
 | 
			
		||||
    the number of levels of functions *to use*.  This means many more levels
 | 
			
		||||
    can be defined than mult_lvl_cmp tres out.  If this is 1 then mult_lvl_cmp
 | 
			
		||||
    is just a trivial wrapper around (*sort_function[0]).
 | 
			
		||||
sort_direction:
 | 
			
		||||
    multiplicative factor for the output of cmp_whatever.
 | 
			
		||||
    1 ==> default order, -1 ==> reverse order, 0 ==> forced equality
 | 
			
		||||
    The 0 bit is the neat part.  Since a value of zero is the code for equality
 | 
			
		||||
    multiplying the output of cmp_foo(a,b) forces a==b to be true.  This is a
 | 
			
		||||
    convenient way to turn sorting off in middle levels of a multi-level sort.
 | 
			
		||||
    If time is a problem, reforming the whole sort_function array to not include
 | 
			
		||||
    these unsorted middle levels will be faster since then cmp_foo won't even
 | 
			
		||||
    be called.  It might simplify some code depending upon how you organize it.
 | 
			
		||||
sort_function[]:
 | 
			
		||||
    array of function pointers that points to our family of comparison functions
 | 
			
		||||
    (I have named them cmp_* but mult_lvl_cmp doesn't care what they're named).
 | 
			
		||||
    This may be declared and initialized like so:
 | 
			
		||||
       int (*sort_function[])(void* a, void* b)={&cmp_foo, &cmp_bar, &cmp_hiho};
 | 
			
		||||
    You could also use my command line '-O' parser below.
 | 
			
		||||
 | 
			
		||||
Note that we only descend levels until the order is determined.  If we descend
 | 
			
		||||
all levels, that means that the items are equal at all levels, so we return 0.
 | 
			
		||||
Otherwise we return whatever the level's cmp_foo function would have returned.
 | 
			
		||||
This allows whatever default behavior you want for cmp_foo.  sort_direction[]
 | 
			
		||||
reverses this default behavior, but mult_lvl_cmp doesn't decide that ascending
 | 
			
		||||
or descending is the default.  That is the job of your cmp_foo's.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
/* the only reason these are global is because qsort(3) likes it that way.
 | 
			
		||||
   It's also a little more efficient if mult_lvl_cmp() is called many times.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
typedef int (*cmp_t)(void*,void*);	/* for function pointer casts */
 | 
			
		||||
 | 
			
		||||
int sort_depth = 0;
 | 
			
		||||
int sort_direction[10];     /* storage for 10 levels, but 4 would be plenty!*/
 | 
			
		||||
int (*sort_function[10])(void* a, void* b);
 | 
			
		||||
 | 
			
		||||
int mult_lvl_cmp(void* a, void* b) {
 | 
			
		||||
    int i, cmp_val;
 | 
			
		||||
    for(i = 0; i < sort_depth; i++) {
 | 
			
		||||
        cmp_val = sort_direction[i] * (*sort_function[i])(a,b);
 | 
			
		||||
        if (cmp_val != 0)
 | 
			
		||||
            return cmp_val;
 | 
			
		||||
    }
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int node_mult_lvl_cmp(void* a, void* b) {
 | 
			
		||||
    int i, cmp_val;
 | 
			
		||||
    for(i = 0; i < sort_depth; i++) {
 | 
			
		||||
        cmp_val = sort_direction[i] * (*sort_function[i])(&(((struct tree_node *)a)->proc),&(((struct tree_node *)b)->proc));
 | 
			
		||||
        if (cmp_val != 0)
 | 
			
		||||
            return cmp_val;
 | 
			
		||||
    }
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* qsort(3) compliant comparison functions for all members of the ps_proc
 | 
			
		||||
   structure (in the same order in which they appear in the proc_t declaration)
 | 
			
		||||
   return is {-1,0,1} as {a<b, a==b, a>b}
 | 
			
		||||
   default ordering is ascending for all members. (flip 1,-1 to reverse)
 | 
			
		||||
*/
 | 
			
		||||
/* pre-processor macros to cut down on source size (and typing!)
 | 
			
		||||
   Note the use of the string concatenation operator ##
 | 
			
		||||
*/
 | 
			
		||||
#define CMP_STR(NAME) \
 | 
			
		||||
int cmp_ ## NAME(proc_t** P, proc_t** Q) { \
 | 
			
		||||
    return strcmp((*P)-> ## NAME, (*Q)-> ## NAME); \
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#define CMP_INT(NAME) \
 | 
			
		||||
int cmp_ ## NAME (proc_t** P, proc_t** Q) { \
 | 
			
		||||
    if ((*P)-> ## NAME < (*Q)-> ## NAME) return -1; \
 | 
			
		||||
    if ((*P)-> ## NAME > (*Q)-> ## NAME) return  1; \
 | 
			
		||||
    return 0; \
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Define the (46!) cmp_ functions with the above macros for every element
 | 
			
		||||
   of proc_t.  If the binary gets too big, we could nuke inessentials.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
/* CMP_STR(cmdline) */
 | 
			
		||||
CMP_STR(user)
 | 
			
		||||
CMP_STR(cmd)
 | 
			
		||||
/* CMP_INT(state) */
 | 
			
		||||
/* CMP_STR(ttyc) */
 | 
			
		||||
CMP_INT(uid)
 | 
			
		||||
CMP_INT(pid)
 | 
			
		||||
CMP_INT(ppid)
 | 
			
		||||
CMP_INT(pgrp)
 | 
			
		||||
CMP_INT(session)
 | 
			
		||||
CMP_INT(tty)
 | 
			
		||||
CMP_INT(tpgid)
 | 
			
		||||
CMP_INT(utime)
 | 
			
		||||
CMP_INT(stime)
 | 
			
		||||
CMP_INT(cutime)
 | 
			
		||||
CMP_INT(cstime)
 | 
			
		||||
/* CMP_INT(priority) */
 | 
			
		||||
CMP_INT(nice)
 | 
			
		||||
CMP_INT(start_time)
 | 
			
		||||
/* CMP_INT(signal) */
 | 
			
		||||
/* CMP_INT(blocked) */
 | 
			
		||||
/* CMP_INT(sigignore) */
 | 
			
		||||
/* CMP_INT(sigcatch) */
 | 
			
		||||
CMP_INT(flags)
 | 
			
		||||
CMP_INT(min_flt)
 | 
			
		||||
CMP_INT(cmin_flt)
 | 
			
		||||
CMP_INT(maj_flt)
 | 
			
		||||
CMP_INT(cmaj_flt)
 | 
			
		||||
/* CMP_INT(timeout) */
 | 
			
		||||
CMP_INT(vsize)
 | 
			
		||||
CMP_INT(rss)
 | 
			
		||||
/* CMP_INT(rss_rlim) */
 | 
			
		||||
/* CMP_INT(start_code) */
 | 
			
		||||
/* CMP_INT(end_code) */
 | 
			
		||||
/* CMP_INT(start_stack) */
 | 
			
		||||
/* CMP_INT(kstk_esp) */
 | 
			
		||||
/* CMP_INT(kstk_eip) */
 | 
			
		||||
/* CMP_INT(wchan) */
 | 
			
		||||
CMP_INT(pcpu)
 | 
			
		||||
CMP_INT(size)
 | 
			
		||||
CMP_INT(resident)
 | 
			
		||||
CMP_INT(share)
 | 
			
		||||
/* CMP_INT(trs) */
 | 
			
		||||
/* CMP_INT(lrs) */
 | 
			
		||||
/* CMP_INT(drs) */
 | 
			
		||||
/* CMP_INT(dt) */
 | 
			
		||||
 | 
			
		||||
/* define user interface to sort keys.  Fairly self-explanatory. */
 | 
			
		||||
 | 
			
		||||
struct cmp_fun_struct {
 | 
			
		||||
    char letter;                           /* single option-letter for key */
 | 
			
		||||
    char name[15];                             /* long option name for key */
 | 
			
		||||
    int (*fun)(proc_t**, proc_t**);  /* pointer to cmp_key */
 | 
			
		||||
} cmp[] = {
 | 
			
		||||
/*  { '?', "cmdline",       &cmp_cmdline       }, */
 | 
			
		||||
    { 'u', "user",          &cmp_user          },
 | 
			
		||||
    { 'c', "cmd",           &cmp_cmd           },
 | 
			
		||||
/*  { '?', "state",         &cmp_state         }, */
 | 
			
		||||
/*  { '?', "ttyc",          &cmp_ttyc          }, */
 | 
			
		||||
    { 'U', "uid",           &cmp_uid           },
 | 
			
		||||
    { 'p', "pid",           &cmp_pid           },
 | 
			
		||||
    { 'P', "ppid",          &cmp_ppid          },
 | 
			
		||||
    { 'g', "pgrp",          &cmp_pgrp          },
 | 
			
		||||
    { 'o', "session",       &cmp_session       },
 | 
			
		||||
    { 't', "tty",           &cmp_tty           },
 | 
			
		||||
    { 'G', "tpgid",         &cmp_tpgid         },
 | 
			
		||||
    { 'k', "utime",         &cmp_utime         },
 | 
			
		||||
    { 'K', "stime",         &cmp_stime         },
 | 
			
		||||
    { 'j', "cutime",        &cmp_cutime        },
 | 
			
		||||
    { 'J', "cstime",        &cmp_cstime        },
 | 
			
		||||
/*  { '?', "counter",       &cmp_counter       }, */
 | 
			
		||||
    { 'y', "priority",      &cmp_nice          },
 | 
			
		||||
    { 'T', "start_time",    &cmp_start_time    },
 | 
			
		||||
/*  { '?', "signal",        &cmp_signal        }, */
 | 
			
		||||
/*  { '?', "blocked",       &cmp_blocked       }, */
 | 
			
		||||
/*  { '?', "sigignore",     &cmp_sigignore     }, */
 | 
			
		||||
/*  { '?', "sigcatch",      &cmp_sigcatch      }, */
 | 
			
		||||
    { 'f', "flags",         &cmp_flags         },
 | 
			
		||||
    { 'm', "min_flt",       &cmp_min_flt       },
 | 
			
		||||
    { 'n', "cmin_flt",      &cmp_cmin_flt      },
 | 
			
		||||
    { 'M', "maj_flt",       &cmp_maj_flt       },
 | 
			
		||||
    { 'N', "cmaj_flt",      &cmp_cmaj_flt      },
 | 
			
		||||
/*  { 'C', "timeout",       &cmp_timeout       }, */
 | 
			
		||||
    { 'v', "vsize",         &cmp_vsize         },
 | 
			
		||||
    { 'r', "rss",           &cmp_rss           },
 | 
			
		||||
/*  { '?', "rss_rlim",      &cmp_rss_rlim      }, */
 | 
			
		||||
/*  { '?', "start_code",    &cmp_start_code    }, */
 | 
			
		||||
/*  { '?', "end_code",      &cmp_end_code      }, */
 | 
			
		||||
/*  { '?', "start_stack",   &cmp_start_stack   }, */
 | 
			
		||||
/*  { '?', "kstk_esp",      &cmp_kstk_esp      }, */
 | 
			
		||||
/*  { '?', "kstk_eip",      &cmp_kstk_eip      }, */
 | 
			
		||||
/*  { '?', "wchan",         &cmp_wchan         }, */
 | 
			
		||||
    { 'C', "pcpu",          &cmp_pcpu          },
 | 
			
		||||
    { 's', "size",          &cmp_size          },
 | 
			
		||||
    { 'R', "resident",      &cmp_resident      },
 | 
			
		||||
    { 'S', "share",         &cmp_share         },
 | 
			
		||||
/*  { '?', "trs",           &cmp_trs           }, */
 | 
			
		||||
/*  { '?', "lrs",           &cmp_lrs           }, */
 | 
			
		||||
/*  { '?', "drs",           &cmp_drs           }, */
 | 
			
		||||
/*  { '?', "dt",            &cmp_dt            }, */
 | 
			
		||||
    { '\0',"terminator",    NULL               }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
void dump_keys(void) {
 | 
			
		||||
    int i;
 | 
			
		||||
    for(i=0; cmp[i].letter; i++)
 | 
			
		||||
        fprintf(stderr, "%s-O%c , --sort:%-15.15s%s",
 | 
			
		||||
		i%2?"":"           ",
 | 
			
		||||
		cmp[i].letter, cmp[i].name,
 | 
			
		||||
		i%2?"\n":"");
 | 
			
		||||
    if (i%2)
 | 
			
		||||
      fprintf(stderr, "\n");
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
/* command line option parsing.  Assign sort_{depth,direction[],function[]}
 | 
			
		||||
   based upon a string of the form:
 | 
			
		||||
        [+-]a[+-]b[+-]c...
 | 
			
		||||
   with a,b,c,... being letter flags corresponding to a particular sort
 | 
			
		||||
   key and the optional '-' specifying a reverse sort on that key.  + doesn't
 | 
			
		||||
   mean anything, but it keeps things looking balanced...
 | 
			
		||||
*/
 | 
			
		||||
int parse_sort_opt(char* opt) {
 | 
			
		||||
    int i, next_dir=1;
 | 
			
		||||
    for(; *opt ; ++opt) {
 | 
			
		||||
        if (*opt == '-' || *opt == '+') {
 | 
			
		||||
            if (*opt == '-')
 | 
			
		||||
                next_dir = -1;
 | 
			
		||||
	    opt++;
 | 
			
		||||
            continue;
 | 
			
		||||
        }
 | 
			
		||||
        for (i = 0; cmp[i].letter; i++)
 | 
			
		||||
            if (*opt == cmp[i].letter)
 | 
			
		||||
                break;
 | 
			
		||||
        if (!cmp[i].letter) {
 | 
			
		||||
	    fprintf(stderr,
 | 
			
		||||
		    "ps: no such sort key -- %c.  Possibilities are:\n", *opt);
 | 
			
		||||
            dump_keys();
 | 
			
		||||
            return -1;
 | 
			
		||||
        } else {
 | 
			
		||||
#ifdef DEBUG
 | 
			
		||||
	    fprintf(stderr,
 | 
			
		||||
		    "sort level %d: key %s, direction % d\n",
 | 
			
		||||
		    sort_depth, cmp[i].name, next_dir);
 | 
			
		||||
#endif
 | 
			
		||||
            sort_function[sort_depth] = (cmp_t)cmp[i].fun;
 | 
			
		||||
            sort_direction[sort_depth++] = next_dir;
 | 
			
		||||
            next_dir = 1;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int parse_long_sort(char* opt) {
 | 
			
		||||
    char* comma;
 | 
			
		||||
    int i, more_keys, next_dir=1;
 | 
			
		||||
    do {
 | 
			
		||||
        if (*opt == '-' || *opt == '+') {
 | 
			
		||||
            if (*opt == '-')
 | 
			
		||||
                next_dir = -1;
 | 
			
		||||
            more_keys = 1;
 | 
			
		||||
            opt++;
 | 
			
		||||
            continue;
 | 
			
		||||
        }
 | 
			
		||||
        more_keys = ((comma=index(opt,',')) != NULL);
 | 
			
		||||
	                      /* keys are ',' delimited */
 | 
			
		||||
        if (more_keys)
 | 
			
		||||
            *comma='\0';      /* terminate for strcmp() */
 | 
			
		||||
        for(i = 0; cmp[i].letter; ++i)
 | 
			
		||||
            if (strcmp(opt, cmp[i].name) == 0)
 | 
			
		||||
                break;
 | 
			
		||||
        if (!cmp[i].letter) {
 | 
			
		||||
            fprintf(stderr,
 | 
			
		||||
		    "ps: no such sort key -- %s.  Possibilities are:\n", opt);
 | 
			
		||||
            dump_keys();
 | 
			
		||||
            return -1;
 | 
			
		||||
        } else {
 | 
			
		||||
#ifdef DEBUG
 | 
			
		||||
	    fprintf(stderr,
 | 
			
		||||
		    "sort level %d: key %s, direction % d\n",
 | 
			
		||||
		    sort_depth, cmp[i].name, next_dir);
 | 
			
		||||
#endif
 | 
			
		||||
            sort_function[sort_depth] = (cmp_t)cmp[i].fun;
 | 
			
		||||
            sort_direction[sort_depth++] = next_dir;
 | 
			
		||||
            next_dir = 1;
 | 
			
		||||
        }
 | 
			
		||||
        opt = comma + 1; /* do next loop on next key, if more keys, else done*/
 | 
			
		||||
    } while (more_keys);
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void reset_sort_options (void)
 | 
			
		||||
{
 | 
			
		||||
  int i;
 | 
			
		||||
 | 
			
		||||
  sort_depth=0;
 | 
			
		||||
  for (i=0;i<10;i++){
 | 
			
		||||
    sort_direction[i]=0;
 | 
			
		||||
    sort_function[i]=(cmp_t)NULL;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void register_sort_function (int dir, cmp_t func)
 | 
			
		||||
{
 | 
			
		||||
    sort_function[sort_depth] = func;
 | 
			
		||||
    sort_direction[sort_depth++] = dir;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										269
									
								
								libproc/devname.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										269
									
								
								libproc/devname.c
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,269 @@
 | 
			
		||||
/* device name <-> number map system optimized for rapid, constant time lookup.
 | 
			
		||||
   Copyright Charles Blake, 1996, see COPYING for details.
 | 
			
		||||
*/
 | 
			
		||||
#include <errno.h>
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include <sys/types.h>
 | 
			
		||||
#include <sys/stat.h>
 | 
			
		||||
#include <sys/mman.h>
 | 
			
		||||
#include <dirent.h>
 | 
			
		||||
#include <unistd.h>
 | 
			
		||||
#include <fcntl.h>
 | 
			
		||||
 | 
			
		||||
#define __KERNEL__
 | 
			
		||||
#include <linux/kdev_t.h>
 | 
			
		||||
#undef __KERNEL__
 | 
			
		||||
 | 
			
		||||
#define DEVDIR		"/dev"
 | 
			
		||||
#define DEVTAB		"psdevtab"
 | 
			
		||||
static char *devtab_paths[] = {
 | 
			
		||||
    "/etc/" DEVTAB,
 | 
			
		||||
    "%s/."  DEVTAB,
 | 
			
		||||
    NULL
 | 
			
		||||
};
 | 
			
		||||
#define DEVINITIALMODE	0664
 | 
			
		||||
#define DEV_MAX_PATH	(5+256)
 | 
			
		||||
#define DEV_NAME_MAX	8
 | 
			
		||||
 | 
			
		||||
static dev_t major[] = { 2, 3, 4, 5, 19, 20, 22, 23, 24, 25, 32, 33,
 | 
			
		||||
			46, 47, 48, 49 };
 | 
			
		||||
#define Nminor		256
 | 
			
		||||
#define Nmajor		(sizeof(major)/sizeof(dev_t))
 | 
			
		||||
#define Ndev		(Nmajor*Nminor)
 | 
			
		||||
#define Ndevtab		(Ndev*DEV_NAME_MAX)
 | 
			
		||||
 | 
			
		||||
static char* devtab;	/* the memory buffer holding all the name strings */
 | 
			
		||||
 | 
			
		||||
/* This macro evaluates to the address into the table of the string of
 | 
			
		||||
   DEV_NAME_MAX chars for the device with major m, minor n. */
 | 
			
		||||
#define TAB(m,n) (devtab + (m)*(Nminor*DEV_NAME_MAX) + (n)*DEV_NAME_MAX)
 | 
			
		||||
 | 
			
		||||
static int devtab_initialized = 0;
 | 
			
		||||
 | 
			
		||||
static char* name_to_path(char* name);	/* forward declarations */
 | 
			
		||||
static int   init_devtab (void);
 | 
			
		||||
 | 
			
		||||
/* Device Name -> Number Map
 | 
			
		||||
   many-to-one: -1 on failed match.
 | 
			
		||||
*/
 | 
			
		||||
dev_t name_to_dev(char* name) {
 | 
			
		||||
    static struct stat sbuf;
 | 
			
		||||
    return (stat(name_to_path(name), &sbuf) < 0) ? -1 : sbuf.st_rdev;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* find m in a[] assuming a is sorted into ascending order */
 | 
			
		||||
/* in-line linear search placeholder until more majors warrant binary search */
 | 
			
		||||
static __inline__ int lookup(dev_t m, dev_t* a, int n) {
 | 
			
		||||
    int k;
 | 
			
		||||
    for(k=0; k < n && a[k] != m; k++)
 | 
			
		||||
	;
 | 
			
		||||
    return (k < n) ? k : -1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Device Number -> Name Map
 | 
			
		||||
   one-to-many: first directory order match in DEVDIR, "" on failed match.
 | 
			
		||||
*/
 | 
			
		||||
char* dev_to_name(dev_t num) {
 | 
			
		||||
    static char	rval[DEV_NAME_MAX+1];
 | 
			
		||||
    dev_t m = MAJOR(num), n = MINOR(num), tmp;
 | 
			
		||||
    if (!devtab_initialized && !init_devtab())
 | 
			
		||||
	return "";
 | 
			
		||||
    if ((tmp = lookup(m, major, Nmajor)) == (dev_t)-1)
 | 
			
		||||
	return "";
 | 
			
		||||
    strncpy(rval, TAB(tmp,n), DEV_NAME_MAX);
 | 
			
		||||
    rval[DEV_NAME_MAX] = '\0';
 | 
			
		||||
    return rval;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int dev_to_devtab(int);
 | 
			
		||||
 | 
			
		||||
static int init_devtab(void) {
 | 
			
		||||
    static struct stat sbuf, lbuf;
 | 
			
		||||
    static int fd;
 | 
			
		||||
    char **fmt, path[64], *HOME = getenv("HOME") ? getenv("HOME") : "";
 | 
			
		||||
    for (fmt = devtab_paths; *fmt; fmt++) {
 | 
			
		||||
	snprintf(path, sizeof path, *fmt, HOME);
 | 
			
		||||
	lbuf.st_ino = 0; /* initialize for test later */
 | 
			
		||||
	if (lstat(path, &lbuf) >= 0 && S_ISLNK(lbuf.st_mode))
 | 
			
		||||
	    /* don't follow symlinks */
 | 
			
		||||
	    continue;
 | 
			
		||||
	if ( (fd = open(path, O_RDONLY)) < 0	/* open DEVTAB file */
 | 
			
		||||
	     || fstat(fd, &sbuf) < 0		/* fstat it */
 | 
			
		||||
	     || (lbuf.st_ino && (sbuf.st_ino != lbuf.st_ino)) /* race */
 | 
			
		||||
	     || sbuf.st_nlink > 1		/* hardlink attack */
 | 
			
		||||
	     || sbuf.st_size != Ndevtab		/* make sure it's the right size */
 | 
			
		||||
	     || (devtab = mmap(0, Ndevtab, PROT_READ, MAP_SHARED, fd, 0)) == (caddr_t) -1
 | 
			
		||||
	     || close(fd) == -1)
 | 
			
		||||
	    {	/* could not open for read, attempt to fix/create */
 | 
			
		||||
		int oumsk = umask(0);
 | 
			
		||||
		if (devtab)
 | 
			
		||||
		    munmap(devtab, Ndevtab);
 | 
			
		||||
		if (((fd = open(path, O_RDWR|O_TRUNC|O_CREAT, DEVINITIALMODE)) == -1 &&
 | 
			
		||||
		     (unlink(path), fd = open(path, O_RDWR|O_TRUNC|O_CREAT, DEVINITIALMODE)) == -1)
 | 
			
		||||
		     || !dev_to_devtab(fd)) {
 | 
			
		||||
		    close(fd);          /* either both opens failed or the constructor failed */
 | 
			
		||||
		    unlink(path);	/* in case we created but could not fill a file */
 | 
			
		||||
		    umask(oumsk);
 | 
			
		||||
		    continue;
 | 
			
		||||
		} else {
 | 
			
		||||
		    devtab_initialized = 1;
 | 
			
		||||
		    close(fd);
 | 
			
		||||
		    umask(oumsk);
 | 
			
		||||
		    return 1;
 | 
			
		||||
		}
 | 
			
		||||
	    }
 | 
			
		||||
	else
 | 
			
		||||
	    return devtab_initialized = 1;
 | 
			
		||||
    }
 | 
			
		||||
    return devtab_initialized;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* stat every file in DEVDIR saving its basename in devtab[] if it has
 | 
			
		||||
   a MAJOR(st_rdev) in our list of majors. return 0 on error otherwise 1. */
 | 
			
		||||
static int dev_to_devtab(int fd) {
 | 
			
		||||
    static struct stat sbuf;
 | 
			
		||||
    int i;
 | 
			
		||||
    dev_t m;
 | 
			
		||||
    struct dirent* ent;
 | 
			
		||||
    DIR* dev;
 | 
			
		||||
    
 | 
			
		||||
    if (!(dev = opendir(DEVDIR))) {
 | 
			
		||||
	fprintf(stderr, "%s: %s\nCannot generate device number -> name mapping.\n",
 | 
			
		||||
		DEVDIR, sys_errlist[errno]);
 | 
			
		||||
	return 0;
 | 
			
		||||
    }
 | 
			
		||||
    if (!(devtab = malloc(Ndevtab))) {
 | 
			
		||||
	fprintf(stderr, "%s: could not allocate memory\n", sys_errlist[errno]);
 | 
			
		||||
	return 0;
 | 
			
		||||
    }
 | 
			
		||||
    memset((void*)devtab, 0, Ndevtab);
 | 
			
		||||
    while ((ent = readdir(dev))) {	/* loop over all dirents in DEVDIR */
 | 
			
		||||
	if (lstat(name_to_path(ent->d_name), &sbuf) < 0
 | 
			
		||||
	    || !S_ISCHR(sbuf.st_mode))	    /* only look for char special devs */
 | 
			
		||||
	    continue;			    /* due to overloading of majors */
 | 
			
		||||
	m = MAJOR(sbuf.st_rdev);	    /* copy name to appropriate spot */
 | 
			
		||||
	if ((i = lookup(m, major, Nmajor)) != -1)
 | 
			
		||||
	    strncpy(TAB(i,MINOR(sbuf.st_rdev)), ent->d_name, DEV_NAME_MAX);
 | 
			
		||||
    }
 | 
			
		||||
    closedir(dev);
 | 
			
		||||
    if (write(fd, devtab, Ndevtab) != Ndevtab) /* probably no disk space */
 | 
			
		||||
	return 0;
 | 
			
		||||
    return 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static char path[DEV_MAX_PATH];
 | 
			
		||||
 | 
			
		||||
static char* name_to_path(char* name) {
 | 
			
		||||
    static char* Path;
 | 
			
		||||
    if (!Path) {
 | 
			
		||||
	strcpy(path, DEVDIR);		/* copy DEVDIR */
 | 
			
		||||
	path[sizeof(DEVDIR) - 1] = '/';	/* change NUL to '/' */
 | 
			
		||||
	Path = path + sizeof(DEVDIR);	/* put Path at start of basename */
 | 
			
		||||
    }
 | 
			
		||||
    strncpy(Path, name, DEV_MAX_PATH - sizeof(DEVDIR));
 | 
			
		||||
    return path;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#ifdef TEST_DEVNAME
 | 
			
		||||
int main(int argc, char** argv) {	/* usage: cmd [<major> <minor>|<name>] */
 | 
			
		||||
    dev_t tmp;
 | 
			
		||||
    if (argc < 2) {
 | 
			
		||||
	printf("%s: [ maj min... | name ... ]\n", argv[0]);
 | 
			
		||||
	return 0;
 | 
			
		||||
    }
 | 
			
		||||
    if (argv[1][0] >= '0' && argv[1][0] <= '9')
 | 
			
		||||
	for(argv++ ; argv[0] && argv[1] ; argv+=2)
 | 
			
		||||
	    printf("%s\n", dev_to_name(MKDEV( atoi(argv[0]), atoi(argv[1]) )));
 | 
			
		||||
    else
 | 
			
		||||
	for(argv++ ; *argv ; argv++) {
 | 
			
		||||
	    tmp = name_to_dev(*argv);
 | 
			
		||||
	    printf("%d, %d\n", MAJOR(tmp), MINOR(tmp));
 | 
			
		||||
	}
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
/*
 | 
			
		||||
Using this program on over 700 files in /dev to perform number->name resolution
 | 
			
		||||
took well under 300 microsecs per device number pair on a Pentium 90.  It is
 | 
			
		||||
somewhat tough to time because once the 3 pages have been mapped in, the time is
 | 
			
		||||
almost zero.  For things like top, this method may even be faster in the long
 | 
			
		||||
run.  Those interested can gprof it for me.  This system has the virtue of being
 | 
			
		||||
nearly perfectly adaptable to individual systems, self updating when /dev
 | 
			
		||||
changes and pretty darn fast when it hasn't.  It will be slow for users without
 | 
			
		||||
perms to change the psdevtab file, though.  So this is what I decided was
 | 
			
		||||
reasonable.  If the process does not have perms to create or update
 | 
			
		||||
/etc/psdevtab and it is out of date, we try /tmp/psdevtab.  If /tmp/psdevtab is
 | 
			
		||||
either out of date or unreadable (malicious user creates it and chmods it),
 | 
			
		||||
$HOME/.psdevtab is used.  This secondarily allows for per-user naming of ttys,
 | 
			
		||||
but is really so that at most one user sees only a single delay per /dev
 | 
			
		||||
modification.
 | 
			
		||||
 | 
			
		||||
To do the timings I did something like this with zsh:
 | 
			
		||||
    a=(`ls -l *(%^@/) | awk '{print $5 $6}' | sed 's/,/ /'`);
 | 
			
		||||
    time ./test $a
 | 
			
		||||
 | 
			
		||||
Finally, for lack of a better file for these to be in, I have collected the
 | 
			
		||||
old algorithmic device number <-> device name mappings.
 | 
			
		||||
  Let m = major device number and n = minor device number satisfy:
 | 
			
		||||
    devno = m<<8 + n , m = devno>>8 , n = devno && 0x00FF, and let
 | 
			
		||||
    char L[32]="pqrstuvwxyzABCDEFGHIJKLMNOPQRSTU", H[16]="01234567890abcdef";
 | 
			
		||||
	DEVICE NUMBERS		SPECIAL FILE NAMES
 | 
			
		||||
  OLD SYSTEM (64 pseudoterminal devices):
 | 
			
		||||
	m=4:
 | 
			
		||||
	    n=0..63:	tty + itoa_dec(n+1)
 | 
			
		||||
	    n=128..191:	pty + L[(n-128)/16] + H[(n-128)%16]
 | 
			
		||||
	    n=192..255:	tty + L[(n-192)/16] + H[(n-192)%16]
 | 
			
		||||
  NEW SYSTEM (256/512 pseudoterminal devices):
 | 
			
		||||
	m=2, n:		pty + L[n/16] + H[n%16]
 | 
			
		||||
	m=3, n:		tty + L[n/16] + H[n%16]
 | 
			
		||||
	m=4, n:		tty + itoa_dec(n+1)
 | 
			
		||||
	m=49, n:	pty + L[16+n/16] + H[n%16]
 | 
			
		||||
	m=50, n:	tty + L[16+n/16] + H[n%16]
 | 
			
		||||
  (THE SAME IN EITHER SYSTEM)
 | 
			
		||||
  CALL-UNIX AND CONTROLLING TERMINAL DEVICES
 | 
			
		||||
	m=5:
 | 
			
		||||
	    n=0:	tty
 | 
			
		||||
	    n=64..128:	cua  + {'0' + (n-64)}
 | 
			
		||||
  CYCLADES MULTIPORT:
 | 
			
		||||
	m=19, n:	ttyC + itoa_hex(n)
 | 
			
		||||
	m=20, n: cub + itoa_hex(n) */
 | 
			
		||||
 | 
			
		||||
/* Re-implementation of old interface with the new generic functions. */
 | 
			
		||||
 | 
			
		||||
/* This does exactly the same thing as name_to_dev only now a full "ttyXX"
 | 
			
		||||
   specification will work as well.
 | 
			
		||||
*/
 | 
			
		||||
int tty_to_dev(char *tty) {
 | 
			
		||||
    static char pref_name_1[32] = "tty", *pnam1 = pref_name_1 + 3,
 | 
			
		||||
	        pref_name_2[32] = "cu",  *pnam2 = pref_name_2 + 2;
 | 
			
		||||
    dev_t num;
 | 
			
		||||
    if ((num = name_to_dev(tty)) != (dev_t) -1)	/* try tty straight up */
 | 
			
		||||
	return num;
 | 
			
		||||
    strncpy(pnam1, tty, 32 - 3);	/* try with "tty" prepended */
 | 
			
		||||
    if ((num = name_to_dev(pref_name_1)) != (dev_t) -1)
 | 
			
		||||
	return num;
 | 
			
		||||
    strncpy(pnam2, tty, 32 - 2);	/* try with "cu" prepended */
 | 
			
		||||
    if ((num = name_to_dev(pref_name_2)) != (dev_t) -1)
 | 
			
		||||
	return num;
 | 
			
		||||
    return -1;		/* no match */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* new abstraction that can maybe be generalized a little better. */
 | 
			
		||||
char* abbrev_of_tty(char *tty) {
 | 
			
		||||
    static char temp[32];		/* return buf: good only until next call */
 | 
			
		||||
    char *pos = strpbrk(tty, "yu");	/* end of (presumed) prefices: tty*, cu* */
 | 
			
		||||
    temp[0] = 0;
 | 
			
		||||
    if (tty && tty[0] && pos && pos[0] && pos[1])
 | 
			
		||||
	sprintf(temp, "%*.*s", 3, 3, pos + 1);
 | 
			
		||||
    else
 | 
			
		||||
	strncpy(temp, " ? ", 31);
 | 
			
		||||
    return temp;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Do in-place modification of the 4-buffer `tty' based upon `dev' */
 | 
			
		||||
void dev_to_tty(char *tty, int dev) {
 | 
			
		||||
    char* new = abbrev_of_tty(dev_to_name(dev));
 | 
			
		||||
    strncpy(tty, new, 4);
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										10
									
								
								libproc/devname.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								libproc/devname.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,10 @@
 | 
			
		||||
 | 
			
		||||
#include <sys/types.h>
 | 
			
		||||
 | 
			
		||||
dev_t name_to_dev(char* name);
 | 
			
		||||
char* dev_to_name(dev_t num);
 | 
			
		||||
 | 
			
		||||
dev_t tty_to_dev(char *tty);
 | 
			
		||||
void  dev_to_tty(char *tty, int dev);
 | 
			
		||||
 | 
			
		||||
char* abbrev_of_tty(char *tty);
 | 
			
		||||
							
								
								
									
										252
									
								
								libproc/ksym.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										252
									
								
								libproc/ksym.c
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,252 @@
 | 
			
		||||
/* kernel address -> symbol with next lower address.  Charles Blake, 1996.
 | 
			
		||||
 * Written to obviate the need for psdatabase initialization based upon kernel
 | 
			
		||||
 * binary formats, etc.
 | 
			
		||||
 *
 | 
			
		||||
 * The basic algorithm is an approximate (intervals split vaguely 50-50) binary
 | 
			
		||||
 * search taking advantage of the fact the System.map is already sorted in
 | 
			
		||||
 * ascending order by the kernel makefile.  It needs to assume an average symbol
 | 
			
		||||
 * record length to avoid scanning the entire symbol table, but in practice the
 | 
			
		||||
 * search time does not seem to be especially sensitive to this choice.
 | 
			
		||||
 *
 | 
			
		||||
 * The search could be an exact binary search if the lines of System.map were
 | 
			
		||||
 * padded with blanks to the right.  awk '{printf "%8s%2s %-21.21s\n",$1,$2,$3}'
 | 
			
		||||
 * would do the trick for this but either makes the file large or truncates
 | 
			
		||||
 * symbols.  The approximate method seems to be plenty fast enough, costing
 | 
			
		||||
 * only about as much as one extra fstat() or so per process.
 | 
			
		||||
 */
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include <fcntl.h>
 | 
			
		||||
#include <unistd.h>
 | 
			
		||||
#include <sys/stat.h>
 | 
			
		||||
#include <sys/mman.h>
 | 
			
		||||
#include <sys/utsname.h>
 | 
			
		||||
#include "proc/psdata.h"
 | 
			
		||||
#include "proc/ps.h"
 | 
			
		||||
#include "proc/version.h"
 | 
			
		||||
 | 
			
		||||
#define MAX_ADDR_SZ 32
 | 
			
		||||
static char *sysmap, *sysmap_last, sysmap_fmt[10];
 | 
			
		||||
static int   sysmap_len, sysmap_mean = 32, sysmap_addrsz;
 | 
			
		||||
 | 
			
		||||
/* scan backward in a string no further than address beg looking for c */
 | 
			
		||||
static char *strchrrev(char *a, char *beg, char c) {
 | 
			
		||||
    if (a)
 | 
			
		||||
	while (--a > beg && *a != c) ;
 | 
			
		||||
    return a;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* return ptr to the beg of approximately the i-th record */
 | 
			
		||||
static char *addr_str(int i) {
 | 
			
		||||
    char *guess = sysmap + sysmap_mean * i;
 | 
			
		||||
    if (!i) return sysmap;
 | 
			
		||||
    if (guess - sysmap > sysmap_len - 2) guess = sysmap + sysmap_len - 2;
 | 
			
		||||
    for ( ; *guess != '\n' && guess > sysmap; guess--)
 | 
			
		||||
	;
 | 
			
		||||
    return guess + 1;
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* return ptr to symbol string (\n terminated) given beg of record ptr */
 | 
			
		||||
static char *sym_put(char *buf, int len, char *addrptr) {
 | 
			
		||||
    char *s;
 | 
			
		||||
    while (*addrptr++ != ' ')   ;
 | 
			
		||||
    while (*addrptr++ != ' ')   ;
 | 
			
		||||
    strncpy(buf, addrptr, len);
 | 
			
		||||
    for (s = buf; s < buf + len; s++)
 | 
			
		||||
	if (*s == '\n')
 | 
			
		||||
	    *s = '\0';
 | 
			
		||||
    buf[len - 1] = '\0';
 | 
			
		||||
    return buf;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Try to open and mmap a single symbol table file and initialize globals */
 | 
			
		||||
int sysmap_mmap(char *path) {
 | 
			
		||||
    int fd;
 | 
			
		||||
    struct stat sbuf;
 | 
			
		||||
    char *p;
 | 
			
		||||
    if (sysmap)		/* do nothing if already mapped */
 | 
			
		||||
	return 1;
 | 
			
		||||
    if ((fd = open(path, O_RDONLY)) < 0
 | 
			
		||||
	|| fstat(fd, &sbuf) < 0
 | 
			
		||||
	|| (sysmap = mmap(0, sbuf.st_size,
 | 
			
		||||
			  PROT_READ, MAP_SHARED,
 | 
			
		||||
			  fd, 0)) == (caddr_t) -1)
 | 
			
		||||
    {
 | 
			
		||||
	close(fd);
 | 
			
		||||
	sysmap = NULL;
 | 
			
		||||
	return 0;
 | 
			
		||||
    }
 | 
			
		||||
    sysmap_len = sbuf.st_size;
 | 
			
		||||
    sysmap_last = strchrrev(sysmap + sysmap_len - 2, sysmap, '\n') + 1;
 | 
			
		||||
 | 
			
		||||
    /* Now check first line of sysmap for hex numbers in first column.  Note:
 | 
			
		||||
       0x/0X prefixes are disallowed, but easily addable.  Capitalization is
 | 
			
		||||
       irrelevant because strncasecmp(3) is used below instead of strncmp. */
 | 
			
		||||
    for (p = sysmap; *p != ' '
 | 
			
		||||
	     && ((*p >= '0' && *p <= '9') ||
 | 
			
		||||
		 (*p >= 'A' && *p <= 'F') ||
 | 
			
		||||
		 (*p >= 'a' && *p <= 'f'))
 | 
			
		||||
	     && p < sysmap + MAX_ADDR_SZ;
 | 
			
		||||
	 p++) /* no-op */ ;
 | 
			
		||||
    if (*p != ' ') { /* uh-oh: cannot understand format */
 | 
			
		||||
	fprintf(stderr, "warning: %s not parseable as a System.map.\n", path);
 | 
			
		||||
	munmap(sysmap, sysmap_len);
 | 
			
		||||
	sysmap = NULL;
 | 
			
		||||
	close(fd);
 | 
			
		||||
	return 0;
 | 
			
		||||
    }
 | 
			
		||||
    sysmap_addrsz = p - sysmap;
 | 
			
		||||
    snprintf(sysmap_fmt, sizeof sysmap_fmt, "%%0%dlx", sysmap_addrsz);
 | 
			
		||||
    close(fd);
 | 
			
		||||
    return 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* kernel address -> name resolver.
 | 
			
		||||
   returned value is only good until the next call to the function.
 | 
			
		||||
 */
 | 
			
		||||
char *sysmap_symbol(unsigned long address) {
 | 
			
		||||
    static char rval[128], *pc, addr[MAX_ADDR_SZ];
 | 
			
		||||
    int i, p, n = sysmap_len / (double)sysmap_mean;
 | 
			
		||||
 | 
			
		||||
    sprintf(addr, sysmap_fmt, address);
 | 
			
		||||
    p = 0; pc = sysmap;
 | 
			
		||||
    while (n) {
 | 
			
		||||
	i = p + (n >> 1);
 | 
			
		||||
	if (strncasecmp(addr, pc = addr_str(i), sysmap_addrsz) > 0)
 | 
			
		||||
	    p = i + 1;
 | 
			
		||||
	n >>= 1;
 | 
			
		||||
    }
 | 
			
		||||
    if (pc == sysmap_last)		/* scan forward but not past end */
 | 
			
		||||
	return sym_put(rval, sizeof rval, pc);
 | 
			
		||||
    while (strncasecmp(addr, pc, sysmap_addrsz) > 0)
 | 
			
		||||
	pc = strchr(pc, '\n') + 1;
 | 
			
		||||
    if (pc == sysmap)			/* scan backward but not past beg */
 | 
			
		||||
	return sym_put(rval, sizeof rval, pc);
 | 
			
		||||
    while (strncasecmp(addr, pc, sysmap_addrsz) < 0)
 | 
			
		||||
	pc = strchrrev(pc - 1, sysmap, '\n') + 1;
 | 
			
		||||
    return sym_put(rval, sizeof rval, pc);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* extern struct nlist *namelist; */
 | 
			
		||||
struct tbl_s vars, fncs;
 | 
			
		||||
struct psdb_hdr db_hdr;
 | 
			
		||||
int psdb = -1;
 | 
			
		||||
 | 
			
		||||
int open_psdb(void) {
 | 
			
		||||
    static char *sysmap_paths[] = {
 | 
			
		||||
	"/boot/System.map-%s",
 | 
			
		||||
	"/boot/System.map",
 | 
			
		||||
	"/lib/modules/%s/System.map",
 | 
			
		||||
	NULL
 | 
			
		||||
    };
 | 
			
		||||
    static char *psdb_paths[] = {
 | 
			
		||||
	"/etc/psdatabase",
 | 
			
		||||
	"/boot/psdatabase-%s",
 | 
			
		||||
	"/boot/psdatabase",
 | 
			
		||||
	"/lib/modules/%s/psdatabase",
 | 
			
		||||
	NULL
 | 
			
		||||
    };
 | 
			
		||||
    char **fmt, *env, path[64];
 | 
			
		||||
    struct utsname uts;
 | 
			
		||||
    uname(&uts);
 | 
			
		||||
    if ((env = getenv("PS_SYSMAP")) && sysmap_mmap(env))	
 | 
			
		||||
	return 0;
 | 
			
		||||
    for (fmt = sysmap_paths; *fmt; fmt++) {
 | 
			
		||||
	snprintf(path, sizeof path, *fmt, uts.release);
 | 
			
		||||
	if (sysmap_mmap(path))
 | 
			
		||||
	    return 0;
 | 
			
		||||
    }
 | 
			
		||||
    for (fmt = psdb_paths; *fmt; fmt++) {
 | 
			
		||||
	snprintf(path, sizeof path, *fmt, uts.release);
 | 
			
		||||
	if ((psdb = open(path, O_RDONLY)) != -1 &&
 | 
			
		||||
	    read(psdb, (char*)&db_hdr, sizeof db_hdr) == sizeof db_hdr &&
 | 
			
		||||
	    strncmp(db_hdr.magic, procps_version, sizeof(db_hdr.magic)) == 0)
 | 
			
		||||
	    /* && version_cmp(kernel,psdatabase) */
 | 
			
		||||
	    return 0;
 | 
			
		||||
	if (psdb != -1)
 | 
			
		||||
	    fprintf(stderr,
 | 
			
		||||
		    "psdatabase has magic no. %*s instead of %*s\n",
 | 
			
		||||
		    (int) sizeof db_hdr.magic, db_hdr.magic,
 | 
			
		||||
		    (int) sizeof db_hdr.magic, procps_version);
 | 
			
		||||
	close(psdb);
 | 
			
		||||
    }
 | 
			
		||||
    return -1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void close_psdb(void) {
 | 
			
		||||
    if (sysmap)
 | 
			
		||||
	munmap(sysmap, sysmap_len);
 | 
			
		||||
    else if (psdb != -1)
 | 
			
		||||
	close(psdb);
 | 
			
		||||
    psdb = -1;
 | 
			
		||||
    sysmap = NULL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int read_tbl(struct dbtbl_s *dbtbl, struct tbl_s *tbl) {
 | 
			
		||||
    lseek(psdb, dbtbl->off, SEEK_SET);
 | 
			
		||||
    tbl->tbl = (struct sym_s *) xmalloc(dbtbl->size);
 | 
			
		||||
    if (read(psdb, (char *) tbl->tbl, dbtbl->size) != dbtbl->size) {
 | 
			
		||||
	perror(PSDATABASE);
 | 
			
		||||
	exit(1);
 | 
			
		||||
    }
 | 
			
		||||
    tbl->nsym = dbtbl->nsym;
 | 
			
		||||
    tbl->strings = (char *) (tbl->tbl + tbl->nsym);
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
char * find_func(unsigned long address)	{
 | 
			
		||||
    int n;
 | 
			
		||||
    struct sym_s *p;
 | 
			
		||||
    char *s;
 | 
			
		||||
 | 
			
		||||
    if (sysmap)
 | 
			
		||||
	return sysmap_symbol(address);
 | 
			
		||||
    if (psdb == -1)
 | 
			
		||||
	return "(no psdb)";
 | 
			
		||||
    if (fncs.tbl == NULL)
 | 
			
		||||
	read_tbl(&db_hdr.fncs, &fncs);
 | 
			
		||||
    p = fncs.tbl;
 | 
			
		||||
    n = fncs.nsym;
 | 
			
		||||
    while (n) {
 | 
			
		||||
	int i = n / 2;
 | 
			
		||||
	if (p[i].addr < address) {
 | 
			
		||||
	    p = &p[i+1];
 | 
			
		||||
	    if (p->addr > address) {
 | 
			
		||||
		--p;
 | 
			
		||||
		break;
 | 
			
		||||
	    }
 | 
			
		||||
	    --n;
 | 
			
		||||
	}
 | 
			
		||||
	n /= 2;
 | 
			
		||||
    }
 | 
			
		||||
    s = p->name + fncs.strings;
 | 
			
		||||
    return *s=='_' ? s+1 : s;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
char * wchan(unsigned long address) {
 | 
			
		||||
    static char zero = 0;
 | 
			
		||||
    char *p;
 | 
			
		||||
 | 
			
		||||
    if (address) {
 | 
			
		||||
	p = find_func(address);
 | 
			
		||||
	if (strncmp(p, "sys_", 4) == 0)
 | 
			
		||||
	    p += 4;
 | 
			
		||||
	while (*p == '_' && *p)
 | 
			
		||||
	    ++p;
 | 
			
		||||
    } else /* 0 address means not in kernel space */
 | 
			
		||||
	p = &zero;
 | 
			
		||||
    return p;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#ifdef SYSMAP_TEST
 | 
			
		||||
int main(int ac, char** av) {
 | 
			
		||||
    if (ac < 3) {printf("%s System.map lines hexaddr ...\n",av[0]); return 1;}
 | 
			
		||||
    if (!sysmap_mmap(av[1])) return 1;
 | 
			
		||||
    if ((sysmap_mean = atoi(av[2])) <= 0) return 1;
 | 
			
		||||
    for (av += 3; *av; av++)
 | 
			
		||||
	printf("%s %s\n", *av, sysmap_symbol(strtoul(*av, NULL, 16)));
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
							
								
								
									
										52
									
								
								libproc/output.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										52
									
								
								libproc/output.c
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,52 @@
 | 
			
		||||
/*
 | 
			
		||||
  Some output conversion routines for libproc
 | 
			
		||||
  Copyright (C) 1996, Charles Blake.  See COPYING for details.
 | 
			
		||||
*/
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <ctype.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
 | 
			
		||||
/* output a string, converting unprintables to octal as we go, and stopping after
 | 
			
		||||
   processing max chars of output (accounting for expansion due to octal rep).
 | 
			
		||||
*/
 | 
			
		||||
unsigned print_str(FILE* file, char *s, unsigned max) {
 | 
			
		||||
    int i;
 | 
			
		||||
    for (i=0; s[i] && i < max; i++)
 | 
			
		||||
	if (isprint(s[i]) || s[i] == ' ')
 | 
			
		||||
	    fputc(s[i], file);
 | 
			
		||||
	else {
 | 
			
		||||
	    if (max - i > 3) {
 | 
			
		||||
		fprintf(file, "\\%03o", s[i]);
 | 
			
		||||
		i += 3; /* 4 printed, but i counts one */
 | 
			
		||||
	    } else
 | 
			
		||||
		return max - i;
 | 
			
		||||
	}
 | 
			
		||||
    return max - i;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* output an argv style NULL-terminated string list, converting unprintables
 | 
			
		||||
   to octal as we go, separating items of the list by 'sep' and stopping after
 | 
			
		||||
   processing max chars of output (accounting for expansion due to octal rep).
 | 
			
		||||
*/
 | 
			
		||||
unsigned print_strlist(FILE* file, char **strs, char* sep, unsigned max) {
 | 
			
		||||
    int i, n, seplen = strlen(sep);
 | 
			
		||||
    for (n=0; *strs && n < max; strs++) {
 | 
			
		||||
	for (i=0; strs[0][i] && n+i < max; i++)
 | 
			
		||||
	    if (isprint(strs[0][i]) || strs[0][i] == ' ')
 | 
			
		||||
		fputc(strs[0][i], file);
 | 
			
		||||
	    else {
 | 
			
		||||
		if (max-(n+i) > 3) {
 | 
			
		||||
		    fprintf(file, "\\%03o", strs[0][i]);
 | 
			
		||||
		    n += 3; /* 4 printed, but i counts one */
 | 
			
		||||
		} else
 | 
			
		||||
		    return max - n;
 | 
			
		||||
	    }
 | 
			
		||||
	n += i;
 | 
			
		||||
	if (n + seplen < max) {
 | 
			
		||||
	    fputs(sep, file);
 | 
			
		||||
	    n += seplen;
 | 
			
		||||
	} else
 | 
			
		||||
	    return max - n;
 | 
			
		||||
    }
 | 
			
		||||
    return max - n;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										30
									
								
								libproc/ps.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								libproc/ps.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,30 @@
 | 
			
		||||
/* The shadow of the original with only common prototypes now. */
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <sys/types.h>
 | 
			
		||||
 | 
			
		||||
/* get definition of HZ */
 | 
			
		||||
#include <asm/param.h>
 | 
			
		||||
 | 
			
		||||
/* get page info */
 | 
			
		||||
#include <asm/page.h>
 | 
			
		||||
 | 
			
		||||
char *wchan(unsigned long);
 | 
			
		||||
char *find_func(unsigned long address);
 | 
			
		||||
void *xcalloc(void *pointer, int size);
 | 
			
		||||
void *xmalloc(unsigned int size);
 | 
			
		||||
void *xrealloc(void *oldp, unsigned int size);
 | 
			
		||||
       
 | 
			
		||||
int   mult_lvl_cmp(void* a, void* b);
 | 
			
		||||
int   node_mult_lvl_cmp(void* a, void* b);
 | 
			
		||||
void  dump_keys(void);
 | 
			
		||||
       
 | 
			
		||||
char *user_from_uid(int uid);
 | 
			
		||||
 | 
			
		||||
int   open_sysmap(void);
 | 
			
		||||
int   open_psdb(void);
 | 
			
		||||
void  close_psdb(void);
 | 
			
		||||
void  make_fnctbl(void);
 | 
			
		||||
 | 
			
		||||
unsigned print_str    (FILE* file, char *s, unsigned max);
 | 
			
		||||
unsigned print_strlist(FILE* file, char **strs, char* sep, unsigned max);
 | 
			
		||||
unsigned snprint_strlist(char *buf, int max, char **strs, char *sep);
 | 
			
		||||
							
								
								
									
										103
									
								
								libproc/psdata.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										103
									
								
								libproc/psdata.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,103 @@
 | 
			
		||||
/*
 | 
			
		||||
 * psdata.h
 | 
			
		||||
 *
 | 
			
		||||
 * Jeffrey A. Uphoff <juphoff@nrao.edu>, 1995, 1996.
 | 
			
		||||
 * Michael K. Johnson.
 | 
			
		||||
 * Bruno Lankester.
 | 
			
		||||
 * (And others I'm sure...)
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Capabilities are for reading system images and producing maps for
 | 
			
		||||
 * WCHAN output.
 | 
			
		||||
 *
 | 
			
		||||
 * AOUT_CAPABLE and ELF_CAPABLE may have 32-bit word size limitations
 | 
			
		||||
 * and have only been tested by the maintainer on Intel systems.  They
 | 
			
		||||
 * are retained in the source tree in case they are useful; they are
 | 
			
		||||
 * intended to be generally deprecated.
 | 
			
		||||
 *
 | 
			
		||||
 * BFD_CAPABLE should work on any system with BFD.
 | 
			
		||||
 *
 | 
			
		||||
 * Set the capabilities in the top-level Makefile.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#if defined(ELF_CAPABLE)
 | 
			
		||||
# define ELF_OBJECT 1
 | 
			
		||||
# define ELF_FUNC 2
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#include <sys/types.h>
 | 
			
		||||
#include <linux/utsname.h>
 | 
			
		||||
 | 
			
		||||
#define        PSDATABASE      "/etc/psdatabase"
 | 
			
		||||
 | 
			
		||||
struct dbtbl_s {
 | 
			
		||||
  off_t off;			/* offset in psdatabase */
 | 
			
		||||
  int nsym;			/* # symbols */
 | 
			
		||||
  int size;			/* size of array + strings */
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * header of psdatabase
 | 
			
		||||
 */
 | 
			
		||||
struct psdb_hdr {
 | 
			
		||||
  /* Current procps package version goes here.  kmemps doesn't like this. */
 | 
			
		||||
  char magic[32];
 | 
			
		||||
  /* 
 | 
			
		||||
   * These are not functional--they only reside in the database for
 | 
			
		||||
   * informational purposes (i.e. if you want to look at the raw
 | 
			
		||||
   * database and see what kernel it's for).
 | 
			
		||||
   */
 | 
			
		||||
  char uts_release[__NEW_UTS_LEN];
 | 
			
		||||
  char uts_version[__NEW_UTS_LEN];
 | 
			
		||||
  /* 
 | 
			
		||||
   * Again, this is not functional, it's just there for information: it
 | 
			
		||||
   * shows the path to the uncompressed kernel image that was used to
 | 
			
		||||
   * generate this database.
 | 
			
		||||
   */
 | 
			
		||||
  char sys_path[128];
 | 
			
		||||
  /* List of all functions. */
 | 
			
		||||
  struct dbtbl_s fncs;
 | 
			
		||||
  /* 
 | 
			
		||||
   * This is currently only used to look up system_utsname while
 | 
			
		||||
   * psupdate is building the database--it really should be phased out!
 | 
			
		||||
   */
 | 
			
		||||
  /* List of all bss and data symbols. */
 | 
			
		||||
  struct dbtbl_s vars;
 | 
			
		||||
  /* 
 | 
			
		||||
   * The list of tty names that kmemps likes/uses in no longer present
 | 
			
		||||
   * in the procps psdatabase--it was never being built by procps'
 | 
			
		||||
   * psupdate anyway, so I removed the entry from the database header.
 | 
			
		||||
   */
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct sym_s {
 | 
			
		||||
  unsigned long addr;		/* core address in kernel */
 | 
			
		||||
  int name;			/* offset from strings ptr */
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct tbl_s {
 | 
			
		||||
  struct sym_s *tbl;
 | 
			
		||||
  int nsym;
 | 
			
		||||
  char *strings;		/* ptr to start of strings */
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
extern struct psdb_hdr db_hdr;
 | 
			
		||||
extern struct tbl_s fncs, vars;
 | 
			
		||||
 | 
			
		||||
int read_tbl (struct dbtbl_s *, struct tbl_s *);
 | 
			
		||||
void *xmalloc (unsigned int);
 | 
			
		||||
void *xrealloc (void *, unsigned int);
 | 
			
		||||
 | 
			
		||||
#define MLSEEK(FD, WHERE, WHENCE, ERROR)\
 | 
			
		||||
if (lseek ((FD), (WHERE), (WHENCE)) == -1) {\
 | 
			
		||||
  perror ((ERROR));\
 | 
			
		||||
  exit (errno);\
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#define MREAD(FD, WHAT, SIZE, ERROR)\
 | 
			
		||||
if (read ((FD), (WHAT), (SIZE)) != (SIZE)) {\
 | 
			
		||||
  perror ((ERROR));\
 | 
			
		||||
  exit (errno);\
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										37
									
								
								libproc/pwcache.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								libproc/pwcache.c
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,37 @@
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <pwd.h>
 | 
			
		||||
#include "proc/ps.h"
 | 
			
		||||
 | 
			
		||||
#define	HASHSIZE	16			/* power of 2 */
 | 
			
		||||
#define	HASH(x)		((x) & (HASHSIZE - 1))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static struct pwbuf {
 | 
			
		||||
    int uid;
 | 
			
		||||
    char name[12];
 | 
			
		||||
    struct pwbuf *next;
 | 
			
		||||
} *pwhash[HASHSIZE];
 | 
			
		||||
 | 
			
		||||
char *user_from_uid(int uid)
 | 
			
		||||
{
 | 
			
		||||
    struct pwbuf **p;
 | 
			
		||||
    struct passwd *pw;
 | 
			
		||||
 | 
			
		||||
    p = &pwhash[HASH(uid)];
 | 
			
		||||
    while (*p) {
 | 
			
		||||
	if ((*p)->uid == uid)
 | 
			
		||||
	    return((*p)->name);
 | 
			
		||||
	p = &(*p)->next;
 | 
			
		||||
    }
 | 
			
		||||
    *p = (struct pwbuf *) xmalloc(sizeof(struct pwbuf));
 | 
			
		||||
    (*p)->uid = uid;
 | 
			
		||||
    if ((pw = getpwuid(uid)) == NULL)
 | 
			
		||||
	sprintf((*p)->name, "#%d", uid);
 | 
			
		||||
    else
 | 
			
		||||
	sprintf((*p)->name, "%-.8s", pw->pw_name);
 | 
			
		||||
    (*p)->next = NULL;
 | 
			
		||||
    return((*p)->name);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void bad_user_access_length() { }
 | 
			
		||||
							
								
								
									
										395
									
								
								libproc/readproc.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										395
									
								
								libproc/readproc.c
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,395 @@
 | 
			
		||||
/*
 | 
			
		||||
 * New Interface to Process Table -- PROCTAB Stream (a la Directory streams)
 | 
			
		||||
 * Copyright(C) 1996. Charles L. Blake.
 | 
			
		||||
 */
 | 
			
		||||
#include "proc/version.h"
 | 
			
		||||
#include "proc/readproc.h"
 | 
			
		||||
#include "proc/devname.h"
 | 
			
		||||
#include "proc/ps.h"
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <stdarg.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include <unistd.h>
 | 
			
		||||
#include <fcntl.h>
 | 
			
		||||
#include <sys/dir.h>
 | 
			
		||||
#include <sys/types.h>
 | 
			
		||||
#include <sys/stat.h>
 | 
			
		||||
 | 
			
		||||
#define Do(x) (flags & PROC_ ## x)	/* convenient shorthand */
 | 
			
		||||
 | 
			
		||||
/* initiate a process table scan
 | 
			
		||||
 */
 | 
			
		||||
PROCTAB* openproc(int flags, ...) {
 | 
			
		||||
    va_list ap;
 | 
			
		||||
    PROCTAB* PT = xmalloc(sizeof(PROCTAB));
 | 
			
		||||
 | 
			
		||||
    if (!Do(PID) && !(PT->procfs = opendir("/proc")))
 | 
			
		||||
    	return NULL;
 | 
			
		||||
    PT->flags = flags;
 | 
			
		||||
    va_start(ap, flags);		/*  Init args list */
 | 
			
		||||
    if (Do(PID))
 | 
			
		||||
    	PT->pids = va_arg(ap, pid_t*);
 | 
			
		||||
    else if (Do(TTY))
 | 
			
		||||
    	PT->ttys = va_arg(ap, dev_t*);
 | 
			
		||||
    else if (Do(UID)) {
 | 
			
		||||
    	PT->uids = va_arg(ap, uid_t*);
 | 
			
		||||
	PT->nuid = va_arg(ap, int);
 | 
			
		||||
    } else if (Do(STAT))
 | 
			
		||||
    	PT->stats = va_arg(ap, char*);
 | 
			
		||||
    va_end(ap);				/*  Clean up args list */
 | 
			
		||||
    if (Do(ANYTTY) && Do(TTY))
 | 
			
		||||
	PT->flags = PT->flags & ~PROC_TTY; /* turn off TTY flag */
 | 
			
		||||
    return PT;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* terminate a process table scan
 | 
			
		||||
 */
 | 
			
		||||
void closeproc(PROCTAB* PT) {
 | 
			
		||||
    if (PT->procfs) closedir(PT->procfs);
 | 
			
		||||
    if (PT)         free(PT);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* deallocate the space allocated by readproc if the passed rbuf was NULL
 | 
			
		||||
 */
 | 
			
		||||
void freeproc(proc_t* p) {
 | 
			
		||||
    if (!p)	/* in case p is NULL */
 | 
			
		||||
	return;
 | 
			
		||||
    /* ptrs are after strings to avoid copying memory when building them. */
 | 
			
		||||
    /* so free is called on the address of the address of strvec[0]. */
 | 
			
		||||
    if (p->cmdline)
 | 
			
		||||
	free((void*)*p->cmdline);
 | 
			
		||||
    if (p->environ)
 | 
			
		||||
	free((void*)*p->environ);
 | 
			
		||||
    free(p);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* stat2proc() makes sure it can handle arbitrary executable file basenames
 | 
			
		||||
   for `cmd', i.e. those with embedded whitespace or embedded ')'s.  Such names
 | 
			
		||||
   confuse %s (see scanf(3)), so the string is split and %39c is used instead.
 | 
			
		||||
   (except for embedded ')' "(%[^)]c)" would work.
 | 
			
		||||
*/
 | 
			
		||||
void stat2proc(char* S, proc_t* P) {
 | 
			
		||||
    char* tmp = strrchr(S, ')');	/* split into "PID (cmd" and "<rest>" */
 | 
			
		||||
    *tmp = '\0';			/* replace trailing ')' with NUL */
 | 
			
		||||
    /* parse these two strings separately, skipping the leading "(". */
 | 
			
		||||
    memset(P->cmd, 0, sizeof P->cmd);	/* clear even though *P xcalloc'd ?! */
 | 
			
		||||
    sscanf(S, "%d (%39c", &P->pid, P->cmd);
 | 
			
		||||
    sscanf(tmp + 2,			/* skip space after ')' too */
 | 
			
		||||
	   "%c %d %d %d %d %d %lu %lu %lu %lu %lu %ld %ld %ld %ld %d "
 | 
			
		||||
	   "%d %lu %lu %ld %lu %lu %lu %lu %lu %lu %lu %lu %LX %LX %LX %LX %lu",
 | 
			
		||||
	   &P->state, &P->ppid, &P->pgrp, &P->session, &P->tty, &P->tpgid,
 | 
			
		||||
	   &P->flags, &P->min_flt, &P->cmin_flt, &P->maj_flt, &P->cmaj_flt,
 | 
			
		||||
	   &P->utime, &P->stime, &P->cutime, &P->cstime, &P->priority, &P->nice,
 | 
			
		||||
	   &P->timeout, &P->it_real_value, &P->start_time, &P->vsize, &P->rss,
 | 
			
		||||
	   &P->rss_rlim, &P->start_code, &P->end_code, &P->start_stack,
 | 
			
		||||
	   &P->kstk_esp, &P->kstk_eip, &P->signal, &P->blocked, &P->sigignore,
 | 
			
		||||
	   &P->sigcatch, &P->wchan);
 | 
			
		||||
    if (P->tty == 0)
 | 
			
		||||
	P->tty = -1;  /* the old notty val, update elsewhere bef. moving to 0 */
 | 
			
		||||
    if (linux_version_code < LINUX_VERSION(1,3,39)) {
 | 
			
		||||
	P->priority = 2*15 - P->priority;	/* map old meanings to new */
 | 
			
		||||
	P->nice = 15 - P->nice;
 | 
			
		||||
    }
 | 
			
		||||
    if (linux_version_code < LINUX_VERSION(1,1,30) && P->tty != -1)
 | 
			
		||||
	P->tty = 4*0x100 + P->tty;		/* when tty wasn't full devno */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void statm2proc(char* s, proc_t* P) {
 | 
			
		||||
    sscanf(s, "%ld %ld %ld %ld %ld %ld %ld",
 | 
			
		||||
	   &P->size, &P->resident, &P->share,
 | 
			
		||||
	   &P->trs, &P->lrs, &P->drs, &P->dt);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void nulls2sep(char* str, int len, char sep) {
 | 
			
		||||
    int i;
 | 
			
		||||
    for (i = 0; i < len; i++)
 | 
			
		||||
    	if (str[i] == 0)
 | 
			
		||||
    	    str[i] = sep;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int file2str(char *directory, char *what, char *ret, int cap) {
 | 
			
		||||
    static char filename[80];
 | 
			
		||||
    int fd, num_read;
 | 
			
		||||
 | 
			
		||||
    sprintf(filename, "%s/%s", directory, what);
 | 
			
		||||
    if ( (fd       = open(filename, O_RDONLY, 0)) == -1 ) return -1;
 | 
			
		||||
    if ( (num_read = read(fd, ret, cap - 1))      <= 0 ) return -1;
 | 
			
		||||
    ret[num_read] = 0;
 | 
			
		||||
    close(fd);
 | 
			
		||||
    return num_read;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
char** file2strvec(char* directory, char* what) {
 | 
			
		||||
    char buf[2048];	/* read buf bytes at a time */
 | 
			
		||||
    char *p, *rbuf = 0, *endbuf, **q, **ret;
 | 
			
		||||
    int fd, tot = 0, n, c, end_of_file = 0;
 | 
			
		||||
    int align;
 | 
			
		||||
 | 
			
		||||
    sprintf(buf, "%s/%s", directory, what);
 | 
			
		||||
    if ( (fd = open(buf, O_RDONLY, 0) ) == -1 ) return NULL;
 | 
			
		||||
 | 
			
		||||
    /* read whole file into a memory buffer, allocating as we go */
 | 
			
		||||
    while ((n = read(fd, buf, sizeof buf - 1)) > 0) {
 | 
			
		||||
	if (n < sizeof buf - 1)
 | 
			
		||||
	    end_of_file = 1;
 | 
			
		||||
	if (n == 0 && rbuf == 0)
 | 
			
		||||
	    return NULL;	/* process died between our open and read */
 | 
			
		||||
	if (n < 0) {
 | 
			
		||||
	    if (rbuf)
 | 
			
		||||
		free(rbuf);
 | 
			
		||||
	    return NULL;	/* read error */
 | 
			
		||||
	}
 | 
			
		||||
	if (end_of_file && buf[n-1])		/* last read char not null */
 | 
			
		||||
	    buf[n++] = '\0';			/* so append null-terminator */
 | 
			
		||||
	rbuf = xrealloc(rbuf, tot + n);		/* allocate more memory */
 | 
			
		||||
	memcpy(rbuf + tot, buf, n);		/* copy buffer into it */
 | 
			
		||||
	tot += n;				/* increment total byte ctr */
 | 
			
		||||
	if (end_of_file)
 | 
			
		||||
	    break;
 | 
			
		||||
    }
 | 
			
		||||
    close(fd);
 | 
			
		||||
    if (n <= 0 && !end_of_file) {
 | 
			
		||||
	if (rbuf) free(rbuf);
 | 
			
		||||
	return NULL;		/* read error */
 | 
			
		||||
    }
 | 
			
		||||
    endbuf = rbuf + tot;			/* count space for pointers */
 | 
			
		||||
    align = (sizeof(char*)-1) - ((tot + sizeof(char*)-1) & (sizeof(char*)-1));
 | 
			
		||||
    for (c = 0, p = rbuf; p < endbuf; p++)
 | 
			
		||||
    	if (!*p)
 | 
			
		||||
	    c += sizeof(char*);
 | 
			
		||||
    c += sizeof(char*);				/* one extra for NULL term */
 | 
			
		||||
 | 
			
		||||
    rbuf = xrealloc(rbuf, tot + c + align);	/* make room for ptrs AT END */
 | 
			
		||||
    endbuf = rbuf + tot;			/* addr just past data buf */
 | 
			
		||||
    q = ret = (char**) (endbuf+align);		/* ==> free(*ret) to dealloc */
 | 
			
		||||
    *q++ = p = rbuf;				/* point ptrs to the strings */
 | 
			
		||||
    endbuf--;					/* do not traverse final NUL */
 | 
			
		||||
    while (++p < endbuf) 
 | 
			
		||||
    	if (!*p)				/* NUL char implies that */
 | 
			
		||||
	    *q++ = p+1;				/* next string -> next char */
 | 
			
		||||
 | 
			
		||||
    *q = 0;					/* null ptr list terminator */
 | 
			
		||||
    return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* These are some nice GNU C expression subscope "inline" functions.
 | 
			
		||||
   The can be used with arbitrary types and evaluate their arguments
 | 
			
		||||
   exactly once.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
/* Test if item X of type T is present in the 0 terminated list L */
 | 
			
		||||
#   define XinL(T, X, L) ( {			\
 | 
			
		||||
	    T  x = (X), *l = (L);		\
 | 
			
		||||
	    while (*l && *l != x) l++;		\
 | 
			
		||||
	    *l == x;				\
 | 
			
		||||
	} )
 | 
			
		||||
 | 
			
		||||
/* Test if item X of type T is present in the list L of length N */
 | 
			
		||||
#   define XinLN(T, X, L, N) ( {		\
 | 
			
		||||
	    T x = (X), *l = (L);		\
 | 
			
		||||
	    int i = 0, n = (N);			\
 | 
			
		||||
	    while (i < n && l[i] != x) i++;	\
 | 
			
		||||
	    i < n && l[i] == x;			\
 | 
			
		||||
	} )
 | 
			
		||||
 | 
			
		||||
/* readproc: return a pointer to a proc_t filled with requested info about the
 | 
			
		||||
 * next process available matching the restriction set.  If no more such
 | 
			
		||||
 * processes are available, return a null pointer (boolean false).  Use the
 | 
			
		||||
 * passed buffer instead of allocating space if it is non-NULL.  */
 | 
			
		||||
 | 
			
		||||
/* This is optimized so that if a PID list is given, only those files are
 | 
			
		||||
 * searched for in /proc.  If other lists are given in addition to the PID list,
 | 
			
		||||
 * the same logic can follow through as for the no-PID list case.  This is
 | 
			
		||||
 * fairly complex, but it does try to not to do any unnecessary work.
 | 
			
		||||
 * Unfortunately, the reverse filtering option in which any PID *except* the
 | 
			
		||||
 * ones listed is pursued.
 | 
			
		||||
 */
 | 
			
		||||
#define flags (PT->flags)
 | 
			
		||||
proc_t* readproc(PROCTAB* PT, proc_t* rbuf) {
 | 
			
		||||
    static struct direct *ent;		/* dirent handle */
 | 
			
		||||
    static struct stat sb;		/* stat buffer */
 | 
			
		||||
    static char path[32], sbuf[256];	/* bufs for stat,statm */
 | 
			
		||||
    int allocated = 0, matched = 0;	/* flags */
 | 
			
		||||
    proc_t *p = NULL;
 | 
			
		||||
 | 
			
		||||
    /* loop until a proc matching restrictions is found or no more processes */
 | 
			
		||||
    /* I know this could be a while loop -- this way is easier to indent ;-) */
 | 
			
		||||
next_proc:				/* get next PID for consideration */
 | 
			
		||||
    if (Do(PID)) {
 | 
			
		||||
	if (!*PT->pids)			/* set to next item in pids */
 | 
			
		||||
	    return NULL;
 | 
			
		||||
	sprintf(path, "/proc/%d", *(PT->pids)++);
 | 
			
		||||
	matched = 1;
 | 
			
		||||
    } else {					/* get next numeric /proc ent */
 | 
			
		||||
	while ((ent = readdir(PT->procfs)) &&
 | 
			
		||||
	       (*ent->d_name < '0' || *ent->d_name > '9'))
 | 
			
		||||
	    ;
 | 
			
		||||
	if (!ent || !ent->d_name)
 | 
			
		||||
	    return NULL;
 | 
			
		||||
	sprintf(path, "/proc/%s", ent->d_name);
 | 
			
		||||
    }
 | 
			
		||||
    if (stat(path, &sb) == -1)		/* no such dirent (anymore) */
 | 
			
		||||
	goto next_proc;
 | 
			
		||||
    if (Do(UID) && !XinLN(uid_t, sb.st_uid, PT->uids, PT->nuid))
 | 
			
		||||
	goto next_proc;			/* not one of the requested uids */
 | 
			
		||||
 | 
			
		||||
    if (!allocated) {				 /* assign mem for return buf */
 | 
			
		||||
	p = rbuf ? rbuf : xcalloc(p, sizeof *p); /* passed buf or alloced mem */
 | 
			
		||||
	allocated = 1;				 /* remember space is set up */
 | 
			
		||||
    }
 | 
			
		||||
    p->uid = sb.st_uid;			/* need a way to get real uid */
 | 
			
		||||
 | 
			
		||||
    if ((file2str(path, "stat", sbuf, sizeof sbuf)) == -1)
 | 
			
		||||
	goto next_proc;			/* error reading /proc/#/stat */
 | 
			
		||||
    stat2proc(sbuf, p);				/* parse /proc/#/stat */
 | 
			
		||||
 | 
			
		||||
    if (!matched && Do(TTY) && !XinL(dev_t, p->tty, PT->ttys))
 | 
			
		||||
	goto next_proc;			/* not one of the requested ttys */
 | 
			
		||||
 | 
			
		||||
    if (!matched && Do(ANYTTY) && p->tty == -1)
 | 
			
		||||
	goto next_proc;			/* no controlling terminal */
 | 
			
		||||
 | 
			
		||||
    if (!matched && Do(STAT) && !strchr(PT->stats,p->state))
 | 
			
		||||
	goto next_proc;			/* not one of the requested states */
 | 
			
		||||
 | 
			
		||||
    if (Do(FILLMEM)) {				/* read, parse /proc/#/statm */
 | 
			
		||||
	if ((file2str(path, "statm", sbuf, sizeof sbuf)) != -1 )
 | 
			
		||||
	    statm2proc(sbuf, p);		/* ignore statm errors here */
 | 
			
		||||
    }						/* statm fields just zero */
 | 
			
		||||
 | 
			
		||||
    /* some number->text resolving which is time consuming */
 | 
			
		||||
    if (Do(FILLTTY))
 | 
			
		||||
	dev_to_tty(p->ttyc, p->tty);
 | 
			
		||||
    if (Do(FILLUSR))
 | 
			
		||||
	strncpy(p->user, user_from_uid(p->uid), sizeof p->user);
 | 
			
		||||
 | 
			
		||||
    if (Do(FILLCMD))				/* read+parse /proc/#/cmdline */
 | 
			
		||||
	p->cmdline = file2strvec(path, "cmdline");
 | 
			
		||||
    if (Do(FILLENV))				/* read+parse /proc/#/environ */
 | 
			
		||||
	p->environ = file2strvec(path, "environ");
 | 
			
		||||
    
 | 
			
		||||
    if (p->state == 'Z')			/* fixup cmd for zombies */
 | 
			
		||||
	strncat(p->cmd," <zombie>", sizeof p->cmd);
 | 
			
		||||
 | 
			
		||||
    return p;
 | 
			
		||||
}
 | 
			
		||||
#undef flags
 | 
			
		||||
 | 
			
		||||
/* Convenient wrapper around openproc and readproc to slurp in the whole process
 | 
			
		||||
 * tree subset satisfying the constraints of flags and the optional PID list.
 | 
			
		||||
 * Free allocated memory with freeproctree().  The tree structure is a classic
 | 
			
		||||
 * left-list children + right-list siblings.  The algorithm is a two-pass of the
 | 
			
		||||
 * process table.  Since most process trees will have children with strictly
 | 
			
		||||
 * increasing PIDs, most of the structure will be picked up in the first pass.
 | 
			
		||||
 * The second loop then cleans up any nodes which turn out to have preceeded
 | 
			
		||||
 * their parent in /proc order.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/* Traverse tree 't' breadth-first looking for a process with pid p */
 | 
			
		||||
proc_t* LookupPID(proc_t* t, pid_t p) {
 | 
			
		||||
    proc_t* tmp = NULL;
 | 
			
		||||
    if (!t)
 | 
			
		||||
	return NULL;
 | 
			
		||||
    if (t->pid == p)				/* look here/terminate recursion */
 | 
			
		||||
	return t;
 | 
			
		||||
    if ((tmp = LookupPID(t->l, p)))		/* recurse over children */
 | 
			
		||||
	return tmp;
 | 
			
		||||
    for (; t; t=t->r)				/* recurse over siblings */
 | 
			
		||||
	if ((tmp = LookupPID(tmp, p)))
 | 
			
		||||
	    return tmp;
 | 
			
		||||
    return NULL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
proc_t* readproctree(int flags, ...) {
 | 
			
		||||
    static proc_t tree;
 | 
			
		||||
    PROCTAB* PT = NULL;
 | 
			
		||||
    proc_t *node, *tmp=NULL, *tmp2=NULL;
 | 
			
		||||
    va_list ap;
 | 
			
		||||
    
 | 
			
		||||
    /* pass through apropriate arguments to openproc */
 | 
			
		||||
    va_start(ap, flags);
 | 
			
		||||
    if (Do(UID)) {
 | 
			
		||||
	/* temporary variables to ensure that va_arg() instances
 | 
			
		||||
	 * are called in the right order
 | 
			
		||||
	 */
 | 
			
		||||
	uid_t* u;
 | 
			
		||||
	int i;
 | 
			
		||||
 | 
			
		||||
	u = va_arg(ap, uid_t*);
 | 
			
		||||
	i = va_arg(ap, int);
 | 
			
		||||
	PT = openproc(flags, u, i);
 | 
			
		||||
    }
 | 
			
		||||
    else if (Do(PID) || Do(TTY) || Do(STAT))
 | 
			
		||||
	PT = openproc(flags, va_arg(ap, void*));
 | 
			
		||||
    else
 | 
			
		||||
	PT = openproc(flags);
 | 
			
		||||
    va_end(ap);
 | 
			
		||||
 | 
			
		||||
    /* first pass: build tree, putting orphans on the first level */
 | 
			
		||||
    tree.l = tree.r = NULL;
 | 
			
		||||
    while ((node = readproc(PT,0)))
 | 
			
		||||
	if ((tmp = LookupPID(&tree, node->ppid))) {
 | 
			
		||||
	    node->r = tmp->l->r;	/* node --> left list of parent */
 | 
			
		||||
	    tmp->l->r = node;
 | 
			
		||||
	} else {
 | 
			
		||||
	    node->r = tree.r;		/* node --> right list of 'tree' */
 | 
			
		||||
	    tree.r = node;
 | 
			
		||||
	}
 | 
			
		||||
    /* second pass: scan tree for PPIDs of level-1 nodes moving links as necessary */
 | 
			
		||||
    for (node = &tree; node; node = node->r)
 | 
			
		||||
	if ((tmp = LookupPID(&tree, node->r->ppid))) {
 | 
			
		||||
	    tmp2 = node->r;			/* unlink from right list of 'tree' */
 | 
			
		||||
	    node->r = node->r->r;
 | 
			
		||||
	    tmp2->r = tmp->l->r;		/* insert as child of found node */
 | 
			
		||||
	    tmp->l->r = node;
 | 
			
		||||
	}
 | 
			
		||||
    closeproc(PT);
 | 
			
		||||
    return &tree;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Convenient wrapper around openproc and readproc to slurp in the whole process
 | 
			
		||||
 * table subset satisfying the constraints of flags and the optional PID list.
 | 
			
		||||
 * Free allocated memory with freeproctab().  Access via tab[N]->member.  The
 | 
			
		||||
 * pointer list is NULL terminated.
 | 
			
		||||
 */
 | 
			
		||||
proc_t** readproctab(int flags, ...) {
 | 
			
		||||
    PROCTAB* PT = NULL;
 | 
			
		||||
    proc_t** tab = NULL;
 | 
			
		||||
    int n = 0;
 | 
			
		||||
    va_list ap;
 | 
			
		||||
 | 
			
		||||
    va_start(ap, flags);		/* pass through args to openproc */
 | 
			
		||||
    if (Do(UID)) {
 | 
			
		||||
	/* temporary variables to ensure that va_arg() instances
 | 
			
		||||
	 * are called in the right order
 | 
			
		||||
	 */
 | 
			
		||||
	uid_t* u;
 | 
			
		||||
	int i;
 | 
			
		||||
 | 
			
		||||
	u = va_arg(ap, uid_t*);
 | 
			
		||||
	i = va_arg(ap, int);
 | 
			
		||||
	PT = openproc(flags, u, i);
 | 
			
		||||
    }
 | 
			
		||||
    else if (Do(PID) || Do(TTY) || Do(STAT))
 | 
			
		||||
	PT = openproc(flags, va_arg(ap, void*)); /* assume ptr sizes same */
 | 
			
		||||
    else
 | 
			
		||||
	PT = openproc(flags);
 | 
			
		||||
    va_end(ap);
 | 
			
		||||
    do {					/* read table: */
 | 
			
		||||
	tab = xrealloc(tab, (n+1)*sizeof(proc_t*));/* realloc as we go, using */
 | 
			
		||||
	tab[n] = readproc(PT, NULL);		  /* final null to terminate */
 | 
			
		||||
    } while (tab[n++]);				  /* stop when NULL reached */
 | 
			
		||||
    closeproc(PT);
 | 
			
		||||
    return tab;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* deallocate a table of pointers to proc structures
 | 
			
		||||
 */
 | 
			
		||||
void freeproctab(proc_t** tab) {
 | 
			
		||||
    proc_t** p;
 | 
			
		||||
    for(p = tab; *p; p++)
 | 
			
		||||
	freeproc(*p);
 | 
			
		||||
    free(tab);
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										168
									
								
								libproc/readproc.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										168
									
								
								libproc/readproc.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,168 @@
 | 
			
		||||
/*
 | 
			
		||||
 * New Interface to Process Table -- PROCTAB Stream (a la Directory streams)
 | 
			
		||||
 * Copyright(C) 1996. Charles L. Blake.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/* Basic data structure which holds all information we can get about a process.
 | 
			
		||||
 * (unless otherwise specified, fields are read from /proc/#/stat)
 | 
			
		||||
 */
 | 
			
		||||
typedef struct proc_s {
 | 
			
		||||
    char
 | 
			
		||||
    	user[10],	/* user name corresponding to owner of process */
 | 
			
		||||
    	cmd[40],	/* basename of executable file in call to exec(2) */
 | 
			
		||||
    	state,		/* single-char code for process state (S=sleeping) */
 | 
			
		||||
    	ttyc[5],	/* string representation of controlling tty device */
 | 
			
		||||
	**environ,	/* environment string vector (/proc/#/environ) */
 | 
			
		||||
	**cmdline;	/* command line string vector (/proc/#/cmdline) */
 | 
			
		||||
    int
 | 
			
		||||
    	uid,		/* user id */
 | 
			
		||||
    	pid,		/* process id */
 | 
			
		||||
    	ppid,		/* pid of parent process */
 | 
			
		||||
	pgrp,		/* process group id */
 | 
			
		||||
	session,	/* session id */
 | 
			
		||||
	tty,		/* full device number of controlling terminal */
 | 
			
		||||
	tpgid,		/* terminal process group id */
 | 
			
		||||
	priority,	/* kernel scheduling priority */
 | 
			
		||||
	nice;		/* standard unix nice level of process */
 | 
			
		||||
    long long
 | 
			
		||||
	signal,		/* mask of pending signals */
 | 
			
		||||
	blocked,	/* mask of blocked signals */
 | 
			
		||||
	sigignore,	/* mask of ignored signals */
 | 
			
		||||
	sigcatch;	/* mask of caught  signals */
 | 
			
		||||
    long
 | 
			
		||||
	start_time,	/* start time of process -- seconds since 1-1-70 */
 | 
			
		||||
	utime,		/* user-mode CPU time accumulated by process */
 | 
			
		||||
	stime,		/* kernel-mode CPU time accumulated by process */
 | 
			
		||||
	cutime,		/* cumulative utime of process and reaped children */
 | 
			
		||||
	cstime,		/* cumulative stime of process and reaped children */
 | 
			
		||||
    /* the next 7 members come from /proc/#/statm */
 | 
			
		||||
	size,		/* total # of pages of memory */
 | 
			
		||||
	resident,	/* number of resident set (non-swapped) pages (4k) */
 | 
			
		||||
	share,		/* number of pages of shared (mmap'd) memory */
 | 
			
		||||
	trs,		/* text resident set size */
 | 
			
		||||
	lrs,		/* shared-lib resident set size */
 | 
			
		||||
	drs,		/* data resident set size */
 | 
			
		||||
	dt;		/* dirty pages */
 | 
			
		||||
    unsigned
 | 
			
		||||
        pcpu;           /* %CPU usage (is not filled in by readproc!!!) */
 | 
			
		||||
    unsigned long
 | 
			
		||||
	vsize,		/* number of pages of virtual memory ... */
 | 
			
		||||
	rss,		/* resident set size from /proc/#/stat */
 | 
			
		||||
	rss_rlim,	/* resident set size ... ? */
 | 
			
		||||
	timeout,	/* ? */
 | 
			
		||||
	it_real_value,	/* ? */
 | 
			
		||||
	flags,		/* kernel flags for the process */
 | 
			
		||||
	min_flt,	/* number of minor page faults since process start */
 | 
			
		||||
	maj_flt,	/* number of major page faults since process start */
 | 
			
		||||
	cmin_flt,	/* cumulative min_flt of process and child processes */
 | 
			
		||||
	cmaj_flt,	/* cumulative maj_flt of process and child processes */
 | 
			
		||||
	start_code,	/* address of beginning of code segment */
 | 
			
		||||
	end_code,	/* address of end of code segment */
 | 
			
		||||
	start_stack,	/* address of the bottom of stack for the process */
 | 
			
		||||
	kstk_esp,	/* kernel stack pointer */
 | 
			
		||||
	kstk_eip,	/* kernel stack pointer */
 | 
			
		||||
	wchan;		/* address of kernel wait channel proc is sleeping in */
 | 
			
		||||
    struct proc_s *l,	/* ptrs for building arbitrary linked structs */
 | 
			
		||||
                  *r;	/* (i.e. singly/doubly-linked lists and trees */
 | 
			
		||||
} proc_t;
 | 
			
		||||
 | 
			
		||||
/* PROCTAB: data structure holding the persistent information readproc needs
 | 
			
		||||
 * from openproc().  The setup is intentionally similar to the dirent interface
 | 
			
		||||
 * and other system table interfaces (utmp+wtmp come to mind).
 | 
			
		||||
 */
 | 
			
		||||
#include <sys/types.h>
 | 
			
		||||
#include <dirent.h>
 | 
			
		||||
#include <unistd.h>
 | 
			
		||||
typedef struct {
 | 
			
		||||
    DIR*	procfs;
 | 
			
		||||
    int		flags;
 | 
			
		||||
    pid_t*	pids;	/* pids of the procs */
 | 
			
		||||
    dev_t*	ttys;	/* devnos of the cttys */
 | 
			
		||||
    uid_t*	uids;	/* uids of procs */
 | 
			
		||||
    int		nuid;	/* cannot really sentinel-terminate unsigned short[] */
 | 
			
		||||
    char*	stats;	/* status chars (actually output into /proc//stat) */
 | 
			
		||||
} PROCTAB;
 | 
			
		||||
 | 
			
		||||
/* initialize a PROCTAB structure holding needed call-to-call persistent data
 | 
			
		||||
 */
 | 
			
		||||
PROCTAB* openproc(int flags, ... /* pid_t*|uid_t*|dev_t*|char* [, int n] */ );
 | 
			
		||||
 | 
			
		||||
/* Convenient wrapper around openproc and readproc to slurp in the whole process
 | 
			
		||||
 * table subset satisfying the constraints of flags and the optional PID list.
 | 
			
		||||
 * Free allocated memory with freeproctab().  Access via tab[N]->member.  The
 | 
			
		||||
 * pointer list is NULL terminated.
 | 
			
		||||
 */
 | 
			
		||||
proc_t** readproctab(int flags, ... /* same as openproc */ );
 | 
			
		||||
 | 
			
		||||
/* Convenient wrapper around openproc and readproc to slurp in the whole process
 | 
			
		||||
 * tree subset satisfying the constraints of flags and the optional PID list.
 | 
			
		||||
 */
 | 
			
		||||
proc_t* readproctree(int flags, ... /* same as openproc */ );
 | 
			
		||||
 | 
			
		||||
/* clean-up open files, etc from the openproc()
 | 
			
		||||
 */
 | 
			
		||||
void closeproc(PROCTAB* PT);
 | 
			
		||||
 | 
			
		||||
/* retrieve the next process matching the criteria set by the openproc()
 | 
			
		||||
 */
 | 
			
		||||
proc_t* readproc(PROCTAB* PT, proc_t* return_buf);
 | 
			
		||||
 | 
			
		||||
/* deallocate space allocated by readproc
 | 
			
		||||
 */
 | 
			
		||||
void freeproc(proc_t* p);
 | 
			
		||||
 | 
			
		||||
/* deallocate space allocated by readproctab
 | 
			
		||||
 */
 | 
			
		||||
void freeproctab(proc_t** p);
 | 
			
		||||
 | 
			
		||||
/* openproc/readproctab:
 | 
			
		||||
 *   
 | 
			
		||||
 * Return PROCTAB* / *proc_t[] or NULL on error ((probably) "/proc" cannot be
 | 
			
		||||
 * opened.)  By default readproc will consider all processes as valid to parse
 | 
			
		||||
 * and return, but not actually fill in the cmdline, environ, and /proc/#/statm
 | 
			
		||||
 * derived memory fields.
 | 
			
		||||
 *
 | 
			
		||||
 * `flags' (a bitwise-or of PROC_* below) modifies the default behavior.  The
 | 
			
		||||
 * "fill" options will cause more of the proc_t to be filled in.  The "filter"
 | 
			
		||||
 * options all use the second argument as the pointer to a list of objects:
 | 
			
		||||
 * process status', process id's, user id's, and tty device numbers.  The third
 | 
			
		||||
 * argument is the length of the list (currently only used for lists of user
 | 
			
		||||
 * id's since unsigned short[] supports no convenient termination sentinel.)
 | 
			
		||||
 */
 | 
			
		||||
#define PROC_FILLMEM 0x1   /* read statm into the appropriate proc_t entries */
 | 
			
		||||
#define PROC_FILLCMD 0x2   /* alloc and fill in `cmdline' part of proc_t */
 | 
			
		||||
#define PROC_FILLENV 0x4   /* alloc and fill in `environ' part of proc_t */
 | 
			
		||||
#define PROC_FILLTTY 0x8   /* resolve device number -> tty name via psdevtab */
 | 
			
		||||
#define PROC_FILLUSR 0x10  /* resolve user id number -> user name via passwd */
 | 
			
		||||
                       /* consider only processes with one of the passed: */
 | 
			
		||||
#define PROC_PID     0x100  /* process id numbers ( 0   terminated) */
 | 
			
		||||
#define PROC_TTY     0x200  /* ctty device nos.   ( 0   terminated) */
 | 
			
		||||
#define PROC_UID     0x400  /* user id numbers    ( length needed ) */
 | 
			
		||||
#define PROC_STAT    0x800  /* status fields      ('\0' terminated) */
 | 
			
		||||
#define PROC_ANYTTY  0x1000 /* proc must have a controlling terminal */
 | 
			
		||||
 | 
			
		||||
/* utility functions which may be of general interest: */
 | 
			
		||||
 | 
			
		||||
/* slurp /proc/DIR/FILE into a single large string into the passed
 | 
			
		||||
   buffer.  return the number of bytes actually used.  used for stat,statm
 | 
			
		||||
 */
 | 
			
		||||
int file2str(char *dir, char *file, char *buf, int buf_size);
 | 
			
		||||
 | 
			
		||||
/* convert a file of null terminated strings into an argv-style string vector
 | 
			
		||||
 * which may be de-allocated with a single free() on a dereference of the return
 | 
			
		||||
 * value, e.g. free(*ret).  used for cmdline, environ.
 | 
			
		||||
 */
 | 
			
		||||
char** file2strvec(char* directory, char* what);
 | 
			
		||||
 | 
			
		||||
/* parse /proc/#/stat  entries in string s into a proc_t
 | 
			
		||||
 */
 | 
			
		||||
void stat2proc(char* S, proc_t*);
 | 
			
		||||
 | 
			
		||||
/* parse /proc/#/statm entries in string s into a proc_t
 | 
			
		||||
 */
 | 
			
		||||
void statm2proc(char* s, proc_t*);
 | 
			
		||||
 | 
			
		||||
/* convert a memory buffer with nulls into a single string,
 | 
			
		||||
   replacing the nulls with sep.  No longer used.
 | 
			
		||||
 */
 | 
			
		||||
void nulls2sep(char* str, int len, char sep);
 | 
			
		||||
							
								
								
									
										65
									
								
								libproc/signals.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										65
									
								
								libproc/signals.c
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,65 @@
 | 
			
		||||
/* signals.c - signal name handling */
 | 
			
		||||
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include <ctype.h>
 | 
			
		||||
#include "proc/signals.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
typedef struct {
 | 
			
		||||
    int number;
 | 
			
		||||
    char *name;
 | 
			
		||||
} SIGNAME;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static SIGNAME signals[] = {
 | 
			
		||||
#include "signames.h" /* should be in same dir as this file */
 | 
			
		||||
  { 0,NULL }};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void list_signals(void)
 | 
			
		||||
{
 | 
			
		||||
    SIGNAME *walk;
 | 
			
		||||
    int col;
 | 
			
		||||
 | 
			
		||||
    col = 0;
 | 
			
		||||
    for (walk = signals; walk->name; walk++) {
 | 
			
		||||
	if (col+strlen(walk->name)+1 > 80) {
 | 
			
		||||
	    putchar('\n');
 | 
			
		||||
	    col = 0;
 | 
			
		||||
	}
 | 
			
		||||
	printf("%s%s",col ? " " : "",walk->name);
 | 
			
		||||
	col += strlen(walk->name)+1;
 | 
			
		||||
    }
 | 
			
		||||
    putchar('\n');
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
int get_signal(char *name,char *cmd)
 | 
			
		||||
{
 | 
			
		||||
    SIGNAME *walk;
 | 
			
		||||
 | 
			
		||||
    if (isdigit(*name))
 | 
			
		||||
	return atoi(name);
 | 
			
		||||
    for (walk = signals; walk->name; walk++)
 | 
			
		||||
	if (!strcmp(walk->name,name)) break;
 | 
			
		||||
    if (walk->name) return walk->number;
 | 
			
		||||
    fprintf(stderr,"%s: unknown signal; %s -l lists signals.\n",name,cmd);
 | 
			
		||||
    exit(1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* get_signal2 is by Michael Shields. 1994/04/25. */
 | 
			
		||||
int get_signal2(char *name)
 | 
			
		||||
{
 | 
			
		||||
    SIGNAME *walk;
 | 
			
		||||
 | 
			
		||||
    if (!name)
 | 
			
		||||
        return(-1);
 | 
			
		||||
    if (isdigit(*name))
 | 
			
		||||
	return atoi(name);
 | 
			
		||||
    for (walk = signals; walk->name; walk++)
 | 
			
		||||
        if (!strcmp(walk->name,name))
 | 
			
		||||
            return(walk->number);
 | 
			
		||||
    return(-1);
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										12
									
								
								libproc/signals.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								libproc/signals.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,12 @@
 | 
			
		||||
/* signals.h - signal name handling */
 | 
			
		||||
 | 
			
		||||
void list_signals(void);
 | 
			
		||||
 | 
			
		||||
/* Lists all known signal names on standard output. */
 | 
			
		||||
 | 
			
		||||
int get_signal(char *name,char *cmd);
 | 
			
		||||
int get_signal2(char *name);
 | 
			
		||||
 | 
			
		||||
/* Returns the signal number of NAME. If no such signal exists, an error
 | 
			
		||||
   message is displayed and the program is terminated. CMD is the name of the
 | 
			
		||||
   application. */
 | 
			
		||||
							
								
								
									
										32
									
								
								libproc/signames.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								libproc/signames.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,32 @@
 | 
			
		||||
{ 1,"HUP" },
 | 
			
		||||
{ 2,"INT" },
 | 
			
		||||
{ 3,"QUIT" },
 | 
			
		||||
{ 4,"ILL" },
 | 
			
		||||
{ 5,"TRAP" },
 | 
			
		||||
{ 6,"ABRT" },
 | 
			
		||||
{ 6,"IOT" },
 | 
			
		||||
{ 7,"BUS" },
 | 
			
		||||
{ 8,"FPE" },
 | 
			
		||||
{ 9,"KILL" },
 | 
			
		||||
{ 10,"USR1" },
 | 
			
		||||
{ 11,"SEGV" },
 | 
			
		||||
{ 12,"USR2" },
 | 
			
		||||
{ 13,"PIPE" },
 | 
			
		||||
{ 14,"ALRM" },
 | 
			
		||||
{ 15,"TERM" },
 | 
			
		||||
{ 16,"STKFLT" },
 | 
			
		||||
{ 17,"CHLD" },
 | 
			
		||||
{ 18,"CONT" },
 | 
			
		||||
{ 19,"STOP" },
 | 
			
		||||
{ 20,"TSTP" },
 | 
			
		||||
{ 21,"TTIN" },
 | 
			
		||||
{ 22,"TTOU" },
 | 
			
		||||
{ 23,"URG" },
 | 
			
		||||
{ 24,"XCPU" },
 | 
			
		||||
{ 25,"XFSZ" },
 | 
			
		||||
{ 26,"VTALRM" },
 | 
			
		||||
{ 27,"PROF" },
 | 
			
		||||
{ 28,"WINCH" },
 | 
			
		||||
{ 29,"IO" },
 | 
			
		||||
{ 30,"PWR" },
 | 
			
		||||
{ 31,"UNUSED" },
 | 
			
		||||
							
								
								
									
										20
									
								
								libproc/status.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								libproc/status.c
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,20 @@
 | 
			
		||||
#include "proc/ps.h"
 | 
			
		||||
#include "proc/readproc.h"
 | 
			
		||||
 | 
			
		||||
char * status(proc_t* task) {
 | 
			
		||||
    static char buf[4] = "   ";
 | 
			
		||||
 | 
			
		||||
    buf[0] = task->state;
 | 
			
		||||
    if (task->rss == 0 && task->state != 'Z')
 | 
			
		||||
        buf[1] = 'W';
 | 
			
		||||
    else
 | 
			
		||||
        buf[1] = ' ';
 | 
			
		||||
    if (task->nice < 0)
 | 
			
		||||
	buf[2] = '<';
 | 
			
		||||
    else if (task->nice > 0)
 | 
			
		||||
	buf[2] = 'N';
 | 
			
		||||
    else
 | 
			
		||||
	buf[2] = ' ';
 | 
			
		||||
 | 
			
		||||
    return(buf);
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										176
									
								
								libproc/sysinfo.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										176
									
								
								libproc/sysinfo.c
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,176 @@
 | 
			
		||||
/* File for parsing top-level /proc entities. */
 | 
			
		||||
#include "proc/sysinfo.h"
 | 
			
		||||
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include <ctype.h>
 | 
			
		||||
 | 
			
		||||
#include <unistd.h>
 | 
			
		||||
#include <fcntl.h>
 | 
			
		||||
#include "proc/version.h"
 | 
			
		||||
 | 
			
		||||
#define BAD_OPEN_MESSAGE					\
 | 
			
		||||
"Error: /proc must be mounted\n"				\
 | 
			
		||||
"  To mount /proc at boot you need an /etc/fstab line like:\n"	\
 | 
			
		||||
"      /proc   /proc   proc    defaults\n"			\
 | 
			
		||||
"  In the meantime, mount /proc /proc -t proc\n"
 | 
			
		||||
 | 
			
		||||
#define UPTIME_FILE  "/proc/uptime"
 | 
			
		||||
#define LOADAVG_FILE "/proc/loadavg"
 | 
			
		||||
#define MEMINFO_FILE "/proc/meminfo"
 | 
			
		||||
 | 
			
		||||
static char buf[1024];
 | 
			
		||||
 | 
			
		||||
/* This macro opens FILE only if necessary and seeks to 0 so that successive
 | 
			
		||||
   calls to the functions are more efficient.  It also reads the current
 | 
			
		||||
   contents of the file into the global buf.
 | 
			
		||||
*/
 | 
			
		||||
#define FILE_TO_BUF(FILE) {					\
 | 
			
		||||
    static int n, fd = -1;					\
 | 
			
		||||
    if (fd == -1 && (fd = open(FILE, O_RDONLY)) == -1) {	\
 | 
			
		||||
	fprintf(stderr, BAD_OPEN_MESSAGE);			\
 | 
			
		||||
	close(fd);						\
 | 
			
		||||
	return 0;						\
 | 
			
		||||
    }								\
 | 
			
		||||
    lseek(fd, 0L, SEEK_SET);					\
 | 
			
		||||
    if ((n = read(fd, buf, sizeof buf - 1)) < 0) {		\
 | 
			
		||||
	perror(FILE);						\
 | 
			
		||||
	close(fd);						\
 | 
			
		||||
	fd = -1;						\
 | 
			
		||||
	return 0;						\
 | 
			
		||||
    }								\
 | 
			
		||||
    buf[n] = '\0';						\
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#define SET_IF_DESIRED(x,y)  if (x) *(x) = (y)	/* evals 'x' twice */
 | 
			
		||||
 | 
			
		||||
int uptime(double *uptime_secs, double *idle_secs) {
 | 
			
		||||
    double up=0, idle=0;
 | 
			
		||||
    
 | 
			
		||||
    FILE_TO_BUF(UPTIME_FILE)
 | 
			
		||||
    if (sscanf(buf, "%lf %lf", &up, &idle) < 2) {
 | 
			
		||||
	fprintf(stderr, "bad data in " UPTIME_FILE "\n");
 | 
			
		||||
	return 0;
 | 
			
		||||
    }
 | 
			
		||||
    SET_IF_DESIRED(uptime_secs, up);
 | 
			
		||||
    SET_IF_DESIRED(idle_secs, idle);
 | 
			
		||||
    return up;	/* assume never be zero seconds in practice */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int loadavg(double *av1, double *av5, double *av15) {
 | 
			
		||||
    double avg_1=0, avg_5=0, avg_15=0;
 | 
			
		||||
    
 | 
			
		||||
    FILE_TO_BUF(LOADAVG_FILE)
 | 
			
		||||
    if (sscanf(buf, "%lf %lf %lf", &avg_1, &avg_5, &avg_15) < 3) {
 | 
			
		||||
	fprintf(stderr, "bad data in " LOADAVG_FILE "\n");
 | 
			
		||||
	exit(1);
 | 
			
		||||
    }
 | 
			
		||||
    SET_IF_DESIRED(av1,  avg_1);
 | 
			
		||||
    SET_IF_DESIRED(av5,  avg_5);
 | 
			
		||||
    SET_IF_DESIRED(av15, avg_15);
 | 
			
		||||
    return 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* The following /proc/meminfo parsing routine assumes the following format:
 | 
			
		||||
   [ <label> ... ]				# header lines
 | 
			
		||||
   [ <label> ] <num> [ <num> ... ]		# table rows
 | 
			
		||||
   [ repeats of above line ]
 | 
			
		||||
   
 | 
			
		||||
   Any lines with fewer <num>s than <label>s get trailing <num>s set to zero.
 | 
			
		||||
   The return value is a NULL terminated unsigned** which is the table of
 | 
			
		||||
   numbers without labels.  Convenient enumeration constants for the major and
 | 
			
		||||
   minor dimensions are available in the header file.  Note that this version
 | 
			
		||||
   requires that labels do not contain digits.  It is readily extensible to
 | 
			
		||||
   labels which do not *begin* with digits, though.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#define MAX_ROW 3	/* these are a little liberal for flexibility */
 | 
			
		||||
#define MAX_COL 7
 | 
			
		||||
 | 
			
		||||
unsigned** meminfo(void) {
 | 
			
		||||
    static unsigned *row[MAX_ROW + 1];		/* row pointers */
 | 
			
		||||
    static unsigned num[MAX_ROW * MAX_COL];	/* number storage */
 | 
			
		||||
    char *p;
 | 
			
		||||
    char fieldbuf[12];		/* bigger than any field name or size in kb */
 | 
			
		||||
    int i, j, k, l;
 | 
			
		||||
    
 | 
			
		||||
    set_linux_version();
 | 
			
		||||
    FILE_TO_BUF(MEMINFO_FILE)
 | 
			
		||||
    if (!row[0])				/* init ptrs 1st time through */
 | 
			
		||||
	for (i=0; i < MAX_ROW; i++)		/* std column major order: */
 | 
			
		||||
	    row[i] = num + MAX_COL*i;		/* A[i][j] = A + COLS*i + j */
 | 
			
		||||
    p = buf;
 | 
			
		||||
    for (i=0; i < MAX_ROW; i++)			/* zero unassigned fields */
 | 
			
		||||
	for (j=0; j < MAX_COL; j++)
 | 
			
		||||
	    row[i][j] = 0;
 | 
			
		||||
    if (linux_version_code < LINUX_VERSION(2,0,0)) {
 | 
			
		||||
    	for (i=0; i < MAX_ROW && *p; i++) {                /* loop over rows */
 | 
			
		||||
		while(*p && !isdigit(*p)) p++;          /* skip chars until a digit */
 | 
			
		||||
		for (j=0; j < MAX_COL && *p; j++) {     /* scanf column-by-column */
 | 
			
		||||
		    l = sscanf(p, "%u%n", row[i] + j, &k);
 | 
			
		||||
		    p += k;                             /* step over used buffer */
 | 
			
		||||
		    if (*p == '\n' || l < 1)            /* end of line/buffer */
 | 
			
		||||
			break;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
    }
 | 
			
		||||
    else {
 | 
			
		||||
	    while(*p) {
 | 
			
		||||
	    	sscanf(p,"%11s%n",fieldbuf,&k);
 | 
			
		||||
	    	if(!strcmp(fieldbuf,"MemTotal:")) {
 | 
			
		||||
	    		p+=k;
 | 
			
		||||
	    		sscanf(p," %d",&(row[meminfo_main][meminfo_total]));
 | 
			
		||||
	    		row[meminfo_main][meminfo_total]<<=10;
 | 
			
		||||
	    		while(*p++ != '\n');
 | 
			
		||||
	    	}
 | 
			
		||||
	    	else if(!strcmp(fieldbuf,"MemFree:")) {
 | 
			
		||||
	    		p+=k;
 | 
			
		||||
	    		sscanf(p," %d",&(row[meminfo_main][meminfo_free]));
 | 
			
		||||
	    		row[meminfo_main][meminfo_free]<<=10;
 | 
			
		||||
	    		while(*p++ != '\n');
 | 
			
		||||
	    	}
 | 
			
		||||
	    	else if(!strcmp(fieldbuf,"MemShared:")) {
 | 
			
		||||
	    		p+=k;
 | 
			
		||||
	    		sscanf(p," %d",&(row[meminfo_main][meminfo_shared]));
 | 
			
		||||
	    		row[meminfo_main][meminfo_shared]<<=10;
 | 
			
		||||
	    		while(*p++ != '\n');
 | 
			
		||||
	    	}
 | 
			
		||||
	    	else if(!strcmp(fieldbuf,"Buffers:")) {
 | 
			
		||||
	    		p+=k;
 | 
			
		||||
	    		sscanf(p," %d",&(row[meminfo_main][meminfo_buffers]));
 | 
			
		||||
	    		row[meminfo_main][meminfo_buffers]<<=10;
 | 
			
		||||
	    		while(*p++ != '\n');
 | 
			
		||||
	    	}
 | 
			
		||||
	    	else if(!strcmp(fieldbuf,"Cached:")) {
 | 
			
		||||
	    		p+=k;
 | 
			
		||||
    			sscanf(p," %d",&(row[meminfo_main][meminfo_cached]));
 | 
			
		||||
    			row[meminfo_main][meminfo_cached]<<=10;
 | 
			
		||||
    			while(*p++ != '\n');
 | 
			
		||||
    		}
 | 
			
		||||
    		else if(!strcmp(fieldbuf,"SwapTotal:")) {
 | 
			
		||||
    			p+=k;
 | 
			
		||||
    			sscanf(p," %d",&(row[meminfo_swap][meminfo_total]));
 | 
			
		||||
    			row[meminfo_swap][meminfo_total]<<=10;
 | 
			
		||||
    			while(*p++ != '\n');
 | 
			
		||||
    		}
 | 
			
		||||
    		else if(!strcmp(fieldbuf,"SwapFree:")) {
 | 
			
		||||
    			p+=k;
 | 
			
		||||
    			sscanf(p," %d",&(row[meminfo_swap][meminfo_free]));
 | 
			
		||||
    			row[meminfo_swap][meminfo_free]<<=10;
 | 
			
		||||
    			while(*p++ != '\n');
 | 
			
		||||
    		}
 | 
			
		||||
    		else
 | 
			
		||||
    			while(*p++ != '\n'); /* ignore lines we don't understand */
 | 
			
		||||
    	}		
 | 
			
		||||
    	row[meminfo_swap][meminfo_used]=row[meminfo_swap][meminfo_total]-row[meminfo_swap][meminfo_free];
 | 
			
		||||
    	row[meminfo_main][meminfo_used]=row[meminfo_main][meminfo_total]-row[meminfo_main][meminfo_free];
 | 
			
		||||
    }
 | 
			
		||||
    return row;					/* NULL return ==> error */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* shorthand for read_table("/proc/meminfo")[meminfo_main][meminfo_total] */
 | 
			
		||||
unsigned read_total_main(void) {
 | 
			
		||||
    unsigned** mem;
 | 
			
		||||
    return (mem = meminfo()) ? mem[meminfo_main][meminfo_total] : -1;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										17
									
								
								libproc/sysinfo.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								libproc/sysinfo.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,17 @@
 | 
			
		||||
#ifndef SYSINFO_H
 | 
			
		||||
#define SYSINFO_H
 | 
			
		||||
 | 
			
		||||
int        loadavg(double *av1, double *av5, double *av15);
 | 
			
		||||
int        uptime (double *uptime_secs, double *idle_secs);
 | 
			
		||||
unsigned** meminfo(void);
 | 
			
		||||
 | 
			
		||||
enum meminfo_row { meminfo_main = 0,
 | 
			
		||||
		   meminfo_swap };
 | 
			
		||||
 | 
			
		||||
enum meminfo_col { meminfo_total = 0, meminfo_used, meminfo_free,
 | 
			
		||||
		   meminfo_shared, meminfo_buffers, meminfo_cached
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
unsigned read_total_main(void);
 | 
			
		||||
 | 
			
		||||
#endif /* SYSINFO_H */
 | 
			
		||||
							
								
								
									
										14
									
								
								libproc/tree.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								libproc/tree.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,14 @@
 | 
			
		||||
struct tree_node {
 | 
			
		||||
    proc_t *proc;
 | 
			
		||||
    pid_t pid;
 | 
			
		||||
    pid_t ppid;
 | 
			
		||||
    char *line;
 | 
			
		||||
    char *cmd;
 | 
			
		||||
    char **cmdline;
 | 
			
		||||
    char **environ;
 | 
			
		||||
    int children;
 | 
			
		||||
    int maxchildren;
 | 
			
		||||
    int *child;
 | 
			
		||||
    int have_parent;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										39
									
								
								libproc/version.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								libproc/version.c
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,39 @@
 | 
			
		||||
/* Suite version information for procps utilities
 | 
			
		||||
 * Copyright (c) 1995 Martin Schulze <joey@infodrom.north.de>
 | 
			
		||||
 * Ammended by cblake to only export the function symbol.
 | 
			
		||||
 */
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
 | 
			
		||||
#ifdef MINORVERSION
 | 
			
		||||
char procps_version[] = "procps version " VERSION "." SUBVERSION "." MINORVERSION;
 | 
			
		||||
#else
 | 
			
		||||
char procps_version[] = "procps version " VERSION "." SUBVERSION;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
void display_version(void) {
 | 
			
		||||
    fprintf(stdout, "%s\n", procps_version);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Linux kernel version information for procps utilities
 | 
			
		||||
 * Copyright (c) 1996 Charles Blake <cblake@bbn.com>
 | 
			
		||||
 */
 | 
			
		||||
#include <sys/utsname.h>
 | 
			
		||||
 | 
			
		||||
#define LINUX_VERSION(x,y,z)   (0x10000*(x) + 0x100*(y) + z)
 | 
			
		||||
 | 
			
		||||
int linux_version_code = 0;
 | 
			
		||||
 | 
			
		||||
void set_linux_version(void) {
 | 
			
		||||
    static struct utsname uts;
 | 
			
		||||
    int x = 0, y = 0, z = 0;	/* cleared in case sscanf() < 3 */
 | 
			
		||||
    
 | 
			
		||||
    if (linux_version_code) return;
 | 
			
		||||
    if (uname(&uts) == -1)	/* failure most likely implies impending death */
 | 
			
		||||
	exit(1);
 | 
			
		||||
    if (sscanf(uts.release, "%d.%d.%d", &x, &y, &z) < 3)
 | 
			
		||||
	fprintf(stderr,		/* *very* unlikely to happen by accident */
 | 
			
		||||
		"Non-standard uts for running kernel:\n"
 | 
			
		||||
		"release %s=%d.%d.%d gives version code %d\n",
 | 
			
		||||
		uts.release, x, y, z, LINUX_VERSION(x,y,z));
 | 
			
		||||
    linux_version_code = LINUX_VERSION(x, y, z);
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										24
									
								
								libproc/version.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								libproc/version.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,24 @@
 | 
			
		||||
#ifndef PROC_VERSION_H
 | 
			
		||||
#define PROC_VERSION_H
 | 
			
		||||
 | 
			
		||||
/* Suite version information for procps utilities
 | 
			
		||||
 * Copyright (c) 1995 Martin Schulze <joey@infodrom.north.de>
 | 
			
		||||
 * Linux kernel version information for procps utilities
 | 
			
		||||
 * Copyright (c) 1996 Charles Blake <cblake@bbn.com>
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
extern void display_version(void);	/* display suite version */
 | 
			
		||||
extern char procps_version[];		/* global buf for suite version */
 | 
			
		||||
 | 
			
		||||
extern int linux_version_code;		/* runtime version of LINUX_VERSION_CODE
 | 
			
		||||
					   in /usr/include/linux/version.h */
 | 
			
		||||
extern void set_linux_version(void);	/* set linux_version_code */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* Convenience macros for composing/decomposing version codes */
 | 
			
		||||
#define LINUX_VERSION(x,y,z)   (0x10000*(x) + 0x100*(y) + z)
 | 
			
		||||
#define LINUX_VERSION_MAJOR(x) ((x) & 0xFF0000)		/* Dare we hope for a */
 | 
			
		||||
#define LINUX_VERSION_MINOR(x) ((x) & 0x00FF00)		/* Linux 256.0.0? ;-) */
 | 
			
		||||
#define LINUX_VERSION_PATCH(x) ((x) & 0x0000FF)
 | 
			
		||||
 | 
			
		||||
#endif	/* PROC_VERSION_H */
 | 
			
		||||
							
								
								
									
										89
									
								
								libproc/whattime.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										89
									
								
								libproc/whattime.c
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,89 @@
 | 
			
		||||
/* This is a trivial uptime program.  I hereby release this program
 | 
			
		||||
 * into the public domain.  I disclaim any responsibility for this
 | 
			
		||||
 * program --- use it at your own risk.  (as if there were any.. ;-)
 | 
			
		||||
 * -michaelkjohnson (johnsonm@sunsite.unc.edu)
 | 
			
		||||
 *
 | 
			
		||||
 * Modified by Larry Greenfield to give a more traditional output,
 | 
			
		||||
 * count users, etc.  (greenfie@gauss.rutgers.edu)
 | 
			
		||||
 *
 | 
			
		||||
 * Modified by mkj again to fix a few tiny buglies.
 | 
			
		||||
 *
 | 
			
		||||
 * Modified by J. Cowley to add printing the uptime message to a
 | 
			
		||||
 * string (for top) and to optimize file handling.  19 Mar 1993.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include <fcntl.h>
 | 
			
		||||
#include <unistd.h>
 | 
			
		||||
#include <time.h>
 | 
			
		||||
#include <utmp.h>
 | 
			
		||||
#include <sys/ioctl.h>
 | 
			
		||||
#include "proc/whattime.h"
 | 
			
		||||
#include "proc/sysinfo.h"
 | 
			
		||||
 | 
			
		||||
static char buf[128];
 | 
			
		||||
double av[3];
 | 
			
		||||
 | 
			
		||||
char *sprint_uptime(void) {
 | 
			
		||||
  struct utmp *utmpstruct;
 | 
			
		||||
  int upminutes, uphours, updays;
 | 
			
		||||
  int pos;
 | 
			
		||||
  struct tm *realtime;
 | 
			
		||||
  time_t realseconds;
 | 
			
		||||
  int numuser;
 | 
			
		||||
  double uptime_secs, idle_secs;
 | 
			
		||||
 | 
			
		||||
/* first get the current time */
 | 
			
		||||
 | 
			
		||||
  time(&realseconds);
 | 
			
		||||
  realtime = localtime(&realseconds);
 | 
			
		||||
  pos = sprintf(buf, " %2d:%02d%s  ",
 | 
			
		||||
		realtime->tm_hour%12 ? realtime->tm_hour%12 : 12,
 | 
			
		||||
		realtime->tm_min, realtime->tm_hour > 11 ? "pm" : "am");
 | 
			
		||||
 | 
			
		||||
/* read and calculate the amount of uptime */
 | 
			
		||||
 | 
			
		||||
  uptime(&uptime_secs, &idle_secs);
 | 
			
		||||
 | 
			
		||||
  updays = (int) uptime_secs / (60*60*24);
 | 
			
		||||
  strcat (buf, "up ");
 | 
			
		||||
  pos += 3;
 | 
			
		||||
  if (updays)
 | 
			
		||||
    pos += sprintf(buf + pos, "%d day%s, ", updays, (updays != 1) ? "s" : "");
 | 
			
		||||
  upminutes = (int) uptime_secs / 60;
 | 
			
		||||
  uphours = upminutes / 60;
 | 
			
		||||
  uphours = uphours % 24;
 | 
			
		||||
  upminutes = upminutes % 60;
 | 
			
		||||
  if(uphours)
 | 
			
		||||
    pos += sprintf(buf + pos, "%2d:%02d, ", uphours, upminutes);
 | 
			
		||||
  else
 | 
			
		||||
    pos += sprintf(buf + pos, "%d min, ", upminutes);
 | 
			
		||||
 | 
			
		||||
/* count the number of users */
 | 
			
		||||
 | 
			
		||||
  numuser = 0;
 | 
			
		||||
  setutent();
 | 
			
		||||
  while ((utmpstruct = getutent())) {
 | 
			
		||||
    if ((utmpstruct->ut_type == USER_PROCESS) &&
 | 
			
		||||
       (utmpstruct->ut_name[0] != '\0'))
 | 
			
		||||
      numuser++;
 | 
			
		||||
  }
 | 
			
		||||
  endutent();
 | 
			
		||||
 | 
			
		||||
  pos += sprintf(buf + pos, "%2d user%s, ", numuser, numuser == 1 ? "" : "s");
 | 
			
		||||
 | 
			
		||||
  loadavg(&av[0], &av[1], &av[2]);
 | 
			
		||||
 | 
			
		||||
  pos += sprintf(buf + pos, " load average: %.2f, %.2f, %.2f",
 | 
			
		||||
		 av[0], av[1], av[2]);
 | 
			
		||||
 | 
			
		||||
  return buf;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void print_uptime(void)
 | 
			
		||||
{
 | 
			
		||||
  printf("%s\n", sprint_uptime());
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										9
									
								
								libproc/whattime.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								libproc/whattime.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,9 @@
 | 
			
		||||
/* whattime.h --- see whattime.c for explanation */
 | 
			
		||||
 | 
			
		||||
#ifndef __WHATTIME_H
 | 
			
		||||
#define __WHATTIME_H
 | 
			
		||||
 | 
			
		||||
void print_uptime(void);
 | 
			
		||||
char *sprint_uptime(void);
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
							
								
								
									
										1
									
								
								perl/.cvsignore
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								perl/.cvsignore
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
			
		||||
Libgtop.xs Makefile blib pm_to_blib Libgtop.c Libgtop.bs Makefile.PL
 | 
			
		||||
							
								
								
									
										5
									
								
								perl/Changes
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								perl/Changes
									
									
									
									
									
										Normal 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
									
								
							
							
						
						
									
										26
									
								
								perl/Libgtop.pm
									
									
									
									
									
										Normal 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
									
								
							
							
						
						
									
										8
									
								
								perl/MANIFEST
									
									
									
									
									
										Normal 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
									
								
							
							
						
						
									
										10
									
								
								perl/Makefile.PL.in
									
									
									
									
									
										Normal 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
									
								
							
							
						
						
									
										13
									
								
								perl/new.pl
									
									
									
									
									
										Executable 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
									
								
							
							
						
						
									
										86
									
								
								perl/perl.awk
									
									
									
									
									
										Normal 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
									
								
							
							
						
						
									
										20
									
								
								perl/test.pl
									
									
									
									
									
										Normal 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):
 | 
			
		||||
 | 
			
		||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user