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 
54 EXPORT char *
getexecpath()55 getexecpath()
56 {
57 #ifdef	PATH_IMPL
58 #ifdef	METHOD_SYMLINK
59 	char	buf[1024];
60 	ssize_t	len;
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 }
81