annotate nt/cmdproxy.c @ 36150:46e59561af4c

Display Vars node renamed Display Custom. Include info there about customizing cursor appearance. Clean up aggressive scrolling. Clarify horizontal scrolling discussion. Fix index entries for line number mode.
author Richard M. Stallman <rms@gnu.org>
date Sat, 17 Feb 2001 16:45:37 +0000
parents 2bf5c4b2cc5a
children f6aff87320dd
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.
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
2 Copyright (C) 1997 Free Software Foundation, Inc.
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
3
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
4 Accepts subset of Unix sh(1) command-line options, for compatability
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
5 with elisp code written for Unix. When possible, executes external
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
6 programs directly (a common use of /bin/sh by Emacs), otherwise
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
7 invokes the user-specified command processor to handle built-in shell
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
8 commands, batch files and interactive mode.
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
9
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
10 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
11 way /bin/sh does, since the standard Windows command shells use the
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
12 convention that everything after "/c" (the Windows equivalent of
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
13 "-c") is the input string.
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
14
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
15 This file is part of GNU Emacs.
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
16
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
17 GNU Emacs is free software; you can redistribute it and/or modify
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
18 it under the terms of the GNU General Public License as published by
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
19 the Free Software Foundation; either version 2, or (at your option)
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
20 any later version.
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
21
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
22 GNU Emacs is distributed in the hope that it will be useful,
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
23 but WITHOUT ANY WARRANTY; without even the implied warranty of
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
24 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
25 GNU General Public License for more details.
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
26
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
27 You should have received a copy of the GNU General Public License
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
28 along with GNU Emacs; see the file COPYING. If not, write to
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
29 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
30 Boston, MA 02111-1307, USA. */
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
31
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
32 #include <windows.h>
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
33
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
34 #include <stdarg.h> /* va_args */
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
35 #include <malloc.h> /* alloca */
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
36 #include <stdlib.h> /* getenv */
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
37 #include <string.h> /* strlen */
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
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
40 /******* Mock C library routines *********************************/
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
41
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
42 /* These routines are used primarily to minimize the executable size. */
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
43
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
44 #define stdin GetStdHandle (STD_INPUT_HANDLE)
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
45 #define stdout GetStdHandle (STD_OUTPUT_HANDLE)
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
46 #define stderr GetStdHandle (STD_ERROR_HANDLE)
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
47
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
48 int
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
49 vfprintf(HANDLE hnd, char * msg, va_list args)
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
50 {
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
51 DWORD bytes_written;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
52 char buf[1024];
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
53
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
54 wvsprintf (buf, msg, args);
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
55 return WriteFile (hnd, buf, strlen (buf), &bytes_written, NULL);
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
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
58 int
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
59 fprintf(HANDLE hnd, char * msg, ...)
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
60 {
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
61 va_list args;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
62 int rc;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
63
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
64 va_start (args, msg);
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
65 rc = vfprintf (hnd, msg, args);
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
66 va_end (args);
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
67
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
68 return rc;
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
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
71 int
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
72 printf(char * msg, ...)
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
73 {
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
74 va_list args;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
75 int rc;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
76
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
77 va_start (args, msg);
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
78 rc = vfprintf (stdout, msg, args);
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
79 va_end (args);
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
80
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
81 return rc;
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
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
84 void
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
85 fail (char * msg, ...)
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
86 {
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
87 va_list args;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
88
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
89 va_start (args, msg);
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
90 vfprintf (stderr, msg, args);
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
91 va_end (args);
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
92
21598
235f717e6916 (fail): Exit with a negative return value.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19718
diff changeset
93 exit (-1);
19236
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
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
96 void
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
97 warn (char * msg, ...)
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
98 {
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
99 va_list args;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
100
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
101 va_start (args, msg);
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
102 vfprintf (stderr, msg, args);
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
103 va_end (args);
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
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
108 char *
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
109 canon_filename (char *fname)
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
110 {
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
111 char *p = fname;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
112
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
113 while (*p)
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
114 {
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
115 if (*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 p++;
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
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
120 return fname;
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
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
123 char *
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
124 skip_space (char *str)
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
125 {
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
126 while (isspace (*str)) str++;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
127 return str;
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
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
130 char *
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
131 skip_nonspace (char *str)
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
132 {
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
133 while (*str && !isspace (*str)) str++;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
134 return str;
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
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
137 int escape_char = '\\';
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
138
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
139 /* Get next token from input, advancing pointer. */
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
140 int
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
141 get_next_token (char * buf, char ** pSrc)
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
142 {
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
143 char * p = *pSrc;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
144 char * o = buf;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
145
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
146 p = skip_space (p);
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
147 if (*p == '"')
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
148 {
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
149 int escape_char_run = 0;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
150
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
151 /* Go through src until an ending quote is found, unescaping
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
152 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
153 special handling of multiple escape chars preceding a quote
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
154 char (ie. the reverse of what Emacs does to escape quotes). */
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
155 p++;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
156 while (1)
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
157 {
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
158 if (p[0] == escape_char && escape_char != '"')
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
159 {
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
160 escape_char_run++;
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. */
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
232 for (i = 0; i < n_exts; i++)
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
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
242 /* Return the absolute name of executable file PROG, including
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
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
274 if (GetCurrentDirectory (MAX_PATH, curdir) <= 0)
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. */
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
278 if (strpbrk (prog, "\\"))
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);
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
282 else
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 }
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
285
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;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
306 }
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
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
324
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 {
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
344 /* Both command.com and cmd.exe have the annoying behaviour of
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;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
386
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
19236
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
467 /* Although Emacs always sets argv[0] to an absolute pathname, we
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
468 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
469 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
470 caught out by mixed short and long names. */
d519b387b8a9 (main): Call GetShortPathName to normalize program
Andrew Innes <andrewi@gnu.org>
parents: 24439
diff changeset
471 GetShortPathName (modname, modname, sizeof (modname));
d519b387b8a9 (main): Call GetShortPathName to normalize program
Andrew Innes <andrewi@gnu.org>
parents: 24439
diff changeset
472 path[0] = '\0';
19236
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
473 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
474 || !GetShortPathName (path, path, sizeof (path))
19236
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
475 || stricmp (modname, path) != 0)
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
476 {
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
477 /* 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
478 command line to DOS app without change. */
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
479 /* TODO: fill in progname. */
23947
f01d27883cb1 (spawn): Pass directory for child as parameter.
Andrew Innes <andrewi@gnu.org>
parents: 23683
diff changeset
480 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
481 return rc;
235f717e6916 (fail): Exit with a negative return value.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19718
diff changeset
482 fail ("Could not run %s\n", GetCommandLine ());
19236
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
483 }
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
484
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
485 /* Process command line. If running interactively (-c or /c not
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
486 specified) then spawn a real command shell, passing it the command
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
487 line arguments.
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
488
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
489 If not running interactively, then attempt to execute the specified
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
490 command directly. If necessary, spawn a real shell to execute the
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
491 command.
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
492
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
493 */
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 progname = NULL;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
496 cmdline = NULL;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
497 /* If no args, spawn real shell for interactive use. */
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
498 need_shell = TRUE;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
499 interactive = TRUE;
19718
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
500 /* 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
501 amount of free space. */
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
502 envsize = get_env_size () + 300;
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
503 pass_through_args = (char **) alloca (argc * sizeof(char *));
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
504 num_pass_through_args = 0;
19236
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
505
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
506 while (--argc > 0)
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
507 {
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
508 ++argv;
19718
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
509 /* Act on switches we recognize (mostly single letter switches,
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
510 except for -e); all unrecognised switches and extra args are
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
511 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
512 interactive use, but allow for batch use as well). Accept / as
19236
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
513 switch char for compatability with cmd.exe. */
23374
0110032de8b3 (main): Treat command line options as case-insensitive.
Geoff Voelker <voelker@cs.washington.edu>
parents: 21733
diff changeset
514 if (((*argv)[0] == '-' || (*argv)[0] == '/') && (*argv)[1] != '\0')
19236
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
515 {
23374
0110032de8b3 (main): Treat command line options as case-insensitive.
Geoff Voelker <voelker@cs.washington.edu>
parents: 21733
diff changeset
516 if (((*argv)[1] == 'c' || (*argv)[1] == 'C') && ((*argv)[2] == '\0'))
19236
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
517 {
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
518 if (--argc == 0)
19718
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
519 fail ("error: expecting arg for %s\n", *argv);
19236
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
520 cmdline = *(++argv);
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
521 interactive = FALSE;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
522 }
23374
0110032de8b3 (main): Treat command line options as case-insensitive.
Geoff Voelker <voelker@cs.washington.edu>
parents: 21733
diff changeset
523 else if (((*argv)[1] == 'i' || (*argv)[1] == 'I') && ((*argv)[2] == '\0'))
19236
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
524 {
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
525 if (cmdline)
19718
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
526 warn ("warning: %s ignored because of -c\n", *argv);
19236
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
527 }
24555
2bf5c4b2cc5a cmdproxy.c (main): Fix parens.
Geoff Voelker <voelker@cs.washington.edu>
parents: 24516
diff changeset
528 else if (((*argv)[1] == 'e' || (*argv)[1] == 'E') && ((*argv)[2] == ':'))
19236
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
529 {
19718
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
530 int requested_envsize = atoi (*argv + 3);
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
531 /* Enforce a reasonable minimum size, as above. */
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
532 if (requested_envsize > envsize)
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
533 envsize = requested_envsize;
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
534 /* For sanity, enforce a reasonable maximum. */
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
535 if (envsize > 32768)
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
536 envsize = 32768;
19236
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
537 }
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
538 else
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
539 {
19718
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
540 /* warn ("warning: unknown option %s ignored", *argv); */
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
541 pass_through_args[num_pass_through_args++] = *argv;
19236
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
542 }
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 break;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
546 }
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
547
19718
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
548 #if 0
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
549 /* 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
550 (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
551 when -c was given. */
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
552
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
553 /* Collect any remaining args after (initial) switches. */
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
554 while (argc-- > 0)
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
555 {
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
556 pass_through_args[num_pass_through_args++] = *argv++;
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
557 }
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
558 #else
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
559 /* 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
560 if (argc > 0)
21733
a373669e1196 (main): Only set environment size for real shell, and
Geoff Voelker <voelker@cs.washington.edu>
parents: 21598
diff changeset
561 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
562 #endif
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 pass_through_args[num_pass_through_args] = NULL;
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
565
19236
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
566 /* 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
567 execute the command directly ourself. */
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
568 if (cmdline)
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
569 {
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
570 /* If no redirection or piping, and if program can be found, then
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
571 run program directly. Otherwise invoke a real shell. */
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
572
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
573 static char copout_chars[] = "|<>&";
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
574
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
575 if (strpbrk (cmdline, copout_chars) == NULL)
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
576 {
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
577 char *args;
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 /* The program name is the first token of cmdline. Since
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
580 filenames cannot legally contain embedded quotes, the value
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
581 of escape_char doesn't matter. */
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
582 args = cmdline;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
583 if (!get_next_token (path, &args))
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
584 fail ("error: no program name specified.\n");
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
585
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
586 canon_filename (path);
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
587 progname = make_absolute (path);
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
588
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
589 /* If we found the program, run it directly (if not found it
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
590 might be an internal shell command, so don't fail). */
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
591 if (progname != NULL)
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
592 need_shell = FALSE;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
593 }
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
21733
a373669e1196 (main): Only set environment size for real shell, and
Geoff Voelker <voelker@cs.washington.edu>
parents: 21598
diff changeset
596 pass_to_shell:
19236
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
597 if (need_shell)
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
598 {
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
599 char * p;
19718
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
600 int extra_arg_space = 0;
23683
cb300ad44b55 (main): Set environment size only when running
Geoff Voelker <voelker@cs.washington.edu>
parents: 23374
diff changeset
601 int run_command_dot_com;
19236
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
602
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
603 progname = getenv ("COMSPEC");
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
604 if (!progname)
19718
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
605 fail ("error: COMSPEC is not set\n");
19236
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
606
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
607 canon_filename (progname);
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
608 progname = make_absolute (progname);
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
609
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
610 if (progname == NULL || strchr (progname, '\\') == NULL)
19718
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
611 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
612
23683
cb300ad44b55 (main): Set environment size only when running
Geoff Voelker <voelker@cs.washington.edu>
parents: 23374
diff changeset
613 /* 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
614 run_command_dot_com =
cb300ad44b55 (main): Set environment size only when running
Geoff Voelker <voelker@cs.washington.edu>
parents: 23374
diff changeset
615 (stricmp (strrchr (progname, '\\'), "command.com") == 0);
cb300ad44b55 (main): Set environment size only when running
Geoff Voelker <voelker@cs.washington.edu>
parents: 23374
diff changeset
616
19718
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
617 /* 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
618 pass_through_args. */
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
619 for (argv = pass_through_args; *argv != NULL; ++argv)
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
620 /* 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
621 extra_arg_space += strlen (*argv) + 2;
19236
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
622
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
623 if (cmdline)
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
624 {
19718
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
625 char * buf;
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
626
19236
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
627 /* Convert to syntax expected by cmd.exe/command.com for
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
628 running non-interactively. Always quote program name in
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
629 case path contains spaces (fortunately it can't contain
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
630 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
631
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
632 buf = p = alloca (strlen (progname) + extra_arg_space +
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
633 strlen (cmdline) + 16);
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
634
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
635 /* Quote progname in case it contains spaces. */
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
636 p += wsprintf (p, "\"%s\"", progname);
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 /* 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
639 so should not need quoting. */
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
640 for (argv = pass_through_args; *argv != NULL; ++argv)
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
641 p += wsprintf (p, " %s", *argv);
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
642
23683
cb300ad44b55 (main): Set environment size only when running
Geoff Voelker <voelker@cs.washington.edu>
parents: 23374
diff changeset
643 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
644 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
645 else
a373669e1196 (main): Only set environment size for real shell, and
Geoff Voelker <voelker@cs.washington.edu>
parents: 21598
diff changeset
646 wsprintf(p, " /c %s", cmdline);
19718
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
647 cmdline = buf;
19236
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
648 }
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
649 else
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
650 {
23683
cb300ad44b55 (main): Set environment size only when running
Geoff Voelker <voelker@cs.washington.edu>
parents: 23374
diff changeset
651 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
652 {
a373669e1196 (main): Only set environment size for real shell, and
Geoff Voelker <voelker@cs.washington.edu>
parents: 21598
diff changeset
653 /* 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
654 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
655 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
656 (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
657 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
658 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
659 p = strrchr (path, '\\');
a373669e1196 (main): Only set environment size for real shell, and
Geoff Voelker <voelker@cs.washington.edu>
parents: 21598
diff changeset
660 /* 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
661 *(++p) = '\0';
a373669e1196 (main): Only set environment size for real shell, and
Geoff Voelker <voelker@cs.washington.edu>
parents: 21598
diff changeset
662 }
a373669e1196 (main): Only set environment size for real shell, and
Geoff Voelker <voelker@cs.washington.edu>
parents: 21598
diff changeset
663 else
a373669e1196 (main): Only set environment size for real shell, and
Geoff Voelker <voelker@cs.washington.edu>
parents: 21598
diff changeset
664 path[0] = '\0';
19236
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
665
19718
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
666 cmdline = p = alloca (strlen (progname) + extra_arg_space +
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
667 strlen (path) + 13);
19236
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
668
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
669 /* Quote progname in case it contains spaces. */
19718
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
670 p += wsprintf (p, "\"%s\" %s", progname, path);
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
671
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
672 /* 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
673 so should not need quoting. */
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
674 for (argv = pass_through_args; *argv != NULL; ++argv)
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
675 p += wsprintf (p, " %s", *argv);
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
676
23683
cb300ad44b55 (main): Set environment size only when running
Geoff Voelker <voelker@cs.washington.edu>
parents: 23374
diff changeset
677 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
678 wsprintf (p, " /e:%d", envsize);
19236
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
679 }
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
680 }
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
681
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
682 if (!progname)
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
683 fail ("Internal error: program name not defined\n");
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
684
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
685 if (!cmdline)
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
686 cmdline = progname;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
687
23947
f01d27883cb1 (spawn): Pass directory for child as parameter.
Andrew Innes <andrewi@gnu.org>
parents: 23683
diff changeset
688 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
689 return rc;
19236
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
690
21598
235f717e6916 (fail): Exit with a negative return value.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19718
diff changeset
691 if (!need_shell)
235f717e6916 (fail): Exit with a negative return value.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19718
diff changeset
692 {
235f717e6916 (fail): Exit with a negative return value.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19718
diff changeset
693 need_shell = TRUE;
235f717e6916 (fail): Exit with a negative return value.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19718
diff changeset
694 goto pass_to_shell;
235f717e6916 (fail): Exit with a negative return value.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19718
diff changeset
695 }
235f717e6916 (fail): Exit with a negative return value.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19718
diff changeset
696
235f717e6916 (fail): Exit with a negative return value.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19718
diff changeset
697 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
698
235f717e6916 (fail): Exit with a negative return value.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19718
diff changeset
699 return 0;
19236
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
700 }