annotate nt/cmdproxy.c @ 105832:56392d7b0ff4

(byte-compile-file-form-defvar) (byte-compile-file-form-define-abbrev-table) (byte-compile-file-form-custom-declare-variable) (byte-compile-variable-ref, byte-compile-defvar): Whether or not a warning is enabled should only affect whether we issue the warning, not whether or not we collect the relevant data. Eg warnings can be turned on and off throughout the course of a file.
author Glenn Morris <rgm@gnu.org>
date Tue, 03 Nov 2009 03:16:23 +0000
parents aeceb2460b39
children 1d1d5d9bd884
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
19236
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
1 /* Proxy shell designed for use with Emacs on Windows 95 and NT.
94795
188974bfdea0 Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents: 79730
diff changeset
2 Copyright (C) 1997, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
100954
aeceb2460b39 Add 2009 to copyright years.
Glenn Morris <rgm@gnu.org>
parents: 96460
diff changeset
3 2008, 2009 Free Software Foundation, Inc.
19236
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
4
96460
5220f9405507 Spelling fixes.
Glenn Morris <rgm@gnu.org>
parents: 96376
diff changeset
5 Accepts subset of Unix sh(1) command-line options, for compatibility
19236
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
6 with elisp code written for Unix. When possible, executes external
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
7 programs directly (a common use of /bin/sh by Emacs), otherwise
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
8 invokes the user-specified command processor to handle built-in shell
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
9 commands, batch files and interactive mode.
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
10
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
11 The main function is simply to process the "-c string" option in the
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
12 way /bin/sh does, since the standard Windows command shells use the
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
13 convention that everything after "/c" (the Windows equivalent of
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
14 "-c") is the input string.
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
15
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
16 This file is part of GNU Emacs.
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
17
94795
188974bfdea0 Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents: 79730
diff changeset
18 GNU Emacs is free software: you can redistribute it and/or modify
19236
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
19 it under the terms of the GNU General Public License as published by
94795
188974bfdea0 Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents: 79730
diff changeset
20 the Free Software Foundation, either version 3 of the License, or
188974bfdea0 Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents: 79730
diff changeset
21 (at your option) any later version.
19236
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
22
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
23 GNU Emacs is distributed in the hope that it will be useful,
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
24 but WITHOUT ANY WARRANTY; without even the implied warranty of
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
25 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
26 GNU General Public License for more details.
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
27
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
28 You should have received a copy of the GNU General Public License
94795
188974bfdea0 Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents: 79730
diff changeset
29 along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
19236
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
30
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
31 #include <windows.h>
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
32
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
33 #include <stdarg.h> /* va_args */
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
34 #include <malloc.h> /* alloca */
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
35 #include <stdlib.h> /* getenv */
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
36 #include <string.h> /* strlen */
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
37
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
38
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
39 /******* Mock C library routines *********************************/
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
40
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
41 /* These routines are used primarily to minimize the executable size. */
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
42
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
43 #define stdin GetStdHandle (STD_INPUT_HANDLE)
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
44 #define stdout GetStdHandle (STD_OUTPUT_HANDLE)
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
45 #define stderr GetStdHandle (STD_ERROR_HANDLE)
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
46
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
47 int
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
48 vfprintf(HANDLE hnd, char * msg, va_list args)
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
49 {
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
50 DWORD bytes_written;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
51 char buf[1024];
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
52
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
53 wvsprintf (buf, msg, args);
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
54 return WriteFile (hnd, buf, strlen (buf), &bytes_written, NULL);
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
55 }
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
56
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
57 int
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
58 fprintf(HANDLE hnd, char * msg, ...)
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
59 {
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
60 va_list args;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
61 int rc;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
62
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
63 va_start (args, msg);
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
64 rc = vfprintf (hnd, msg, args);
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
65 va_end (args);
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
66
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
67 return rc;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
68 }
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
69
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
70 int
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
71 printf(char * msg, ...)
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
72 {
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
73 va_list args;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
74 int rc;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
75
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
76 va_start (args, msg);
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
77 rc = vfprintf (stdout, msg, args);
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
78 va_end (args);
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
79
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
80 return rc;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
81 }
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
82
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
83 void
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
84 fail (char * msg, ...)
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
85 {
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
86 va_list args;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
87
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
88 va_start (args, msg);
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
89 vfprintf (stderr, msg, args);
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
90 va_end (args);
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
91
21598
235f717e6916 (fail): Exit with a negative return value.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19718
diff changeset
92 exit (-1);
19236
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
93 }
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
94
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
95 void
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
96 warn (char * msg, ...)
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
97 {
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
98 va_list args;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
99
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
100 va_start (args, msg);
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
101 vfprintf (stderr, msg, args);
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
102 va_end (args);
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
103 }
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
104
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
105 /******************************************************************/
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
106
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
107 char *
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
108 canon_filename (char *fname)
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
109 {
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
110 char *p = fname;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
111
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
112 while (*p)
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
113 {
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
114 if (*p == '/')
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
115 *p = '\\';
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
116 p++;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
117 }
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
118
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
119 return fname;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
120 }
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
121
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
122 char *
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
123 skip_space (char *str)
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
124 {
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
125 while (isspace (*str)) str++;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
126 return str;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
127 }
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
128
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
129 char *
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
130 skip_nonspace (char *str)
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
131 {
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
132 while (*str && !isspace (*str)) str++;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
133 return str;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
134 }
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
135
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
136 int escape_char = '\\';
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
137
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
138 /* Get next token from input, advancing pointer. */
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
139 int
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
140 get_next_token (char * buf, char ** pSrc)
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
141 {
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
142 char * p = *pSrc;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
143 char * o = buf;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
144
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
145 p = skip_space (p);
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
146 if (*p == '"')
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
147 {
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
148 int escape_char_run = 0;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
149
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
150 /* Go through src until an ending quote is found, unescaping
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
151 quotes along the way. If the escape char is not quote, then do
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
152 special handling of multiple escape chars preceding a quote
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
153 char (ie. the reverse of what Emacs does to escape quotes). */
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
154 p++;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
155 while (1)
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
156 {
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
157 if (p[0] == escape_char && escape_char != '"')
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
158 {
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
159 escape_char_run++;
36858
f6aff87320dd (get_next_token): Fix indefinite loop bug scanning
Andrew Innes <andrewi@gnu.org>
parents: 24555
diff changeset
160 p++;
19236
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
161 continue;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
162 }
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
163 else if (p[0] == '"')
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
164 {
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
165 while (escape_char_run > 1)
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
166 {
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
167 *o++ = escape_char;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
168 escape_char_run -= 2;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
169 }
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
170
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
171 if (escape_char_run > 0)
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
172 {
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
173 /* escaped quote */
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
174 *o++ = *p++;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
175 escape_char_run = 0;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
176 }
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
177 else if (p[1] == escape_char && escape_char == '"')
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
178 {
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
179 /* quote escaped by doubling */
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
180 *o++ = *p;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
181 p += 2;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
182 }
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
183 else
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
184 {
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
185 /* The ending quote. */
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
186 *o = '\0';
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
187 /* Leave input pointer after token. */
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
188 p++;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
189 break;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
190 }
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
191 }
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
192 else if (p[0] == '\0')
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
193 {
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
194 /* End of string, but no ending quote found. We might want to
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
195 flag this as an error, but for now will consider the end as
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
196 the end of the token. */
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
197 *o = '\0';
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
198 break;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
199 }
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
200 else
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
201 {
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
202 *o++ = *p++;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
203 }
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
204 }
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
205 }
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
206 else
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
207 {
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
208 /* Next token is delimited by whitespace. */
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
209 char * p1 = skip_nonspace (p);
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
210 memcpy (o, p, p1 - p);
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
211 o += (p1 - p);
19718
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
212 *o = '\0';
19236
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
213 p = p1;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
214 }
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
215
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
216 *pSrc = p;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
217
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
218 return o - buf;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
219 }
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
220
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
221 /* Search for EXEC file in DIR. If EXEC does not have an extension,
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
222 DIR is searched for EXEC with the standard extensions appended. */
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
223 int
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
224 search_dir (char *dir, char *exec, int bufsize, char *buffer)
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
225 {
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
226 char *exts[] = {".bat", ".cmd", ".exe", ".com"};
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
227 int n_exts = sizeof (exts) / sizeof (char *);
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
228 char *dummy;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
229 int i, rc;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
230
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
231 /* Search the directory for the program. */
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 36858
diff changeset
232 for (i = 0; i < n_exts; i++)
19236
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
233 {
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
234 rc = SearchPath (dir, exec, exts[i], bufsize, buffer, &dummy);
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
235 if (rc > 0)
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
236 return rc;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
237 }
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
238
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
239 return 0;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
240 }
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
241
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 36858
diff changeset
242 /* Return the absolute name of executable file PROG, including
19236
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
243 any file extensions. If an absolute name for PROG cannot be found,
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
244 return NULL. */
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
245 char *
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
246 make_absolute (char *prog)
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
247 {
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
248 char absname[MAX_PATH];
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
249 char dir[MAX_PATH];
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
250 char curdir[MAX_PATH];
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
251 char *p, *fname;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
252 char *path;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
253 int i;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
254
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
255 /* At least partial absolute path specified; search there. */
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
256 if ((isalpha (prog[0]) && prog[1] == ':') ||
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
257 (prog[0] == '\\'))
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
258 {
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
259 /* Split the directory from the filename. */
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
260 fname = strrchr (prog, '\\');
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
261 if (!fname)
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
262 /* Only a drive specifier is given. */
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
263 fname = prog + 2;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
264 strncpy (dir, prog, fname - prog);
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
265 dir[fname - prog] = '\0';
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
266
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
267 /* Search the directory for the program. */
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
268 if (search_dir (dir, prog, MAX_PATH, absname) > 0)
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
269 return strdup (absname);
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
270 else
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
271 return NULL;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
272 }
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
273
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 36858
diff changeset
274 if (GetCurrentDirectory (MAX_PATH, curdir) <= 0)
19236
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
275 return NULL;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
276
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
277 /* Relative path; search in current dir. */
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 36858
diff changeset
278 if (strpbrk (prog, "\\"))
19236
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
279 {
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
280 if (search_dir (curdir, prog, MAX_PATH, absname) > 0)
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
281 return strdup (absname);
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 36858
diff changeset
282 else
19236
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
283 return NULL;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
284 }
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 36858
diff changeset
285
19236
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
286 /* Just filename; search current directory then PATH. */
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
287 path = alloca (strlen (getenv ("PATH")) + strlen (curdir) + 2);
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
288 strcpy (path, curdir);
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
289 strcat (path, ";");
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
290 strcat (path, getenv ("PATH"));
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
291
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
292 while (*path)
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
293 {
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
294 /* Get next directory from path. */
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
295 p = path;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
296 while (*p && *p != ';') p++;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
297 strncpy (dir, path, p - path);
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
298 dir[p - path] = '\0';
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
299
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
300 /* Search the directory for the program. */
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
301 if (search_dir (dir, prog, MAX_PATH, absname) > 0)
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
302 return strdup (absname);
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
303
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
304 /* Move to the next directory. */
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
305 path = p + 1;
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 36858
diff changeset
306 }
19236
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
307
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
308 return NULL;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
309 }
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
310
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
311 /*****************************************************************/
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
312
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
313 #if 0
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
314 char ** _argv;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
315 int _argc;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
316
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
317 /* Parse commandline into argv array, allowing proper quoting of args. */
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
318 void
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
319 setup_argv (void)
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
320 {
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
321 char * cmdline = GetCommandLine ();
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
322 int arg_bytes = 0;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
323
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 36858
diff changeset
324
19236
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
325 }
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
326 #endif
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
327
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
328 /* Information about child proc is global, to allow for automatic
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
329 termination when interrupted. At the moment, only one child process
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
330 can be running at any one time. */
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
331
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
332 PROCESS_INFORMATION child;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
333 int interactive = TRUE;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
334
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
335 BOOL
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
336 console_event_handler (DWORD event)
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
337 {
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
338 switch (event)
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
339 {
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
340 case CTRL_C_EVENT:
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
341 case CTRL_BREAK_EVENT:
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
342 if (!interactive)
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
343 {
96376
c3309dba6542 American English spelling fix.
Glenn Morris <rgm@gnu.org>
parents: 94795
diff changeset
344 /* Both command.com and cmd.exe have the annoying behavior of
19236
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
345 prompting "Terminate batch job (y/n)?" when interrupted
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
346 while running a batch file, even if running in
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
347 non-interactive (-c) mode. Try to make up for this
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
348 deficiency by forcibly terminating the subprocess if
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
349 running non-interactively. */
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
350 if (child.hProcess &&
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
351 WaitForSingleObject (child.hProcess, 500) != WAIT_OBJECT_0)
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
352 TerminateProcess (child.hProcess, 0);
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
353 exit (STATUS_CONTROL_C_EXIT);
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
354 }
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
355 break;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
356
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
357 #if 0
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
358 default:
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
359 /* CLOSE, LOGOFF and SHUTDOWN events - actually we don't get these
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
360 under Windows 95. */
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
361 fail ("cmdproxy: received %d event\n", event);
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
362 if (child.hProcess)
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
363 TerminateProcess (child.hProcess, 0);
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
364 #endif
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
365 }
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
366 return TRUE;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
367 }
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
368
21598
235f717e6916 (fail): Exit with a negative return value.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19718
diff changeset
369 /* Change from normal usage; return value indicates whether spawn
235f717e6916 (fail): Exit with a negative return value.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19718
diff changeset
370 succeeded or failed - program return code is returned separately. */
19236
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
371 int
23947
f01d27883cb1 (spawn): Pass directory for child as parameter.
Andrew Innes <andrewi@gnu.org>
parents: 23683
diff changeset
372 spawn (char * progname, char * cmdline, char * dir, int * retcode)
19236
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
373 {
21598
235f717e6916 (fail): Exit with a negative return value.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19718
diff changeset
374 BOOL success = FALSE;
19236
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
375 SECURITY_ATTRIBUTES sec_attrs;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
376 STARTUPINFO start;
21598
235f717e6916 (fail): Exit with a negative return value.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19718
diff changeset
377 /* In theory, passing NULL for the environment block to CreateProcess
235f717e6916 (fail): Exit with a negative return value.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19718
diff changeset
378 is the same as passing the value of GetEnvironmentStrings, but
235f717e6916 (fail): Exit with a negative return value.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19718
diff changeset
379 doing this explicitly seems to cure problems running DOS programs
235f717e6916 (fail): Exit with a negative return value.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19718
diff changeset
380 in some cases. */
19718
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
381 char * envblock = GetEnvironmentStrings ();
19236
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
382
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
383 sec_attrs.nLength = sizeof (sec_attrs);
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
384 sec_attrs.lpSecurityDescriptor = NULL;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
385 sec_attrs.bInheritHandle = FALSE;
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 36858
diff changeset
386
19236
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
387 memset (&start, 0, sizeof (start));
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
388 start.cb = sizeof (start);
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
389
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
390 if (CreateProcess (progname, cmdline, &sec_attrs, NULL, TRUE,
23947
f01d27883cb1 (spawn): Pass directory for child as parameter.
Andrew Innes <andrewi@gnu.org>
parents: 23683
diff changeset
391 0, envblock, dir, &start, &child))
19236
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
392 {
21598
235f717e6916 (fail): Exit with a negative return value.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19718
diff changeset
393 success = TRUE;
19236
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
394 /* wait for completion and pass on return code */
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
395 WaitForSingleObject (child.hProcess, INFINITE);
21598
235f717e6916 (fail): Exit with a negative return value.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19718
diff changeset
396 if (retcode)
235f717e6916 (fail): Exit with a negative return value.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19718
diff changeset
397 GetExitCodeProcess (child.hProcess, (DWORD *)retcode);
19236
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
398 CloseHandle (child.hThread);
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
399 CloseHandle (child.hProcess);
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
400 child.hProcess = NULL;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
401 }
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
402
19718
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
403 FreeEnvironmentStrings (envblock);
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
404
21598
235f717e6916 (fail): Exit with a negative return value.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19718
diff changeset
405 return success;
19236
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
406 }
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
407
19718
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
408 /* Return size of current environment block. */
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
409 int
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
410 get_env_size ()
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
411 {
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
412 char * start = GetEnvironmentStrings ();
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
413 char * tmp = start;
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
414
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
415 while (tmp[0] || tmp[1])
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
416 ++tmp;
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
417 FreeEnvironmentStrings (start);
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
418 return tmp + 2 - start;
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
419 }
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
420
19236
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
421 /******* Main program ********************************************/
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
422
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
423 int
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
424 main (int argc, char ** argv)
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
425 {
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
426 int rc;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
427 int need_shell;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
428 char * cmdline;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
429 char * progname;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
430 int envsize;
19718
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
431 char **pass_through_args;
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
432 int num_pass_through_args;
19236
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
433 char modname[MAX_PATH];
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
434 char path[MAX_PATH];
23947
f01d27883cb1 (spawn): Pass directory for child as parameter.
Andrew Innes <andrewi@gnu.org>
parents: 23683
diff changeset
435 char dir[MAX_PATH];
19236
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
436
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
437
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
438 interactive = TRUE;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
439
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
440 SetConsoleCtrlHandler ((PHANDLER_ROUTINE) console_event_handler, TRUE);
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
441
23947
f01d27883cb1 (spawn): Pass directory for child as parameter.
Andrew Innes <andrewi@gnu.org>
parents: 23683
diff changeset
442 if (!GetCurrentDirectory (sizeof (dir), dir))
f01d27883cb1 (spawn): Pass directory for child as parameter.
Andrew Innes <andrewi@gnu.org>
parents: 23683
diff changeset
443 fail ("error: GetCurrentDirectory failed\n");
f01d27883cb1 (spawn): Pass directory for child as parameter.
Andrew Innes <andrewi@gnu.org>
parents: 23683
diff changeset
444
19236
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
445 /* We serve double duty: we can be called either as a proxy for the
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
446 real shell (that is, because we are defined to be the user shell),
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
447 or in our role as a helper application for running DOS programs.
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
448 In the former case, we interpret the command line options as if we
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
449 were a Unix shell, but in the latter case we simply pass our
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
450 command line to CreateProcess. We know which case we are dealing
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
451 with by whether argv[0] refers to ourself or to some other program.
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
452 (This relies on an arcane feature of CreateProcess, where we can
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
453 specify cmdproxy as the module to run, but specify a different
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
454 program in the command line - the MSVC startup code sets argv[0]
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
455 from the command line.) */
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
456
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
457 if (!GetModuleFileName (NULL, modname, sizeof (modname)))
19718
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
458 fail ("error: GetModuleFileName failed\n");
19236
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
459
23947
f01d27883cb1 (spawn): Pass directory for child as parameter.
Andrew Innes <andrewi@gnu.org>
parents: 23683
diff changeset
460 /* Change directory to location of .exe so startup directory can be
f01d27883cb1 (spawn): Pass directory for child as parameter.
Andrew Innes <andrewi@gnu.org>
parents: 23683
diff changeset
461 deleted. */
f01d27883cb1 (spawn): Pass directory for child as parameter.
Andrew Innes <andrewi@gnu.org>
parents: 23683
diff changeset
462 progname = strrchr (modname, '\\');
f01d27883cb1 (spawn): Pass directory for child as parameter.
Andrew Innes <andrewi@gnu.org>
parents: 23683
diff changeset
463 *progname = '\0';
f01d27883cb1 (spawn): Pass directory for child as parameter.
Andrew Innes <andrewi@gnu.org>
parents: 23683
diff changeset
464 SetCurrentDirectory (modname);
f01d27883cb1 (spawn): Pass directory for child as parameter.
Andrew Innes <andrewi@gnu.org>
parents: 23683
diff changeset
465 *progname = '\\';
f01d27883cb1 (spawn): Pass directory for child as parameter.
Andrew Innes <andrewi@gnu.org>
parents: 23683
diff changeset
466
78049
732fd38363dd (main): Set console codepages to "ANSI".
Jason Rumney <jasonr@gnu.org>
parents: 75249
diff changeset
467 /* Due to problems with interaction between API functions that use "OEM"
732fd38363dd (main): Set console codepages to "ANSI".
Jason Rumney <jasonr@gnu.org>
parents: 75249
diff changeset
468 codepage vs API functions that use the "ANSI" codepage, we need to
732fd38363dd (main): Set console codepages to "ANSI".
Jason Rumney <jasonr@gnu.org>
parents: 75249
diff changeset
469 make things consistent by choosing one and sticking with it. */
732fd38363dd (main): Set console codepages to "ANSI".
Jason Rumney <jasonr@gnu.org>
parents: 75249
diff changeset
470 SetConsoleCP (GetACP());
732fd38363dd (main): Set console codepages to "ANSI".
Jason Rumney <jasonr@gnu.org>
parents: 75249
diff changeset
471 SetConsoleOutputCP (GetACP());
732fd38363dd (main): Set console codepages to "ANSI".
Jason Rumney <jasonr@gnu.org>
parents: 75249
diff changeset
472
19236
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
473 /* Although Emacs always sets argv[0] to an absolute pathname, we
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
474 might get run in other ways as well, so convert argv[0] to an
24516
d519b387b8a9 (main): Call GetShortPathName to normalize program
Andrew Innes <andrewi@gnu.org>
parents: 24439
diff changeset
475 absolute name before comparing to the module name. Don't get
d519b387b8a9 (main): Call GetShortPathName to normalize program
Andrew Innes <andrewi@gnu.org>
parents: 24439
diff changeset
476 caught out by mixed short and long names. */
d519b387b8a9 (main): Call GetShortPathName to normalize program
Andrew Innes <andrewi@gnu.org>
parents: 24439
diff changeset
477 GetShortPathName (modname, modname, sizeof (modname));
d519b387b8a9 (main): Call GetShortPathName to normalize program
Andrew Innes <andrewi@gnu.org>
parents: 24439
diff changeset
478 path[0] = '\0';
19236
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
479 if (!SearchPath (NULL, argv[0], ".exe", sizeof (path), path, &progname)
24516
d519b387b8a9 (main): Call GetShortPathName to normalize program
Andrew Innes <andrewi@gnu.org>
parents: 24439
diff changeset
480 || !GetShortPathName (path, path, sizeof (path))
19236
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
481 || stricmp (modname, path) != 0)
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
482 {
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
483 /* We are being used as a helper to run a DOS app; just pass
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
484 command line to DOS app without change. */
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
485 /* TODO: fill in progname. */
23947
f01d27883cb1 (spawn): Pass directory for child as parameter.
Andrew Innes <andrewi@gnu.org>
parents: 23683
diff changeset
486 if (spawn (NULL, GetCommandLine (), dir, &rc))
21598
235f717e6916 (fail): Exit with a negative return value.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19718
diff changeset
487 return rc;
235f717e6916 (fail): Exit with a negative return value.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19718
diff changeset
488 fail ("Could not run %s\n", GetCommandLine ());
19236
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
489 }
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
490
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
491 /* Process command line. If running interactively (-c or /c not
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
492 specified) then spawn a real command shell, passing it the command
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
493 line arguments.
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
494
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
495 If not running interactively, then attempt to execute the specified
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
496 command directly. If necessary, spawn a real shell to execute the
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
497 command.
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
498
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
499 */
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
500
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
501 progname = NULL;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
502 cmdline = NULL;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
503 /* If no args, spawn real shell for interactive use. */
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
504 need_shell = TRUE;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
505 interactive = TRUE;
19718
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
506 /* Ask command.com to create an environment block with a reasonable
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
507 amount of free space. */
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
508 envsize = get_env_size () + 300;
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
509 pass_through_args = (char **) alloca (argc * sizeof(char *));
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
510 num_pass_through_args = 0;
19236
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
511
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
512 while (--argc > 0)
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
513 {
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
514 ++argv;
19718
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
515 /* Act on switches we recognize (mostly single letter switches,
96460
5220f9405507 Spelling fixes.
Glenn Morris <rgm@gnu.org>
parents: 96376
diff changeset
516 except for -e); all unrecognized switches and extra args are
19718
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
517 passed on to real shell if used (only really of benefit for
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
518 interactive use, but allow for batch use as well). Accept / as
96460
5220f9405507 Spelling fixes.
Glenn Morris <rgm@gnu.org>
parents: 96376
diff changeset
519 switch char for compatibility with cmd.exe. */
23374
0110032de8b3 (main): Treat command line options as case-insensitive.
Geoff Voelker <voelker@cs.washington.edu>
parents: 21733
diff changeset
520 if (((*argv)[0] == '-' || (*argv)[0] == '/') && (*argv)[1] != '\0')
19236
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
521 {
23374
0110032de8b3 (main): Treat command line options as case-insensitive.
Geoff Voelker <voelker@cs.washington.edu>
parents: 21733
diff changeset
522 if (((*argv)[1] == 'c' || (*argv)[1] == 'C') && ((*argv)[2] == '\0'))
19236
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
523 {
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
524 if (--argc == 0)
19718
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
525 fail ("error: expecting arg for %s\n", *argv);
19236
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
526 cmdline = *(++argv);
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
527 interactive = FALSE;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
528 }
23374
0110032de8b3 (main): Treat command line options as case-insensitive.
Geoff Voelker <voelker@cs.washington.edu>
parents: 21733
diff changeset
529 else if (((*argv)[1] == 'i' || (*argv)[1] == 'I') && ((*argv)[2] == '\0'))
19236
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
530 {
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
531 if (cmdline)
19718
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
532 warn ("warning: %s ignored because of -c\n", *argv);
19236
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
533 }
24555
2bf5c4b2cc5a cmdproxy.c (main): Fix parens.
Geoff Voelker <voelker@cs.washington.edu>
parents: 24516
diff changeset
534 else if (((*argv)[1] == 'e' || (*argv)[1] == 'E') && ((*argv)[2] == ':'))
19236
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
535 {
19718
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
536 int requested_envsize = atoi (*argv + 3);
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
537 /* Enforce a reasonable minimum size, as above. */
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
538 if (requested_envsize > envsize)
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
539 envsize = requested_envsize;
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
540 /* For sanity, enforce a reasonable maximum. */
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
541 if (envsize > 32768)
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
542 envsize = 32768;
19236
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
543 }
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
544 else
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
545 {
19718
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
546 /* warn ("warning: unknown option %s ignored", *argv); */
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
547 pass_through_args[num_pass_through_args++] = *argv;
19236
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
548 }
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
549 }
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
550 else
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
551 break;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
552 }
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
553
19718
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
554 #if 0
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
555 /* I think this is probably not useful - cmd.exe ignores extra
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
556 (non-switch) args in interactive mode, and they cannot be passed on
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
557 when -c was given. */
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
558
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
559 /* Collect any remaining args after (initial) switches. */
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
560 while (argc-- > 0)
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
561 {
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
562 pass_through_args[num_pass_through_args++] = *argv++;
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
563 }
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
564 #else
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
565 /* Probably a mistake for there to be extra args; not fatal. */
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
566 if (argc > 0)
21733
a373669e1196 (main): Only set environment size for real shell, and
Geoff Voelker <voelker@cs.washington.edu>
parents: 21598
diff changeset
567 warn ("warning: extra args ignored after '%s'\n", argv[-1]);
19718
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
568 #endif
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
569
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
570 pass_through_args[num_pass_through_args] = NULL;
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
571
19236
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
572 /* If -c option, determine if we must spawn a real shell, or if we can
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
573 execute the command directly ourself. */
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
574 if (cmdline)
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
575 {
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
576 /* If no redirection or piping, and if program can be found, then
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
577 run program directly. Otherwise invoke a real shell. */
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
578
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
579 static char copout_chars[] = "|<>&";
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
580
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
581 if (strpbrk (cmdline, copout_chars) == NULL)
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
582 {
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
583 char *args;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
584
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
585 /* The program name is the first token of cmdline. Since
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
586 filenames cannot legally contain embedded quotes, the value
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
587 of escape_char doesn't matter. */
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
588 args = cmdline;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
589 if (!get_next_token (path, &args))
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
590 fail ("error: no program name specified.\n");
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
591
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
592 canon_filename (path);
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
593 progname = make_absolute (path);
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
594
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
595 /* If we found the program, run it directly (if not found it
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
596 might be an internal shell command, so don't fail). */
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
597 if (progname != NULL)
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
598 need_shell = FALSE;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
599 }
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
600 }
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
601
21733
a373669e1196 (main): Only set environment size for real shell, and
Geoff Voelker <voelker@cs.washington.edu>
parents: 21598
diff changeset
602 pass_to_shell:
19236
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
603 if (need_shell)
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
604 {
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
605 char * p;
19718
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
606 int extra_arg_space = 0;
23683
cb300ad44b55 (main): Set environment size only when running
Geoff Voelker <voelker@cs.washington.edu>
parents: 23374
diff changeset
607 int run_command_dot_com;
19236
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
608
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
609 progname = getenv ("COMSPEC");
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
610 if (!progname)
19718
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
611 fail ("error: COMSPEC is not set\n");
19236
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
612
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
613 canon_filename (progname);
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
614 progname = make_absolute (progname);
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
615
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
616 if (progname == NULL || strchr (progname, '\\') == NULL)
19718
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
617 fail ("error: the program %s could not be found.\n", getenv ("COMSPEC"));
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
618
23683
cb300ad44b55 (main): Set environment size only when running
Geoff Voelker <voelker@cs.washington.edu>
parents: 23374
diff changeset
619 /* Need to set environment size when running command.com. */
cb300ad44b55 (main): Set environment size only when running
Geoff Voelker <voelker@cs.washington.edu>
parents: 23374
diff changeset
620 run_command_dot_com =
cb300ad44b55 (main): Set environment size only when running
Geoff Voelker <voelker@cs.washington.edu>
parents: 23374
diff changeset
621 (stricmp (strrchr (progname, '\\'), "command.com") == 0);
cb300ad44b55 (main): Set environment size only when running
Geoff Voelker <voelker@cs.washington.edu>
parents: 23374
diff changeset
622
19718
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
623 /* Work out how much extra space is required for
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
624 pass_through_args. */
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
625 for (argv = pass_through_args; *argv != NULL; ++argv)
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
626 /* We don't expect to have to quote switches. */
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
627 extra_arg_space += strlen (*argv) + 2;
19236
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
628
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
629 if (cmdline)
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
630 {
19718
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
631 char * buf;
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
632
19236
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
633 /* Convert to syntax expected by cmd.exe/command.com for
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
634 running non-interactively. Always quote program name in
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
635 case path contains spaces (fortunately it can't contain
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
636 quotes, since they are illegal in path names). */
19718
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
637
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
638 buf = p = alloca (strlen (progname) + extra_arg_space +
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
639 strlen (cmdline) + 16);
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
640
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
641 /* Quote progname in case it contains spaces. */
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
642 p += wsprintf (p, "\"%s\"", progname);
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
643
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
644 /* Include pass_through_args verbatim; these are just switches
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
645 so should not need quoting. */
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
646 for (argv = pass_through_args; *argv != NULL; ++argv)
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
647 p += wsprintf (p, " %s", *argv);
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
648
23683
cb300ad44b55 (main): Set environment size only when running
Geoff Voelker <voelker@cs.washington.edu>
parents: 23374
diff changeset
649 if (run_command_dot_com)
21733
a373669e1196 (main): Only set environment size for real shell, and
Geoff Voelker <voelker@cs.washington.edu>
parents: 21598
diff changeset
650 wsprintf(p, " /e:%d /c %s", envsize, cmdline);
a373669e1196 (main): Only set environment size for real shell, and
Geoff Voelker <voelker@cs.washington.edu>
parents: 21598
diff changeset
651 else
a373669e1196 (main): Only set environment size for real shell, and
Geoff Voelker <voelker@cs.washington.edu>
parents: 21598
diff changeset
652 wsprintf(p, " /c %s", cmdline);
19718
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
653 cmdline = buf;
19236
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
654 }
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
655 else
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
656 {
23683
cb300ad44b55 (main): Set environment size only when running
Geoff Voelker <voelker@cs.washington.edu>
parents: 23374
diff changeset
657 if (run_command_dot_com)
21733
a373669e1196 (main): Only set environment size for real shell, and
Geoff Voelker <voelker@cs.washington.edu>
parents: 21598
diff changeset
658 {
a373669e1196 (main): Only set environment size for real shell, and
Geoff Voelker <voelker@cs.washington.edu>
parents: 21598
diff changeset
659 /* Provide dir arg expected by command.com when first
23683
cb300ad44b55 (main): Set environment size only when running
Geoff Voelker <voelker@cs.washington.edu>
parents: 23374
diff changeset
660 started interactively (the "command search path"). To
21733
a373669e1196 (main): Only set environment size for real shell, and
Geoff Voelker <voelker@cs.washington.edu>
parents: 21598
diff changeset
661 avoid potential problems with spaces in command dir
a373669e1196 (main): Only set environment size for real shell, and
Geoff Voelker <voelker@cs.washington.edu>
parents: 21598
diff changeset
662 (which cannot be quoted - command.com doesn't like it),
a373669e1196 (main): Only set environment size for real shell, and
Geoff Voelker <voelker@cs.washington.edu>
parents: 21598
diff changeset
663 we always use the 8.3 form. */
a373669e1196 (main): Only set environment size for real shell, and
Geoff Voelker <voelker@cs.washington.edu>
parents: 21598
diff changeset
664 GetShortPathName (progname, path, sizeof (path));
a373669e1196 (main): Only set environment size for real shell, and
Geoff Voelker <voelker@cs.washington.edu>
parents: 21598
diff changeset
665 p = strrchr (path, '\\');
a373669e1196 (main): Only set environment size for real shell, and
Geoff Voelker <voelker@cs.washington.edu>
parents: 21598
diff changeset
666 /* Trailing slash is acceptable, so always leave it. */
a373669e1196 (main): Only set environment size for real shell, and
Geoff Voelker <voelker@cs.washington.edu>
parents: 21598
diff changeset
667 *(++p) = '\0';
a373669e1196 (main): Only set environment size for real shell, and
Geoff Voelker <voelker@cs.washington.edu>
parents: 21598
diff changeset
668 }
a373669e1196 (main): Only set environment size for real shell, and
Geoff Voelker <voelker@cs.washington.edu>
parents: 21598
diff changeset
669 else
a373669e1196 (main): Only set environment size for real shell, and
Geoff Voelker <voelker@cs.washington.edu>
parents: 21598
diff changeset
670 path[0] = '\0';
19236
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
671
19718
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
672 cmdline = p = alloca (strlen (progname) + extra_arg_space +
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
673 strlen (path) + 13);
19236
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
674
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
675 /* Quote progname in case it contains spaces. */
19718
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
676 p += wsprintf (p, "\"%s\" %s", progname, path);
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
677
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
678 /* Include pass_through_args verbatim; these are just switches
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
679 so should not need quoting. */
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
680 for (argv = pass_through_args; *argv != NULL; ++argv)
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
681 p += wsprintf (p, " %s", *argv);
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
682
23683
cb300ad44b55 (main): Set environment size only when running
Geoff Voelker <voelker@cs.washington.edu>
parents: 23374
diff changeset
683 if (run_command_dot_com)
21733
a373669e1196 (main): Only set environment size for real shell, and
Geoff Voelker <voelker@cs.washington.edu>
parents: 21598
diff changeset
684 wsprintf (p, " /e:%d", envsize);
19236
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
685 }
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
686 }
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
687
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
688 if (!progname)
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
689 fail ("Internal error: program name not defined\n");
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
690
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
691 if (!cmdline)
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
692 cmdline = progname;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
693
23947
f01d27883cb1 (spawn): Pass directory for child as parameter.
Andrew Innes <andrewi@gnu.org>
parents: 23683
diff changeset
694 if (spawn (progname, cmdline, dir, &rc))
21598
235f717e6916 (fail): Exit with a negative return value.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19718
diff changeset
695 return rc;
19236
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
696
21598
235f717e6916 (fail): Exit with a negative return value.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19718
diff changeset
697 if (!need_shell)
235f717e6916 (fail): Exit with a negative return value.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19718
diff changeset
698 {
235f717e6916 (fail): Exit with a negative return value.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19718
diff changeset
699 need_shell = TRUE;
235f717e6916 (fail): Exit with a negative return value.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19718
diff changeset
700 goto pass_to_shell;
235f717e6916 (fail): Exit with a negative return value.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19718
diff changeset
701 }
235f717e6916 (fail): Exit with a negative return value.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19718
diff changeset
702
235f717e6916 (fail): Exit with a negative return value.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19718
diff changeset
703 fail ("Could not run %s\n", progname);
235f717e6916 (fail): Exit with a negative return value.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19718
diff changeset
704
235f717e6916 (fail): Exit with a negative return value.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19718
diff changeset
705 return 0;
19236
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
706 }
52401
695cf19ef79e Add arch taglines
Miles Bader <miles@gnu.org>
parents: 49600
diff changeset
707
695cf19ef79e Add arch taglines
Miles Bader <miles@gnu.org>
parents: 49600
diff changeset
708 /* arch-tag: 88678d93-07ac-4e2f-ad63-d4a740ca69ac
695cf19ef79e Add arch taglines
Miles Bader <miles@gnu.org>
parents: 49600
diff changeset
709 (do not change this comment) */