file_system/fat: Rework driver for fs_shell support
* Introduce fat_shell for build system fat manipulation * Will theoretically let us do away with mtools when we have another internal tool for partition manipulation Change-Id: I661be556e79009842f157a9402c8f85da85d6336 Reviewed-on: https://review.haiku-os.org/c/haiku/+/3556 Reviewed-by: Adrien Destugues <[email protected]>
This commit is contained in:
@@ -1402,6 +1402,8 @@
|
|||||||
#define index fssh_index
|
#define index fssh_index
|
||||||
#define rindex fssh_rindex
|
#define rindex fssh_rindex
|
||||||
|
|
||||||
|
/* SMAP-specific functions */
|
||||||
|
#define user_strlcpy fssh_strlcpy
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
// #pragma mark - fssh_time.h
|
// #pragma mark - fssh_time.h
|
||||||
|
|||||||
@@ -2,22 +2,20 @@ SubDir HAIKU_TOP src add-ons kernel file_systems fat ;
|
|||||||
|
|
||||||
UsePrivateKernelHeaders ;
|
UsePrivateKernelHeaders ;
|
||||||
|
|
||||||
SubDirCcFlags -DTRACK_FILENAME ;
|
|
||||||
|
|
||||||
KernelAddon fat :
|
KernelAddon fat :
|
||||||
attr.c
|
attr.cpp
|
||||||
dir.c
|
dir.cpp
|
||||||
dlist.c
|
dlist.cpp
|
||||||
dosfs.c
|
dosfs.cpp
|
||||||
encodings.cpp
|
encodings.cpp
|
||||||
fat.c
|
fat.cpp
|
||||||
file.c
|
file.cpp
|
||||||
iter.c
|
iter.cpp
|
||||||
mime_ext_table.c
|
mime_ext_table.c
|
||||||
mkdos.cpp
|
mkdos.cpp
|
||||||
util.c
|
util.cpp
|
||||||
vcache.c
|
vcache.cpp
|
||||||
version.c
|
version.cpp
|
||||||
;
|
;
|
||||||
|
|
||||||
SEARCH on [ FGristFiles mime_ext_table.c ]
|
SEARCH on [ FGristFiles mime_ext_table.c ]
|
||||||
|
|||||||
+9
-7
@@ -11,25 +11,27 @@
|
|||||||
|
|
||||||
#define MIME_STRING_TYPE 'MIMS'
|
#define MIME_STRING_TYPE 'MIMS'
|
||||||
|
|
||||||
#include <SupportDefs.h>
|
#include "system_dependencies.h"
|
||||||
#include <KernelExport.h>
|
|
||||||
|
|
||||||
#include <dirent.h>
|
#ifndef FS_SHELL
|
||||||
#include <file_systems/mime_ext_table.h>
|
#include <file_systems/mime_ext_table.h>
|
||||||
#include <fs_attr.h>
|
#endif
|
||||||
#include <string.h>
|
|
||||||
#include <malloc.h>
|
|
||||||
|
|
||||||
#include "dosfs.h"
|
#include "dosfs.h"
|
||||||
#include "attr.h"
|
#include "attr.h"
|
||||||
|
|
||||||
|
|
||||||
int32 kBeOSTypeCookie = 0x1234;
|
int32 kBeOSTypeCookie = 0x1234;
|
||||||
|
|
||||||
#define DPRINTF(a,b) if (debug_attr > (a)) dprintf b
|
#define DPRINTF(a,b) if (debug_attr > (a)) dprintf b
|
||||||
|
|
||||||
status_t set_mime_type(vnode *node, const char *filename)
|
status_t set_mime_type(vnode *node, const char *filename)
|
||||||
{
|
{
|
||||||
|
#ifdef FS_SHELL
|
||||||
|
return B_ERROR;
|
||||||
|
#else
|
||||||
return set_mime(&node->mime, filename);
|
return set_mime(&node->mime, filename);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -234,7 +236,7 @@ dosfs_read_attr(fs_volume *_vol, fs_vnode *_node, void *_cookie, off_t pos,
|
|||||||
return EINVAL;
|
return EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
length = user_strlcpy(buffer, node->mime + pos, *_length);
|
length = user_strlcpy((char*)buffer, node->mime + pos, *_length);
|
||||||
if (length < B_OK) {
|
if (length < B_OK) {
|
||||||
UNLOCK_VOL(vol);
|
UNLOCK_VOL(vol);
|
||||||
return B_BAD_ADDRESS;
|
return B_BAD_ADDRESS;
|
||||||
@@ -5,7 +5,7 @@
|
|||||||
#ifndef _DOSFS_ATTR_H_
|
#ifndef _DOSFS_ATTR_H_
|
||||||
#define _DOSFS_ATTR_H_
|
#define _DOSFS_ATTR_H_
|
||||||
|
|
||||||
#include <fs_attr.h>
|
#include "system_dependencies.h"
|
||||||
|
|
||||||
status_t set_mime_type(vnode *node, const char *filename);
|
status_t set_mime_type(vnode *node, const char *filename);
|
||||||
|
|
||||||
|
|||||||
+16
-27
@@ -5,15 +5,7 @@
|
|||||||
|
|
||||||
#include "dir.h"
|
#include "dir.h"
|
||||||
|
|
||||||
#include <dirent.h>
|
#include "system_dependencies.h"
|
||||||
#include <stdlib.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <time.h>
|
|
||||||
|
|
||||||
#include <fs_cache.h>
|
|
||||||
#include <fs_info.h>
|
|
||||||
#include <KernelExport.h>
|
|
||||||
|
|
||||||
#include "iter.h"
|
#include "iter.h"
|
||||||
#include "dosfs.h"
|
#include "dosfs.h"
|
||||||
@@ -28,9 +20,6 @@
|
|||||||
|
|
||||||
#define DPRINTF(a,b) if (debug_dir > (a)) dprintf b
|
#define DPRINTF(a,b) if (debug_dir > (a)) dprintf b
|
||||||
|
|
||||||
// used here and in encodings.cpp
|
|
||||||
const char acceptable[]="!#$%&'()-0123456789@ABCDEFGHIJKLMNOPQRSTUVWXYZ^_`{}~";
|
|
||||||
const char illegal[] = "\\/:*?\"<>|";
|
|
||||||
|
|
||||||
typedef struct dircookie {
|
typedef struct dircookie {
|
||||||
uint32 current_index;
|
uint32 current_index;
|
||||||
@@ -826,7 +815,7 @@ is_filename_legal(const char *name)
|
|||||||
for (i = 0; i < len; i++) {
|
for (i = 0; i < len; i++) {
|
||||||
if (name[i] & 0x80)
|
if (name[i] & 0x80)
|
||||||
continue; //belongs to an utf8 char
|
continue; //belongs to an utf8 char
|
||||||
if (strchr(illegal, name[i]))
|
if (strchr(sIllegal, name[i]))
|
||||||
return false;
|
return false;
|
||||||
if ((unsigned char)name[i] < 32)
|
if ((unsigned char)name[i] < 32)
|
||||||
return false;
|
return false;
|
||||||
@@ -937,7 +926,7 @@ status_t
|
|||||||
dosfs_read_vnode(fs_volume *_vol, ino_t vnid, fs_vnode *_node, int *_type,
|
dosfs_read_vnode(fs_volume *_vol, ino_t vnid, fs_vnode *_node, int *_type,
|
||||||
uint32 *_flags, bool reenter)
|
uint32 *_flags, bool reenter)
|
||||||
{
|
{
|
||||||
nspace *vol = (nspace*)_vol->private_volume;
|
nspace *vol = (nspace *)_vol->private_volume;
|
||||||
int result = B_NO_ERROR;
|
int result = B_NO_ERROR;
|
||||||
ino_t loc, dir_vnid;
|
ino_t loc, dir_vnid;
|
||||||
vnode *entry;
|
vnode *entry;
|
||||||
@@ -1007,7 +996,7 @@ dosfs_read_vnode(fs_volume *_vol, ino_t vnid, fs_vnode *_node, int *_type,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((entry = calloc(sizeof(struct vnode), 1)) == NULL) {
|
if ((entry = (vnode *)calloc(sizeof(struct vnode), 1)) == NULL) {
|
||||||
DPRINTF(0, ("dosfs_read_vnode: out of memory\n"));
|
DPRINTF(0, ("dosfs_read_vnode: out of memory\n"));
|
||||||
result = ENOMEM;
|
result = ENOMEM;
|
||||||
goto bi2;
|
goto bi2;
|
||||||
@@ -1044,10 +1033,10 @@ dosfs_read_vnode(fs_volume *_vol, ino_t vnid, fs_vnode *_node, int *_type,
|
|||||||
entry->end_cluster = 0;
|
entry->end_cluster = 0;
|
||||||
entry->st_time = dos2time_t(info.time);
|
entry->st_time = dos2time_t(info.time);
|
||||||
entry->st_crtim = dos2time_t(info.creation_time);
|
entry->st_crtim = dos2time_t(info.creation_time);
|
||||||
#if TRACK_FILENAME
|
|
||||||
entry->filename = malloc(sizeof(filename) + 1);
|
entry->filename = (char *)malloc(sizeof(filename) + 1);
|
||||||
if (entry->filename) strcpy(entry->filename, filename);
|
if (entry->filename) strcpy(entry->filename, filename);
|
||||||
#endif
|
|
||||||
entry->cache = file_cache_create(vol->id, vnid, entry->st_size);
|
entry->cache = file_cache_create(vol->id, vnid, entry->st_size);
|
||||||
entry->file_map = file_map_create(vol->id, vnid, entry->st_size);
|
entry->file_map = file_map_create(vol->id, vnid, entry->st_size);
|
||||||
if (!(entry->mode & FAT_SUBDIR))
|
if (!(entry->mode & FAT_SUBDIR))
|
||||||
@@ -1073,8 +1062,8 @@ dosfs_walk(fs_volume *_vol, fs_vnode *_dir, const char *file, ino_t *_vnid)
|
|||||||
{
|
{
|
||||||
/* Starting at the base, find file in the subdir, and return path
|
/* Starting at the base, find file in the subdir, and return path
|
||||||
string and vnode id of file. */
|
string and vnode id of file. */
|
||||||
nspace *vol = (nspace*)_vol->private_volume;
|
nspace *vol = (nspace *)_vol->private_volume;
|
||||||
vnode *dir = (vnode*)_dir->private_node;
|
vnode *dir = (vnode *)_dir->private_node;
|
||||||
vnode *vnode = NULL;
|
vnode *vnode = NULL;
|
||||||
status_t result = ENOENT;
|
status_t result = ENOENT;
|
||||||
|
|
||||||
@@ -1141,8 +1130,8 @@ dosfs_readlink(fs_volume *_vol, fs_vnode *_node, char *buf, size_t *bufsize)
|
|||||||
status_t
|
status_t
|
||||||
dosfs_opendir(fs_volume *_vol, fs_vnode *_node, void **_cookie)
|
dosfs_opendir(fs_volume *_vol, fs_vnode *_node, void **_cookie)
|
||||||
{
|
{
|
||||||
nspace *vol = (nspace*)_vol->private_volume;
|
nspace *vol = (nspace *)_vol->private_volume;
|
||||||
vnode *node = (vnode*)_node->private_node;
|
vnode *node = (vnode *)_node->private_node;
|
||||||
dircookie *cookie = NULL;
|
dircookie *cookie = NULL;
|
||||||
int result;
|
int result;
|
||||||
|
|
||||||
@@ -1173,7 +1162,7 @@ dosfs_opendir(fs_volume *_vol, fs_vnode *_node, void **_cookie)
|
|||||||
result = B_NO_ERROR;
|
result = B_NO_ERROR;
|
||||||
|
|
||||||
bi:
|
bi:
|
||||||
*_cookie = (void*)cookie;
|
*_cookie = (void *)cookie;
|
||||||
|
|
||||||
if (result != B_OK)
|
if (result != B_OK)
|
||||||
DPRINTF(0, ("dosfs_opendir (%s)\n", strerror(result)));
|
DPRINTF(0, ("dosfs_opendir (%s)\n", strerror(result)));
|
||||||
@@ -1189,9 +1178,9 @@ dosfs_readdir(fs_volume *_vol, fs_vnode *_dir, void *_cookie,
|
|||||||
struct dirent *entry, size_t bufsize, uint32 *num)
|
struct dirent *entry, size_t bufsize, uint32 *num)
|
||||||
{
|
{
|
||||||
int result = ENOENT;
|
int result = ENOENT;
|
||||||
nspace* vol = (nspace*)_vol->private_volume;
|
nspace* vol = (nspace *)_vol->private_volume;
|
||||||
vnode *dir = (vnode *)_dir->private_node;
|
vnode *dir = (vnode *)_dir->private_node;
|
||||||
dircookie* cookie = (dircookie*)_cookie;
|
dircookie* cookie = (dircookie *)_cookie;
|
||||||
struct diri diri;
|
struct diri diri;
|
||||||
|
|
||||||
LOCK_VOL(vol);
|
LOCK_VOL(vol);
|
||||||
@@ -1265,7 +1254,7 @@ dosfs_rewinddir(fs_volume *_vol, fs_vnode *_node, void* _cookie)
|
|||||||
{
|
{
|
||||||
nspace *vol = (nspace *)_vol->private_volume;
|
nspace *vol = (nspace *)_vol->private_volume;
|
||||||
vnode *node = (vnode *)_node->private_node;
|
vnode *node = (vnode *)_node->private_node;
|
||||||
dircookie *cookie = (dircookie*)_cookie;
|
dircookie *cookie = (dircookie *)_cookie;
|
||||||
|
|
||||||
LOCK_VOL(vol);
|
LOCK_VOL(vol);
|
||||||
|
|
||||||
@@ -1295,7 +1284,7 @@ dosfs_free_dircookie(fs_volume *_vol, fs_vnode *_node, void *_cookie)
|
|||||||
{
|
{
|
||||||
nspace *vol = (nspace *)_vol->private_volume;
|
nspace *vol = (nspace *)_vol->private_volume;
|
||||||
vnode *node = (vnode *)_node->private_node;
|
vnode *node = (vnode *)_node->private_node;
|
||||||
dircookie *cookie = _cookie;
|
dircookie *cookie = (dircookie *)_cookie;
|
||||||
|
|
||||||
LOCK_VOL(vol);
|
LOCK_VOL(vol);
|
||||||
|
|
||||||
+3
-6
@@ -19,10 +19,7 @@ TODO:
|
|||||||
|
|
||||||
#define DPRINTF(a,b) if (debug_dlist > (a)) dprintf b
|
#define DPRINTF(a,b) if (debug_dlist > (a)) dprintf b
|
||||||
|
|
||||||
#include <KernelExport.h>
|
#include "system_dependencies.h"
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#include "dosfs.h"
|
#include "dosfs.h"
|
||||||
#include "dlist.h"
|
#include "dlist.h"
|
||||||
@@ -43,7 +40,7 @@ dlist_init(nspace *vol)
|
|||||||
|
|
||||||
vol->dlist.entries = 0;
|
vol->dlist.entries = 0;
|
||||||
vol->dlist.allocated = DLIST_ENTRY_QUANTUM;
|
vol->dlist.allocated = DLIST_ENTRY_QUANTUM;
|
||||||
vol->dlist.vnid_list = malloc(sizeof(ino_t) * vol->dlist.allocated);
|
vol->dlist.vnid_list = (ino_t *)malloc(sizeof(ino_t) * vol->dlist.allocated);
|
||||||
if (vol->dlist.vnid_list == NULL) {
|
if (vol->dlist.vnid_list == NULL) {
|
||||||
vol->dlist.allocated = 0;
|
vol->dlist.allocated = 0;
|
||||||
dprintf("dlist_init: out of core\n");
|
dprintf("dlist_init: out of core\n");
|
||||||
@@ -79,7 +76,7 @@ dlist_realloc(nspace *vol, uint32 allocate)
|
|||||||
ASSERT(allocate != vol->dlist.allocated);
|
ASSERT(allocate != vol->dlist.allocated);
|
||||||
ASSERT(allocate > vol->dlist.entries);
|
ASSERT(allocate > vol->dlist.entries);
|
||||||
|
|
||||||
vnid_list = malloc(sizeof(ino_t) * allocate);
|
vnid_list = (ino_t *)malloc(sizeof(ino_t) * allocate);
|
||||||
if (vnid_list == NULL) {
|
if (vnid_list == NULL) {
|
||||||
dprintf("dlist_realloc: out of core\n");
|
dprintf("dlist_realloc: out of core\n");
|
||||||
return ENOMEM;
|
return ENOMEM;
|
||||||
+5
-40
@@ -6,22 +6,7 @@
|
|||||||
|
|
||||||
#include "dosfs.h"
|
#include "dosfs.h"
|
||||||
|
|
||||||
#include <stdio.h>
|
#include "system_dependencies.h"
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <sys/stat.h>
|
|
||||||
#include <time.h>
|
|
||||||
|
|
||||||
#include <KernelExport.h>
|
|
||||||
#include <Drivers.h>
|
|
||||||
#include <driver_settings.h>
|
|
||||||
|
|
||||||
#include <scsi.h>
|
|
||||||
|
|
||||||
#include <fs_info.h>
|
|
||||||
#include <fs_interface.h>
|
|
||||||
#include <fs_cache.h>
|
|
||||||
#include <fs_volume.h>
|
|
||||||
|
|
||||||
#include "attr.h"
|
#include "attr.h"
|
||||||
#include "dir.h"
|
#include "dir.h"
|
||||||
@@ -109,9 +94,8 @@ debug_dvnode(int argc, char **argv)
|
|||||||
if (!n) continue;
|
if (!n) continue;
|
||||||
|
|
||||||
kprintf("vnode @ %p", n);
|
kprintf("vnode @ %p", n);
|
||||||
#if TRACK_FILENAME
|
|
||||||
kprintf(" (%s)", n->filename);
|
kprintf(" (%s)", n->filename);
|
||||||
#endif
|
|
||||||
kprintf("\nvnid %" B_PRIdINO ", dir vnid %" B_PRIdINO "\n", n->vnid,
|
kprintf("\nvnid %" B_PRIdINO ", dir vnid %" B_PRIdINO "\n", n->vnid,
|
||||||
n->dir_vnid);
|
n->dir_vnid);
|
||||||
kprintf("iteration %" B_PRIu32 ", si=%" B_PRIu32 ", ei=%" B_PRIu32
|
kprintf("iteration %" B_PRIu32 ", si=%" B_PRIu32 ", ei=%" B_PRIu32
|
||||||
@@ -498,13 +482,6 @@ volume_count_free_cluster(nspace *vol)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int
|
|
||||||
lock_removable_device(int fd, bool state)
|
|
||||||
{
|
|
||||||
return ioctl(fd, B_SCSI_PREVENT_ALLOW, &state, sizeof(state));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static status_t
|
static status_t
|
||||||
mount_fat_disk(const char *path, fs_volume *_vol, const int flags,
|
mount_fat_disk(const char *path, fs_volume *_vol, const int flags,
|
||||||
nspace** newVol, int fs_flags, int op_sync_mode)
|
nspace** newVol, int fs_flags, int op_sync_mode)
|
||||||
@@ -564,10 +541,6 @@ mount_fat_disk(const char *path, fs_volume *_vol, const int flags,
|
|||||||
strerror(err));
|
strerror(err));
|
||||||
goto error0;
|
goto error0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((vol_flags & B_FS_IS_REMOVABLE)
|
|
||||||
&& (fs_flags & FS_FLAGS_LOCK_DOOR))
|
|
||||||
lock_removable_device(fd, true);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// see if we need to go into op sync mode
|
// see if we need to go into op sync mode
|
||||||
@@ -685,11 +658,6 @@ mount_fat_disk(const char *path, fs_volume *_vol, const int flags,
|
|||||||
error3:
|
error3:
|
||||||
uninit_vcache(vol);
|
uninit_vcache(vol);
|
||||||
error2:
|
error2:
|
||||||
if (!(vol->flags & B_FS_IS_READONLY) && (vol->flags & B_FS_IS_REMOVABLE)
|
|
||||||
&& (vol->fs_flags & FS_FLAGS_LOCK_DOOR)) {
|
|
||||||
lock_removable_device(fd, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
volume_uninit(vol);
|
volume_uninit(vol);
|
||||||
error1:
|
error1:
|
||||||
close(fd);
|
close(fd);
|
||||||
@@ -941,14 +909,14 @@ update_fsinfo(nspace *vol)
|
|||||||
static status_t
|
static status_t
|
||||||
get_fsinfo(nspace *vol, uint32 *free_count, uint32 *last_allocated)
|
get_fsinfo(nspace *vol, uint32 *free_count, uint32 *last_allocated)
|
||||||
{
|
{
|
||||||
uchar *buffer;
|
char *buffer;
|
||||||
status_t result;
|
status_t result;
|
||||||
|
|
||||||
if ((vol->fat_bits != 32) || (vol->fsinfo_sector == 0xffff))
|
if ((vol->fat_bits != 32) || (vol->fsinfo_sector == 0xffff))
|
||||||
return B_ERROR;
|
return B_ERROR;
|
||||||
|
|
||||||
result = block_cache_get_etc(vol->fBlockCache, vol->fsinfo_sector, 0,
|
result = block_cache_get_etc(vol->fBlockCache, vol->fsinfo_sector, 0,
|
||||||
vol->bytes_per_sector, &buffer);
|
vol->bytes_per_sector, (const void**)&buffer);
|
||||||
if (result != B_OK) {
|
if (result != B_OK) {
|
||||||
dprintf("get_fsinfo: error getting fsinfo sector %x: %s\n",
|
dprintf("get_fsinfo: error getting fsinfo sector %x: %s\n",
|
||||||
vol->fsinfo_sector, strerror(result));
|
vol->fsinfo_sector, strerror(result));
|
||||||
@@ -999,8 +967,6 @@ dosfs_unmount(fs_volume *_vol)
|
|||||||
dlist_uninit(vol);
|
dlist_uninit(vol);
|
||||||
uninit_vcache(vol);
|
uninit_vcache(vol);
|
||||||
|
|
||||||
if (!(vol->flags & B_FS_IS_READONLY) && (vol->flags & B_FS_IS_REMOVABLE) && (vol->fs_flags & FS_FLAGS_LOCK_DOOR))
|
|
||||||
lock_removable_device(vol->fd, false);
|
|
||||||
result = close(vol->fd);
|
result = close(vol->fd);
|
||||||
recursive_lock_destroy(&(vol->vlock));
|
recursive_lock_destroy(&(vol->vlock));
|
||||||
free(vol);
|
free(vol);
|
||||||
@@ -1083,11 +1049,10 @@ dosfs_write_fs_stat(fs_volume *_vol, const struct fs_info * fss, uint32 mask)
|
|||||||
memset(name, ' ', 11);
|
memset(name, ' ', 11);
|
||||||
DPRINTF(1, ("wfsstat: setting name to %s\n", fss->volume_name));
|
DPRINTF(1, ("wfsstat: setting name to %s\n", fss->volume_name));
|
||||||
for (i=j=0;(i<11)&&(fss->volume_name[j]);j++) {
|
for (i=j=0;(i<11)&&(fss->volume_name[j]);j++) {
|
||||||
static char acceptable[] = "!#$%&'()-0123456789@ABCDEFGHIJKLMNOPQRSTUVWXYZ^_`{}~";
|
|
||||||
char c = fss->volume_name[j];
|
char c = fss->volume_name[j];
|
||||||
if ((c >= 'a') && (c <= 'z')) c += 'A' - 'a';
|
if ((c >= 'a') && (c <= 'z')) c += 'A' - 'a';
|
||||||
// spaces acceptable in volume names
|
// spaces acceptable in volume names
|
||||||
if (strchr(acceptable, c) || (c == ' '))
|
if (strchr(sAcceptable, c) || (c == ' '))
|
||||||
name[i++] = c;
|
name[i++] = c;
|
||||||
}
|
}
|
||||||
if (i == 0) { // bad name, kiddo
|
if (i == 0) { // bad name, kiddo
|
||||||
@@ -6,9 +6,7 @@
|
|||||||
#define _DOSFS_H_
|
#define _DOSFS_H_
|
||||||
|
|
||||||
|
|
||||||
#include <KernelExport.h>
|
#include "system_dependencies.h"
|
||||||
#include <fs_interface.h>
|
|
||||||
#include <lock.h>
|
|
||||||
|
|
||||||
|
|
||||||
//#define DEBUG 1
|
//#define DEBUG 1
|
||||||
@@ -94,9 +92,7 @@ typedef struct vnode {
|
|||||||
|
|
||||||
bool dirty; // track if vnode had been written to
|
bool dirty; // track if vnode had been written to
|
||||||
|
|
||||||
#if TRACK_FILENAME
|
|
||||||
char *filename;
|
char *filename;
|
||||||
#endif
|
|
||||||
} vnode;
|
} vnode;
|
||||||
|
|
||||||
// mode bits
|
// mode bits
|
||||||
|
|||||||
@@ -11,10 +11,8 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include "encodings.h"
|
#include "encodings.h"
|
||||||
extern "C" {
|
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
extern int debug_encodings;
|
extern int debug_encodings;
|
||||||
}
|
|
||||||
|
|
||||||
#define TOUCH(x) ((void)(x))
|
#define TOUCH(x) ((void)(x))
|
||||||
|
|
||||||
@@ -1148,10 +1146,6 @@ status_t unicode_to_utf8(const uchar *uni, uint32 unilen, uint8 *utf8,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// from dir.c
|
// from dir.c
|
||||||
extern "C" {
|
|
||||||
extern const char acceptable[];
|
|
||||||
extern const char illegal[];
|
|
||||||
}
|
|
||||||
const char underbar[] = "+,;=[]"
|
const char underbar[] = "+,;=[]"
|
||||||
"\x83\x85\x88\x89\x8A\x8B\x8C\x8D"
|
"\x83\x85\x88\x89\x8A\x8B\x8C\x8D"
|
||||||
"\x93\x95\x96\x97\x98"
|
"\x93\x95\x96\x97\x98"
|
||||||
@@ -1180,7 +1174,7 @@ bool requires_long_name(const char *utf8, const uchar *unicode)
|
|||||||
if (utf8[i] == '.') break;
|
if (utf8[i] == '.') break;
|
||||||
/* XXX: should also check for upper-ascii stuff (requires matching
|
/* XXX: should also check for upper-ascii stuff (requires matching
|
||||||
* unicode with msdostou table, but doesn't hurt for now */
|
* unicode with msdostou table, but doesn't hurt for now */
|
||||||
if (!strchr(acceptable, utf8[i])) return true;
|
if (!strchr(sAcceptable, utf8[i])) return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (utf8[i] == 0) return false;
|
if (utf8[i] == 0) return false;
|
||||||
@@ -1191,7 +1185,7 @@ bool requires_long_name(const char *utf8, const uchar *unicode)
|
|||||||
for (j=0;j<3;j++,i++) {
|
for (j=0;j<3;j++,i++) {
|
||||||
if (utf8[i] == 0) return false;
|
if (utf8[i] == 0) return false;
|
||||||
/* XXX: same here */
|
/* XXX: same here */
|
||||||
if (!strchr(acceptable, utf8[i])) return true;
|
if (!strchr(sAcceptable, utf8[i])) return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
return (utf8[i] == 0) ? false : true;
|
return (utf8[i] == 0) ? false : true;
|
||||||
@@ -1339,7 +1333,7 @@ generate_short_name_msdos(const uchar *utf8, const uint16 *uni,
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
if (c < 0x100) {
|
if (c < 0x100) {
|
||||||
if (strchr(illegal, c)) return EINVAL;
|
if (strchr(sIllegal, c)) return EINVAL;
|
||||||
|
|
||||||
if ((c >= 'a') && (c <= 'z'))
|
if ((c >= 'a') && (c <= 'z'))
|
||||||
nshort[i++] = c - 'a' + 'A';
|
nshort[i++] = c - 'a' + 'A';
|
||||||
@@ -1347,7 +1341,7 @@ generate_short_name_msdos(const uchar *utf8, const uint16 *uni,
|
|||||||
nshort[i++] = '_';
|
nshort[i++] = '_';
|
||||||
else if ((cp = strchr(capitalize_from, c)) != NULL)
|
else if ((cp = strchr(capitalize_from, c)) != NULL)
|
||||||
nshort[i++] = capitalize_to[(int)(cp - capitalize_from)];
|
nshort[i++] = capitalize_to[(int)(cp - capitalize_from)];
|
||||||
else if (strchr(acceptable, c) || strchr(capitalize_to, c))
|
else if (strchr(sAcceptable, c) || strchr(capitalize_to, c))
|
||||||
nshort[i++] = c;
|
nshort[i++] = c;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1373,7 +1367,7 @@ generate_short_name_msdos(const uchar *utf8, const uint16 *uni,
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
if (c < 0x100) {
|
if (c < 0x100) {
|
||||||
if (strchr(illegal, c)) return EINVAL;
|
if (strchr(sIllegal, c)) return EINVAL;
|
||||||
|
|
||||||
if ((c >= 'a') && (c <= 'z'))
|
if ((c >= 'a') && (c <= 'z'))
|
||||||
nshort[i++] = c - 'a' + 'A';
|
nshort[i++] = c - 'a' + 'A';
|
||||||
@@ -1381,7 +1375,7 @@ generate_short_name_msdos(const uchar *utf8, const uint16 *uni,
|
|||||||
nshort[i++] = '_';
|
nshort[i++] = '_';
|
||||||
else if ((cp = strchr(capitalize_from, c)) != NULL)
|
else if ((cp = strchr(capitalize_from, c)) != NULL)
|
||||||
nshort[i++] = capitalize_to[(int)(cp - capitalize_from)];
|
nshort[i++] = capitalize_to[(int)(cp - capitalize_from)];
|
||||||
else if (strchr(acceptable, c) || strchr(capitalize_to, c))
|
else if (strchr(sAcceptable, c) || strchr(capitalize_to, c))
|
||||||
nshort[i++] = c;
|
nshort[i++] = c;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,6 +5,10 @@
|
|||||||
#ifndef _DOSFS_ENCODINGS_H_
|
#ifndef _DOSFS_ENCODINGS_H_
|
||||||
#define _DOSFS_ENCODINGS_H_
|
#define _DOSFS_ENCODINGS_H_
|
||||||
|
|
||||||
|
|
||||||
|
#include "system_dependencies.h"
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
+3
-7
@@ -6,12 +6,7 @@
|
|||||||
|
|
||||||
#include "fat.h"
|
#include "fat.h"
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include "system_dependencies.h"
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#include <fs_cache.h>
|
|
||||||
#include <ByteOrder.h>
|
|
||||||
#include <KernelExport.h>
|
|
||||||
|
|
||||||
#include "dosfs.h"
|
#include "dosfs.h"
|
||||||
#include "file.h"
|
#include "file.h"
|
||||||
@@ -42,7 +37,8 @@ mirror_fats(nspace *vol, uint32 sector, uint8 *buffer)
|
|||||||
continue;
|
continue;
|
||||||
|
|
||||||
status = block_cache_get_writable_etc(vol->fBlockCache,
|
status = block_cache_get_writable_etc(vol->fBlockCache,
|
||||||
sector + i * vol->sectors_per_fat, 0, 1, -1, &blockData);
|
sector + i * vol->sectors_per_fat, 0, 1, -1,
|
||||||
|
(void**)&blockData);
|
||||||
if (status != B_OK)
|
if (status != B_OK)
|
||||||
return status;
|
return status;
|
||||||
|
|
||||||
+10
-24
@@ -3,17 +3,7 @@
|
|||||||
This file may be used under the terms of the Be Sample Code License.
|
This file may be used under the terms of the Be Sample Code License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include "system_dependencies.h"
|
||||||
#include <string.h>
|
|
||||||
#include <sys/stat.h>
|
|
||||||
|
|
||||||
#include <fs_cache.h>
|
|
||||||
#include <fs_info.h>
|
|
||||||
#include <Drivers.h>
|
|
||||||
#include <KernelExport.h>
|
|
||||||
#include <NodeMonitor.h>
|
|
||||||
|
|
||||||
#include <time.h>
|
|
||||||
|
|
||||||
#include "iter.h"
|
#include "iter.h"
|
||||||
#include "dosfs.h"
|
#include "dosfs.h"
|
||||||
@@ -144,9 +134,7 @@ dosfs_release_vnode(fs_volume *_vol, fs_vnode *_node, bool reenter)
|
|||||||
UNLOCK_VOL(vol);
|
UNLOCK_VOL(vol);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if TRACK_FILENAME
|
|
||||||
if (node->filename) free(node->filename);
|
if (node->filename) free(node->filename);
|
||||||
#endif
|
|
||||||
|
|
||||||
if (node->vnid != vol->root_vnode.vnid) {
|
if (node->vnid != vol->root_vnode.vnid) {
|
||||||
file_cache_delete(node->cache);
|
file_cache_delete(node->cache);
|
||||||
@@ -331,7 +319,7 @@ dosfs_open(fs_volume *_vol, fs_vnode *_node, int omode, void **_cookie)
|
|||||||
node->iteration++;
|
node->iteration++;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((cookie = calloc(sizeof(filecookie), 1)) == NULL) {
|
if ((cookie = (filecookie*)calloc(sizeof(filecookie), 1)) == NULL) {
|
||||||
result = ENOMEM;
|
result = ENOMEM;
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
@@ -497,9 +485,9 @@ dosfs_close(fs_volume *_vol, fs_vnode *_node, void *_cookie)
|
|||||||
status_t
|
status_t
|
||||||
dosfs_free_cookie(fs_volume *_vol, fs_vnode *_node, void *_cookie)
|
dosfs_free_cookie(fs_volume *_vol, fs_vnode *_node, void *_cookie)
|
||||||
{
|
{
|
||||||
nspace *vol = _vol->private_volume;
|
nspace *vol = (nspace *)_vol->private_volume;
|
||||||
vnode *node = _node->private_node;
|
vnode *node = (vnode *)_node->private_node;
|
||||||
filecookie *cookie = _cookie;
|
filecookie *cookie = (filecookie *)_cookie;
|
||||||
LOCK_VOL(vol);
|
LOCK_VOL(vol);
|
||||||
|
|
||||||
DPRINTF(0, ("dosfs_free_cookie (vnode id %" B_PRIdINO ")\n", node->vnid));
|
DPRINTF(0, ("dosfs_free_cookie (vnode id %" B_PRIdINO ")\n", node->vnid));
|
||||||
@@ -554,7 +542,7 @@ dosfs_create(fs_volume *_vol, fs_vnode *_dir, const char *name, int omode,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// create file cookie; do it here to make cleaning up easier
|
// create file cookie; do it here to make cleaning up easier
|
||||||
if ((cookie = calloc(sizeof(filecookie), 1)) == NULL) {
|
if ((cookie = (filecookie *)calloc(sizeof(filecookie), 1)) == NULL) {
|
||||||
result = ENOMEM;
|
result = ENOMEM;
|
||||||
goto bi;
|
goto bi;
|
||||||
}
|
}
|
||||||
@@ -717,7 +705,7 @@ dosfs_mkdir(fs_volume *_vol, fs_vnode *_dir, const char *name, int perms)
|
|||||||
goto bi3;
|
goto bi3;
|
||||||
}
|
}
|
||||||
|
|
||||||
buffer = malloc(vol->bytes_per_sector);
|
buffer = (uchar *)malloc(vol->bytes_per_sector);
|
||||||
if (!buffer) {
|
if (!buffer) {
|
||||||
result = ENOMEM;
|
result = ENOMEM;
|
||||||
goto bi4;
|
goto bi4;
|
||||||
@@ -1006,11 +994,9 @@ dosfs_rename(fs_volume *_vol, fs_vnode *_odir, const char *oldname,
|
|||||||
diri_free(&diri);
|
diri_free(&diri);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if TRACK_FILENAME
|
|
||||||
if (file->filename) free(file->filename);
|
if (file->filename) free(file->filename);
|
||||||
file->filename = malloc(strlen(newname) + 1);
|
file->filename = (char*)malloc(strlen(newname) + 1);
|
||||||
if (file->filename) strcpy(file->filename, newname);
|
if (file->filename) strcpy(file->filename, newname);
|
||||||
#endif
|
|
||||||
|
|
||||||
notify_entry_moved(vol->id, odir->vnid, oldname, ndir->vnid, newname,
|
notify_entry_moved(vol->id, odir->vnid, oldname, ndir->vnid, newname,
|
||||||
file->vnid);
|
file->vnid);
|
||||||
@@ -1374,7 +1360,7 @@ dosfs_get_file_map(fs_volume *_vol, fs_vnode *_node, off_t position,
|
|||||||
off_t block = csi_to_block(&iter);
|
off_t block = csi_to_block(&iter);
|
||||||
uint32 sectors = 1;
|
uint32 sectors = 1;
|
||||||
|
|
||||||
length -= min(length, vol->bytes_per_sector - offset);
|
length -= min_c(length, vol->bytes_per_sector - offset);
|
||||||
|
|
||||||
while (length > 0) {
|
while (length > 0) {
|
||||||
result = iter_csi(&iter, 1);
|
result = iter_csi(&iter, 1);
|
||||||
@@ -1389,7 +1375,7 @@ dosfs_get_file_map(fs_volume *_vol, fs_vnode *_node, off_t position,
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
length -= min(length, vol->bytes_per_sector);
|
length -= min_c(length, vol->bytes_per_sector);
|
||||||
sectors++;
|
sectors++;
|
||||||
}
|
}
|
||||||
|
|
||||||
+3
-7
@@ -6,11 +6,7 @@
|
|||||||
|
|
||||||
#include "iter.h"
|
#include "iter.h"
|
||||||
|
|
||||||
#include <string.h>
|
#include "system_dependencies.h"
|
||||||
|
|
||||||
#include <fs_cache.h>
|
|
||||||
#include <fs_info.h>
|
|
||||||
#include <KernelExport.h>
|
|
||||||
|
|
||||||
#include "dosfs.h"
|
#include "dosfs.h"
|
||||||
#include "fat.h"
|
#include "fat.h"
|
||||||
@@ -222,7 +218,7 @@ csi_write_blocks(struct csi *csi, uint8 *buffer, ssize_t len)
|
|||||||
for (i = block; i < block + sectors; i++) {
|
for (i = block; i < block + sectors; i++) {
|
||||||
char *blockData;
|
char *blockData;
|
||||||
status_t status = block_cache_get_writable_etc(csi->vol->fBlockCache,
|
status_t status = block_cache_get_writable_etc(csi->vol->fBlockCache,
|
||||||
i, 0, 1, -1, &blockData);
|
i, 0, 1, -1, (void**)&blockData);
|
||||||
if (status != B_OK)
|
if (status != B_OK)
|
||||||
return status;
|
return status;
|
||||||
|
|
||||||
@@ -254,7 +250,7 @@ csi_write_block(struct csi *csi, uint8 *buffer)
|
|||||||
return EINVAL;
|
return EINVAL;
|
||||||
|
|
||||||
status = block_cache_get_writable_etc(csi->vol->fBlockCache, block, 0, 1,
|
status = block_cache_get_writable_etc(csi->vol->fBlockCache, block, 0, 1,
|
||||||
-1, &blockData);
|
-1, (void**)&blockData);
|
||||||
if (status != B_OK)
|
if (status != B_OK)
|
||||||
return status;
|
return status;
|
||||||
|
|
||||||
@@ -6,7 +6,11 @@
|
|||||||
#define _DOSFS_ITER_H_
|
#define _DOSFS_ITER_H_
|
||||||
|
|
||||||
|
|
||||||
#include <SupportDefs.h>
|
#ifdef FS_SHELL
|
||||||
|
# include "system_dependencies.h"
|
||||||
|
#else
|
||||||
|
# include <SupportDefs.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
struct _nspace;
|
struct _nspace;
|
||||||
|
|||||||
@@ -6,18 +6,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
#include <ByteOrder.h>
|
#include "system_dependencies.h"
|
||||||
#include <Drivers.h>
|
|
||||||
#include <driver_settings.h>
|
|
||||||
#include <KernelExport.h>
|
|
||||||
#include <OS.h>
|
|
||||||
#include <errno.h>
|
|
||||||
#include <getopt.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <strings.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
|
|
||||||
#define MKDOS
|
#define MKDOS
|
||||||
#include "mkdos.h"
|
#include "mkdos.h"
|
||||||
@@ -71,7 +60,7 @@ parse_initialize_parameters(const char* parameterString,
|
|||||||
delete_driver_settings(handle);
|
delete_driver_settings(handle);
|
||||||
|
|
||||||
if (fatBits != 0 && fatBits != 12 && fatBits != 16 && fatBits != 32) {
|
if (fatBits != 0 && fatBits != 12 && fatBits != 16 && fatBits != 32) {
|
||||||
printf("mkdos error: fat must be 12, 16, or 32 bits\n");
|
dprintf("mkdos error: fat must be 12, 16, or 32 bits\n");
|
||||||
return B_BAD_VALUE;
|
return B_BAD_VALUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -747,7 +736,7 @@ void CreateVolumeLabel(void *sector, const char *label)
|
|||||||
// XXX this could be changed to use long file name entrys,
|
// XXX this could be changed to use long file name entrys,
|
||||||
// XXX but the dosfs would have to be updated, too
|
// XXX but the dosfs would have to be updated, too
|
||||||
|
|
||||||
dirent *d = (dirent *)sector;
|
fatdirent *d = (fatdirent *)sector;
|
||||||
memset(d, 0, sizeof(*d));
|
memset(d, 0, sizeof(*d));
|
||||||
memset(d->Name, 0x20, 11);
|
memset(d->Name, 0x20, 11);
|
||||||
memcpy(d->Name, label, min_c(11, strlen(label)));
|
memcpy(d->Name, label, min_c(11, strlen(label)));
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ THE SOFTWARE.
|
|||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <fs_interface.h>
|
#include "system_dependencies.h"
|
||||||
|
|
||||||
|
|
||||||
struct initialize_parameters {
|
struct initialize_parameters {
|
||||||
@@ -124,7 +124,7 @@ struct fsinfosector32 {
|
|||||||
|
|
||||||
|
|
||||||
// a FAT directory entry
|
// a FAT directory entry
|
||||||
struct dirent {
|
struct fatdirent {
|
||||||
uint8 Name[11];
|
uint8 Name[11];
|
||||||
uint8 Attr;
|
uint8 Attr;
|
||||||
uint8 NTRes;
|
uint8 NTRes;
|
||||||
|
|||||||
@@ -0,0 +1,62 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2007, Ingo Weinhold, bonefish@cs.tu-berlin.de.
|
||||||
|
* Distributed under the terms of the MIT License.
|
||||||
|
*/
|
||||||
|
#ifndef _SYSTEM_DEPENDENCIES_H
|
||||||
|
#define _SYSTEM_DEPENDENCIES_H
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef FS_SHELL
|
||||||
|
|
||||||
|
typedef unsigned char uchar;
|
||||||
|
|
||||||
|
#include "fssh_api_wrapper.h"
|
||||||
|
#include "fssh_auto_deleter.h"
|
||||||
|
|
||||||
|
#else // !FS_SHELL
|
||||||
|
|
||||||
|
#include <AutoDeleter.h>
|
||||||
|
#include <util/AutoLock.h>
|
||||||
|
#include <util/DoublyLinkedList.h>
|
||||||
|
#include <util/SinglyLinkedList.h>
|
||||||
|
#include <util/Stack.h>
|
||||||
|
|
||||||
|
#include <ByteOrder.h>
|
||||||
|
|
||||||
|
#ifndef _BOOT_MODE
|
||||||
|
# include <tracing.h>
|
||||||
|
|
||||||
|
# include <driver_settings.h>
|
||||||
|
# include <fs_attr.h>
|
||||||
|
# include <fs_cache.h>
|
||||||
|
# include <fs_index.h>
|
||||||
|
# include <fs_info.h>
|
||||||
|
# include <fs_interface.h>
|
||||||
|
# include <fs_query.h>
|
||||||
|
# include <fs_volume.h>
|
||||||
|
# include <Drivers.h>
|
||||||
|
# include <KernelExport.h>
|
||||||
|
# include <NodeMonitor.h>
|
||||||
|
# include <SupportDefs.h>
|
||||||
|
# include <TypeConstants.h>
|
||||||
|
#endif // _BOOT_MODE
|
||||||
|
|
||||||
|
#include <ctype.h>
|
||||||
|
#include <dirent.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <getopt.h>
|
||||||
|
#include <malloc.h>
|
||||||
|
#include <new>
|
||||||
|
#include <null.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <strings.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <time.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
#endif // !FS_SHELL
|
||||||
|
|
||||||
|
|
||||||
|
#endif // _SYSTEM_DEPENDENCIES_H
|
||||||
+8
-6
@@ -4,14 +4,11 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
#include <SupportDefs.h>
|
#include "system_dependencies.h"
|
||||||
#include <KernelExport.h>
|
|
||||||
|
|
||||||
|
#ifndef FS_SHELL
|
||||||
#include <real_time_clock.h>
|
#include <real_time_clock.h>
|
||||||
|
#endif
|
||||||
#include <ctype.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <time.h>
|
|
||||||
|
|
||||||
#include "dosfs.h"
|
#include "dosfs.h"
|
||||||
#include "fat.h"
|
#include "fat.h"
|
||||||
@@ -73,7 +70,12 @@ get_tzoffset()
|
|||||||
if (tzoffset != -1)
|
if (tzoffset != -1)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
#ifdef FS_SHELL
|
||||||
|
// We just assume UTC ;-)
|
||||||
|
tzoffset = 0;
|
||||||
|
#else
|
||||||
tzoffset = get_timezone_offset() / 60;
|
tzoffset = get_timezone_offset() / 60;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -6,7 +6,11 @@
|
|||||||
#define _DOSFS_UTIL_H_
|
#define _DOSFS_UTIL_H_
|
||||||
|
|
||||||
|
|
||||||
#include <ByteOrder.h>
|
#include "system_dependencies.h"
|
||||||
|
|
||||||
|
|
||||||
|
const char sAcceptable[]="!#$%&'()-0123456789@ABCDEFGHIJKLMNOPQRSTUVWXYZ^_`{}~";
|
||||||
|
const char sIllegal[] = "\\/:*?\"<>|";
|
||||||
|
|
||||||
|
|
||||||
// debugging functions
|
// debugging functions
|
||||||
|
|||||||
+4
-8
@@ -39,11 +39,7 @@ purpose.
|
|||||||
|
|
||||||
#include "vcache.h"
|
#include "vcache.h"
|
||||||
|
|
||||||
#include <stdio.h>
|
#include "system_dependencies.h"
|
||||||
#include <string.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
#include <KernelExport.h>
|
|
||||||
|
|
||||||
#include "dosfs.h"
|
#include "dosfs.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
@@ -101,14 +97,14 @@ init_vcache(nspace *vol)
|
|||||||
vol->vcache.cache_size = 512; /* must be power of 2 */
|
vol->vcache.cache_size = 512; /* must be power of 2 */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
vol->vcache.by_vnid = calloc(sizeof(struct vache_entry *),
|
vol->vcache.by_vnid = (vcache_entry**)calloc(sizeof(struct vache_entry *),
|
||||||
vol->vcache.cache_size);
|
vol->vcache.cache_size);
|
||||||
if (vol->vcache.by_vnid == NULL) {
|
if (vol->vcache.by_vnid == NULL) {
|
||||||
dprintf("init_vcache: out of memory\n");
|
dprintf("init_vcache: out of memory\n");
|
||||||
return ENOMEM;
|
return ENOMEM;
|
||||||
}
|
}
|
||||||
|
|
||||||
vol->vcache.by_loc = calloc(sizeof(struct vache_entry *),
|
vol->vcache.by_loc = (vcache_entry**)calloc(sizeof(struct vache_entry *),
|
||||||
vol->vcache.cache_size);
|
vol->vcache.cache_size);
|
||||||
if (vol->vcache.by_loc == NULL) {
|
if (vol->vcache.by_loc == NULL) {
|
||||||
dprintf("init_vcache: out of memory\n");
|
dprintf("init_vcache: out of memory\n");
|
||||||
@@ -177,7 +173,7 @@ _add_to_vcache_(nspace *vol, ino_t vnid, ino_t loc)
|
|||||||
|
|
||||||
ASSERT(vnid != loc);
|
ASSERT(vnid != loc);
|
||||||
|
|
||||||
e = malloc(sizeof(struct vcache_entry));
|
e = (vcache_entry*)malloc(sizeof(struct vcache_entry));
|
||||||
if (e == NULL)
|
if (e == NULL)
|
||||||
return ENOMEM;
|
return ENOMEM;
|
||||||
|
|
||||||
@@ -91,6 +91,7 @@ SEARCH on [ FGristFiles
|
|||||||
SubInclude HAIKU_TOP src tools addattr ;
|
SubInclude HAIKU_TOP src tools addattr ;
|
||||||
SubInclude HAIKU_TOP src tools anyboot ;
|
SubInclude HAIKU_TOP src tools anyboot ;
|
||||||
SubInclude HAIKU_TOP src tools bfs_shell ;
|
SubInclude HAIKU_TOP src tools bfs_shell ;
|
||||||
|
SubInclude HAIKU_TOP src tools fat_shell ;
|
||||||
SubInclude HAIKU_TOP src tools cppunit ;
|
SubInclude HAIKU_TOP src tools cppunit ;
|
||||||
SubInclude HAIKU_TOP src tools create_repository_config ;
|
SubInclude HAIKU_TOP src tools create_repository_config ;
|
||||||
SubInclude HAIKU_TOP src tools elfsymbolpatcher ;
|
SubInclude HAIKU_TOP src tools elfsymbolpatcher ;
|
||||||
|
|||||||
@@ -0,0 +1,85 @@
|
|||||||
|
SubDir HAIKU_TOP src tools fat_shell ;
|
||||||
|
|
||||||
|
SEARCH_SOURCE += [ FDirName $(HAIKU_TOP) src add-ons kernel file_systems fat ] ;
|
||||||
|
|
||||||
|
# prevent inclusion of HaikuBuildCompatibility.h and BSD headers
|
||||||
|
DEFINES += HAIKU_BUILD_COMPATIBILITY_H __STRICT_ANSI__ ;
|
||||||
|
|
||||||
|
# set some additional defines
|
||||||
|
{
|
||||||
|
local defines =
|
||||||
|
FS_SHELL
|
||||||
|
;
|
||||||
|
|
||||||
|
if $(TARGET_PACKAGING_ARCH) = x86_gcc2 {
|
||||||
|
# GCC2 doesn't compile BFS correctly with -O2 or more
|
||||||
|
OPTIM = -O1 ;
|
||||||
|
}
|
||||||
|
|
||||||
|
defines = [ FDefines $(defines) ] ;
|
||||||
|
|
||||||
|
local c++flags = ;
|
||||||
|
if $(HOST_CC_IS_LEGACY_GCC) != 1 {
|
||||||
|
c++flags += -std=c++11 ;
|
||||||
|
}
|
||||||
|
|
||||||
|
SubDirCcFlags $(defines) -Wno-multichar ;
|
||||||
|
SubDirC++Flags $(defines) -Wno-multichar -fno-rtti ;
|
||||||
|
SubDirC++Flags $(defines) $(c++flags) -Wno-multichar -fno-rtti ;
|
||||||
|
}
|
||||||
|
|
||||||
|
# platform specific libraries
|
||||||
|
local fsShellCommandLibs ;
|
||||||
|
if ! $(HOST_PLATFORM_HAIKU_COMPATIBLE) {
|
||||||
|
fsShellCommandLibs = $(HOST_NETWORK_LIBS) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
UseHeaders [ FDirName $(HAIKU_TOP) headers build ] : true ;
|
||||||
|
|
||||||
|
if ! $(HOST_PLATFORM_HAIKU_COMPATIBLE) {
|
||||||
|
UseHeaders [ FDirName $(HAIKU_TOP) headers build os ] : true ;
|
||||||
|
UseHeaders [ FDirName $(HAIKU_TOP) headers build os drivers ] : true ;
|
||||||
|
UseHeaders [ FDirName $(HAIKU_TOP) headers build os kernel ] : true ;
|
||||||
|
UseHeaders [ FDirName $(HAIKU_TOP) headers build os storage ] : true ;
|
||||||
|
UseHeaders [ FDirName $(HAIKU_TOP) headers build os support ] : true ;
|
||||||
|
}
|
||||||
|
|
||||||
|
UsePrivateHeaders shared storage ;
|
||||||
|
UsePrivateHeaders fs_shell ;
|
||||||
|
UseHeaders [ FDirName $(HAIKU_TOP) headers private ] : true ;
|
||||||
|
UseHeaders [ FDirName $(HAIKU_TOP) src tools fs_shell ] ;
|
||||||
|
|
||||||
|
local fatSource =
|
||||||
|
attr.cpp
|
||||||
|
dir.cpp
|
||||||
|
dlist.cpp
|
||||||
|
dosfs.cpp
|
||||||
|
encodings.cpp
|
||||||
|
fat.cpp
|
||||||
|
file.cpp
|
||||||
|
iter.cpp
|
||||||
|
mkdos.cpp
|
||||||
|
util.cpp
|
||||||
|
vcache.cpp
|
||||||
|
version.cpp
|
||||||
|
;
|
||||||
|
|
||||||
|
BuildPlatformMergeObject <build>fatfs.o : $(fatSource) ;
|
||||||
|
|
||||||
|
BuildPlatformMain <build>fat_shell
|
||||||
|
: :
|
||||||
|
<build>fatfs.o
|
||||||
|
<build>fs_shell.a $(HOST_LIBSUPC++) $(HOST_LIBSTDC++)
|
||||||
|
$(HOST_LIBROOT) $(fsShellCommandLibs)
|
||||||
|
;
|
||||||
|
|
||||||
|
BuildPlatformMain <build>fat_fuse
|
||||||
|
: :
|
||||||
|
<build>fatfs.o
|
||||||
|
<build>fuse_module.a
|
||||||
|
$(HOST_LIBSUPC++) $(HOST_LIBSTDC++)
|
||||||
|
$(HOST_STATIC_LIBROOT) $(fsShellCommandLibs) fuse
|
||||||
|
;
|
||||||
|
|
||||||
|
SEARCH on [ FGristFiles DeviceOpener.cpp QueryParserUtils.cpp ]
|
||||||
|
+= [ FDirName $(HAIKU_TOP) src add-ons kernel file_systems shared ] ;
|
||||||
@@ -27,8 +27,11 @@ fssh_recursive_lock_get_recursion(fssh_recursive_lock *lock)
|
|||||||
|
|
||||||
|
|
||||||
extern "C" void
|
extern "C" void
|
||||||
fssh_recursive_lock_init(fssh_recursive_lock *lock, const char *name)
|
fssh_recursive_lock_init_etc(fssh_recursive_lock *lock, const char *name,
|
||||||
|
uint32_t flags)
|
||||||
{
|
{
|
||||||
|
// TODO: No fssh_create_sem_etc for flags?
|
||||||
|
|
||||||
if (lock == NULL)
|
if (lock == NULL)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@@ -43,6 +46,13 @@ fssh_recursive_lock_init(fssh_recursive_lock *lock, const char *name)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
extern "C" void
|
||||||
|
fssh_recursive_lock_init(fssh_recursive_lock *lock, const char *name)
|
||||||
|
{
|
||||||
|
fssh_recursive_lock_init_etc(lock, name, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
extern "C" void
|
extern "C" void
|
||||||
fssh_recursive_lock_destroy(fssh_recursive_lock *lock)
|
fssh_recursive_lock_destroy(fssh_recursive_lock *lock)
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user