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., 59 Temple Place - Suite 330, Boston, MA 02111, USA
+ 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.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
/* left unaltered for tinc -- Ivo Timmermans */
* First version (v0.2) released
*/
-#include <stdio.h>
-#include <unistd.h>
-#include <sys/stat.h>
-#include <sys/file.h>
-#include <string.h>
-#include <errno.h>
-#include <signal.h>
-#include <sys/types.h>
-#include <fcntl.h>
+#include "system.h"
+#include "pidfile.h"
+
+#ifndef HAVE_MINGW
/* read_pid
*
* Reads the specified pidfile and returns the read pid.
* 0 is returned if either there's no pidfile, it's empty
* or no pid can be read.
*/
-int read_pid (char *pidfile)
+pid_t read_pid (const char *pidfile)
{
FILE *f;
- int pid;
+ long pid;
if (!(f=fopen(pidfile,"r")))
return 0;
- fscanf(f,"%d", &pid);
+ if(fscanf(f,"%20ld", &pid) != 1)
+ pid = 0;
fclose(f);
return pid;
}
*
* Reads the pid using read_pid and looks up the pid in the process
* table (using /proc) to determine if the process already exists. If
- * so 1 is returned, otherwise 0.
+ * so the pid is returned, otherwise 0.
*/
-int check_pid (char *pidfile)
+pid_t check_pid (const char *pidfile)
{
- int pid = read_pid(pidfile);
+ pid_t pid = read_pid(pidfile);
/* Amazing ! _I_ am already holding the pid file... */
if ((!pid) || (pid == getpid ()))
* be found -- GW
*/
/* But... errno is usually changed only on error.. */
+ errno = 0;
if (kill(pid, 0) && errno == ESRCH)
- return(0);
+ return 0;
return pid;
}
* Writes the pid to the specified file. If that fails 0 is
* returned, otherwise the pid.
*/
-int write_pid (char *pidfile)
+pid_t write_pid (const char *pidfile)
{
FILE *f;
int fd;
- int pid;
+ pid_t pid;
+
+ if ((fd = open(pidfile, O_RDWR|O_CREAT, 0644)) == -1) {
+ return 0;
+ }
- if ( ((fd = open(pidfile, O_RDWR|O_CREAT, 0644)) == -1)
- || ((f = fdopen(fd, "r+")) == NULL) ) {
- fprintf(stderr, "Can't open or create %s.\n", pidfile);
+ if ((f = fdopen(fd, "r+")) == NULL) {
+ close(fd);
return 0;
}
#ifdef HAVE_FLOCK
if (flock(fd, LOCK_EX|LOCK_NB) == -1) {
- fscanf(f, "%d", &pid);
fclose(f);
- printf("Can't lock, lock is held by pid %d.\n", pid);
return 0;
}
#endif
pid = getpid();
- if (!fprintf(f,"%d\n", pid)) {
- printf("Can't write pid , %s.\n", strerror(errno));
- close(fd);
+ if (!fprintf(f,"%ld\n", (long)pid)) {
+ fclose(f);
return 0;
}
fflush(f);
#ifdef HAVE_FLOCK
if (flock(fd, LOCK_UN) == -1) {
- printf("Can't unlock pidfile %s, %s.\n", pidfile, strerror(errno));
- close(fd);
+ fclose(f);
return 0;
}
#endif
- close(fd);
+ fclose(f);
return pid;
}
* Remove the the specified file. The result from unlink(2)
* is returned
*/
-int remove_pid (char *pidfile)
+int remove_pid (const char *pidfile)
{
return unlink (pidfile);
}
-
+#endif