From 570ab00aa78ede7f1e8bb331848610346fbdbdd2 Mon Sep 17 00:00:00 2001 From: Gerasim Troeglazov <3deyes@gmail.com> Date: Mon, 5 Mar 2007 07:01:21 +0000 Subject: [PATCH] Fixed bug in fs_readdir function. Removed read-only assembling mode. Added settings file for addon tweaking: hide_sys_files, read_only, no_atime. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@20332 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- .../kernel/file_systems/ntfs/attributes.c | 2 - .../kernel/file_systems/ntfs/fs_func.c | 103 +++++--- .../kernel/file_systems/ntfs/fs_func.h | 4 +- .../file_systems/ntfs/kernel_interface.c | 39 +-- src/add-ons/kernel/file_systems/ntfs/ntfs.h | 25 +- .../kernel/file_systems/ntfs/ntfsdir.c | 239 ++++++------------ .../kernel/file_systems/ntfs/ntfsdir.h | 18 +- .../kernel/file_systems/ntfs/settings/ntfs | 8 + 8 files changed, 169 insertions(+), 269 deletions(-) create mode 100644 src/add-ons/kernel/file_systems/ntfs/settings/ntfs diff --git a/src/add-ons/kernel/file_systems/ntfs/attributes.c b/src/add-ons/kernel/file_systems/ntfs/attributes.c index d3817bd016..5e81a843a3 100644 --- a/src/add-ons/kernel/file_systems/ntfs/attributes.c +++ b/src/add-ons/kernel/file_systems/ntfs/attributes.c @@ -382,10 +382,8 @@ fs_write_attrib(void *_ns, void *_node, const char *name, int type, const void * #ifdef __HAIKU_ if (_cookie != &kBeOSTypeCookie) { result = ENOSYS; - goto exit; } #endif -exit: ERRPRINT("fs_write_attrib - EXIT, result is %s\n", strerror(result)); diff --git a/src/add-ons/kernel/file_systems/ntfs/fs_func.c b/src/add-ons/kernel/file_systems/ntfs/fs_func.c index 5405fad56d..6f4dfbff15 100644 --- a/src/add-ons/kernel/file_systems/ntfs/fs_func.c +++ b/src/add-ons/kernel/file_systems/ntfs/fs_func.c @@ -33,6 +33,7 @@ #include #include #include +#include #include "ntfs.h" #include "attributes.h" @@ -113,6 +114,8 @@ fs_mount(nspace_id nsid, const char *device, ulong flags, void *parms, size_t le nspace *ns; vnode *newNode = NULL; char lockname[32]; + void *handle; + unsigned long mnt_flags = 0; status_t result = B_NO_ERROR; ERRPRINT("fs_mount - ENTER\n"); @@ -122,11 +125,15 @@ fs_mount(nspace_id nsid, const char *device, ulong flags, void *parms, size_t le result = ENOMEM; goto exit; } + *ns = (nspace) { .state = NF_FreeClustersOutdate | NF_FreeMFTOutdate, .show_sys_files = false, + .ro = false }; + + ns->flags = flags; strcpy(ns->devicePath,device); @@ -141,8 +148,21 @@ fs_mount(nspace_id nsid, const char *device, ulong flags, void *parms, size_t le ERRPRINT("fs_mount - error creating lock (%s)\n", strerror(result)); goto exit; } + + handle = load_driver_settings("ntfs"); + ns->show_sys_files = ! (strcasecmp(get_driver_parameter(handle, "hide_sys_files", "true", "true"), "true") == 0); + ns->ro = strcasecmp(get_driver_parameter(handle, "read_only", "false", "false"), "false") != 0; + ns->noatime = strcasecmp(get_driver_parameter(handle, "no_atime", "true", "true"), "true") == 0; + unload_driver_settings(handle); + + if (ns->ro || ns->flags & B_MOUNT_READ_ONLY) { + mnt_flags |= MS_RDONLY; + ns->flags |= B_MOUNT_READ_ONLY; + } + if (ns->noatime) + mnt_flags |= MS_NOATIME; - ns->ntvol=utils_mount_volume(device,0,true); + ns->ntvol=utils_mount_volume(device,mnt_flags,true); if(ns->ntvol!=NULL) result = B_NO_ERROR; else @@ -254,7 +274,6 @@ fs_rfsstat( void *_ns, struct fs_info * fss ) return B_NO_ERROR; } -#ifndef _READ_ONLY_ #ifdef __HAIKU__ status_t fs_wfsstat(void *_vol, const struct fs_info * fss, uint32 mask) @@ -266,6 +285,11 @@ fs_wfsstat(void *_vol, struct fs_info *fss, long mask) nspace* ns = (nspace*)_vol; status_t result = B_NO_ERROR; + if (ns->flags & B_FS_IS_READONLY) { + ERRPRINT("ntfs is read-only\n"); + return EROFS; + } + LOCK_VOL(ns); #ifdef __HAIKU__ @@ -274,7 +298,7 @@ fs_wfsstat(void *_vol, struct fs_info *fss, long mask) if (mask & WFSSTAT_NAME) { #endif result = ntfs_change_label( ns->ntvol, (char*)fss->volume_name ); - goto exit; + goto exit; } exit: @@ -283,7 +307,6 @@ exit: return result; } -#endif #ifdef __HAIKU__ status_t @@ -487,7 +510,6 @@ fs_write_vnode( void *_ns, void *_node, char reenter ) return result; } -#ifndef _READ_ONLY_ #ifdef __HAIKU__ status_t fs_remove_vnode( void *_ns, void *_node, bool reenter ) @@ -515,7 +537,6 @@ fs_remove_vnode( void *_ns, void *_node, char reenter ) return result; } -#endif #ifdef __HAIKU__ status_t @@ -598,8 +619,13 @@ fs_rstat( void *_ns, void *_node, struct stat *stbuf ) free(intx_file); } ntfs_attr_close(na); - stbuf->st_mode |= 0666; + stbuf->st_mode |= 0666; } + + if (ns->flags & B_FS_IS_READONLY) { + stbuf->st_mode &= ~(S_IWUSR | S_IWGRP | S_IWOTH); + } + stbuf->st_uid = 0; stbuf->st_gid = 0; stbuf->st_atime = ni->last_access_time; @@ -619,7 +645,6 @@ exit: } -#ifndef _READ_ONLY_ #ifdef __HAIKU__ status_t fs_wstat(void *_vol, void *_node, const struct stat *st, uint32 mask) @@ -702,9 +727,8 @@ exit: return result; } -#endif -#ifndef _READ_ONLY_ + #ifdef __HAIKU__ status_t fs_sync(void *_ns) @@ -719,19 +743,14 @@ fs_sync(void *_ns) ERRPRINT("fs_sync - ENTER\n"); -#ifndef __HAIKU__ - flush_device(DEV_FD(ns->ntvol->dev), 0); -#endif - ERRPRINT("fs_sync - EXIT\n"); UNLOCK_VOL(ns); return B_NO_ERROR; } -#endif -#ifndef _READ_ONLY_ + #ifdef __HAIKU__ status_t fs_fsync(void *_ns, void *_node) @@ -773,7 +792,6 @@ exit: return result; } -#endif #ifdef __HAIKU__ status_t @@ -840,7 +858,6 @@ exit: } -#ifndef _READ_ONLY_ #ifdef __HAIKU__ status_t fs_create(void *_ns, void *_dir, const char *name, int omode, int perms, void **_cookie, vnode_id *_vnid) @@ -859,9 +876,14 @@ fs_create(void *_ns, void *_dir, const char *name, int omode, int perms, vnode_i ntfschar *uname = NULL; status_t result = B_NO_ERROR; int uname_len; + + if (ns->flags & B_FS_IS_READONLY) { + ERRPRINT("ntfs is read-only\n"); + return EROFS; + } LOCK_VOL(ns); - + ERRPRINT("fs_create - ENTER: name=%s\n",name); if(_ns==NULL || _dir==NULL) { @@ -964,7 +986,6 @@ exit: return result; } -#endif #ifdef __HAIKU__ status_t @@ -1048,7 +1069,6 @@ exit2: } -#ifndef _READ_ONLY_ #ifdef __HAIKU__ status_t fs_write( void *_ns, void *_node, void *_cookie, off_t offset, const void *buf, size_t *len ) @@ -1066,6 +1086,11 @@ fs_write( void *_ns, void *_node, void *_cookie, off_t offset, const void *buf, size_t size=*len; status_t result = B_NO_ERROR; + if (ns->flags & B_FS_IS_READONLY) { + ERRPRINT("ntfs is read-only\n"); + return EROFS; + } + LOCK_VOL(ns); ERRPRINT("fs_write - ENTER, offset=%d, len=%d\n",(int)offset, (int)(*len)); @@ -1145,7 +1170,7 @@ exit2: return result; } -#endif + #ifdef __HAIKU__ status_t @@ -1292,7 +1317,6 @@ exit: return result; } -#ifndef _READ_ONLY_ #ifdef __HAIKU__ status_t fs_create_symlink(void *_ns, void *_dir, const char *name, const char *target, int mode) @@ -1383,9 +1407,8 @@ exit: return result; } -#endif -#ifndef _READ_ONLY_ + #ifdef __HAIKU__ status_t fs_mkdir(void *_ns, void *_node, const char *name, int perms, vnode_id *_vnid) @@ -1402,6 +1425,11 @@ fs_mkdir(void *_ns, void *_node, const char *name, int perms) ntfs_inode *ni = NULL; ntfs_inode *bi = NULL; status_t result = B_NO_ERROR; + + if (ns->flags & B_FS_IS_READONLY) { + ERRPRINT("ntfs is read-only\n"); + return EROFS; + } LOCK_VOL(ns); @@ -1484,9 +1512,7 @@ exit: return result; } -#endif -#ifndef _READ_ONLY_ #ifdef __HAIKU__ status_t fs_rename(void *_ns, void *_odir, const char *oldname, void *_ndir, const char *newname) @@ -1515,6 +1541,10 @@ fs_rename(void *_ns, void *_odir, const char *oldname, void *_ndir, const char * status_t result = B_NO_ERROR; + if (ns->flags & B_FS_IS_READONLY) { + ERRPRINT("ntfs is read-only\n"); + return EROFS; + } LOCK_VOL(ns); @@ -1683,9 +1713,7 @@ exit: return result; } -#endif -#ifndef _READ_ONLY_ status_t do_unlink(nspace *vol, vnode *dir, const char *name, bool isdir) { @@ -1772,9 +1800,8 @@ exit1: return result; } -#endif -#ifndef _READ_ONLY_ + #ifdef __HAIKU__ status_t fs_rmdir(void *_ns, void *_node, const char *name) @@ -1787,6 +1814,11 @@ fs_rmdir(void *_ns, void *_node, const char *name) vnode *dir = (vnode*)_node; status_t result = B_NO_ERROR; + if (ns->flags & B_FS_IS_READONLY) { + ERRPRINT("ntfs is read-only\n"); + return EROFS; + } + LOCK_VOL(ns); ERRPRINT("fs_rmdir - ENTER: name %s\n", name==NULL?"NULL":name); @@ -1818,9 +1850,8 @@ exit1: return result; } -#endif -#ifndef _READ_ONLY_ + #ifdef __HAIKU__ status_t fs_unlink(void *_ns, void *_node, const char *name) @@ -1833,6 +1864,11 @@ fs_unlink(void *_ns, void *_node, const char *name) vnode *dir = (vnode*)_node; status_t result = B_NO_ERROR; + if (ns->flags & B_FS_IS_READONLY) { + ERRPRINT("ntfs is read-only\n"); + return EROFS; + } + LOCK_VOL(ns); ERRPRINT("fs_unlink - ENTER: name %s\n", name==NULL?"NULL":name); @@ -1864,5 +1900,4 @@ exit: return result; } -#endif diff --git a/src/add-ons/kernel/file_systems/ntfs/fs_func.h b/src/add-ons/kernel/file_systems/ntfs/fs_func.h index 78e3d25d67..1b78f4f06a 100644 --- a/src/add-ons/kernel/file_systems/ntfs/fs_func.h +++ b/src/add-ons/kernel/file_systems/ntfs/fs_func.h @@ -116,8 +116,6 @@ int fs_create_symlink(void *ns, void *_dir, const char *name, const char *path #endif //__HAIKU__ -#ifndef _READ_ONLY_ -status_t do_unlink(nspace *vol, vnode *dir, const char *name, bool isdir); -#endif +status_t do_unlink(nspace *vol, vnode *dir, const char *name, bool isdir); #endif diff --git a/src/add-ons/kernel/file_systems/ntfs/kernel_interface.c b/src/add-ons/kernel/file_systems/ntfs/kernel_interface.c index 818ab59867..ece884fd94 100644 --- a/src/add-ons/kernel/file_systems/ntfs/kernel_interface.c +++ b/src/add-ons/kernel/file_systems/ntfs/kernel_interface.c @@ -95,11 +95,7 @@ static file_system_module_info sNTFSFileSystem = { &fs_mount, &fs_unmount, &fs_rfsstat, -#ifdef _READ_ONLY_ - NULL, -#else &fs_wfsstat, -#endif NULL, /* vnode operations */ @@ -107,11 +103,7 @@ static file_system_module_info sNTFSFileSystem = { &fs_get_vnode_name, &fs_read_vnode, &fs_write_vnode, -#ifdef _READ_ONLY_ - NULL, -#else &fs_remove_vnode, -#endif /* VM file access */ NULL, // &fs_can_page @@ -125,58 +117,29 @@ static file_system_module_info sNTFSFileSystem = { NULL, // &fs_select NULL, // &fs_deselect -#ifdef _READ_ONLY_ - NULL, -#else &fs_fsync, -#endif - &fs_readlink, - -#ifdef _READ_ONLY_ - NULL, - NULL, - NULL, - NULL, -#else + &fs_readlink, &fs_create_symlink, NULL, // &fs_link, &fs_unlink, &fs_rename, -#endif &fs_access, &fs_rstat, -#ifdef _READ_ONLY_ - NULL, -#else &fs_wstat, -#endif /* file operations */ -#ifdef _READ_ONLY_ - NULL, -#else &fs_create, -#endif &fs_open, &fs_close, &fs_free_cookie, &fs_read, -#ifdef _READ_ONLY_ - NULL, -#else &fs_write, -#endif /* directory operations */ -#ifdef _READ_ONLY_ - NULL, - NULL, -#else &fs_mkdir, &fs_rmdir, -#endif &fs_opendir, &fs_closedir, &fs_free_dircookie, diff --git a/src/add-ons/kernel/file_systems/ntfs/ntfs.h b/src/add-ons/kernel/file_systems/ntfs/ntfs.h index 020fd04fbb..32a267ca43 100644 --- a/src/add-ons/kernel/file_systems/ntfs/ntfs.h +++ b/src/add-ons/kernel/file_systems/ntfs/ntfs.h @@ -119,18 +119,21 @@ typedef struct nspace int free_cluster_count; char volumeLabel[MAX_PATH]; - int state; - s64 free_clusters; - long free_mft; - BOOL ro; - BOOL show_sys_files; - BOOL silent; - BOOL force; - BOOL debug; - BOOL noatime; - BOOL no_detach; + ulong flags; + + int state; + s64 free_clusters; + long free_mft; + BOOL ro; + BOOL show_sys_files; + BOOL silent; + BOOL force; + BOOL debug; + BOOL noatime; + BOOL no_detach; - lock vlock; + + lock vlock; } nspace; diff --git a/src/add-ons/kernel/file_systems/ntfs/ntfsdir.c b/src/add-ons/kernel/file_systems/ntfs/ntfsdir.c index 425125111b..344d90da6e 100644 --- a/src/add-ons/kernel/file_systems/ntfs/ntfsdir.c +++ b/src/add-ons/kernel/file_systems/ntfs/ntfsdir.c @@ -1,6 +1,6 @@ /* ntfsdir.c - directory functions * - * Copyright (c) 2006-2007 Troeglazov Gerasim (3dEyes**) + * Copyright (c) 2006 Troeglazov Gerasim (3dEyes**) * * This program/include file is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as published @@ -38,8 +38,11 @@ #include "ntfsdir.h" //callback function for readdir() -static -int _ntfs_dirent_dot_filler(void *_dirent, const ntfschar *name, +static int _ntfs_dirent_filler(void *_dirent, const ntfschar *name, + const int name_len, const int name_type, const s64 pos, + const MFT_REF mref, const unsigned dt_type); + +static int _ntfs_dirent_filler(void *_dirent, const ntfschar *name, const int name_len, const int name_type, const s64 pos, const MFT_REF mref, const unsigned dt_type) { @@ -48,81 +51,24 @@ int _ntfs_dirent_dot_filler(void *_dirent, const ntfschar *name, if (name_type == FILE_NAME_DOS) return 0; - - if (ntfs_ucstombs(name, name_len, &filename, 0) < 0) { - ERRPRINT("Skipping unrepresentable filename\n"); - return 0; - } - - if(strcmp(filename,".")==0 || strcmp(filename,"..")==0) { - if (MREF(mref) == FILE_root || MREF(mref) >= FILE_first_user || false) { - struct direntry *ent = (direntry*)ntfs_calloc(sizeof(direntry)); - ent->name = (char*)ntfs_calloc(strlen(filename)+1); - strcpy(ent->name,filename); - ent->dev=cookie->dev; - ent->ino=MREF(mref); - ent->next = NULL; - - if(cookie->root==NULL) { - cookie->root = ent; - cookie->walk = ent; - } - - if(cookie->last != NULL) - cookie->last->next = ent; - - cookie->last = ent; - } else { - free(filename); - return -1; - } - } - free(filename); - return 0; -} - -static -int _ntfs_dirent_filler(void *_dirent, const ntfschar *name, - const int name_len, const int name_type, const s64 pos, - const MFT_REF mref, const unsigned dt_type) -{ - char *filename = NULL; - dircookie *cookie = (dircookie*)_dirent; - - if (name_type == FILE_NAME_DOS) - return 0; - - if (ntfs_ucstombs(name, name_len, &filename, 0) < 0) { - ERRPRINT("Skipping unrepresentable filename\n"); - return 0; - } - - if(strcmp(filename,".")==0 || strcmp(filename,"..")==0) - return 0; - - if (MREF(mref) == FILE_root || MREF(mref) >= FILE_first_user || false) { - struct direntry *ent = (direntry*)ntfs_calloc(sizeof(direntry)); - ent->name = (char*)ntfs_calloc(strlen(filename)+1); - strcpy(ent->name,filename); - ent->dev=cookie->dev; - ent->ino=MREF(mref); - ent->next = NULL; - - if(cookie->root==NULL) { - cookie->root = ent; - cookie->walk = ent; - } - - if(cookie->last != NULL) - cookie->last->next = ent; - - cookie->last = ent; + + if (MREF(mref) == FILE_root || MREF(mref) >= FILE_first_user || cookie->show_sys_files) { + if(cookie->readed==1) { + cookie->pos=pos; + cookie->readed = 0; + return -1; + } else { + if (ntfs_ucstombs(name, name_len, &filename, 0) < 0) + return -1; + strcpy(cookie->name,filename); + cookie->ino=MREF(mref); + cookie->readed = 1; + return 0; + } } - free(filename); return 0; } - #ifdef __HAIKU__ status_t fs_free_dircookie( void *_ns, void *node, void *cookie ) @@ -155,14 +101,14 @@ fs_opendir( void *_ns, void *_node, void **_cookie ) { nspace *ns = (nspace*)_ns; vnode *node = (vnode*)_node; + dircookie *cookie = (dircookie*)ntfs_calloc( sizeof(dircookie) ); int result = B_NO_ERROR; ntfs_inode *ni=NULL; - dircookie *cookie = (dircookie*)ntfs_calloc( sizeof(dircookie) ); - + LOCK_VOL(ns); ERRPRINT("fs_opendir - ENTER\n"); - + ni = ntfs_inode_open(ns->ntvol, node->vnid); if(ni==NULL) { result = ENOENT; @@ -173,28 +119,25 @@ fs_opendir( void *_ns, void *_node, void **_cookie ) result = EMFILE; goto exit; } - + if ( cookie != NULL ) { - cookie->dev = ns->id; - cookie->pos = 0; - //cookie->walk_dir = ni; - cookie->vnid = node->vnid; - cookie->root = NULL; - cookie->last = NULL; - cookie->walk = NULL; + cookie->pos = 0; + cookie->ino = 0; + cookie->readed = 0; + cookie->name[0] = 0; + cookie->show_sys_files = ns->show_sys_files; *_cookie = (void*)cookie; - } else { - result = ENOMEM; } -exit: - + else + result = ENOMEM; +exit: if(ni) - ntfs_inode_close(ni); + ntfs_inode_close(ni); ERRPRINT("fs_opendir - EXIT\n"); - + UNLOCK_VOL(ns); - + return result; } @@ -206,32 +149,12 @@ int fs_closedir( void *_ns, void *node, void *_cookie ) #endif { - nspace *ns = (nspace*)_ns; - dircookie *cookie = (dircookie*)_cookie; - struct direntry *entry,*entrynext; + nspace *ns = (nspace*)_ns; LOCK_VOL(ns); ERRPRINT("fs_closedir - ENTER\n"); - - entry=cookie->root; - if(entry) { - for(;;) { - entrynext = entry->next; - - if(entry->name) - free(entry->name); - - if(entry) - free(entry); - - entry = entrynext; - - if(!entry) - break; - } - } - + ERRPRINT("fs_closedir - EXIT\n"); UNLOCK_VOL(ns); @@ -247,68 +170,51 @@ int fs_readdir(void *_ns, void *_node, void *_cookie, long *num, struct dirent *buf, size_t bufsize) #endif { - int result = B_NO_ERROR; nspace *ns = (nspace*)_ns; vnode *node = (vnode*)_node; dircookie *cookie = (dircookie*)_cookie; - ntfs_inode *ni=NULL; uint32 nameLength = bufsize - sizeof(buf) + 1, realLen; - u64 pos=0; + int result = B_NO_ERROR; + ntfs_inode *ni=NULL; LOCK_VOL(ns); - ERRPRINT("fs_readdir - ENTER:\n"); + ERRPRINT("fs_readdir - ENTER\n"); if (!ns || !node || !cookie || !num || bufsize < sizeof(buf)) { - result = -1; - goto quit; + result = EINVAL; + goto exit; } - - if(cookie->pos==0) { - ni = ntfs_inode_open(ns->ntvol, node->vnid); - if(ni==NULL) { - result = ENOENT; - goto quit; - } - ntfs_readdir(ni, &pos, cookie, (ntfs_filldir_t)_ntfs_dirent_dot_filler); - cookie->pos+=2; - } else { - if(cookie->pos==2) { - ni = ntfs_inode_open(ns->ntvol, node->vnid); - if(ni==NULL) { - result = ENOENT; - goto quit; - } - ntfs_readdir(ni, &pos, cookie, (ntfs_filldir_t)_ntfs_dirent_filler); - cookie->pos++; - } - } - - if(cookie->root==NULL || cookie->last==NULL) { - result = -1; - goto quit; + if(cookie->readed == 1) { + result = ENOENT; + goto exit; } - if(cookie->walk==NULL) { - result = ENOENT; - goto quit; - } - + ni = ntfs_inode_open(ns->ntvol, node->vnid); + if(ni==NULL) { + result = ENOENT; + goto exit; + } - realLen = ( strlen(cookie->walk->name)>=nameLength?(nameLength):(strlen(cookie->walk->name)) )+1; - buf->d_dev = cookie->walk->dev; - buf->d_ino = cookie->walk->ino; - memcpy(buf->d_name,cookie->walk->name, realLen); - buf->d_reclen = sizeof(buf) + realLen - 1; + result = ntfs_readdir(ni, &cookie->pos, cookie, (ntfs_filldir_t)_ntfs_dirent_filler); + if(result==0) { + realLen = nameLength>255?255:nameLength; + buf->d_dev = ns->id; + buf->d_ino = cookie->ino; + memcpy(buf->d_name,cookie->name, realLen+1); + buf->d_reclen = sizeof(buf) + realLen - 1; + result = B_NO_ERROR; + } + else + result = ENOENT; - cookie->walk = cookie->walk->next; + ERRPRINT("fs_readdir - FILE: [%s]\n",buf->d_name); +exit: + if(ni) + ntfs_inode_close(ni); - ERRPRINT("fs_readdir - FILE: %s\n",buf->d_name); - -quit: - if ( result == B_NO_ERROR ) *num = 1; else @@ -316,11 +222,8 @@ quit: if ( result == ENOENT ) result = B_NO_ERROR; - - if(ni) - ntfs_inode_close(ni); - ERRPRINT("fs_readdir - EXIT, result is %s\n", strerror(result)); + ERRPRINT("fs_readdir - EXIT result (%s)\n", strerror(result)); UNLOCK_VOL(ns); @@ -336,15 +239,17 @@ fs_rewinddir( void *_ns, void *_node, void *_cookie ) #endif { nspace *ns = (nspace*)_ns; - int result = EINVAL; dircookie *cookie = (dircookie*)_cookie; - + int result = EINVAL; + LOCK_VOL(ns); ERRPRINT("fs_rewinddir - ENTER\n"); if ( cookie != NULL ) { - cookie->pos = 0; - cookie->walk = cookie->root; + cookie->pos = 0; + cookie->ino = 0; + cookie->readed = 0; + cookie->name[0] = 0; result = B_NO_ERROR; } ERRPRINT("fs_rewinddir - EXIT, result is %s\n", strerror(result)); diff --git a/src/add-ons/kernel/file_systems/ntfs/ntfsdir.h b/src/add-ons/kernel/file_systems/ntfs/ntfsdir.h index 4642e9c80f..38f59b8a88 100644 --- a/src/add-ons/kernel/file_systems/ntfs/ntfsdir.h +++ b/src/add-ons/kernel/file_systems/ntfs/ntfsdir.h @@ -22,25 +22,15 @@ #define _NTFSDIR_H -typedef struct direntry -{ - char *name; - dev_t dev; - ino_t ino; - struct direntry *next; -} direntry; - typedef struct dircookie { - dev_t dev; - vnode_id vnid; - struct direntry * root; - struct direntry * last; - struct direntry * walk; u64 pos; + int readed; + ino_t ino; + BOOL show_sys_files; + char name[MAX_PATH]; } dircookie; - #ifdef __HAIKU__ status_t fs_free_dircookie( void *_ns, void *node, void *cookie ); diff --git a/src/add-ons/kernel/file_systems/ntfs/settings/ntfs b/src/add-ons/kernel/file_systems/ntfs/settings/ntfs new file mode 100644 index 0000000000..f39ca1ae67 --- /dev/null +++ b/src/add-ons/kernel/file_systems/ntfs/settings/ntfs @@ -0,0 +1,8 @@ +# Sample settings file for the ntfs plugin +# +# This file should be moved to the directory +# /boot/home/config/settings/kernel/drivers/ +# +hide_sys_files true +read_only false +no_atime true