Fork us on GitHub Follow us on Facebook Follow us on Twitter

Changeset 1e2e5795 in mainline


Ignore:
Timestamp:
2017-04-02T19:20:21Z (3 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
master
Children:
d96d9bc
Parents:
d4067a7
Message:

Factor out code to lookup the parent and copy out the child component

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/c/generic/vfs/vfs.c

    rd4067a7 r1e2e5795  
    630630}
    631631
     632static int get_parent_and_child(const char *path, char **child)
     633{
     634        size_t size;
     635        char *apath = vfs_absolutize(path, &size);
     636        if (!apath)
     637                return ENOMEM;
     638
     639        char *slash = str_rchr(apath, L'/');
     640        int parent;
     641        if (slash == apath) {
     642                parent = vfs_root();
     643                *child = apath;
     644        } else {
     645                *slash = '\0';
     646                parent = vfs_lookup(apath, WALK_DIRECTORY);
     647                if (parent < 0) {
     648                        free(apath);
     649                        return parent;
     650                }
     651                *slash = '/';
     652                *child = str_dup(slash);
     653                free(apath);
     654                if (!*child) {
     655                        vfs_put(parent);
     656                        return ENOMEM;
     657                }
     658        }
     659
     660        return parent;
     661}
     662
    632663int vfs_link(int parent, const char *child, vfs_file_kind_t kind)
    633664{
     
    651682int vfs_link_path(const char *path, vfs_file_kind_t kind)
    652683{
    653         size_t pa_size;
    654         char *pa = vfs_absolutize(path, &pa_size);
    655         if (!pa)
    656                 return ENOMEM;
    657 
    658         int parent;
    659         char *slash = str_rchr(pa, L'/');
    660         if (slash != pa) {
    661                 *slash = '\0';
    662                 parent = vfs_lookup(pa, WALK_DIRECTORY);
    663                 *slash = '/';
    664         } else {
    665                 parent = vfs_root();
    666         }
    667 
    668         if (parent < 0) {
    669                 free(pa);
     684        char *child;
     685        int parent = get_parent_and_child(path, &child);
     686        if (parent < 0)
    670687                return parent;
    671         }
    672 
    673         int rc = vfs_link(parent, slash, kind);
    674 
    675         free(pa);
     688
     689        int rc = vfs_link(parent, child, kind);
     690
     691        free(child);
    676692        vfs_put(parent);
    677693        return rc;
     
    705721int vfs_unlink_path(const char *path)
    706722{
    707         size_t pa_size;
    708         char *pa = vfs_absolutize(path, &pa_size);
    709         if (!pa)
    710                 return ENOMEM;
    711 
    712         int parent;
    713723        int expect = vfs_lookup(path, 0);
    714         if (expect < 0) {
    715                 free(pa);
     724        if (expect < 0)
    716725                return expect;
    717         }
    718 
    719         char *slash = str_rchr(pa, L'/');
    720         if (slash != pa) {
    721                 *slash = '\0';
    722                 parent = vfs_lookup(pa, 0);
    723                 *slash = '/';
    724         } else {
    725                 parent = vfs_root();
    726         }
    727 
     726
     727        char *child;
     728        int parent = get_parent_and_child(path, &child);
    728729        if (parent < 0) {
    729                 free(pa);
    730730                vfs_put(expect);
    731731                return parent;
    732732        }
    733733
    734         int rc = vfs_unlink(parent, slash, expect);
    735        
    736         free(pa);
     734        int rc = vfs_unlink(parent, child, expect);
     735       
     736        free(child);
    737737        vfs_put(parent);
    738738        vfs_put(expect);
Note: See TracChangeset for help on using the changeset viewer.