* 2022-01-18 [ci skip]
[ruby-80x24.org.git] / rubystub.c
blob1b10cdd4c40119011ac2d4dbc908154a5cdd22a4
1 #include "internal.h"
2 #if defined HAVE_DLADDR
3 #include <dlfcn.h>
4 #endif
5 #if defined HAVE_SYS_PARAM_H
6 #include <sys/param.h>
7 #endif
8 static void* stub_options(int argc, char **argv);
9 #define ruby_options stub_options
10 #include <main.c>
11 #undef ruby_options
13 void *
14 stub_options(int argc, char **argv)
16 char xflag[] = "-x";
17 char *xargv[4] = {NULL, xflag};
18 char *cmd = argv[0];
19 void *ret;
21 #if defined __CYGWIN__ || defined _WIN32
22 /* GetCommandLineW should contain the accessible path,
23 * use argv[0] as is */
24 #elif defined __linux__
26 char selfexe[MAXPATHLEN];
27 ssize_t len = readlink("/proc/self/exe", selfexe, sizeof(selfexe));
28 if (len < 0) {
29 perror("readlink(\"/proc/self/exe\")");
30 return NULL;
32 selfexe[len] = '\0';
33 cmd = selfexe;
35 #elif defined HAVE_DLADDR
37 Dl_info dli;
38 if (!dladdr(stub_options, &dli)) {
39 perror("dladdr");
40 return NULL;
42 cmd = (char *)dli.dli_fname;
44 #endif
46 #ifndef HAVE_SETPROCTITLE
47 /* argc and argv must be the original */
48 ruby_init_setproctitle(argc, argv);
49 #endif
51 /* set script with -x option */
52 /* xargv[0] is NULL not to re-initialize setproctitle again */
53 xargv[2] = cmd;
54 ret = ruby_options(3, xargv);
56 /* set all arguments to ARGV */
57 ruby_set_argv(argc - 1, argv + 1);
59 return ret;