garbeam@2: /* garbeam@2: * (C)opyright MMVI Anselm R. Garbe garbeam@2: * See LICENSE file for license details. garbeam@2: */ garbeam@76: #include "dwm.h" garbeam@2: garbeam@2: #include garbeam@2: #include garbeam@2: #include garbeam@5: #include garbeam@5: #include garbeam@5: garbeam@84: /* static */ garbeam@2: garbeam@3: static void garbeam@3: bad_malloc(unsigned int size) garbeam@3: { garbeam@3: fprintf(stderr, "fatal: could not malloc() %d bytes\n", garbeam@3: (int) size); garbeam@3: exit(1); garbeam@3: } garbeam@3: garbeam@84: /* extern */ garbeam@76: garbeam@3: void * garbeam@3: emallocz(unsigned int size) garbeam@3: { garbeam@3: void *res = calloc(1, size); garbeam@3: if(!res) garbeam@3: bad_malloc(size); garbeam@3: return res; garbeam@3: } garbeam@3: garbeam@3: void garbeam@76: eprint(const char *errstr, ...) { garbeam@76: va_list ap; garbeam@76: va_start(ap, errstr); garbeam@76: vfprintf(stderr, errstr, ap); garbeam@76: va_end(ap); garbeam@76: exit(1); garbeam@76: } garbeam@76: garbeam@76: void garbeam@49: spawn(Arg *arg) garbeam@5: { garbeam@49: char **argv = (char **)arg->argv; garbeam@14: if(!argv || !argv[0]) garbeam@5: return; garbeam@5: if(fork() == 0) { garbeam@5: if(fork() == 0) { garbeam@5: if(dpy) garbeam@5: close(ConnectionNumber(dpy)); garbeam@9: setsid(); garbeam@14: execvp(argv[0], argv); garbeam@34: fprintf(stderr, "dwm: execvp %s", argv[0]); garbeam@5: perror(" failed"); garbeam@5: } garbeam@5: exit (0); garbeam@5: } garbeam@5: wait(0); garbeam@5: }