00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include <cassert>
00019 #include <cstring>
00020
00021 #include <libplumbing/progname.h>
00022
00023
00024 static std::string progname;
00025
00026
00027 void
00028 plumbing::progname_set(const char *s)
00029 {
00030 for (;;)
00031 {
00032 const char *cp1 = strchr(s, '/');
00033 if (!cp1)
00034 {
00035 progname = s;
00036 return;
00037 }
00038 const char *cp2 = cp1 + 1;
00039 while (*cp2 == '/')
00040 ++cp2;
00041 if (!*cp2)
00042 {
00043 progname = std::string(s, cp1 - s);
00044 return;
00045 }
00046 s = cp2;
00047 }
00048 }
00049
00050
00051 std::string
00052 plumbing::progname_get()
00053 {
00054 if (progname.empty())
00055 {
00056 char buf[1000];
00057 int n = readlink("/proc/self/exe", buf, sizeof(buf) - 1);
00058 if (n > 0)
00059 {
00060 buf[n] = 0;
00061 progname_set(buf);
00062 }
00063 else
00064 progname_set("???");
00065 }
00066
00067 assert(!progname.empty());
00068 return progname;
00069 }
00070
00071
00072