| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140 | 
							- /*
 
-  * (C)opyright MMVI Anselm R. Garbe <garbeam at gmail dot com>
 
-  * See LICENSE file for license details.
 
-  */
 
- #include <stdarg.h>
 
- #include <stdio.h>
 
- #include <stdlib.h>
 
- #include <string.h>
 
- #include <sys/types.h>
 
- #include <sys/wait.h>
 
- #include <unistd.h>
 
- #include "util.h"
 
- void
 
- error(char *errstr, ...) {
 
- 	va_list ap;
 
- 	va_start(ap, errstr);
 
- 	vfprintf(stderr, errstr, ap);
 
- 	va_end(ap);
 
- 	exit(1);
 
- }
 
- static void
 
- bad_malloc(unsigned int size)
 
- {
 
- 	fprintf(stderr, "fatal: could not malloc() %d bytes\n",
 
- 			(int) size);
 
- 	exit(1);
 
- }
 
- void *
 
- emallocz(unsigned int size)
 
- {
 
- 	void *res = calloc(1, size);
 
- 	if(!res)
 
- 		bad_malloc(size);
 
- 	return res;
 
- }
 
- void *
 
- emalloc(unsigned int size)
 
- {
 
- 	void *res = malloc(size);
 
- 	if(!res)
 
- 		bad_malloc(size);
 
- 	return res;
 
- }
 
- void *
 
- erealloc(void *ptr, unsigned int size)
 
- {
 
- 	void *res = realloc(ptr, size);
 
- 	if(!res)
 
- 		bad_malloc(size);
 
- 	return res;
 
- }
 
- char *
 
- estrdup(const char *str)
 
- {
 
- 	void *res = strdup(str);
 
- 	if(!res)
 
- 		bad_malloc(strlen(str));
 
- 	return res;
 
- }
 
- void
 
- failed_assert(char *a, char *file, int line)
 
- {
 
- 	fprintf(stderr, "Assertion \"%s\" failed at %s:%d\n", a, file, line);
 
- 	abort();
 
- }
 
- void
 
- swap(void **p1, void **p2)
 
- {
 
- 	void *tmp = *p1;
 
- 	*p1 = *p2;
 
- 	*p2 = tmp;
 
- }
 
- void
 
- spawn(Display *dpy, char *argv[])
 
- {
 
- 	if(!argv || !argv[0])
 
- 		return;
 
- 	if(fork() == 0) {
 
- 		if(fork() == 0) {
 
- 			if(dpy)
 
- 				close(ConnectionNumber(dpy));
 
- 			setsid();
 
- 			execvp(argv[0], argv);
 
- 			fprintf(stderr, "gridwm: execvp %s", argv[0]);
 
- 			perror(" failed");
 
- 		}
 
- 		exit (0);
 
- 	}
 
- 	wait(0);
 
- }
 
- void
 
- pipe_spawn(char *buf, unsigned int len, Display *dpy, char *argv[])
 
- {
 
- 	unsigned int l, n;
 
- 	int pfd[2];
 
- 	if(!argv || !argv[0])
 
- 		return;
 
- 	if(pipe(pfd) == -1) {
 
- 		perror("pipe");
 
- 		exit(1);
 
- 	}
 
- 	if(fork() == 0) {
 
- 		if(dpy)
 
- 			close(ConnectionNumber(dpy));
 
- 		setsid();
 
- 		dup2(pfd[1], STDOUT_FILENO);
 
- 		close(pfd[0]);
 
- 		close(pfd[1]);
 
- 		execvp(argv[0], argv);
 
- 		fprintf(stderr, "gridwm: execvp %s", argv[0]);
 
- 		perror(" failed");
 
- 	}
 
- 	else {
 
- 		n = 0;
 
- 		close(pfd[1]);
 
- 		while(l > n) {
 
- 			if((l = read(pfd[0], buf + n, len - n)) < 1)
 
- 				break;
 
- 			n += l;
 
- 		}
 
- 		close(pfd[0]);
 
- 		buf[n < len ? n : len - 1] = 0;
 
- 	}
 
- 	wait(0);
 
- }
 
 
  |