Changes in uspace/app/bdsh/exec.c [c4a8e4a:36ab7c7] in mainline


Ignore:
File:
1 edited

Legend:

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

    rc4a8e4a r36ab7c7  
    4040#include <str_error.h>
    4141#include <errno.h>
    42 #include <vfs/vfs.h>
    4342
    4443#include "config.h"
     
    5251static char *find_command(char *);
    5352static int try_access(const char *);
    54 
    55 const char *search_dir[] = { "/app", "/srv", NULL };
    5653
    5754/* work-around for access() */
     
    7269static char *find_command(char *cmd)
    7370{
    74         size_t i;
     71        char *path_tok;
     72        char *path[PATH_MAX];
     73        int n = 0, i = 0;
     74        size_t x = str_size(cmd) + 2;
    7575
    7676        found = (char *)malloc(PATH_MAX);
     
    8181        }
    8282
     83        path_tok = str_dup(PATH);
     84
     85        /* Extract the PATH env to a path[] array */
     86        path[n] = strtok(path_tok, PATH_DELIM);
     87        while (NULL != path[n]) {
     88                if ((str_size(path[n]) + x ) > PATH_MAX) {
     89                        cli_error(CL_ENOTSUP,
     90                                "Segment %d of path is too large, search ends at segment %d",
     91                                n, n-1);
     92                        break;
     93                }
     94                path[++n] = strtok(NULL, PATH_DELIM);
     95        }
     96
    8397        /* We now have n places to look for the command */
    84         for (i = 0; search_dir[i] != NULL; i++) {
     98        for (i=0; path[i]; i++) {
    8599                memset(found, 0, sizeof(found));
    86                 snprintf(found, PATH_MAX, "%s/%s", search_dir[i], cmd);
     100                snprintf(found, PATH_MAX, "%s/%s", path[i], cmd);
    87101                if (-1 != try_access(found)) {
     102                        free(path_tok);
    88103                        return (char *) found;
    89104                }
     
    91106
    92107        /* We didn't find it, just give it back as-is. */
     108        free(path_tok);
    93109        return (char *) cmd;
    94110}
     
    100116        char *tmp;
    101117        int rc, retval, i;
    102         int file_handles[3];
    103         int *file_handles_p[4];
     118        fdi_node_t file_nodes[3];
     119        fdi_node_t *file_nodes_p[4];
    104120        FILE *files[3];
    105121
     
    112128       
    113129        for (i = 0; i < 3 && files[i] != NULL; i++) {
    114                 if (fhandle(files[i], &file_handles[i]) == EOK) {
    115                         file_handles_p[i] = &file_handles[i];
     130                if (fnode(files[i], &file_nodes[i]) == EOK) {
     131                        file_nodes_p[i] = &file_nodes[i];
    116132                }
    117133                else {
    118                         file_handles_p[i] = NULL;
     134                        file_nodes_p[i] = NULL;
    119135                }
    120136        }
    121         file_handles_p[i] = NULL;
     137        file_nodes_p[i] = NULL;
    122138
    123         rc = task_spawnvf(&tid, tmp, (const char **) argv, file_handles_p);
     139        rc = task_spawnvf(&tid, tmp, (const char **) argv, file_nodes_p);
    124140        free(tmp);
    125141
     
    134150                printf("%s: Failed waiting for command (%s)\n", progname,
    135151                    str_error(rc));
    136                 return 1;
    137152        } else if (texit != TASK_EXIT_NORMAL) {
    138153                printf("%s: Command failed (unexpectedly terminated)\n", progname);
    139                 return 1;
    140154        } else if (retval != 0) {
    141155                printf("%s: Command failed (exit code %d)\n",
    142156                    progname, retval);
    143                 return 1;
    144157        }
    145158
Note: See TracChangeset for help on using the changeset viewer.