25 static pid_t last_asked_pid = 0;
27 static int have_proc_pid = 0;
29 static int have_proc_pid = -1;
32 bool no_name_check = ((daemon == NULL) || (have_proc_pid == -1));
34 if (have_proc_pid == 0) {
36 char proc_path[PATH_MAX], exe_path[PATH_MAX];
37 snprintf(proc_path,
sizeof(proc_path),
"/proc/%lld/exe",
38 (
long long) getpid());
40 if (readlink(proc_path, exe_path,
sizeof(exe_path) - 1) < 0) {
50 if ((rc < 0) && (errno == ESRCH)) {
53 }
else if ((rc < 0) && no_name_check) {
55 if (last_asked_pid != pid) {
56 crm_info(
"Cannot examine PID %lld: %s",
62 }
else if ((rc == 0) && no_name_check) {
65 }
else if (daemon != NULL) {
68 bool checked_through_kill = (rc == 0);
69 char proc_path[PATH_MAX], exe_path[PATH_MAX], myexe_path[PATH_MAX];
70 snprintf(proc_path,
sizeof(proc_path),
"/proc/%lld/exe",
73 rc = readlink(proc_path, exe_path,
sizeof(exe_path) - 1);
75 if (last_asked_pid != pid) {
76 if (errno == EACCES) {
85 if ((errno == EACCES) && checked_through_kill) {
88 }
else if (errno == EACCES) {
96 if (daemon[0] !=
'/') {
100 rc = snprintf(myexe_path,
sizeof(myexe_path),
"%s", daemon);
103 if (rc > 0 && rc <
sizeof(myexe_path) && !strcmp(exe_path, myexe_path)) {
111 #define LOCKSTRLEN 11
128 long long pid_read = 0;
131 CRM_CHECK((filename != NULL) && (pid != NULL),
return EINVAL);
133 fd = open(filename, O_RDONLY);
138 if ((fstat(fd, &sbuf) >= 0) && (sbuf.st_size <
LOCKSTRLEN)) {
144 if (read(fd, buf,
sizeof(buf)) < 1) {
149 if (sscanf(buf,
"%lld", &pid_read) > 0) {
154 *pid = (pid_t) pid_read;
155 crm_trace(
"Read pid %lld from %s", pid_read, filename);
178 const char *expected_name, pid_t *
pid)
180 pid_t pidfile_pid = 0;
192 }
else if ((expected_pid > 0) && (pidfile_pid == expected_pid)) {
201 }
else if ((expected_pid > 0) && (pidfile_pid != expected_pid)) {
221 pid_t mypid = getpid();
232 fd = open(filename, O_CREAT | O_WRONLY | O_EXCL, 0644);
237 snprintf(buf,
sizeof(buf),
"%*lld\n",
LOCKSTRLEN - 1, (
long long) mypid);
242 crm_perror(LOG_ERR,
"Incomplete write to %s", filename);
#define CRM_CHECK(expr, failure_action)
int pcmk__read_pidfile(const char *filename, pid_t *pid)
char * strerror(int errnum)
int daemon(int nochdir, int noclose)
#define crm_trace(fmt, args...)
int pcmk__pid_active(pid_t pid, const char *daemon)
int pcmk__lock_pidfile(const char *filename, const char *name)
#define crm_perror(level, fmt, args...)
Send a system error message to both the log and stderr.
#define crm_err(fmt, args...)
int pcmk__pidfile_matches(const char *filename, pid_t expected_pid, const char *expected_name, pid_t *pid)
#define crm_info(fmt, args...)