ReactOS 0.4.15-dev-8102-g108db8f
getexecpath.c
Go to the documentation of this file.
1/* @(#)getexecpath.c 1.1 10/11/18 Copyright 2006-2010 J. Schilling */
2/*
3 * Copyright (c) 2006.2010 J. Schilling
4 */
5/*
6 * The contents of this file are subject to the terms of the
7 * Common Development and Distribution License, Version 1.0 only
8 * (the "License"). You may not use this file except in compliance
9 * with the License.
10 *
11 * See the file CDDL.Schily.txt in this distribution for details.
12 *
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file CDDL.Schily.txt from this distribution.
15 */
16
17#include <schily/mconfig.h>
18#include <schily/types.h>
19#include <schily/unistd.h>
20#include <schily/string.h>
21#include <schily/standard.h>
22#include <schily/schily.h>
23
24#if (defined(sun) || defined(__sun) || defined(__sun__)) && defined(__SVR4)
25#define PATH_IMPL
26#define METHOD_SYMLINK
27#define SYMLINK_PATH "/proc/self/path/a.out" /* Solaris 10 -> ... */
28#endif
29
30#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
31#define PATH_IMPL
32#define METHOD_SYMLINK
33#define SYMLINK_PATH "/proc/curproc/file" /* /proc may nor be mounted */
34#endif
35
36#if defined(__linux__) || defined(__linux)|| defined(linux)
37#define PATH_IMPL
38#define METHOD_SYMLINK
39#define SYMLINK_PATH "/proc/self/exe"
40#endif
41
42#if defined(HAVE_PROC_PIDPATH) /* Mac OS X */
43#ifdef HAVE_LIBPROC_H
44#include <libproc.h>
45#endif
46#define PATH_IMPL
47#endif
48
49/*
50 * TODO: AIX: /proc/$$/object/a.out -> plain file, match via st_dev/st_ino
51 */
52
53
54EXPORT char *
56{
57#ifdef PATH_IMPL
58#ifdef METHOD_SYMLINK
59 char buf[1024];
61
62 len = readlink(SYMLINK_PATH, buf, sizeof (buf)-1);
63 if (len == -1)
64 return (NULL);
65 buf[len] = '\0';
66 return (strdup(buf));
67#endif
68#ifdef HAVE_PROC_PIDPATH /* Mac OS X */
69 char buf[1024];
70 int len;
71
72 len = proc_pidpath(getpid(), buf, sizeof (buf));
73 if (len == -1)
74 return (NULL);
75 return (strdup(buf));
76#endif
77#else
78 return (NULL);
79#endif
80}
#define NULL
Definition: types.h:112
EXPORT char * getexecpath()
Definition: getexecpath.c:55
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
GLenum GLsizei len
Definition: glext.h:6722
int readlink(const char *path, char *buf, size_t size)
int ssize_t
Definition: rosdhcp.h:48
_Check_return_ _CRTIMP char *__cdecl strdup(_In_opt_z_ const char *_Src)
#define getpid
Definition: wintirpc.h:52