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