Skip to content

Commit

Permalink
Use sysctl for *BSD
Browse files Browse the repository at this point in the history
  • Loading branch information
ricardobranco777 committed Feb 9, 2024
1 parent 37ad675 commit 281fed4
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 87 deletions.
9 changes: 5 additions & 4 deletions bsd/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,11 @@ OPSYS:sh = uname
PROG= restartable
WARNS= 3
CFLAGS+= -O2
.if ${OPSYS} == "FreeBSD"
LDFLAGS= -lprocstat
.elif ${OPSYS} == "NetBSD"
LDFLAGS= -lkvm -lutil
LDFLAGS= -lutil
SRCS= restartable.c

.if ${OPSYS} == "NetBSD"
SRCS+= kinfo_getallproc.c
.endif

MK_DEBUG_FILES= no
Expand Down
103 changes: 20 additions & 83 deletions bsd/restartable.c
Original file line number Diff line number Diff line change
Expand Up @@ -26,18 +26,19 @@
* SUCH DAMAGE.
*/

#ifdef __NetBSD__
/* struct kinfo_proc */
#define _KMEMUSER
#endif

#include <sys/types.h>
#include <sys/param.h>
#if defined(__FreeBSD__)
#include <sys/queue.h>
#include <sys/socket.h>
#include <sys/sysctl.h>
#include <sys/user.h>
#include <libprocstat.h>
#include <libutil.h>
#elif defined(__NetBSD__)
#include <sys/param.h>
#include <sys/sysctl.h>
#include <util.h>
#include <kvm.h>
#endif

#include <stdio.h>
Expand All @@ -48,23 +49,19 @@
#include <limits.h>
#include <vis.h>


#ifdef __FreeBSD__
#define kvm_t struct procstat
#endif

#ifdef __NetBSD__
#if defined(__NetBSD__)
#define kinfo_proc kinfo_proc2
#define kvm_getargv kvm_getargv2
#define ki_comm p_comm
#define ki_login p_login
#define ki_pid p_pid
#define ki_ppid p_ppid
#define ki_ruid p_ruid
struct kinfo_proc * kinfo_getallproc(int *);
#endif

static int verbose = 0;

#if 0
/* Avoid ANSI terminal injection from processes that overwrite their argv */
static char *
safe_arg(char *arg) {
Expand All @@ -74,40 +71,29 @@ safe_arg(char *arg) {
vis = malloc(PATH_MAX * 4 + 1);
if (vis == NULL)
err(1, "malloc");
(void) strnvis(vis, PATH_MAX * 4 + 1, arg, VIS_TAB | VIS_NL | VIS_CSTYLE);
(void) strvis(vis, arg, VIS_TAB | VIS_NL | VIS_CSTYLE);

return vis;
}

static void
print_argv(kvm_t *kd, struct kinfo_proc *kp) {
#if defined(__FreeBSD__)
char **argv = procstat_getargv(kd, kp, 0);
#elif defined(__NetBSD__)
print_argv(kvm_t *kd, const struct kinfo_proc *kp) {
char **argv = kvm_getargv(kd, kp, 0);
#endif

if (argv == NULL) {
#if defined(__FreeBSD__)
warn("procstat_getargv(): %d", kp->ki_pid);
#elif defined(__NetBSD__)
warnx("kvm_getargv(): %d: %s", kp->ki_pid, kvm_geterr(kd));
#endif
warn("kvm_getargv(): %d: %s", kp->ki_pid, kvm_geterr(kd));
return;
}
printf("\t");
do {
printf(" %s", safe_arg(*argv));
} while (*++argv);
printf("\n");

#ifdef __FreeBSD__
procstat_freeargv(kd);
#endif
}
#endif

static void
print_proc(kvm_t *kd, struct kinfo_proc *kp) {
print_proc(const struct kinfo_proc *kp) {
#if defined(__FreeBSD__)
int i, count;
#elif defined(__NetBSD__)
Expand All @@ -118,85 +104,36 @@ print_proc(kvm_t *kd, struct kinfo_proc *kp) {
if (kp->ki_pid == 0)
return;

#if defined(__FreeBSD__)
struct kinfo_vmentry *vmmap = procstat_getvmmap(kd, kp, &count);
#elif defined(__NetBSD__)
struct kinfo_vmentry *vmmap = kinfo_getvmmap(kp->ki_pid, &count);
if (vmmap == NULL)
err(1, "kinfo_getvmmap(): %d", kp->ki_pid);
#endif

for (i = 0; i < count; i++)
if (vmmap[i].kve_type == KVME_TYPE_VNODE && vmmap[i].kve_protection & KVME_PROT_EXEC && vmmap[i].kve_path[0] == '\0') {
printf("%d\t%d\t%d\t%s\t%s\n", kp->ki_pid, kp->ki_ppid, kp->ki_ruid, kp->ki_login, kp->ki_comm);
#if 0
if (verbose)
print_argv(kd, kp);
#endif
break;
}

#if defined(__FreeBSD__)
procstat_freevmmap(kd, vmmap);
#elif defined(__NetBSD__)
free(vmmap);
#endif
}

#ifdef __NetBSD__
/*
* Sort processes by pid
*/
static int
kinfo_proc_compare(const void *a, const void *b)
{
return ((const struct kinfo_proc2 *)a)->p_pid - ((const struct kinfo_proc2 *)b)->p_pid;
}

static void
kinfo_proc_sort(struct kinfo_proc2 *kipp, int count)
{

qsort(kipp, count, sizeof(*kipp), kinfo_proc_compare);
}
#endif

static int
print_all(void) {
#ifdef __NetBSD__
char errbuf[_POSIX2_LINE_MAX];
#endif
struct kinfo_proc *procs;
int count;
kvm_t *kd;

#if defined(__FreeBSD__)
/* Doesn't work if security.bsd.unprivileged_proc_debug=0 */
kd = procstat_open_sysctl();
if (kd == NULL)
err(1, "procstat_open_sysctl()");
procs = procstat_getprocs(kd, KERN_PROC_PROC, 0, &count);
procs = kinfo_getallproc(&count);
if (procs == NULL)
err(1, "procstat_getprocs()");
#elif defined(__NetBSD__)
kd = kvm_openfiles(NULL, NULL, NULL, O_RDONLY, errbuf);
if (kd == NULL)
errx(1, "kvm_openfiles(): %s", errbuf);

procs = kvm_getproc2(kd, KERN_PROC_ALL, 0, sizeof(struct kinfo_proc2), &count);
kinfo_proc_sort(procs, count / sizeof(*procs));
if (procs == NULL)
err(1, "kvm_getproc2(): %s", kvm_geterr(kd));
#endif
err(1, "kinfo_getallproc()");

for (int i = 0; i < count; i++)
print_proc(kd, &procs[i]);
print_proc(&procs[i]);

#if defined(__FreeBSD__)
procstat_freeprocs(kd, procs);
procstat_close(kd);
#elif defined(__NetBSD__)
free(procs);
(void)kvm_close(kd);
#endif
return 0;
}

Expand Down

0 comments on commit 281fed4

Please sign in to comment.