Beispiel #1
0
unsigned long
logThreadPid(void)
{
#ifdef WIN32
    return (unsigned long)GetCurrentProcessId();
#elif defined(N_PLAT_NLM)
    return (unsigned long)GetNLMID();
#else
    return (unsigned long)getpid();
#endif
}
Beispiel #2
0
static
char *
progname(void)
{
#if TARGET == TARGET_UNIX
#if SYSTEM == SYSTEM_AIX
    extern char **p_xargv;
#elif SYSTEM == SYSTEM_HPUX
    extern char **__argv_value;
#elif SYSTEM == SYSTEM_IRIX || SYSTEM == SYSTEM_SINIX || SYSTEM == SYSTEM_TRU64
    extern char **__Argv;
#elif SYSTEM == SYSTEM_UNIXWARE
    extern char **___Argv;
#elif SYSTEM == SYSTEM_FREEBSD || SYSTEM == SYSTEM_INTERIX || \
      SYSTEM == SYSTEM_LINUX || SYSTEM == SYSTEM_NETBSD || \
      SYSTEM == SYSTEM_OPENBSD
    static char a[256], c[256];
    ssize_t l;
    int f;
#elif SYSTEM == SYSTEM_DGUX || SYSTEM == SYSTEM_DRSNX || \
      SYSTEM == SYSTEM_DYNIX || SYSTEM == SYSTEM_LYNXOS || \
      SYSTEM == SYSTEM_SOLARIS || SYSTEM == SYSTEM_SUNOS
    extern char **environ;
    char **e;
    char *t;
#endif /* SYSTEM */
#if !MP_BUILTINSTACK_SUPPORT && !MP_GLIBCBACKTRACE_SUPPORT && \
    !MP_LIBUNWIND_SUPPORT && !MP_LIBRARYSTACK_SUPPORT && \
    (ARCH == ARCH_IX86 || ARCH == ARCH_M68K || ARCH == ARCH_MIPS || \
     ARCH == ARCH_POWER || ARCH == ARCH_POWERPC || ARCH == ARCH_SPARC)
    unsigned long *p;
    stackinfo s;
#endif /* MP_BUILTINSTACK_SUPPORT && MP_GLIBCBACKTRACE_SUPPORT && ... */
#ifdef MP_PROCFS_EXENAME
    static char b[64];
#endif /* MP_PROCFS_EXENAME */
#elif TARGET == TARGET_AMIGA || TARGET == TARGET_WINDOWS
    static char p[256];
#elif TARGET == TARGET_NETWARE
    char *p, *t;
#endif /* TARGET */

#if TARGET == TARGET_UNIX
    /* AIX, HP/UX, Interix, IRIX, SINIX, Tru64 and UnixWare have global
     * variables containing argc and argv which we can use to determine the
     * filename that the program was invoked with.
     */
#if SYSTEM == SYSTEM_AIX
    if (p_xargv[0] != NULL)
        return p_xargv[0];
#elif SYSTEM == SYSTEM_HPUX
    if (__argv_value[0] != NULL)
        return __argv_value[0];
#elif SYSTEM == SYSTEM_IRIX || SYSTEM == SYSTEM_SINIX || SYSTEM == SYSTEM_TRU64
    if (__Argv[0] != NULL)
        return __Argv[0];
#elif SYSTEM == SYSTEM_UNIXWARE
    if (___Argv[0] != NULL)
        return ___Argv[0];
#elif SYSTEM == SYSTEM_FREEBSD || SYSTEM == SYSTEM_INTERIX || \
      SYSTEM == SYSTEM_LINUX || SYSTEM == SYSTEM_NETBSD || \
      SYSTEM == SYSTEM_OPENBSD
    /* The BSD variants, Interix and Linux have a file in the /proc filesystem
     * which contains the argument vector that a process was invoked with.
     */
    l = 0;
    sprintf(a, MP_PROCFS_CMDNAME, __mp_processid());
    if ((f = open(a, O_RDONLY)) != -1)
    {
        if ((l = read(f, c, sizeof(c) - 1)) == -1)
            l = 0;
        close(f);
    }
    if (l > 0)
    {
        c[l] = '\0';
        return c;
    }
#elif SYSTEM == SYSTEM_DGUX || SYSTEM == SYSTEM_DRSNX || \
      SYSTEM == SYSTEM_DYNIX || SYSTEM == SYSTEM_LYNXOS || \
      SYSTEM == SYSTEM_SOLARIS || SYSTEM == SYSTEM_SUNOS
    /* We can access the argument vector from the pointer to the environment
     * array on all other UNIX systems.  On DG/UX Intel, DRS/NX, DYNIX/ptx,
     * Solaris and SunOS we stop scanning backwards along the array when we
     * reach argc.  On DG/UX M88K and LynxOS we stop scanning forwards along
     * the array when we reach a NULL pointer.  The contents of the argument
     * vector then follow.
     */
#if (SYSTEM == SYSTEM_DGUX && ARCH == ARCH_M88K) || SYSTEM == SYSTEM_LYNXOS
    for (e = environ; *e != NULL; e++);
    t = (char *) (e + 1);
#else /* SYSTEM && ARCH */
    for (t = NULL, e = environ - 2; *e > (char *) _POSIX_ARG_MAX; t = *e--);
#endif /* SYSTEM && ARCH */
    if (t != NULL)
        return t;
#endif /* SYSTEM */
#if !MP_BUILTINSTACK_SUPPORT && !MP_GLIBCBACKTRACE_SUPPORT && \
    !MP_LIBUNWIND_SUPPORT && !MP_LIBRARYSTACK_SUPPORT && \
    (ARCH == ARCH_IX86 || ARCH == ARCH_M68K || ARCH == ARCH_MIPS || \
     ARCH == ARCH_POWER || ARCH == ARCH_POWERPC || ARCH == ARCH_SPARC)
    /* Because there is no function to return the executable filename
     * of a process on UNIX, we need to cheat and rely on the ABI by walking
     * up the process stack till we reach the startup code and then find
     * argv[0].  This is very OS-specific and is not my first choice for
     * doing this, but unfortunately it seemed to be the only way.
     */
    __mp_newframe(&s, NULL);
    for (p = NULL; __mp_getframe(&s); p = (unsigned long *) s.frame);
    if (p != NULL)
    {
#if ARCH == ARCH_IX86
#if SYSTEM == SYSTEM_FREEBSD || SYSTEM == SYSTEM_LINUX || \
    SYSTEM == SYSTEM_NETBSD || SYSTEM == SYSTEM_OPENBSD
        if ((p = (unsigned long *) p[4]))
            return (char *) *p;
#elif SYSTEM == SYSTEM_INTERIX
        if ((p = (unsigned long *) p[-6]))
            return (char *) (p + 1);
#elif SYSTEM == SYSTEM_LYNXOS
        if ((p = (unsigned long *) p[3]))
            return (char *) *p;
#else /* SYSTEM */
        if ((p = (unsigned long *) p[3]))
            return (char *) p;
#endif /* SYSTEM */
#elif ARCH == ARCH_M68K
        if ((p = (unsigned long *) p[3]))
            return (char *) *p;
#elif ARCH == ARCH_MIPS
        if ((p = (unsigned long *) p[7]))
            return (char *) p;
#elif ARCH == ARCH_POWER || ARCH == ARCH_POWERPC
#if SYSTEM == SYSTEM_AIX
        if ((p = (unsigned long *) p[7]))
            return (char *) p;
#else /* SYSTEM */
        if ((p = (unsigned long *) p[23]))
            return (char *) *p;
#endif /* SYSTEM */
#elif ARCH == ARCH_SPARC
#if ENVIRON == ENVIRON_64
        if (p = (unsigned long *) *(((unsigned long *) (*p + 0x7FF)) + 1))
#else /* ENVIRON */
        if (p = (unsigned long *) *(((unsigned long *) *p) + 1))
#endif /* ENVIRON */
            return (char *) *p;
#endif /* ARCH */
    }
#endif /* MP_BUILTINSTACK_SUPPORT && MP_GLIBCBACKTRACE_SUPPORT && ... */
#ifdef MP_PROCFS_EXENAME
    /* If the /proc filesystem is supported then we can usually access the
     * actual executable file that contains the current program through a
     * special file in the current /proc entry.
     */
    sprintf(b, MP_PROCFS_EXENAME, __mp_processid());
    return b;
#endif /* MP_PROCFS_EXENAME */
#elif TARGET == TARGET_AMIGA
    if (GetProgramName(p, sizeof(p)))
        return p;
#elif TARGET == TARGET_WINDOWS
    if (GetModuleFileName(NULL, p, sizeof(p)))
        return p;
#elif TARGET == TARGET_NETWARE
    if (GetNLMNameFromNLMID(GetNLMID(), &p, &t) == 0)
        return p;
#endif /* TARGET */
    return NULL;
}