diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2016-08-20 02:20:34 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2016-08-20 02:20:34 +0000 |
commit | 9b454bfaf3a3c37fd8ff83880fc88f3dc9375a8d (patch) | |
tree | 5a4c40835ac4d5e13c89340ab5a3c9e858301214 /rubystub.c | |
parent | e79b23c12fb482856412ebdd782b6abbfb0a2cae (diff) |
rubystub
* rubystub.c: generalize win32/stub.c. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@55973 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'rubystub.c')
-rw-r--r-- | rubystub.c | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/rubystub.c b/rubystub.c new file mode 100644 index 0000000000..80b04d4b27 --- /dev/null +++ b/rubystub.c @@ -0,0 +1,57 @@ +#include "internal.h" +#if defined HAVE_DLADDR +#include <dlfcn.h> +#endif +static void* stub_options(int argc, char **argv); +#define ruby_options stub_options +#include <main.c> +#undef ruby_options + +void * +stub_options(int argc, char **argv) +{ + char xflag[] = "-x"; + char *xargv[4] = {NULL, xflag}; + char *cmd = argv[0]; + void *ret; + +#if defined __CYGWIN__ || defined _WIN32 + /* GetCommandLineW should contain the accessible path, + * use argv[0] as is */ +#elif defined __linux__ + { + char selfexe[MAXPATHLEN]; + ssize_t len = readlink("/proc/self/exe", selfexe, sizeof(selfexe)); + if (len < 0) { + perror("readlink(\"/proc/self/exe\")"); + return NULL; + } + selfexe[len] = '\0'; + cmd = selfexe; + } +#elif defined HAVE_DLADDR + { + Dl_info dli; + if (!dladdr(stub_options, &dli)) { + perror("dladdr"); + return NULL; + } + cmd = (char *)dli.dli_fname; + } +#endif + +#ifndef HAVE_SETPROCTITLE + /* argc and argv must be the original */ + ruby_init_setproctitle(argc, argv); +#endif + + /* set script with -x option */ + /* xargv[0] is NULL not to re-initialize setproctitle again */ + xargv[2] = cmd; + ret = ruby_options(3, xargv); + + /* set all arguments to ARGV */ + ruby_set_argv(argc - 1, argv + 1); + + return ret; +} |