1
0
Fork 0
forked from len0rd/rockbox

Revert root_redirect :(

This reverts commit 31fc46ded6.

Change-Id: Ia78618c0e8b25ca65f7c8ae0db1cb9c9b321bad9
This commit is contained in:
William Wilgus 2020-08-20 21:54:00 -04:00
parent bd744059cf
commit f850bbbbc4
19 changed files with 215 additions and 645 deletions

View file

@ -20,16 +20,7 @@
****************************************************************************/
#ifndef _DIRCACHE_REDIRECT_H_
#include "rbpaths.h"
#include "pathfuncs.h"
#include "dir.h"
#include "dircache.h"
#if defined(HAVE_MULTIBOOT) && !defined(SIMULATOR)
#include "rb-loader.h"
#include "bootdata.h"
#include "crc32.h"
#endif
/***
** Internal redirects that depend upon whether or not dircache is made
@ -132,56 +123,10 @@ static inline void fileop_onsync_internal(struct filestr_base *stream)
static inline void volume_onmount_internal(IF_MV_NONVOID(int volume))
{
#ifdef HAVE_MULTIVOLUME
char path[VOL_MAX_LEN+2];
make_volume_root(volume, path);
#else
const char *path = PATH_ROOTSTR;
#endif
#if defined(HAVE_MULTIBOOT) && !defined(SIMULATOR)
static char rtpath[VOL_MAX_LEN+2] = RB_ROOT_CONTENTS_DIR;
static bool redirected = false;
int boot_volume = 0;
unsigned int crc = 0;
crc = crc_32(boot_data.payload, boot_data.length, 0xffffffff);
if (crc == boot_data.crc)
{
root_mount_path(path, 0); /*root could be different folder don't hide*/
boot_volume = boot_data.boot_volume; /* boot volume contained in uint8_t payload */
//root_mount_path(path, volume == boot_volume ? NSITEM_HIDDEN : 0);
if (!redirected && volume == boot_volume)
{
if (get_redirect_dir(rtpath, sizeof(rtpath), volume, "", "") < 0)
{ /* Error occurred, card removed? Set root to default */
root_mount_path(RB_ROOT_CONTENTS_DIR, NSITEM_CONTENTS);
}
else
redirected = true;
}
if (redirected && volume == boot_volume)
root_mount_path(rtpath, NSITEM_CONTENTS);
} /*CRC OK*/
else
{
root_mount_path(path, RB_ROOT_VOL_HIDDEN(volume) ? NSITEM_HIDDEN : 0);
if (volume == path_strip_volume(RB_ROOT_CONTENTS_DIR, NULL, false))
root_mount_path(RB_ROOT_CONTENTS_DIR, NSITEM_CONTENTS);
}
#else
root_mount_path(path, RB_ROOT_VOL_HIDDEN(volume) ? NSITEM_HIDDEN : 0);
#ifdef HAVE_MULTIVOLUME
if (volume == path_strip_volume(RB_ROOT_CONTENTS_DIR, NULL, false))
#endif
root_mount_path(RB_ROOT_CONTENTS_DIR, NSITEM_CONTENTS);
#endif /* HAVE_MULTIBOOT */
#ifdef HAVE_DIRCACHE
dircache_mount();
#endif
IF_MV( (void)volume; )
}
static inline void volume_onunmount_internal(IF_MV_NONVOID(int volume))
@ -190,7 +135,6 @@ static inline void volume_onunmount_internal(IF_MV_NONVOID(int volume))
/* First, to avoid update of something about to be destroyed anyway */
dircache_unmount(IF_MV(volume));
#endif
root_unmount_volume(IF_MV(volume));
fileobj_mgr_unmount(IF_MV(volume));
}

View file

