1998-12-27 21:47:14 +00:00
|
|
|
/*
|
1999-03-07 16:12:47 +00:00
|
|
|
* Copyright (c) 1997, 1999 Hellmuth Michaelis. All rights reserved.
|
1998-12-27 21:47:14 +00:00
|
|
|
*
|
|
|
|
* Redistribution and use in source and binary forms, with or without
|
|
|
|
* modification, are permitted provided that the following conditions
|
|
|
|
* are met:
|
|
|
|
* 1. Redistributions of source code must retain the above copyright
|
|
|
|
* notice, this list of conditions and the following disclaimer.
|
|
|
|
* 2. Redistributions in binary form must reproduce the above copyright
|
|
|
|
* notice, this list of conditions and the following disclaimer in the
|
|
|
|
* documentation and/or other materials provided with the distribution.
|
|
|
|
*
|
|
|
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
|
|
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
|
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
|
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
|
|
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
|
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
|
|
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
|
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
|
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
|
|
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
|
|
* SUCH DAMAGE.
|
|
|
|
*
|
|
|
|
*---------------------------------------------------------------------------
|
|
|
|
*
|
|
|
|
* i4b daemon - process handling routines
|
|
|
|
* --------------------------------------
|
|
|
|
*
|
1999-08-28 01:35:59 +00:00
|
|
|
* $FreeBSD$
|
1998-12-27 21:47:14 +00:00
|
|
|
*
|
1999-03-07 16:12:47 +00:00
|
|
|
* last edit-date: [Sun Feb 14 10:11:54 1999]
|
1998-12-27 21:47:14 +00:00
|
|
|
*
|
|
|
|
* -hm debugging processhandling
|
|
|
|
*
|
|
|
|
*---------------------------------------------------------------------------*/
|
|
|
|
|
|
|
|
#include "isdnd.h"
|
|
|
|
|
|
|
|
/*---------------------------------------------------------------------------*
|
|
|
|
* check if another instance of us is already running
|
|
|
|
*---------------------------------------------------------------------------*/
|
|
|
|
void
|
|
|
|
check_pid(void)
|
|
|
|
{
|
|
|
|
FILE *fp;
|
|
|
|
|
|
|
|
/* check if another lock-file already exists */
|
|
|
|
|
|
|
|
if((fp = fopen(PIDFILE, "r")) != NULL)
|
|
|
|
{
|
|
|
|
/* lockfile found, check */
|
|
|
|
|
|
|
|
int oldpid;
|
|
|
|
|
|
|
|
/* read pid from file */
|
|
|
|
|
|
|
|
if((fscanf(fp, "%d", &oldpid)) != 1)
|
|
|
|
{
|
|
|
|
log(LL_ERR, "ERROR, reading pid from lockfile failed, terminating!");
|
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* check if process got from file is still alive */
|
|
|
|
|
|
|
|
if((kill(oldpid, 0)) != 0)
|
|
|
|
{
|
|
|
|
/* process does not exist */
|
|
|
|
|
|
|
|
/* close file */
|
|
|
|
|
|
|
|
fclose(fp);
|
|
|
|
|
|
|
|
DBGL(DL_PROC, (log(LL_DBG, "removing old lock-file %s", PIDFILE)));
|
|
|
|
|
|
|
|
/* remove file */
|
|
|
|
|
|
|
|
unlink(PIDFILE);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
/* process is still alive */
|
|
|
|
|
|
|
|
log(LL_ERR, "ERROR, another daemon is already running, pid = %d, terminating!", oldpid);
|
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/*---------------------------------------------------------------------------*
|
|
|
|
* establish and init process lock file
|
|
|
|
*---------------------------------------------------------------------------*/
|
|
|
|
void
|
|
|
|
write_pid(void)
|
|
|
|
{
|
|
|
|
FILE *fp;
|
|
|
|
|
|
|
|
/* write my pid into lock-file */
|
|
|
|
|
|
|
|
if((fp = fopen(PIDFILE, "w")) == NULL)
|
|
|
|
{
|
|
|
|
log(LL_ERR, "ERROR, can't open lockfile for writing, terminating");
|
|
|
|
do_exit(1);
|
|
|
|
}
|
|
|
|
|
|
|
|
if((fprintf(fp, "%d", (int)getpid())) == EOF)
|
|
|
|
{
|
|
|
|
log(LL_ERR, "ERROR, can't write pid to lockfile, terminating");
|
|
|
|
do_exit(1);
|
|
|
|
}
|
|
|
|
|
|
|
|
fsync(fileno(fp));
|
|
|
|
|
|
|
|
fclose(fp);
|
|
|
|
}
|
|
|
|
|
|
|
|
/*---------------------------------------------------------------------------*
|
|
|
|
* become a daemon
|
|
|
|
*---------------------------------------------------------------------------*/
|
|
|
|
void
|
|
|
|
daemonize(void)
|
|
|
|
{
|
|
|
|
int fd;
|
|
|
|
|
|
|
|
switch (fork())
|
|
|
|
{
|
|
|
|
case -1: /* error */
|
|
|
|
log(LL_ERR, "ERROR, daemonize/fork: %s", strerror(errno));
|
|
|
|
exit(1);
|
|
|
|
case 0: /* child */
|
|
|
|
break;
|
|
|
|
default: /* parent */
|
|
|
|
exit(0);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* new session / no control tty */
|
|
|
|
|
|
|
|
if(setsid() == -1)
|
|
|
|
{
|
|
|
|
log(LL_ERR, "ERROR, setsid returns: %s", strerror(errno));
|
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* go away from mounted dir */
|
|
|
|
|
|
|
|
chdir("/");
|
|
|
|
|
|
|
|
/* move i/o to another device ? */
|
|
|
|
|
|
|
|
if(do_fullscreen && do_rdev)
|
|
|
|
{
|
|
|
|
char *tp;
|
|
|
|
|
|
|
|
if((fd = open(rdev, O_RDWR, 0)) != -1)
|
|
|
|
{
|
|
|
|
if(!isatty(fd))
|
|
|
|
{
|
|
|
|
log(LL_ERR, "ERROR, device %s is not a tty!", rdev);
|
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
if((dup2(fd, STDIN_FILENO)) == -1)
|
|
|
|
{
|
|
|
|
log(LL_ERR, "ERROR, dup2 stdin: %s", strerror(errno));
|
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
if((dup2(fd, STDOUT_FILENO)) == -1)
|
|
|
|
{
|
|
|
|
log(LL_ERR, "ERROR, dup2 stdout: %s", strerror(errno));
|
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
if((dup2(fd, STDERR_FILENO)) == -1)
|
|
|
|
{
|
|
|
|
log(LL_ERR, "ERROR, dup2 stderr: %s", strerror(errno));
|
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
log(LL_ERR, "ERROR, cannot open redirected device: %s", strerror(errno));
|
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
|
|
|
|
if(fd > 2)
|
|
|
|
{
|
|
|
|
if((close(fd)) == -1)
|
|
|
|
{
|
|
|
|
log(LL_ERR, "ERROR, close in daemonize: %s", strerror(errno));
|
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* curses output && fork NEEDS controlling tty */
|
|
|
|
|
|
|
|
if((ioctl(STDIN_FILENO, TIOCSCTTY, (char *)NULL)) < 0)
|
|
|
|
{
|
|
|
|
log(LL_ERR, "ERROR, cannot setup tty as controlling terminal: %s", strerror(errno));
|
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* in case there is no environment ... */
|
|
|
|
|
|
|
|
if(((tp = getenv("TERM")) == NULL) || (*tp == '\0'))
|
|
|
|
{
|
|
|
|
if(do_ttytype == 0)
|
|
|
|
{
|
|
|
|
log(LL_ERR, "ERROR, no environment variable TERM found and -t not specified!");
|
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
|
|
|
|
if((setenv("TERM", ttype, 1)) != 0)
|
|
|
|
{
|
|
|
|
log(LL_ERR, "ERROR, setenv TERM=%s failed: %s", ttype, strerror(errno));
|
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* EOF */
|