Changeset 6ea9a1d in mainline


Ignore:
Timestamp:
2011-06-11T22:32:24Z (13 years ago)
Author:
Martin Sucha <sucha14@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
36ab7c7
Parents:
ae45201
Message:

Allow shell builtins to be redirected too

Location:
uspace/app/bdsh
Files:
9 edited

Legend:

Unmodified
Added
Removed
  • uspace/app/bdsh/cmds/builtin_cmds.c

    rae45201 r6ea9a1d  
    3838#include "cmds.h"
    3939#include "builtin_aliases.h"
     40#include "scli.h"
    4041
    4142extern volatile unsigned int cli_interactive;
     
    101102}
    102103
    103 int run_builtin(int builtin, char *argv[], cliuser_t *usr)
     104int run_builtin(int builtin, char *argv[], cliuser_t *usr, iostate_t *new_iostate)
    104105{
     106        int rc;
    105107        builtin_t *cmd = builtins;
    106108
    107109        cmd += builtin;
     110       
     111        iostate_t *old_iostate = get_iostate();
     112        set_iostate(new_iostate);
     113       
     114        if (NULL != cmd->entry) {
     115                rc = ((int)cmd->entry(argv, usr));
     116        }
     117        else {
     118                rc = CL_ENOENT;
     119        }
     120       
     121        set_iostate(old_iostate);
    108122
    109         if (NULL != cmd->entry)
    110                 return((int)cmd->entry(argv, usr));
    111 
    112         return CL_ENOENT;
     123        return rc;
    113124}
  • uspace/app/bdsh/cmds/cmds.h

    rae45201 r6ea9a1d  
    5959extern char *alias_for_module(const char *);
    6060extern int help_module(int, unsigned int);
    61 extern int run_module(int, char *[]);
     61extern int run_module(int, char *[], iostate_t *);
    6262
    6363/* Prototypes for builtin launchers */
     
    6767extern char *alias_for_builtin(const char *);
    6868extern int help_builtin(int, unsigned int);
    69 extern int run_builtin(int, char *[], cliuser_t *);
     69extern int run_builtin(int, char *[], cliuser_t *, iostate_t *);
    7070
    7171#endif
  • uspace/app/bdsh/cmds/mod_cmds.c

    rae45201 r6ea9a1d  
    124124/* Invokes the module entry point modules[module], passing argv[] as an argument
    125125 * stack. */
    126 int run_module(int module, char *argv[])
     126int run_module(int module, char *argv[], iostate_t *new_iostate)
    127127{
     128        int rc;
    128129        module_t *mod = modules;
    129130
    130131        mod += module;
     132       
     133        iostate_t *old_iostate = get_iostate();
     134        set_iostate(new_iostate);
    131135
    132         if (NULL != mod->entry)
    133                 return ((int)mod->entry(argv));
     136        if (NULL != mod->entry) {
     137                rc = ((int)mod->entry(argv));
     138        }
     139        else {
     140                rc = CL_ENOENT;
     141        }
     142       
     143        set_iostate(old_iostate);
    134144
    135         return CL_ENOENT;
     145        return rc;
    136146}
  • uspace/app/bdsh/errors.c

    rae45201 r6ea9a1d  
    3838#include "errors.h"
    3939#include "errstr.h"
     40#include "scli.h"
    4041
    4142volatile int cli_errno = CL_EOK;
  • uspace/app/bdsh/exec.c

    rae45201 r6ea9a1d  
    112112}
    113113
    114 unsigned int try_exec(char *cmd, char **argv, FILE **files)
     114unsigned int try_exec(char *cmd, char **argv, iostate_t *io)
    115115{
    116116        task_id_t tid;
     
    120120        fdi_node_t file_nodes[3];
    121121        fdi_node_t *file_nodes_p[4];
     122        FILE *files[3];
    122123
    123124        tmp = str_dup(find_command(cmd));
    124125        free(found);
     126       
     127        files[0] = io->stdin;
     128        files[1] = io->stdout;
     129        files[2] = io->stderr;
    125130       
    126131        for (i = 0; i < 3 && files[i] != NULL; i++) {
  • uspace/app/bdsh/exec.h

    rae45201 r6ea9a1d  
    33
    44#include <task.h>
     5#include "scli.h"
    56
    6 extern unsigned int try_exec(char *, char **, FILE **);
     7extern unsigned int try_exec(char *, char **, iostate_t *);
    78
    89#endif
  • uspace/app/bdsh/input.c

    rae45201 r6ea9a1d  
    5858
    5959/* Private helpers */
    60 static int run_command(char **, cliuser_t *, FILE **);
     60static int run_command(char **, cliuser_t *, iostate_t *);
    6161static void print_pipe_usage(void);
    6262
     
    140140        }
    141141       
    142         FILE *files[4];
    143         files[0] = stdin;
    144         files[1] = stdout;
    145         files[2] = stderr;
    146         files[3] = 0;
     142        iostate_t new_iostate = {
     143                .stdin = stdin,
     144                .stdout = stdout,
     145                .stderr = stderr
     146        };
     147       
     148        FILE *from = NULL;
     149        FILE *to = NULL;
    147150       
    148151        if (redir_from) {
    149                 FILE *from = fopen(redir_from, "r");
     152                from = fopen(redir_from, "r");
    150153                if (from == NULL) {
    151154                        printf("Cannot open file %s\n", redir_from);
    152155                        rc = errno;
    153                         goto finit;
     156                        goto finit_with_files;
    154157                }
    155                 files[0] = from;
    156         }
     158                new_iostate.stdin = from;
     159        }
     160       
    157161       
    158162        if (redir_to) {
    159                 FILE *to = fopen(redir_to, "w");
     163                to = fopen(redir_to, "w");
    160164                if (to == NULL) {
    161165                        printf("Cannot open file %s\n", redir_to);
    162166                        rc = errno;
    163                         goto finit;
     167                        goto finit_with_files;
    164168                }
    165                 files[1] = to;
    166         }
    167        
    168         rc = run_command(cmd, usr, files);
     169                new_iostate.stdout = to;
     170        }
     171       
     172        rc = run_command(cmd, usr, &new_iostate);
     173       
     174finit_with_files:
     175        if (from != NULL) {
     176                fclose(from);
     177        }
     178        if (to != NULL) {
     179                fclose(to);
     180        }
    169181       
    170182finit:
     
    188200}
    189201
    190 int run_command(char **cmd, cliuser_t *usr, FILE *files[])
     202int run_command(char **cmd, cliuser_t *usr, iostate_t *new_iostate)
    191203{
    192204        int id = 0;
     
    199211        /* Is it a builtin command ? */
    200212        if ((id = (is_builtin(cmd[0]))) > -1) {
    201                 return run_builtin(id, cmd, usr);
     213                return run_builtin(id, cmd, usr, new_iostate);
    202214        }
    203215       
    204216        /* Is it a module ? */
    205217        if ((id = (is_module(cmd[0]))) > -1) {
    206                 return run_module(id, cmd);
     218                return run_module(id, cmd, new_iostate);
    207219        }
    208220
    209221        /* See what try_exec thinks of it */
    210         return try_exec(cmd[0], cmd, files);
     222        return try_exec(cmd[0], cmd, new_iostate);
    211223}
    212224
  • uspace/app/bdsh/scli.c

    rae45201 r6ea9a1d  
    4242/* See scli.h */
    4343static cliuser_t usr;
     44static iostate_t *iostate;
     45static iostate_t stdiostate;
    4446
    4547/* Globals that are modified during start-up that modules/builtins
     
    8284}
    8385
     86iostate_t *get_iostate(void)
     87{
     88        return iostate;
     89}
     90
     91
     92void set_iostate(iostate_t *ios)
     93{
     94        iostate = ios;
     95        stdin = ios->stdin;
     96        stdout = ios->stdout;
     97        stderr = ios->stderr;
     98}
     99
    84100int main(int argc, char *argv[])
    85101{
    86102        int ret = 0;
     103       
     104        stdiostate.stdin = stdin;
     105        stdiostate.stdout = stdout;
     106        stdiostate.stderr = stderr;
     107        iostate = &stdiostate;
    87108
    88109        if (cli_init(&usr))
  • uspace/app/bdsh/scli.h

    rae45201 r6ea9a1d  
    1313} cliuser_t;
    1414
     15typedef struct {
     16        FILE *stdin;
     17        FILE *stdout;
     18        FILE *stderr;
     19} iostate_t;
     20
    1521extern const char *progname;
    1622
     23extern iostate_t *get_iostate(void);
     24extern void set_iostate(iostate_t *);
     25
    1726#endif
Note: See TracChangeset for help on using the changeset viewer.