110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project/** 210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * @file op_lockfile.c 310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * PID-based lockfile management 410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * 510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * @remark Copyright 2002 OProfile authors 610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * @remark Read the file COPYING 710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * 810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * @author John Levon 910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * @author Philippe Elie 1010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project */ 1110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 1210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#include "op_lockfile.h" 1310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#include "op_file.h" 1410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 1510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#include <errno.h> 1610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 1710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#include <sys/types.h> 1810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#include <stdio.h> 1910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#include <signal.h> 2010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#include <unistd.h> 2110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 2210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectstatic pid_t op_read_lock_file(char const * file) 2310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project{ 2410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project FILE * fp; 2510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project pid_t value; 2610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 2710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project fp = fopen(file, "r"); 2810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (fp == NULL) 2910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project return 0; 3010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 3110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (fscanf(fp, "%d", &value) != 1) { 3210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project fclose(fp); 3310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project return 0; 3410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } 3510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 3610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project fclose(fp); 3710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 3810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project return value; 3910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project} 4010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 4110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 4210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectint op_write_lock_file(char const * file) 4310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project{ 4410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project FILE * fp; 4510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 4610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (op_file_readable(file)) { 4710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project pid_t pid = op_read_lock_file(file); 4810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 4910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project /* FIXME: ESRCH vs. EPERM */ 5010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (kill(pid, 0)) { 5110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project int err = unlink(file); 5210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project fprintf(stderr, "Removing stale lock file %s\n", 5310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project file); 5410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (err) 5510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project return err; 5610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } else { 5710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project return EEXIST; 5810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } 5910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } 6010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 6110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project fp = fopen(file, "w"); 6210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (!fp) 6310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project return errno; 6410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 6510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project fprintf(fp, "%d", getpid()); 6610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project fclose(fp); 6710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 6810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project return 0; 6910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project} 70