1 /* make_cmd.c -- Functions for making instances of the various
4 /* Copyright (C) 1989-2009 Free Software Foundation, Inc.
6 This file is part of GNU Bash, the Bourne Again SHell.
8 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.
13 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.
18 You should have received a copy of the GNU General Public License
19 along with Bash. If not, see <http://www.gnu.org/licenses/>.
25 #include "bashtypes.h"
26 #if !defined (_MINIX) && defined (HAVE_SYS_FILE_H)
27 # include <sys/file.h>
31 #if defined (HAVE_UNISTD_H)
44 #include "dispose_cmd.h"
45 #include "variables.h"
51 #if defined (JOB_CONTROL)
57 extern int line_number
, current_command_line_count
, parser_state
;
58 extern int last_command_exit_value
;
61 sh_obj_cache_t wdcache
= {0, 0, 0};
62 sh_obj_cache_t wlcache
= {0, 0, 0};
64 #define WDCACHESIZE 60
65 #define WLCACHESIZE 60
67 static COMMAND
*make_for_or_select
__P((enum command_type
, WORD_DESC
*, WORD_LIST
*, COMMAND
*, int));
68 #if defined (ARITH_FOR_COMMAND)
69 static WORD_LIST
*make_arith_for_expr
__P((char *));
71 static COMMAND
*make_until_or_while
__P((enum command_type
, COMMAND
*, COMMAND
*));
76 ocache_create (wdcache
, WORD_DESC
, WDCACHESIZE
);
77 ocache_create (wlcache
, WORD_LIST
, WLCACHESIZE
);
85 ocache_alloc (wdcache
, WORD_DESC
, temp
);
92 make_bare_word (string
)
97 temp
= alloc_word_desc ();
100 temp
->word
= savestring (string
);
103 temp
->word
= (char *)xmalloc (1);
104 temp
->word
[0] = '\0';
111 make_word_flags (w
, string
)
120 slen
= strlen (string
);
126 w
->flags
|= W_HASDOLLAR
;
129 break; /* continue the loop */
133 w
->flags
|= W_QUOTED
;
137 ADVANCE_CHAR (string
, slen
, i
);
149 temp
= make_bare_word (string
);
150 return (make_word_flags (temp
, string
));
154 make_word_from_token (token
)
159 tokenizer
[0] = token
;
162 return (make_word (tokenizer
));
166 make_word_list (word
, wlink
)
172 ocache_alloc (wlcache
, WORD_LIST
, temp
);
180 make_command (type
, pointer
)
181 enum command_type type
;
186 temp
= (COMMAND
*)xmalloc (sizeof (COMMAND
));
188 temp
->value
.Simple
= pointer
;
189 temp
->value
.Simple
->flags
= temp
->flags
= 0;
190 temp
->redirects
= (REDIRECT
*)NULL
;
195 command_connect (com1
, com2
, connector
)
196 COMMAND
*com1
, *com2
;
201 temp
= (CONNECTION
*)xmalloc (sizeof (CONNECTION
));
202 temp
->connector
= connector
;
205 return (make_command (cm_connection
, (SIMPLE_COM
*)temp
));
209 make_for_or_select (type
, name
, map_list
, action
, lineno
)
210 enum command_type type
;
218 temp
= (FOR_COM
*)xmalloc (sizeof (FOR_COM
));
222 temp
->map_list
= map_list
;
223 temp
->action
= action
;
224 return (make_command (type
, (SIMPLE_COM
*)temp
));
228 make_for_command (name
, map_list
, action
, lineno
)
234 return (make_for_or_select (cm_for
, name
, map_list
, action
, lineno
));
238 make_select_command (name
, map_list
, action
, lineno
)
244 #if defined (SELECT_COMMAND)
245 return (make_for_or_select (cm_select
, name
, map_list
, action
, lineno
));
247 last_command_exit_value
= 2;
248 return ((COMMAND
*)NULL
);
252 #if defined (ARITH_FOR_COMMAND)
254 make_arith_for_expr (s
)
260 if (s
== 0 || *s
== '\0')
261 return ((WORD_LIST
*)NULL
);
263 wd
->flags
|= W_NOGLOB
|W_NOSPLIT
|W_QUOTED
|W_DQUOTE
; /* no word splitting or globbing */
264 result
= make_word_list (wd
, (WORD_LIST
*)NULL
);
269 /* Note that this function calls dispose_words on EXPRS, since it doesn't
270 use the word list directly. We free it here rather than at the caller
271 because no other function in this file requires that the caller free
274 make_arith_for_command (exprs
, action
, lineno
)
279 #if defined (ARITH_FOR_COMMAND)
281 WORD_LIST
*init
, *test
, *step
;
285 init
= test
= step
= (WORD_LIST
*)NULL
;
286 /* Parse the string into the three component sub-expressions. */
287 start
= t
= s
= exprs
->word
->word
;
290 /* skip whitespace at the start of each sub-expression. */
291 while (whitespace (*s
))
294 /* skip to the semicolon or EOS */
295 while (*s
&& *s
!= ';')
298 t
= (s
> start
) ? substring (start
, 0, s
- start
) : (char *)NULL
;
304 init
= make_arith_for_expr (t
);
307 test
= make_arith_for_expr (t
);
310 step
= make_arith_for_expr (t
);
317 s
++; /* skip over semicolon */
323 parser_error (lineno
, _("syntax error: arithmetic expression required"));
325 parser_error (lineno
, _("syntax error: `;' unexpected"));
326 parser_error (lineno
, _("syntax error: `((%s))'"), exprs
->word
->word
);
327 last_command_exit_value
= 2;
328 return ((COMMAND
*)NULL
);
331 temp
= (ARITH_FOR_COM
*)xmalloc (sizeof (ARITH_FOR_COM
));
334 temp
->init
= init
? init
: make_arith_for_expr ("1");
335 temp
->test
= test
? test
: make_arith_for_expr ("1");
336 temp
->step
= step
? step
: make_arith_for_expr ("1");
337 temp
->action
= action
;
339 dispose_words (exprs
);
340 return (make_command (cm_arith_for
, (SIMPLE_COM
*)temp
));
342 dispose_words (exprs
);
343 last_command_exit_value
= 2;
344 return ((COMMAND
*)NULL
);
345 #endif /* ARITH_FOR_COMMAND */
349 make_group_command (command
)
354 temp
= (GROUP_COM
*)xmalloc (sizeof (GROUP_COM
));
355 temp
->command
= command
;
356 return (make_command (cm_group
, (SIMPLE_COM
*)temp
));
360 make_case_command (word
, clauses
, lineno
)
362 PATTERN_LIST
*clauses
;
367 temp
= (CASE_COM
*)xmalloc (sizeof (CASE_COM
));
371 temp
->clauses
= REVERSE_LIST (clauses
, PATTERN_LIST
*);
372 return (make_command (cm_case
, (SIMPLE_COM
*)temp
));
376 make_pattern_list (patterns
, action
)
382 temp
= (PATTERN_LIST
*)xmalloc (sizeof (PATTERN_LIST
));
383 temp
->patterns
= REVERSE_LIST (patterns
, WORD_LIST
*);
384 temp
->action
= action
;
391 make_if_command (test
, true_case
, false_case
)
392 COMMAND
*test
, *true_case
, *false_case
;
396 temp
= (IF_COM
*)xmalloc (sizeof (IF_COM
));
399 temp
->true_case
= true_case
;
400 temp
->false_case
= false_case
;
401 return (make_command (cm_if
, (SIMPLE_COM
*)temp
));
405 make_until_or_while (which
, test
, action
)
406 enum command_type which
;
407 COMMAND
*test
, *action
;
411 temp
= (WHILE_COM
*)xmalloc (sizeof (WHILE_COM
));
414 temp
->action
= action
;
415 return (make_command (which
, (SIMPLE_COM
*)temp
));
419 make_while_command (test
, action
)
420 COMMAND
*test
, *action
;
422 return (make_until_or_while (cm_while
, test
, action
));
426 make_until_command (test
, action
)
427 COMMAND
*test
, *action
;
429 return (make_until_or_while (cm_until
, test
, action
));
433 make_arith_command (exp
)
436 #if defined (DPAREN_ARITHMETIC)
440 command
= (COMMAND
*)xmalloc (sizeof (COMMAND
));
441 command
->value
.Arith
= temp
= (ARITH_COM
*)xmalloc (sizeof (ARITH_COM
));
444 temp
->line
= line_number
;
447 command
->type
= cm_arith
;
448 command
->redirects
= (REDIRECT
*)NULL
;
453 last_command_exit_value
= 2;
454 return ((COMMAND
*)NULL
);
458 #if defined (COND_COMMAND)
460 make_cond_node (type
, op
, left
, right
)
463 struct cond_com
*left
, *right
;
467 temp
= (COND_COM
*)xmalloc (sizeof (COND_COM
));
469 temp
->line
= line_number
;
480 make_cond_command (cond_node
)
483 #if defined (COND_COMMAND)
486 command
= (COMMAND
*)xmalloc (sizeof (COMMAND
));
487 command
->value
.Cond
= cond_node
;
489 command
->type
= cm_cond
;
490 command
->redirects
= (REDIRECT
*)NULL
;
492 command
->line
= cond_node
? cond_node
->line
: 0;
496 last_command_exit_value
= 2;
497 return ((COMMAND
*)NULL
);
502 make_bare_simple_command ()
507 command
= (COMMAND
*)xmalloc (sizeof (COMMAND
));
508 command
->value
.Simple
= temp
= (SIMPLE_COM
*)xmalloc (sizeof (SIMPLE_COM
));
511 temp
->line
= line_number
;
512 temp
->words
= (WORD_LIST
*)NULL
;
513 temp
->redirects
= (REDIRECT
*)NULL
;
515 command
->type
= cm_simple
;
516 command
->redirects
= (REDIRECT
*)NULL
;
522 /* Return a command which is the connection of the word or redirection
523 in ELEMENT, and the command * or NULL in COMMAND. */
525 make_simple_command (element
, command
)
529 /* If we are starting from scratch, then make the initial command
530 structure. Also note that we have to fill in all the slots, since
531 malloc doesn't return zeroed space. */
534 command
= make_bare_simple_command ();
535 parser_state
|= PST_REDIRLIST
;
540 command
->value
.Simple
->words
= make_word_list (element
.word
, command
->value
.Simple
->words
);
541 parser_state
&= ~PST_REDIRLIST
;
543 else if (element
.redirect
)
545 REDIRECT
*r
= element
.redirect
;
546 /* Due to the way <> is implemented, there may be more than a single
547 redirection in element.redirect. We just follow the chain as far
548 as it goes, and hook onto the end. */
551 r
->next
= command
->value
.Simple
->redirects
;
552 command
->value
.Simple
->redirects
= element
.redirect
;
558 /* Because we are Bourne compatible, we read the input for this
559 << or <<- redirection now, from wherever input is coming from.
560 We store the input read into a WORD_DESC. Replace the text of
561 the redirectee.word with the new input text. If <<- is on,
562 then remove leading TABS from each line. */
564 make_here_document (temp
, lineno
)
568 int kill_leading
, redir_len
;
569 char *redir_word
, *document
, *full_line
;
570 int document_index
, document_size
, delim_unquoted
;
572 if (temp
->instruction
!= r_deblank_reading_until
&&
573 temp
->instruction
!= r_reading_until
)
575 internal_error (_("make_here_document: bad instruction type %d"), temp
->instruction
);
579 kill_leading
= temp
->instruction
== r_deblank_reading_until
;
581 document
= (char *)NULL
;
582 document_index
= document_size
= 0;
584 /* Quote removal is the only expansion performed on the delimiter
585 for here documents, making it an extremely special case. */
586 redir_word
= string_quote_removal (temp
->redirectee
.filename
->word
, 0);
588 /* redirection_expand will return NULL if the expansion results in
589 multiple words or no words. Check for that here, and just abort
590 this here document if it does. */
592 redir_len
= strlen (redir_word
);
595 temp
->here_doc_eof
= (char *)xmalloc (1);
596 temp
->here_doc_eof
[0] = '\0';
600 free (temp
->redirectee
.filename
->word
);
601 temp
->here_doc_eof
= redir_word
;
603 /* Read lines from wherever lines are coming from.
604 For each line read, if kill_leading, then kill the
605 leading tab characters.
606 If the line matches redir_word exactly, then we have
607 manufactured the document. Otherwise, add the line to the
608 list of lines in the document. */
610 /* If the here-document delimiter was quoted, the lines should
611 be read verbatim from the input. If it was not quoted, we
612 need to perform backslash-quoted newline removal. */
613 delim_unquoted
= (temp
->redirectee
.filename
->flags
& W_QUOTED
) == 0;
614 while (full_line
= read_secondary_line (delim_unquoted
))
622 /* If set -v is in effect, echo the line read. read_secondary_line/
623 read_a_line leaves the newline at the end, so don't print another. */
624 if (echo_input_at_read
)
625 fprintf (stderr
, "%s", line
);
627 if (kill_leading
&& *line
)
629 /* Hack: To be compatible with some Bourne shells, we
630 check the word before stripping the whitespace. This
631 is a hack, though. */
632 if (STREQN (line
, redir_word
, redir_len
) && line
[redir_len
] == '\n')
635 while (*line
== '\t')
642 if (STREQN (line
, redir_word
, redir_len
) && line
[redir_len
] == '\n')
646 if (len
+ document_index
>= document_size
)
648 document_size
= document_size
? 2 * (document_size
+ len
) : len
+ 2;
649 document
= (char *)xrealloc (document
, document_size
);
652 /* len is guaranteed to be > 0 because of the check for line
653 being an empty string before the call to strlen. */
654 FASTCOPY (line
, document
+ document_index
, len
);
655 document_index
+= len
;
659 internal_warning (_("here-document at line %d delimited by end-of-file (wanted `%s')"), lineno
, redir_word
);
663 document
[document_index
] = '\0';
666 document
= (char *)xmalloc (1);
669 temp
->redirectee
.filename
->word
= document
;
672 /* Generate a REDIRECT from SOURCE, DEST, and INSTRUCTION.
673 INSTRUCTION is the instruction type, SOURCE is a file descriptor,
674 and DEST is a file descriptor or a WORD_DESC *. */
676 make_redirection (source
, instruction
, dest_and_filename
, flags
)
678 enum r_instruction instruction
;
679 REDIRECTEE dest_and_filename
;
687 temp
= (REDIRECT
*)xmalloc (sizeof (REDIRECT
));
689 /* First do the common cases. */
690 temp
->redirector
= source
;
691 temp
->redirectee
= dest_and_filename
;
692 temp
->instruction
= instruction
;
694 temp
->rflags
= flags
;
695 temp
->next
= (REDIRECT
*)NULL
;
700 case r_output_direction
: /* >foo */
701 case r_output_force
: /* >| foo */
702 case r_err_and_out
: /* &>filename */
703 temp
->flags
= O_TRUNC
| O_WRONLY
| O_CREAT
;
706 case r_appending_to
: /* >>foo */
707 case r_append_err_and_out
: /* &>> filename */
708 temp
->flags
= O_APPEND
| O_WRONLY
| O_CREAT
;
711 case r_input_direction
: /* <foo */
712 case r_inputa_direction
: /* foo & makes this. */
713 temp
->flags
= O_RDONLY
;
716 case r_input_output
: /* <>foo */
717 temp
->flags
= O_RDWR
| O_CREAT
;
720 case r_deblank_reading_until
: /* <<-foo */
721 case r_reading_until
: /* << foo */
722 case r_reading_string
: /* <<< foo */
723 case r_close_this
: /* <&- */
724 case r_duplicating_input
: /* 1<&2 */
725 case r_duplicating_output
: /* 1>&2 */
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- */
735 /* The way the lexer works we have to do this here. */
736 case r_duplicating_input_word
: /* 1<&$foo */
737 case r_duplicating_output_word
: /* 1>&$foo */
738 w
= dest_and_filename
.filename
;
739 wlen
= strlen (w
->word
) - 1;
740 if (w
->word
[wlen
] == '-') /* Yuck */
742 w
->word
[wlen
] = '\0';
743 if (all_digits (w
->word
) && legal_number (w
->word
, &lfd
) && lfd
== (int)lfd
)
746 temp
->instruction
= (instruction
== r_duplicating_input_word
) ? r_move_input
: r_move_output
;
747 temp
->redirectee
.dest
= lfd
;
750 temp
->instruction
= (instruction
== r_duplicating_input_word
) ? r_move_input_word
: r_move_output_word
;
756 programming_error (_("make_redirection: redirection instruction `%d' out of range"), instruction
);
764 make_function_def (name
, command
, lineno
, lstart
)
770 #if defined (ARRAY_VARS)
771 SHELL_VAR
*bash_source_v
;
772 ARRAY
*bash_source_a
;
775 temp
= (FUNCTION_DEF
*)xmalloc (sizeof (FUNCTION_DEF
));
776 temp
->command
= command
;
780 command
->line
= lstart
;
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);
789 #if defined (DEBUGGER)
790 bind_function_def (name
->word
, temp
);
793 temp
->source_file
= 0;
794 return (make_command (cm_function_def
, (SIMPLE_COM
*)temp
));
798 make_subshell_command (command
)
803 temp
= (SUBSHELL_COM
*)xmalloc (sizeof (SUBSHELL_COM
));
804 temp
->command
= command
;
805 temp
->flags
= CMD_WANT_SUBSHELL
;
806 return (make_command (cm_subshell
, (SIMPLE_COM
*)temp
));
810 make_coproc_command (name
, command
)
816 temp
= (COPROC_COM
*)xmalloc (sizeof (COPROC_COM
));
817 temp
->name
= savestring (name
);
818 temp
->command
= command
;
819 temp
->flags
= CMD_WANT_SUBSHELL
|CMD_COPROC_SUBSHELL
;
820 return (make_command (cm_coproc
, (SIMPLE_COM
*)temp
));
823 /* Reverse the word list and redirection list in the simple command
824 has just been parsed. It seems simpler to do this here the one
825 time then by any other method that I can think of. */
827 clean_simple_command (command
)
830 if (command
->type
!= cm_simple
)
831 command_error ("clean_simple_command", CMDERR_BADTYPE
, command
->type
, 0);
834 command
->value
.Simple
->words
=
835 REVERSE_LIST (command
->value
.Simple
->words
, WORD_LIST
*);
836 command
->value
.Simple
->redirects
=
837 REVERSE_LIST (command
->value
.Simple
->redirects
, REDIRECT
*);
840 parser_state
&= ~PST_REDIRLIST
;
844 /* The Yacc grammar productions have a problem, in that they take a
845 list followed by an ampersand (`&') and do a simple command connection,
846 making the entire list effectively asynchronous, instead of just
847 the last command. This means that when the list is executed, all
848 the commands have stdin set to /dev/null when job control is not
849 active, instead of just the last. This is wrong, and needs fixing
850 up. This function takes the `&' and applies it to the last command
851 in the list. This is done only for lists connected by `;'; it makes
852 `;' bind `tighter' than `&'. */
854 connect_async_list (command
, command2
, connector
)
855 COMMAND
*command
, *command2
;
858 COMMAND
*t
, *t1
, *t2
;
861 t
= command
->value
.Connection
->second
;
863 if (!t
|| (command
->flags
& CMD_WANT_SUBSHELL
) ||
864 command
->value
.Connection
->connector
!= ';')
866 t
= command_connect (command
, command2
, connector
);
870 /* This is just defensive programming. The Yacc precedence rules
871 will generally hand this function a command where t points directly
872 to the command we want (e.g. given a ; b ; c ; d &, t1 will point
873 to the `a ; b ; c' list and t will be the `d'). We only want to do
874 this if the list is not being executed as a unit in the background
875 with `( ... )', so we have to check for CMD_WANT_SUBSHELL. That's
876 the only way to tell. */
877 while (((t
->flags
& CMD_WANT_SUBSHELL
) == 0) && t
->type
== cm_connection
&&
878 t
->value
.Connection
->connector
== ';')
881 t
= t
->value
.Connection
->second
;
883 /* Now we have t pointing to the last command in the list, and
884 t1->value.Connection->second == t. */
885 t2
= command_connect (t
, command2
, connector
);
886 t1
->value
.Connection
->second
= t2
;