/** * @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; }