else if (m->cmd[0] == "exit") {
suicide();
}
+ else if (m->cmd[0] == "respawn") {
+ respawn();
+ }
else if (m->cmd[0] == "session" && m->cmd[1] == "kill") {
Session *session = sessionmap.get_session(entity_name_t(CEPH_ENTITY_TYPE_CLIENT,
strtol(m->cmd[2].c_str(), 0, 10)));
}
new_argv[orig_argc] = NULL;
- char buf[PATH_MAX];
- char *cwd = getcwd(buf, sizeof(buf));
- assert(cwd);
- dout(1) << " cwd " << cwd << dendl;
+ /* Determine the path to our executable, try to read
+ * linux-specific /proc/ path first */
+ char exe_path[PATH_MAX];
+ ssize_t exe_path_bytes = readlink("/proc/self/exe", exe_path, sizeof(exe_path));
+ if (exe_path_bytes == -1) {
+ /* Print CWD for the user's interest */
+ char buf[PATH_MAX];
+ char *cwd = getcwd(buf, sizeof(buf));
+ assert(cwd);
+ dout(1) << " cwd " << cwd << dendl;
+
+ /* Fall back to a best-effort: just running in our CWD */
+ strncpy(exe_path, orig_argv[0], sizeof(exe_path));
+ }
+
+ dout(1) << " exe_path " << exe_path << dendl;
unblock_all_signals(NULL);
- execv(orig_argv[0], new_argv);
+ execv(exe_path, new_argv);
dout(0) << "respawn execv " << orig_argv[0]
<< " failed with " << cpp_strerror(errno) << dendl;