This is Unofficial EPICS BASE Doxygen Site
osdgetexec.c
Go to the documentation of this file.
1 
2 #include <string.h>
3 #include <stdlib.h>
4 #include <unistd.h>
5 #include <limits.h>
6 
7 #include <osiFileName.h>
8 
9 char *epicsGetExecName(void)
10 {
11  size_t max = PATH_MAX;
12  char *ret = NULL;
13  ssize_t n;
14 
15  while(1) {
16  char *temp = realloc(ret, max);
17  if(!temp) {
18  /* we treat alloc failure as terminal */
19  free(ret);
20  ret = NULL;
21  break;
22  }
23  ret = temp;
24 
25  n = readlink("/proc/curproc/file", ret, max);
26  if(n == -1) {
27  free(ret);
28  ret = NULL;
29  break;
30  } else if(n < max) {
31  /* readlink() never adds a nil */
32  ret[n] = '\0';
33  break;
34  }
35 
36  max += 64;
37  }
38 
39  if(!ret) {
40  int mib[4];
41  mib[0] = CTL_KERN;
42  mib[1] = KERN_PROC;
43  mib[2] = KERN_PROC_PATHNAME;
44  mib[3] = -1;
45 
46  ret = malloc(max);
47  if(ret) {
48  sysctl(mib, 4, ret, &cb, NULL, 0);
49  /* TODO: error check */
50  }
51  }
52 
53  return ret;
54 }
55 
56 char *epicsGetExecDir(void)
57 {
58  char *ret = epicsGetExecName();
59  if(ret) {
60  char *sep = strrchr(ret, '/');
61  if(sep) {
62  /* nil the charactor after the / */
63  sep[1] = '\0';
64  }
65  }
66  return ret;
67 }
#define max(x, y)
Definition: flexdef.h:81
#define NULL
Definition: catime.c:38
char * epicsGetExecName(void)
Definition: osdgetexec.c:9
#define PATH_MAX
Definition: osdgetexec.c:10
char * epicsGetExecDir(void)
Definition: osdgetexec.c:38