From d4408a3d8b6317acad39ad3d34259789bb4d00df Mon Sep 17 00:00:00 2001 From: nobu Date: Mon, 29 May 2017 06:39:41 +0000 Subject: [PATCH] ruby-runner.c: replace argv[0] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@58950 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ruby-runner.c | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/ruby-runner.c b/ruby-runner.c index c16e7c6829..f44a02bcc7 100644 --- a/ruby-runner.c +++ b/ruby-runner.c @@ -12,6 +12,11 @@ int main(int argc, char **argv) { static const char builddir[] = BUILDDIR; + static const char rubypath[] = BUILDDIR"/"STRINGIZE(RUBY_INSTALL_NAME); + const size_t dirsize = sizeof(builddir); + const size_t namesize = sizeof(rubypath) - dirsize; + const char *rubyname = rubypath + dirsize; + char *arg0 = argv[0], *p; const char *libpath = getenv(LIBPATHENV); char c = 0; @@ -20,16 +25,27 @@ main(int argc, char **argv) } if (c) { size_t n = strlen(libpath); - char *e = malloc(sizeof(builddir)+n+1); - memcpy(e, builddir, sizeof(builddir)-1); - e[sizeof(builddir)-1] = PATH_SEP; - memcpy(e+sizeof(builddir), libpath, n+1); + char *e = malloc(dirsize+n+1); + memcpy(e, builddir, dirsize-1); + e[dirsize-1] = PATH_SEP; + memcpy(e+dirsize, libpath, n+1); libpath = e; } else { libpath = builddir; } setenv(LIBPATHENV, libpath, 1); - execv(BUILDDIR"/"STRINGIZE(RUBY_INSTALL_NAME), argv); + + if (!(p = strrchr(arg0, '/'))) p = arg0; else p++; + if (strlen(p) < namesize - 1) { + argv[0] = malloc(p - arg0 + namesize); + memcpy(argv[0], arg0, p - arg0); + memcpy(argv[0] + (p - arg0), rubypath + dirsize, namesize); + } + else { + memcpy(p, rubyname, namesize); + } + + execv(rubypath, argv); return -1; }