Changeset aeeaf0f in mainline for uspace/app/bdsh/exec.c


Ignore:
Timestamp:
2019-05-19T07:28:42Z (5 years ago)
Author:
GitHub <noreply@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
a78cdcd
Parents:
6aeb60f (diff), 587867a (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
git-author:
Jakub Jermář <jakub@…> (2019-05-19 07:28:42)
git-committer:
GitHub <noreply@…> (2019-05-19 07:28:42)
Message:

Merge pull request #163 from matthieuriolo/ticket_684_improved

Ticket 684 improved

File:
1 edited

Legend:

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

    r6aeb60f raeeaf0f  
    4747#include "errors.h"
    4848
    49 /* FIXME: Just have find_command() return an allocated string */
    50 static char *found;
    51 
    52 static char *find_command(char *);
     49static errno_t find_command(char *, char **);
    5350static int try_access(const char *);
    5451
     
    6865}
    6966
    70 /** Returns the full path of "cmd" if cmd is found
     67/** Returns EOK if no internal failure or else ENOMEM
    7168 *
    72  * else just hand back cmd as it was presented
     69 * When the parameter `cmd` can be found then the absolute path will be set in `found`.
     70 * Or else `found` will be NULL.
     71 * `found` will be newly allocated and must be freed by the caller
    7372 */
    74 static char *find_command(char *cmd)
     73static errno_t find_command(char *cmd, char **found)
    7574{
    76         size_t i;
     75        /* The user has specified a full or relative path, just give it back. */
     76        if (is_path(cmd)) {
     77                if (-1 != try_access(cmd)) {
     78                        *found = str_dup(cmd);
     79                        return EOK;
     80                }
    7781
    78         found = (char *)malloc(PATH_MAX);
     82                *found = NULL;
     83                return EOK;
     84        }
    7985
    80         /* The user has specified a full or relative path, just give it back. */
    81         if (-1 != try_access(cmd)) {
    82                 return (char *) cmd;
     86        *found = (char *)malloc(PATH_MAX);
     87        if (*found == NULL) {
     88                return ENOMEM;
    8389        }
    8490
    8591        /* We now have n places to look for the command */
     92        size_t i;
     93        size_t cmd_length = str_length(cmd);
    8694        for (i = 0; search_dir[i] != NULL; i++) {
    87                 memset(found, 0, PATH_MAX);
    88                 snprintf(found, PATH_MAX, "%s/%s", search_dir[i], cmd);
    89                 if (-1 != try_access(found)) {
    90                         return (char *) found;
     95                if (str_length(search_dir[i]) + cmd_length + 2 > PATH_MAX) {
     96                        free(*found);
     97                        return ENOMEM;
     98                }
     99
     100                memset(*found, 0, PATH_MAX);
     101                snprintf(*found, PATH_MAX, "%s/%s", search_dir[i], cmd);
     102                if (-1 != try_access(*found)) {
     103                        return EOK;
    91104                }
    92105        }
     106        free(*found);
     107        *found = NULL;
    93108
    94         /* We didn't find it, just give it back as-is. */
    95         return (char *) cmd;
     109        /* We didn't find it, return NULL */
     110        return EOK;
    96111}
    97112
     
    107122        FILE *files[3];
    108123
    109         tmp = str_dup(find_command(cmd));
    110         free(found);
     124        rc = find_command(cmd, &tmp);
     125        if (rc != EOK) {
     126                cli_error(CL_ENOMEM, "%s: failure executing find_command()", progname);
     127                return 1;
     128        }
     129
     130        if (tmp == NULL) {
     131                cli_error(CL_EEXEC, "%s: Command not found '%s'", progname, cmd);
     132                return 1;
     133        }
    111134
    112135        files[0] = io->stdin;
Note: See TracChangeset for help on using the changeset viewer.