summaryrefslogtreecommitdiffstats
path: root/base/command_line.cc
diff options
context:
space:
mode:
authormdm@chromium.org <mdm@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-01-03 02:20:08 +0000
committermdm@chromium.org <mdm@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-01-03 02:20:08 +0000
commitf07bd1ecc85ac808de4efec5ba8a0f7372cfa694 (patch)
tree3b3a0a6f55f53fdcc731810c274fba78578acdb2 /base/command_line.cc
parenta88f9709ca82ecf4a2d6a95972d18b921b98c6af (diff)
downloadchromium_src-f07bd1ecc85ac808de4efec5ba8a0f7372cfa694.zip
chromium_src-f07bd1ecc85ac808de4efec5ba8a0f7372cfa694.tar.gz
chromium_src-f07bd1ecc85ac808de4efec5ba8a0f7372cfa694.tar.bz2
Linux: use readlink() and prctl() in SetProcTitle() to fix "exe" showing in process listings.
BUG=29118 TEST=none Review URL: http://codereview.chromium.org/490028 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@35441 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'base/command_line.cc')
-rw-r--r--base/command_line.cc36
1 files changed, 34 insertions, 2 deletions
diff --git a/base/command_line.cc b/base/command_line.cc
index 35f839c..5f27064 100644
--- a/base/command_line.cc
+++ b/base/command_line.cc
@@ -7,10 +7,14 @@
#if defined(OS_WIN)
#include <windows.h>
#include <shellapi.h>
-#elif defined(OS_FREEBSD)
+#elif defined(OS_POSIX)
+#include <limits.h>
#include <stdlib.h>
#include <unistd.h>
#endif
+#if defined(OS_LINUX)
+#include <sys/prctl.h>
+#endif
#include <algorithm>
@@ -207,12 +211,40 @@ void CommandLine::SetProcTitle() {
// by spaces. We can't actually keep them separate due to the way the
// setproctitle() function works.
std::string title;
+ bool have_argv0 = false;
+#if defined(OS_LINUX)
+ // In Linux we sometimes exec ourselves from /proc/self/exe, but this makes us
+ // show up as "exe" in process listings. Read the symlink /proc/self/exe and
+ // use the path it points at for our process title. Note that this is only for
+ // display purposes and has no TOCTTOU security implications.
+ char buffer[PATH_MAX];
+ // Note: readlink() does not append a null byte to terminate the string.
+ ssize_t length = readlink("/proc/self/exe", buffer, sizeof(buffer));
+ DCHECK(length <= static_cast<ssize_t>(sizeof(buffer)));
+ if (length > 0) {
+ have_argv0 = true;
+ title.assign(buffer, length);
+ // If the binary has since been deleted, Linux appends " (deleted)" to the
+ // symlink target. Remove it, since this is not really part of our name.
+ const std::string kDeletedSuffix = " (deleted)";
+ if (EndsWith(title, kDeletedSuffix, true))
+ title.resize(title.size() - kDeletedSuffix.size());
+#if defined(PR_SET_NAME)
+ // If PR_SET_NAME is available at compile time, we try using it. We ignore
+ // any errors if the kernel does not support it at runtime though. When
+ // available, this lets us set the short process name that shows when the
+ // full command line is not being displayed in most process listings.
+ prctl(PR_SET_NAME, FilePath(title).BaseName().value().c_str());
+#endif
+ }
+#endif
for (size_t i = 1; i < current_process_commandline_->argv_.size(); ++i) {
if (!title.empty())
title += " ";
title += current_process_commandline_->argv_[i];
}
- setproctitle("%s", title.c_str());
+ // Disable prepending argv[0] with '-' if we prepended it ourselves above.
+ setproctitle(have_argv0 ? "-%s" : "%s", title.c_str());
}
#endif