Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/app/getvc/getvc.c

    rc7dc8ad radb49f58  
    3636
    3737#include <sys/types.h>
    38 #include <fcntl.h>
    3938#include <unistd.h>
    4039#include <stdio.h>
     
    4746}
    4847
    49 static void reopen(FILE **stream, int fd, const char *path, int flags, const char *mode)
     48static void closeall(void)
    5049{
    51         if (fclose(*stream))
    52                 return;
     50        fclose(stdin);
     51        fclose(stdout);
     52        fclose(stderr);
    5353       
    54         *stream = NULL;
    55        
    56         int oldfd = open(path, flags);
    57         if (oldfd < 0)
    58                 return;
    59        
    60         if (oldfd != fd) {
    61                 if (dup2(oldfd, fd) != fd)
    62                         return;
    63                
    64                 if (close(oldfd))
    65                         return;
    66         }
    67        
    68         *stream = fdopen(fd, mode);
     54        close(0);
     55        close(1);
     56        close(2);
    6957}
    7058
    7159static task_id_t spawn(char *fname)
    7260{
    73         char *args[2];
     61        char *argv[2];
    7462       
    75         args[0] = fname;
    76         args[1] = NULL;
     63        argv[0] = fname;
     64        argv[1] = NULL;
    7765       
    78         task_id_t id = task_spawn(fname, args);
     66        task_id_t id = task_spawn(fname, argv);
    7967       
    8068        if (id == 0)
     
    8674int main(int argc, char *argv[])
    8775{
     76        task_exit_t texit;
     77        int retval;
     78
    8879        if (argc < 3) {
    8980                usage();
     
    9182        }
    9283       
    93         reopen(&stdin, 0, argv[1], O_RDONLY, "r");
    94         reopen(&stdout, 1, argv[1], O_WRONLY, "w");
    95         reopen(&stderr, 2, argv[1], O_WRONLY, "w");
     84        closeall();
    9685       
     86        stdin = fopen(argv[1], "r");
     87        stdout = fopen(argv[1], "w");
     88        stderr = fopen(argv[1], "w");
     89
    9790        /*
    98          * FIXME: fdopen() should actually detect that we are opening a console
     91         * FIXME: fopen() should actually detect that we are opening a console
    9992         * and it should set line-buffering mode automatically.
    10093         */
    10194        setvbuf(stdout, NULL, _IOLBF, BUFSIZ);
    10295       
    103         if (stdin == NULL)
     96        if ((stdin == NULL)
     97            || (stdout == NULL)
     98            || (stderr == NULL))
    10499                return -2;
    105        
    106         if (stdout == NULL)
    107                 return -3;
    108        
    109         if (stderr == NULL)
    110                 return -4;
    111100       
    112101        version_print(argv[1]);
    113102        task_id_t id = spawn(argv[2]);
     103        task_wait(id, &texit, &retval);
    114104       
    115         if (id != 0) {
    116                 task_exit_t texit;
    117                 int retval;
    118                 task_wait(id, &texit, &retval);
    119                
    120                 return 0;
    121         }
    122        
    123         return -5;
     105        return 0;
    124106}
    125107
Note: See TracChangeset for help on using the changeset viewer.