/**************************************************************************
*
- * 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
*
**************************************************************************/
+
#include <string.h>
#include <stdio.h>
-#include <unistd.h>
#include <stdlib.h>
+
+#include <unistd.h>
+#include <sys/time.h>
#include <pthread.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+
+#ifdef __APPLE__
+#include <mach-o/dyld.h>
+#endif
#include "os.hpp"
-#include "log.hpp"
+
namespace OS {
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, '/');
}
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
} /* namespace OS */
-static void _uninit(void) __attribute__((destructor));
-static void _uninit(void) {
- Log::Close();
-}
-