@ -72,18 +72,16 @@ enum fildes_and_obj_flags
/* used in descriptor and common */
FDO_BUSY = 0x0001, /* descriptor/object is in use */
/* only used in individual stream descriptor */
FD_VALID = 0x0002, /* descriptor is valid but not registered */
FD_WRITE = 0x0004, /* descriptor has write mode */
FD_WRONLY = 0x0008, /* descriptor is write mode only */
FD_APPEND = 0x0010, /* descriptor is append mode */
FD_WRITE = 0x0002, /* descriptor has write mode */
FD_WRONLY = 0x0004, /* descriptor is write mode only */
FD_APPEND = 0x0008, /* descriptor is append mode */
FD_NONEXIST = 0x8000, /* closed but not freed (uncombined) */
/* only used as common flags */
FO_DIRECTORY = 0x0020, /* fileobj is a directory */
FO_TRUNC = 0x0040, /* fileobj is opened to be truncated */
FO_REMOVED = 0x0080, /* fileobj was deleted while open */
FO_SINGLE = 0x0100, /* fileobj has only one stream open */
FO_MOUNTTARGET = 0x0200, /* fileobj kept open as a mount target */
FDO_MASK = 0x03ff,
FO_DIRECTORY = 0x0010, /* fileobj is a directory */
FO_TRUNC = 0x0020, /* fileobj is opened to be truncated */
FO_REMOVED = 0x0040, /* fileobj was deleted while open */
FO_SINGLE = 0x0080, /* fileobj has only one stream open */
FDO_MASK = 0x00ff,
FDO_CHG_MASK = FO_TRUNC, /* fileobj permitted external change */
/* bitflags that instruct various 'open' functions how to behave;
* saved in stream flags (only) but not used by manager */
@ -97,9 +95,7 @@ enum fildes_and_obj_flags
FF_CACHEONLY = 0x00200000, /* succeed only if in dircache */
FF_INFO = 0x00400000, /* return info on self */
FF_PARENTINFO = 0x00800000, /* return info on parent */
FF_DEVPATH = 0x01000000, /* path is a device path, not root-based */
FF_NOFS = 0x02000000, /* no filesystem mounted here */
FF_MASK = 0x03ff0000,
FF_MASK = 0x00ff0000,
};
/** Common data structures used throughout **/

View file

@ -29,11 +29,6 @@ void file_binding_remove(struct file_base_binding *bindp);
void file_binding_remove_next(struct file_base_binding *prevp,
struct file_base_binding *bindp);
bool fileobj_mount(const struct file_base_info *srcinfop,
unsigned int callflags,
struct file_base_binding **bindpp);
void fileobj_unmount(struct file_base_binding *bindp);
void fileobj_fileop_open(struct filestr_base *stream,
const struct file_base_info *srcinfop,
unsigned int callflags);

View file

@ -51,19 +51,12 @@
/* internal functions open streams as well; make sure they don't fail if all
user descs are busy; this needs to be at least the greatest quantity needed
at once by all internal functions */
/* internal functions open streams as well; make sure they don't fail if all
user descs are busy; this needs to be at least the greatest quantity needed
at once by all internal functions */
#define MOUNT_AUX_FILEOBJS 1
#ifdef HAVE_DIRCACHE
#define DIRCACHE_AUX_FILEOBJS 1
#define AUX_FILEOBJS 3
#else
#define DIRCACHE_AUX_FILEOBJS 0
#define AUX_FILEOBJS 2
#endif
#define AUX_FILEOBJS (2+DIRCACHE_AUX_FILEOBJS+MOUNT_AUX_FILEOBJS)
/* number of components statically allocated to handle the vast majority
of path depths; should maybe be tuned for >= 90th percentile but for now,
imma just guessing based on something like:

View file

@ -1,79 +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.
*
****************************************************************************/
#ifndef RB_NAMESPACE_H
#define RB_NAMESPACE_H
#include "file_internal.h"
enum ns_item_flags
{
NSITEM_MOUNTED = 0x01, /* item is mounted */
NSITEM_HIDDEN = 0x02, /* item is not enumerated */
NSITEM_CONTENTS = 0x04, /* contents enumerate */
};
struct ns_scan_info
{
struct dirscan_info scan; /* dirscan info - first! */
int item; /* current item in parent */
};
/* root functions */
int root_mount_path(const char *path, unsigned int flags);
void root_unmount_volume(IF_MV_NONVOID(int volume));
int root_readdir_dirent(struct filestr_base *stream,
struct ns_scan_info *scanp,
struct dirent *entry);
/* namespace functions */
int ns_parse_root(const char *path, const char **pathp, uint16_t *lenp);
int ns_open_root(IF_MV(int volume,) unsigned int *callflagsp,
struct file_base_info *infop, uint16_t *attrp);
int ns_open_stream(const char *path, unsigned int callflags,
struct filestr_base *stream, struct ns_scan_info *scanp);
/* closes the namespace stream */
static inline int ns_close_stream(struct filestr_base *stream)
{
return close_stream_internal(stream);
}
#include "dircache_redirect.h"
static inline void ns_dirscan_rewind(struct ns_scan_info *scanp)
{
rewinddir_dirent(&scanp->scan);
if (scanp->item != -1)
scanp->item = 0;
}
static inline int ns_readdir_dirent(struct filestr_base *stream,
struct ns_scan_info *scanp,
struct dirent *entry)
{
if (scanp->item == -1)
return readdir_dirent(stream, &scanp->scan, entry);
else
return root_readdir_dirent(stream, scanp, entry);
}
#endif /* RB_NAMESPACE_H */