diff options
| author | Eli Zaretskii | 1998-04-21 11:10:56 +0000 |
|---|---|---|
| committer | Eli Zaretskii | 1998-04-21 11:10:56 +0000 |
| commit | e52f2f255e132396179cbe0de499df764b39d88f (patch) | |
| tree | cd7b4fd8f05668a23580198c0b5cd4abb463a8e0 /src | |
| parent | 793faff195b21d0cefc2d9e89b609d195add7af0 (diff) | |
| download | emacs-e52f2f255e132396179cbe0de499df764b39d88f.tar.gz emacs-e52f2f255e132396179cbe0de499df764b39d88f.zip | |
(run_msdos_command): Don't construct process
environment, it's already done in child_setup.
(run_msdos_command): Add ENVV to argument list.
Diffstat (limited to 'src')
| -rw-r--r-- | src/msdos.c | 62 |
1 files changed, 33 insertions, 29 deletions
diff --git a/src/msdos.c b/src/msdos.c index fcbb4128b81..09bcba54639 100644 --- a/src/msdos.c +++ b/src/msdos.c | |||
| @@ -3041,12 +3041,13 @@ dos_ttcooked () | |||
| 3041 | file TEMPOUT and stderr to TEMPERR. */ | 3041 | file TEMPOUT and stderr to TEMPERR. */ |
| 3042 | 3042 | ||
| 3043 | int | 3043 | int |
| 3044 | run_msdos_command (argv, dir, tempin, tempout, temperr) | 3044 | run_msdos_command (argv, working_dir, tempin, tempout, temperr, envv) |
| 3045 | unsigned char **argv; | 3045 | unsigned char **argv; |
| 3046 | Lisp_Object dir; | 3046 | const char *working_dir; |
| 3047 | int tempin, tempout, temperr; | 3047 | int tempin, tempout, temperr; |
| 3048 | char **envv; | ||
| 3048 | { | 3049 | { |
| 3049 | char *saveargv1, *saveargv2, **envv, *lowcase_argv0, *pa, *pl; | 3050 | char *saveargv1, *saveargv2, *lowcase_argv0, *pa, *pl; |
| 3050 | char oldwd[MAXPATHLEN + 1]; /* Fixed size is safe on MSDOS. */ | 3051 | char oldwd[MAXPATHLEN + 1]; /* Fixed size is safe on MSDOS. */ |
| 3051 | int msshell, result = -1; | 3052 | int msshell, result = -1; |
| 3052 | int inbak, outbak, errbak; | 3053 | int inbak, outbak, errbak; |
| @@ -3091,29 +3092,7 @@ run_msdos_command (argv, dir, tempin, tempout, temperr) | |||
| 3091 | } | 3092 | } |
| 3092 | } | 3093 | } |
| 3093 | 3094 | ||
| 3094 | /* Build the environment array. */ | 3095 | chdir (working_dir); |
| 3095 | { | ||
| 3096 | extern Lisp_Object Vprocess_environment; | ||
| 3097 | Lisp_Object tmp, lst; | ||
| 3098 | int i, len; | ||
| 3099 | |||
| 3100 | lst = Vprocess_environment; | ||
| 3101 | len = XFASTINT (Flength (lst)); | ||
| 3102 | |||
| 3103 | envv = alloca ((len + 1) * sizeof (char *)); | ||
| 3104 | for (i = 0; i < len; i++) | ||
| 3105 | { | ||
| 3106 | tmp = Fcar (lst); | ||
| 3107 | lst = Fcdr (lst); | ||
| 3108 | CHECK_STRING (tmp, 0); | ||
| 3109 | envv[i] = alloca (XSTRING (tmp)->size + 1); | ||
| 3110 | strcpy (envv[i], XSTRING (tmp)->data); | ||
| 3111 | } | ||
| 3112 | envv[len] = (char *) 0; | ||
| 3113 | } | ||
| 3114 | |||
| 3115 | if (STRINGP (dir)) | ||
| 3116 | chdir (XSTRING (dir)->data); | ||
| 3117 | inbak = dup (0); | 3096 | inbak = dup (0); |
| 3118 | outbak = dup (1); | 3097 | outbak = dup (1); |
| 3119 | errbak = dup (2); | 3098 | errbak = dup (2); |
| @@ -3137,12 +3116,36 @@ run_msdos_command (argv, dir, tempin, tempout, temperr) | |||
| 3137 | cannot grok commands longer than 126 characters. In DJGPP v2 | 3116 | cannot grok commands longer than 126 characters. In DJGPP v2 |
| 3138 | and later, `system' is much smarter, so we'll call it instead. */ | 3117 | and later, `system' is much smarter, so we'll call it instead. */ |
| 3139 | 3118 | ||
| 3140 | extern char **environ; | 3119 | const char *cmnd; |
| 3141 | environ = envv; | ||
| 3142 | 3120 | ||
| 3143 | /* A shell gets a single argument--its full command | 3121 | /* A shell gets a single argument--its full command |
| 3144 | line--whose original was saved in `saveargv2'. */ | 3122 | line--whose original was saved in `saveargv2'. */ |
| 3145 | result = system (saveargv2); | 3123 | |
| 3124 | /* Don't let them pass empty command lines to `system', since | ||
| 3125 | with some shells it will try to invoke an interactive shell, | ||
| 3126 | which will hang Emacs. */ | ||
| 3127 | for (cmnd = saveargv2; *cmnd && isspace (*cmnd); cmnd++) | ||
| 3128 | ; | ||
| 3129 | if (*cmnd) | ||
| 3130 | { | ||
| 3131 | extern char **environ; | ||
| 3132 | int save_system_flags = __system_flags; | ||
| 3133 | |||
| 3134 | /* Request the most powerful version of `system'. We need | ||
| 3135 | all the help we can get to avoid calling stock DOS shells. */ | ||
| 3136 | __system_flags = (__system_redirect | ||
| 3137 | | __system_use_shell | ||
| 3138 | | __system_allow_multiple_cmds | ||
| 3139 | | __system_allow_long_cmds | ||
| 3140 | | __system_handle_null_commands | ||
| 3141 | | __system_emulate_chdir); | ||
| 3142 | |||
| 3143 | environ = envv; | ||
| 3144 | result = system (cmnd); | ||
| 3145 | __system_flags = save_system_flags; | ||
| 3146 | } | ||
| 3147 | else | ||
| 3148 | result = 0; /* emulate Unixy shell behavior with empty cmd line */ | ||
| 3146 | } | 3149 | } |
| 3147 | else | 3150 | else |
| 3148 | 3151 | ||
| @@ -3596,3 +3599,4 @@ nil means don't delete them until `list-processes' is run."); | |||
| 3596 | } | 3599 | } |
| 3597 | 3600 | ||
| 3598 | #endif /* MSDOS */ | 3601 | #endif /* MSDOS */ |
| 3602 | |||