better error handling

This commit is contained in:
Sascha Kruse 2012-12-19 22:23:40 +01:00
parent 8617ce7b2d
commit aa514c94eb
2 changed files with 27 additions and 6 deletions

30
dunst.c
View File

@ -13,6 +13,7 @@
#include <sys/time.h>
#include <regex.h>
#include <math.h>
#include <errno.h>
#include <signal.h>
#include <X11/Xlib.h>
#include <X11/XKBlib.h>
@ -33,6 +34,7 @@
#include "options.h"
#define INRECT(x,y,rx,ry,rw,rh) ((x) >= (rx) && (x) < (rx)+(rw) && (y) >= (ry) && (y) < (ry)+(rh))
#define LENGTH(X) (sizeof X / sizeof X[0])
#define MIN(a,b) ((a) < (b) ? (a) : (b))
@ -175,22 +177,37 @@ void context_menu(void) {
char buf[1024];
int child_io[2];
int parent_io[2];
pipe(child_io);
pipe(parent_io);
if (pipe(child_io) != 0) {
PERR("pipe()", errno);
return;
}
if (pipe(parent_io) != 0) {
PERR("pipe()", errno);
return;
}
int pid = fork();
if (pid == 0) {
close(child_io[1]);
close(parent_io[0]);
close(0);
dup(child_io[0]);
if (dup(child_io[0]) == -1) {
PERR("dup()", errno);
exit(EXIT_FAILURE);
}
close(1);
dup(parent_io[1]);
if (dup(parent_io[1]) == -1) {
PERR("dup()", errno);
exit(EXIT_FAILURE);
}
execvp(dmenu_cmd[0], dmenu_cmd);
} else {
close(child_io[0]);
close(parent_io[1]);
write(child_io[1], dmenu_input, strlen(dmenu_input));
size_t wlen = strlen(dmenu_input);
if (write(child_io[1], dmenu_input, wlen) != wlen) {
PERR("write()", errno);
}
close(child_io[1]);
size_t len = read(parent_io[0], buf, 1023);
@ -199,7 +216,7 @@ void context_menu(void) {
buf[len - 1] = '\0';
}
close(child_io[1]);
close(parent_io[0]);
int browser_pid = fork();
@ -1691,6 +1708,7 @@ void load_options(char *cmdline_config_path)
int main(int argc, char *argv[])
{
now = time(&now);
r_line_cache_init(&line_cache);

View File

@ -6,6 +6,9 @@
#include "draw.h"
#define ERR(msg) printf("%s : %d\n", (msg), __LINE__)
#define PERR(msg, errnum) printf("(%d) %s : %s\n", __LINE__, (msg), (strerror(errnum)))
#define LOW 0
#define NORM 1
#define CRIT 2