X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=common%2Fos_posix.cpp;h=967d12eba4116ddccd8f1c3389f165c7c8edc4c0;hb=b9c20609ce007c6e07562df57b8a5d845061b9e4;hp=5ec8b363390792748e733a6d8d5e7a9b3afadb24;hpb=f917f612220b4e424ac7dfd05945460b2af5ed14;p=apitrace diff --git a/common/os_posix.cpp b/common/os_posix.cpp index 5ec8b36..967d12e 100644 --- a/common/os_posix.cpp +++ b/common/os_posix.cpp @@ -23,6 +23,7 @@ * **************************************************************************/ +#ifndef _WIN32 #include #include @@ -71,25 +72,33 @@ getProcessName(void) #ifdef __APPLE__ uint32_t len = size; if (_NSGetExecutablePath(buf, &len) != 0) { - *buf = 0; - return path; + // grow buf and retry + buf = path.buf(len); + _NSGetExecutablePath(buf, &len); } len = strlen(buf); #else ssize_t len; len = readlink("/proc/self/exe", buf, size - 1); - if (len == -1) { + if (len <= 0) { // /proc/self/exe is not available on setuid processes, so fallback to // /proc/self/cmdline. int fd = open("/proc/self/cmdline", O_RDONLY); if (fd >= 0) { - len = read(fd, buf, size - 1); + // buf already includes trailing zero + len = read(fd, buf, size); close(fd); + if (len >= 0) { + len = strlen(buf); + } } } if (len <= 0) { - snprintf(buf, size, "%i", (int)getpid()); - return path; + // fallback to process ID + len = snprintf(buf, size, "%i", (int)getpid()); + if (len >= size) { + len = size - 1; + } } #endif path.truncate(len); @@ -111,6 +120,12 @@ getCurrentDir(void) return path; } +bool +createDirectory(const String &path) +{ + return mkdir(path, 0777) == 0; +} + bool String::exists(void) const { @@ -122,9 +137,6 @@ String::exists(void) const return false; } - if (!S_ISREG(st.st_mode)) - return false; - return true; } @@ -320,3 +332,4 @@ resetExceptionCallback(void) } /* namespace os */ +#endif // !defined(_WIN32)