summaryrefslogtreecommitdiff
path: root/sysutils/xfce4-taskmanager/patches/patch-src_task-manager-bsd.c
diff options
context:
space:
mode:
Diffstat (limited to 'sysutils/xfce4-taskmanager/patches/patch-src_task-manager-bsd.c')
-rw-r--r--sysutils/xfce4-taskmanager/patches/patch-src_task-manager-bsd.c441
1 files changed, 441 insertions, 0 deletions
diff --git a/sysutils/xfce4-taskmanager/patches/patch-src_task-manager-bsd.c b/sysutils/xfce4-taskmanager/patches/patch-src_task-manager-bsd.c
new file mode 100644
index 00000000000..29b30eaa4fe
--- /dev/null
+++ b/sysutils/xfce4-taskmanager/patches/patch-src_task-manager-bsd.c
@@ -0,0 +1,441 @@
+$NetBSD: patch-src_task-manager-bsd.c,v 1.1 2015/04/21 08:56:41 jperkin Exp $
+
+Attempt to bring netbsd, DragonFly while keeping OpenBSD support.
+--- src/task-manager-bsd.c.orig 2014-12-23 20:40:14.000000000 +0000
++++ src/task-manager-bsd.c
+@@ -25,8 +25,18 @@
+ #include <sys/param.h>
+ #include <sys/sched.h>
+ #include <sys/sysctl.h>
++
++#ifdef __DragonFly__
++#include <sys/kinfo.h>
++#include <sys/resource.h>
++#include <vm/vm_param.h>
++#else
+ /* for swapctl() */
+ #include <sys/swap.h>
++#include <uvm/uvm_extern.h>
++#endif
++
++#include <kvm.h>
+ /* for strlcpy() */
+ #include <string.h>
+ /* for getpagesize() */
+@@ -46,108 +56,107 @@ char *state_abbrev[] = {
+
+ gboolean get_task_list (GArray *task_list)
+ {
+- int mib[6];
+- size_t size;
+-#ifdef __OpenBSD__
+- struct kinfo_proc *kp;
+-#else
+- struct kinfo_proc2 *kp;
+-#endif
+- Task t;
+- struct passwd *passwdp;
+- char **args;
+- gchar* buf;
+- int nproc, i;
++ Task t;
++#ifdef __NetBSD__
++ struct kinfo_proc2 *kp = NULL;
++#else
++ struct kinfo_proc *kp = NULL;
++#endif
++
++ struct passwd *passwdp;
++ char **args = NULL;
++ char *buf = NULL;
++ unsigned int i = 0;
++ int nproc = 0;
++
++
++ /* get process number, stolen from ps */
++ /* example with kvm functions */
++ char errbuf[_POSIX2_LINE_MAX];
++ kvm_t *kdp = kvm_open(NULL, NULL, NULL, KVM_NO_FILES, errbuf);
++ if (kdp == NULL)
++ errx(1, "%s", errbuf);
++
++ /* fill kinfo_proc2 structure */
++ /* XXX does it return sleeping processes ? */
++#ifdef __OpenBSD__
++ if (!(kp = kvm_getprocs(kdp, KERN_PROC_ALL, 0,
++ sizeof(struct kinfo_proc), &nproc)))
++#elif __DragonFly__
++ if (!(kp = kvm_getprocs(kdp, KERN_PROC_ALL, 0, &nproc)))
++#else /* probably NetBSD or MirBSD */
++ if (!(kp = kvm_getproc2(kdp, KERN_PROC_ALL, 0,
++ sizeof(struct kinfo_proc2), &nproc)))
++#endif
++ err(1, "%s", kvm_geterr(kdp));
++
++ for (i = 0; i < nproc; i++) {
++ if (kp[i].p_pid < 1)
++ continue; /* not valid */
+
+- mib[0] = CTL_KERN;
+-#ifdef __OpenBSD__
+- mib[1] = KERN_PROC;
+-#else
+- mib[1] = KERN_PROC2;
+-#endif
+- mib[2] = KERN_PROC_ALL;
+- mib[3] = 0;
+-#ifdef __OpenBSD__
+- mib[4] = sizeof(struct kinfo_proc);
+-#else
+- mib[4] = sizeof(struct kinfo_proc2);
+-#endif
+- mib[5] = 0;
+- if (sysctl(mib, 6, NULL, &size, NULL, 0) < 0)
+-#ifdef __OpenBSD__
+- errx(1, "could not get kern.proc size");
+-#else
+- errx(1, "could not get kern.proc2 size");
+-#endif
+- size = 5 * size / 4; /* extra slop */
+- if ((kp = malloc(size)) == NULL)
+- errx(1,"failed to allocate memory for proc structures");
+-#ifdef __OpenBSD__
+- mib[5] = (int)(size / sizeof(struct kinfo_proc));
+-#else
+- mib[5] = (int)(size / sizeof(struct kinfo_proc2));
+-#endif
+- if (sysctl(mib, 6, kp, &size, NULL, 0) < 0)
+-#ifdef __OpenBSD__
+- errx(1, "could not read kern.proc");
+- nproc = (int)(size / sizeof(struct kinfo_proc));
+-#else
+- errx(1, "could not read kern.proc2");
+- nproc = (int)(size / sizeof(struct kinfo_proc2));
+-#endif
+- for (i=0 ; i < nproc ; i++)
+- {
+-#ifdef __OpenBSD__
+- struct kinfo_proc p = kp[i];
+-#else
++ /* get per-process information in our entry */
++#ifdef __NetBSD__
+ struct kinfo_proc2 p = kp[i];
++#else
++ struct kinfo_proc p = kp[i];
+ #endif
+- t.pid = p.p_pid;
+- t.ppid = p.p_ppid;
+- t.uid = p.p_uid;
+- t.prio = p.p_priority - PZERO;
+- t.vsz = p.p_vm_dsize + p.p_vm_ssize + p.p_vm_tsize;
+- t.vsz *= getpagesize();
+- t.rss = p.p_vm_rssize * getpagesize();
+- g_snprintf(t.state, sizeof t.state, "%s", state_abbrev[p.p_stat]);
+- g_strlcpy(t.name, p.p_comm, strlen(p.p_comm) + 1);
+- /* shamelessly stolen from top/machine.c */
+- if (!P_ZOMBIE(&p)) {
+- size = 128;
+- if ((args = malloc(size)) == NULL)
+- errx(1,"failed to allocate memory for argv structures at %zu", size);
+- for (;; size *= 2) {
+- if ((args = realloc(args, size)) == NULL)
+- errx(1,"failed to allocate memory (size=%zu) for argv structures of pid %d", size, t.pid);
+- mib[0] = CTL_KERN;
+- mib[1] = KERN_PROC_ARGS;
+- mib[2] = t.pid;
+- mib[3] = KERN_PROC_ARGV;
+- if (sysctl(mib, 4, args, &size, NULL, 0) == 0)
+- break;
+- if (errno != ENOMEM) { /* ESRCH: process disappeared */
+- /* printf ("process with pid %d disappeared, errno=%d\n", t.pid, errno); */
+- args[0] ='\0';
+- args[1] = NULL;
+- break;
+- }
+- }
+- buf = g_strjoinv(" ", args);
+- g_assert(g_utf8_validate(buf, -1, NULL));
+- g_strlcpy(t.cmdline, buf, sizeof t.cmdline);
+- g_free(buf);
+- free(args);
+- }
+-
+- t.cpu_user = (100.0 * ((double) p.p_pctcpu / FSCALE));
+- t.cpu_system = 0; /* TODO ? */
+- /* get username from uid */
+- passwdp = getpwuid(t.uid);
+- if(passwdp != NULL && passwdp->pw_name != NULL)
+- g_strlcpy(t.uid_name, passwdp->pw_name, sizeof t.uid_name);
+- g_array_append_val(task_list, t);
+- }
+- free(kp);
++
++#ifdef __DragonFly__
++ t.pid = p.kp_pid;
++ t.ppid = p.kp_ppid;
++ t.uid = p.kp_uid;
++ t.prio = p.kp_nice;
++ t.vsz = p.kp_vm_dsize + p.kp_vm_ssize + p.kp_vm_tsize;
++ t.vsz *= getpagesize();
++ t.rss = p.kp_vm_rssize * getpagesize();
++ g_snprintf(t.state, sizeof(t.state), "%s",
++ state_abbrev[p.kp_stat]);
++ g_strlcpy(t.name, p.kp_comm, strlen(p.kp_comm) + 1);
++#else
++ t.pid = p.p_pid;
++ t.ppid = p.p_ppid;
++ t.uid = p.p_uid;
++ t.prio = p.p_priority - PZERO;
++ t.vsz = p.p_vm_dsize + p.p_vm_ssize + p.p_vm_tsize;
++ t.vsz *= getpagesize();
++ t.rss = p.p_vm_rssize * getpagesize();
++ g_snprintf(t.state, sizeof(t.state), "%s",
++ state_abbrev[p.p_stat]);
++ g_strlcpy(t.name, p.p_comm, strlen(p.p_comm) + 1);
++#endif
++#ifdef __DragonFly__
++ if (!(p.kp_stat == SDEAD)) { /* same as OpenBSD P_ZOMBIE */
++#else
++ if (!(p.p_stat == SDEAD)) {
++#endif
++ /* get process args */
++#ifdef __NetBSD__
++ args = kvm_getargv2(kdp, &kp[i], BUFSIZ);
++#else
++ args = kvm_getargv(kdp, &kp[i], BUFSIZ);
++#endif
++ if (args != NULL) {
++ buf = g_strjoinv(" ", args);
++ g_strlcpy(t.cmdline, buf,
++ sizeof(t.cmdline));
++ }
++#ifdef __DragonFly__
++ t.cpu_user = 0; /* TODO */
++#else
++ t.cpu_user = (100.0 *
++ ((double) p.p_pctcpu / FSCALE));
++#endif
++ t.cpu_system = 0; /* XXX TODO */
++ passwdp = getpwuid(t.uid);
++ if (passwdp != NULL && passwdp->pw_name != NULL)
++ g_strlcpy(t.uid_name, passwdp->pw_name,
++ sizeof(t.uid_name));
++ g_array_append_val(task_list, t);
++ }
++ }
++ g_free(args);
++ g_free(buf);
++ g_free(kp);
+
+ return TRUE;
+ }
+@@ -156,26 +165,26 @@ gboolean
+ pid_is_sleeping (guint pid)
+ {
+ int mib[6];
+-#ifdef __OpenBSD__
+- struct kinfo_proc kp;
+- size_t size = sizeof(struct kinfo_proc);
+-#else
++#ifdef __NetBSD__
+ struct kinfo_proc2 kp;
+ size_t size = sizeof(struct kinfo_proc2);
++#else
++ struct kinfo_proc kp;
++ size_t size = sizeof(struct kinfo_proc);
+ #endif
+
+ mib[0] = CTL_KERN;
+-#ifdef __OpenBSD__
+- mib[1] = KERN_PROC;
+-#else
++#ifdef __NetBSD__
+ mib[1] = KERN_PROC2;
++#else
++ mib[1] = KERN_PROC;
+ #endif
+ mib[2] = KERN_PROC_PID;
+ mib[3] = pid;
+-#ifdef __OpenBSD__
+- mib[4] = sizeof(struct kinfo_proc);
+-#else
++#ifdef __NetBSD__
+ mib[4] = sizeof(struct kinfo_proc2);
++#else
++ mib[4] = sizeof(struct kinfo_proc);
+ #endif
+ mib[5] = 1;
+ if (sysctl(mib, 6, &kp, &size, NULL, 0) < 0)
+@@ -184,7 +193,11 @@ pid_is_sleeping (guint pid)
+ #else
+ errx(1, "could not read kern.proc2 for pid %d", pid);
+ #endif
++#ifdef __DragonFly__
++ return (kp.kp_stat == SSTOP ? TRUE : FALSE);
++#else
+ return (kp.p_stat == SSTOP ? TRUE : FALSE);
++#endif
+ }
+
+ gboolean get_cpu_usage (gushort *cpu_count, gfloat *cpu_user, gfloat *cpu_system)
+@@ -192,12 +205,31 @@ gboolean get_cpu_usage (gushort *cpu_cou
+ static gulong cur_user = 0, cur_system = 0, cur_total = 0;
+ static gulong old_user = 0, old_system = 0, old_total = 0;
+
+- int mib[] = {CTL_KERN, KERN_CPTIME};
+- glong cp_time[CPUSTATES];
+- gsize size = sizeof( cp_time );
++#if defined(__DragonFly__)
++ int mib[2];
++ struct kinfo_cputime percpu;
++ size_t size = sizeof(percpu);
++ uint64_t cp_time[CPUSTATES];
++
++ if (sysctlbyname("kern.cputime", &percpu, &size, NULL, 0) < 0)
++ errx(1, "failed to sysctl kern.cputime");
++
++ cp_time[CP_USER] = percpu.cp_user;
++ cp_time[CP_NICE] = percpu.cp_nice;
++ cp_time[CP_SYS] = percpu.cp_sys;
++ cp_time[CP_INTR] = percpu.cp_intr;
++ cp_time[CP_IDLE] = percpu.cp_idle;
++#else
++#ifdef __NetBSD__
++ int mib[] = {CTL_KERN, KERN_CP_TIME};
++#else
++ int mib[] = {CTL_KERN, KERN_CPTIME};
++#endif
++ glong cp_time[CPUSTATES];
++ gsize size = sizeof( cp_time );
+ if (sysctl(mib, 2, &cp_time, &size, NULL, 0) < 0)
+ errx(1,"failed to get kern.cptime");
+-
++#endif
+ old_user = cur_user;
+ old_system = cur_system;
+ old_total = cur_total;
+@@ -217,65 +249,72 @@ gboolean get_cpu_usage (gushort *cpu_cou
+ errx(1,"failed to get cpu count");
+ return TRUE;
+ }
+-
+ /* vmtotal values in #pg */
+ #define pagetok(nb) ((nb) * (getpagesize()))
+
+ gboolean get_memory_usage (guint64 *memory_total, guint64 *memory_free, guint64 *memory_cache, guint64 *memory_buffers, guint64 *swap_total, guint64 *swap_free)
+ {
+ #ifdef __OpenBSD__
+- int mib[] = {CTL_VM, VM_UVMEXP};
+- struct uvmexp uvmexp;
++ int mib[] = {CTL_VM, VM_UVMEXP};
++ struct uvmexp uvmexp;
+ #else
+- int mib[] = {CTL_VM, VM_METER};
+- struct vmtotal vmtotal;
++ int mib[] = {CTL_VM, VM_METER};
++ struct vmtotal vmtotal;
+ #endif
+- struct swapent *swdev;
+- int nswap, i;
+- size_t size;
+-#ifdef __OpenBSD__
+- size = sizeof(uvmexp);
+- if (sysctl(mib, 2, &uvmexp, &size, NULL, 0) < 0)
+- errx(1,"failed to get vm.uvmexp");
+- /* cheat : rm = tot used, add free to get total */
+- *memory_free = pagetok((guint64)uvmexp.free);
+- *memory_total = pagetok((guint64)uvmexp.npages);
+- *memory_cache = 0;
+- *memory_buffers = 0; /*pagetok(uvmexp.npages - uvmexp.free - uvmexp.active);*/
+-#else
+- size = sizeof(vmtotal);
+- if (sysctl(mib, 2, &vmtotal, &size, NULL, 0) < 0)
+- errx(1,"failed to get vm.meter");
+- /* cheat : rm = tot used, add free to get total */
+- *memory_total = pagetok(vmtotal.t_rm + vmtotal.t_free);
+- *memory_free = pagetok(vmtotal.t_free);
+- *memory_cache = 0;
+- *memory_buffers = pagetok(vmtotal.t_rm - vmtotal.t_arm);
+-#endif
+-
+- /* get swap stats */
+- if ((nswap = swapctl(SWAP_NSWAP, 0, 0)) == 0)
+- errx(1,"failed to get swap device count");
+-
+- if ((swdev = calloc(nswap, sizeof(*swdev))) == NULL)
+- errx(1,"failed to allocate memory for swdev structures");
+-
+- if (swapctl(SWAP_STATS, swdev, nswap) == -1) {
+- free(swdev);
+- errx(1,"failed to get swap stats");
+- }
+-
+- /* Total things up */
+- *swap_total = *swap_free = 0;
+- for (i = 0; i < nswap; i++) {
+- if (swdev[i].se_flags & SWF_ENABLE) {
+- *swap_free += (swdev[i].se_nblks - swdev[i].se_inuse);
+- *swap_total += swdev[i].se_nblks;
+- }
+- }
+- *swap_total *= DEV_BSIZE;
+- *swap_free *= DEV_BSIZE;
+- free(swdev);
+- return TRUE;
++ struct swapent *swdev;
++ int nswap, i;
++ size_t size;
++#ifdef __OpenBSD__
++ size = sizeof(uvmexp);
++ if (sysctl(mib, 2, &uvmexp, &size, NULL, 0) < 0)
++ errx(1,"failed to get vm.uvmexp");
++ /* cheat : rm = tot used, add free to get total */
++ *memory_free = pagetok((guint64)uvmexp.free);
++ *memory_total = pagetok((guint64)uvmexp.npages);
++ *memory_cache = 0;
++ *memory_buffers = 0; /*pagetok(uvmexp.npages - uvmexp.free - uvmexp.active);*/
++#else
++ size = sizeof(vmtotal);
++ if (sysctl(mib, 2, &vmtotal, &size, NULL, 0) < 0)
++ errx(1,"failed to get vm.meter");
++
++ mib[0] = CTL_HW;
++ mib[1] = HW_PHYSMEM64;
++ uint64_t physmem;
++ size_t physmemlen = sizeof(physmem);
++
++ if (sysctl(mib, 2, &physmem, &physmemlen, NULL, 0) < 0)
++ errx(1, "failed to get physmem");
++
++ *memory_total = (guint64)physmem;
++ *memory_free = pagetok((guint64)vmtotal.t_free);
++ *memory_cache = 0;
++ *memory_buffers = pagetok(vmtotal.t_rm - vmtotal.t_arm);
++#endif
++
++ /* get swap stats */
++ if ((nswap = swapctl(SWAP_NSWAP, 0, 0)) == 0)
++ errx(1,"failed to get swap device count");
++
++ if ((swdev = calloc(nswap, sizeof(*swdev))) == NULL)
++ errx(1,"failed to allocate memory for swdev structures");
++
++ if (swapctl(SWAP_STATS, swdev, nswap) == -1) {
++ free(swdev);
++ errx(1,"failed to get swap stats");
++ }
++
++ /* Total things up */
++ *swap_total = *swap_free = 0;
++ for (i = 0; i < nswap; i++) {
++ if (swdev[i].se_flags & SWF_ENABLE) {
++ *swap_free += (swdev[i].se_nblks - swdev[i].se_inuse);
++ *swap_total += swdev[i].se_nblks;
++ }
++ }
++ *swap_total *= DEV_BSIZE;
++ *swap_free *= DEV_BSIZE;
++ free(swdev);
++ return TRUE;
+ }
+