Replace all casts of NULL to something with NULL.
[games.git] / usr.sbin / i4b / isdnd / process.c
1 /*
2  * Copyright (c) 1997, 1999 Hellmuth Michaelis. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
14  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
16  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
17  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
18  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
19  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
20  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
21  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
22  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
23  * SUCH DAMAGE.
24  *
25  *---------------------------------------------------------------------------
26  *
27  *      i4b daemon - process handling routines
28  *      --------------------------------------
29  *
30  *      $Id: process.c,v 1.8 1999/12/13 21:25:25 hm Exp $ 
31  *
32  * $FreeBSD: src/usr.sbin/i4b/isdnd/process.c,v 1.6.2.1 2001/08/01 17:45:03 obrien Exp $
33  * $DragonFly: src/usr.sbin/i4b/isdnd/process.c,v 1.2 2003/06/17 04:29:54 dillon Exp $
34  *
35  *      last edit-date: [Mon Dec 13 21:48:19 1999]
36  *
37  *---------------------------------------------------------------------------*/
38
39 #include "isdnd.h"
40
41 /*---------------------------------------------------------------------------*
42  *      check if another instance of us is already running
43  *---------------------------------------------------------------------------*/
44 void
45 check_pid(void)
46 {
47         FILE *fp;
48         
49         /* check if another lock-file already exists */
50
51         if((fp = fopen(PIDFILE, "r")) != NULL)
52         {
53                 /* lockfile found, check */
54                 
55                 int oldpid;
56
57                 /* read pid from file */
58                 
59                 if((fscanf(fp, "%d", &oldpid)) != 1)
60                 {
61                         dolog(LL_ERR, "ERROR, reading pid from lockfile failed, terminating!");
62                         exit(1);
63                 }
64
65                 /* check if process got from file is still alive */
66                 
67                 if((kill(oldpid, 0)) != 0)
68                 {
69                         /* process does not exist */
70
71                         /* close file */
72
73                         fclose(fp);
74
75                         DBGL(DL_PROC, (dolog(LL_DBG, "removing old lock-file %s", PIDFILE)));
76
77                         /* remove file */
78                         
79                         unlink(PIDFILE);
80                 }
81                 else
82                 {
83                         /* process is still alive */
84                         
85                         dolog(LL_ERR, "ERROR, another daemon is already running, pid = %d, terminating!", oldpid);
86                         exit(1);
87                 }
88         }
89 }
90
91 /*---------------------------------------------------------------------------*
92  *      establish and init process lock file
93  *---------------------------------------------------------------------------*/
94 void
95 write_pid(void)
96 {
97         FILE *fp;
98         
99         /* write my pid into lock-file */
100         
101         if((fp = fopen(PIDFILE, "w")) == NULL)
102         {
103                 dolog(LL_ERR, "ERROR, can't open lockfile for writing, terminating");
104                 do_exit(1);
105         }
106
107         if((fprintf(fp, "%d", (int)getpid())) == EOF)
108         {
109                 dolog(LL_ERR, "ERROR, can't write pid to lockfile, terminating");
110                 do_exit(1);
111         }
112
113         fsync(fileno(fp));
114
115         fclose(fp);
116 }
117
118 /*---------------------------------------------------------------------------*
119  *      become a daemon
120  *---------------------------------------------------------------------------*/
121 void
122 daemonize(void)
123 {
124         int fd;
125
126         switch (fork())
127         {
128                 case -1:                /* error */
129                         dolog(LL_ERR, "ERROR, daemonize/fork: %s", strerror(errno));
130                         exit(1);
131                 case 0:                 /* child */
132                         break;
133                 default:                /* parent */
134                         exit(0);
135         }
136
137         /* new session / no control tty */
138
139         if(setsid() == -1)
140         {
141                 dolog(LL_ERR, "ERROR, setsid returns: %s", strerror(errno));
142                 exit(1);
143         }
144
145         /* go away from mounted dir */
146         
147         chdir("/");
148
149         /* move i/o to another device ? */
150         
151         if(do_fullscreen && do_rdev)
152         {
153                 char *tp;
154                 
155                 if((fd = open(rdev, O_RDWR, 0)) != -1)
156                 {
157                         if(!isatty(fd))
158                         {
159                                 dolog(LL_ERR, "ERROR, device %s is not a tty!", rdev);
160                                 exit(1);
161                         }
162                         if((dup2(fd, STDIN_FILENO)) == -1)
163                         {
164                                 dolog(LL_ERR, "ERROR, dup2 stdin: %s", strerror(errno));
165                                 exit(1);
166                         }                               
167                         if((dup2(fd, STDOUT_FILENO)) == -1)
168                         {
169                                 dolog(LL_ERR, "ERROR, dup2 stdout: %s", strerror(errno));
170                                 exit(1);
171                         }                               
172                         if((dup2(fd, STDERR_FILENO)) == -1)
173                         {
174                                 dolog(LL_ERR, "ERROR, dup2 stderr: %s", strerror(errno));
175                                 exit(1);
176                         }                               
177                 }
178                 else
179                 {
180                         dolog(LL_ERR, "ERROR, cannot open redirected device: %s", strerror(errno));
181                         exit(1);
182                 }
183                         
184                 if(fd > 2)
185                 {
186                         if((close(fd)) == -1)
187                         {
188                                 dolog(LL_ERR, "ERROR, close in daemonize: %s", strerror(errno));
189                                 exit(1);
190                         }                               
191                 }
192
193                 /* curses output && fork NEEDS controlling tty */
194                 
195                 if((ioctl(STDIN_FILENO, TIOCSCTTY, NULL)) < 0)
196                 {
197                         dolog(LL_ERR, "ERROR, cannot setup tty as controlling terminal: %s", strerror(errno));
198                         exit(1);
199                 }
200
201                 /* in case there is no environment ... */
202
203                 if(((tp = getenv("TERM")) == NULL) || (*tp == '\0'))
204                 {
205                         if(do_ttytype == 0)
206                         {
207                                 dolog(LL_ERR, "ERROR, no environment variable TERM found and -t not specified!");
208                                 exit(1);
209                         }
210
211                         if((setenv("TERM", ttype, 1)) != 0)
212                         {
213                                 dolog(LL_ERR, "ERROR, setenv TERM=%s failed: %s", ttype, strerror(errno));
214                                 exit(1);
215                         }
216                 }
217         }
218 }
219
220 /* EOF */