Ejemplo n.º 1
0
static inline bool isSymbolicLink(const std::string& filename)
{ return isSymbolicLink(filename.c_str()); }
Ejemplo n.º 2
0
int
main_get_executable_name (char *argv0, char **result)
{

#if defined(LINUX)
  return readSymbolicLink ("/proc/self/exe", result);
#else
  IDATA retval = -1;
  IDATA length;
  char *p;
  char *currentName = NULL;
  char *currentPath = NULL;
  char *originalWorkingDirectory = NULL;

  if (!argv0)
    {
      return -1;
    }
  currentPath = main_mem_allocate_memory(strlen (argv0) + 1);
  if (currentPath)
    {
      strcpy(currentPath, argv0);
    }
  if (!currentPath)
    {
      retval = -1;
      goto cleanup;
    }
  retval = cwdname(&originalWorkingDirectory);
  if (retval)
    {
      retval = -1;
      goto cleanup;
    }
gotPathName:
  /* split path into directory part and filename part. */
  p = strrchr (currentPath, '/');
  if (p)
    {
      *p++ = '\0';
      currentName = main_mem_allocate_memory(strlen (p) + 1);
      if (!currentName)
        {
          retval = -1;
          goto cleanup;
        }
      strcpy (currentName, p);
    }
  else
    {
      currentName = currentPath;
      currentPath = NULL;
      retval = searchSystemPath (currentName, &currentPath);
      if (retval)
        {
          retval = -1;
          goto cleanup;
        }
    }
  /* go there */
  if (currentPath)
    {
      if (currentPath[0])
        {
          if (0 != chdir (currentPath))
            {
              retval = -1;
              goto cleanup;
            }
        }
      main_mem_free_memory(currentPath);
      currentPath = NULL;
    }
  if (isSymbolicLink (currentName))
    {
      /* try to follow the link. */
      retval = readSymbolicLink (currentName, &currentPath);
      if (retval)
        {
          retval = -1;
          goto cleanup;
        }
      main_mem_free_memory(currentName);
      currentName = NULL;
      goto gotPathName;
    }
  retval = cwdname (&currentPath);
  if (retval)
    {
      retval = -1;
      goto cleanup;
    }
  /* Put name and path back together */
  *result = main_mem_allocate_memory(strlen(currentPath) + strlen(currentName) + 2);
  if (!*result)
    {
      retval = -1;
      goto cleanup;
    }
  strcpy (*result, currentPath);
  if (currentPath[0] && (currentPath[strlen (currentPath) - 1] != '/'))
    {
      strcat (*result, "/");
    }
  strcat (*result, currentName);
  /* Finished. */
  retval = 0;
cleanup:
  if (originalWorkingDirectory)
    {
      chdir (originalWorkingDirectory);
      main_mem_free_memory(originalWorkingDirectory);
      originalWorkingDirectory = NULL;
    }
  if (currentPath)
    {
      main_mem_free_memory(currentPath);
      currentPath = NULL;
    }
  if (currentName)
    {
      main_mem_free_memory(currentName);
      currentName = NULL;
    }
  return retval;
#endif
}