#include <limits.h>
#include <sys/stat.h>
-#define GET_FULL_PATH_SELF(a_) do { \
- static char q[PATH_MAX]; \
- const char *s="/proc/self/exe"; \
- struct stat ss; \
- if (stat(s,&ss)) \
- (a_)=argv[0]; \
- else { \
- if (!realpath(s,q)) \
- error("realpath error"); \
- (a_)=q; \
- } \
+#define GET_FULL_PATH_SELF(a_) do { \
+ static char q[PATH_MAX]; \
+ massert(which("/proc/self/exe",q) || which(argv[0],q)); \
+ (a_)=q; \
} while(0)
RETURN1((object)(w-u));
}
+static int
+mbin(const char *s,char *o) {
+
+ struct stat ss;
+
+ if (!stat(s,&ss) && (ss.st_mode&S_IFMT)==S_IFREG && !access(s,R_OK|X_OK)) {
+ massert(realpath(s,o));
+ return 1;
+ }
+
+ return 0;
+
+}
+
+static int
+which(const char *n,char *o) {
+
+ char *s;
+
+ if (strchr(n,'/'))
+ return mbin(n,o);
+
+ massert(snprintf(FN1,sizeof(FN1),"%s",getenv("PATH"))>1);
+ for (s=NULL;(s=strtok(s ? NULL : FN1,":"));) {
+
+ massert(snprintf(FN2,sizeof(FN2),"%s/%s",s,n));
+ if (mbin(FN2,o))
+ return 1;
+
+ }
+
+ return 0;
+
+}
+
+
int
main(int argc, char **argv, char **envp) {
-#ifdef GET_FULL_PATH_SELF
GET_FULL_PATH_SELF(kcl_self);
-#else
- kcl_self = argv[0];
-#endif
-
*argv=kcl_self;
-
+
#ifdef CAN_UNRANDOMIZE_SBRK
#include <stdio.h>
#include <stdlib.h>