aboutsummaryrefslogtreecommitdiffstats
path: root/rubystub.c
diff options
context:
space:
mode:
Diffstat (limited to 'rubystub.c')
-rw-r--r--rubystub.c57
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;
+}