23 static int have_proc_pid = 0;
25 if (have_proc_pid == 0) {
26 char proc_path[PATH_MAX], exe_path[PATH_MAX];
29 snprintf(proc_path,
sizeof(proc_path),
"/proc/%lu/exe",
30 (
long unsigned int)getpid());
33 if (readlink(proc_path, exe_path, PATH_MAX - 1) < 0) {
41 }
else if ((kill(pid, 0) < 0) && (errno == ESRCH)) {
44 }
else if ((daemon == NULL) || (have_proc_pid == -1)) {
49 char proc_path[PATH_MAX], exe_path[PATH_MAX], myexe_path[PATH_MAX];
52 snprintf(proc_path,
sizeof(proc_path),
"/proc/%ld/exe", pid);
54 rc = readlink(proc_path, exe_path, PATH_MAX - 1);
55 if ((rc < 0) && (errno == EACCES)) {
56 crm_perror(LOG_INFO,
"Could not read from %s", proc_path);
59 crm_perror(LOG_ERR,
"Could not read from %s", proc_path);
65 if (daemon[0] !=
'/') {
70 rc = snprintf(myexe_path,
sizeof(proc_path),
"%s", daemon);
74 if (strcmp(exe_path, myexe_path) == 0) {
92 fd = open(filename, O_RDONLY);
97 if ((fstat(fd, &sbuf) >= 0) && (sbuf.st_size <
LOCKSTRLEN)) {
103 if (read(fd, buf,
sizeof(buf)) < 1) {
107 if (sscanf(buf,
"%ld", &pid) > 0) {
111 crm_trace(
"Got pid %lu from %s\n", pid, filename);
132 }
else if (mypid && (pid == mypid)) {
141 }
else if (mypid && (pid != mypid)) {
157 mypid = (
unsigned long) getpid();
168 fd = open(filename, O_CREAT | O_WRONLY | O_EXCL, 0644);
173 snprintf(buf,
sizeof(buf),
"%*ld\n",
LOCKSTRLEN - 1, mypid);
178 crm_perror(LOG_ERR,
"Incomplete write to %s", filename);
long crm_read_pidfile(const char *filename)
int daemon(int nochdir, int noclose)
#define crm_trace(fmt, args...)
long crm_pidfile_inuse(const char *filename, long mypid, const char *daemon)
int crm_pid_active(long pid, const char *daemon)
#define crm_perror(level, fmt, args...)
Log a system error message.
int crm_lock_pidfile(const char *filename, const char *name)