Changeset d6084ef in mainline for uspace/srv/vfs/vfs_lookup.c


Ignore:
Timestamp:
2008-03-02T15:05:26Z (17 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
dadcec1
Parents:
9bb85f3
Message:

Make VFS canonify path names on lookup.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/vfs/vfs_lookup.c

    r9bb85f3 rd6084ef  
    5050
    5151/* Forward static declarations. */
    52 static char *canonify(char *path);
     52static char *canonify(char *path, size_t *lenp);
    5353
    5454atomic_t plb_futex = FUTEX_INITIALIZER;
     
    5858/** Perform a path lookup.
    5959 *
    60  * @param path          Path to be resolved; it needn't be an ASCIIZ string.
    61  * @param len           Number of path characters pointed by path.
     60 * @param path          Path to be resolved; it must be a NULL-terminated
     61 *                      string.
    6262 * @param lflag         Flags to be used during lookup.
    6363 * @param result        Empty structure where the lookup result will be stored.
     
    6868 * @return              EOK on success or an error code from errno.h.
    6969 */
    70 int vfs_lookup_internal(char *path, size_t len, int lflag,
    71     vfs_lookup_res_t *result, vfs_pair_t *altroot)
     70int vfs_lookup_internal(char *path, int lflag, vfs_lookup_res_t *result,
     71    vfs_pair_t *altroot)
    7272{
    7373        vfs_pair_t *root;
    74 
    75         if (!len)
    76                 return EINVAL;
    7774
    7875        if (altroot)
     
    8380        if (!root->fs_handle)
    8481                return ENOENT;
     82       
     83        size_t len;
     84        path = canonify(path, &len);
     85        if (!path)
     86                return EINVAL;
    8587       
    8688        futex_down(&plb_futex);
     
    274276static void terminate_slash(token_t *t, token_t *tfsl, token_t *tlcomp)
    275277{
    276         tfsl->stop[1] = '\0';
     278        if (tfsl->stop[1])      /* avoid writing to a well-formatted path */
     279                tfsl->stop[1] = '\0';
    277280}
    278281static void remove_trailing_slash(token_t *t, token_t *tfsl, token_t *tlcomp)
     
    435438 * It works in-place and requires a NULL-terminated input string.
    436439 *
    437  * @param               Path to be canonified.
     440 * @param path          Path to be canonified.
     441 * @param lenp          Pointer where the length of the final path will be
     442 *                      stored. Can be NULL.
    438443 *
    439444 * @return              Canonified path or NULL on failure.
    440445 */
    441 char *canonify(char *path)
     446char *canonify(char *path, size_t *lenp)
    442447{
    443448        state_t state;
     
    451456        state = S_INI;
    452457        t = tfsl;
     458        tlcomp = tfsl;
    453459        while (state != S_ACCEPT && state != S_RESTART && state != S_REJECT) {
    454460                if (trans[state][t.kind].f)
     
    464470                return NULL;
    465471        case S_ACCEPT:
     472                if (lenp)
     473                        *lenp = (size_t)((tlcomp.stop - tfsl.start) + 1);
    466474                return tfsl.start;
    467475        default:
Note: See TracChangeset for help on using the changeset viewer.