annotate nt/cmdproxy.c @ 19424:3078878ae2d6

(primary-language): Variable deleted.
author Richard M. Stallman <rms@gnu.org>
date Tue, 19 Aug 1997 04:44:42 +0000
parents 9bfe8a6b9575
children f645084cc96c
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);
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
212 p = p1;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
213 }
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 *pSrc = p;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
216
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
217 return o - buf;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
218 }
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 /* 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
221 DIR is searched for EXEC with the standard extensions appended. */
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
222 int
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
223 search_dir (char *dir, char *exec, int bufsize, char *buffer)
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
224 {
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
225 char *exts[] = {".bat", ".cmd", ".exe", ".com"};
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
226 int n_exts = sizeof (exts) / sizeof (char *);
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
227 char *dummy;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
228 int i, rc;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
229
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
230 /* Search the directory for the program. */
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
231 for (i = 0; i < n_exts; i++)
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
232 {
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
233 rc = SearchPath (dir, exec, exts[i], bufsize, buffer, &dummy);
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
234 if (rc > 0)
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
235 return rc;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
236 }
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 return 0;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
239 }
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 /* Return the absolute name of executable file PROG, including
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
242 any file extensions. If an absolute name for PROG cannot be found,
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
243 return NULL. */
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
244 char *
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
245 make_absolute (char *prog)
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
246 {
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
247 char absname[MAX_PATH];
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
248 char dir[MAX_PATH];
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
249 char curdir[MAX_PATH];
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
250 char *p, *fname;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
251 char *path;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
252 int i;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
253
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
254 /* At least partial absolute path specified; search there. */
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
255 if ((isalpha (prog[0]) && prog[1] == ':') ||
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
256 (prog[0] == '\\'))
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
257 {
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
258 /* Split the directory from the filename. */
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
259 fname = strrchr (prog, '\\');
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
260 if (!fname)
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
261 /* Only a drive specifier is given. */
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
262 fname = prog + 2;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
263 strncpy (dir, prog, fname - prog);
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
264 dir[fname - prog] = '\0';
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
265
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
266 /* Search the directory for the program. */
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
267 if (search_dir (dir, prog, MAX_PATH, absname) > 0)
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
268 return strdup (absname);
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
269 else
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
270 return NULL;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
271 }
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 if (GetCurrentDirectory (MAX_PATH, curdir) <= 0)
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
274 return NULL;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
275
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
276 /* Relative path; search in current dir. */
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
277 if (strpbrk (prog, "\\"))
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
278 {
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
279 if (search_dir (curdir, prog, MAX_PATH, absname) > 0)
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
280 return strdup (absname);
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
281 else
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
282 return NULL;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
283 }
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 /* Just filename; search current directory then PATH. */
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
286 path = alloca (strlen (getenv ("PATH")) + strlen (curdir) + 2);
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
287 strcpy (path, curdir);
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
288 strcat (path, ";");
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
289 strcat (path, getenv ("PATH"));
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
290
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
291 while (*path)
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
292 {
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
293 /* Get next directory from path. */
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
294 p = path;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
295 while (*p && *p != ';') p++;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
296 strncpy (dir, path, p - path);
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
297 dir[p - path] = '\0';
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
298
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
299 /* Search the directory for the program. */
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
300 if (search_dir (dir, prog, MAX_PATH, absname) > 0)
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
301 return strdup (absname);
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
302
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
303 /* Move to the next directory. */
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
304 path = p + 1;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
305 }
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 return NULL;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
308 }
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 #if 0
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
313 char ** _argv;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
314 int _argc;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
315
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
316 /* Parse commandline into argv array, allowing proper quoting of args. */
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
317 void
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
318 setup_argv (void)
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
319 {
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
320 char * cmdline = GetCommandLine ();
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
321 int arg_bytes = 0;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
322
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 #endif
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
326
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
327 /* Information about child proc is global, to allow for automatic
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
328 termination when interrupted. At the moment, only one child process
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
329 can be running at any one time. */
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
330
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
331 PROCESS_INFORMATION child;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
332 int interactive = TRUE;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
333
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
334 BOOL
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
335 console_event_handler (DWORD event)
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
336 {
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
337 switch (event)
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
338 {
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
339 case CTRL_C_EVENT:
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
340 case CTRL_BREAK_EVENT:
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
341 if (!interactive)
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
342 {
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
343 /* Both command.com and cmd.exe have the annoying behaviour of
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
344 prompting "Terminate batch job (y/n)?" when interrupted
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
345 while running a batch file, even if running in
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
346 non-interactive (-c) mode. Try to make up for this
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
347 deficiency by forcibly terminating the subprocess if
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
348 running non-interactively. */
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
349 if (child.hProcess &&
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
350 WaitForSingleObject (child.hProcess, 500) != WAIT_OBJECT_0)
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
351 TerminateProcess (child.hProcess, 0);
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
352 exit (STATUS_CONTROL_C_EXIT);
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
353 }
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
354 break;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
355
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
356 #if 0
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
357 default:
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
358 /* CLOSE, LOGOFF and SHUTDOWN events - actually we don't get these
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
359 under Windows 95. */
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
360 fail ("cmdproxy: received %d event\n", event);
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
361 if (child.hProcess)
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
362 TerminateProcess (child.hProcess, 0);
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
363 #endif
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
364 }
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
365 return TRUE;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
366 }
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 int
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
369 spawn (char * progname, char * cmdline)
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
370 {
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
371 DWORD rc = 0xff;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
372 SECURITY_ATTRIBUTES sec_attrs;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
373 STARTUPINFO start;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
374
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
375 sec_attrs.nLength = sizeof (sec_attrs);
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
376 sec_attrs.lpSecurityDescriptor = NULL;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
377 sec_attrs.bInheritHandle = FALSE;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
378
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
379 memset (&start, 0, sizeof (start));
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
380 start.cb = sizeof (start);
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
381
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
382 if (CreateProcess (progname, cmdline, &sec_attrs, NULL, TRUE,
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
383 0, NULL, NULL, &start, &child))
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
384 {
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
385 /* wait for completion and pass on return code */
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
386 WaitForSingleObject (child.hProcess, INFINITE);
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
387 GetExitCodeProcess (child.hProcess, &rc);
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
388 CloseHandle (child.hThread);
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
389 CloseHandle (child.hProcess);
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
390 child.hProcess = NULL;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
391 }
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
392
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
393 return (int) rc;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
394 }
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
395
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
396 /******* Main program ********************************************/
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
397
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
398 int
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
399 main (int argc, char ** argv)
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
400 {
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
401 int rc;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
402 int need_shell;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
403 char * cmdline;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
404 char * progname;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
405 int envsize;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
406 char modname[MAX_PATH];
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
407 char path[MAX_PATH];
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
408
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
409
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
410 interactive = TRUE;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
411
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
412 SetConsoleCtrlHandler ((PHANDLER_ROUTINE) console_event_handler, TRUE);
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
413
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
414 /* 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
415 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
416 or in our role as a helper application for running DOS programs.
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
417 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
418 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
419 command line to CreateProcess. We know which case we are dealing
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
420 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
421 (This relies on an arcane feature of CreateProcess, where we can
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
422 specify cmdproxy as the module to run, but specify a different
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
423 program in the command line - the MSVC startup code sets argv[0]
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
424 from the command line.) */
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 if (!GetModuleFileName (NULL, modname, sizeof (modname)))
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
427 fail ("GetModuleFileName failed");
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 /* Although Emacs always sets argv[0] to an absolute pathname, we
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
430 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
431 absolute name before comparing to the module name. */
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
432 if (!SearchPath (NULL, argv[0], ".exe", sizeof (path), path, &progname)
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
433 || stricmp (modname, path) != 0)
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
434 {
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
435 /* 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
436 command line to DOS app without change. */
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
437 /* TODO: fill in progname. */
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
438 return spawn (NULL, GetCommandLine ());
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
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
441 /* Process command line. If running interactively (-c or /c not
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
442 specified) then spawn a real command shell, passing it the command
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
443 line arguments.
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 not running interactively, then attempt to execute the specified
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
446 command directly. If necessary, spawn a real shell to execute the
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
447 command.
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
448
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
449 */
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
450
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
451 progname = NULL;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
452 cmdline = NULL;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
453 /* If no args, spawn real shell for interactive use. */
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
454 need_shell = TRUE;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
455 interactive = TRUE;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
456 /* Ask for a reasonable size environment for command.com. */
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
457 envsize = 1024;
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 while (--argc > 0)
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
460 {
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
461 ++argv;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
462 /* Only support single letter switches (except for -e); allow / as
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
463 switch char for compatability with cmd.exe. */
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
464 if ( ((*argv)[0] == '-' || (*argv)[0] == '/')
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
465 && (*argv)[1] != '\0' && (*argv)[2] == '\0' )
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
466 {
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
467 if ( ((*argv)[1] == 'c') && ((*argv)[2] == '\0') )
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 if (--argc == 0)
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
470 fail ("error: expecting arg for %s", *argv);
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
471 cmdline = *(++argv);
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
472 interactive = FALSE;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
473 }
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
474 else if ( ((*argv)[1] == 'i') && ((*argv)[2] == '\0') )
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
475 {
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
476 if (cmdline)
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
477 warn ("warning: %s ignored because of -c", *argv);
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
478 }
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
479 else if ( ((*argv)[1] == 'e') && ((*argv)[2] == ':') )
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 envsize = atoi (*argv + 3);
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
482 /* Enforce a reasonable minimum size. */
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
483 if (envsize < 256)
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
484 envsize = 256;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
485 }
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
486 else
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
487 {
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
488 warn ("warning: unknown option %s ignored", *argv);
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
489 }
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
490 }
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
491 else
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
492 break;
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 /* 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
496 execute the command directly ourself. */
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
497 if (cmdline)
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
498 {
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
499 /* If no redirection or piping, and if program can be found, then
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
500 run program directly. Otherwise invoke a real shell. */
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
501
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
502 static char copout_chars[] = "|<>&";
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
503
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
504 if (strpbrk (cmdline, copout_chars) == NULL)
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 char *args;
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 /* The program name is the first token of cmdline. Since
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
509 filenames cannot legally contain embedded quotes, the value
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
510 of escape_char doesn't matter. */
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
511 args = cmdline;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
512 if (!get_next_token (path, &args))
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
513 fail ("error: no program name specified.\n");
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
514
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
515 canon_filename (path);
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
516 progname = make_absolute (path);
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 we found the program, run it directly (if not found it
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
519 might be an internal shell command, so don't fail). */
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
520 if (progname != NULL)
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
521 need_shell = FALSE;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
522 }
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
523 }
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
524
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
525 if (need_shell)
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
526 {
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
527 char * p;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
528
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
529 progname = getenv ("COMSPEC");
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
530 if (!progname)
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
531 fail ("error: COMSPEC is not set");
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
532
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
533 canon_filename (progname);
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
534 progname = make_absolute (progname);
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
535
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
536 if (progname == NULL || strchr (progname, '\\') == NULL)
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
537 fail ("make_absolute failed");
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
538
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
539 if (cmdline)
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
540 {
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
541 /* Convert to syntax expected by cmd.exe/command.com for
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
542 running non-interactively. Always quote program name in
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
543 case path contains spaces (fortunately it can't contain
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
544 quotes, since they are illegal in path names). */
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
545 wsprintf (p = alloca (strlen (cmdline) + strlen (progname) + 7),
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
546 "\"%s\" /c %s", progname, cmdline);
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
547 cmdline = p;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
548 }
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
549 else
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
550 {
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
551 /* Provide dir arg expected by command.com when first started
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
552 interactively (the "command search path"). cmd.exe does
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
553 not require it, but accepts it silently - presumably other
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
554 DOS compatible shells do the same. To avoid potential
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
555 problems with spaces in command dir (which cannot be quoted
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
556 - 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
557 GetShortPathName (progname, path, sizeof (path));
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
558 p = strrchr (path, '\\');
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
559 /* Trailing slash is acceptable. */
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
560 p++;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
561
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
562 /* Set environment size - again cmd.exe ignores this silently. */
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
563 wsprintf (p, " /e:%d", envsize);
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
564
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
565 /* Quote progname in case it contains spaces. */
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
566 wsprintf (cmdline = alloca (strlen (progname) + strlen (path) + 4),
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
567 "\"%s\" %s", progname, path);
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 (!progname)
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
572 fail ("Internal error: program name not defined\n");
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
573
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
574 if (!cmdline)
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
575 cmdline = progname;
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 rc = spawn (progname, cmdline);
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 return rc;
9bfe8a6b9575 Initial revision
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff changeset
580 }