/* See LICENSE file for copyright and license details. */ #include "dwm.h" void fatal(char *fmt, ...) { va_list args; va_start(args, fmt); vfprintf(stderr, fmt, args); va_end(args); if(fmt[0] && fmt[strlen(fmt)-1] == ':') { fputc(' ', stderr); perror(NULL); } else { fputc('\n', stderr); } exit(1); } void * ecalloc(size_t nmemb, size_t size) { void *p; if (!(p = calloc(nmemb, size))) fatal("calloc:"); return p; } pid_t getparentprocess(pid_t p) { uint v = 0; #if defined(__linux__) io·Stream *f; char buf[256]; snprintf(buf, sizeof(buf) - 1, "/proc/%u/stat", (unsigned)p); if (!(f = fopen(buf, "r"))) return (pid_t)0; if (fscanf(f, "%*u %*s %*c %u", (unsigned *)&v) != 1) v = (pid_t)0; fclose(f); #elif defined(__FreeBSD__) struct kinfo_proc *proc = kinfo_getproc(p); if (!proc) return (pid_t)0; v = proc->ki_ppid; free(proc); #endif return (pid_t)v; } int isdescendent(pid_t p, pid_t c) { while (p != c && c != 0) c = getparentprocess(c); return (int)c; }