blob: 2d7ac9609a058bb3b83533ca134a8021d0212148 [file] [log] [blame]
Jari Aaltoccc6cda1996-12-23 17:02:34 +00001/* make_cmd.c -- Functions for making instances of the various
2 parser constructs. */
Jari Aalto726f6381996-08-26 18:22:31 +00003
Chet Ramey8868eda2020-12-06 15:51:17 -05004/* Copyright (C) 1989-2020 Free Software Foundation, Inc.
Jari Aalto726f6381996-08-26 18:22:31 +00005
Jari Aalto31859422009-01-12 13:36:28 +00006 This file is part of GNU Bash, the Bourne Again SHell.
Jari Aalto726f6381996-08-26 18:22:31 +00007
Jari Aalto31859422009-01-12 13:36:28 +00008 Bash is free software: you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation, either version 3 of the License, or
11 (at your option) any later version.
Jari Aalto726f6381996-08-26 18:22:31 +000012
Jari Aalto31859422009-01-12 13:36:28 +000013 Bash is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
Jari Aalto726f6381996-08-26 18:22:31 +000017
Jari Aalto31859422009-01-12 13:36:28 +000018 You should have received a copy of the GNU General Public License
19 along with Bash. If not, see <http://www.gnu.org/licenses/>.
20*/
Jari Aalto726f6381996-08-26 18:22:31 +000021
Jari Aaltoccc6cda1996-12-23 17:02:34 +000022#include "config.h"
23
Jari Aalto726f6381996-08-26 18:22:31 +000024#include <stdio.h>
25#include "bashtypes.h"
Jari Aaltob80f6442004-07-27 13:29:18 +000026#if !defined (_MINIX) && defined (HAVE_SYS_FILE_H)
Jari Aaltocce855b1998-04-17 19:52:44 +000027# include <sys/file.h>
28#endif
Jari Aalto726f6381996-08-26 18:22:31 +000029#include "filecntl.h"
30#include "bashansi.h"
Jari Aaltoccc6cda1996-12-23 17:02:34 +000031#if defined (HAVE_UNISTD_H)
32# include <unistd.h>
33#endif
34
Jari Aaltob80f6442004-07-27 13:29:18 +000035#include "bashintl.h"
36
Chet Rameyd233b482019-01-07 09:27:52 -050037#include "shell.h"
38#include "execute_cmd.h"
Chet Ramey00018032011-11-21 20:51:19 -050039#include "parser.h"
Jari Aalto726f6381996-08-26 18:22:31 +000040#include "flags.h"
Jari Aalto726f6381996-08-26 18:22:31 +000041#include "input.h"
Jari Aalto726f6381996-08-26 18:22:31 +000042
43#if defined (JOB_CONTROL)
44#include "jobs.h"
45#endif
46
Jari Aalto7117c2d2002-07-17 14:10:11 +000047#include "shmbutil.h"
48
Chet Rameya0c0a002016-09-15 16:59:08 -040049int here_doc_first_line = 0;
Jari Aaltobb706242000-03-17 21:46:59 +000050
Jari Aalto7117c2d2002-07-17 14:10:11 +000051/* Object caching */
52sh_obj_cache_t wdcache = {0, 0, 0};
53sh_obj_cache_t wlcache = {0, 0, 0};
54
Chet Rameya0c0a002016-09-15 16:59:08 -040055#define WDCACHESIZE 128
56#define WLCACHESIZE 128
Jari Aalto7117c2d2002-07-17 14:10:11 +000057
Chet Ramey8868eda2020-12-06 15:51:17 -050058static COMMAND *make_for_or_select PARAMS((enum command_type, WORD_DESC *, WORD_LIST *, COMMAND *, int));
Jari Aaltof73dda02001-11-13 17:56:06 +000059#if defined (ARITH_FOR_COMMAND)
Chet Ramey8868eda2020-12-06 15:51:17 -050060static WORD_LIST *make_arith_for_expr PARAMS((char *));
Jari Aaltof73dda02001-11-13 17:56:06 +000061#endif
Chet Ramey8868eda2020-12-06 15:51:17 -050062static COMMAND *make_until_or_while PARAMS((enum command_type, COMMAND *, COMMAND *));
Jari Aalto726f6381996-08-26 18:22:31 +000063
Jari Aalto7117c2d2002-07-17 14:10:11 +000064void
65cmd_init ()
66{
67 ocache_create (wdcache, WORD_DESC, WDCACHESIZE);
68 ocache_create (wlcache, WORD_LIST, WLCACHESIZE);
69}
70
Jari Aalto726f6381996-08-26 18:22:31 +000071WORD_DESC *
Jari Aalto95732b42005-12-07 14:08:12 +000072alloc_word_desc ()
73{
74 WORD_DESC *temp;
75
76 ocache_alloc (wdcache, WORD_DESC, temp);
77 temp->flags = 0;
78 temp->word = 0;
79 return temp;
80}
81
82WORD_DESC *
Jari Aaltoccc6cda1996-12-23 17:02:34 +000083make_bare_word (string)
Jari Aaltof73dda02001-11-13 17:56:06 +000084 const char *string;
Jari Aalto726f6381996-08-26 18:22:31 +000085{
86 WORD_DESC *temp;
Jari Aalto95732b42005-12-07 14:08:12 +000087
88 temp = alloc_word_desc ();
Jari Aalto7117c2d2002-07-17 14:10:11 +000089
Jari Aaltoccc6cda1996-12-23 17:02:34 +000090 if (*string)
91 temp->word = savestring (string);
92 else
Jari Aalto726f6381996-08-26 18:22:31 +000093 {
Jari Aaltof73dda02001-11-13 17:56:06 +000094 temp->word = (char *)xmalloc (1);
Jari Aaltoccc6cda1996-12-23 17:02:34 +000095 temp->word[0] = '\0';
Jari Aalto726f6381996-08-26 18:22:31 +000096 }
Jari Aaltoccc6cda1996-12-23 17:02:34 +000097
Jari Aalto726f6381996-08-26 18:22:31 +000098 return (temp);
99}
100
101WORD_DESC *
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000102make_word_flags (w, string)
103 WORD_DESC *w;
Jari Aaltof73dda02001-11-13 17:56:06 +0000104 const char *string;
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000105{
Jari Aalto7117c2d2002-07-17 14:10:11 +0000106 register int i;
107 size_t slen;
108 DECLARE_MBSTATE;
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000109
Jari Aalto7117c2d2002-07-17 14:10:11 +0000110 i = 0;
111 slen = strlen (string);
112 while (i < slen)
113 {
114 switch (string[i])
115 {
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000116 case '$':
117 w->flags |= W_HASDOLLAR;
118 break;
119 case '\\':
120 break; /* continue the loop */
121 case '\'':
122 case '`':
123 case '"':
124 w->flags |= W_QUOTED;
125 break;
Jari Aalto7117c2d2002-07-17 14:10:11 +0000126 }
127
128 ADVANCE_CHAR (string, slen, i);
129 }
130
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000131 return (w);
132}
133
134WORD_DESC *
135make_word (string)
Jari Aaltof73dda02001-11-13 17:56:06 +0000136 const char *string;
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000137{
138 WORD_DESC *temp;
139
140 temp = make_bare_word (string);
141 return (make_word_flags (temp, string));
142}
143
144WORD_DESC *
Jari Aalto726f6381996-08-26 18:22:31 +0000145make_word_from_token (token)
146 int token;
147{
148 char tokenizer[2];
149
150 tokenizer[0] = token;
151 tokenizer[1] = '\0';
152
153 return (make_word (tokenizer));
154}
155
156WORD_LIST *
Jari Aaltof73dda02001-11-13 17:56:06 +0000157make_word_list (word, wlink)
Jari Aalto726f6381996-08-26 18:22:31 +0000158 WORD_DESC *word;
Jari Aaltof73dda02001-11-13 17:56:06 +0000159 WORD_LIST *wlink;
Jari Aalto726f6381996-08-26 18:22:31 +0000160{
161 WORD_LIST *temp;
162
Jari Aalto7117c2d2002-07-17 14:10:11 +0000163 ocache_alloc (wlcache, WORD_LIST, temp);
Jari Aalto95732b42005-12-07 14:08:12 +0000164
Jari Aalto726f6381996-08-26 18:22:31 +0000165 temp->word = word;
Jari Aaltof73dda02001-11-13 17:56:06 +0000166 temp->next = wlink;
Jari Aalto726f6381996-08-26 18:22:31 +0000167 return (temp);
168}
169
Jari Aalto726f6381996-08-26 18:22:31 +0000170COMMAND *
171make_command (type, pointer)
172 enum command_type type;
173 SIMPLE_COM *pointer;
174{
175 COMMAND *temp;
176
177 temp = (COMMAND *)xmalloc (sizeof (COMMAND));
178 temp->type = type;
179 temp->value.Simple = pointer;
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000180 temp->value.Simple->flags = temp->flags = 0;
Jari Aalto726f6381996-08-26 18:22:31 +0000181 temp->redirects = (REDIRECT *)NULL;
182 return (temp);
183}
184
185COMMAND *
186command_connect (com1, com2, connector)
187 COMMAND *com1, *com2;
188 int connector;
189{
190 CONNECTION *temp;
191
192 temp = (CONNECTION *)xmalloc (sizeof (CONNECTION));
193 temp->connector = connector;
194 temp->first = com1;
195 temp->second = com2;
196 return (make_command (cm_connection, (SIMPLE_COM *)temp));
197}
198
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000199static COMMAND *
Jari Aaltob80f6442004-07-27 13:29:18 +0000200make_for_or_select (type, name, map_list, action, lineno)
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000201 enum command_type type;
202 WORD_DESC *name;
203 WORD_LIST *map_list;
204 COMMAND *action;
Jari Aaltob80f6442004-07-27 13:29:18 +0000205 int lineno;
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000206{
207 FOR_COM *temp;
208
209 temp = (FOR_COM *)xmalloc (sizeof (FOR_COM));
210 temp->flags = 0;
211 temp->name = name;
Jari Aaltob80f6442004-07-27 13:29:18 +0000212 temp->line = lineno;
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000213 temp->map_list = map_list;
214 temp->action = action;
215 return (make_command (type, (SIMPLE_COM *)temp));
216}
217
Jari Aalto726f6381996-08-26 18:22:31 +0000218COMMAND *
Jari Aaltob80f6442004-07-27 13:29:18 +0000219make_for_command (name, map_list, action, lineno)
Jari Aalto726f6381996-08-26 18:22:31 +0000220 WORD_DESC *name;
221 WORD_LIST *map_list;
222 COMMAND *action;
Jari Aaltob80f6442004-07-27 13:29:18 +0000223 int lineno;
Jari Aalto726f6381996-08-26 18:22:31 +0000224{
Jari Aaltob80f6442004-07-27 13:29:18 +0000225 return (make_for_or_select (cm_for, name, map_list, action, lineno));
Jari Aalto726f6381996-08-26 18:22:31 +0000226}
227
Jari Aalto726f6381996-08-26 18:22:31 +0000228COMMAND *
Jari Aaltob80f6442004-07-27 13:29:18 +0000229make_select_command (name, map_list, action, lineno)
Jari Aalto726f6381996-08-26 18:22:31 +0000230 WORD_DESC *name;
231 WORD_LIST *map_list;
232 COMMAND *action;
Jari Aaltob80f6442004-07-27 13:29:18 +0000233 int lineno;
Jari Aalto726f6381996-08-26 18:22:31 +0000234{
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000235#if defined (SELECT_COMMAND)
Jari Aaltob80f6442004-07-27 13:29:18 +0000236 return (make_for_or_select (cm_select, name, map_list, action, lineno));
Jari Aaltobb706242000-03-17 21:46:59 +0000237#else
Chet Ramey8868eda2020-12-06 15:51:17 -0500238 set_exit_status (2);
Jari Aaltobb706242000-03-17 21:46:59 +0000239 return ((COMMAND *)NULL);
Jari Aalto726f6381996-08-26 18:22:31 +0000240#endif
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000241}
Jari Aalto726f6381996-08-26 18:22:31 +0000242
Jari Aaltobb706242000-03-17 21:46:59 +0000243#if defined (ARITH_FOR_COMMAND)
244static WORD_LIST *
245make_arith_for_expr (s)
246 char *s;
247{
248 WORD_LIST *result;
Jari Aaltob80f6442004-07-27 13:29:18 +0000249 WORD_DESC *wd;
Jari Aaltobb706242000-03-17 21:46:59 +0000250
251 if (s == 0 || *s == '\0')
252 return ((WORD_LIST *)NULL);
Jari Aaltob80f6442004-07-27 13:29:18 +0000253 wd = make_word (s);
Jari Aalto95732b42005-12-07 14:08:12 +0000254 wd->flags |= W_NOGLOB|W_NOSPLIT|W_QUOTED|W_DQUOTE; /* no word splitting or globbing */
Chet Rameya0c0a002016-09-15 16:59:08 -0400255#if defined (PROCESS_SUBSTITUTION)
256 wd->flags |= W_NOPROCSUB; /* no process substitution */
257#endif
Jari Aaltob80f6442004-07-27 13:29:18 +0000258 result = make_word_list (wd, (WORD_LIST *)NULL);
Jari Aaltobb706242000-03-17 21:46:59 +0000259 return result;
260}
261#endif
262
Jari Aaltob80f6442004-07-27 13:29:18 +0000263/* Note that this function calls dispose_words on EXPRS, since it doesn't
264 use the word list directly. We free it here rather than at the caller
265 because no other function in this file requires that the caller free
266 any arguments. */
Jari Aaltobb706242000-03-17 21:46:59 +0000267COMMAND *
268make_arith_for_command (exprs, action, lineno)
269 WORD_LIST *exprs;
270 COMMAND *action;
271 int lineno;
272{
273#if defined (ARITH_FOR_COMMAND)
274 ARITH_FOR_COM *temp;
275 WORD_LIST *init, *test, *step;
276 char *s, *t, *start;
Chet Rameyac50fba2014-02-26 09:36:43 -0500277 int nsemi, i;
Jari Aaltobb706242000-03-17 21:46:59 +0000278
279 init = test = step = (WORD_LIST *)NULL;
280 /* Parse the string into the three component sub-expressions. */
281 start = t = s = exprs->word->word;
282 for (nsemi = 0; ;)
283 {
284 /* skip whitespace at the start of each sub-expression. */
285 while (whitespace (*s))
286 s++;
287 start = s;
288 /* skip to the semicolon or EOS */
Chet Rameya0c0a002016-09-15 16:59:08 -0400289 i = skip_to_delim (start, 0, ";", SD_NOJMP|SD_NOPROCSUB);
Chet Rameyac50fba2014-02-26 09:36:43 -0500290 s = start + i;
Jari Aaltobb706242000-03-17 21:46:59 +0000291
Chet Rameyac50fba2014-02-26 09:36:43 -0500292 t = (i > 0) ? substring (start, 0, i) : (char *)NULL;
Jari Aaltobb706242000-03-17 21:46:59 +0000293
294 nsemi++;
295 switch (nsemi)
296 {
297 case 1:
298 init = make_arith_for_expr (t);
299 break;
300 case 2:
301 test = make_arith_for_expr (t);
302 break;
303 case 3:
304 step = make_arith_for_expr (t);
305 break;
306 }
307
308 FREE (t);
309 if (*s == '\0')
Jari Aalto28ef6c32001-04-06 19:14:31 +0000310 break;
Jari Aaltobb706242000-03-17 21:46:59 +0000311 s++; /* skip over semicolon */
312 }
313
314 if (nsemi != 3)
315 {
316 if (nsemi < 3)
Jari Aaltob80f6442004-07-27 13:29:18 +0000317 parser_error (lineno, _("syntax error: arithmetic expression required"));
Jari Aaltobb706242000-03-17 21:46:59 +0000318 else
Jari Aaltob80f6442004-07-27 13:29:18 +0000319 parser_error (lineno, _("syntax error: `;' unexpected"));
320 parser_error (lineno, _("syntax error: `((%s))'"), exprs->word->word);
Chet Rameyac50fba2014-02-26 09:36:43 -0500321 free (init);
322 free (test);
323 free (step);
Chet Ramey8868eda2020-12-06 15:51:17 -0500324 set_exit_status (2);
Jari Aaltobb706242000-03-17 21:46:59 +0000325 return ((COMMAND *)NULL);
326 }
327
328 temp = (ARITH_FOR_COM *)xmalloc (sizeof (ARITH_FOR_COM));
329 temp->flags = 0;
330 temp->line = lineno;
331 temp->init = init ? init : make_arith_for_expr ("1");
332 temp->test = test ? test : make_arith_for_expr ("1");
333 temp->step = step ? step : make_arith_for_expr ("1");
334 temp->action = action;
335
Jari Aaltob80f6442004-07-27 13:29:18 +0000336 dispose_words (exprs);
Jari Aaltobb706242000-03-17 21:46:59 +0000337 return (make_command (cm_arith_for, (SIMPLE_COM *)temp));
338#else
Jari Aaltob80f6442004-07-27 13:29:18 +0000339 dispose_words (exprs);
Chet Ramey8868eda2020-12-06 15:51:17 -0500340 set_exit_status (2);
Jari Aaltobb706242000-03-17 21:46:59 +0000341 return ((COMMAND *)NULL);
342#endif /* ARITH_FOR_COMMAND */
343}
344
Jari Aalto726f6381996-08-26 18:22:31 +0000345COMMAND *
346make_group_command (command)
347 COMMAND *command;
348{
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000349 GROUP_COM *temp;
Jari Aalto726f6381996-08-26 18:22:31 +0000350
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000351 temp = (GROUP_COM *)xmalloc (sizeof (GROUP_COM));
Jari Aalto726f6381996-08-26 18:22:31 +0000352 temp->command = command;
353 return (make_command (cm_group, (SIMPLE_COM *)temp));
354}
355
356COMMAND *
Jari Aaltob80f6442004-07-27 13:29:18 +0000357make_case_command (word, clauses, lineno)
Jari Aalto726f6381996-08-26 18:22:31 +0000358 WORD_DESC *word;
359 PATTERN_LIST *clauses;
Jari Aalto95732b42005-12-07 14:08:12 +0000360 int lineno;
Jari Aalto726f6381996-08-26 18:22:31 +0000361{
362 CASE_COM *temp;
363
364 temp = (CASE_COM *)xmalloc (sizeof (CASE_COM));
365 temp->flags = 0;
Jari Aaltob80f6442004-07-27 13:29:18 +0000366 temp->line = lineno;
Jari Aalto726f6381996-08-26 18:22:31 +0000367 temp->word = word;
368 temp->clauses = REVERSE_LIST (clauses, PATTERN_LIST *);
369 return (make_command (cm_case, (SIMPLE_COM *)temp));
370}
371
372PATTERN_LIST *
373make_pattern_list (patterns, action)
374 WORD_LIST *patterns;
375 COMMAND *action;
376{
377 PATTERN_LIST *temp;
378
379 temp = (PATTERN_LIST *)xmalloc (sizeof (PATTERN_LIST));
380 temp->patterns = REVERSE_LIST (patterns, WORD_LIST *);
381 temp->action = action;
382 temp->next = NULL;
Jari Aalto95732b42005-12-07 14:08:12 +0000383 temp->flags = 0;
Jari Aalto726f6381996-08-26 18:22:31 +0000384 return (temp);
385}
386
387COMMAND *
388make_if_command (test, true_case, false_case)
389 COMMAND *test, *true_case, *false_case;
390{
391 IF_COM *temp;
392
393 temp = (IF_COM *)xmalloc (sizeof (IF_COM));
394 temp->flags = 0;
395 temp->test = test;
396 temp->true_case = true_case;
397 temp->false_case = false_case;
398 return (make_command (cm_if, (SIMPLE_COM *)temp));
399}
400
401static COMMAND *
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000402make_until_or_while (which, test, action)
Jari Aalto726f6381996-08-26 18:22:31 +0000403 enum command_type which;
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000404 COMMAND *test, *action;
Jari Aalto726f6381996-08-26 18:22:31 +0000405{
406 WHILE_COM *temp;
407
408 temp = (WHILE_COM *)xmalloc (sizeof (WHILE_COM));
409 temp->flags = 0;
410 temp->test = test;
411 temp->action = action;
412 return (make_command (which, (SIMPLE_COM *)temp));
413}
414
415COMMAND *
416make_while_command (test, action)
417 COMMAND *test, *action;
418{
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000419 return (make_until_or_while (cm_while, test, action));
Jari Aalto726f6381996-08-26 18:22:31 +0000420}
421
422COMMAND *
423make_until_command (test, action)
424 COMMAND *test, *action;
425{
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000426 return (make_until_or_while (cm_until, test, action));
Jari Aalto726f6381996-08-26 18:22:31 +0000427}
428
429COMMAND *
Jari Aaltocce855b1998-04-17 19:52:44 +0000430make_arith_command (exp)
431 WORD_LIST *exp;
432{
433#if defined (DPAREN_ARITHMETIC)
434 COMMAND *command;
435 ARITH_COM *temp;
436
437 command = (COMMAND *)xmalloc (sizeof (COMMAND));
438 command->value.Arith = temp = (ARITH_COM *)xmalloc (sizeof (ARITH_COM));
439
440 temp->flags = 0;
441 temp->line = line_number;
442 temp->exp = exp;
443
444 command->type = cm_arith;
445 command->redirects = (REDIRECT *)NULL;
446 command->flags = 0;
447
448 return (command);
449#else
Chet Ramey8868eda2020-12-06 15:51:17 -0500450 set_exit_status (2);
Jari Aaltocce855b1998-04-17 19:52:44 +0000451 return ((COMMAND *)NULL);
452#endif
453}
454
455#if defined (COND_COMMAND)
456struct cond_com *
457make_cond_node (type, op, left, right)
458 int type;
459 WORD_DESC *op;
460 struct cond_com *left, *right;
461{
462 COND_COM *temp;
463
464 temp = (COND_COM *)xmalloc (sizeof (COND_COM));
465 temp->flags = 0;
466 temp->line = line_number;
467 temp->type = type;
468 temp->op = op;
469 temp->left = left;
470 temp->right = right;
471
472 return (temp);
473}
474#endif
475
476COMMAND *
477make_cond_command (cond_node)
478 COND_COM *cond_node;
479{
480#if defined (COND_COMMAND)
481 COMMAND *command;
482
483 command = (COMMAND *)xmalloc (sizeof (COMMAND));
484 command->value.Cond = cond_node;
485
486 command->type = cm_cond;
487 command->redirects = (REDIRECT *)NULL;
488 command->flags = 0;
Jari Aaltob72432f1999-02-19 17:11:39 +0000489 command->line = cond_node ? cond_node->line : 0;
Jari Aaltocce855b1998-04-17 19:52:44 +0000490
491 return (command);
492#else
Chet Ramey8868eda2020-12-06 15:51:17 -0500493 set_exit_status (2);
Jari Aaltocce855b1998-04-17 19:52:44 +0000494 return ((COMMAND *)NULL);
495#endif
496}
497
498COMMAND *
Jari Aalto726f6381996-08-26 18:22:31 +0000499make_bare_simple_command ()
500{
501 COMMAND *command;
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000502 SIMPLE_COM *temp;
503
504 command = (COMMAND *)xmalloc (sizeof (COMMAND));
505 command->value.Simple = temp = (SIMPLE_COM *)xmalloc (sizeof (SIMPLE_COM));
Jari Aalto726f6381996-08-26 18:22:31 +0000506
507 temp->flags = 0;
508 temp->line = line_number;
509 temp->words = (WORD_LIST *)NULL;
510 temp->redirects = (REDIRECT *)NULL;
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000511
Jari Aalto726f6381996-08-26 18:22:31 +0000512 command->type = cm_simple;
513 command->redirects = (REDIRECT *)NULL;
514 command->flags = 0;
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000515
Jari Aalto726f6381996-08-26 18:22:31 +0000516 return (command);
517}
518
519/* Return a command which is the connection of the word or redirection
520 in ELEMENT, and the command * or NULL in COMMAND. */
521COMMAND *
522make_simple_command (element, command)
523 ELEMENT element;
524 COMMAND *command;
525{
526 /* If we are starting from scratch, then make the initial command
527 structure. Also note that we have to fill in all the slots, since
528 malloc doesn't return zeroed space. */
Chet Ramey00018032011-11-21 20:51:19 -0500529 if (command == 0)
530 {
531 command = make_bare_simple_command ();
532 parser_state |= PST_REDIRLIST;
533 }
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000534
Jari Aalto726f6381996-08-26 18:22:31 +0000535 if (element.word)
Chet Ramey00018032011-11-21 20:51:19 -0500536 {
537 command->value.Simple->words = make_word_list (element.word, command->value.Simple->words);
538 parser_state &= ~PST_REDIRLIST;
539 }
Jari Aaltob80f6442004-07-27 13:29:18 +0000540 else if (element.redirect)
Jari Aalto726f6381996-08-26 18:22:31 +0000541 {
542 REDIRECT *r = element.redirect;
543 /* Due to the way <> is implemented, there may be more than a single
544 redirection in element.redirect. We just follow the chain as far
545 as it goes, and hook onto the end. */
546 while (r->next)
547 r = r->next;
548 r->next = command->value.Simple->redirects;
549 command->value.Simple->redirects = element.redirect;
550 }
Chet Ramey00018032011-11-21 20:51:19 -0500551
Jari Aalto726f6381996-08-26 18:22:31 +0000552 return (command);
553}
554
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000555/* Because we are Bourne compatible, we read the input for this
556 << or <<- redirection now, from wherever input is coming from.
557 We store the input read into a WORD_DESC. Replace the text of
558 the redirectee.word with the new input text. If <<- is on,
559 then remove leading TABS from each line. */
Jari Aalto726f6381996-08-26 18:22:31 +0000560void
Jari Aalto31859422009-01-12 13:36:28 +0000561make_here_document (temp, lineno)
Jari Aalto726f6381996-08-26 18:22:31 +0000562 REDIRECT *temp;
Jari Aalto31859422009-01-12 13:36:28 +0000563 int lineno;
Jari Aalto726f6381996-08-26 18:22:31 +0000564{
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000565 int kill_leading, redir_len;
566 char *redir_word, *document, *full_line;
567 int document_index, document_size, delim_unquoted;
Jari Aalto726f6381996-08-26 18:22:31 +0000568
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000569 if (temp->instruction != r_deblank_reading_until &&
570 temp->instruction != r_reading_until)
Jari Aalto726f6381996-08-26 18:22:31 +0000571 {
Jari Aaltob80f6442004-07-27 13:29:18 +0000572 internal_error (_("make_here_document: bad instruction type %d"), temp->instruction);
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000573 return;
Jari Aalto726f6381996-08-26 18:22:31 +0000574 }
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000575
576 kill_leading = temp->instruction == r_deblank_reading_until;
577
578 document = (char *)NULL;
579 document_index = document_size = 0;
580
581 /* Quote removal is the only expansion performed on the delimiter
582 for here documents, making it an extremely special case. */
583 redir_word = string_quote_removal (temp->redirectee.filename->word, 0);
584
585 /* redirection_expand will return NULL if the expansion results in
586 multiple words or no words. Check for that here, and just abort
587 this here document if it does. */
588 if (redir_word)
589 redir_len = strlen (redir_word);
590 else
591 {
Jari Aaltof73dda02001-11-13 17:56:06 +0000592 temp->here_doc_eof = (char *)xmalloc (1);
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000593 temp->here_doc_eof[0] = '\0';
594 goto document_done;
595 }
596
597 free (temp->redirectee.filename->word);
598 temp->here_doc_eof = redir_word;
599
600 /* Read lines from wherever lines are coming from.
601 For each line read, if kill_leading, then kill the
602 leading tab characters.
603 If the line matches redir_word exactly, then we have
604 manufactured the document. Otherwise, add the line to the
605 list of lines in the document. */
606
607 /* If the here-document delimiter was quoted, the lines should
608 be read verbatim from the input. If it was not quoted, we
609 need to perform backslash-quoted newline removal. */
610 delim_unquoted = (temp->redirectee.filename->flags & W_QUOTED) == 0;
611 while (full_line = read_secondary_line (delim_unquoted))
612 {
613 register char *line;
614 int len;
615
Chet Rameya0c0a002016-09-15 16:59:08 -0400616 here_doc_first_line = 0;
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000617 line = full_line;
618 line_number++;
619
Jari Aalto06285672006-10-10 14:15:34 +0000620 /* If set -v is in effect, echo the line read. read_secondary_line/
621 read_a_line leaves the newline at the end, so don't print another. */
622 if (echo_input_at_read)
623 fprintf (stderr, "%s", line);
624
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000625 if (kill_leading && *line)
Jari Aalto28ef6c32001-04-06 19:14:31 +0000626 {
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000627 /* Hack: To be compatible with some Bourne shells, we
628 check the word before stripping the whitespace. This
629 is a hack, though. */
630 if (STREQN (line, redir_word, redir_len) && line[redir_len] == '\n')
631 goto document_done;
632
633 while (*line == '\t')
634 line++;
635 }
636
637 if (*line == 0)
Jari Aalto28ef6c32001-04-06 19:14:31 +0000638 continue;
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000639
640 if (STREQN (line, redir_word, redir_len) && line[redir_len] == '\n')
641 goto document_done;
642
643 len = strlen (line);
644 if (len + document_index >= document_size)
645 {
Jari Aaltobc4cd231998-07-23 14:37:54 +0000646 document_size = document_size ? 2 * (document_size + len) : len + 2;
Jari Aaltof73dda02001-11-13 17:56:06 +0000647 document = (char *)xrealloc (document, document_size);
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000648 }
649
650 /* len is guaranteed to be > 0 because of the check for line
651 being an empty string before the call to strlen. */
652 FASTCOPY (line, document + document_index, len);
653 document_index += len;
654 }
655
Jari Aalto31859422009-01-12 13:36:28 +0000656 if (full_line == 0)
657 internal_warning (_("here-document at line %d delimited by end-of-file (wanted `%s')"), lineno, redir_word);
658
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000659document_done:
660 if (document)
661 document[document_index] = '\0';
662 else
663 {
Jari Aaltof73dda02001-11-13 17:56:06 +0000664 document = (char *)xmalloc (1);
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000665 document[0] = '\0';
666 }
667 temp->redirectee.filename->word = document;
Chet Rameya0c0a002016-09-15 16:59:08 -0400668 here_doc_first_line = 0;
Jari Aalto726f6381996-08-26 18:22:31 +0000669}
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000670
671/* Generate a REDIRECT from SOURCE, DEST, and INSTRUCTION.
Jari Aalto726f6381996-08-26 18:22:31 +0000672 INSTRUCTION is the instruction type, SOURCE is a file descriptor,
673 and DEST is a file descriptor or a WORD_DESC *. */
674REDIRECT *
Chet Ramey00018032011-11-21 20:51:19 -0500675make_redirection (source, instruction, dest_and_filename, flags)
676 REDIRECTEE source;
Jari Aalto726f6381996-08-26 18:22:31 +0000677 enum r_instruction instruction;
678 REDIRECTEE dest_and_filename;
Chet Ramey00018032011-11-21 20:51:19 -0500679 int flags;
Jari Aalto726f6381996-08-26 18:22:31 +0000680{
Jari Aalto7117c2d2002-07-17 14:10:11 +0000681 REDIRECT *temp;
682 WORD_DESC *w;
683 int wlen;
684 intmax_t lfd;
685
686 temp = (REDIRECT *)xmalloc (sizeof (REDIRECT));
Jari Aalto726f6381996-08-26 18:22:31 +0000687
688 /* First do the common cases. */
689 temp->redirector = source;
690 temp->redirectee = dest_and_filename;
Chet Ramey13db5722014-10-02 22:50:19 -0400691 temp->here_doc_eof = 0;
Jari Aalto726f6381996-08-26 18:22:31 +0000692 temp->instruction = instruction;
693 temp->flags = 0;
Chet Ramey00018032011-11-21 20:51:19 -0500694 temp->rflags = flags;
Jari Aalto726f6381996-08-26 18:22:31 +0000695 temp->next = (REDIRECT *)NULL;
696
697 switch (instruction)
698 {
699
Jari Aaltod166f041997-06-05 14:59:13 +0000700 case r_output_direction: /* >foo */
701 case r_output_force: /* >| foo */
Jari Aalto31859422009-01-12 13:36:28 +0000702 case r_err_and_out: /* &>filename */
Jari Aalto726f6381996-08-26 18:22:31 +0000703 temp->flags = O_TRUNC | O_WRONLY | O_CREAT;
704 break;
705
Jari Aaltod166f041997-06-05 14:59:13 +0000706 case r_appending_to: /* >>foo */
Jari Aalto31859422009-01-12 13:36:28 +0000707 case r_append_err_and_out: /* &>> filename */
Jari Aalto726f6381996-08-26 18:22:31 +0000708 temp->flags = O_APPEND | O_WRONLY | O_CREAT;
709 break;
710
Jari Aaltod166f041997-06-05 14:59:13 +0000711 case r_input_direction: /* <foo */
712 case r_inputa_direction: /* foo & makes this. */
713 temp->flags = O_RDONLY;
Jari Aalto726f6381996-08-26 18:22:31 +0000714 break;
715
Jari Aaltod166f041997-06-05 14:59:13 +0000716 case r_input_output: /* <>foo */
717 temp->flags = O_RDWR | O_CREAT;
718 break;
719
720 case r_deblank_reading_until: /* <<-foo */
721 case r_reading_until: /* << foo */
Jari Aalto7117c2d2002-07-17 14:10:11 +0000722 case r_reading_string: /* <<< foo */
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000723 case r_close_this: /* <&- */
Jari Aalto726f6381996-08-26 18:22:31 +0000724 case r_duplicating_input: /* 1<&2 */
725 case r_duplicating_output: /* 1>&2 */
Jari Aalto7117c2d2002-07-17 14:10:11 +0000726 break;
727
728 /* the parser doesn't pass these. */
729 case r_move_input: /* 1<&2- */
730 case r_move_output: /* 1>&2- */
731 case r_move_input_word: /* 1<&$foo- */
732 case r_move_output_word: /* 1>&$foo- */
733 break;
734
735 /* The way the lexer works we have to do this here. */
Jari Aalto726f6381996-08-26 18:22:31 +0000736 case r_duplicating_input_word: /* 1<&$foo */
737 case r_duplicating_output_word: /* 1>&$foo */
Jari Aalto7117c2d2002-07-17 14:10:11 +0000738 w = dest_and_filename.filename;
739 wlen = strlen (w->word) - 1;
740 if (w->word[wlen] == '-') /* Yuck */
741 {
742 w->word[wlen] = '\0';
743 if (all_digits (w->word) && legal_number (w->word, &lfd) && lfd == (int)lfd)
744 {
745 dispose_word (w);
746 temp->instruction = (instruction == r_duplicating_input_word) ? r_move_input : r_move_output;
747 temp->redirectee.dest = lfd;
748 }
749 else
750 temp->instruction = (instruction == r_duplicating_input_word) ? r_move_input_word : r_move_output_word;
751 }
752
Jari Aalto726f6381996-08-26 18:22:31 +0000753 break;
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000754
Jari Aalto726f6381996-08-26 18:22:31 +0000755 default:
Jari Aaltob80f6442004-07-27 13:29:18 +0000756 programming_error (_("make_redirection: redirection instruction `%d' out of range"), instruction);
Jari Aalto726f6381996-08-26 18:22:31 +0000757 abort ();
758 break;
759 }
760 return (temp);
761}
762
763COMMAND *
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000764make_function_def (name, command, lineno, lstart)
Jari Aalto726f6381996-08-26 18:22:31 +0000765 WORD_DESC *name;
766 COMMAND *command;
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000767 int lineno, lstart;
Jari Aalto726f6381996-08-26 18:22:31 +0000768{
769 FUNCTION_DEF *temp;
Jari Aaltob80f6442004-07-27 13:29:18 +0000770#if defined (ARRAY_VARS)
771 SHELL_VAR *bash_source_v;
772 ARRAY *bash_source_a;
Jari Aaltob80f6442004-07-27 13:29:18 +0000773#endif
Jari Aalto726f6381996-08-26 18:22:31 +0000774
775 temp = (FUNCTION_DEF *)xmalloc (sizeof (FUNCTION_DEF));
776 temp->command = command;
777 temp->name = name;
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000778 temp->line = lineno;
Jari Aaltocce855b1998-04-17 19:52:44 +0000779 temp->flags = 0;
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000780 command->line = lstart;
Jari Aaltob80f6442004-07-27 13:29:18 +0000781
782 /* Information used primarily for debugging. */
783 temp->source_file = 0;
784#if defined (ARRAY_VARS)
785 GET_ARRAY_FROM_VAR ("BASH_SOURCE", bash_source_v, bash_source_a);
786 if (bash_source_a && array_num_elements (bash_source_a) > 0)
787 temp->source_file = array_reference (bash_source_a, 0);
788#endif
Chet Rameya0c0a002016-09-15 16:59:08 -0400789 /* Assume that shell functions without a source file before the shell is
790 initialized come from the environment. Otherwise default to "main"
791 (usually functions being defined interactively) */
792 if (temp->source_file == 0)
793 temp->source_file = shell_initialized ? "main" : "environment";
794
Jari Aalto31859422009-01-12 13:36:28 +0000795#if defined (DEBUGGER)
Chet Rameyd233b482019-01-07 09:27:52 -0500796 bind_function_def (name->word, temp, 0);
Jari Aalto31859422009-01-12 13:36:28 +0000797#endif
Jari Aaltob80f6442004-07-27 13:29:18 +0000798
Chet Rameyac50fba2014-02-26 09:36:43 -0500799 temp->source_file = temp->source_file ? savestring (temp->source_file) : 0;
Chet Rameya0c0a002016-09-15 16:59:08 -0400800
Jari Aalto726f6381996-08-26 18:22:31 +0000801 return (make_command (cm_function_def, (SIMPLE_COM *)temp));
802}
803
Jari Aaltobb706242000-03-17 21:46:59 +0000804COMMAND *
805make_subshell_command (command)
806 COMMAND *command;
807{
808 SUBSHELL_COM *temp;
809
810 temp = (SUBSHELL_COM *)xmalloc (sizeof (SUBSHELL_COM));
811 temp->command = command;
812 temp->flags = CMD_WANT_SUBSHELL;
Chet Rameyd233b482019-01-07 09:27:52 -0500813 temp->line = line_number;
Jari Aaltobb706242000-03-17 21:46:59 +0000814 return (make_command (cm_subshell, (SIMPLE_COM *)temp));
815}
816
Jari Aalto31859422009-01-12 13:36:28 +0000817COMMAND *
818make_coproc_command (name, command)
819 char *name;
820 COMMAND *command;
821{
822 COPROC_COM *temp;
823
824 temp = (COPROC_COM *)xmalloc (sizeof (COPROC_COM));
825 temp->name = savestring (name);
826 temp->command = command;
827 temp->flags = CMD_WANT_SUBSHELL|CMD_COPROC_SUBSHELL;
828 return (make_command (cm_coproc, (SIMPLE_COM *)temp));
829}
830
Jari Aalto726f6381996-08-26 18:22:31 +0000831/* Reverse the word list and redirection list in the simple command
832 has just been parsed. It seems simpler to do this here the one
833 time then by any other method that I can think of. */
834COMMAND *
835clean_simple_command (command)
836 COMMAND *command;
837{
838 if (command->type != cm_simple)
Jari Aaltob72432f1999-02-19 17:11:39 +0000839 command_error ("clean_simple_command", CMDERR_BADTYPE, command->type, 0);
Jari Aalto726f6381996-08-26 18:22:31 +0000840 else
841 {
842 command->value.Simple->words =
843 REVERSE_LIST (command->value.Simple->words, WORD_LIST *);
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000844 command->value.Simple->redirects =
Jari Aalto726f6381996-08-26 18:22:31 +0000845 REVERSE_LIST (command->value.Simple->redirects, REDIRECT *);
846 }
847
Chet Ramey00018032011-11-21 20:51:19 -0500848 parser_state &= ~PST_REDIRLIST;
Jari Aalto726f6381996-08-26 18:22:31 +0000849 return (command);
850}
851
Jari Aalto726f6381996-08-26 18:22:31 +0000852/* The Yacc grammar productions have a problem, in that they take a
853 list followed by an ampersand (`&') and do a simple command connection,
854 making the entire list effectively asynchronous, instead of just
855 the last command. This means that when the list is executed, all
856 the commands have stdin set to /dev/null when job control is not
857 active, instead of just the last. This is wrong, and needs fixing
858 up. This function takes the `&' and applies it to the last command
859 in the list. This is done only for lists connected by `;'; it makes
860 `;' bind `tighter' than `&'. */
861COMMAND *
862connect_async_list (command, command2, connector)
863 COMMAND *command, *command2;
864 int connector;
865{
866 COMMAND *t, *t1, *t2;
867
868 t1 = command;
869 t = command->value.Connection->second;
870
871 if (!t || (command->flags & CMD_WANT_SUBSHELL) ||
872 command->value.Connection->connector != ';')
873 {
874 t = command_connect (command, command2, connector);
875 return t;
876 }
877
878 /* This is just defensive programming. The Yacc precedence rules
879 will generally hand this function a command where t points directly
880 to the command we want (e.g. given a ; b ; c ; d &, t1 will point
881 to the `a ; b ; c' list and t will be the `d'). We only want to do
882 this if the list is not being executed as a unit in the background
883 with `( ... )', so we have to check for CMD_WANT_SUBSHELL. That's
884 the only way to tell. */
885 while (((t->flags & CMD_WANT_SUBSHELL) == 0) && t->type == cm_connection &&
886 t->value.Connection->connector == ';')
887 {
888 t1 = t;
889 t = t->value.Connection->second;
890 }
891 /* Now we have t pointing to the last command in the list, and
892 t1->value.Connection->second == t. */
893 t2 = command_connect (t, command2, connector);
894 t1->value.Connection->second = t2;
895 return command;
896}