implement NetBSD support, and some build problems on FreeBSD (Closes:

2004-03-09  Bastien Nocera  <hadess@hadess.net>

	* Makefile.am:
	* cpu.c: (glibtop_init_cpu_p), (glibtop_get_cpu_p):
	* glibtop_machine.h:
	* mem.c:
	* netload.c: (glibtop_get_netload_p):
	* prockernel.c: (glibtop_get_proc_kernel_p):
	* proclist.c: (glibtop_get_proclist_p):
	* procmap.c: (glibtop_get_proc_map_p):
	* procmem.c: (glibtop_get_proc_mem_p):
	* procsignal.c: (glibtop_get_proc_signal_p):
	* procstate.c: (glibtop_get_proc_state_p):
	* proctime.c:
	* procuid.c: (glibtop_get_proc_uid_p):
	* uptime.c: (glibtop_get_uptime_p): implement NetBSD support, and
	some build problems on FreeBSD (Closes: #135674)
This commit is contained in:
Bastien Nocera
2004-03-09 23:13:31 +00:00
committed by Bastien Nocera
parent a795ff4847
commit 4bd9752d52
15 changed files with 420 additions and 83 deletions

View File

@@ -1,3 +1,21 @@
2004-03-09 Bastien Nocera <hadess@hadess.net>
* Makefile.am:
* cpu.c: (glibtop_init_cpu_p), (glibtop_get_cpu_p):
* glibtop_machine.h:
* mem.c:
* netload.c: (glibtop_get_netload_p):
* prockernel.c: (glibtop_get_proc_kernel_p):
* proclist.c: (glibtop_get_proclist_p):
* procmap.c: (glibtop_get_proc_map_p):
* procmem.c: (glibtop_get_proc_mem_p):
* procsignal.c: (glibtop_get_proc_signal_p):
* procstate.c: (glibtop_get_proc_state_p):
* proctime.c:
* procuid.c: (glibtop_get_proc_uid_p):
* uptime.c: (glibtop_get_uptime_p): implement NetBSD support, and
some build problems on FreeBSD (Closes: #135674)
2004-03-09 Bastien Nocera <hadess@hadess.net>
* procargs.c: (glibtop_get_proc_args_p):

View File

@@ -7,7 +7,7 @@ libgtop_sysdeps_2_0_la_SOURCES = nosuid.c siglist.c
libgtop_sysdeps_2_0_la_LDFLAGS = $(LT_VERSION_INFO)
libgtop_sysdeps_suid_2_0_la_SOURCES = open.c close.c siglist.c cpu.c mem.c swap.c \
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 \

View File

@@ -27,11 +27,16 @@
#include <glibtop_suid.h>
#ifdef __NetBSD__
#include <sys/sched.h>
#endif
static const unsigned long _glibtop_sysdeps_cpu =
(1L << GLIBTOP_CPU_TOTAL) + (1L << GLIBTOP_CPU_USER) +
(1L << GLIBTOP_CPU_NICE) + (1L << GLIBTOP_CPU_SYS) +
(1L << GLIBTOP_CPU_IDLE) + (1L << GLIBTOP_CPU_FREQUENCY);
#ifndef KERN_CP_TIME
/* nlist structure for kernel access */
static struct nlist nlst [] = {
#ifdef __bsdi__
@@ -41,20 +46,26 @@ static struct nlist nlst [] = {
#endif
{ 0 }
};
#endif
/* MIB array for sysctl */
static int mib_length=2;
static int mib [] = { CTL_KERN, KERN_CLOCKRATE };
#ifdef KERN_CP_TIME
static int mib2 [] = { CTL_KERN, KERN_CP_TIME };
#endif
/* Init function. */
void
glibtop_init_cpu_p (glibtop *server)
{
#ifndef KERN_CP_TIME
if (kvm_nlist (server->machine.kd, nlst) < 0) {
glibtop_warn_io_r (server, "kvm_nlist (cpu)");
return;
}
#endif
/* Set this only if kvm_nlist () succeeded. */
server->sysdeps.cpu = _glibtop_sysdeps_cpu;
@@ -65,7 +76,11 @@ glibtop_init_cpu_p (glibtop *server)
void
glibtop_get_cpu_p (glibtop *server, glibtop_cpu *buf)
{
#ifdef KERN_CP_TIME
u_int64_t cpts [CPUSTATES];
#else
long cpts [CPUSTATES];
#endif
/* sysctl vars*/
struct clockinfo ci;
size_t length;
@@ -78,11 +93,19 @@ glibtop_get_cpu_p (glibtop *server, glibtop_cpu *buf)
if (server->sysdeps.cpu == 0)
return;
#ifdef KERN_CP_TIME
length = sizeof (cpts);
if (sysctl (mib2, mib_length, cpts, &length, NULL, 0)) {
glibtop_warn_io_r (server, "sysctl");
return;
}
#else
if (kvm_read (server->machine.kd, nlst [0].n_value,
&cpts, sizeof (cpts)) != sizeof (cpts)) {
glibtop_warn_io_r (server, "kvm_read (cp_time)");
return;
}
#endif
/* Get the clockrate data */
length = sizeof (struct clockinfo);

View File

@@ -39,6 +39,14 @@
#include <osreldate.h>
#endif
#ifdef __NetBSD__
#include <sys/proc.h>
#ifndef SRUN
#define SRUN SACTIVE
#endif
#endif
G_BEGIN_DECLS
typedef struct _glibtop_machine glibtop_machine;

View File

@@ -29,7 +29,9 @@
#include <sys/sysctl.h>
#include <sys/vmmeter.h>
#if defined(__NetBSD__) && (__NetBSD_Version__ < 105020000)
#include <vm/vm_param.h>
#endif
#if defined(__NetBSD__) && (__NetBSD_Version__ >= 104000000)
#include <uvm/uvm_extern.h>
@@ -74,7 +76,6 @@ static struct nlist nlst [] = {
};
/* MIB array for sysctl */
static int mib_length=2;
#ifdef __bsdi__
static int mib [] = { CTL_VM, VM_TOTAL };
#else

View File

@@ -83,6 +83,7 @@ glibtop_get_netload_p (glibtop *server, glibtop_netload *buf,
u_long ifnetaddr, ifnetfound, ifaddraddr;
struct sockaddr *sa;
char tname [16];
char temp [16];
union {
struct ifaddr ifa;
@@ -109,10 +110,13 @@ glibtop_get_netload_p (glibtop *server, glibtop_netload *buf,
sizeof (ifnet)) != sizeof (ifnet))
glibtop_error_io_r (server, "kvm_read (ifnetaddr)");
#if defined(__FreeBSD__) || defined(__bsdi__)
#if (defined(__FreeBSD__) && (__FreeBSD_version < 501113)) || defined(__bsdi__)
if (kvm_read (server->machine.kd, (u_long) ifnet.if_name,
tname, 16) != 16)
glibtop_error_io_r (server, "kvm_read (if_name)");
snprintf(temp, (15 - strlen(tname)), "%d", ifnet.if_unit);
strcat(tname, temp);
tname [15] = 0;
#else
strncpy (tname, ifnet.if_xname, 16);
tname [15] = 0;
@@ -140,39 +144,39 @@ glibtop_get_netload_p (glibtop *server, glibtop_netload *buf,
sin = (struct sockaddr_in *)sa;
if (ifnet.if_flags & IFF_UP)
buf->if_flags |= GLIBTOP_IF_FLAGS_UP;
buf->if_flags |= (1L << GLIBTOP_IF_FLAGS_UP);
if (ifnet.if_flags & IFF_BROADCAST)
buf->if_flags |= GLIBTOP_IF_FLAGS_BROADCAST;
buf->if_flags |= (1L << GLIBTOP_IF_FLAGS_BROADCAST);
if (ifnet.if_flags & IFF_DEBUG)
buf->if_flags |= GLIBTOP_IF_FLAGS_DEBUG;
buf->if_flags |= (1L << GLIBTOP_IF_FLAGS_DEBUG);
if (ifnet.if_flags & IFF_LOOPBACK)
buf->if_flags |= GLIBTOP_IF_FLAGS_LOOPBACK;
buf->if_flags |= (1L << GLIBTOP_IF_FLAGS_LOOPBACK);
if (ifnet.if_flags & IFF_POINTOPOINT)
buf->if_flags |= GLIBTOP_IF_FLAGS_POINTOPOINT;
buf->if_flags |= (1L << GLIBTOP_IF_FLAGS_POINTOPOINT);
if (ifnet.if_flags & IFF_RUNNING)
buf->if_flags |= GLIBTOP_IF_FLAGS_RUNNING;
buf->if_flags |= (1L << GLIBTOP_IF_FLAGS_RUNNING);
if (ifnet.if_flags & IFF_NOARP)
buf->if_flags |= GLIBTOP_IF_FLAGS_NOARP;
buf->if_flags |= (1L << GLIBTOP_IF_FLAGS_NOARP);
if (ifnet.if_flags & IFF_PROMISC)
buf->if_flags |= GLIBTOP_IF_FLAGS_PROMISC;
buf->if_flags |= (1L << GLIBTOP_IF_FLAGS_PROMISC);
if (ifnet.if_flags & IFF_ALLMULTI)
buf->if_flags |= GLIBTOP_IF_FLAGS_ALLMULTI;
buf->if_flags |= (1L << GLIBTOP_IF_FLAGS_ALLMULTI);
if (ifnet.if_flags & IFF_OACTIVE)
buf->if_flags |= GLIBTOP_IF_FLAGS_OACTIVE;
buf->if_flags |= (1L << GLIBTOP_IF_FLAGS_OACTIVE);
if (ifnet.if_flags & IFF_SIMPLEX)
buf->if_flags |= GLIBTOP_IF_FLAGS_SIMPLEX;
buf->if_flags |= (1L << GLIBTOP_IF_FLAGS_SIMPLEX);
if (ifnet.if_flags & IFF_LINK0)
buf->if_flags |= GLIBTOP_IF_FLAGS_LINK0;
buf->if_flags |= (1L << GLIBTOP_IF_FLAGS_LINK0);
if (ifnet.if_flags & IFF_LINK1)
buf->if_flags |= GLIBTOP_IF_FLAGS_LINK1;
buf->if_flags |= (1L << GLIBTOP_IF_FLAGS_LINK1);
if (ifnet.if_flags & IFF_LINK2)
buf->if_flags |= GLIBTOP_IF_FLAGS_LINK2;
buf->if_flags |= (1L << GLIBTOP_IF_FLAGS_LINK2);
#ifdef __FreeBSD__
if (ifnet.if_flags & IFF_ALTPHYS)
buf->if_flags |= GLIBTOP_IF_FLAGS_ALTPHYS;
buf->if_flags |= (1L << GLIBTOP_IF_FLAGS_ALTPHYS);
#endif
if (ifnet.if_flags & IFF_MULTICAST)
buf->if_flags |= GLIBTOP_IF_FLAGS_MULTICAST;
buf->if_flags |= (1L << GLIBTOP_IF_FLAGS_MULTICAST);
#if !defined(__bsdi__)
/* Commenting out to "fix" #13345. */

View File

@@ -34,12 +34,10 @@
#if (!defined __OpenBSD__) && (!defined __bsdi__)
#include <sys/user.h>
#endif
#if !defined(__bsdi__) && !(defined(__FreeBSD__) && defined(__alpha__))
#if !defined(__bsdi__) && !(defined(__FreeBSD__) && defined(__alpha__)) && \
!defined(__NetBSD__)
#include <machine/pcb.h>
#endif
#if defined(__FreeBSD__) && !defined(__alpha__)
#include <machine/tss.h>
#endif
#include <unistd.h>
#include <fcntl.h>
@@ -48,6 +46,23 @@
#include <osreldate.h>
#endif
#ifdef __NetBSD__
#include <machine/vmparam.h>
#include <machine/pmap.h>
#ifdef __arm32__
#define KERNBASE KERNEL_BASE
#endif
#endif
#ifdef __NetBSD__
#include <machine/vmparam.h>
#include <machine/pmap.h>
#ifdef __arm32__
#define KERNBASE KERNEL_BASE
#endif
#endif
static const unsigned long _glibtop_sysdeps_proc_kernel_pstats =
(1L << GLIBTOP_PROC_KERNEL_MIN_FLT) +
(1L << GLIBTOP_PROC_KERNEL_MAJ_FLT) +
@@ -78,9 +93,11 @@ glibtop_get_proc_kernel_p (glibtop *server,
pid_t pid)
{
struct kinfo_proc *pinfo;
#ifndef __FreeBSD__
struct user *u_addr = (struct user *)USRSTACK;
struct pstats pstats;
struct pcb pcb;
#endif
int count;
char filename [BUFSIZ];
@@ -101,17 +118,36 @@ glibtop_get_proc_kernel_p (glibtop *server,
if ((pinfo == NULL) || (count != 1))
glibtop_error_io_r (server, "kvm_getprocs (%d)", pid);
buf->nwchan = (unsigned long) pinfo [0].kp_proc.p_wchan &~ KERNBASE;
#if defined(__FreeBSD__) && (__FreeBSD_version >= 500013)
#define PROC_WCHAN ki_wchan
#define PROC_WMESG ki_wmesg
#define PROC_WMESG ki_wmesg
#else
#define PROC_WCHAN kp_proc.p_wchan
#define PROC_WMESG kp_proc.p_wmesg
#define PROC_WMESG kp_eproc.e_wmesg
#endif
#if !defined(__NetBSD__) || !defined(SACTIVE)
buf->nwchan = (unsigned long) pinfo [0].PROC_WCHAN &~ KERNBASE;
buf->flags |= (1L << GLIBTOP_PROC_KERNEL_NWCHAN);
if (pinfo [0].kp_proc.p_wchan && pinfo [0].kp_proc.p_wmesg) {
strncpy (buf->wchan, pinfo [0].kp_eproc.e_wmesg,
if (pinfo [0].PROC_WCHAN && pinfo [0].PROC_WMESG) {
strncpy (buf->wchan, pinfo [0].PROC_WMESG,
sizeof (buf->wchan) - 1);
buf->wchan [sizeof (buf->wchan) - 1] = 0;
buf->flags |= (1L << GLIBTOP_PROC_KERNEL_WCHAN);
} else {
buf->wchan [0] = 0;
}
#endif
#ifndef __FreeBSD__
/* Taken from `saveuser ()' in `/usr/src/bin/ps/ps.c'. */
@@ -129,8 +165,17 @@ glibtop_get_proc_kernel_p (glibtop *server,
glibtop_suid_enter (server);
#if !defined(__NetBSD__) || !defined(SACTIVE)
#ifdef __NetBSD__
/* On NetBSD, there is no kvm_uread(), and kvm_read() always reads
* from kernel memory. */
if (kvm_read (server->machine.kd,
#else
if ((pinfo [0].kp_proc.p_flag & P_INMEM) &&
kvm_uread (server->machine.kd, &(pinfo [0]).kp_proc,
#endif
(unsigned long) &u_addr->u_stats,
(char *) &pstats, sizeof (pstats)) == sizeof (pstats))
{
@@ -149,8 +194,12 @@ glibtop_get_proc_kernel_p (glibtop *server,
buf->flags |= _glibtop_sysdeps_proc_kernel_pstats;
}
#ifdef __NetBSD__
if (kvm_read (server->machine.kd,
#else
if ((pinfo [0].kp_proc.p_flag & P_INMEM) &&
kvm_uread (server->machine.kd, &(pinfo [0]).kp_proc,
#endif
(unsigned long) &u_addr->u_pcb,
(char *) &pcb, sizeof (pcb)) == sizeof (pcb))
{
@@ -167,18 +216,52 @@ glibtop_get_proc_kernel_p (glibtop *server,
/*xxx FreeBSD/Alpha? */
#endif
#else
#ifdef __i386__
buf->kstk_esp = (guint64) pcb.pcb_tss.tss_esp0;
#ifdef __bsdi__
buf->kstk_eip = (guint64) pcb.pcb_tss.tss_eip;
#else
buf->kstk_eip = (guint64) pcb.pcb_tss.__tss_eip;
#endif
#else
#if defined(__NetBSD__)
#if defined(__m68k__)
buf->kstk_esp = (u_int64_t) pcb.pcb_usp;
buf->kstk_eip = (u_int64_t) 0;
#elif (defined(__arm32__) || defined(__powerpc__))
buf->kstk_esp = (u_int64_t) pcb.pcb_sp;
buf->kstk_eip = (u_int64_t) 0;
#elif defined(__mipsel__)
buf->kstk_esp = (u_int64_t) pcb.pcb_context[8];
buf->kstk_eip = (u_int64_t) 0;
#elif defined(__sparc__)
buf->kstk_esp = (u_int64_t) pcb.pcb_sp;
buf->kstk_eip = (u_int64_t) pcb.pcb_pc;
#elif defined(__alpha__)
buf->kstk_esp = (u_int64_t) pcb.pcb_context[9];
buf->kstk_eip = (u_int64_t) pcb.pcb_context[8];
#else
/* provide some defaults for other platforms */
buf->kstk_esp = (u_int64_t) 0;
buf->kstk_eip = (u_int64_t) 0;
#endif /* ${MACHINE_ARCH} */
#endif /* __NetBSD__ */
buf->flags |= _glibtop_sysdeps_proc_kernel_pcb;
#endif
#endif
}
#endif
/* Taken from `wchan ()' in `/usr/src/bin/ps/print.c'. */
glibtop_suid_leave (server);
#else
/* XXX: the code here was, quite frankly, junk, and almost
* certainly wrong - remove it all, leave these fields
* unpopulated, and give up until such time as the right
* code is produced for both FreeBSD 4.x and 5.x
*/
return;
#endif /* __FreeBSD__ */
}

View File

@@ -85,13 +85,25 @@ glibtop_get_proclist_p (glibtop *server, glibtop_proclist *buf,
pids = g_realloc (pids, count * sizeof (unsigned));
/* Copy the pids over to this chain */
for (i=j=0; i < count; i++) {
#if defined(__FreeBSD__) && (__FreeBSD_version >= 500013)
#define PROC_STAT ki_stat
#define PROC_RUID ki_ruid
#define PROC_PID ki_pid
#else
#define PROC_STAT kp_proc.p_stat
#define PROC_RUID kp_eproc.e_pcred.p_ruid
#define PROC_PID kp_proc.p_pid
#endif
if ((real_which & GLIBTOP_EXCLUDE_IDLE) &&
(pinfo[i].kp_proc.p_stat != SRUN))
(pinfo[i].PROC_STAT != SRUN))
continue;
else if ((real_which & GLIBTOP_EXCLUDE_SYSTEM) &&
(pinfo[i].kp_eproc.e_pcred.p_ruid == 0))
(pinfo[i].PROC_RUID == 0))
continue;
pids [j++] = (unsigned) pinfo[i].kp_proc.p_pid;
pids [j++] = (unsigned) pinfo[i].PROC_PID;
} /* end for */
/* Set the fields in buf */
buf->number = j;

View File

@@ -31,9 +31,21 @@
#include <sys/param.h>
#include <sys/proc.h>
#include <sys/resource.h>
#if defined(__NetBSD__) && (__NetBSD_Version__ < 105020000)
#include <vm/vm_object.h>
#include <vm/vm_prot.h>
#include <vm/vm_map.h>
#elif defined(__NetBSD__) && (__NetBSD_Version__ >= 105020000)
#include <uvm/uvm_extern.h>
#else
#include <vm/vm_object.h>
#include <vm/vm_map.h>
#if (__FreeBSD_version >= 400011)
#include <vm/vm.h>
#else
#include <vm/vm_prot.h>
#endif
#endif
#include <sys/vnode.h>
#include <sys/mount.h>
@@ -45,7 +57,9 @@
#include <sys/user.h>
#endif
#include <sys/sysctl.h>
#if !defined(__NetBSD__) || (__NetBSD_Version__ < 105020000)
#include <vm/vm.h>
#endif
#if defined(__NetBSD__) && (__NetBSD_Version__ >= 104000000)
/* Fixme ... */
@@ -90,8 +104,9 @@ glibtop_get_proc_map_p (glibtop *server, glibtop_proc_map *buf,
glibtop_map_entry *maps;
#if defined __FreeBSD__
struct vnode vnode;
#if __FreeBSD_version >= 500039
struct inode inode;
struct mount mount;
#endif
#endif
int count, i = 0;
int update = 0;
@@ -113,7 +128,11 @@ glibtop_get_proc_map_p (glibtop *server, glibtop_proc_map *buf,
/* Now we get the memory maps. */
if (kvm_read (server->machine.kd,
#if defined(__FreeBSD__) && (__FreeBSD_version >= 500013)
(unsigned long) pinfo [0].ki_vmspace,
#else
(unsigned long) pinfo [0].kp_proc.p_vmspace,
#endif
(char *) &vmspace, sizeof (vmspace)) != sizeof (vmspace))
glibtop_error_io_r (server, "kvm_read (vmspace)");
@@ -213,9 +232,10 @@ glibtop_get_proc_map_p (glibtop *server, glibtop_proc_map *buf,
#endif
#if defined(__NetBSD__) && (__NetBSD_Version__ >= 104000000)
#if defined(UVM_VNODE_VALID)
if (!vnode.v_uvm.u_flags & UVM_VNODE_VALID)
continue;
#endif
if ((vnode.v_type != VREG) || (vnode.v_tag != VT_UFS) ||
!vnode.v_data) continue;
@@ -243,6 +263,15 @@ glibtop_get_proc_map_p (glibtop *server, glibtop_proc_map *buf,
&vnode, sizeof (vnode)) != sizeof (vnode))
glibtop_error_io_r (server, "kvm_read (vnode)");
#if defined(__FreeBSD__) && (__FreeBSD_version >= 500039)
switch (vnode.v_type) {
case VREG:
maps [i-1].inode = vnode.v_cachedid;
maps [i-1].device = vnode.v_cachedfs;
default:
continue;
}
#else
if ((vnode.v_type != VREG) || (vnode.v_tag != VT_UFS) ||
!vnode.v_data) continue;
@@ -255,7 +284,7 @@ glibtop_get_proc_map_p (glibtop *server, glibtop_proc_map *buf,
(unsigned long) vnode.v_mount,
&mount, sizeof (mount)) != sizeof (mount))
glibtop_error_io_r (server, "kvm_read (mount)");
#endif
maps [i-1].inode = inode.i_number;
maps [i-1].device = inode.i_dev;
#endif

View File

@@ -31,8 +31,12 @@
#include <sys/param.h>
#include <sys/proc.h>
#include <sys/resource.h>
#ifdef __NetBSD__ && (__NetBSD_Version__ >= 105020000)
#include <uvm/uvm_extern.h>
#else
#include <vm/vm_object.h>
#include <vm/vm_map.h>
#endif
#include <sys/vnode.h>
#include <ufs/ufs/quota.h>
@@ -43,9 +47,14 @@
#include <sys/user.h>
#endif
#include <sys/sysctl.h>
#ifdef __NetBSD__ && (__NetBSD_Version__ >= 105020000)
#include <uvm/uvm.h>
#else
#include <vm/vm.h>
#endif
#if defined(__NetBSD__) && (__NetBSD_Version__ >= 104000000)
#if defined(__NetBSD__) && \
(__NetBSD_Version__ >= 104000000) && (__NetBSD_Version__ < 105020000)
/* Fixme ... */
#undef _KERNEL
#define _UVM_UVM_AMAP_I_H_ 1
@@ -113,7 +122,6 @@ glibtop_get_proc_mem_p (glibtop *server, glibtop_proc_mem *buf,
struct vmspace *vms, vmspace;
#if defined(__NetBSD__) && (__NetBSD_Version__ >= 104000000)
struct vnode vnode;
struct inode inode;
#else
struct vm_object object;
#endif
@@ -136,9 +144,24 @@ glibtop_get_proc_mem_p (glibtop *server, glibtop_proc_mem *buf,
glibtop_warn_io_r (server, "kvm_getprocs (%d)", pid);
return;
}
#if defined(__FreeBSD__) && (__FreeBSD_version >= 500013)
#define PROC_VMSPACE ki_vmspace
buf->rss_rlim = pinfo [0].ki_rssize;
buf->vsize = buf->size = (u_int64_t) pagetok
(pinfo [0].ki_tsize + pinfo [0].ki_dsize + pinfo[0].ki_ssize)
<< LOG1024;
buf->resident = buf->rss = (u_int64_t) pagetok
(pinfo [0].ki_rssize) << LOG1024;
#else
#define PROC_VMSPACE kp_proc.p_vmspace
if (kvm_read (server->machine.kd,
(unsigned long) pinfo [0].kp_proc.p_limit,
(unsigned long) pinfo [0].PROC_VMSPACE,
(char *) &plimit, sizeof (plimit)) != sizeof (plimit)) {
glibtop_warn_io_r (server, "kvm_read (plimit)");
return;
@@ -154,11 +177,12 @@ glibtop_get_proc_mem_p (glibtop *server, glibtop_proc_mem *buf,
buf->resident = buf->rss = (guint64) pagetok
(vms->vm_rssize) << LOG1024;
#endif
/* Now we get the shared memory. */
if (kvm_read (server->machine.kd,
(unsigned long) pinfo [0].kp_proc.p_vmspace,
(unsigned long) pinfo [0].PROC_VMSPACE,
(char *) &vmspace, sizeof (vmspace)) != sizeof (vmspace)) {
glibtop_warn_io_r (server, "kvm_read (vmspace)");
return;
@@ -233,17 +257,26 @@ glibtop_get_proc_mem_p (glibtop *server, glibtop_proc_mem *buf,
/* If the object is of type vnode, add its size */
#if defined(__NetBSD__) && (__NetBSD_Version__ >= 104000000)
#if defined(UVM_VNODE_VALID)
if (!vnode.v_uvm.u_flags & UVM_VNODE_VALID)
continue;
#endif
if ((vnode.v_type != VREG) || (vnode.v_tag != VT_UFS) ||
!vnode.v_data) continue;
#if defined(__NetBSD__) && (__NetBSD_Version__ >= 105250000)
/* Reference count must be at least two. */
if (vnode.v_usecount <= 1)
continue;
buf->share += pagetok (vnode.v_uobj.uo_npages) << LOG1024;
#else
/* Reference count must be at least two. */
if (vnode.v_uvm.u_obj.uo_refs <= 1)
continue;
buf->share += pagetok (vnode.v_uvm.u_obj.uo_npages) << LOG1024;
#endif /* __NetBSD_Version__ >= 105250000 */
#endif
#ifdef __FreeBSD__

View File

@@ -27,6 +27,8 @@
#include <glibtop_suid.h>
#include <sys/param.h>
#ifdef __FreeBSD__
#include <osreldate.h>
#endif
@@ -67,11 +69,30 @@ glibtop_get_proc_signal_p (glibtop *server,
return;
}
#if defined(__FreeBSD__) && (__FreeBSD_version >= 500013)
#define PROC_SIGLIST ki_siglist
#define PROC_SIGMASK ki_sigmask
#define PROC_SIGIGNORE ki_sigignore
#define PROC_SIGCATCH ki_sigcatch
#else
#define PROC_SIGLIST kp_proc.p_siglist
#define PROC_SIGMASK kp_proc.p_sigmask
#define PROC_SIGIGNORE kp_proc.p_sigignore
#define PROC_SIGCATCH kp_proc.p_sigcatch
#endif
/* signal: mask of pending signals.
* pinfo [0].kp_proc.p_siglist
*/
#if (defined(__NetBSD__) && (NSIG > 32)) || (__FreeBSD_version >= 400011)
buf->signal [0] = pinfo [0].kp_proc.p_siglist.__bits[0];
#if defined(__NetBSD__) && (__NetBSD_Version__ >= 105150000)
buf->signal [0] = pinfo [0].kp_proc.p_sigctx.ps_siglist.__bits[0];
#elif (defined(__NetBSD__) && (NSIG > 32)) || \
(defined(__FreeBSD__) && (__FreeBSD_version >= 400011))
buf->signal [0] = pinfo [0].PROC_SIGLIST.__bits[0];
#else
buf->signal [0] = pinfo [0].kp_proc.p_siglist;
#endif
@@ -79,8 +100,11 @@ glibtop_get_proc_signal_p (glibtop *server,
/* blocked: mask of blocked signals.
* pinfo [0].kp_proc.p_sigmask
*/
#if (defined(__NetBSD__) && (NSIG > 32)) || (__FreeBSD_version >= 400011)
buf->blocked [0] = pinfo [0].kp_proc.p_sigmask.__bits[0];
#if defined(__NetBSD__) && (__NetBSD_Version__ >= 105150000)
buf->blocked [0] = pinfo [0].kp_proc.p_sigctx.ps_sigmask.__bits[0];
#elif (defined(__NetBSD__) && (NSIG > 32)) || \
(defined(__FreeBSD__) && (__FreeBSD_version >= 400011))
buf->blocked [0] = pinfo [0].PROC_SIGMASK.__bits[0];
#else
buf->blocked [0] = pinfo [0].kp_proc.p_sigmask;
#endif
@@ -88,8 +112,11 @@ glibtop_get_proc_signal_p (glibtop *server,
/* sigignore: mask of ignored signals.
* pinfo [0].kp_proc.p_sigignore
*/
#if (defined(__NetBSD__) && (NSIG > 32)) || (__FreeBSD_version >= 400011)
buf->sigignore [0] = pinfo [0].kp_proc.p_sigignore.__bits[0];
#if defined(__NetBSD__) && (__NetBSD_Version__ >= 105150000)
buf->sigignore [0] = pinfo [0].kp_proc.p_sigctx.ps_sigignore.__bits[0];
#elif (defined(__NetBSD__) && (NSIG > 32)) || \
(defined(__FreeBSD__) && (__FreeBSD_version >= 400011))
buf->sigignore [0] = pinfo [0].PROC_SIGIGNORE.__bits[0];
#else
buf->sigignore [0] = pinfo [0].kp_proc.p_sigignore;
#endif
@@ -97,8 +124,11 @@ glibtop_get_proc_signal_p (glibtop *server,
/* sigcatch: mask of caught signals.
* pinfo [0].kp_proc.p_sigcatch
*/
#if (defined(__NetBSD__) && (NSIG > 32)) || (__FreeBSD_version >= 400011)
buf->sigcatch [0] = pinfo [0].kp_proc.p_sigcatch.__bits[0];
#if defined(__NetBSD__) && (__NetBSD_Version__ >= 105150000)
buf->sigcatch [0] = pinfo [0].kp_proc.p_sigctx.ps_sigcatch.__bits[0];
#elif (defined(__NetBSD__) && (NSIG > 32)) || \
(defined(__FreeBSD__) && (__FreeBSD_version >= 400011))
buf->sigcatch [0] = pinfo [0].PROC_SIGCATCH.__bits[0];
#else
buf->sigcatch [0] = pinfo [0].kp_proc.p_sigcatch;
#endif

View File

@@ -37,11 +37,7 @@ static const unsigned long _glibtop_sysdeps_proc_state =
(1L << GLIBTOP_PROC_STATE_GID);
static const unsigned long _glibtop_sysdeps_proc_state_new =
#if LIBGTOP_VERSION_CODE >= 1001000
(1L << GLIBTOP_PROC_STATE_RUID) + (1L << GLIBTOP_PROC_STATE_RGID);
#else
0;
#endif
/* Init function. */
@@ -76,32 +72,47 @@ glibtop_get_proc_state_p (glibtop *server,
return;
}
strncpy (buf->cmd, pinfo [0].kp_proc.p_comm, sizeof (buf->cmd)-1);
#if defined(__FreeBSD__) && (__FreeBSD_version >= 500013)
#define PROC_COMM ki_comm
#define PROC_SVUID ki_svuid
#define PROC_SVGID ki_svgid
#define PROC_RUID ki_ruid
#define PROC_RGID ki_rgid
#define PROC_STAT ki_stat
#else
#define PROC_COMM kp_proc.p_comm
#define PROC_SVUID kp_eproc.e_pcred.p_svuid
#define PROC_SVGID kp_eproc.e_pcred.p_svgid
#define PROC_RUID kp_eproc.e_pcred.p_ruid
#define PROC_RGID kp_eproc.e_pcred.p_rgid
#define PROC_STAT kp_proc.p_stat
#endif
strncpy (buf->cmd, pinfo [0].PROC_COMM, sizeof (buf->cmd)-1);
buf->cmd [sizeof (buf->cmd)-1] = 0;
buf->uid = pinfo [0].kp_eproc.e_pcred.p_svuid;
buf->gid = pinfo [0].kp_eproc.e_pcred.p_svgid;
#if LIBGTOP_VERSION_CODE >= 1001000
buf->ruid = pinfo [0].kp_eproc.e_pcred.p_ruid;
buf->rgid = pinfo [0].kp_eproc.e_pcred.p_rgid;
#endif
buf->uid = pinfo [0].PROC_SVUID;
buf->gid = pinfo [0].PROC_SVGID;
/* Set the flags for the data we're about to return*/
buf->flags = _glibtop_sysdeps_proc_state |
_glibtop_sysdeps_proc_state_new;
#if LIBGTOP_VERSION_CODE >= 1001000
switch (pinfo [0].kp_proc.p_stat) {
switch (pinfo [0].PROC_STAT) {
case SIDL:
buf->state = 0;
break;
case SRUN:
buf->state = GLIBTOP_PROCESS_RUNNING;
break;
#ifdef SSLEEP
case SSLEEP:
buf->state = GLIBTOP_PROCESS_INTERRUPTIBLE;
break;
#endif
case SSTOP:
buf->state = GLIBTOP_PROCESS_STOPPED;
break;
@@ -112,16 +123,18 @@ glibtop_get_proc_state_p (glibtop *server,
return;
}
#else
switch (pinfo [0].kp_proc.p_stat) {
switch (pinfo [0].PROC_STAT) {
case SIDL:
buf->state = 'S';
break;
case SRUN:
buf->state = 'R';
break;
#ifdef SSLEEP
case SSLEEP:
buf->state = 'S';
break;
#endif
case SSTOP:
buf->state = 'T';
break;

View File

@@ -57,6 +57,8 @@ glibtop_init_proc_time_p (glibtop *server)
* system, and interrupt time usage.
*/
#ifndef __FreeBSD__
static void
calcru(p, up, sp, ip)
struct proc *p;
@@ -66,9 +68,7 @@ calcru(p, up, sp, ip)
{
quad_t totusec;
u_quad_t u, st, ut, it, tot;
#if (__FreeBSD_version < 300003)
long sec, usec;
#endif
struct timeval tv;
st = p->p_sticks;
@@ -117,6 +117,8 @@ calcru(p, up, sp, ip)
}
}
#endif /* !__FreeBSD__ */
/* Provides detailed information about a process. */
void
@@ -142,7 +144,7 @@ glibtop_get_proc_time_p (glibtop *server, glibtop_proc_time *buf,
/* It does not work for the swapper task. */
if (pid == 0) return;
#if !(defined(__NetBSD__) && (__NetBSD_Version__ >= 104000000))
#if (defined(__NetBSD__) && (__NetBSD_Version__ >= 104000000))
if (server->sysdeps.proc_time == 0)
return;
@@ -157,7 +159,9 @@ glibtop_get_proc_time_p (glibtop *server, glibtop_proc_time *buf,
if ((pinfo == NULL) || (count != 1))
glibtop_error_io_r (server, "kvm_getprocs (%d)", pid);
#if (defined __FreeBSD__) && (__FreeBSD_version >= 300003)
#if defined(__FreeBSD__) && (__FreeBSD_version >= 500013)
buf->rtime = pinfo [0].ki_runtime;
#elif (defined __FreeBSD__) && (__FreeBSD_version <= 500013)
buf->rtime = pinfo [0].kp_proc.p_runtime;
#else
buf->rtime = tv2sec (pinfo [0].kp_proc.p_rtime);
@@ -192,8 +196,40 @@ glibtop_get_proc_time_p (glibtop *server, glibtop_proc_time *buf,
buf->flags |= _glibtop_sysdeps_proc_time_user;
#else
#if defined(__FreeBSD__) && (__FreeBSD_version >= 500013)
#if __FreeBSD_version >= 500016
if ((pinfo [0].ki_flag & PS_INMEM)) {
#else
if ((pinfo [0].ki_flag & P_INMEM)) {
#endif
buf->utime = pinfo [0].ki_runtime;
buf->stime = 0; /* XXX */
buf->cutime = tv2sec (pinfo [0].ki_childtime);
buf->cstime = 0; /* XXX */
buf->start_time = tv2sec (pinfo [0].ki_start);
buf->flags = _glibtop_sysdeps_proc_time_user;
}
glibtop_suid_enter (server);
#elif (__FreeBSD_version <= 500013)
if ((pinfo [0].kp_proc.p_flag & P_INMEM) &&
kvm_uread (server->machine.kd, &(pinfo [0]).kp_proc,
(unsigned long) &u_addr->u_stats,
(char *) &pstats, sizeof (pstats)) == sizeof (pstats))
{
buf->utime = tv2sec (pinfo[0].kp_eproc.e_stats.p_ru.ru_utime);
buf->stime = tv2sec (pinfo[0].kp_eproc.e_stats.p_ru.ru_stime);
buf->cutime = tv2sec (pinfo[0].kp_eproc.e_stats.p_cru.ru_utime);
buf->cstime = tv2sec (pinfo[0].kp_eproc.e_stats.p_cru.ru_stime);
buf->start_time = tv2sec (pinfo[0].kp_eproc.e_stats.p_start);
buf->flags = _glibtop_sysdeps_proc_time_user;
glibtop_suid_leave (server);
}
#else
if ((pinfo [0].kp_proc.p_flag & P_INMEM) &&
kvm_uread (server->machine.kd, &(pinfo [0]).kp_proc,
(unsigned long) &u_addr->u_stats,
@@ -222,7 +258,7 @@ glibtop_get_proc_time_p (glibtop *server, glibtop_proc_time *buf,
buf->flags = _glibtop_sysdeps_proc_time_user;
}
#endif
glibtop_suid_leave (server);
#endif
}

View File

@@ -35,15 +35,7 @@ static const unsigned long _glibtop_sysdeps_proc_uid =
(1L << GLIBTOP_PROC_UID_NICE);
static const unsigned long _glibtop_sysdeps_proc_uid_groups =
#if LIBGTOP_VERSION_CODE >= 1001000
#if defined(__NetBSD__) && (__NetBSD_Version__ >= 104000000)
(1L << GLIBTOP_PROC_UID_NGROUPS) + (1L << GLIBTOP_PROC_UID_GROUPS);
#else
0L;
#endif
#else /* LIBGTOP_VERSION_CODE < 1001000 */
0L;
#endif
/* Init function. */
@@ -84,24 +76,57 @@ glibtop_get_proc_uid_p (glibtop *server, glibtop_proc_uid *buf,
return;
}
buf->uid = pinfo [0].kp_eproc.e_pcred.p_ruid;
buf->euid = pinfo [0].kp_eproc.e_pcred.p_svuid;
buf->gid = pinfo [0].kp_eproc.e_pcred.p_rgid;
buf->egid = pinfo [0].kp_eproc.e_pcred.p_svgid;
#if defined(__FreeBSD__) && (__FreeBSD_version >= 500013)
buf->ppid = pinfo [0].kp_eproc.e_ppid;
buf->pgrp = pinfo [0].kp_eproc.e_pgid;
buf->tpgid = pinfo [0].kp_eproc.e_tpgid;
#define PROC_RUID ki_ruid
#define PROC_SVUID ki_svuid
#define PROC_RGID ki_rgid
#define PROC_SVGID ki_svgid
#define PROC_PPID ki_ppid
#define PROC_PGID ki_pgid
#define PROC_TPGID ki_tpgid
#define PROC_NICE ki_nice
#if __FreeBSD_version >= 500013
#define PROC_PRIORITY ki_pri.pri_user
#else
#define PROC_PRIORITY ki_priority
#endif
#else
buf->nice = pinfo [0].kp_proc.p_nice;
buf->priority = pinfo [0].kp_proc.p_priority;
#define PROC_RUID kp_eproc.e_pcred.p_ruid
#define PROC_SVUID kp_eproc.e_pcred.p_svuid
#define PROC_RGID kp_eproc.e_pcred.p_rgid
#define PROC_SVGID kp_eproc.e_pcred.p_svgid
#define PROC_PPID kp_eproc.e_ppid
#define PROC_PGID kp_eproc.e_pgid
#define PROC_TPGID kp_eproc.e_tpgid
#define PROC_NICE kp_proc.p_nice
#define PROC_PRIORITY kp_proc.p_priority
#endif
buf->uid = pinfo [0].PROC_RUID;
buf->euid = pinfo [0].PROC_SVUID;
buf->gid = pinfo [0].PROC_RGID;
buf->egid = pinfo [0].PROC_SVGID;
buf->ppid = pinfo [0].PROC_PPID;
buf->pgrp = pinfo [0].PROC_PGID;
buf->tpgid = pinfo [0].PROC_TPGID;
buf->nice = pinfo [0].PROC_NICE;
#if defined(__NetBSD__) && defined(SACTIVE)
buf->priority = 0;
#else
buf->priority = pinfo [0].PROC_PRIORITY;
#endif
/* Set the flags for the data we're about to return*/
buf->flags = _glibtop_sysdeps_proc_uid;
/* Use LibGTop conditionals here so we can more easily merge this
* code into the LIBGTOP_STABLE_1_0 branch. */
#if LIBGTOP_VERSION_CODE >= 1001000
#if 0
/* This probably also works with other versions, but not yet
* tested. Please remove the conditional if this is true. */
#if defined(__NetBSD__) && (__NetBSD_Version__ >= 104000000)

View File

@@ -49,6 +49,27 @@ glibtop_init_uptime_p (glibtop *server)
void
glibtop_get_uptime_p (glibtop *server, glibtop_uptime *buf)
{
#ifdef __NetBSD__
time_t now;
time_t uptime;
int mib[2];
struct timeval boottime;
size_t size;
mib[0] = CTL_KERN;
mib[1] = KERN_BOOTTIME;
size = sizeof(boottime);
if (sysctl(mib, 2, &boottime, &size, NULL, 0) != -1 &&
boottime.tv_sec != 0) {
time(&now);
buf->uptime = now - boottime.tv_sec;
/* XXX: don't know a useful value to put here. */
buf->idletime = 0;
buf->flags = _glibtop_sysdeps_uptime;
}
#else
buf->flags = _glibtop_sysdeps_uptime;
glibtop_cpu cpu;
glibtop_init_p (server, (1L << GLIBTOP_SYSDEPS_UPTIME), 0);
@@ -70,4 +91,5 @@ glibtop_get_uptime_p (glibtop *server, glibtop_uptime *buf)
buf->idletime = (double) cpu.idle / (double) cpu.frequency;
buf->flags = _glibtop_sysdeps_uptime;
#endif
}