diff -r 406003e3a01f dwm.c --- a/dwm.c Mon Sep 27 07:53:44 2010 +0000 +++ b/dwm.c Sat Oct 23 23:03:38 2010 -0400 @@ -1587,13 +1587,59 @@ while(0 < waitpid(-1, NULL, WNOHANG)); } +int +rcexec(const char *file, char *const argv[]) +{ + char path[1024]; + char *epath, *p, *fp; + size_t len; + + if (*file == '/') + return execv(file, argv); + + epath = getenv("PATH"); + if (epath == NULL) { + epath = "/bin"; + } + + p = epath; + while (*p) { + len=0; + memset(path, 0, 1024); + fp = path; + while (*p && *p != ':' && len < 1024) { + *fp++ = *p++; + len++; + } + if (*p == ':') + p++; + len = fp - path; + if (len < 1024) { + if (path[0]) { + fp--; + strcat(fp, "/"); + len++; + } + if (len+strlen(file) < 1024) { + strcat(fp, file); + execv(path, argv); + } else { + fprintf(stderr, "rcexec: command name too long\n"); + errno = E2BIG; + return -1; + } + } + } + return -1; +} + void spawn(const Arg *arg) { if(fork() == 0) { if(dpy) close(ConnectionNumber(dpy)); setsid(); - execvp(((char **)arg->v)[0], (char **)arg->v); + rcexec(((char **)arg->v)[0], (char **)arg->v); fprintf(stderr, "dwm: execvp %s", ((char **)arg->v)[0]); perror(" failed"); exit(0);