Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/app/bdsh/input.c

    rb48d046 reff10e03  
    22 * Copyright (c) 2008 Tim Post
    33 * Copyright (c) 2011 Jiri Svoboda
    4  * Copyright (c) 2011 Martin Sucha
    54 * All rights reserved.
    65 *
     
    6766int process_input(cliuser_t *usr)
    6867{
    69         token_t *tokens = calloc(WORD_MAX, sizeof(token_t));
    70         if (tokens == NULL)
    71                 return ENOMEM;
    72        
    7368        char *cmd[WORD_MAX];
    7469        int rc = 0;
    7570        tokenizer_t tok;
    76         unsigned int i, pipe_count, processed_pipes;
    77         unsigned int pipe_pos[2];
     71        int i, pipe_count, processed_pipes;
     72        int pipe_pos[2];
     73        char **actual_cmd;
    7874        char *redir_from = NULL;
    7975        char *redir_to = NULL;
    8076
    81         if (usr->line == NULL) {
    82                 free(tokens);
     77        if (NULL == usr->line)
    8378                return CL_EFAIL;
    84         }
    85 
    86         rc = tok_init(&tok, usr->line, tokens, WORD_MAX);
     79
     80        rc = tok_init(&tok, usr->line, cmd, WORD_MAX);
    8781        if (rc != EOK) {
    8882                goto finit;
    8983        }
    9084       
    91         size_t tokens_length;
    92         rc = tok_tokenize(&tok, &tokens_length);
     85        rc = tok_tokenize(&tok);
    9386        if (rc != EOK) {
    9487                goto finit;
    95         }
    96        
    97         if (tokens_length > 0 && tokens[0].type == TOKTYPE_SPACE) {
    98                 tokens++;
    99                 tokens_length--;
    100         }
    101        
    102         if (tokens_length > 0 && tokens[tokens_length-1].type == TOKTYPE_SPACE) {
    103                 tokens_length--;
    10488        }
    10589       
     
    10993         * First find the pipes and check that there are no more
    11094         */
    111         for (i = 0, pipe_count = 0; i < tokens_length; i++) {
    112                 if (tokens[i].type == TOKTYPE_PIPE) {
     95        int cmd_length = 0;
     96        for (i = 0, pipe_count = 0; cmd[i] != NULL; i++, cmd_length++) {
     97                if (cmd[i][0] == '|') {
    11398                        if (pipe_count >= 2) {
    11499                                print_pipe_usage();
     
    121106        }
    122107       
    123         unsigned int cmd_token_start = 0;
    124         unsigned int cmd_token_end = tokens_length;
    125        
     108        actual_cmd = cmd;
    126109        processed_pipes = 0;
    127110       
    128111        /* Check if the first part (from <file> |) is present */
    129         if (pipe_count > 0 && (pipe_pos[0] == 3 || pipe_pos[0] == 4) && str_cmp(tokens[0].text, "from") == 0) {
     112        if (pipe_count > 0 && pipe_pos[0] == 2 && str_cmp(cmd[0], "from") == 0) {
    130113                /* Ignore the first three tokens (from, file, pipe) and set from */
    131                 redir_from = tokens[2].text;
    132                 cmd_token_start = pipe_pos[0]+1;
     114                redir_from = cmd[1];
     115                actual_cmd = cmd + 3;
    133116                processed_pipes++;
    134117        }
     
    136119        /* Check if the second part (| to <file>) is present */
    137120        if ((pipe_count - processed_pipes) > 0 &&
    138             (pipe_pos[processed_pipes] == tokens_length - 4 ||
    139             (pipe_pos[processed_pipes] == tokens_length - 5 &&
    140             tokens[tokens_length-4].type == TOKTYPE_SPACE )) &&
    141             str_cmp(tokens[tokens_length-3].text, "to") == 0) {
     121            pipe_pos[processed_pipes] == cmd_length - 3 &&
     122            str_cmp(cmd[cmd_length-2], "to") == 0) {
    142123                /* Ignore the last three tokens (pipe, to, file) and set to */
    143                 redir_to = tokens[tokens_length-1].text;
    144                 cmd_token_end = pipe_pos[processed_pipes];
     124                redir_to = cmd[cmd_length-1];
     125                cmd[cmd_length-3] = NULL;
     126                cmd_length -= 3;
    145127                processed_pipes++;
    146128        }
     
    152134        }
    153135       
    154         /* Convert tokens of the command to string array */
    155         unsigned int cmd_pos = 0;
    156         for (i = cmd_token_start; i < cmd_token_end; i++) {
    157                 if (tokens[i].type != TOKTYPE_SPACE) {
    158                         cmd[cmd_pos++] = tokens[i].text;
    159                 }
    160         }
    161         cmd[cmd_pos++] = NULL;
    162        
    163         if (cmd[0] == NULL) {
     136        if (actual_cmd[0] == NULL) {
    164137                print_pipe_usage();
    165138                rc = ENOTSUP;
     
    197170        }
    198171       
    199         rc = run_command(cmd, usr, &new_iostate);
     172        rc = run_command(actual_cmd, usr, &new_iostate);
    200173       
    201174finit_with_files:
     
    213186        }
    214187        tok_fini(&tok);
    215         free(tokens);
    216188
    217189        return rc;
Note: See TracChangeset for help on using the changeset viewer.