diff options
author | Carlos Perelló Marín <carlos@gnome.org> | 2003-10-19 16:55:56 +0000 |
---|---|---|
committer | Carlos Perelló Marín <carlos@src.gnome.org> | 2003-10-19 16:55:56 +0000 |
commit | 4c8ae9e25c1940d8876ca3f2330426863cae4737 (patch) | |
tree | c43f97bc0647546b0ed87022db0749c137f24edc /sysdeps/aix | |
parent | bae16b467f90df94d80feae41dceb7e816f16c61 (diff) | |
download | libgtop-4c8ae9e25c1940d8876ca3f2330426863cae4737.tar.gz |
Reverted libgtop changes. It's a common module and I should not modify it.
2003-10-19 Carlos Perelló Marín <carlos@gnome.org>
* support/*: Reverted libgtop changes. It's a common module
and I should not modify it.
* Added/removed files. Now the move should be done.
Diffstat (limited to 'sysdeps/aix')
32 files changed, 2833 insertions, 0 deletions
diff --git a/sysdeps/aix/ChangeLog b/sysdeps/aix/ChangeLog new file mode 100644 index 00000000..0b61ebd3 --- /dev/null +++ b/sysdeps/aix/ChangeLog @@ -0,0 +1,3 @@ +2002-09-24 Laurent Vivier <Laurent.Vivier@bull.net> + + * Create sysdeps/aix (from stub) diff --git a/sysdeps/aix/Makefile.am b/sysdeps/aix/Makefile.am new file mode 100644 index 00000000..e0c6c2f6 --- /dev/null +++ b/sysdeps/aix/Makefile.am @@ -0,0 +1,23 @@ +LINK = $(LIBTOOL) --mode=link $(CC) $(CFLAGS) $(LDFLAGS) -o $@ + +INCLUDES = @INCLUDES@ + +lib_LTLIBRARIES = libgtop_sysdeps-2.0.la libgtop_sysdeps_suid-2.0.la + +libgtop_sysdeps_2_0_la_SOURCES = siglist.c nosuid.c + +libgtop_sysdeps_2_0_la_LDFLAGS = $(LT_VERSION_INFO) + +libgtop_sysdeps_suid_2_0_la_SOURCES = open.c close.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 procargs.c procmap.c netload.c \ + ppp.c utils.c utils.h sysinfo.c + +libgtop_sysdeps_suid_2_0_la_LDFLAGS = $(LT_VERSION_INFO) +libgtop_sysdeps_suid_2_0_la_LIBADD = $(top_builddir)/sysdeps/common/libgtop_suid_common-2.0.la $(GLIB_LIBS) + +libgtopinclude_HEADERS = glibtop_server.h glibtop_machine.h glibtop_suid.h + +libgtopincludedir = $(includedir)/libgtop-2.0 diff --git a/sysdeps/aix/close.c b/sysdeps/aix/close.c new file mode 100644 index 00000000..4262d2f0 --- /dev/null +++ b/sysdeps/aix/close.c @@ -0,0 +1,30 @@ +/* $Id$ */ + +/* Copyright (C) 1998-99 Martin Baulig + This file is part of LibGTop 1.0. + + Contributed by Martin Baulig <martin@home-of-linux.org>, April 1998. + + LibGTop is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, + or (at your option) any later version. + + LibGTop is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with LibGTop; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. +*/ + +#include <glibtop/close.h> + +/* Closes pipe to gtop server. */ + +void +glibtop_close_s (glibtop *server) +{ } diff --git a/sysdeps/aix/cpu.c b/sysdeps/aix/cpu.c new file mode 100644 index 00000000..81fb5c04 --- /dev/null +++ b/sysdeps/aix/cpu.c @@ -0,0 +1,125 @@ +/* $Id$ */ + +/* Copyright (C) 1998-99 Martin Baulig + This file is part of LibGTop 1.0. + + Contributed by Martin Baulig <martin@home-of-linux.org>, April 1998. + + LibGTop is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, + or (at your option) any later version. + + LibGTop is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with LibGTop; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. +*/ + +#include <stdlib.h> +#include <sys/systemcfg.h> +#include <sys/sysinfo.h> + +#include <glibtop.h> +#include <glibtop/error.h> +#include <glibtop/cpu.h> + +#include <utils.h> + +static const unsigned long _glibtop_sysdeps_cpu = +(1L << GLIBTOP_CPU_TOTAL) + (1L << GLIBTOP_CPU_USER) + +(1L << GLIBTOP_CPU_SYS) + (1L << GLIBTOP_CPU_IDLE) + +(1L << GLIBTOP_CPU_NICE) + (1 << GLIBTOP_CPU_FREQUENCY) + +(1L << GLIBTOP_XCPU_TOTAL) + (1L << GLIBTOP_XCPU_USER) + +(1L << GLIBTOP_XCPU_SYS) + (1L << GLIBTOP_XCPU_IDLE) + +(1L << GLIBTOP_XCPU_NICE); + +/* Init function. */ + +void +glibtop_init_cpu_p (glibtop *server) +{ + off_t result; + + server->ncpu = _system_configuration.ncpus; + if (server->ncpu == 1) + { + server->ncpu = 0; /* means single-processor, see glibtop.h */ + } + + result = _glibtop_get_kmem_offset(server, "cpuinfo"); + if (result == -1) + { + server->sysdeps.cpu = 0; + + return; + } + server->machine.cpuinfo_offset = result; + + server->machine.cpuinfo = (struct cpuinfo*)calloc(_system_configuration.ncpus, sizeof(struct cpuinfo)); + + server->sysdeps.cpu = _glibtop_sysdeps_cpu; +} + +/* Provides information about cpu usage. */ + +void +glibtop_get_cpu_p (glibtop *server, glibtop_cpu *buf) +{ + int result; + int cpu; + + glibtop_init_p (server, (1L << GLIBTOP_SYSDEPS_CPU), 0); + + memset (buf, 0, sizeof (glibtop_cpu)); + + result = _glibtop_get_kmem_info(server, server->machine.cpuinfo_offset, + server->machine.cpuinfo, + _system_configuration.ncpus + * sizeof(struct cpuinfo)); + + if (result <= 0) + { + glibtop_error_io_r (server, "Cannot read cpuinfo"); + return; + } + + buf->idle = 0; + buf->user = 0; + buf->sys = 0; + buf->nice = 0; + for (cpu = 0; cpu < _system_configuration.ncpus; cpu++) + { + if (cpu < GLIBTOP_NCPU) + { + buf->xcpu_idle[cpu] = + server->machine.cpuinfo[cpu].cpu[CPU_IDLE]; + buf->xcpu_user[cpu] = + server->machine.cpuinfo[cpu].cpu[CPU_USER]; + buf->xcpu_sys[cpu] = + server->machine.cpuinfo[cpu].cpu[CPU_KERNEL]; + buf->xcpu_nice[cpu] = + server->machine.cpuinfo[cpu].cpu[CPU_WAIT]; + + buf->xcpu_total[cpu] = buf->xcpu_idle[cpu] + + buf->xcpu_user[cpu] + + buf->xcpu_sys[cpu] + + buf->xcpu_nice[cpu]; + } + + buf->idle += server->machine.cpuinfo[cpu].cpu[CPU_IDLE]; + buf->user += server->machine.cpuinfo[cpu].cpu[CPU_USER]; + buf->sys += server->machine.cpuinfo[cpu].cpu[CPU_KERNEL]; + buf->nice += server->machine.cpuinfo[cpu].cpu[CPU_WAIT]; + + buf->total = buf->idle + buf->user + buf->sys + buf->nice ; + } + + buf->frequency = sysconf(_SC_CLK_TCK); + buf->flags = _glibtop_sysdeps_cpu; +} diff --git a/sysdeps/aix/glibtop_machine.h b/sysdeps/aix/glibtop_machine.h new file mode 100644 index 00000000..508d6c21 --- /dev/null +++ b/sysdeps/aix/glibtop_machine.h @@ -0,0 +1,53 @@ +/* $Id$ */ + +/* + This file is part of LibGTop 1.0. + + Contributed by Martin Baulig <martin@home-of-linux.org>, March 1999. + + LibGTop is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, + or (at your option) any later version. + + LibGTop is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with LibGTop; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. +*/ + +#ifndef __GLIBTOP_MACHINE_H__ +#define __GLIBTOP_MACHINE_H__ + +#include <procinfo.h> + +BEGIN_LIBGTOP_DECLS + +typedef struct _glibtop_machine glibtop_machine; + +struct _glibtop_machine +{ + uid_t uid, euid; + gid_t gid, egid; + + int kmem_fd; + + off_t cpuinfo_offset; + off_t ifnet_offset; + off_t loadavg_offset; + off_t shminfo_offset; + off_t seminfo_offset; + off_t msginfo_offset; + + struct cpuinfo *cpuinfo; + struct procsinfo last_pinfo; +}; + +END_LIBGTOP_DECLS + +#endif /* __GLIBTOP_MACHINE_H__ */ diff --git a/sysdeps/aix/glibtop_server.h b/sysdeps/aix/glibtop_server.h new file mode 100644 index 00000000..ca57af36 --- /dev/null +++ b/sysdeps/aix/glibtop_server.h @@ -0,0 +1,52 @@ +/* $Id$ */ + +/* Copyright (C) 1998-99 Martin Baulig + This file is part of LibGTop 1.0. + + Contributed by Martin Baulig <martin@home-of-linux.org>, April 1998. + + LibGTop is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, + or (at your option) any later version. + + LibGTop is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with LibGTop; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. +*/ + +#ifndef __GLIBTOP_SERVER_H__ +#define __GLIBTOP_SERVER_H__ + +BEGIN_LIBGTOP_DECLS + +#define GLIBTOP_SUID_CPU (1 << GLIBTOP_SYSDEPS_CPU) +#define GLIBTOP_SUID_MEM 0 +#define GLIBTOP_SUID_SWAP 0 +#define GLIBTOP_SUID_UPTIME (1 << GLIBTOP_SYSDEPS_UPTIME) +#define GLIBTOP_SUID_LOADAVG (1 << GLIBTOP_SYSDEPS_LOADAVG) +#define GLIBTOP_SUID_SHM_LIMITS (1 << GLIBTOP_SYSDEPS_SHM_LIMITS) +#define GLIBTOP_SUID_MSG_LIMITS (1 << GLIBTOP_SYSDEPS_MSG_LIMITS) +#define GLIBTOP_SUID_SEM_LIMITS (1 << GLIBTOP_SYSDEPS_SEM_LIMITS) +#define GLIBTOP_SUID_PROCLIST 0 +#define GLIBTOP_SUID_PROC_STATE 0 +#define GLIBTOP_SUID_PROC_UID 0 +#define GLIBTOP_SUID_PROC_MEM 0 +#define GLIBTOP_SUID_PROC_TIME 0 +#define GLIBTOP_SUID_PROC_SIGNAL 0 +#define GLIBTOP_SUID_PROC_KERNEL 0 +#define GLIBTOP_SUID_PROC_SEGMENT 0 +#define GLIBTOP_SUID_PROC_ARGS 0 +#define GLIBTOP_SUID_PROC_MAP 0 +#define GLIBTOP_SUID_NETLOAD (1 << GLIBTOP_SYSDEPS_NETLOAD) +#define GLIBTOP_SUID_PPP 0 + +END_LIBGTOP_DECLS + +#endif diff --git a/sysdeps/aix/glibtop_suid.h b/sysdeps/aix/glibtop_suid.h new file mode 100644 index 00000000..0d971143 --- /dev/null +++ b/sysdeps/aix/glibtop_suid.h @@ -0,0 +1,52 @@ +/* $Id$ */ + +/* Copyright (C) 1998-99 Martin Baulig + This file is part of LibGTop 1.0. + + Contributed by Martin Baulig <martin@home-of-linux.org>, April 1998. + + LibGTop is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, + or (at your option) any later version. + + LibGTop is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with LibGTop; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. +*/ + +#ifndef __GLIBTOP_SUID_H__ +#define __GLIBTOP_SUID_H__ + +BEGIN_LIBGTOP_DECLS + +#if _IN_LIBGTOP +#include <sys/param.h> +#endif + +static inline void glibtop_suid_enter (glibtop *server) { + setegid (server->machine.egid); +} + +static inline void glibtop_suid_leave (glibtop *server) { + if (setegid (server->machine.gid)) + _exit (1); +} + +void +glibtop_init_p (glibtop *server, const unsigned long features, + const unsigned flags); +void +glibtop_open_p (glibtop *server, const char *program_name, + const unsigned long features, + const unsigned flags); + +END_LIBGTOP_DECLS + +#endif diff --git a/sysdeps/aix/loadavg.c b/sysdeps/aix/loadavg.c new file mode 100644 index 00000000..67913413 --- /dev/null +++ b/sysdeps/aix/loadavg.c @@ -0,0 +1,78 @@ +/* $Id$ */ + +/* Copyright (C) 1998-99 Martin Baulig + This file is part of LibGTop 1.0. + + Contributed by Martin Baulig <martin@home-of-linux.org>, April 1998. + + LibGTop is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, + or (at your option) any later version. + + LibGTop is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with LibGTop; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. +*/ + +#include <nlist.h> +#include <glibtop.h> +#include <glibtop/loadavg.h> +#include <glibtop/error.h> + +#include <glibtop_suid.h> + +static const unsigned long _glibtop_sysdeps_loadavg = +(1 << GLIBTOP_LOADAVG_LOADAVG); + +/* Init function. */ + +void +glibtop_init_loadavg_p (glibtop *server) +{ + int result; + + result = _glibtop_get_kmem_offset(server, "avenrun"); + if (result == -1) + { + server->sysdeps.loadavg = 0; + return; + } + + server->machine.loadavg_offset = result; + + server->sysdeps.loadavg = _glibtop_sysdeps_loadavg; +} + +/* Provides load averange. */ + +void +glibtop_get_loadavg_p (glibtop *server, glibtop_loadavg *buf) +{ + int result; + int loadavg[3]; + + glibtop_init_p (server, (1L << GLIBTOP_SYSDEPS_LOADAVG), 0); + + memset (buf, 0, sizeof (glibtop_loadavg)); + + result = _glibtop_get_kmem_info(server, server->machine.loadavg_offset, + loadavg, sizeof(loadavg)); + if (result <= 0) + { + glibtop_error_io_r (server, "Cannot read loadavg"); + return; + } + + buf->loadavg[0] = loadavg[0] / 65536.0; + buf->loadavg[1] = loadavg[1] / 65536.0; + buf->loadavg[2] = loadavg[2] / 65536.0; + + buf->flags = _glibtop_sysdeps_loadavg; +} diff --git a/sysdeps/aix/mem.c b/sysdeps/aix/mem.c new file mode 100644 index 00000000..c2811fd5 --- /dev/null +++ b/sysdeps/aix/mem.c @@ -0,0 +1,76 @@ +/* $Id$ */ + +/* Copyright (C) 1998-99 Martin Baulig + This file is part of LibGTop 1.0. + + Contributed by Martin Baulig <martin@home-of-linux.org>, April 1998. + + LibGTop is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, + or (at your option) any later version. + + LibGTop is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with LibGTop; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. +*/ + +#include <unistd.h> +#include <sys/vminfo.h> + +#include <glibtop.h> +#include <glibtop/error.h> +#include <glibtop/mem.h> + +static const unsigned long _glibtop_sysdeps_mem = +(1 << GLIBTOP_MEM_TOTAL) + (1 << GLIBTOP_MEM_USED) + +(1 << GLIBTOP_MEM_FREE) + (1 << GLIBTOP_MEM_LOCKED); + +/* Init function. */ + +void +glibtop_init_mem_s (glibtop *server) +{ + server->sysdeps.mem = _glibtop_sysdeps_mem; +} + +/* Provides information about memory usage. */ + +void +glibtop_get_mem_s (glibtop *server, glibtop_mem *buf) +{ + struct vminfo vminfo; + int pagesize; + int result; + + memset (buf, 0, sizeof (glibtop_mem)); + + pagesize = sysconf(_SC_PAGESIZE); + +#ifdef HAVE_VMGETINFO + result = vmgetinfo((void*)&vminfo, VMINFO, sizeof(vminfo)); +#else + result = _glibtop_vmgetinfo((void*)&vminfo, VMINFO, sizeof(vminfo)); +#endif + if (result == -1) + { + glibtop_error_io_r (server, "Cannot read vminfo"); + return; + } + + + buf->total = vminfo.memsizepgs * pagesize; + buf->used = (vminfo.numwseguse + vminfo.numpseguse + + vminfo.numclseguse) * pagesize; + buf->free = vminfo.numfrb * pagesize; + buf->locked = (vminfo.numwsegpin + vminfo.numpsegpin + + vminfo.numclsegpin) * pagesize; + + buf->flags = _glibtop_sysdeps_mem; +} diff --git a/sysdeps/aix/msg_limits.c b/sysdeps/aix/msg_limits.c new file mode 100644 index 00000000..94bf4446 --- /dev/null +++ b/sysdeps/aix/msg_limits.c @@ -0,0 +1,81 @@ +/* $Id$ */ + +/* Copyright (C) 1998-99 Martin Baulig + This file is part of LibGTop 1.0. + + Contributed by Martin Baulig <martin@home-of-linux.org>, April 1998. + + LibGTop is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, + or (at your option) any later version. + + LibGTop is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with LibGTop; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. +*/ + +#include <sys/msg.h> + +#include <glibtop.h> +#include <glibtop/error.h> +#include <glibtop/msg_limits.h> + +static const unsigned long _glibtop_sysdeps_msg_limits = +(1 << GLIBTOP_IPC_MSGMAX) + (1 << GLIBTOP_IPC_MSGMNB) + +(1 << GLIBTOP_IPC_MSGMNI) + (1 << GLIBTOP_IPC_MSGTQL); + +/* Init function. */ + +void +glibtop_init_msg_limits_p (glibtop *server) +{ + off_t result; + + result = _glibtop_get_kmem_offset(server, "msginfo"); + if (result <= 0) + { + server->sysdeps.sem_limits = 0; + return; + } + + server->machine.msginfo_offset = result; + + server->sysdeps.msg_limits = _glibtop_sysdeps_msg_limits; +} + +/* Provides information about sysv ipc limits. */ + +void +glibtop_get_msg_limits_p (glibtop *server, glibtop_msg_limits *buf) +{ + int result; + struct msginfo msginfo; + + glibtop_init_p (server, (1L << GLIBTOP_SYSDEPS_MSG_LIMITS), 0); + + memset (buf, 0, sizeof (glibtop_msg_limits)); + + result = _glibtop_get_kmem_info(server, server->machine.msginfo_offset, + &msginfo, sizeof(msginfo)); + + if (result <= 0) + { + glibtop_error_io_r (server, "Cannot read seminfo"); + + return; + } + + buf->msgmax = msginfo.msgmax; + buf->msgmnb = msginfo.msgmnb; + buf->msgmni = msginfo.msgmni; + buf->msgtql = msginfo.msgmnm; + + buf->flags = _glibtop_sysdeps_msg_limits; +} diff --git a/sysdeps/aix/netload.c b/sysdeps/aix/netload.c new file mode 100644 index 00000000..ffad1c66 --- /dev/null +++ b/sysdeps/aix/netload.c @@ -0,0 +1,207 @@ +/* $Id$ */ + +/* Copyright (C) 1998-99 Martin Baulig + This file is part of LibGTop 1.0. + + Contributed by Martin Baulig <martin@home-of-linux.org>, October 1998. + + LibGTop is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, + or (at your option) any later version. + + LibGTop is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with LibGTop; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. +*/ + +#include <sys/socket.h> +#include <net/if.h> +#include <netinet/in.h> + +#include <glibtop.h> +#include <glibtop/error.h> +#include <glibtop/netload.h> + +#include "utils.h" + +static const unsigned long _glibtop_sysdeps_netload = +(1 << GLIBTOP_NETLOAD_IF_FLAGS) + (1 << GLIBTOP_NETLOAD_MTU) + +(1 << GLIBTOP_NETLOAD_SUBNET) + (1 << GLIBTOP_NETLOAD_ADDRESS) + +(1 << GLIBTOP_NETLOAD_PACKETS_IN) + (1 << GLIBTOP_NETLOAD_PACKETS_OUT) + +(1 << GLIBTOP_NETLOAD_PACKETS_TOTAL) + (1 << GLIBTOP_NETLOAD_BYTES_IN) + +(1 << GLIBTOP_NETLOAD_BYTES_OUT) + (1 << GLIBTOP_NETLOAD_BYTES_TOTAL) + +(1 << GLIBTOP_NETLOAD_ERRORS_IN) + (1 << GLIBTOP_NETLOAD_ERRORS_OUT) + +(1 << GLIBTOP_NETLOAD_ERRORS_TOTAL) + (1 << GLIBTOP_NETLOAD_COLLISIONS); + +static void get_ifaddr(glibtop* server, struct ifaddr* next, long* addr, long* mask) +{ + struct ifaddr ifaddr; + struct sockaddr_in sockaddr; + + *addr = 0; + *mask = 0; + + while (next) + { + /* get interface ifaddr structure */ + + _glibtop_get_kmem_info(server, (off_t)next, &ifaddr, sizeof(ifaddr)); + + /* get socket addr information */ + + _glibtop_get_kmem_info( server, (off_t)ifaddr.ifa_addr + , &sockaddr, sizeof(sockaddr)); + + /* if valid family : UDP, TCP, ...*/ + + if (sockaddr.sin_family == AF_INET) + { + *addr = sockaddr.sin_addr.s_addr; + + _glibtop_get_kmem_info( server, (off_t)ifaddr.ifa_netmask + , &sockaddr, sizeof(sockaddr)); + + *mask = sockaddr.sin_addr.s_addr; + + /* address found */ + + return; + } + + next = ifaddr.ifa_next; + } +} + +/* Init function. */ + +void +glibtop_init_netload_p (glibtop *server) +{ + off_t result; + off_t addr; + + result = _glibtop_get_kmem_offset(server, "ifnet"); + if (result <= 0) + { + server->sysdeps.netload = 0; + return; + } + + result = _glibtop_get_kmem_info(server, result, &addr, sizeof(addr)); + if (result <= 0) + { + server->sysdeps.netload = 0; + return; + } + + server->machine.ifnet_offset = addr; + + server->sysdeps.netload = _glibtop_sysdeps_netload; +} + +/* Provides network statistics. */ + +void +glibtop_get_netload_p (glibtop *server, glibtop_netload *buf, + const char *interface) +{ + int result; + off_t offset; + struct ifnet ifnet; + long addr; + long mask; + char name[16]; + + memset (buf, 0, sizeof (glibtop_netload)); + + for ( offset = server->machine.ifnet_offset; + offset != 0; + offset = (off_t)ifnet.if_next + ) + { + result = _glibtop_get_kmem_info(server, offset, + &ifnet, sizeof(ifnet)); + if (result <= 0) + { + glibtop_error_io_r (server, "Cannot read ifnet"); + + return; + } + + result = _glibtop_get_kmem_info(server, (off_t)ifnet.if_name, + name, sizeof(name)); + if (result <= 0) + { + glibtop_error_io_r (server, "Cannot read if_name"); + + return; + } + + sprintf(name+strlen(name), "%d", ifnet.if_unit); + if (strcmp(name, interface) != 0) + { + continue; + } + + if (ifnet.if_flags & IFF_UP) + buf->if_flags |= (1 << GLIBTOP_IF_FLAGS_UP); + if (ifnet.if_flags & IFF_BROADCAST) + buf->if_flags |= (1 << GLIBTOP_IF_FLAGS_BROADCAST); + if (ifnet.if_flags & IFF_LOOPBACK) + buf->if_flags |= (1 << GLIBTOP_IF_FLAGS_LOOPBACK); + if (ifnet.if_flags & IFF_POINTOPOINT) + buf->if_flags |= (1 << GLIBTOP_IF_FLAGS_POINTOPOINT); + if (ifnet.if_flags & IFF_RUNNING) + buf->if_flags |= (1 << GLIBTOP_IF_FLAGS_RUNNING); + if (ifnet.if_flags & IFF_NOARP) + buf->if_flags |= (1 << GLIBTOP_IF_FLAGS_NOARP); + if (ifnet.if_flags & IFF_PROMISC) + buf->if_flags |= (1 << GLIBTOP_IF_FLAGS_PROMISC); + if (ifnet.if_flags & IFF_ALLMULTI) + buf->if_flags |= (1 << GLIBTOP_IF_FLAGS_ALLMULTI); + if (ifnet.if_flags & IFF_OACTIVE) + buf->if_flags |= (1 << GLIBTOP_IF_FLAGS_OACTIVE); + if (ifnet.if_flags & IFF_SIMPLEX) + buf->if_flags |= (1 << GLIBTOP_IF_FLAGS_SIMPLEX); + if (ifnet.if_flags & IFF_LINK0) + buf->if_flags |= (1 << GLIBTOP_IF_FLAGS_LINK0); + if (ifnet.if_flags & IFF_LINK1) + buf->if_flags |= (1 << GLIBTOP_IF_FLAGS_LINK1); + if (ifnet.if_flags & IFF_LINK2) + buf->if_flags |= (1 << GLIBTOP_IF_FLAGS_LINK2); + if (ifnet.if_flags & IFF_LINK2) + buf->if_flags |= (1 << GLIBTOP_IF_FLAGS_LINK2); + if (ifnet.if_flags & 0x80000) + buf->if_flags |= (1 << GLIBTOP_IF_FLAGS_MULTICAST); + + buf->mtu = ifnet.if_mtu; + + get_ifaddr(server, ifnet.if_addrlist, &addr, &mask); + + buf->subnet = addr & mask; + buf->address = addr; + + buf->packets_in = ifnet.if_ipackets; + buf->packets_out = ifnet.if_opackets; + buf->packets_total = buf->packets_in + buf->packets_out; + + buf->bytes_in = ifnet.if_ibytes; + buf->bytes_out = ifnet.if_obytes; + buf->bytes_total = buf->bytes_in + buf->bytes_out; + + buf->errors_in = ifnet.if_ierrors; + buf->errors_out = ifnet.if_oerrors; + buf->errors_total = ifnet.if_ierrors + ifnet.if_oerrors; + + buf->collisions = ifnet.if_collisions; + } + + buf->flags = _glibtop_sysdeps_netload; +} diff --git a/sysdeps/aix/nosuid.c b/sysdeps/aix/nosuid.c new file mode 100644 index 00000000..c904a3a5 --- /dev/null +++ b/sysdeps/aix/nosuid.c @@ -0,0 +1,46 @@ +/* $Id$ */ + +/* Copyright (C) 1998-99 Martin Baulig + This file is part of LibGTop 1.0. + + Contributed by Martin Baulig <martin@home-of-linux.org>, April 1998. + + LibGTop is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, + or (at your option) any later version. + + LibGTop is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with LibGTop; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. +*/ + +#include <sys/systemcfg.h> + +#include <glibtop.h> +#include <glibtop/open.h> +#include <glibtop/close.h> + +void +glibtop_open_s (glibtop *server, + const char *program_name, + const unsigned long features, + const unsigned flags) +{ + server->ncpu = _system_configuration.ncpus; + + if (server->ncpu == 1) + { + server->ncpu = 0; /* means single-processor, see glibtop.h */ + } +} + +void +glibtop_close_s (glibtop *server) +{ } diff --git a/sysdeps/aix/open.c b/sysdeps/aix/open.c new file mode 100644 index 00000000..8a0757fa --- /dev/null +++ b/sysdeps/aix/open.c @@ -0,0 +1,82 @@ +/* $Id$ */ + +/* Copyright (C) 1998-99 Martin Baulig + This file is part of LibGTop 1.0. + + Contributed by Martin Baulig <martin@home-of-linux.org>, April 1998. + + LibGTop is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, + or (at your option) any later version. + + LibGTop is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with LibGTop; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. +*/ + +#include <fcntl.h> +#include <unistd.h> +#include <glibtop.h> +#include <glibtop/error.h> +#include <glibtop/open.h> + +#include "glibtop_suid.h" + +/* !!! THIS FUNCTION RUNS SUID ROOT - CHANGE WITH CAUTION !!! */ + +void +glibtop_init_p (glibtop *server, const unsigned long features, + const unsigned flags) +{ + glibtop_init_func_t *init_fkt; + + if (server == NULL) + glibtop_error_r (NULL, "glibtop_init_p (server == NULL)"); + + if ((server->flags & _GLIBTOP_INIT_STATE_SYSDEPS) == 0) { + glibtop_open_p (server, "glibtop", features, flags); + + for (init_fkt = _glibtop_init_hook_p; *init_fkt; init_fkt++) + (*init_fkt) (server); + server->flags |= _GLIBTOP_INIT_STATE_SYSDEPS; + } +} + +/* Opens pipe to gtop server. Returns 0 on success and -1 on error. */ + +void +glibtop_open_p (glibtop *server, const char *program_name, + const unsigned long features, const unsigned flags) +{ + /* !!! WE ARE ROOT HERE - CHANGE WITH CAUTION !!! */ + + server->machine.uid = getuid (); + server->machine.euid = geteuid (); + server->machine.gid = getgid (); + server->machine.egid = getegid (); + + /* open kmem */ + + server->machine.kmem_fd = open("/dev/kmem", O_RDONLY); + if (server->machine.kmem_fd == -1) + glibtop_error_io_r (server, "Cannot open /dev/kmem"); + + /* Drop priviledges. */ + + if (seteuid (server->machine.uid)) + _exit (1); + + if (setegid (server->machine.gid)) + _exit (1); + + /* !!! END OF SUID ROOT PART !!! */ + + server->name = program_name; +} diff --git a/sysdeps/aix/ppp.c b/sysdeps/aix/ppp.c new file mode 100644 index 00000000..6d0905d5 --- /dev/null +++ b/sysdeps/aix/ppp.c @@ -0,0 +1,44 @@ +/* $Id$ */ + +/* Copyright (C) 1998-99 Martin Baulig + This file is part of LibGTop 1.0. + + Contributed by Martin Baulig <martin@home-of-linux.org>, October 1998. + + LibGTop is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, + or (at your option) any later version. + + LibGTop is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with LibGTop; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. +*/ + +#include <glibtop.h> +#include <glibtop/error.h> +#include <glibtop/ppp.h> + +static const unsigned long _glibtop_sysdeps_ppp = 0; + +/* Init function. */ + +void +glibtop_init_ppp_s (glibtop *server) +{ + server->sysdeps.ppp = _glibtop_sysdeps_ppp; +} + +/* Provides PPP/ISDN information. */ + +void +glibtop_get_ppp_s (glibtop *server, glibtop_ppp *buf, unsigned short device) +{ + memset (buf, 0, sizeof (glibtop_ppp)); +} diff --git a/sysdeps/aix/procargs.c b/sysdeps/aix/procargs.c new file mode 100644 index 00000000..97bf0b34 --- /dev/null +++ b/sysdeps/aix/procargs.c @@ -0,0 +1,132 @@ +/* $Id$ */ + +/* Copyright (C) 1998-99 Martin Baulig + This file is part of LibGTop 1.0. + + Contributed by Martin Baulig <martin@home-of-linux.org>, April 1998. + + LibGTop is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, + or (at your option) any later version. + + LibGTop is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with LibGTop; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. +*/ + +#include <procinfo.h> + +#include <glibtop.h> +#include <glibtop/error.h> +#include <glibtop/xmalloc.h> +#include <glibtop/procargs.h> + +#include "utils.h" + +static const unsigned long _glibtop_sysdeps_proc_args = + (1 << GLIBTOP_PROC_ARGS_SIZE); + +/* Init function. */ + +void +glibtop_init_proc_args_s (glibtop *server) +{ + server->sysdeps.proc_args = _glibtop_sysdeps_proc_args; +} + +/* Provides detailed information about a process. */ + +static void _glibtop_remove_non_ascii(char* string) +{ + for (;*string != 0;string++) + { + if (!isascii(*string)) + *string = '?'; + } +} + +char * +glibtop_get_proc_args_s (glibtop *server, glibtop_proc_args *buf, + pid_t pid, unsigned max_len) +{ + struct procsinfo *pinfo; + char *args_buffer; + char* args = NULL; + int size; + int result; + int len; + + memset (buf, 0, sizeof (glibtop_proc_args)); + + pinfo = _glibtop_get_procinfo(server, pid); + if (pinfo == NULL) + { + glibtop_error_io_r (server, "Cannot read procsinfo"); + + return NULL; + } + + size = max_len != 0 ? max_len : 4096; + args_buffer = glibtop_malloc_r (server, size); + if (args_buffer == NULL) + { + glibtop_error_io_r (server, "Cannot malloc procsinfo"); + + return NULL; + + } + + result = getargs(pinfo, sizeof(struct procsinfo), args_buffer, size); + if (result == -1) + { + glibtop_error_io_r (server, "Cannot malloc getargs"); + + glibtop_free_r(server, args_buffer); + + return NULL; + } + + /* look if empty string */ + + if (args_buffer[0] == 0) + { + glibtop_free_r(server, args_buffer); + + return NULL; + } + + /* compute length of args and realloc */ + + len = 0; + while ((args_buffer[len] != 0) && (len < size)) + { + _glibtop_remove_non_ascii(args_buffer + len); + + len += strlen(args_buffer + len) + 1; + } + + args = glibtop_malloc_r (server, len); + if (args == NULL) + { + glibtop_error_io_r (server, "Cannot malloc procsinfo"); + + glibtop_free_r(server, args_buffer); + + return NULL; + } + memcpy(args, args_buffer, len); + glibtop_free_r(server, args_buffer); + + buf->size = len - 1; + + buf->flags = _glibtop_sysdeps_proc_args; + + return args; +} diff --git a/sysdeps/aix/prockernel.c b/sysdeps/aix/prockernel.c new file mode 100644 index 00000000..e8885994 --- /dev/null +++ b/sysdeps/aix/prockernel.c @@ -0,0 +1,98 @@ +/* $Id$ */ + +/* Copyright (C) 1998-99 Martin Baulig + This file is part of LibGTop 1.0. + + Contributed by Martin Baulig <martin@home-of-linux.org>, April 1998. + + LibGTop is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, + or (at your option) any later version. + + LibGTop is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with LibGTop; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. +*/ + +#include <procinfo.h> +#include <sys/proc.h> + +#include <glibtop.h> +#include <glibtop/prockernel.h> +#include <glibtop/error.h> + +#include "utils.h" + +static const unsigned long _glibtop_sysdeps_proc_kernel = +(1 <<GLIBTOP_PROC_KERNEL_MIN_FLT) + (1 <<GLIBTOP_PROC_KERNEL_MAJ_FLT) + +(1 <<GLIBTOP_PROC_KERNEL_CMIN_FLT) + (1 <<GLIBTOP_PROC_KERNEL_CMAJ_FLT) + +(1 <<GLIBTOP_PROC_KERNEL_KSTK_ESP) + (1 <<GLIBTOP_PROC_KERNEL_KSTK_EIP) + +(1 <<GLIBTOP_PROC_KERNEL_NWCHAN); + + + +/* Init function. */ + +void +glibtop_init_proc_kernel_s (glibtop *server) +{ + server->sysdeps.proc_kernel = _glibtop_sysdeps_proc_kernel; +} + +/* Provides detailed information about a process. */ + +void +glibtop_get_proc_kernel_s (glibtop *server, glibtop_proc_kernel *buf, + pid_t pid) +{ + struct thrdsinfo thinfo; + struct procsinfo *pinfo; + tid_t thid; + int result; + + memset (buf, 0, sizeof (glibtop_proc_kernel)); + + pinfo = _glibtop_get_procinfo(server, pid); + if (pinfo == NULL) + { + glibtop_error_io_r(server, "Cannot read procsinfo"); + + return; + } + + if (!(pinfo->pi_flags | SKPROC)) + { + /* not a kernel process */ + + return; + } + + buf->min_flt = pinfo->pi_ru.ru_minflt; + buf->maj_flt = pinfo->pi_ru.ru_majflt; + + buf->cmin_flt = pinfo->pi_cru.ru_minflt; + buf->cmaj_flt = pinfo->pi_cru.ru_majflt; + + thid = 0; + result = getthrds(pid, &thinfo, sizeof(thinfo), &thid, 1); + if (result != 1) + { + glibtop_error_io_r(server, "Cannot read thrdsinfo"); + + return; + } + + buf->kstk_esp = thinfo.ti_ustk; + buf->kstk_eip = thinfo.ti_code; + + buf->nwchan = thinfo.ti_wchan; + + buf->flags = _glibtop_sysdeps_proc_kernel; +} diff --git a/sysdeps/aix/proclist.c b/sysdeps/aix/proclist.c new file mode 100644 index 00000000..b92c5669 --- /dev/null +++ b/sysdeps/aix/proclist.c @@ -0,0 +1,247 @@ +/* $Id$ */ + +/* Copyright (C) 1998-99 Martin Baulig + This file is part of LibGTop 1.0. + + Contributed by Martin Baulig <martin@home-of-linux.org>, April 1998. + + LibGTop is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, + or (at your option) any later version. + + LibGTop is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with LibGTop; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. +*/ + +#include <procinfo.h> + +#include <glibtop.h> +#include <glibtop/xmalloc.h> +#include <glibtop/proclist.h> + +static const unsigned long _glibtop_sysdeps_proclist = +(1 << GLIBTOP_PROCLIST_NUMBER) + (1 << GLIBTOP_PROCLIST_TOTAL) + +(1 << GLIBTOP_PROCLIST_SIZE); + +#define BLOCK_COUNT 256 +#define BLOCK_SIZE (BLOCK_COUNT * sizeof (unsigned int)) + +/* Init function. */ + +void +glibtop_init_proclist_s (glibtop *server) +{ + server->sysdeps.proclist = _glibtop_sysdeps_proclist; +} + +/* Fetch list of currently running processes. + * + * IMPORTANT NOTE: + * On error, this function MUST return NULL and set buf->flags to zero ! + * On success, it returnes a pointer to a list of buf->number elements + * each buf->size big. The total size is stored in buf->total. */ + +unsigned * +glibtop_get_proclist_s (glibtop *server, glibtop_proclist *buf, + int64_t which, int64_t arg) +{ + struct procsinfo pinfo; + int count, total; + unsigned pids [BLOCK_COUNT], *pids_chain = NULL; + int pids_size = 0, pids_offset = 0, new_size; + pid_t current; + int result; + + memset (buf, 0, sizeof (glibtop_proclist)); + + for( count = total = 0, current = 0 + , result = getprocs(&pinfo, sizeof(pinfo), NULL, 0, ¤t, 1); + result == 1; + result = getprocs(&pinfo, sizeof(pinfo), NULL, 0, ¤t, 1)) + { + if (which & GLIBTOP_EXCLUDE_IDLE) + { + if (pinfo.pi_state & SIDL) + { + /* exclude idle processes */ + + continue; + } + } + + if (which & GLIBTOP_EXCLUDE_SYSTEM) + { + if (pinfo.pi_flags & SKPROC) + { + /* exclude Kernel processes */ + + continue; + } + } + + if (which & GLIBTOP_EXCLUDE_NOTTY) + { + if (!pinfo.pi_ttyp) + { + /* exclude processes without tty */ + + continue; + } + } + + switch(which & GLIBTOP_KERN_PROC_MASK) + { + case GLIBTOP_KERN_PROC_ALL: + + /* return information about all processes + * so, let's go ahead + */ + + break; + + case GLIBTOP_KERN_PROC_PID: + + /* return information about all processes with + * pid passed in arg + */ + + if (pinfo.pi_pid != arg) + { + continue; + } + + break; + + case GLIBTOP_KERN_PROC_PGRP: + + /* return information about all processes in + * process group passed in arg + */ + + if (pinfo.pi_pgrp != arg) + { + continue; + } + + break; + + case GLIBTOP_KERN_PROC_SESSION: + + /* return information about all processes in + * session passed in arg + */ + + if (pinfo.pi_sid != arg) + { + continue; + } + + break; + + case GLIBTOP_KERN_PROC_TTY: + + /* return information about all processes with + * tty device number passed in arg + */ + + if (pinfo.pi_ttyd != arg) + { + continue; + } + + break; + + case GLIBTOP_KERN_PROC_UID: + + /* return information about all processes with + * effective uid passed in arg + */ + + if (pinfo.pi_cred.cr_uid != arg) + { + continue; + } + + break; + + case GLIBTOP_KERN_PROC_RUID: + + /* return information about all processes with + * real uid passed in arg + */ + + if (pinfo.pi_cred.cr_ruid != arg) + { + continue; + } + + break; + } + + if (count >= BLOCK_COUNT) + { + /* The following call to glibtop_realloc will be + * equivalent to glibtop_malloc () if `pids_chain' is + * NULL. We just calculate the new size and copy `pids' + * to the beginning of the newly allocated block. */ + + new_size = pids_size + BLOCK_SIZE; + + pids_chain = glibtop_realloc_r + (server, pids_chain, new_size); + memcpy (pids_chain + pids_offset, pids, BLOCK_SIZE); + + pids_size = new_size; + pids_offset += BLOCK_COUNT; + count = 0; + } + + /* pids is now big enough to hold at least one single pid. */ + + pids[count++] = pinfo.pi_pid; + + total++; + } + + if (result == -1) + { + glibtop_error_io_r(server, "Cannot read procsinfo"); + } + + /* count is only zero if an error occured (one a running Linux system, + * we have at least one single process). */ + + if (!count) return NULL; + + /* The following call to glibtop_realloc will be equivalent to + * glibtop_malloc if pids_chain is NULL. We just calculate the + * new size and copy pids to the beginning of the newly allocated + * block. */ + + new_size = pids_size + count * sizeof (unsigned); + + pids_chain = glibtop_realloc_r (server, pids_chain, new_size); + + memcpy (pids_chain + pids_offset, pids, count * sizeof (unsigned)); + + pids_size = new_size; + + /* Since everything is ok now, we can set buf->flags, fill in the + * remaining fields and return the `pids_chain'. */ + + buf->size = sizeof(unsigned int); + buf->number = total; + buf->total = total * buf->size; + + buf->flags = _glibtop_sysdeps_proclist; + + return pids_chain; +} diff --git a/sysdeps/aix/procmap.c b/sysdeps/aix/procmap.c new file mode 100644 index 00000000..2ed372aa --- /dev/null +++ b/sysdeps/aix/procmap.c @@ -0,0 +1,50 @@ +/* $Id$ */ + +/* Copyright (C) 1998-99 Martin Baulig + This file is part of LibGTop 1.0. + + Contributed by Martin Baulig <martin@home-of-linux.org>, April 1998. + + LibGTop is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, + or (at your option) any later version. + + LibGTop is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with LibGTop; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. +*/ + + +#include <glibtop.h> +#include <glibtop/error.h> +#include <glibtop/xmalloc.h> +#include <glibtop/procmap.h> + +static const unsigned long _glibtop_sysdeps_proc_map = 0; + +/* Init function. */ + +void +glibtop_init_proc_map_s (glibtop *server) +{ + server->sysdeps.proc_map = _glibtop_sysdeps_proc_map; +} + +/* Provides detailed information about a process. */ + +glibtop_map_entry * +glibtop_get_proc_map_s (glibtop *server, glibtop_proc_map *buf, pid_t pid) +{ + glibtop_init_p (&server, GLIBTOP_SYSDEPS_PROC_MAP, 0); + + memset (buf, 0, sizeof (glibtop_proc_map)); + + return NULL; +} diff --git a/sysdeps/aix/procmem.c b/sysdeps/aix/procmem.c new file mode 100644 index 00000000..2e7738d3 --- /dev/null +++ b/sysdeps/aix/procmem.c @@ -0,0 +1,73 @@ +/* $Id$ */ + +/* Copyright (C) 1998-99 Martin Baulig + This file is part of LibGTop 1.0. + + Contributed by Martin Baulig <martin@home-of-linux.org>, April 1998. + + LibGTop is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, + or (at your option) any later version. + + LibGTop is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with LibGTop; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. +*/ + +#include <unistd.h> +#include <sys/vminfo.h> +#include <sys/resource.h> + +#include <glibtop.h> +#include <glibtop/error.h> +#include <glibtop/procmem.h> + +#include "utils.h" + +static const unsigned long _glibtop_sysdeps_proc_mem = +(1 << GLIBTOP_PROC_MEM_SIZE) + (1 << GLIBTOP_PROC_MEM_VSIZE) + +(1 << GLIBTOP_PROC_MEM_RESIDENT) + (1 << GLIBTOP_PROC_MEM_RSS) + +(1 << GLIBTOP_PROC_MEM_RSS_RLIM); + +/* Init function. */ + +void +glibtop_init_proc_mem_s (glibtop *server) +{ + server->sysdeps.proc_mem = _glibtop_sysdeps_proc_mem; +} + +/* Provides detailed information about a process. */ + +void +glibtop_get_proc_mem_s (glibtop *server, glibtop_proc_mem *buf, + pid_t pid) +{ + struct procsinfo *pinfo; + int pagesize; + + memset (buf, 0, sizeof (glibtop_proc_mem)); + + pinfo = _glibtop_get_procinfo(server, pid); + if (pinfo == NULL) + { + glibtop_error_io_r (server, "Cannot read procsinfo"); + + return; + } + + pagesize = sysconf(_SC_PAGESIZE); + + buf->vsize = buf->size = pinfo->pi_size * pagesize; + buf->resident = buf->rss = (pinfo->pi_drss + pinfo->pi_trss) * pagesize; + buf->rss_rlim = pinfo->pi_rlimit[RLIMIT_RSS].rlim_cur; + + buf->flags = _glibtop_sysdeps_proc_mem; +} diff --git a/sysdeps/aix/procsegment.c b/sysdeps/aix/procsegment.c new file mode 100644 index 00000000..b1cf02a1 --- /dev/null +++ b/sysdeps/aix/procsegment.c @@ -0,0 +1,74 @@ +/* $Id$ */ + +/* Copyright (C) 1998-99 Martin Baulig + This file is part of LibGTop 1.0. + + Contributed by Martin Baulig <martin@home-of-linux.org>, April 1998. + + LibGTop is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, + or (at your option) any later version. + + LibGTop is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with LibGTop; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. +*/ + +#include <unistd.h> +#include <sys/vminfo.h> +#include <sys/resource.h> + +#include <glibtop.h> +#include <glibtop/procsegment.h> +#include <glibtop/error.h> + +#include "utils.h" + +static const unsigned long _glibtop_sysdeps_proc_segment = +(1 << GLIBTOP_PROC_SEGMENT_TEXT_RSS) + (1 << GLIBTOP_PROC_SEGMENT_SHLIB_RSS) + +(1 << GLIBTOP_PROC_SEGMENT_DATA_RSS) + (1 << GLIBTOP_PROC_SEGMENT_STACK_RSS); + + +/* Init function. */ + +void +glibtop_init_proc_segment_s (glibtop *server) +{ + server->sysdeps.proc_segment = _glibtop_sysdeps_proc_segment; +} + +/* Provides detailed information about a process. */ + +void +glibtop_get_proc_segment_s (glibtop *server, glibtop_proc_segment *buf, + pid_t pid) +{ + struct procsinfo *pinfo; + int pagesize; + + memset (buf, 0, sizeof (glibtop_proc_segment)); + + pinfo = _glibtop_get_procinfo(server, pid); + if (pinfo == NULL) + { + glibtop_error_io_r (server, "Cannot read procsinfo"); + + return; + } + + pagesize = sysconf(_SC_PAGESIZE); + + buf->text_rss = pinfo->pi_trss * pagesize; + buf->data_rss = pinfo->pi_drss * pagesize; + buf->shlib_rss = pinfo->pi_ru.ru_ixrss * pagesize; + buf->stack_rss = pinfo->pi_ru.ru_isrss * pagesize; + + buf->flags = _glibtop_sysdeps_proc_segment; +} diff --git a/sysdeps/aix/procsignal.c b/sysdeps/aix/procsignal.c new file mode 100644 index 00000000..dbcb7829 --- /dev/null +++ b/sysdeps/aix/procsignal.c @@ -0,0 +1,89 @@ +/* $Id$ */ + +/* Copyright (C)) +998-99 Martin Baulig + This file is part of LibGTop) +.0. + + Contributed by Martin Baulig <martin@home-of-linux.org>, April) +998. + + LibGTop is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation; either version) + of the License, + or (at your option) any later version. + + LibGTop is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with LibGTop; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place - Suite) +30, + Boston, MA) +2111-1307, USA. +*/ + +#include <unistd.h> +#include <sys/vminfo.h> +#include <sys/resource.h> +#include <sys/signal.h> + +#include <glibtop.h> +#include <glibtop/procsignal.h> +#include <glibtop/error.h> + +#include "utils.h" + +static const unsigned long _glibtop_sysdeps_proc_signal = +(1 <<GLIBTOP_PROC_SIGNAL_SIGNAL) + (1 <<GLIBTOP_PROC_SIGNAL_BLOCKED) + +(1 <<GLIBTOP_PROC_SIGNAL_SIGIGNORE) + (1 <<GLIBTOP_PROC_SIGNAL_SIGCATCH); + +/* Init function. */ + +void +glibtop_init_proc_signal_s (glibtop *server) +{ + server->sysdeps.proc_signal = _glibtop_sysdeps_proc_signal; +} + +/* Provides detailed information about a process. */ + +void +glibtop_get_proc_signal_s (glibtop *server, glibtop_proc_signal *buf, + pid_t pid) +{ + struct procsinfo *pinfo; + int i; + long bit; + + memset (buf, 0, sizeof (glibtop_proc_signal)); + + pinfo = _glibtop_get_procinfo(server, pid); + if (pinfo == NULL) + { + glibtop_error_io_r (server, "Cannot read procsinfo"); + + return; + } + + /* pending signals */ + +#define NB_BITS (8 * sizeof(u_int64_t)) + + for (i = 0; (i < NSIG) && (i < 2 * NB_BITS); i++) + { + bit = 1 << (NB_BITS - 1 - (i % NB_BITS)); + + if (sigismember(&pinfo->pi_sig, i)) + buf->signal[i / NB_BITS] |= bit; + + if (pinfo->pi_signal[i] == (long)SIG_HOLD) + buf->blocked[i / NB_BITS] |= bit; + + if (pinfo->pi_signal[i] == (long)SIG_IGN) + buf->sigignore[i / NB_BITS] |= bit; + + if (pinfo->pi_signal[i] == (long)SIG_CATCH) + buf->sigcatch[i / NB_BITS] |= bit; + } + + buf->flags = _glibtop_sysdeps_proc_signal; +} diff --git a/sysdeps/aix/procstate.c b/sysdeps/aix/procstate.c new file mode 100644 index 00000000..b0a9c814 --- /dev/null +++ b/sysdeps/aix/procstate.c @@ -0,0 +1,127 @@ +/* $Id$ */ + +/* Copyright (C) 1998-99 Martin Baulig + This file is part of LibGTop 1.0. + + Contributed by Martin Baulig <martin@home-of-linux.org>, April 1998. + + LibGTop is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, + or (at your option) any later version. + + LibGTop is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with LibGTop; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. +*/ + +#include <procinfo.h> +#include <sys/thread.h> + +#include <glibtop.h> +#include <glibtop/procstate.h> +#include <glibtop/error.h> + +#include "utils.h" + +static const unsigned long _glibtop_sysdeps_proc_state = +(1 << GLIBTOP_PROC_STATE_CMD) + (1 << GLIBTOP_PROC_STATE_STATE) + +(1 << GLIBTOP_PROC_STATE_UID) + (1 << GLIBTOP_PROC_STATE_GID); + +/* Init function. */ + +void +glibtop_init_proc_state_s (glibtop *server) +{ + server->sysdeps.proc_state = _glibtop_sysdeps_proc_state; +} + +/* Provides detailed information about a process. */ + +void +glibtop_get_proc_state_s (glibtop *server, glibtop_proc_state *buf, + pid_t pid) +{ + struct procsinfo *pinfo; + struct thrdsinfo thinfo; + tid_t thid; + int result; + + memset (buf, 0, sizeof (glibtop_proc_state)); + + pinfo = _glibtop_get_procinfo(server, pid); + if (pinfo == NULL) + { + glibtop_error_io_r(server, "Cannot read procsinfo"); + + return; + } + + if (pinfo->pi_pid == 0) + { + strcpy(buf->cmd, "swapper"); + } + + if (pinfo->pi_comm[0] == 0) + { + strcpy(buf->cmd, "<unknown>"); + } + else + { + strncpy(buf->cmd, pinfo->pi_comm, 39); + } + + buf->uid = pinfo->pi_uid; + buf->gid = pinfo->pi_cred.cr_gid; + + if (pinfo->pi_state == SZOMB) + { + buf->state = 'Z'; + strcpy(buf->cmd, "<defunct>"); + } + else + { + /* get state of first thread */ + + thid = 0; + result = getthrds(pid, &thinfo, sizeof(thinfo), &thid, 1); + if (result != 1) + { + glibtop_error_io_r(server, "Cannot read threadinfo"); + } + + switch (thinfo.ti_state) + { + case TSIDL: + buf->state = 'D'; + break; + case TSRUN: + buf->state = 'R'; + break; + case TSSLEEP: + buf->state = 'S'; + break; + case TSZOMB: + buf->state = 'Z'; + strcpy(buf->cmd, "<defunct>"); + break; + case TSSTOP: + buf->state = 'T'; + break; + case TSSWAP: + buf->state = 'W'; + break; + default: + buf->state = 0; + break; + } + } + + buf->flags = _glibtop_sysdeps_proc_state; +} diff --git a/sysdeps/aix/proctime.c b/sysdeps/aix/proctime.c new file mode 100644 index 00000000..4526a889 --- /dev/null +++ b/sysdeps/aix/proctime.c @@ -0,0 +1,72 @@ +/* $Id$ */ + +/* Copyright (C) 1998-99 Martin Baulig + This file is part of LibGTop 1.0. + + Contributed by Martin Baulig <martin@home-of-linux.org>, April 1998. + + LibGTop is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, + or (at your option) any later version. + + LibGTop is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with LibGTop; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. +*/ + +#include <unistd.h> + +#include <glibtop.h> +#include <glibtop/proctime.h> +#include <glibtop/error.h> + +#include "utils.h" + +static const unsigned long _glibtop_sysdeps_proc_time = +(1 << GLIBTOP_PROC_TIME_START_TIME) + (1 << GLIBTOP_PROC_TIME_RTIME) + +(1 << GLIBTOP_PROC_TIME_UTIME) + (1 << GLIBTOP_PROC_TIME_STIME) + +(1 << GLIBTOP_PROC_TIME_CUTIME) + (1 << GLIBTOP_PROC_TIME_CSTIME) + +(1 << GLIBTOP_PROC_TIME_FREQUENCY); + +/* Init function. */ + +void +glibtop_init_proc_time_s (glibtop *server) +{ + server->sysdeps.proc_time = _glibtop_sysdeps_proc_time; +} + +/* Provides detailed information about a process. */ + +void +glibtop_get_proc_time_s (glibtop *server, glibtop_proc_time *buf, + pid_t pid) +{ + struct procsinfo *pinfo; + + memset (buf, 0, sizeof (glibtop_proc_time)); + + pinfo = _glibtop_get_procinfo(server, pid); + if (pinfo == NULL) + { + glibtop_error_io_r (server, "Cannot read procsinfo"); + return; + } + + buf->start_time = pinfo->pi_start; + buf->utime = pinfo->pi_ru.ru_utime.tv_sec + (double)pinfo->pi_ru.ru_utime.tv_usec/1000000.0; + buf->stime = pinfo->pi_ru.ru_stime.tv_sec + (double)pinfo->pi_ru.ru_stime.tv_usec/1000000.0; + buf->rtime = buf->utime + buf->stime; + buf->cutime = pinfo->pi_cru.ru_utime.tv_sec + (double)pinfo->pi_cru.ru_utime.tv_usec/1000000.0; + buf->cstime = pinfo->pi_cru.ru_stime.tv_sec + (double)pinfo->pi_cru.ru_stime.tv_usec/1000000.0; + buf->frequency = sysconf(_SC_CLK_TCK); + + buf->flags = _glibtop_sysdeps_proc_time; +} diff --git a/sysdeps/aix/procuid.c b/sysdeps/aix/procuid.c new file mode 100644 index 00000000..c5fe476f --- /dev/null +++ b/sysdeps/aix/procuid.c @@ -0,0 +1,101 @@ +/* $Id$ */ + +/* Copyright (C) 1998-99 Martin Baulig + This file is part of LibGTop 1.0. + + Contributed by Martin Baulig <martin@home-of-linux.org>, April 1998. + + LibGTop is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, + or (at your option) any later version. + + LibGTop is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with LibGTop; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. +*/ + +#include <unistd.h> +#include <sys/vminfo.h> +#include <sys/resource.h> + +#include <glibtop.h> +#include <glibtop/procuid.h> +#include <glibtop/error.h> + +#include "utils.h" + +static const unsigned long _glibtop_sysdeps_proc_uid = +(1 << GLIBTOP_PROC_UID_UID) + (1 << GLIBTOP_PROC_UID_EUID) + +(1 << GLIBTOP_PROC_UID_GID) + (1 << GLIBTOP_PROC_UID_EGID) + +(1 << GLIBTOP_PROC_UID_PID) + (1 << GLIBTOP_PROC_UID_PPID) + +(1 << GLIBTOP_PROC_UID_PGRP) + (1 << GLIBTOP_PROC_UID_SESSION) + +(1 << GLIBTOP_PROC_UID_TTY) + (1 << GLIBTOP_PROC_UID_PRIORITY) + +(1 << GLIBTOP_PROC_UID_NICE); + + +/* Init function. */ + +void +glibtop_init_proc_uid_s (glibtop *server) +{ + server->sysdeps.proc_uid = _glibtop_sysdeps_proc_uid; +} + +/* Provides detailed information about a process. */ + +void +glibtop_get_proc_uid_s (glibtop *server, glibtop_proc_uid *buf, + pid_t pid) +{ + struct procsinfo *pinfo; + struct thrdsinfo thinfo; + tid_t thid; + int result; + + memset (buf, 0, sizeof (glibtop_proc_uid)); + + pinfo = _glibtop_get_procinfo(server, pid); + if (pinfo == NULL) + { + glibtop_error_io_r (server, "Cannot read procsinfo"); + + return; + } + + buf->uid = pinfo->pi_cred.cr_ruid; + buf->euid = pinfo->pi_cred.cr_uid; + buf->gid = pinfo->pi_cred.cr_rgid; + buf->egid = pinfo->pi_cred.cr_gid; + + buf->pid = pinfo->pi_pid; + buf->ppid = pinfo->pi_ppid; + + buf->pgrp = pinfo->pi_pgrp; + buf->session = pinfo->pi_sid; + + buf->tty = pinfo->pi_ttyd; + + buf->nice = pinfo->pi_nice; + + buf->flags = _glibtop_sysdeps_proc_uid; + + thid = 0; + result = getthrds(pid, &thinfo, sizeof(thinfo), &thid, 1); + if (result != 1) + { + buf->flags &= ~(1 << GLIBTOP_PROC_UID_PRIORITY); + + glibtop_error_io_r(server, "Cannot read thrdsinfo"); + } + + /* priority of first thread */ + + buf->priority = thinfo.ti_pri; +} diff --git a/sysdeps/aix/sem_limits.c b/sysdeps/aix/sem_limits.c new file mode 100644 index 00000000..f3fce8d5 --- /dev/null +++ b/sysdeps/aix/sem_limits.c @@ -0,0 +1,86 @@ +/* $Id$ */ + +/* Copyright (C) 1998-99 Martin Baulig + This file is part of LibGTop 1.0. + + Contributed by Martin Baulig <martin@home-of-linux.org>, April 1998. + + LibGTop is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, + or (at your option) any later version. + + LibGTop is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with LibGTop; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. +*/ + +#include <glibtop.h> +#include <glibtop/sem_limits.h> +#include <glibtop/error.h> + +#include "utils.h" + +static const unsigned long _glibtop_sysdeps_sem_limits = +(1 << GLIBTOP_IPC_SEMMNI) + (1 << GLIBTOP_IPC_SEMMSL) + +(1 << GLIBTOP_IPC_SEMOPM) + (1 << GLIBTOP_IPC_SEMUME) + +(1 << GLIBTOP_IPC_SEMUSZ) + (1 << GLIBTOP_IPC_SEMVMX) + +(1 << GLIBTOP_IPC_SEMAEM); + +/* Init function. */ + +void +glibtop_init_sem_limits_p (glibtop *server) +{ + off_t result; + + result = _glibtop_get_kmem_offset(server, "seminfo"); + if (result <= 0) + { + server->sysdeps.sem_limits = 0; + return; + } + + server->machine.seminfo_offset = result; + + server->sysdeps.sem_limits = _glibtop_sysdeps_sem_limits; +} + +/* Provides information about sysv sem limits. */ + +void +glibtop_get_sem_limits_p (glibtop *server, glibtop_sem_limits *buf) +{ + int result; + struct seminfo seminfo; + + glibtop_init_p (server, (1L << GLIBTOP_SYSDEPS_SEM_LIMITS), 0); + + memset (buf, 0, sizeof (glibtop_sem_limits)); + + result = _glibtop_get_kmem_info(server, server->machine.seminfo_offset, + &seminfo, sizeof(seminfo)); + + if (result <= 0) + { + glibtop_error_io_r (server, "Cannot read seminfo"); + + return; + } + + buf->semmni = seminfo.semmni; + buf->semmsl = seminfo.semmsl; + buf->semopm = seminfo.semopm; + buf->semume = seminfo.semume; + buf->semusz = seminfo.semusz; + buf->semvmx = seminfo.semvmx; + buf->semaem = seminfo.semaem; + + buf->flags = _glibtop_sysdeps_sem_limits; +} diff --git a/sysdeps/aix/shm_limits.c b/sysdeps/aix/shm_limits.c new file mode 100644 index 00000000..67d20517 --- /dev/null +++ b/sysdeps/aix/shm_limits.c @@ -0,0 +1,79 @@ +/* $Id$ */ + +/* Copyright (C) 1998-99 Martin Baulig + This file is part of LibGTop 1.0. + + Contributed by Martin Baulig <martin@home-of-linux.org>, April 1998. + + LibGTop is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, + or (at your option) any later version. + + LibGTop is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with LibGTop; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. +*/ + +#include <sys/shm.h> + +#include <glibtop.h> +#include <glibtop/error.h> +#include <glibtop/shm_limits.h> + +static const unsigned long _glibtop_sysdeps_shm_limits = +(1L << GLIBTOP_IPC_SHMMAX) + (1L << GLIBTOP_IPC_SHMMIN) + +(1L << GLIBTOP_IPC_SHMMNI); + +/* Init function. */ + +void +glibtop_init_shm_limits_p (glibtop *server) +{ + int result; + + result = _glibtop_get_kmem_offset(server, "shminfo"); + if (result == -1) + { + server->sysdeps.shm_limits = 0; + return; + } + + server->machine.shminfo_offset = result; + + server->sysdeps.shm_limits = _glibtop_sysdeps_shm_limits; +} + +/* Provides information about sysv ipc limits. */ + +void +glibtop_get_shm_limits_p (glibtop *server, glibtop_shm_limits *buf) +{ + int result; + struct shminfo shminfo; + int s; + + glibtop_init_p (server, (1L << GLIBTOP_SYSDEPS_SHM_LIMITS), 0); + + memset (buf, 0, sizeof (glibtop_shm_limits)); + + result = _glibtop_get_kmem_info(server, server->machine.shminfo_offset, + &shminfo, sizeof(struct shminfo)); + if (result <= 0) + { + glibtop_error_io_r (server, "Cannot read shminfo"); + return; + } + + buf->shmmax = shminfo.shmmax; + buf->shmmin = shminfo.shmmin; + buf->shmmni = shminfo.shmmni; + + buf->flags = _glibtop_sysdeps_shm_limits; +} diff --git a/sysdeps/aix/siglist.c b/sysdeps/aix/siglist.c new file mode 100644 index 00000000..9778c0f8 --- /dev/null +++ b/sysdeps/aix/siglist.c @@ -0,0 +1,72 @@ +/* $Id$ */ + +/* Copyright (C) 1998-99 Martin Baulig + This file is part of LibGTop 1.0. + + Contributed by Martin Baulig <martin@home-of-linux.org>, April 1998. + + LibGTop is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, + or (at your option) any later version. + + LibGTop is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with LibGTop; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. +*/ + +#include <glibtop.h> +#include <glibtop/signal.h> + +const glibtop_signame glibtop_sys_siglist [] = +{ { 1, "SIGHUP", "Hangup" }, + { 2, "SIGINT", "Interrupt" }, + { 3, "SIGQUIT", "Quit" }, + { 4, "SIGILL", "Illegal Instruction" }, + { 5, "SIGTRAP", "Trace/Breakpoint Trap" }, + { 6, "SIGABRT", "Abort" }, + { 7, "SIGEMT", "Emulation Trap" }, + { 8, "SIGFPE", "Arithmetic Exception" }, + { 9, "SIGKILL", "Killed" }, + { 10, "SIGBUS", "Bus Error" }, + { 11, "SIGSEGV", "Segmentation Fault" }, + { 12, "SIGSYS", "Bad System Call" }, + { 13, "SIGPIPE", "Broken Pipe" }, + { 14, "SIGALRM", "Alarm Clock" }, + { 15, "SIGTERM", "Terminated" }, + { 16, "SIGURG", "Urgent Socket Condition" }, + { 17, "SIGSTOP", "Stop (signal)" }, + { 18, "SIGSTP", "Stop (user)" }, + { 19, "SIGCONT", "Continue" }, + { 20, "SIGCHLD", "Child Status Changed" }, + { 21, "SIGTTIN", "Stopped (tty input)" }, + { 22, "SIGTTOU", "Stopped (tty output)" }, + { 23, "SIGIO", "I/O completed" }, + { 24, "SIGXCPU", "Cpu Limit Exceeded" }, + { 25, "SIGXFSZ", "File Size Limit Exceeded" }, + { 27, "SIGMSG", "Message" }, + { 28, "SIGWINCH","Window Size Change" }, + { 29, "SIGPWR", "Power-Fail/Restart" }, + { 30, "SIGUSR1", "User Signal 1" }, + { 31, "SIGUSR2", "User Signal 2" }, + { 32, "SIGPROF", "Profiling Timer Expired" }, + { 33, "SIGDANGER","System Crash Imminent" }, + { 34, "SIGVTALRM","Virtual Timer Expired" }, + { 35, "SIGMIGRATE","Migrate Process" }, + { 36, "SIGPRE", "Programming Exception" }, + { 37, "SIGVIRT", "AIX Virtual Time Alarm" }, + { 38, "SIGALRM1", "m:n Condition Variables" }, + { 39, "SIGWAITING","Scheduling" }, + { 59, "SIGCPUFAIL","Predictive De-configuration of Processors" }, + { 60, "SIGKAP", "Keep Alive" }, + { 61, "SIGRETRACT","Monitor Mode Relinguish" }, + { 62, "SIGSOUND", "Sound Control Completed" }, + { 63, "SIGSAK", "Secure Attention Key" }, + { 0, NULL, NULL } +}; diff --git a/sysdeps/aix/swap.c b/sysdeps/aix/swap.c new file mode 100644 index 00000000..7e4db97c --- /dev/null +++ b/sysdeps/aix/swap.c @@ -0,0 +1,128 @@ +/* $Id$ */ + +/* Copyright (C) 1998-99 Martin Baulig + This file is part of LibGTop 1.0. + + Contributed by Martin Baulig <martin@home-of-linux.org>, April 1998. + + LibGTop is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, + or (at your option) any later version. + + LibGTop is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with LibGTop; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. +*/ + +#include <sys/vminfo.h> + +#include <glibtop.h> +#include <glibtop/error.h> +#include <glibtop/swap.h> + +static const unsigned long _glibtop_sysdeps_swap = +(1 << GLIBTOP_SWAP_TOTAL) + (1 << GLIBTOP_SWAP_USED) + +(1 << GLIBTOP_SWAP_FREE) + (1 << GLIBTOP_SWAP_PAGEIN) + +(1 << GLIBTOP_SWAP_PAGEOUT); + +#define FILENAME "/etc/swapspaces" + +/* Init function. */ + +void +glibtop_init_swap_s (glibtop *server) +{ + server->sysdeps.swap = _glibtop_sysdeps_swap; +} + +/* Provides information about swap usage. */ + +void +glibtop_get_swap_s (glibtop *server, glibtop_swap *buf) +{ + struct vminfo vminfo; + struct pginfo pginfo; + int pagesize; + int result; + FILE* fd; + char device_name[128]; + int c; + int comment = 0; + int pos = 0; + + memset (buf, 0, sizeof (glibtop_swap)); + + pagesize = sysconf(_SC_PAGESIZE); + + fd = fopen(FILENAME, "r"); + if (fd == NULL) + { + glibtop_error_io_r (server, "open (%s)", FILENAME); + } + + buf->total = 0; + buf->free = 0; + while((c = getc(fd)) != EOF) + { + if (comment) + { + /* skip comments */ + if (c == '\n') comment = 0; + continue; + } + switch(c) + { + case '*': + comment = 1; + break; + case '\n': + device_name[pos] = 0; + pos = 0; + + if (strncmp("dev=", device_name, 4) == 0) + { + result = swapqry(device_name+4, &pginfo); + if (result == -1) + { + glibtop_error_io_r (server, "Cannot read pginfo"); + break; + } + + buf->total += pginfo.size * pagesize; + buf->free += pginfo.free * pagesize;; + } + break; + case ' ': + case '\t': + break; + default: + device_name[pos++] = c; + break; + } + } + + buf->used = buf->total - buf->free; + fclose(fd); +#ifdef HAVE_VMGETINFO + result = vmgetinfo((void*)&vminfo, VMINFO, sizeof(vminfo)); +#else + result = _glibtop_vmgetinfo((void*)&vminfo, VMINFO, sizeof(vminfo)); +#endif + if (result == -1) + { + glibtop_error_io_r (server, "Cannot read vminfo"); + return; + } + + buf->pagein = vminfo.pageins; + buf->pageout = vminfo.pageouts; + + buf->flags = _glibtop_sysdeps_swap; +} diff --git a/sysdeps/aix/sysinfo.c b/sysdeps/aix/sysinfo.c new file mode 100644 index 00000000..8185c6cc --- /dev/null +++ b/sysdeps/aix/sysinfo.c @@ -0,0 +1,194 @@ +/* $Id$ */ + +/* Copyright (C) 1998-99 Martin Baulig + This file is part of LibGTop 1.0. + + Contributed by Martin Baulig <martin@home-of-linux.org>, April 1998. + + LibGTop is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, + or (at your option) any later version. + + LibGTop is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with LibGTop; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. +*/ + +#include <sys/systemcfg.h> + +#include <config.h> +#include <glibtop/sysinfo.h> + +static const unsigned long _glibtop_sysdeps_sysinfo = +(1L << GLIBTOP_SYSINFO_CPUINFO); + +static glibtop_sysinfo sysinfo; + +static void add_info(glibtop_entry* entry, char* label, char* value) +{ + g_ptr_array_add(entry->labels, g_strdup(label)); + g_hash_table_insert(entry->values, label, g_strdup(value)); +} + +static void init_sysinfo(void) +{ + int cpu; + char buf[64]; + + memset (&sysinfo, 0, sizeof (glibtop_sysinfo)); + + sysinfo.ncpu = MIN(_system_configuration.ncpus, GLIBTOP_NCPU); + + for (cpu = 0; cpu < sysinfo.ncpu ; cpu++) + { + /* init cpu data structure */ + + sysinfo.cpuinfo[cpu].labels = g_ptr_array_new(); + sysinfo.cpuinfo[cpu].values = g_hash_table_new (NULL, NULL); + + /* add properties */ + + switch(_system_configuration.architecture) + { + case POWER_RS: + add_info( &sysinfo.cpuinfo[cpu] + , "architecture" + , "Power Classic architecture"); + break; + case POWER_PC: + add_info( &sysinfo.cpuinfo[cpu] + , "architecture" + , "Power PC architecture"); + break; + case IA64: + add_info( &sysinfo.cpuinfo[cpu] + , "architecture" + , "Intel IA64 architecture"); + break; + default: + add_info( &sysinfo.cpuinfo[cpu] + , "architecture" + , "Unknown architecture"); + break; + } + + if ( (_system_configuration.architecture == POWER_RS) || + (_system_configuration.architecture == POWER_PC) ) + { + switch(_system_configuration.implementation) + { + case POWER_RS1: + add_info( &sysinfo.cpuinfo[cpu] + , "implementation" + , "RS1"); + break; + case POWER_RSC: + add_info( &sysinfo.cpuinfo[cpu] + , "implementation" + , "RSC"); + break; + case POWER_RS2: + add_info( &sysinfo.cpuinfo[cpu] + , "implementation" + , "RS2"); + break; + case POWER_601: + add_info( &sysinfo.cpuinfo[cpu] + , "implementation" + , "601"); + break; + case POWER_603: + add_info( &sysinfo.cpuinfo[cpu] + , "implementation" + , "603"); + break; + case POWER_604: + add_info( &sysinfo.cpuinfo[cpu] + , "implementation" + , "604"); + break; + case POWER_620: + add_info( &sysinfo.cpuinfo[cpu] + , "implementation" + , "620"); + break; + case POWER_630: + add_info( &sysinfo.cpuinfo[cpu] + , "implementation" + , "630"); + break; + case POWER_A35: + add_info( &sysinfo.cpuinfo[cpu] + , "implementation" + , "A35"); + break; + case POWER_RS64II: + add_info( &sysinfo.cpuinfo[cpu] + , "implementation" + , "RS64II"); + break; + case POWER_RS64III: + add_info( &sysinfo.cpuinfo[cpu] + , "implementation" + , "RS64III"); + break; + } + } + else if (_system_configuration.architecture == IA64) + { + switch(_system_configuration.implementation) + { + case IA64_M1: + add_info( &sysinfo.cpuinfo[cpu] + , "implementation" + , "IA64 M1"); + break; + case IA64_M2: + add_info( &sysinfo.cpuinfo[cpu] + , "implementation" + , "IA64 M2"); + break; + } + } + + sprintf(buf,"%d", _system_configuration.width); + add_info( &sysinfo.cpuinfo[cpu], "width", buf); + + if (_system_configuration.cache_attrib & (1 << 31)) + { + /* L1 cache is present */ + + sprintf(buf,"%d", _system_configuration.icache_size); + add_info( &sysinfo.cpuinfo[cpu], "L1 instruction cache size", buf); + + sprintf(buf,"%d", _system_configuration.dcache_size); + add_info( &sysinfo.cpuinfo[cpu], "L1 data cache size", buf); + } + + sprintf(buf,"%d", _system_configuration.L2_cache_size); + add_info( &sysinfo.cpuinfo[cpu], "L2 cache size", buf); + } + + sysinfo.flags = _glibtop_sysdeps_sysinfo; +} + +glibtop_sysinfo * +glibtop_get_sysinfo_s (glibtop *server) +{ + static int first_time = 1; + + if (first_time) + { + init_sysinfo(); + first_time = 0; + } + + return &sysinfo; +} diff --git a/sysdeps/aix/uptime.c b/sysdeps/aix/uptime.c new file mode 100644 index 00000000..250a72d1 --- /dev/null +++ b/sysdeps/aix/uptime.c @@ -0,0 +1,73 @@ +/* $Id$ */ + +/* Copyright (C) 1998-99 Martin Baulig + This file is part of LibGTop 1.0. + + Contributed by Martin Baulig <martin@home-of-linux.org>, April 1998. + + LibGTop is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, + or (at your option) any later version. + + LibGTop is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with LibGTop; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. +*/ + +#include <glibtop.h> +#include <glibtop/error.h> +#include <glibtop/uptime.h> + +#include <glibtop/cpu.h> + +#include <glibtop_suid.h> + +static const unsigned long _glibtop_sysdeps_uptime = +(1L << GLIBTOP_UPTIME_UPTIME) + (1L << GLIBTOP_UPTIME_IDLETIME); + +static const unsigned long _required_cpu_flags = +(1L << GLIBTOP_CPU_TOTAL) + (1L << GLIBTOP_CPU_IDLE) + +(1L << GLIBTOP_CPU_FREQUENCY); + +/* Init function. */ + +void +glibtop_init_uptime_p (glibtop *server) +{ + server->sysdeps.uptime = _glibtop_sysdeps_uptime; +} + +/* Provides uptime and idle time. */ + +void +glibtop_get_uptime_p (glibtop *server, glibtop_uptime *buf) +{ + glibtop_cpu cpu; + + glibtop_init_p (server, (1L << GLIBTOP_SYSDEPS_UPTIME), 0); + + memset (buf, 0, sizeof (glibtop_uptime)); + + /* We simply calculate it from the CPU usage. */ + + glibtop_get_cpu_p (server, &cpu); + + /* Make sure all required fields are present. */ + + if ((cpu.flags & _required_cpu_flags) != _required_cpu_flags) + return; + + /* Calculate values. */ + + buf->uptime = (double) cpu.total / (double) cpu.frequency; + buf->idletime = (double) cpu.idle / (double) cpu.frequency; + + buf->flags = _glibtop_sysdeps_uptime; +} diff --git a/sysdeps/aix/utils.c b/sysdeps/aix/utils.c new file mode 100644 index 00000000..e230eb77 --- /dev/null +++ b/sysdeps/aix/utils.c @@ -0,0 +1,141 @@ +/* $Id$ */ + +/* Copyright (C) 1998-99 Martin Baulig + This file is part of LibGTop 1.0. + + Contributed by Martin Baulig <martin@home-of-linux.org>, April 1998. + + LibGTop is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, + or (at your option) any later version. + + LibGTop is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with LibGTop; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. +*/ + +#include <nlist.h> + +#include <procinfo.h> +#include <sys/proc.h> +#include <sys/vminfo.h> + +#include <glibtop.h> +#include <glibtop/error.h> +#include <glibtop/xmalloc.h> +#include "glibtop_suid.h" +#include "utils.h" + +#ifndef HAVE_VMGETINFO +#include <dlfcn.h> +typedef int (*vmgetinfo_proto)(void *out, int command, int arg); +#endif + +off_t +_glibtop_get_kmem_offset(glibtop* server, char* kname) +{ + int result; + struct nlist kernelnames[] = + { {NULL, 0, 0, 0, 0, 0}, + {NULL, 0, 0, 0, 0, 0}, + }; + + kernelnames[0]._n._n_name = kname; + + glibtop_suid_enter(server); + + result = knlist(kernelnames, 1, sizeof(struct nlist)); + + glibtop_suid_leave(server); + + if (result == -1) + { + return -1; + } + + return kernelnames[0].n_value; +} + +int +_glibtop_get_kmem_info(glibtop* server, off_t offset, void* buf, size_t len) +{ + int result; + + glibtop_suid_enter(server); + + lseek(server->machine.kmem_fd, offset, SEEK_SET); + + result = read(server->machine.kmem_fd, buf, len); + + glibtop_suid_leave(server); + + return result; +} + +struct procsinfo* +_glibtop_get_procinfo (glibtop *server, pid_t pid) +{ + int result; + pid_t current; + static int first_time = 1; + + /* test if procsinfo already found */ + + if ((server->machine.last_pinfo.pi_pid == pid) && (!first_time)) + { + return &server->machine.last_pinfo; + } + + /* seek procsinfo if given pid */ + + first_time = 0; + current = 0; + while ((result = getprocs( &server->machine.last_pinfo + , sizeof(struct procsinfo) + , NULL, 0, ¤t, 1)) == 1) + { + + if (pid == server->machine.last_pinfo.pi_pid) + { + return &server->machine.last_pinfo; + } + } + return NULL; +} + +#ifndef HAVE_VMGETINFO +int +_glibtop_vmgetinfo (void *out, int command, int arg) +{ + void* handle; + + static vmgetinfo_proto kern_vmgetinfo = NULL; + + if (kern_vmgetinfo == NULL) + { + handle = dlopen("/unix", RTLD_NOW | RTLD_GLOBAL); + if (handle == NULL) + { + return -1; + } + + kern_vmgetinfo = dlsym( handle, "vmgetinfo"); + + dlclose(handle); + + if (kern_vmgetinfo == NULL) + { + return -1; + } + } + + return kern_vmgetinfo(out, command, arg); +} +#endif diff --git a/sysdeps/aix/utils.h b/sysdeps/aix/utils.h new file mode 100644 index 00000000..f845f61a --- /dev/null +++ b/sysdeps/aix/utils.h @@ -0,0 +1,45 @@ +/* $Id$ */ + +/* + This file is part of LibGTop 1.0. + + Contributed by Martin Baulig <martin@home-of-linux.org>, March 1999. + + LibGTop is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, + or (at your option) any later version. + + LibGTop is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with LibGTop; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. +*/ + +#ifndef __UTILS_H__ +#define __UTILS_H__ + +BEGIN_LIBGTOP_DECLS + +extern off_t +_glibtop_get_kmem_offset(glibtop* server, char* kname); + +extern int +_glibtop_get_kmem_info(glibtop* server, off_t offset, void* buf, size_t len); + +extern struct procsinfo* +_glibtop_get_procinfo (glibtop *server, pid_t pid); + +#ifndef HAVE_VMGETINFO +extern int +_glibtop_vmgetinfo (void *out, int command, int arg); +#endif + +END_LIBGTOP_DECLS + +#endif /* __UTILS_H__ */ |