diff options
author | William Wilgus <wilgus.william@gmail.com> | 2020-08-20 21:54:00 -0400 |
---|---|---|
committer | William Wilgus <wilgus.william@gmail.com> | 2020-08-20 21:54:00 -0400 |
commit | f850bbbbc4b7345bebde241f651bad1c5c28df66 (patch) | |
tree | 1574bcca604f0617130aa9f1c426cfcdc097c901 /firmware/common/rb_namespace.c | |
parent | bd744059cf959c8b9086978b32660efef5925b7d (diff) | |
download | rockbox-f850bbbbc4b7345bebde241f651bad1c5c28df66.tar.gz rockbox-f850bbbbc4b7345bebde241f651bad1c5c28df66.zip |
Revert root_redirect :(
This reverts commit 31fc46ded69be7438cca2ba2c2b93c1f200165a6.
Change-Id: Ia78618c0e8b25ca65f7c8ae0db1cb9c9b321bad9
Diffstat (limited to 'firmware/common/rb_namespace.c')
-rw-r--r-- | firmware/common/rb_namespace.c | 289 |
1 files changed, 0 insertions, 289 deletions
diff --git a/firmware/common/rb_namespace.c b/firmware/common/rb_namespace.c deleted file mode 100644 index 04f92e97af..0000000000 --- a/firmware/common/rb_namespace.c +++ /dev/null @@ -1,289 +0,0 @@ -/*************************************************************************** - * __________ __ ___. - * Open \______ \ ____ ____ | | _\_ |__ _______ ___ - * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / - * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < - * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ - * \/ \/ \/ \/ \/ - * $Id$ - * - * Copyright (C) 2017 by Michael Sevakis - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY - * KIND, either express or implied. - * - ****************************************************************************/ -#include "config.h" -#include <errno.h> -#include "fileobj_mgr.h" -#include "rb_namespace.h" - -#define ROOT_CONTENTS_INDEX (NUM_VOLUMES) -#define NUM_ROOT_ITEMS (NUM_VOLUMES+1) - -static uint8_t root_entry_flags[NUM_VOLUMES+1]; -static struct file_base_binding *root_bindp; - -static inline unsigned int get_root_item_state(int item) -{ - return root_entry_flags[item]; -} - -static inline void set_root_item_state(int item, unsigned int state) -{ - root_entry_flags[item] = state; -} - -static void get_mount_point_entry(IF_MV(int volume,) struct dirent *entry) -{ -#ifdef HAVE_MULTIVOLUME - get_volume_name(volume, entry->d_name); -#else /* */ - strcpy(entry->d_name, PATH_ROOTSTR); -#endif /* HAVE_MULTIVOLUME */ - - /* is dirinfo_native */ - entry->info.attr = ATTR_MOUNT_POINT; - entry->info.size = 0; - entry->info.wrtdate = 0; - entry->info.wrttime = 0; -} - -/* unmount the directory that enumerates into the root namespace */ -static void unmount_item(int item) -{ - unsigned int state = get_root_item_state(item); - if (!state) - return; - - if (state & NSITEM_CONTENTS) - { - fileobj_unmount(root_bindp); - root_bindp = NULL; - } - - set_root_item_state(item, 0); -} - -/* mount the directory that enumerates into the root namespace */ -int root_mount_path(const char *path, unsigned int flags) -{ -#ifdef HAVE_MULTIVOLUME - int volume = path_strip_volume(path, NULL, false); - if (volume == ROOT_VOLUME) - return -EINVAL; - - if (!CHECK_VOL(volume)) - return -ENOENT; -#else - if (!path_is_absolute(path)) - return -ENOENT; -#endif /* HAVE_MULTIVOLUME */ - - bool contents = flags & NSITEM_CONTENTS; - int item = contents ? ROOT_CONTENTS_INDEX : IF_MV_VOL(volume); - unsigned int state = get_root_item_state(item); - - if (state) - return -EBUSY; - - if (contents) - { - /* cache information about the target */ - struct filestr_base stream; - struct path_component_info compinfo; - - int e = errno; - int rc = open_stream_internal(path, FF_DIR | FF_PROBE | FF_INFO | - FF_DEVPATH, &stream, &compinfo); - if (rc <= 0) - { - rc = rc ? -errno : -ENOENT; - errno = e; - return rc; - } - - if (!fileobj_mount(&compinfo.info, FO_DIRECTORY, &root_bindp)) - return -EBUSY; - } - - state = NSITEM_MOUNTED | (flags & (NSITEM_HIDDEN|NSITEM_CONTENTS)); - set_root_item_state(item, state); - - return 0; -} - -/* inform root that an entire volume is being unmounted */ -void root_unmount_volume(IF_MV_NONVOID(int volume)) -{ - FOR_EACH_VOLUME(volume, item) - { - #ifdef HAVE_MULTIVOLUME - uint32_t state = get_root_item_state(item); - if (state && (volume < 0 || item == volume)) - #endif /* HAVE_MULTIVOLUME */ - unmount_item(item); - } - - /* if the volume unmounted contains the root directory contents then - the contents must also be unmounted */ -#ifdef HAVE_MULTIVOLUME - uint32_t state = get_root_item_state(ROOT_CONTENTS_INDEX); - if (state && (volume < 0 || BASEINFO_VOL(&root_bindp->info) == volume)) -#endif - unmount_item(ROOT_CONTENTS_INDEX); -} - -/* parse the root part of a path */ -int ns_parse_root(const char *path, const char **pathp, uint16_t *lenp) -{ - int volume = ROOT_VOLUME; - -#ifdef HAVE_MULTIVOLUME - /* this seamlessly integrates secondary filesystems into the - root namespace (e.g. "/<0>/../../<1>/../foo/." :<=> "/foo") */ - const char *p; - volume = path_strip_volume(path, &p, false); - if (volume != ROOT_VOLUME && !CHECK_VOL(volume)) - return -ENOENT; -#endif /* HAVE_MULTIVOLUME */ - - /* set name to start at last leading separator; name of root will - * be returned as "/", volume specifiers as "/<fooN>" */ - *pathp = GOBBLE_PATH_SEPCH(path) - 1; - *lenp = IF_MV( volume < NUM_VOLUMES ? p - *pathp : ) 1; - -#ifdef HAVE_MULTIVOLUME - if (*lenp > MAX_COMPNAME+1) - return -ENAMETOOLONG; -#endif - - return volume; -} - -/* open one of the items in the root */ -int ns_open_root(IF_MV(int volume,) unsigned int *callflagsp, - struct file_base_info *infop, uint16_t *attrp) -{ - unsigned int callflags = *callflagsp; - bool devpath = !!(callflags & FF_DEVPATH); -#ifdef HAVE_MULTIVOLUME - bool sysroot = volume == ROOT_VOLUME; - if (devpath && sysroot) - return -ENOENT; /* devpath needs volume spec */ -#else - bool sysroot = !devpath; /* always sysroot unless devpath */ -#endif - - int item = sysroot ? ROOT_CONTENTS_INDEX : IF_MV_VOL(volume); - unsigned int state = get_root_item_state(item); - - if (sysroot) - { - *attrp = ATTR_SYSTEM_ROOT; - - if (state) - *infop = root_bindp->info; - else - *callflagsp = callflags | FF_NOFS; /* contents not mounted */ - } - else - { - *attrp = ATTR_MOUNT_POINT; - - if (!devpath && !state) - return -ENOENT; /* regular open requires having been mounted */ - - if (fat_open_rootdir(IF_MV(volume,) &infop->fatfile) < 0) - return -ENOENT; /* not mounted */ - - get_rootinfo_internal(infop); - } - - return 0; -} - -/* read root directory entries */ -int root_readdir_dirent(struct filestr_base *stream, - struct ns_scan_info *scanp, struct dirent *entry) -{ - int rc = 0; - - int item = scanp->item; - - /* skip any not-mounted or hidden items */ - unsigned int state; - while (1) - { - if (item >= NUM_ROOT_ITEMS) - goto file_eod; - - state = get_root_item_state(item); - if ((state & (NSITEM_MOUNTED|NSITEM_HIDDEN)) == NSITEM_MOUNTED) - break; - - item++; - } - - if (item == ROOT_CONTENTS_INDEX) - { - rc = readdir_dirent(stream, &scanp->scan, entry); - if (rc < 0) - FILE_ERROR(ERRNO, rc * 10 - 1); - - if (rc == 0) - item++; - } - else - { - get_mount_point_entry(IF_MV(item,) entry); - item++; - rc = 1; - } - - scanp->item = item; - -file_eod: - if (rc == 0) - empty_dirent(entry); - -file_error: - return rc; -} - -/* opens a stream to enumerate items in a namespace container */ -int ns_open_stream(const char *path, unsigned int callflags, - struct filestr_base *stream, struct ns_scan_info *scanp) -{ - /* stream still needs synchronization even if we don't have a stream */ - static struct mutex no_contents_mtx SHAREDBSS_ATTR; - - int rc = open_stream_internal(path, callflags, stream, NULL); - if (rc < 0) - FILE_ERROR(ERRNO, rc * 10 - 1); - - scanp->item = rc > 1 ? 0 : -1; - - if (stream->flags & FDO_BUSY) - { - /* root contents are mounted */ - fat_rewind(&stream->fatstr); - } - else - { - /* root contents not mounted */ - mutex_init(&no_contents_mtx); - stream->mtx = &no_contents_mtx; - } - - ns_dirscan_rewind(scanp); - - rc = 0; -file_error: - return rc; -} |