scanbd Code
scanbd is a scanner button daemon looking for scanner button pressed
Brought to you by:
wimalopaan
--- a +++ b/daemonize.c @@ -0,0 +1,70 @@ +/* + * $Header: /cvsroot/kmux/kmux-generate/helper/sane/scanbd/daemonize.c,v 1.1 2008/11/17 20:04:31 wimalopaan Exp $ + * + * scanbd - KMUX scanner button daemon + * + * Copyright (C) 2008 Wilhelm Meier (wilhelm.meier@fh-kl.de) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + + +#include "common.h" + +void daemonize(void) { + pid_t pid; + + if ((pid = fork()) < 0) { + perror("fork"); + exit(EXIT_FAILURE); + } + else if (pid > 0) { // Parent + exit(EXIT_SUCCESS); + } + // Child + if (setsid() < 0) { + perror("setsid"); + exit(EXIT_FAILURE); + } + if ((pid = fork()) < 0) { + perror("fork"); + exit(EXIT_FAILURE); + } + else if (pid > 0) { // Parent + exit(EXIT_SUCCESS); + } + // Child-Child + int ofd; + if ((ofd = open("/dev/null", O_RDWR)) < 0) { + perror("open /dev/null"); + exit(EXIT_FAILURE); + } + if (dup2(ofd, STDIN_FILENO) < 0) { + perror("dup2"); + exit(EXIT_FAILURE); + } + if (dup2(ofd, STDOUT_FILENO) < 0) { + perror("dup2"); + exit(EXIT_FAILURE); + } + if (dup2(ofd, STDERR_FILENO) < 0) { + perror("dup2"); + exit(EXIT_FAILURE); + } + if (chdir("/") < 0) { + perror("chdir"); + exit(EXIT_FAILURE); + } +}