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)
43 #include "dispose_cmd.h"
44 #include "variables.h"
50 #if defined (JOB_CONTROL)
56 extern int line_number
, current_command_line_count
;
57 extern int last_command_exit_value
;
60 sh_obj_cache_t wdcache
= {0, 0, 0};
61 sh_obj_cache_t wlcache
= {0, 0, 0};
63 #define WDCACHESIZE 60
64 #define WLCACHESIZE 60
66 static COMMAND
*make_for_or_select
__P((enum command_type
, WORD_DESC
*, WORD_LIST
*, COMMAND
*, int));
67 #if defined (ARITH_FOR_COMMAND)
68 static WORD_LIST
*make_arith_for_expr
__P((char *));
70 static COMMAND
*make_until_or_while
__P((enum command_type
, COMMAND
*, COMMAND
*));
75 ocache_create (wdcache
, WORD_DESC
, WDCACHESIZE
);
76 ocache_create (wlcache
, WORD_LIST
, WLCACHESIZE
);
84 ocache_alloc (wdcache
, WORD_DESC
, temp
);
91 make_bare_word (string
)
96 temp
= alloc_word_desc ();
99 temp
->word
= savestring (string
);
102 temp
->word
= (char *)xmalloc (1);
103 temp
->word
[0] = '\0';
110 make_word_flags (w
, string
)
119 slen
= strlen (string
);
125 w
->flags
|= W_HASDOLLAR
;
128 break; /* continue the loop */
132 w
->flags
|= W_QUOTED
;
136 ADVANCE_CHAR (string
, slen
, i
);
148 temp
= make_bare_word (string
);
149 return (make_word_flags (temp
, string
));
153 make_word_from_token (token
)
158 tokenizer
[0] = token
;
161 return (make_word (tokenizer
));
165 make_word_list (word
, wlink
)
171 ocache_alloc (wlcache
, WORD_LIST
, temp
);
179 make_command (type
, pointer
)
180 enum command_type type
;
185 temp
= (COMMAND
*)xmalloc (sizeof (COMMAND
));
187 temp
->value
.Simple
= pointer
;
188 temp
->value
.Simple
->flags
= temp
->flags
= 0;
189 temp
->redirects
= (REDIRECT
*)NULL
;
194 command_connect (com1
, com2
, connector
)
195 COMMAND
*com1
, *com2
;
200 temp
= (CONNECTION
*)xmalloc (sizeof (CONNECTION
));
201 temp
->connector
= connector
;
204 return (make_command (cm_connection
, (SIMPLE_COM
*)temp
));
208 make_for_or_select (type
, name
, map_list
, action
, lineno
)
209 enum command_type type
;
217 temp
= (FOR_COM
*)xmalloc (sizeof (FOR_COM
));
221 temp
->map_list
= map_list
;
222 temp
->action
= action
;
223 return (make_command (type
, (SIMPLE_COM
*)temp
));
227 make_for_command (name
, map_list
, action
, lineno
)
233 return (make_for_or_select (cm_for
, name
, map_list
, action
, lineno
));
237 make_select_command (name
, map_list
, action
, lineno
)
243 #if defined (SELECT_COMMAND)
244 return (make_for_or_select (cm_select
, name
, map_list
, action
, lineno
));
246 last_command_exit_value
= 2;
247 return ((COMMAND
*)NULL
);
251 #if defined (ARITH_FOR_COMMAND)
253 make_arith_for_expr (s
)
259 if (s
== 0 || *s
== '\0')
260 return ((WORD_LIST
*)NULL
);
262 wd
->flags
|= W_NOGLOB
|W_NOSPLIT
|W_QUOTED
|W_DQUOTE
; /* no word splitting or globbing */
263 result
= make_word_list (wd
, (WORD_LIST
*)NULL
);
268 /* Note that this function calls dispose_words on EXPRS, since it doesn't
269 use the word list directly. We free it here rather than at the caller
270 because no other function in this file requires that the caller free
273 make_arith_for_command (exprs
, action
, lineno
)
278 #if defined (ARITH_FOR_COMMAND)
280 WORD_LIST
*init
, *test
, *step
;
284 init
= test
= step
= (WORD_LIST
*)NULL
;
285 /* Parse the string into the three component sub-expressions. */
286 start
= t
= s
= exprs
->word
->word
;
289 /* skip whitespace at the start of each sub-expression. */
290 while (whitespace (*s
))
293 /* skip to the semicolon or EOS */
294 while (*s
&& *s
!= ';')
297 t
= (s
> start
) ? substring (start
, 0, s
- start
) : (char *)NULL
;
303 init
= make_arith_for_expr (t
);
306 test
= make_arith_for_expr (t
);
309 step
= make_arith_for_expr (t
);
316 s
++; /* skip over semicolon */
322 parser_error (lineno
, _("syntax error: arithmetic expression required"));
324 parser_error (lineno
, _("syntax error: `;' unexpected"));
325 parser_error (lineno
, _("syntax error: `((%s))'"), exprs
->word
->word
);
326 last_command_exit_value
= 2;
327 return ((COMMAND
*)NULL
);
330 temp
= (ARITH_FOR_COM
*)xmalloc (sizeof (ARITH_FOR_COM
));
333 temp
->init
= init
? init
: make_arith_for_expr ("1");
334 temp
->test
= test
? test
: make_arith_for_expr ("1");
335 temp
->step
= step
? step
: make_arith_for_expr ("1");
336 temp
->action
= action
;
338 dispose_words (exprs
);
339 return (make_command (cm_arith_for
, (SIMPLE_COM
*)temp
));
341 dispose_words (exprs
);
342 last_command_exit_value
= 2;
343 return ((COMMAND
*)NULL
);
344 #endif /* ARITH_FOR_COMMAND */
348 make_group_command (command
)
353 temp
= (GROUP_COM
*)xmalloc (sizeof (GROUP_COM
));
354 temp
->command
= command
;
355 return (make_command (cm_group
, (SIMPLE_COM
*)temp
));
359 make_case_command (word
, clauses
, lineno
)
361 PATTERN_LIST
*clauses
;
366 temp
= (CASE_COM
*)xmalloc (sizeof (CASE_COM
));
370 temp
->clauses
= REVERSE_LIST (clauses
, PATTERN_LIST
*);
371 return (make_command (cm_case
, (SIMPLE_COM
*)temp
));
375 make_pattern_list (patterns
, action
)
381 temp
= (PATTERN_LIST
*)xmalloc (sizeof (PATTERN_LIST
));
382 temp
->patterns
= REVERSE_LIST (patterns
, WORD_LIST
*);
383 temp
->action
= action
;
390 make_if_command (test
, true_case
, false_case
)
391 COMMAND
*test
, *true_case
, *false_case
;
395 temp
= (IF_COM
*)xmalloc (sizeof (IF_COM
));
398 temp
->true_case
= true_case
;
399 temp
->false_case
= false_case
;
400 return (make_command (cm_if
, (SIMPLE_COM
*)temp
));
404 make_until_or_while (which
, test
, action
)
405 enum command_type which
;
406 COMMAND
*test
, *action
;
410 temp
= (WHILE_COM
*)xmalloc (sizeof (WHILE_COM
));
413 temp
->action
= action
;
414 return (make_command (which
, (SIMPLE_COM
*)temp
));
418 make_while_command (test
, action
)
419 COMMAND
*test
, *action
;
421 return (make_until_or_while (cm_while
, test
, action
));
425 make_until_command (test
, action
)
426 COMMAND
*test
, *action
;
428 return (make_until_or_while (cm_until
, test
, action
));
432 make_arith_command (exp
)
435 #if defined (DPAREN_ARITHMETIC)
439 command
= (COMMAND
*)xmalloc (sizeof (COMMAND
));
440 command
->value
.Arith
= temp
= (ARITH_COM
*)xmalloc (sizeof (ARITH_COM
));
443 temp
->line
= line_number
;
446 command
->type
= cm_arith
;
447 command
->redirects
= (REDIRECT
*)NULL
;
452 last_command_exit_value
= 2;
453 return ((COMMAND
*)NULL
);
457 #if defined (COND_COMMAND)
459 make_cond_node (type
, op
, left
, right
)
462 struct cond_com
*left
, *right
;
466 temp
= (COND_COM
*)xmalloc (sizeof (COND_COM
));
468 temp
->line
= line_number
;
479 make_cond_command (cond_node
)
482 #if defined (COND_COMMAND)
485 command
= (COMMAND
*)xmalloc (sizeof (COMMAND
));
486 command
->value
.Cond
= cond_node
;
488 command
->type
= cm_cond
;
489 command
->redirects
= (REDIRECT
*)NULL
;
491 command
->line
= cond_node
? cond_node
->line
: 0;
495 last_command_exit_value
= 2;
496 return ((COMMAND
*)NULL
);
501 make_bare_simple_command ()
506 command
= (COMMAND
*)xmalloc (sizeof (COMMAND
));
507 command
->value
.Simple
= temp
= (SIMPLE_COM
*)xmalloc (sizeof (SIMPLE_COM
));
510 temp
->line
= line_number
;
511 temp
->words
= (WORD_LIST
*)NULL
;
512 temp
->redirects
= (REDIRECT
*)NULL
;
514 command
->type
= cm_simple
;
515 command
->redirects
= (REDIRECT
*)NULL
;
521 /* Return a command which is the connection of the word or redirection
522 in ELEMENT, and the command * or NULL in COMMAND. */
524 make_simple_command (element
, command
)
528 /* If we are starting from scratch, then make the initial command
529 structure. Also note that we have to fill in all the slots, since
530 malloc doesn't return zeroed space. */
532 command
= make_bare_simple_command ();
535 command
->value
.Simple
->words
= make_word_list (element
.word
, command
->value
.Simple
->words
);
536 else if (element
.redirect
)
538 REDIRECT
*r
= element
.redirect
;
539 /* Due to the way <> is implemented, there may be more than a single
540 redirection in element.redirect. We just follow the chain as far
541 as it goes, and hook onto the end. */
544 r
->next
= command
->value
.Simple
->redirects
;
545 command
->value
.Simple
->redirects
= element
.redirect
;
550 /* Because we are Bourne compatible, we read the input for this
551 << or <<- redirection now, from wherever input is coming from.
552 We store the input read into a WORD_DESC. Replace the text of
553 the redirectee.word with the new input text. If <<- is on,
554 then remove leading TABS from each line. */
556 make_here_document (temp
, lineno
)
560 int kill_leading
, redir_len
;
561 char *redir_word
, *document
, *full_line
;
562 int document_index
, document_size
, delim_unquoted
;
564 if (temp
->instruction
!= r_deblank_reading_until
&&
565 temp
->instruction
!= r_reading_until
)
567 internal_error (_("make_here_document: bad instruction type %d"), temp
->instruction
);
571 kill_leading
= temp
->instruction
== r_deblank_reading_until
;
573 document
= (char *)NULL
;
574 document_index
= document_size
= 0;
576 /* Quote removal is the only expansion performed on the delimiter
577 for here documents, making it an extremely special case. */
578 redir_word
= string_quote_removal (temp
->redirectee
.filename
->word
, 0);
580 /* redirection_expand will return NULL if the expansion results in
581 multiple words or no words. Check for that here, and just abort
582 this here document if it does. */
584 redir_len
= strlen (redir_word
);
587 temp
->here_doc_eof
= (char *)xmalloc (1);
588 temp
->here_doc_eof
[0] = '\0';
592 free (temp
->redirectee
.filename
->word
);
593 temp
->here_doc_eof
= redir_word
;
595 /* Read lines from wherever lines are coming from.
596 For each line read, if kill_leading, then kill the
597 leading tab characters.
598 If the line matches redir_word exactly, then we have
599 manufactured the document. Otherwise, add the line to the
600 list of lines in the document. */
602 /* If the here-document delimiter was quoted, the lines should
603 be read verbatim from the input. If it was not quoted, we
604 need to perform backslash-quoted newline removal. */
605 delim_unquoted
= (temp
->redirectee
.filename
->flags
& W_QUOTED
) == 0;
606 while (full_line
= read_secondary_line (delim_unquoted
))
614 /* If set -v is in effect, echo the line read. read_secondary_line/
615 read_a_line leaves the newline at the end, so don't print another. */
616 if (echo_input_at_read
)
617 fprintf (stderr
, "%s", line
);
619 if (kill_leading
&& *line
)
621 /* Hack: To be compatible with some Bourne shells, we
622 check the word before stripping the whitespace. This
623 is a hack, though. */
624 if (STREQN (line
, redir_word
, redir_len
) && line
[redir_len
] == '\n')
627 while (*line
== '\t')
634 if (STREQN (line
, redir_word
, redir_len
) && line
[redir_len
] == '\n')
638 if (len
+ document_index
>= document_size
)
640 document_size
= document_size
? 2 * (document_size
+ len
) : len
+ 2;
641 document
= (char *)xrealloc (document
, document_size
);
644 /* len is guaranteed to be > 0 because of the check for line
645 being an empty string before the call to strlen. */
646 FASTCOPY (line
, document
+ document_index
, len
);
647 document_index
+= len
;
651 internal_warning (_("here-document at line %d delimited by end-of-file (wanted `%s')"), lineno
, redir_word
);
655 document
[document_index
] = '\0';
658 document
= (char *)xmalloc (1);
661 temp
->redirectee
.filename
->word
= document
;
664 /* Generate a REDIRECT from SOURCE, DEST, and INSTRUCTION.
665 INSTRUCTION is the instruction type, SOURCE is a file descriptor,
666 and DEST is a file descriptor or a WORD_DESC *. */
668 make_redirection (source
, instruction
, dest_and_filename
)
670 enum r_instruction instruction
;
671 REDIRECTEE dest_and_filename
;
678 temp
= (REDIRECT
*)xmalloc (sizeof (REDIRECT
));
680 /* First do the common cases. */
681 temp
->redirector
= source
;
682 temp
->redirectee
= dest_and_filename
;
683 temp
->instruction
= instruction
;
685 temp
->next
= (REDIRECT
*)NULL
;
690 case r_output_direction
: /* >foo */
691 case r_output_force
: /* >| foo */
692 case r_err_and_out
: /* &>filename */
693 temp
->flags
= O_TRUNC
| O_WRONLY
| O_CREAT
;
696 case r_appending_to
: /* >>foo */
697 case r_append_err_and_out
: /* &>> filename */
698 temp
->flags
= O_APPEND
| O_WRONLY
| O_CREAT
;
701 case r_input_direction
: /* <foo */
702 case r_inputa_direction
: /* foo & makes this. */
703 temp
->flags
= O_RDONLY
;
706 case r_input_output
: /* <>foo */
707 temp
->flags
= O_RDWR
| O_CREAT
;
710 case r_deblank_reading_until
: /* <<-foo */
711 case r_reading_until
: /* << foo */
712 case r_reading_string
: /* <<< foo */
713 case r_close_this
: /* <&- */
714 case r_duplicating_input
: /* 1<&2 */
715 case r_duplicating_output
: /* 1>&2 */
718 /* the parser doesn't pass these. */
719 case r_move_input
: /* 1<&2- */
720 case r_move_output
: /* 1>&2- */
721 case r_move_input_word
: /* 1<&$foo- */
722 case r_move_output_word
: /* 1>&$foo- */
725 /* The way the lexer works we have to do this here. */
726 case r_duplicating_input_word
: /* 1<&$foo */
727 case r_duplicating_output_word
: /* 1>&$foo */
728 w
= dest_and_filename
.filename
;
729 wlen
= strlen (w
->word
) - 1;
730 if (w
->word
[wlen
] == '-') /* Yuck */
732 w
->word
[wlen
] = '\0';
733 if (all_digits (w
->word
) && legal_number (w
->word
, &lfd
) && lfd
== (int)lfd
)
736 temp
->instruction
= (instruction
== r_duplicating_input_word
) ? r_move_input
: r_move_output
;
737 temp
->redirectee
.dest
= lfd
;
740 temp
->instruction
= (instruction
== r_duplicating_input_word
) ? r_move_input_word
: r_move_output_word
;
746 programming_error (_("make_redirection: redirection instruction `%d' out of range"), instruction
);
754 make_function_def (name
, command
, lineno
, lstart
)
760 #if defined (ARRAY_VARS)
761 SHELL_VAR
*bash_source_v
;
762 ARRAY
*bash_source_a
;
765 temp
= (FUNCTION_DEF
*)xmalloc (sizeof (FUNCTION_DEF
));
766 temp
->command
= command
;
770 command
->line
= lstart
;
772 /* Information used primarily for debugging. */
773 temp
->source_file
= 0;
774 #if defined (ARRAY_VARS)
775 GET_ARRAY_FROM_VAR ("BASH_SOURCE", bash_source_v
, bash_source_a
);
776 if (bash_source_a
&& array_num_elements (bash_source_a
) > 0)
777 temp
->source_file
= array_reference (bash_source_a
, 0);
779 #if defined (DEBUGGER)
780 bind_function_def (name
->word
, temp
);
783 temp
->source_file
= 0;
784 return (make_command (cm_function_def
, (SIMPLE_COM
*)temp
));
788 make_subshell_command (command
)
793 temp
= (SUBSHELL_COM
*)xmalloc (sizeof (SUBSHELL_COM
));
794 temp
->command
= command
;
795 temp
->flags
= CMD_WANT_SUBSHELL
;
796 return (make_command (cm_subshell
, (SIMPLE_COM
*)temp
));
800 make_coproc_command (name
, command
)
806 temp
= (COPROC_COM
*)xmalloc (sizeof (COPROC_COM
));
807 temp
->name
= savestring (name
);
808 temp
->command
= command
;
809 temp
->flags
= CMD_WANT_SUBSHELL
|CMD_COPROC_SUBSHELL
;
810 return (make_command (cm_coproc
, (SIMPLE_COM
*)temp
));
813 /* Reverse the word list and redirection list in the simple command
814 has just been parsed. It seems simpler to do this here the one
815 time then by any other method that I can think of. */
817 clean_simple_command (command
)
820 if (command
->type
!= cm_simple
)
821 command_error ("clean_simple_command", CMDERR_BADTYPE
, command
->type
, 0);
824 command
->value
.Simple
->words
=
825 REVERSE_LIST (command
->value
.Simple
->words
, WORD_LIST
*);
826 command
->value
.Simple
->redirects
=
827 REVERSE_LIST (command
->value
.Simple
->redirects
, REDIRECT
*);
833 /* The Yacc grammar productions have a problem, in that they take a
834 list followed by an ampersand (`&') and do a simple command connection,
835 making the entire list effectively asynchronous, instead of just
836 the last command. This means that when the list is executed, all
837 the commands have stdin set to /dev/null when job control is not
838 active, instead of just the last. This is wrong, and needs fixing
839 up. This function takes the `&' and applies it to the last command
840 in the list. This is done only for lists connected by `;'; it makes
841 `;' bind `tighter' than `&'. */
843 connect_async_list (command
, command2
, connector
)
844 COMMAND
*command
, *command2
;
847 COMMAND
*t
, *t1
, *t2
;
850 t
= command
->value
.Connection
->second
;
852 if (!t
|| (command
->flags
& CMD_WANT_SUBSHELL
) ||
853 command
->value
.Connection
->connector
!= ';')
855 t
= command_connect (command
, command2
, connector
);
859 /* This is just defensive programming. The Yacc precedence rules
860 will generally hand this function a command where t points directly
861 to the command we want (e.g. given a ; b ; c ; d &, t1 will point
862 to the `a ; b ; c' list and t will be the `d'). We only want to do
863 this if the list is not being executed as a unit in the background
864 with `( ... )', so we have to check for CMD_WANT_SUBSHELL. That's
865 the only way to tell. */
866 while (((t
->flags
& CMD_WANT_SUBSHELL
) == 0) && t
->type
== cm_connection
&&
867 t
->value
.Connection
->connector
== ';')
870 t
= t
->value
.Connection
->second
;
872 /* Now we have t pointing to the last command in the list, and
873 t1->value.Connection->second == t. */
874 t2
= command_connect (t
, command2
, connector
);
875 t1
->value
.Connection
->second
= t2
;