diff options
Diffstat (limited to 'util.c')
-rw-r--r-- | util.c | 128 |
1 files changed, 81 insertions, 47 deletions
diff --git a/util.c b/util.c index 4214ce6..450f97f 100644 --- a/util.c +++ b/util.c @@ -2,71 +2,105 @@ * calmwm - the calm window manager * * Copyright (c) 2004 Marius Aamodt Eriksen <marius@monkey.org> - * All rights reserved. * - * $Id$ + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * $OpenBSD$ */ -#include "headers.h" -#include "calmwm.h" +#include <sys/types.h> +#include <sys/queue.h> -#define MAXARGLEN 20 +#include <err.h> +#include <errno.h> +#include <limits.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> + +#include "calmwm.h" -int +void u_spawn(char *argstr) { - char *args[MAXARGLEN], **ap; - char **end = &args[MAXARGLEN - 1]; - switch (fork()) { case 0: - ap = args; - while (ap < end && (*ap = strsep(&argstr, " \t")) != NULL) - ap++; - - *ap = NULL; - setsid(); - execvp(args[0], args); - err(1, args[0]); + u_exec(argstr); break; case -1: warn("fork"); - return (-1); default: break; } - - return (0); -} - -int dirent_exists(char *filename) { - struct stat buffer; - - return stat(filename, &buffer); } -int dirent_isdir(char *filename) { - struct stat buffer; - int return_value; - - return_value = stat(filename, &buffer); +void +u_exec(char *argstr) +{ +#define MAXARGLEN 20 + char *args[MAXARGLEN], **ap = args; + char **end = &args[MAXARGLEN - 1], *tmp; + char *s = argstr; + + while (ap < end && (*ap = strsep(&argstr, " \t")) != NULL) { + if (**ap == '\0') + continue; + ap++; + if (argstr != NULL) { + /* deal with quoted strings */ + switch(argstr[0]) { + case '"': + case '\'': + if ((tmp = strchr(argstr + 1, argstr[0])) + != NULL) { + *(tmp++) = '\0'; + *(ap++) = ++argstr; + argstr = tmp; + } + break; + default: + break; + } + } + } + *ap = NULL; - if(return_value == -1) - return 0; - else - return S_ISDIR(buffer.st_mode); + (void)setsid(); + (void)execvp(args[0], args); + warn("%s", s); } -int dirent_islink(char *filename) { - struct stat buffer; - int return_value; - - return_value = lstat(filename, &buffer); - - if(return_value == -1) - return 0; - else - return S_ISLNK(buffer.st_mode); +char * +u_argv(char * const *argv) +{ + size_t siz = 0; + int i; + char *p; + + if (argv == 0) + return(NULL); + + for (i = 0; argv[i]; i++) + siz += strlen(argv[i]) + 1; + if (siz == 0) + return(NULL); + + p = xmalloc(siz); + strlcpy(p, argv[0], siz); + for (i = 1; argv[i]; i++) { + strlcat(p, " ", siz); + strlcat(p, argv[i], siz); + } + return(p); } - - |