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,
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) {
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);