--- embedtools/src/butz.c 2014/02/08 16:37:56 1.1.2.3 +++ embedtools/src/butz.c 2014/02/08 16:48:36 1.1.2.4 @@ -162,7 +162,7 @@ int main(int argc, char **argv) { char ch; - int gpio; + pid_t pid; struct timespec ts = { 1, 0 }; while ((ch = getopt(argc, argv, "hc:d:")) != -1) @@ -181,16 +181,34 @@ main(int argc, char **argv) argc -= optind; argv += optind; + switch ((pid = fork())) { + case -1: + printf("Error:: failed fork() #%d - %s\n", errno, strerror(errno)); + return 1; + case 0: + setsid(); + chdir("/"); + + gpio = open(_PATH_DEVNULL, O_RDWR); + if (gpio > 2) { + dup2(gpio, STDIN_FILENO); + dup2(gpio, STDOUT_FILENO); + dup2(gpio, STDERR_FILENO); + close(gpio); + } + break; + default: + return 0; + } + openlog("butz", LOG_PID | LOG_CONS, LOG_DAEMON); gpio = open(szDevName, O_RDONLY); if (gpio == -1) { - printf("Error:: Can't open /dev/gpioc #%d - %s\n", - errno, strerror(errno)); + ESYSERR(0); return 1; } if (ioctl(gpio, GPIOMAXPIN, &maxpins) == -1) { - printf("Error:: Can't get max gpio pins #%d - %s\n", - errno, strerror(errno)); + ESYSERR(0); return 1; } @@ -212,7 +230,7 @@ main(int argc, char **argv) schedSignal(root, sigHandler, NULL, SIGHUP, NULL, 0); schedSignal(root, sigHandler, NULL, SIGTERM, NULL, 0); - schedTimer(root, butReset, (void*) gpio, ts, NULL, 0); + schedTimer(root, butReset, NULL, ts, NULL, 0); schedRun(root, &Kill); schedEnd(&root);