annotate nt/cmdproxy.c @ 19971:a09889110d34

(with-pop, with-kerberos): Need to check Kerberos libraries in reverse order, so that libraries will appear in the correct dependency order on the link line (and so that the configure checks themselves will work properly when early libraries depend on later ones).
author Karl Heuer <kwzh@gnu.org>
date Wed, 24 Sep 1997 16:11:32 +0000
parents f645084cc96c
children 235f717e6916
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
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
93 exit (1);
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
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
369 int
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
370 spawn (char * progname, char * cmdline)
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
371 {
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
372 DWORD rc = 0xff;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
373 SECURITY_ATTRIBUTES sec_attrs;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
374 STARTUPINFO start;
19718
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
375 char * envblock = GetEnvironmentStrings ();
19236
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
376
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
377 sec_attrs.nLength = sizeof (sec_attrs);
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
378 sec_attrs.lpSecurityDescriptor = NULL;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
379 sec_attrs.bInheritHandle = FALSE;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
380
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
381 memset (&start, 0, sizeof (start));
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
382 start.cb = sizeof (start);
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
383
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
384 if (CreateProcess (progname, cmdline, &sec_attrs, NULL, TRUE,
19718
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
385 0, envblock, NULL, &start, &child))
19236
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 /* wait for completion and pass on return code */
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
388 WaitForSingleObject (child.hProcess, INFINITE);
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
389 GetExitCodeProcess (child.hProcess, &rc);
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
390 CloseHandle (child.hThread);
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
391 CloseHandle (child.hProcess);
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
392 child.hProcess = NULL;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
393 }
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
394
19718
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
395 FreeEnvironmentStrings (envblock);
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
396
19236
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
397 return (int) rc;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
398 }
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
399
19718
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
400 /* Return size of current environment block. */
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
401 int
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
402 get_env_size ()
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
403 {
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
404 char * start = GetEnvironmentStrings ();
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
405 char * tmp = start;
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
406
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
407 while (tmp[0] || tmp[1])
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
408 ++tmp;
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
409 FreeEnvironmentStrings (start);
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
410 return tmp + 2 - start;
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
19236
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
413 /******* Main program ********************************************/
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
414
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
415 int
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
416 main (int argc, char ** argv)
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
417 {
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
418 int rc;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
419 int need_shell;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
420 char * cmdline;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
421 char * progname;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
422 int envsize;
19718
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
423 char **pass_through_args;
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
424 int num_pass_through_args;
19236
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
425 char modname[MAX_PATH];
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
426 char path[MAX_PATH];
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
427
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
428
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
429 interactive = TRUE;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
430
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
431 SetConsoleCtrlHandler ((PHANDLER_ROUTINE) console_event_handler, TRUE);
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
432
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
433 /* 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
434 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
435 or in our role as a helper application for running DOS programs.
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
436 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
437 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
438 command line to CreateProcess. We know which case we are dealing
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
439 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
440 (This relies on an arcane feature of CreateProcess, where we can
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
441 specify cmdproxy as the module to run, but specify a different
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
442 program in the command line - the MSVC startup code sets argv[0]
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
443 from the command line.) */
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
444
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
445 if (!GetModuleFileName (NULL, modname, sizeof (modname)))
19718
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
446 fail ("error: GetModuleFileName failed\n");
19236
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
447
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
448 /* Although Emacs always sets argv[0] to an absolute pathname, we
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
449 might get run in other ways as well, so convert argv[0] to an
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
450 absolute name before comparing to the module name. */
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
451 if (!SearchPath (NULL, argv[0], ".exe", sizeof (path), path, &progname)
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
452 || stricmp (modname, path) != 0)
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
453 {
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
454 /* 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
455 command line to DOS app without change. */
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
456 /* TODO: fill in progname. */
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
457 return spawn (NULL, GetCommandLine ());
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
458 }
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
459
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
460 /* Process command line. If running interactively (-c or /c not
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
461 specified) then spawn a real command shell, passing it the command
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
462 line arguments.
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
463
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
464 If not running interactively, then attempt to execute the specified
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
465 command directly. If necessary, spawn a real shell to execute the
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
466 command.
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
467
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
468 */
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
469
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
470 progname = NULL;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
471 cmdline = NULL;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
472 /* If no args, spawn real shell for interactive use. */
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
473 need_shell = TRUE;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
474 interactive = TRUE;
19718
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
475 /* 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
476 amount of free space. */
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
477 envsize = get_env_size () + 300;
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
478 pass_through_args = (char **) alloca (argc * sizeof(char *));
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
479 num_pass_through_args = 0;
19236
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
480
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
481 while (--argc > 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 ++argv;
19718
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
484 /* 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
485 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
486 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
487 interactive use, but allow for batch use as well). Accept / as
19236
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
488 switch char for compatability with cmd.exe. */
19718
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
489 if ( ((*argv)[0] == '-' || (*argv)[0] == '/') && (*argv)[1] != '\0' )
19236
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 if ( ((*argv)[1] == 'c') && ((*argv)[2] == '\0') )
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 if (--argc == 0)
19718
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
494 fail ("error: expecting arg for %s\n", *argv);
19236
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
495 cmdline = *(++argv);
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
496 interactive = FALSE;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
497 }
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
498 else if ( ((*argv)[1] == 'i') && ((*argv)[2] == '\0') )
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 if (cmdline)
19718
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
501 warn ("warning: %s ignored because of -c\n", *argv);
19236
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
502 }
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
503 else if ( ((*argv)[1] == 'e') && ((*argv)[2] == ':') )
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
504 {
19718
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
505 int requested_envsize = atoi (*argv + 3);
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
506 /* Enforce a reasonable minimum size, as above. */
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
507 if (requested_envsize > envsize)
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
508 envsize = requested_envsize;
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
509 /* For sanity, enforce a reasonable maximum. */
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
510 if (envsize > 32768)
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
511 envsize = 32768;
19236
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
512 }
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
513 else
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
514 {
19718
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
515 /* warn ("warning: unknown option %s ignored", *argv); */
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
516 pass_through_args[num_pass_through_args++] = *argv;
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 }
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
519 else
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
520 break;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
521 }
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
522
19718
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
523 #if 0
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
524 /* 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
525 (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
526 when -c was given. */
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
527
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
528 /* Collect any remaining args after (initial) switches. */
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
529 while (argc-- > 0)
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
530 {
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
531 pass_through_args[num_pass_through_args++] = *argv++;
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
532 }
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
533 #else
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
534 /* 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
535 if (argc > 0)
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
536 warn ("warning: extra args ignored after %s\n", argv[-1]);
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
537 #endif
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
538
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
539 pass_through_args[num_pass_through_args] = NULL;
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
540
19236
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
541 /* 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
542 execute the command directly ourself. */
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
543 if (cmdline)
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
544 {
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
545 /* If no redirection or piping, and if program can be found, then
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
546 run program directly. Otherwise invoke a real shell. */
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
547
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
548 static char copout_chars[] = "|<>&";
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 if (strpbrk (cmdline, copout_chars) == NULL)
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
551 {
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
552 char *args;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
553
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
554 /* The program name is the first token of cmdline. Since
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
555 filenames cannot legally contain embedded quotes, the value
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
556 of escape_char doesn't matter. */
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
557 args = cmdline;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
558 if (!get_next_token (path, &args))
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
559 fail ("error: no program name specified.\n");
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
560
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
561 canon_filename (path);
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
562 progname = make_absolute (path);
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
563
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
564 /* If we found the program, run it directly (if not found it
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
565 might be an internal shell command, so don't fail). */
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
566 if (progname != NULL)
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
567 need_shell = FALSE;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
568 }
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
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
571 if (need_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 char * p;
19718
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
574 int extra_arg_space = 0;
19236
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 progname = getenv ("COMSPEC");
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
577 if (!progname)
19718
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
578 fail ("error: COMSPEC is not set\n");
19236
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
579
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
580 canon_filename (progname);
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
581 progname = make_absolute (progname);
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 if (progname == NULL || strchr (progname, '\\') == NULL)
19718
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
584 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
585
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
586 /* 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
587 pass_through_args. */
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
588 for (argv = pass_through_args; *argv != NULL; ++argv)
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
589 /* 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
590 extra_arg_space += strlen (*argv) + 2;
19236
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 if (cmdline)
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
593 {
19718
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
594 char * buf;
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
595
19236
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
596 /* Convert to syntax expected by cmd.exe/command.com for
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
597 running non-interactively. Always quote program name in
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
598 case path contains spaces (fortunately it can't contain
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
599 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
600
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
601 buf = p = alloca (strlen (progname) + extra_arg_space +
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
602 strlen (cmdline) + 16);
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
603
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
604 /* Quote progname in case it contains spaces. */
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
605 p += wsprintf (p, "\"%s\"", progname);
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
606
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
607 /* 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
608 so should not need quoting. */
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
609 for (argv = pass_through_args; *argv != NULL; ++argv)
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
610 p += wsprintf (p, " %s", *argv);
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
611
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
612 /* Always set environment size to something reasonable. */
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
613 wsprintf(p, " /e:%d /c %s", envsize, cmdline);
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
614 cmdline = buf;
19236
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 else
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
617 {
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
618 /* Provide dir arg expected by command.com when first started
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
619 interactively (the "command search path"). cmd.exe does
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
620 not require it, but accepts it silently - presumably other
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
621 DOS compatible shells do the same. To avoid potential
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
622 problems with spaces in command dir (which cannot be quoted
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
623 - command.com doesn't like it), we always use the 8.3 form. */
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
624 GetShortPathName (progname, path, sizeof (path));
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
625 p = strrchr (path, '\\');
19718
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
626 /* Trailing slash is acceptable, so always leave it. */
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
627 *(++p) = '\0';
19236
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
628
19718
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
629 cmdline = p = alloca (strlen (progname) + extra_arg_space +
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
630 strlen (path) + 13);
19236
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
631
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
632 /* Quote progname in case it contains spaces. */
19718
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
633 p += wsprintf (p, "\"%s\" %s", progname, path);
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 /* 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
636 so should not need quoting. */
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
637 for (argv = pass_through_args; *argv != NULL; ++argv)
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
638 p += wsprintf (p, " %s", *argv);
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
639
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
640 /* Always set environment size to something reasonable - again
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
641 cmd.exe ignores this silently. */
f645084cc96c (get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents: 19236
diff changeset
642 wsprintf (p, " /e:%d", envsize);
19236
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
643 }
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
644 }
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
645
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
646 if (!progname)
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
647 fail ("Internal error: program name not defined\n");
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 if (!cmdline)
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
650 cmdline = progname;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
651
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
652 rc = spawn (progname, cmdline);
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
653
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
654 return rc;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
655 }