From 0642c2d610d19097a9bd83f20f5ad53e2a63035f Mon Sep 17 00:00:00 2001 From: Benoit Dejean Date: Tue, 21 Jul 2015 21:25:44 +0200 Subject: Turn glibtop::machine from a value to a pointer, allocated on init. This hides the glibtop_machine implementation. --- glibtop.h | 2 +- include/glibtop/Makefile.am | 2 +- lib/init.c | 7 +++++++ src/daemon/server.c | 3 +++ sysdeps/freebsd/glibtop_suid.h | 4 ++-- sysdeps/freebsd/netload.c | 8 ++++---- sysdeps/freebsd/ppp.c | 4 ++-- sysdeps/freebsd/procargs.c | 4 ++-- sysdeps/freebsd/prockernel.c | 2 +- sysdeps/freebsd/procmap.c | 26 +++++++++++++------------- sysdeps/freebsd/procmem.c | 10 +++++----- sysdeps/freebsd/procsegment.c | 2 +- sysdeps/freebsd/procsignal.c | 2 +- sysdeps/freebsd/procstate.c | 2 +- sysdeps/freebsd/proctime.c | 2 +- sysdeps/freebsd/procuid.c | 2 +- sysdeps/freebsd/suid_open.c | 16 ++++++++-------- sysdeps/freebsd/swap.c | 2 +- 18 files changed, 55 insertions(+), 45 deletions(-) diff --git a/glibtop.h b/glibtop.h index 91c3c135..29ee44a4 100644 --- a/glibtop.h +++ b/glibtop.h @@ -98,7 +98,7 @@ struct _glibtop gid_t gid; gid_t egid; - glibtop_machine machine; /* Machine dependent data */ + glibtop_machine *machine; /* Machine dependent data */ }; extern glibtop *glibtop_global_server; diff --git a/include/glibtop/Makefile.am b/include/glibtop/Makefile.am index 84359d09..95037b88 100644 --- a/include/glibtop/Makefile.am +++ b/include/glibtop/Makefile.am @@ -11,4 +11,4 @@ glibtop_HEADERS = close.h loadavg.h prockernel.h procstate.h \ procwd.h procaffinity.h \ netlist.h procopenfiles.h open.h -noinst_HEADERS = error.h write.h read_data.h read.h init_hooks.h +noinst_HEADERS = error.h write.h read_data.h read.h init_hooks.h machine.h diff --git a/lib/init.c b/lib/init.c index 7fecdc2f..2a521853 100644 --- a/lib/init.c +++ b/lib/init.c @@ -26,6 +26,8 @@ #include #include #include +#include + #ifndef DEFAULT_PORT #define DEFAULT_PORT 42800 @@ -173,6 +175,9 @@ glibtop_init_r (glibtop **server_ptr, unsigned long features, unsigned flags) /* Do the initialization, but only if not already initialized. */ if ((server->flags & _GLIBTOP_INIT_STATE_INIT) == 0) { + + glibtop_machine_new (server); + if (flags & GLIBTOP_FEATURES_EXCEPT) features = ~features & GLIBTOP_SYSDEPS_ALL; @@ -221,6 +226,8 @@ glibtop_init_s (glibtop **server_ptr, unsigned long features, unsigned flags) glibtop *server; const _glibtop_init_func_t *init_fkt; + glibtop_debug("init_s with features=%#0lx and flags=%#0x", features, flags); + if (server_ptr == NULL) return NULL; diff --git a/src/daemon/server.c b/src/daemon/server.c index eafa25a2..60427e89 100644 --- a/src/daemon/server.c +++ b/src/daemon/server.c @@ -26,6 +26,7 @@ #include #include #include +#include #include @@ -75,6 +76,8 @@ main(int argc, char *argv[]) } #endif + glibtop_machine_new (glibtop_global_server); + glibtop_init_p (glibtop_global_server, 0, 0); glibtop_debug ("uid=%d euid=%d gid=%d egid=%d", getuid(), geteuid(), getgid(), getegid()); diff --git a/sysdeps/freebsd/glibtop_suid.h b/sysdeps/freebsd/glibtop_suid.h index 47b0be31..6b9d803a 100644 --- a/sysdeps/freebsd/glibtop_suid.h +++ b/sysdeps/freebsd/glibtop_suid.h @@ -36,13 +36,13 @@ G_BEGIN_DECLS static inline void glibtop_suid_enter (glibtop *server) { glibtop_debug ("uid=%d euid=%d gid=%d egid=%d", getuid(), geteuid(), getgid(), getegid()); - setregid (server->machine.gid, server->machine.egid); + setregid (server->machine->gid, server->machine->egid); glibtop_debug ("uid=%d euid=%d gid=%d egid=%d", getuid(), geteuid(), getgid(), getegid()); }; static inline void glibtop_suid_leave (glibtop *server) { glibtop_debug ("uid=%d euid=%d gid=%d egid=%d", getuid(), geteuid(), getgid(), getegid()); - if (setregid (server->machine.egid, server->machine.gid)) + if (setregid (server->machine->egid, server->machine->gid)) _exit (1); glibtop_debug ("uid=%d euid=%d gid=%d egid=%d", getuid(), geteuid(), getgid(), getegid()); }; diff --git a/sysdeps/freebsd/netload.c b/sysdeps/freebsd/netload.c index a9a609ec..9ffaa6c0 100644 --- a/sysdeps/freebsd/netload.c +++ b/sysdeps/freebsd/netload.c @@ -77,7 +77,7 @@ static struct nlist nlst [] = void _glibtop_init_netload_p (glibtop *server) { - if (kvm_nlist (server->machine.kd, nlst) < 0) { + if (kvm_nlist (server->machine->kd, nlst) < 0) { glibtop_warn_io_r (server, "kvm_nlist"); return; } @@ -104,7 +104,7 @@ glibtop_get_netload_p (glibtop *server, glibtop_netload *buf, if (server->sysdeps.netload == 0) return; - if (kvm_read (server->machine.kd, nlst [0].n_value, + if (kvm_read (server->machine->kd, nlst [0].n_value, &ifnetaddr, sizeof (ifnetaddr)) != sizeof (ifnetaddr)) { glibtop_warn_io_r (server, "kvm_read (ifnet)"); return; @@ -116,7 +116,7 @@ glibtop_get_netload_p (glibtop *server, glibtop_netload *buf, register char *cp; u_long ifaddraddr; - if (kvm_read (server->machine.kd, ifnetaddr, &ifnet, + if (kvm_read (server->machine->kd, ifnetaddr, &ifnet, sizeof (ifnet)) != sizeof (ifnet)) { glibtop_warn_io_r (server, "kvm_read (ifnetaddr)"); @@ -183,7 +183,7 @@ glibtop_get_netload_p (glibtop *server, glibtop_netload *buf, buf->flags = _glibtop_sysdeps_netload; for (ifaddraddr = (u_long) ifnet.if_addrhead.tqh_first; ifaddraddr; ifaddraddr = (u_long) ifaddr.ifa.ifa_link.tqe_next) { - if ((kvm_read (server->machine.kd, ifaddraddr, &ifaddr, + if ((kvm_read (server->machine->kd, ifaddraddr, &ifaddr, sizeof (ifaddr)) != sizeof (ifaddr))) { glibtop_warn_io_r (server, "kvm_read (ifaddraddr)"); diff --git a/sysdeps/freebsd/ppp.c b/sysdeps/freebsd/ppp.c index 47105891..a0c98dd4 100644 --- a/sysdeps/freebsd/ppp.c +++ b/sysdeps/freebsd/ppp.c @@ -77,7 +77,7 @@ _glibtop_init_ppp_p (glibtop *server) #endif #endif /* HAVE_I4B */ - if (kvm_nlist (server->machine.kd, nlst) < 0) { + if (kvm_nlist (server->machine->kd, nlst) < 0) { glibtop_warn_io_r (server, "kvm_nlist"); server->sysdeps.ppp = 0; } @@ -100,7 +100,7 @@ glibtop_get_ppp_p (glibtop *server, glibtop_ppp *buf, unsigned short device) if (server->sysdeps.ppp == 0) return; - if (kvm_read (server->machine.kd, nlst [0].n_value, + if (kvm_read (server->machine->kd, nlst [0].n_value, &data, sizeof (data)) != sizeof (data)) { glibtop_warn_io_r (server, "kvm_read (i4bisppp_softc)"); return; diff --git a/sysdeps/freebsd/procargs.c b/sysdeps/freebsd/procargs.c index 51886202..2186b46e 100644 --- a/sysdeps/freebsd/procargs.c +++ b/sysdeps/freebsd/procargs.c @@ -60,14 +60,14 @@ glibtop_get_proc_args_p (glibtop *server, glibtop_proc_args *buf, glibtop_suid_enter (server); /* Get the process data */ - pinfo = kvm_getprocs (server->machine.kd, KERN_PROC_PID, pid, &count); + pinfo = kvm_getprocs (server->machine->kd, KERN_PROC_PID, pid, &count); if ((pinfo == NULL) || (count < 1)) { glibtop_warn_io_r (server, "kvm_getprocs (%d)", pid); glibtop_suid_leave (server); return NULL; } - args = kvm_getargv (server->machine.kd, pinfo, max_len); + args = kvm_getargv (server->machine->kd, pinfo, max_len); if (args == NULL) { glibtop_warn_io_r (server, "kvm_getargv (%d)", pid); glibtop_suid_leave (server); diff --git a/sysdeps/freebsd/prockernel.c b/sysdeps/freebsd/prockernel.c index fbd65ef0..0d3d3fec 100644 --- a/sysdeps/freebsd/prockernel.c +++ b/sysdeps/freebsd/prockernel.c @@ -80,7 +80,7 @@ glibtop_get_proc_kernel_p (glibtop *server, glibtop_suid_enter (server); /* Get the process information */ - pinfo = kvm_getprocs (server->machine.kd, KERN_PROC_PID, pid, &count); + pinfo = kvm_getprocs (server->machine->kd, KERN_PROC_PID, pid, &count); if ((pinfo == NULL) || (count != 1)) { glibtop_warn_io_r (server, "kvm_getprocs (%d)", pid); glibtop_suid_leave (server); diff --git a/sysdeps/freebsd/procmap.c b/sysdeps/freebsd/procmap.c index 34644471..181f3929 100644 --- a/sysdeps/freebsd/procmap.c +++ b/sysdeps/freebsd/procmap.c @@ -91,9 +91,9 @@ _glibtop_sysdeps_freebsd_dev_inode (glibtop *server, struct vnode *vnode, *inum = 0; *dev = 0; - if (kvm_read (server->machine.kd, (gulong) &vnode->v_tag, + if (kvm_read (server->machine->kd, (gulong) &vnode->v_tag, (char *) &tagptr, sizeof (tagptr)) != sizeof (tagptr) || - kvm_read (server->machine.kd, (gulong) tagptr, + kvm_read (server->machine->kd, (gulong) tagptr, (char *) tagstr, sizeof (tagstr)) != sizeof (tagstr)) { glibtop_warn_io_r (server, "kvm_read (tagptr)"); @@ -111,7 +111,7 @@ _glibtop_sysdeps_freebsd_dev_inode (glibtop *server, struct vnode *vnode, return; } - if (kvm_read (server->machine.kd, (gulong) VTOI(vn), (char *) &inode, + if (kvm_read (server->machine->kd, (gulong) VTOI(vn), (char *) &inode, sizeof (inode)) != sizeof (inode)) { glibtop_warn_io_r (server, "kvm_read (inode)"); @@ -151,7 +151,7 @@ _glibtop_sysdeps_freebsd_dev_inode (glibtop *server, struct vnode *vnode, struct my_zfsvfs zvfs; - if (kvm_read(server->machine.kd, + if (kvm_read(server->machine->kd, (unsigned long)(znode->z_zfsvfs), &zvfs, sizeof zvfs) != sizeof zvfs) { glibtop_warn_io_r(server, "kvm_read (z_zfsvfs)"); @@ -167,12 +167,12 @@ _glibtop_sysdeps_freebsd_dev_inode (glibtop *server, struct vnode *vnode, #if (__FreeBSD_version >= 800039) || (__FreeBSD_kernel_version >= 800039) - if (kvm_read (server->machine.kd, (gulong) cdev2priv(inode.i_dev), (char *) &priv, + if (kvm_read (server->machine->kd, (gulong) cdev2priv(inode.i_dev), (char *) &priv, sizeof (priv)) #else - if (kvm_read (server->machine.kd, (gulong) inode.i_dev, (char *) &si, + if (kvm_read (server->machine->kd, (gulong) inode.i_dev, (char *) &si, sizeof (si)) != sizeof (si) || - kvm_read (server->machine.kd, (gulong) si.si_priv, (char *) &priv, + kvm_read (server->machine->kd, (gulong) si.si_priv, (char *) &priv, sizeof (priv)) #endif != sizeof (priv)) @@ -219,7 +219,7 @@ glibtop_get_proc_map_p (glibtop *server, glibtop_proc_map *buf, glibtop_suid_enter (server); /* Get the process data */ - pinfo = kvm_getprocs (server->machine.kd, KERN_PROC_PID, pid, &count); + pinfo = kvm_getprocs (server->machine->kd, KERN_PROC_PID, pid, &count); if ((pinfo == NULL) || (count < 1)) { glibtop_warn_io_r (server, "kvm_getprocs (%d)", pid); glibtop_suid_leave (server); @@ -228,7 +228,7 @@ glibtop_get_proc_map_p (glibtop *server, glibtop_proc_map *buf, /* Now we get the memory maps. */ - if (kvm_read (server->machine.kd, + if (kvm_read (server->machine->kd, (gulong) pinfo [0].ki_vmspace, (char *) &vmspace, sizeof (vmspace)) != sizeof (vmspace)) { glibtop_warn_io_r (server, "kvm_read (vmspace)"); @@ -238,7 +238,7 @@ glibtop_get_proc_map_p (glibtop *server, glibtop_proc_map *buf, first = vmspace.vm_map.header.next; - if (kvm_read (server->machine.kd, + if (kvm_read (server->machine->kd, (gulong) vmspace.vm_map.header.next, (char *) &entry, sizeof (entry)) != sizeof (entry)) { glibtop_warn_io_r (server, "kvm_read (entry)"); @@ -261,7 +261,7 @@ glibtop_get_proc_map_p (glibtop *server, glibtop_proc_map *buf, guint len; if (update) { - if (kvm_read (server->machine.kd, + if (kvm_read (server->machine->kd, (gulong) entry.next, (char *) &entry, sizeof (entry)) != sizeof (entry)) { glibtop_warn_io_r (server, "kvm_read (entry)"); @@ -279,7 +279,7 @@ glibtop_get_proc_map_p (glibtop *server, glibtop_proc_map *buf, /* We're only interested in `vm_object's */ - if (kvm_read (server->machine.kd, + if (kvm_read (server->machine->kd, (gulong) entry.object.vm_object, (char *) &object, sizeof (object)) != sizeof (object)) { glibtop_warn_io_r (server, "kvm_read (object)"); @@ -294,7 +294,7 @@ glibtop_get_proc_map_p (glibtop *server, glibtop_proc_map *buf, if (!object.handle) continue; - if (kvm_read (server->machine.kd, + if (kvm_read (server->machine->kd, (gulong) object.handle, (char *) &vnode, sizeof (vnode)) != sizeof (vnode)) { glibtop_warn_io_r (server, "kvm_read (vnode)"); diff --git a/sysdeps/freebsd/procmem.c b/sysdeps/freebsd/procmem.c index b398c412..c7ffbeed 100644 --- a/sysdeps/freebsd/procmem.c +++ b/sysdeps/freebsd/procmem.c @@ -84,7 +84,7 @@ glibtop_get_proc_mem_p (glibtop *server, glibtop_proc_mem *buf, if (pid == 0) return; /* Get the process data */ - pinfo = kvm_getprocs (server->machine.kd, KERN_PROC_PID, pid, &count); + pinfo = kvm_getprocs (server->machine->kd, KERN_PROC_PID, pid, &count); if ((pinfo == NULL) || (count < 1)) { glibtop_warn_io_r (server, "kvm_getprocs (%d)", pid); return; @@ -108,7 +108,7 @@ glibtop_get_proc_mem_p (glibtop *server, glibtop_proc_mem *buf, /* Now we get the shared memory. */ - if (kvm_read (server->machine.kd, + if (kvm_read (server->machine->kd, (unsigned long) pinfo [0].PROC_VMSPACE, (char *) &vmspace, sizeof (vmspace)) != sizeof (vmspace)) { glibtop_warn_io_r (server, "kvm_read (vmspace)"); @@ -117,7 +117,7 @@ glibtop_get_proc_mem_p (glibtop *server, glibtop_proc_mem *buf, first = vmspace.vm_map.header.next; - if (kvm_read (server->machine.kd, + if (kvm_read (server->machine->kd, (unsigned long) vmspace.vm_map.header.next, (char *) &entry, sizeof (entry)) != sizeof (entry)) { glibtop_warn_io_r (server, "kvm_read (entry)"); @@ -131,7 +131,7 @@ glibtop_get_proc_mem_p (glibtop *server, glibtop_proc_mem *buf, * to OBJT_DEFAULT so if seems this really works. */ while (entry.next != first) { - if (kvm_read (server->machine.kd, + if (kvm_read (server->machine->kd, (unsigned long) entry.next, (char *) &entry, sizeof (entry)) != sizeof (entry)) { glibtop_warn_io_r (server, "kvm_read (entry)"); @@ -146,7 +146,7 @@ glibtop_get_proc_mem_p (glibtop *server, glibtop_proc_mem *buf, /* We're only interested in `vm_object's */ - if (kvm_read (server->machine.kd, + if (kvm_read (server->machine->kd, (unsigned long) entry.object.vm_object, (char *) &object, sizeof (object)) != sizeof (object)) { glibtop_warn_io_r (server, "kvm_read (object)"); diff --git a/sysdeps/freebsd/procsegment.c b/sysdeps/freebsd/procsegment.c index 4a16c5a8..e4455984 100644 --- a/sysdeps/freebsd/procsegment.c +++ b/sysdeps/freebsd/procsegment.c @@ -61,7 +61,7 @@ glibtop_get_proc_segment_p (glibtop *server, if (pid == 0) return; /* Get the process info from the kernel */ - pinfo = kvm_getprocs (server->machine.kd, KERN_PROC_PID, pid, &count); + pinfo = kvm_getprocs (server->machine->kd, KERN_PROC_PID, pid, &count); if ((pinfo == NULL) || (count != 1)) { glibtop_warn_io_r (server, "kvm_getprocs (%d)", pid); return; diff --git a/sysdeps/freebsd/procsignal.c b/sysdeps/freebsd/procsignal.c index f8eaf4a6..c5dbc03d 100644 --- a/sysdeps/freebsd/procsignal.c +++ b/sysdeps/freebsd/procsignal.c @@ -58,7 +58,7 @@ glibtop_get_proc_signal_p (glibtop *server, if (pid == 0) return; /* Get the process information */ - pinfo = kvm_getprocs (server->machine.kd, KERN_PROC_PID, pid, &count); + pinfo = kvm_getprocs (server->machine->kd, KERN_PROC_PID, pid, &count); if ((pinfo == NULL) || (count != 1)) { glibtop_warn_io_r (server, "kvm_getprocs (%d)", pid); return; diff --git a/sysdeps/freebsd/procstate.c b/sysdeps/freebsd/procstate.c index 993bb780..a7fd2152 100644 --- a/sysdeps/freebsd/procstate.c +++ b/sysdeps/freebsd/procstate.c @@ -53,7 +53,7 @@ glibtop_get_proc_state_p (glibtop *server, memset (buf, 0, sizeof (glibtop_proc_state)); /* Get the process information */ - pinfo = kvm_getprocs (server->machine.kd, KERN_PROC_PID, pid, &count); + pinfo = kvm_getprocs (server->machine->kd, KERN_PROC_PID, pid, &count); if ((pinfo == NULL) || (count != 1)) { glibtop_warn_io_r (server, "kvm_getprocs (%d)", pid); return; diff --git a/sysdeps/freebsd/proctime.c b/sysdeps/freebsd/proctime.c index 836d2897..f01b9057 100644 --- a/sysdeps/freebsd/proctime.c +++ b/sysdeps/freebsd/proctime.c @@ -74,7 +74,7 @@ glibtop_get_proc_time_p (glibtop *server, glibtop_proc_time *buf, glibtop_suid_enter (server); /* Get the process information */ - pinfo = kvm_getprocs (server->machine.kd, KERN_PROC_PID, pid, &count); + pinfo = kvm_getprocs (server->machine->kd, KERN_PROC_PID, pid, &count); if ((pinfo == NULL) || (count != 1)) { glibtop_warn_io_r (server, "kvm_getprocs (%d)", pid); glibtop_suid_leave (server); diff --git a/sysdeps/freebsd/procuid.c b/sysdeps/freebsd/procuid.c index 6594690f..b3fecf74 100644 --- a/sysdeps/freebsd/procuid.c +++ b/sysdeps/freebsd/procuid.c @@ -56,7 +56,7 @@ glibtop_get_proc_uid_p (glibtop *server, glibtop_proc_uid *buf, if (pid == 0) return; /* Get the process information */ - pinfo = kvm_getprocs (server->machine.kd, KERN_PROC_PID, pid, &count); + pinfo = kvm_getprocs (server->machine->kd, KERN_PROC_PID, pid, &count); if ((pinfo == NULL) || (count != 1)) { glibtop_warn_io_r (server, "kvm_getprocs (%d)", pid); return; diff --git a/sysdeps/freebsd/suid_open.c b/sysdeps/freebsd/suid_open.c index 55456078..c1e19879 100644 --- a/sysdeps/freebsd/suid_open.c +++ b/sysdeps/freebsd/suid_open.c @@ -59,24 +59,24 @@ glibtop_open_p (glibtop *server, const char *program_name, glibtop_debug ("glibtop_open_p ()"); /* !!! WE ARE ROOT HERE - CHANGE WITH CAUTION !!! */ - server->machine.uid = getuid (); - server->machine.euid = geteuid (); - server->machine.gid = getgid (); - server->machine.egid = getegid (); + server->machine->uid = getuid (); + server->machine->euid = geteuid (); + server->machine->gid = getgid (); + server->machine->egid = getegid (); /* Setup machine-specific data */ - server->machine.kd = kvm_openfiles (NULL, NULL, NULL, O_RDONLY, errbuf); + server->machine->kd = kvm_openfiles (NULL, NULL, NULL, O_RDONLY, errbuf); - if (server->machine.kd == NULL) + if (server->machine->kd == NULL) glibtop_error_io_r (server, "kvm_open"); /* Drop priviledges. */ glibtop_debug ("uid=%d euid=%d gid=%d egid=%d", getuid(), geteuid(), getgid(), getegid()); - if (setreuid (server->machine.euid, server->machine.uid)) + if (setreuid (server->machine->euid, server->machine->uid)) _exit (1); - if (setregid (server->machine.egid, server->machine.gid)) + if (setregid (server->machine->egid, server->machine->gid)) _exit (1); glibtop_debug ("uid=%d euid=%d gid=%d egid=%d", getuid(), geteuid(), getgid(), getegid()); diff --git a/sysdeps/freebsd/swap.c b/sysdeps/freebsd/swap.c index 44e833ef..1b4cbadb 100644 --- a/sysdeps/freebsd/swap.c +++ b/sysdeps/freebsd/swap.c @@ -59,7 +59,7 @@ glibtop_get_swap_p (glibtop *server, glibtop_swap *buf) memset (buf, 0, sizeof (glibtop_swap)); memset (kvmsw, 0, sizeof (kvmsw)); - nswdev = kvm_getswapinfo (server->machine.kd, kvmsw, 16, 0); + nswdev = kvm_getswapinfo (server->machine->kd, kvmsw, 16, 0); if (nswdev < 1) return; buf->flags = _glibtop_sysdeps_swap; -- cgit v1.2.1