diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2005-04-27 23:21:58 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2005-04-27 23:21:58 +0000 |
commit | 0dd5e501ad2fb96e001bb4dd30ea46530e3f8479 (patch) | |
tree | 91373c497ca5464242b3b036d6a26c2c221f88b3 /ruby.c | |
parent | 35379dc7b78fe94dc7b0759e2da63baed1309181 (diff) | |
download | ruby-0dd5e501ad2fb96e001bb4dd30ea46530e3f8479.tar.gz |
* ruby.c (set_arg0): use also environment variable space for setting
$0. [ruby-core:04774]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@8391 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'ruby.c')
-rw-r--r-- | ruby.c | 54 |
1 files changed, 44 insertions, 10 deletions
@@ -977,6 +977,33 @@ VALUE rb_progname; VALUE rb_argv; VALUE rb_argv0; +#if !defined(PSTAT_SETCMD) && !defined(HAVE_SETPROCTITLE) && !defined(DOSISH) +static struct { + char *begin, *end; +} envspace; +extern char **environ; + +static void +set_arg0space() +{ + char *s; + int i; + + if (!environ || (s = environ[0]) == NULL) return; + envspace.begin = s; + s += strlen(s); + for (i = 1; environ[i]; i++) { + if (environ[i] == s + 1) { + s++; + s += strlen(s); /* this one is ok too */ + } + } + envspace.end = s; +} +#else +#define set_arg0space() ((void)0) +#endif + static void set_arg0(val, id) VALUE val; @@ -990,19 +1017,19 @@ set_arg0(val, id) StringValue(val); s = RSTRING(val)->ptr; i = RSTRING(val)->len; -#ifdef __hpux +#if defined(PSTAT_SETCMD) if (i >= PST_CLEN) { - union pstun j; - j.pst_command = s; - i = PST_CLEN; - RSTRING(val)->len = i; - *(s + i) = '\0'; - pstat(PSTAT_SETCMD, j, PST_CLEN, 0, 0); + union pstun j; + j.pst_command = s; + i = PST_CLEN; + RSTRING(val)->len = i; + *(s + i) = '\0'; + pstat(PSTAT_SETCMD, j, PST_CLEN, 0, 0); } else { - union pstun j; - j.pst_command = s; - pstat(PSTAT_SETCMD, j, i, 0, 0); + union pstun j; + j.pst_command = s; + pstat(PSTAT_SETCMD, j, i, 0, 0); } rb_progname = rb_tainted_str_new(s, i); #elif defined(HAVE_SETPROCTITLE) @@ -1024,6 +1051,12 @@ set_arg0(val, id) break; } } +#ifndef DOSISH + if (s + 1 == envspace.begin) { + s = envspace.end; + ruby_setenv("", NULL); /* duplicate environ vars */ + } +#endif len = s - origargv[0]; } @@ -1174,6 +1207,7 @@ ruby_process_options(argc, argv) #if defined(USE_DLN_A_OUT) dln_argv0 = argv[0]; #endif + set_arg0space(); proc_options(argc, argv); if (do_check && ruby_nerrs == 0) { |