/**
* @file op_lockfile.c
* PID-based lockfile management
*
* @remark Copyright 2002 OProfile authors
* @remark Read the file COPYING
*
* @author John Levon
* @author Philippe Elie
*/
#include "op_lockfile.h"
#include "op_file.h"
#include <errno.h>
#include <sys/types.h>
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
static pid_t op_read_lock_file(char const * file)
{
FILE * fp;
pid_t value;
fp = fopen(file, "r");
if (fp == NULL)
return 0;
if (fscanf(fp, "%d", &value) != 1) {
fclose(fp);
return 0;
}
fclose(fp);
return value;
}
int op_write_lock_file(char const * file)
{
FILE * fp;
if (op_file_readable(file)) {
pid_t pid = op_read_lock_file(file);
/* FIXME: ESRCH vs. EPERM */
if (kill(pid, 0)) {
int err = unlink(file);
fprintf(stderr, "Removing stale lock file %s\n",
file);
if (err)
return err;
} else {
return EEXIST;
}
}
fp = fopen(file, "w");
if (!fp)
return errno;
fprintf(fp, "%d", getpid());
fclose(fp);
return 0;
}