Changeset 0b18364 in mainline for uspace/srv/vfs/vfs_ops.c


Ignore:
Timestamp:
2013-07-24T20:43:38Z (11 years ago)
Author:
Ji?? Z?rev?cky <zarevucky.jiri@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
9a8c188
Parents:
cb65bbe
Message:

Implement client side of walk and open.

File:
1 edited

Legend:

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

    rcb65bbe r0b18364  
    568568}
    569569
     570static inline bool walk_flags_valid(int flags)
     571{
     572        if ((flags&~WALK_ALL_FLAGS) != 0) {
     573                return false;
     574        }
     575        if ((flags&WALK_MAY_CREATE) && (flags&WALK_MUST_CREATE)) {
     576                return false;
     577        }
     578        if ((flags&WALK_REGULAR) && (flags&WALK_DIRECTORY)) {
     579                return false;
     580        }
     581        if ((flags&WALK_MAY_CREATE) || (flags&WALK_MUST_CREATE)) {
     582                if (!(flags&WALK_DIRECTORY) && !(flags&WALK_REGULAR)) {
     583                        return false;
     584                }
     585        }
     586        return true;
     587}
     588
     589static inline int walk_lookup_flags(int flags)
     590{
     591        int lflags = 0;
     592        if (flags&WALK_MAY_CREATE || flags&WALK_MUST_CREATE) {
     593                lflags |= L_CREATE;
     594        }
     595        if (flags&WALK_MUST_CREATE) {
     596                lflags |= L_EXCLUSIVE;
     597        }
     598        if (flags&WALK_REGULAR) {
     599                lflags |= L_FILE;
     600        }
     601        if (flags&WALK_DIRECTORY) {
     602                lflags |= L_DIRECTORY;
     603        }
     604        return lflags;
     605}
     606
    570607void vfs_walk(ipc_callid_t rid, ipc_call_t *request)
    571608{
     
    577614        int flags = IPC_GET_ARG2(*request);
    578615       
    579         if ((flags&~WALK_ALL_FLAGS) != 0) {
    580                 /* Invalid flags. */
     616        if (!walk_flags_valid(flags)) {
    581617                async_answer_0(rid, EINVAL);
    582618                return;
     
    603639       
    604640        vfs_lookup_res_t lr;
    605         rc = vfs_lookup_internal(path, 0, &lr, parent_node);
     641        rc = vfs_lookup_internal(path, walk_lookup_flags(flags), &lr, parent_node);
    606642        free(path);
    607643
Note: See TracChangeset for help on using the changeset viewer.