annotate nt/cmdproxy.c @ 111154:2f8137628e61

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