X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=os_posix.cpp;h=cb9b7e59113130b5f696f21a41769aa5c463fc7a;hb=6dce37c812e3fd86171934b72ad8286a3302a571;hp=3f423fe99cd1e01d3f8b7312e6590fbe37981f52;hpb=a34761232d38b0e288ceba866397f8902e82a80f;p=apitrace diff --git a/os_posix.cpp b/os_posix.cpp index 3f423fe..cb9b7e5 100644 --- a/os_posix.cpp +++ b/os_posix.cpp @@ -1,6 +1,6 @@ /************************************************************************** * - * Copyright 2010 VMware, Inc. + * Copyright 2010-2011 VMware, Inc. * All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy @@ -23,14 +23,23 @@ * **************************************************************************/ + #include #include -#include #include + +#include +#include #include +#include +#include + +#ifdef __APPLE__ +#include +#endif #include "os.hpp" -#include "log.hpp" + namespace OS { @@ -56,16 +65,33 @@ ReleaseMutex(void) bool GetProcessName(char *str, size_t size) { - ssize_t len; char szProcessPath[PATH_MAX + 1]; char *lpProcessName; - + // http://stackoverflow.com/questions/1023306/finding-current-executables-path-without-proc-self-exe - len = readlink("/proc/self/exe", szProcessPath, sizeof(szProcessPath) - 1); - if (len == -1) { +#ifdef __APPLE__ + uint32_t len = sizeof szProcessPath; + if (_NSGetExecutablePath(szProcessPath, &len) != 0) { *str = 0; return false; } +#else + ssize_t len; + len = readlink("/proc/self/exe", szProcessPath, sizeof(szProcessPath) - 1); + if (len == -1) { + // /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, szProcessPath, sizeof(szProcessPath) - 1); + close(fd); + } + } + if (len <= 0) { + snprintf(str, size, "%i", (int)getpid()); + return true; + } +#endif szProcessPath[len] = 0; lpProcessName = strrchr(szProcessPath, '/'); @@ -88,10 +114,20 @@ GetCurrentDir(char *str, size_t size) } void -DebugMessage(const char *message) +DebugMessage(const char *format, ...) { - fflush(stdout); - fputs(message, stderr); + va_list ap; + va_start(ap, format); + fflush(stdout); + vfprintf(stderr, format, ap); + va_end(ap); +} + +long long GetTime(void) +{ + struct timeval tv; + gettimeofday(&tv, NULL); + return tv.tv_usec + tv.tv_sec*1000000LL; } void @@ -103,8 +139,3 @@ Abort(void) } /* namespace OS */ -static void _uninit(void) __attribute__((destructor)); -static void _uninit(void) { - Log::Close(); -} -