Added the same open()/fopen()/creat()/mmap() -> sys_XXX calls.
[vlendec/samba-autobuild/.git] / source3 / lib / pidfile.c
1 /* 
2    Unix SMB/Netbios implementation.
3    Version 1.9.
4    pidfile handling
5    Copyright (C) Andrew Tridgell 1998
6    
7    This program is free software; you can redistribute it and/or modify
8    it under the terms of the GNU General Public License as published by
9    the Free Software Foundation; either version 2 of the License, or
10    (at your option) any later version.
11    
12    This program is distributed in the hope that it will be useful,
13    but WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15    GNU General Public License for more details.
16    
17    You should have received a copy of the GNU General Public License
18    along with this program; if not, write to the Free Software
19    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 */
21
22 #include "includes.h"
23
24
25 extern int DEBUGLEVEL;
26
27 #ifndef O_NONBLOCK
28 #define O_NONBLOCK
29 #endif
30
31 /* return the pid in a pidfile. return 0 if the process (or pidfile)
32    does not exist */
33 pid_t pidfile_pid(char *name)
34 {
35         FILE *f;
36         unsigned ret;
37         pstring pidFile;
38
39         slprintf(pidFile, sizeof(pidFile)-1, "%s/%s.pid", lp_lockdir(), name);
40
41         f = sys_fopen(pidFile, "r");
42         if (!f) {
43                 return 0;
44         }
45
46         if (fscanf(f,"%u", &ret) != 1) {
47                 fclose(f);
48                 return 0;
49         }
50         fclose(f);
51         
52         if (!process_exists(ret)) return 0;
53
54         return (pid_t)ret;
55 }
56
57 /* create a pid file in the lock directory. open it and leave it locked */
58 void pidfile_create(char *name)
59 {
60         int     fd;
61         char    buf[20];
62         pstring pidFile;
63         int pid;
64
65         slprintf(pidFile, sizeof(pidFile)-1, "%s/%s.pid", lp_lockdir(), name);
66
67         pid = pidfile_pid(name);
68     if (pid > 0 && process_exists(pid)) {
69       DEBUG(0,("ERROR: %s is already running. File %s exists and process id %d is running.\n", 
70             name, pidFile, pid));
71       exit(1);
72     }
73
74         fd = sys_open(pidFile, O_NONBLOCK | O_CREAT | O_WRONLY, 0644);
75         if (fd < 0) {
76                 DEBUG(0,("ERROR: can't open %s: Error was %s\n", pidFile, 
77                          strerror(errno)));
78                 exit(1);
79         }
80
81         if (fcntl_lock(fd,SMB_F_SETLK,0,1,F_WRLCK)==False) {
82                 DEBUG(0,("ERROR: %s : fcntl lock of file %s failed. Error was %s\n",  
83               name, pidFile, strerror(errno)));
84                 exit(1);
85         }
86
87         memset(buf, 0, sizeof(buf));
88         slprintf(buf, sizeof(buf) - 1, "%u\n", (unsigned int) getpid());
89         if (write(fd, buf, sizeof(buf)) != sizeof(buf)) {
90                 DEBUG(0,("ERROR: can't write to file %s: %s\n", 
91                          pidFile, strerror(errno)));
92                 exit(1);
93         }
94         /* Leave pid file open & locked for the duration... */
95 }