static void _backtrace(int pid, char *btarg) { char *proc, *spid, *gdbcmd; int fd[3], p[2]; int status, cmdfd; gdbcmd = estrdup("/tmp/gdbcmd.XXXXXX"); if(pipe(p) < 0) goto done; closeexec(p[0]); cmdfd = mkstemp(gdbcmd); if(cmdfd < 0) goto done; fprint(cmdfd, "bt %s\n", btarg); fprint(cmdfd, "detach\n"); close(cmdfd); fd[0] = open("/dev/null", O_RDONLY); fd[1] = p[1]; fd[2] = dup(2); proc = sxprint("/proc/%d/" PROGTXT, pid); spid = sxprint("%d", pid); if(spawn3l(fd, "gdb", "gdb", "-batch", "-x", gdbcmd, proc, spid, nil) < 0) { unlink(gdbcmd); goto done; } Biobuf bp; char *s; Binit(&bp, p[0], OREAD); while((s = Brdstr(&bp, '\n', 1))) { Dprint(DStack, "%s\n", s); free(s); } unlink(gdbcmd); done: free(gdbcmd); kill(pid, SIGKILL); waitpid(pid, &status, 0); }
char* area_name(Area *a) { if(a == nil) return "<nil>"; if(a->floating) return "~"; return sxprint("%d", area_idx(a)); }
static void init_environment(void) { init_ns(); if(address) setenv("WMII_ADDRESS", address, true); else address = smprint("unix!%s/wmii", ns_path); setenv("WMII_CONFPATH", sxprint("%s/.wmii%s:%s/wmii%s", getenv("HOME"), CONFVERSION, CONFPREFIX, CONFVERSION), true); }
char* column_getmode(Area *a) { return sxprint("%s%cmax", a->mode == Colstack ? "stack" : "default", a->max ? '+' : '-'); }