diff --git a/sysdeps/freebsd/ChangeLog b/sysdeps/freebsd/ChangeLog index bccc0d27..17c0d85a 100644 --- a/sysdeps/freebsd/ChangeLog +++ b/sysdeps/freebsd/ChangeLog @@ -1,3 +1,21 @@ +2004-03-09 Bastien Nocera + + * 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 * procargs.c: (glibtop_get_proc_args_p): diff --git a/sysdeps/freebsd/Makefile.am b/sysdeps/freebsd/Makefile.am index b959d33b..e00a4526 100644 --- a/sysdeps/freebsd/Makefile.am +++ b/sysdeps/freebsd/Makefile.am @@ -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 \ diff --git a/sysdeps/freebsd/cpu.c b/sysdeps/freebsd/cpu.c index 5fdce7ad..1a0cf141 100644 --- a/sysdeps/freebsd/cpu.c +++ b/sysdeps/freebsd/cpu.c @@ -27,11 +27,16 @@ #include +#ifdef __NetBSD__ +#include +#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); diff --git a/sysdeps/freebsd/glibtop_machine.h b/sysdeps/freebsd/glibtop_machine.h index d7922681..8df2bf1b 100644 --- a/sysdeps/freebsd/glibtop_machine.h +++ b/sysdeps/freebsd/glibtop_machine.h @@ -39,6 +39,14 @@ #include #endif +#ifdef __NetBSD__ +#include + +#ifndef SRUN +#define SRUN SACTIVE +#endif +#endif + G_BEGIN_DECLS typedef struct _glibtop_machine glibtop_machine; diff --git a/sysdeps/freebsd/mem.c b/sysdeps/freebsd/mem.c index cc9ddac3..a892983d 100644 --- a/sysdeps/freebsd/mem.c +++ b/sysdeps/freebsd/mem.c @@ -29,7 +29,9 @@ #include #include +#if defined(__NetBSD__) && (__NetBSD_Version__ < 105020000) #include +#endif #if defined(__NetBSD__) && (__NetBSD_Version__ >= 104000000) #include @@ -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 diff --git a/sysdeps/freebsd/netload.c b/sysdeps/freebsd/netload.c index 4062dfe2..bff71587 100644 --- a/sysdeps/freebsd/netload.c +++ b/sysdeps/freebsd/netload.c @@ -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. */ diff --git a/sysdeps/freebsd/prockernel.c b/sysdeps/freebsd/prockernel.c index 2a00b364..60df1e2c 100644 --- a/sysdeps/freebsd/prockernel.c +++ b/sysdeps/freebsd/prockernel.c @@ -34,12 +34,10 @@ #if (!defined __OpenBSD__) && (!defined __bsdi__) #include #endif -#if !defined(__bsdi__) && !(defined(__FreeBSD__) && defined(__alpha__)) +#if !defined(__bsdi__) && !(defined(__FreeBSD__) && defined(__alpha__)) && \ + !defined(__NetBSD__) #include #endif -#if defined(__FreeBSD__) && !defined(__alpha__) -#include -#endif #include #include @@ -48,6 +46,23 @@ #include #endif +#ifdef __NetBSD__ +#include +#include +#ifdef __arm32__ +#define KERNBASE KERNEL_BASE +#endif +#endif + +#ifdef __NetBSD__ +#include +#include +#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__ */ } diff --git a/sysdeps/freebsd/proclist.c b/sysdeps/freebsd/proclist.c index 692c9bc6..904905db 100644 --- a/sysdeps/freebsd/proclist.c +++ b/sysdeps/freebsd/proclist.c @@ -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; diff --git a/sysdeps/freebsd/procmap.c b/sysdeps/freebsd/procmap.c index a0283975..21867edb 100644 --- a/sysdeps/freebsd/procmap.c +++ b/sysdeps/freebsd/procmap.c @@ -31,9 +31,21 @@ #include #include #include +#if defined(__NetBSD__) && (__NetBSD_Version__ < 105020000) #include #include #include +#elif defined(__NetBSD__) && (__NetBSD_Version__ >= 105020000) +#include +#else +#include +#include +#if (__FreeBSD_version >= 400011) +#include +#else +#include +#endif +#endif #include #include @@ -45,7 +57,9 @@ #include #endif #include +#if !defined(__NetBSD__) || (__NetBSD_Version__ < 105020000) #include +#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 diff --git a/sysdeps/freebsd/procmem.c b/sysdeps/freebsd/procmem.c index f5496f37..66a12c50 100644 --- a/sysdeps/freebsd/procmem.c +++ b/sysdeps/freebsd/procmem.c @@ -31,8 +31,12 @@ #include #include #include +#ifdef __NetBSD__ && (__NetBSD_Version__ >= 105020000) +#include +#else #include #include +#endif #include #include @@ -43,9 +47,14 @@ #include #endif #include +#ifdef __NetBSD__ && (__NetBSD_Version__ >= 105020000) +#include +#else #include +#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__ diff --git a/sysdeps/freebsd/procsignal.c b/sysdeps/freebsd/procsignal.c index 6ee36cab..d8f83304 100644 --- a/sysdeps/freebsd/procsignal.c +++ b/sysdeps/freebsd/procsignal.c @@ -27,6 +27,8 @@ #include +#include + #ifdef __FreeBSD__ #include #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 diff --git a/sysdeps/freebsd/procstate.c b/sysdeps/freebsd/procstate.c index 2357b393..1dcad616 100644 --- a/sysdeps/freebsd/procstate.c +++ b/sysdeps/freebsd/procstate.c @@ -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; diff --git a/sysdeps/freebsd/proctime.c b/sysdeps/freebsd/proctime.c index f096d826..0b137cc3 100644 --- a/sysdeps/freebsd/proctime.c +++ b/sysdeps/freebsd/proctime.c @@ -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 } diff --git a/sysdeps/freebsd/procuid.c b/sysdeps/freebsd/procuid.c index 03c4598a..2cc59284 100644 --- a/sysdeps/freebsd/procuid.c +++ b/sysdeps/freebsd/procuid.c @@ -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) diff --git a/sysdeps/freebsd/uptime.c b/sysdeps/freebsd/uptime.c index 250a72d1..73275d7b 100644 --- a/sysdeps/freebsd/uptime.c +++ b/sysdeps/freebsd/uptime.c @@ -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 }