25 static int last_asked_pid = 0;
27 static int have_proc_pid = 0;
29 static int have_proc_pid = -1;
33 if (have_proc_pid == 0) {
35 char proc_path[PATH_MAX], exe_path[PATH_MAX];
36 snprintf(proc_path,
sizeof(proc_path),
"/proc/%lu/exe",
37 (
long unsigned int) getpid());
39 if (readlink(proc_path, exe_path,
sizeof(exe_path) - 1) < 0) {
47 }
else if ((rc = kill(pid, 0)) < 0 && errno == ESRCH) {
50 }
else if (rc < 0 && (daemon == NULL || have_proc_pid == -1)) {
51 if (last_asked_pid != pid) {
57 }
else if (rc == 0 && (daemon == NULL || have_proc_pid == -1)) {
60 }
else if (daemon != NULL) {
63 bool checked_through_kill = (rc == 0);
64 char proc_path[PATH_MAX], exe_path[PATH_MAX], myexe_path[PATH_MAX];
65 snprintf(proc_path,
sizeof(proc_path),
"/proc/%ld/exe", pid);
67 rc = readlink(proc_path, exe_path,
sizeof(exe_path) - 1);
68 if ((rc < 0) && (errno == EACCES)) {
69 if (last_asked_pid != pid) {
70 crm_info(
"Could not read from %s: %s", proc_path,
74 return checked_through_kill ? 1 : -2;
76 if (last_asked_pid != pid) {
77 crm_err(
"Could not read from %s: %s (%d)", proc_path,
85 if (daemon[0] !=
'/') {
89 rc = snprintf(myexe_path,
sizeof(myexe_path),
"%s", daemon);
92 if (rc > 0 && rc <
sizeof(myexe_path) && !strcmp(exe_path, myexe_path)) {
100 #define LOCKSTRLEN 11 110 fd = open(filename, O_RDONLY);
115 if ((fstat(fd, &sbuf) >= 0) && (sbuf.st_size <
LOCKSTRLEN)) {
121 if (read(fd, buf,
sizeof(buf)) < 1) {
125 if (sscanf(buf,
"%ld", &pid) > 0) {
129 crm_trace(
"Got pid %lu from %s\n", pid, filename);
150 }
else if (mypid && (pid == mypid)) {
159 }
else if (mypid && (pid != mypid)) {
175 mypid = (
unsigned long) getpid();
186 fd = open(filename, O_CREAT | O_WRONLY | O_EXCL, 0644);
191 snprintf(buf,
sizeof(buf),
"%*ld\n",
LOCKSTRLEN - 1, mypid);
196 crm_perror(LOG_ERR,
"Incomplete write to %s", filename);
char * strerror(int errnum)
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.
#define crm_err(fmt, args...)
int crm_lock_pidfile(const char *filename, const char *name)
#define crm_info(fmt, args...)