#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <err.h>
#include <libgen.h>
#include <fcntl.h>
#include <limits.h>
#include <paths.h>
#include <kvm.h>
#include <sys/param.h>
#include <sys/sysctl.h>
#include <sys/wait.h>
void
start_leds(void)
{
static int i = 1;
switch(fork())
{
case -1:
err(1, "fork");
break;
case 0:
execl("/usr/sbin/gpioctl", "gpioctl", "-q", "gpio0",
"led3", (i%2) ? "on" : "off", (char*)NULL);
err(1, "execl");
break;
default:
wait(NULL);
break;
}
sleep(1);
if (i++ <= 60)
return start_leds();
return;
}
int
main(int argc, char *argv[])
{
kvm_t *kd;
char berr[_POSIX2_LINE_MAX];
struct kinfo_proc *p;
int n, j, k, found = 0;
char **pargv;
if (argc < 2)
errx(1, "Usage check_proc procs ...");
if (!(kd = kvm_open(NULL, NULL, NULL, O_RDONLY, berr)))
errx(1, "%s", berr);
if (!(p = kvm_getprocs(kd, KERN_PROC_ALL, 0, &n)))
err(1, "kvm_getprocs: %s", kvm_geterr(kd));
for (j = 0; j < n; j++, p++)
{
pargv = kvm_getargv(kd, p, 0);
if (pargv && pargv[0])
for (k = 1; k < argc; k++)
if (strstr(pargv[0], argv[k]))
{
found++;
break;
}
}
if (-1 == kvm_close(kd))
err(1, "kvm_close");
if (found < argc-1)
start_leds();
return 0;
}