NodeMonitor: Added B_WATCH_CHILDREN flag.
* Added a directory argument for notify_{stat/attribute}_changed().
* This allows to watch only a directory, and get the notifications for
all of its files, not just add/remove entry notifications.
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2004-2014, Haiku Inc. All Rights Reserved.
|
* Copyright 2004-2016, Haiku Inc. All Rights Reserved.
|
||||||
* Distributed under the terms of the MIT License.
|
* Distributed under the terms of the MIT License.
|
||||||
*/
|
*/
|
||||||
#ifndef _FS_INTERFACE_H
|
#ifndef _FS_INTERFACE_H
|
||||||
@@ -358,10 +358,10 @@ extern status_t notify_entry_removed(dev_t device, ino_t directory,
|
|||||||
extern status_t notify_entry_moved(dev_t device, ino_t fromDirectory,
|
extern status_t notify_entry_moved(dev_t device, ino_t fromDirectory,
|
||||||
const char* fromName, ino_t toDirectory,
|
const char* fromName, ino_t toDirectory,
|
||||||
const char* toName, ino_t node);
|
const char* toName, ino_t node);
|
||||||
extern status_t notify_stat_changed(dev_t device, ino_t node,
|
extern status_t notify_stat_changed(dev_t device, ino_t directory, ino_t node,
|
||||||
uint32 statFields);
|
uint32 statFields);
|
||||||
extern status_t notify_attribute_changed(dev_t device, ino_t node,
|
extern status_t notify_attribute_changed(dev_t device, ino_t directory,
|
||||||
const char* attribute, int32 cause);
|
ino_t node, const char* attribute, int32 cause);
|
||||||
|
|
||||||
extern status_t notify_query_entry_created(port_id port, int32 token,
|
extern status_t notify_query_entry_created(port_id port, int32 token,
|
||||||
dev_t device, ino_t directory, const char* name,
|
dev_t device, ino_t directory, const char* name,
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2002-2003, Haiku Inc. All Rights Reserved.
|
* Copyright 2002-2016, Haiku Inc. All Rights Reserved.
|
||||||
* Distributed under the terms of the MIT License.
|
* Distributed under the terms of the MIT License.
|
||||||
*/
|
*/
|
||||||
#ifndef _FS_INFO_H
|
#ifndef _FS_INFO_H
|
||||||
@@ -20,6 +20,7 @@
|
|||||||
#define B_FS_HAS_SELF_HEALING_LINKS 0x00080000
|
#define B_FS_HAS_SELF_HEALING_LINKS 0x00080000
|
||||||
#define B_FS_HAS_ALIASES 0x00100000
|
#define B_FS_HAS_ALIASES 0x00100000
|
||||||
#define B_FS_SUPPORTS_NODE_MONITORING 0x00200000
|
#define B_FS_SUPPORTS_NODE_MONITORING 0x00200000
|
||||||
|
#define B_FS_SUPPORTS_MONITOR_CHILDREN 0x00400000
|
||||||
|
|
||||||
typedef struct fs_info {
|
typedef struct fs_info {
|
||||||
dev_t dev; /* volume dev_t */
|
dev_t dev; /* volume dev_t */
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2003-2010 Haiku Inc. All rights reserved.
|
* Copyright 2003-2016 Haiku Inc. All rights reserved.
|
||||||
* Distributed under the terms of the MIT License.
|
* Distributed under the terms of the MIT License.
|
||||||
*/
|
*/
|
||||||
#ifndef _NODE_MONITOR_H
|
#ifndef _NODE_MONITOR_H
|
||||||
@@ -23,7 +23,8 @@ enum {
|
|||||||
B_WATCH_ALL = 0x000f,
|
B_WATCH_ALL = 0x000f,
|
||||||
|
|
||||||
B_WATCH_MOUNT = 0x0010,
|
B_WATCH_MOUNT = 0x0010,
|
||||||
B_WATCH_INTERIM_STAT = 0x0020
|
B_WATCH_INTERIM_STAT = 0x0020,
|
||||||
|
B_WATCH_CHILDREN = 0x0040
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -895,6 +895,7 @@
|
|||||||
#define B_FS_HAS_SELF_HEALING_LINKS FSSH_B_FS_HAS_SELF_HEALING_LINKS
|
#define B_FS_HAS_SELF_HEALING_LINKS FSSH_B_FS_HAS_SELF_HEALING_LINKS
|
||||||
#define B_FS_HAS_ALIASES FSSH_B_FS_HAS_ALIASES
|
#define B_FS_HAS_ALIASES FSSH_B_FS_HAS_ALIASES
|
||||||
#define B_FS_SUPPORTS_NODE_MONITORING FSSH_B_FS_SUPPORTS_NODE_MONITORING
|
#define B_FS_SUPPORTS_NODE_MONITORING FSSH_B_FS_SUPPORTS_NODE_MONITORING
|
||||||
|
#define B_FS_SUPPORTS_MONITOR_CHILDREN FSSH_B_FS_SUPPORTS_MONITOR_CHILDREN
|
||||||
|
|
||||||
#define fs_info fssh_fs_info
|
#define fs_info fssh_fs_info
|
||||||
|
|
||||||
|
|||||||
@@ -21,6 +21,7 @@
|
|||||||
#define FSSH_B_FS_HAS_SELF_HEALING_LINKS 0x00080000
|
#define FSSH_B_FS_HAS_SELF_HEALING_LINKS 0x00080000
|
||||||
#define FSSH_B_FS_HAS_ALIASES 0x00100000
|
#define FSSH_B_FS_HAS_ALIASES 0x00100000
|
||||||
#define FSSH_B_FS_SUPPORTS_NODE_MONITORING 0x00200000
|
#define FSSH_B_FS_SUPPORTS_NODE_MONITORING 0x00200000
|
||||||
|
#define FSSH_B_FS_SUPPORTS_MONITOR_CHILDREN 0x00400000
|
||||||
|
|
||||||
typedef struct fssh_fs_info {
|
typedef struct fssh_fs_info {
|
||||||
fssh_dev_t dev; /* volume dev_t */
|
fssh_dev_t dev; /* volume dev_t */
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2004-2008, Haiku Inc. All Rights Reserved.
|
* Copyright 2004-2016, Haiku Inc. All Rights Reserved.
|
||||||
* Distributed under the terms of the MIT License.
|
* Distributed under the terms of the MIT License.
|
||||||
*/
|
*/
|
||||||
#ifndef _FSSH_FS_INTERFACE_H
|
#ifndef _FSSH_FS_INTERFACE_H
|
||||||
@@ -395,9 +395,10 @@ extern fssh_status_t fssh_notify_entry_moved(fssh_mount_id device,
|
|||||||
fssh_vnode_id toDirectory, const char *toName,
|
fssh_vnode_id toDirectory, const char *toName,
|
||||||
fssh_vnode_id node);
|
fssh_vnode_id node);
|
||||||
extern fssh_status_t fssh_notify_stat_changed(fssh_mount_id device,
|
extern fssh_status_t fssh_notify_stat_changed(fssh_mount_id device,
|
||||||
fssh_vnode_id node, uint32_t statFields);
|
fssh_vnode_id dir, fssh_vnode_id node, uint32_t statFields);
|
||||||
extern fssh_status_t fssh_notify_attribute_changed(fssh_mount_id device,
|
extern fssh_status_t fssh_notify_attribute_changed(fssh_mount_id device,
|
||||||
fssh_vnode_id node, const char *attribute, int32_t cause);
|
fssh_vnode_id dir, fssh_vnode_id node, const char *attribute,
|
||||||
|
int32_t cause);
|
||||||
|
|
||||||
extern fssh_status_t fssh_notify_query_entry_created(fssh_port_id port,
|
extern fssh_status_t fssh_notify_query_entry_created(fssh_port_id port,
|
||||||
int32_t token, fssh_mount_id device,
|
int32_t token, fssh_mount_id device,
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2001-2010, Axel Dörfler, [email protected].
|
* Copyright 2001-2016, Axel Dörfler, [email protected].
|
||||||
* This file may be used under the terms of the MIT License.
|
* This file may be used under the terms of the MIT License.
|
||||||
*/
|
*/
|
||||||
#ifndef INODE_H
|
#ifndef INODE_H
|
||||||
@@ -95,6 +95,9 @@ public:
|
|||||||
const block_run& BlockRun() const
|
const block_run& BlockRun() const
|
||||||
{ return fNode.inode_num; }
|
{ return fNode.inode_num; }
|
||||||
block_run& Parent() { return fNode.parent; }
|
block_run& Parent() { return fNode.parent; }
|
||||||
|
const block_run& Parent() const { return fNode.parent; }
|
||||||
|
ino_t ParentID() const
|
||||||
|
{ return fVolume->ToVnode(Parent()); }
|
||||||
block_run& Attributes() { return fNode.attributes; }
|
block_run& Attributes() { return fNode.attributes; }
|
||||||
|
|
||||||
Volume* GetVolume() const { return fVolume; }
|
Volume* GetVolume() const { return fVolume; }
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2001-2014, Axel Dörfler, axeld@pinc-software.de.
|
* Copyright 2001-2016, Axel Dörfler, axeld@pinc-software.de.
|
||||||
* This file may be used under the terms of the MIT License.
|
* This file may be used under the terms of the MIT License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -208,7 +208,8 @@ bfs_read_fs_stat(fs_volume* _volume, struct fs_info* info)
|
|||||||
// File system flags.
|
// File system flags.
|
||||||
info->flags = B_FS_IS_PERSISTENT | B_FS_HAS_ATTR | B_FS_HAS_MIME
|
info->flags = B_FS_IS_PERSISTENT | B_FS_HAS_ATTR | B_FS_HAS_MIME
|
||||||
| (volume->IndicesNode() != NULL ? B_FS_HAS_QUERY : 0)
|
| (volume->IndicesNode() != NULL ? B_FS_HAS_QUERY : 0)
|
||||||
| (volume->IsReadOnly() ? B_FS_IS_READONLY : 0);
|
| (volume->IsReadOnly() ? B_FS_IS_READONLY : 0)
|
||||||
|
| B_FS_SUPPORTS_MONITOR_CHILDREN;
|
||||||
|
|
||||||
info->io_size = BFS_IO_SIZE;
|
info->io_size = BFS_IO_SIZE;
|
||||||
// whatever is appropriate here?
|
// whatever is appropriate here?
|
||||||
@@ -923,7 +924,7 @@ bfs_write_stat(fs_volume* _volume, fs_vnode* _node, const struct stat* stat,
|
|||||||
if (status == B_OK)
|
if (status == B_OK)
|
||||||
status = transaction.Done();
|
status = transaction.Done();
|
||||||
if (status == B_OK)
|
if (status == B_OK)
|
||||||
notify_stat_changed(volume->ID(), inode->ID(), mask);
|
notify_stat_changed(volume->ID(), inode->ParentID(), inode->ID(), mask);
|
||||||
|
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
@@ -1397,7 +1398,7 @@ bfs_write(fs_volume* _volume, fs_vnode* _node, void* _cookie, off_t pos,
|
|||||||
if (!inode->IsDeleted() && cookie->last_size != inode->Size()
|
if (!inode->IsDeleted() && cookie->last_size != inode->Size()
|
||||||
&& system_time() > cookie->last_notification
|
&& system_time() > cookie->last_notification
|
||||||
+ INODE_NOTIFICATION_INTERVAL) {
|
+ INODE_NOTIFICATION_INTERVAL) {
|
||||||
notify_stat_changed(volume->ID(), inode->ID(),
|
notify_stat_changed(volume->ID(), inode->ParentID(), inode->ID(),
|
||||||
B_STAT_MODIFICATION_TIME | B_STAT_SIZE | B_STAT_INTERIM_UPDATE);
|
B_STAT_MODIFICATION_TIME | B_STAT_SIZE | B_STAT_INTERIM_UPDATE);
|
||||||
cookie->last_size = inode->Size();
|
cookie->last_size = inode->Size();
|
||||||
cookie->last_notification = system_time();
|
cookie->last_notification = system_time();
|
||||||
@@ -1483,7 +1484,7 @@ bfs_free_cookie(fs_volume* _volume, fs_vnode* _node, void* _cookie)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (changedSize || changedTime) {
|
if (changedSize || changedTime) {
|
||||||
notify_stat_changed(volume->ID(), inode->ID(),
|
notify_stat_changed(volume->ID(), inode->ParentID(), inode->ID(),
|
||||||
(changedTime ? B_STAT_MODIFICATION_TIME : 0)
|
(changedTime ? B_STAT_MODIFICATION_TIME : 0)
|
||||||
| (changedSize ? B_STAT_SIZE : 0));
|
| (changedSize ? B_STAT_SIZE : 0));
|
||||||
}
|
}
|
||||||
@@ -1890,9 +1891,11 @@ bfs_write_attr(fs_volume* _volume, fs_vnode* _file, void* _cookie,
|
|||||||
if (status == B_OK) {
|
if (status == B_OK) {
|
||||||
status = transaction.Done();
|
status = transaction.Done();
|
||||||
if (status == B_OK) {
|
if (status == B_OK) {
|
||||||
notify_attribute_changed(volume->ID(), inode->ID(), cookie->name,
|
notify_attribute_changed(volume->ID(), inode->ParentID(),
|
||||||
|
inode->ID(), cookie->name,
|
||||||
created ? B_ATTR_CREATED : B_ATTR_CHANGED);
|
created ? B_ATTR_CREATED : B_ATTR_CHANGED);
|
||||||
notify_stat_changed(volume->ID(), inode->ID(), B_STAT_CHANGE_TIME);
|
notify_stat_changed(volume->ID(), inode->ParentID(), inode->ID(),
|
||||||
|
B_STAT_CHANGE_TIME);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1956,8 +1959,8 @@ bfs_remove_attr(fs_volume* _volume, fs_vnode* _node, const char* name)
|
|||||||
if (status == B_OK)
|
if (status == B_OK)
|
||||||
status = transaction.Done();
|
status = transaction.Done();
|
||||||
if (status == B_OK) {
|
if (status == B_OK) {
|
||||||
notify_attribute_changed(volume->ID(), inode->ID(), name,
|
notify_attribute_changed(volume->ID(), inode->ParentID(), inode->ID(),
|
||||||
B_ATTR_REMOVED);
|
name, B_ATTR_REMOVED);
|
||||||
}
|
}
|
||||||
|
|
||||||
return status;
|
return status;
|
||||||
|
|||||||
@@ -353,7 +353,7 @@ btrfs_lookup(fs_volume* _volume, fs_vnode* _directory, const char* name,
|
|||||||
status = DirectoryIterator(directory).Lookup(name, strlen(name), _vnodeID);
|
status = DirectoryIterator(directory).Lookup(name, strlen(name), _vnodeID);
|
||||||
if (status != B_OK)
|
if (status != B_OK)
|
||||||
return status;
|
return status;
|
||||||
|
|
||||||
return get_vnode(volume->FSVolume(), *_vnodeID, NULL);
|
return get_vnode(volume->FSVolume(), *_vnodeID, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -373,7 +373,7 @@ static status_t
|
|||||||
btrfs_read_stat(fs_volume* _volume, fs_vnode* _node, struct stat* stat)
|
btrfs_read_stat(fs_volume* _volume, fs_vnode* _node, struct stat* stat)
|
||||||
{
|
{
|
||||||
Inode* inode = (Inode*)_node->private_node;
|
Inode* inode = (Inode*)_node->private_node;
|
||||||
|
|
||||||
stat->st_dev = inode->GetVolume()->ID();
|
stat->st_dev = inode->GetVolume()->ID();
|
||||||
stat->st_ino = inode->ID();
|
stat->st_ino = inode->ID();
|
||||||
stat->st_nlink = 1;
|
stat->st_nlink = 1;
|
||||||
@@ -466,7 +466,7 @@ btrfs_free_cookie(fs_volume* _volume, fs_vnode* _node, void* _cookie)
|
|||||||
Inode* inode = (Inode*)_node->private_node;
|
Inode* inode = (Inode*)_node->private_node;
|
||||||
|
|
||||||
if (inode->Size() != cookie->last_size)
|
if (inode->Size() != cookie->last_size)
|
||||||
notify_stat_changed(volume->ID(), inode->ID(), B_STAT_SIZE);
|
notify_stat_changed(volume->ID(), -1, inode->ID(), B_STAT_SIZE);
|
||||||
|
|
||||||
delete cookie;
|
delete cookie;
|
||||||
return B_OK;
|
return B_OK;
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2007-2013, Axel Dörfler, axeld@pinc-software.de.
|
* Copyright 2007-2016, Axel Dörfler, axeld@pinc-software.de.
|
||||||
* Distributed under the terms of the MIT License.
|
* Distributed under the terms of the MIT License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -2067,7 +2067,7 @@ cdda_create_attr(fs_volume* _volume, fs_vnode* _node, const char* name,
|
|||||||
if (status != B_OK)
|
if (status != B_OK)
|
||||||
return status;
|
return status;
|
||||||
|
|
||||||
notify_attribute_changed(volume->ID(), inode->ID(), name,
|
notify_attribute_changed(volume->ID(), -1, inode->ID(), name,
|
||||||
B_ATTR_CREATED);
|
B_ATTR_CREATED);
|
||||||
} else if ((openMode & O_EXCL) == 0) {
|
} else if ((openMode & O_EXCL) == 0) {
|
||||||
if (attribute->IsProtectedNamespace())
|
if (attribute->IsProtectedNamespace())
|
||||||
@@ -2157,8 +2157,8 @@ cdda_write_attr(fs_volume* _volume, fs_vnode* _node, void* _cookie,
|
|||||||
|
|
||||||
status_t status = attribute->WriteAt(offset, (uint8*)buffer, _length);
|
status_t status = attribute->WriteAt(offset, (uint8*)buffer, _length);
|
||||||
if (status == B_OK) {
|
if (status == B_OK) {
|
||||||
notify_attribute_changed(volume->ID(), inode->ID(), attribute->Name(),
|
notify_attribute_changed(volume->ID(), -1, inode->ID(),
|
||||||
B_ATTR_CHANGED);
|
attribute->Name(), B_ATTR_CHANGED);
|
||||||
}
|
}
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
@@ -2203,7 +2203,7 @@ cdda_remove_attr(fs_volume* _volume, fs_vnode* _node, const char* name)
|
|||||||
|
|
||||||
status_t status = inode->RemoveAttribute(name, true);
|
status_t status = inode->RemoveAttribute(name, true);
|
||||||
if (status == B_OK) {
|
if (status == B_OK) {
|
||||||
notify_attribute_changed(volume->ID(), inode->ID(), name,
|
notify_attribute_changed(volume->ID(), -1, inode->ID(), name,
|
||||||
B_ATTR_REMOVED);
|
B_ATTR_REMOVED);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -421,7 +421,7 @@ static status_t
|
|||||||
exfat_read_stat(fs_volume* _volume, fs_vnode* _node, struct stat* stat)
|
exfat_read_stat(fs_volume* _volume, fs_vnode* _node, struct stat* stat)
|
||||||
{
|
{
|
||||||
Inode* inode = (Inode*)_node->private_node;
|
Inode* inode = (Inode*)_node->private_node;
|
||||||
|
|
||||||
stat->st_dev = inode->GetVolume()->ID();
|
stat->st_dev = inode->GetVolume()->ID();
|
||||||
stat->st_ino = inode->ID();
|
stat->st_ino = inode->ID();
|
||||||
stat->st_nlink = 1;
|
stat->st_nlink = 1;
|
||||||
@@ -514,7 +514,7 @@ exfat_free_cookie(fs_volume* _volume, fs_vnode* _node, void* _cookie)
|
|||||||
Inode* inode = (Inode*)_node->private_node;
|
Inode* inode = (Inode*)_node->private_node;
|
||||||
|
|
||||||
if (inode->Size() != cookie->last_size)
|
if (inode->Size() != cookie->last_size)
|
||||||
notify_stat_changed(volume->ID(), inode->ID(), B_STAT_SIZE);
|
notify_stat_changed(volume->ID(), -1, inode->ID(), B_STAT_SIZE);
|
||||||
|
|
||||||
delete cookie;
|
delete cookie;
|
||||||
return B_OK;
|
return B_OK;
|
||||||
|
|||||||
@@ -710,7 +710,7 @@ ext2_write_stat(fs_volume* _volume, fs_vnode* _node, const struct stat* stat,
|
|||||||
if (status == B_OK)
|
if (status == B_OK)
|
||||||
status = transaction.Done();
|
status = transaction.Done();
|
||||||
if (status == B_OK)
|
if (status == B_OK)
|
||||||
notify_stat_changed(volume->ID(), inode->ID(), mask);
|
notify_stat_changed(volume->ID(), -1, inode->ID(), mask);
|
||||||
|
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
@@ -1219,7 +1219,7 @@ ext2_write(fs_volume* _volume, fs_vnode* _node, void* _cookie, off_t pos,
|
|||||||
if (cookie->last_size != inode->Size()
|
if (cookie->last_size != inode->Size()
|
||||||
&& system_time() > cookie->last_notification
|
&& system_time() > cookie->last_notification
|
||||||
+ INODE_NOTIFICATION_INTERVAL) {
|
+ INODE_NOTIFICATION_INTERVAL) {
|
||||||
notify_stat_changed(volume->ID(), inode->ID(),
|
notify_stat_changed(volume->ID(), -1, inode->ID(),
|
||||||
B_STAT_MODIFICATION_TIME | B_STAT_SIZE | B_STAT_INTERIM_UPDATE);
|
B_STAT_MODIFICATION_TIME | B_STAT_SIZE | B_STAT_INTERIM_UPDATE);
|
||||||
cookie->last_size = inode->Size();
|
cookie->last_size = inode->Size();
|
||||||
cookie->last_notification = system_time();
|
cookie->last_notification = system_time();
|
||||||
@@ -1247,7 +1247,7 @@ ext2_free_cookie(fs_volume* _volume, fs_vnode* _node, void* _cookie)
|
|||||||
Inode* inode = (Inode*)_node->private_node;
|
Inode* inode = (Inode*)_node->private_node;
|
||||||
|
|
||||||
if (inode->Size() != cookie->last_size)
|
if (inode->Size() != cookie->last_size)
|
||||||
notify_stat_changed(volume->ID(), inode->ID(), B_STAT_SIZE);
|
notify_stat_changed(volume->ID(), -1, inode->ID(), B_STAT_SIZE);
|
||||||
|
|
||||||
if ((cookie->open_mode & O_NOCACHE) != 0)
|
if ((cookie->open_mode & O_NOCACHE) != 0)
|
||||||
inode->EnableFileCache();
|
inode->EnableFileCache();
|
||||||
@@ -1449,7 +1449,7 @@ ext2_read_dir(fs_volume *_volume, fs_vnode *_node, void *_cookie,
|
|||||||
status = iterator->Next();
|
status = iterator->Next();
|
||||||
if (status != B_OK && status != B_ENTRY_NOT_FOUND)
|
if (status != B_OK && status != B_ENTRY_NOT_FOUND)
|
||||||
return status;
|
return status;
|
||||||
|
|
||||||
dirent->d_dev = volume->ID();
|
dirent->d_dev = volume->ID();
|
||||||
dirent->d_ino = id;
|
dirent->d_ino = id;
|
||||||
dirent->d_reclen = sizeof(struct dirent) + length;
|
dirent->d_reclen = sizeof(struct dirent) + length;
|
||||||
|
|||||||
@@ -116,7 +116,7 @@ status_t write_vnode_entry(nspace *vol, vnode *node)
|
|||||||
diri_free(&diri);
|
diri_free(&diri);
|
||||||
|
|
||||||
// TODO: figure out which stats have actually changed
|
// TODO: figure out which stats have actually changed
|
||||||
notify_stat_changed(vol->id, node->vnid, B_STAT_MODE | B_STAT_UID
|
notify_stat_changed(vol->id, -1, node->vnid, B_STAT_MODE | B_STAT_UID
|
||||||
| B_STAT_GID | B_STAT_SIZE | B_STAT_ACCESS_TIME
|
| B_STAT_GID | B_STAT_SIZE | B_STAT_ACCESS_TIME
|
||||||
| B_STAT_MODIFICATION_TIME | B_STAT_CREATION_TIME
|
| B_STAT_MODIFICATION_TIME | B_STAT_CREATION_TIME
|
||||||
| B_STAT_CHANGE_TIME);
|
| B_STAT_CHANGE_TIME);
|
||||||
@@ -1025,7 +1025,7 @@ dosfs_rename(fs_volume *_vol, fs_vnode *_odir, const char *oldname,
|
|||||||
// update MIME information
|
// update MIME information
|
||||||
if(!(file->mode & FAT_SUBDIR)) {
|
if(!(file->mode & FAT_SUBDIR)) {
|
||||||
set_mime_type(file, newname);
|
set_mime_type(file, newname);
|
||||||
notify_attribute_changed(vol->id, file->vnid, "BEOS:TYPE",
|
notify_attribute_changed(vol->id, -1, file->vnid, "BEOS:TYPE",
|
||||||
B_ATTR_CHANGED);
|
B_ATTR_CHANGED);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -95,14 +95,14 @@ static int googlefs_publish_static_entries(fs_volume *_volume)
|
|||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
n->is_perm = 1;
|
n->is_perm = 1;
|
||||||
|
|
||||||
err = googlefs_create_gen(_volume, dir, "README", 0, 0444, NULL, &n, text_attrs, false, true);
|
err = googlefs_create_gen(_volume, dir, "README", 0, 0444, NULL, &n, text_attrs, false, true);
|
||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
n->is_perm = 1;
|
n->is_perm = 1;
|
||||||
n->data = readmestr;
|
n->data = readmestr;
|
||||||
n->data_size = strlen(n->data);// + 1;
|
n->data_size = strlen(n->data);// + 1;
|
||||||
|
|
||||||
err = googlefs_create_gen(_volume, dir, "Author", 0, 0444, NULL, &n, mailto_me_bookmark_attrs, false, true);
|
err = googlefs_create_gen(_volume, dir, "Author", 0, 0444, NULL, &n, mailto_me_bookmark_attrs, false, true);
|
||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
@@ -126,9 +126,9 @@ int googlefs_mount(fs_volume *_vol, const char *devname, uint32 flags,
|
|||||||
/* only allow a single mount */
|
/* only allow a single mount */
|
||||||
if (atomic_add(&refcount, 1))
|
if (atomic_add(&refcount, 1))
|
||||||
return EALREADY;
|
return EALREADY;
|
||||||
|
|
||||||
err = load_settings();
|
err = load_settings();
|
||||||
|
|
||||||
err = google_request_init();
|
err = google_request_init();
|
||||||
if (err)
|
if (err)
|
||||||
goto err_http;
|
goto err_http;
|
||||||
@@ -150,7 +150,7 @@ int googlefs_mount(fs_volume *_vol, const char *devname, uint32 flags,
|
|||||||
new_lock(&(ns->l), "googlefs main lock");
|
new_lock(&(ns->l), "googlefs main lock");
|
||||||
|
|
||||||
ns->nodes = NULL;
|
ns->nodes = NULL;
|
||||||
|
|
||||||
/* create root dir */
|
/* create root dir */
|
||||||
err = B_NO_MEMORY;
|
err = B_NO_MEMORY;
|
||||||
root = malloc(sizeof(fs_node));
|
root = malloc(sizeof(fs_node));
|
||||||
@@ -164,7 +164,7 @@ int googlefs_mount(fs_volume *_vol, const char *devname, uint32 flags,
|
|||||||
root->attrs_indirect = root_folder_attrs;
|
root->attrs_indirect = root_folder_attrs;
|
||||||
new_lock(&(root->l), "googlefs root dir");
|
new_lock(&(root->l), "googlefs root dir");
|
||||||
TRACE((PFS "mount: root->l @ %p\n", &root->l));
|
TRACE((PFS "mount: root->l @ %p\n", &root->l));
|
||||||
|
|
||||||
_vol->private_volume = ns;
|
_vol->private_volume = ns;
|
||||||
_vol->ops = &sGoogleFSVolumeOps;
|
_vol->ops = &sGoogleFSVolumeOps;
|
||||||
*vnid = ns->rootid;
|
*vnid = ns->rootid;
|
||||||
@@ -199,10 +199,10 @@ status_t googlefs_unmount(fs_volume *_volume)
|
|||||||
ns->nodes = node->nlnext; /* better cache that before we free node */
|
ns->nodes = node->nlnext; /* better cache that before we free node */
|
||||||
googlefs_free_vnode(_volume, node);
|
googlefs_free_vnode(_volume, node);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Unlike in BeOS, we need to put the reference to our root node ourselves
|
// Unlike in BeOS, we need to put the reference to our root node ourselves
|
||||||
put_vnode(_volume, ns->rootid);
|
put_vnode(_volume, ns->rootid);
|
||||||
|
|
||||||
free_lock(&ns->l);
|
free_lock(&ns->l);
|
||||||
vnidpool_free(ns->vnids);
|
vnidpool_free(ns->vnids);
|
||||||
free(ns);
|
free(ns);
|
||||||
@@ -338,7 +338,7 @@ int googlefs_walk(fs_volume *_volume, fs_vnode *_base, const char *file, ino_t *
|
|||||||
} else
|
} else
|
||||||
err = EINVAL;
|
err = EINVAL;
|
||||||
} else if (base) { /* child of dir */
|
} else if (base) { /* child of dir */
|
||||||
n = (fs_node *)SLL_FIND(base->children, next,
|
n = (fs_node *)SLL_FIND(base->children, next,
|
||||||
(sll_compare_func)compare_fs_node_by_name, (void *)file);
|
(sll_compare_func)compare_fs_node_by_name, (void *)file);
|
||||||
if (n) {
|
if (n) {
|
||||||
*vnid = n->vnid;
|
*vnid = n->vnid;
|
||||||
@@ -397,7 +397,7 @@ int googlefs_closedir(fs_volume *_volume, fs_vnode *_node, fs_dir_cookie *cookie
|
|||||||
err = LOCK(&node->l);
|
err = LOCK(&node->l);
|
||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
SLL_REMOVE(node->opened, next, cookie);
|
SLL_REMOVE(node->opened, next, cookie);
|
||||||
UNLOCK(&node->l);
|
UNLOCK(&node->l);
|
||||||
|
|
||||||
@@ -532,7 +532,7 @@ int googlefs_open(fs_volume *_volume, fs_vnode *_node, int omode, fs_file_cookie
|
|||||||
TRACE((PFS"open(%ld, %Ld, 0x%x)\n", ns->nsid, node->vnid, omode));
|
TRACE((PFS"open(%ld, %Ld, 0x%x)\n", ns->nsid, node->vnid, omode));
|
||||||
if (!node || !cookie)
|
if (!node || !cookie)
|
||||||
return EINVAL;
|
return EINVAL;
|
||||||
|
|
||||||
// err = LOCK(&ns->l);
|
// err = LOCK(&ns->l);
|
||||||
// if (err)
|
// if (err)
|
||||||
// return err;
|
// return err;
|
||||||
@@ -589,7 +589,7 @@ int googlefs_close(fs_volume *_volume, fs_vnode *_node, fs_file_cookie *cookie)
|
|||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
SLL_REMOVE(node->opened, next, cookie);
|
SLL_REMOVE(node->opened, next, cookie);
|
||||||
|
|
||||||
all_ok:
|
all_ok:
|
||||||
err_n_l:
|
err_n_l:
|
||||||
UNLOCK(&node->l);
|
UNLOCK(&node->l);
|
||||||
@@ -680,7 +680,7 @@ static int googlefs_create_gen(fs_volume *_volume, fs_node *dir, const char *nam
|
|||||||
fs_node *n;
|
fs_node *n;
|
||||||
int i;
|
int i;
|
||||||
TRACE((PFS"create_gen(%ld, %Ld, '%s', 0x%08lx, %c, %c)\n", ns->nsid, dir->vnid, name, omode, mkdir?'t':'f', uniq?'t':'f'));
|
TRACE((PFS"create_gen(%ld, %Ld, '%s', 0x%08lx, %c, %c)\n", ns->nsid, dir->vnid, name, omode, mkdir?'t':'f', uniq?'t':'f'));
|
||||||
|
|
||||||
if (strlen(name) > GOOGLEFS_NAME_LEN-1)
|
if (strlen(name) > GOOGLEFS_NAME_LEN-1)
|
||||||
return ENAMETOOLONG;
|
return ENAMETOOLONG;
|
||||||
err = LOCK(&dir->l);
|
err = LOCK(&dir->l);
|
||||||
@@ -689,7 +689,7 @@ static int googlefs_create_gen(fs_volume *_volume, fs_node *dir, const char *nam
|
|||||||
err = ENOTDIR;
|
err = ENOTDIR;
|
||||||
if (!S_ISDIR(dir->st.st_mode))
|
if (!S_ISDIR(dir->st.st_mode))
|
||||||
goto err_l;
|
goto err_l;
|
||||||
n = (fs_node *)SLL_FIND(dir->children, next,
|
n = (fs_node *)SLL_FIND(dir->children, next,
|
||||||
(sll_compare_func)compare_fs_node_by_name, (void *)name);
|
(sll_compare_func)compare_fs_node_by_name, (void *)name);
|
||||||
err = EEXIST;
|
err = EEXIST;
|
||||||
if (n && (omode & O_EXCL) && !uniq) /* already existing entry in there! */
|
if (n && (omode & O_EXCL) && !uniq) /* already existing entry in there! */
|
||||||
@@ -703,13 +703,13 @@ static int googlefs_create_gen(fs_volume *_volume, fs_node *dir, const char *nam
|
|||||||
strncpy(newname, name, 56);
|
strncpy(newname, name, 56);
|
||||||
newname[56] = '\0';
|
newname[56] = '\0';
|
||||||
sprintf(newname+strlen(newname), " %05d", i);
|
sprintf(newname+strlen(newname), " %05d", i);
|
||||||
n = (fs_node *)SLL_FIND(dir->children, next,
|
n = (fs_node *)SLL_FIND(dir->children, next,
|
||||||
(sll_compare_func)compare_fs_node_by_name, (void *)newname);
|
(sll_compare_func)compare_fs_node_by_name, (void *)newname);
|
||||||
}
|
}
|
||||||
if (n && (uniq || mkdir)) /* still there! */
|
if (n && (uniq || mkdir)) /* still there! */
|
||||||
goto err_l;
|
goto err_l;
|
||||||
name = newname;
|
name = newname;
|
||||||
|
|
||||||
if (n) { /* already exists, so return it */
|
if (n) { /* already exists, so return it */
|
||||||
if (node)
|
if (node)
|
||||||
*node = n;
|
*node = n;
|
||||||
@@ -730,9 +730,9 @@ static int googlefs_create_gen(fs_volume *_volume, fs_node *dir, const char *nam
|
|||||||
strcpy(n->name, name);
|
strcpy(n->name, name);
|
||||||
//n->is_perm = 1;
|
//n->is_perm = 1;
|
||||||
fill_default_stat(&n->st, ns->nsid, n->vnid, (perms & ~S_IFMT) | (mkdir?S_IFDIR:S_IFREG));
|
fill_default_stat(&n->st, ns->nsid, n->vnid, (perms & ~S_IFMT) | (mkdir?S_IFDIR:S_IFREG));
|
||||||
|
|
||||||
new_lock(&(n->l), mkdir?"googlefs dir":"googlefs file");
|
new_lock(&(n->l), mkdir?"googlefs dir":"googlefs file");
|
||||||
|
|
||||||
err = LOCK(&ns->l);
|
err = LOCK(&ns->l);
|
||||||
if (err)
|
if (err)
|
||||||
goto err_nl;
|
goto err_nl;
|
||||||
@@ -752,14 +752,14 @@ static int googlefs_create_gen(fs_volume *_volume, fs_node *dir, const char *nam
|
|||||||
n->attrs_indirect = iattrs;
|
n->attrs_indirect = iattrs;
|
||||||
notify_entry_created(ns->nsid, dir->vnid, name, n->vnid);
|
notify_entry_created(ns->nsid, dir->vnid, name, n->vnid);
|
||||||
/* dosfs doesn't do that one but I believe it should */
|
/* dosfs doesn't do that one but I believe it should */
|
||||||
notify_stat_changed(B_STAT_CHANGED, ns->nsid, -1);
|
notify_stat_changed(B_STAT_CHANGED, -1, ns->nsid, -1);
|
||||||
/* give node to caller if it wants it */
|
/* give node to caller if it wants it */
|
||||||
if (node)
|
if (node)
|
||||||
*node = n;
|
*node = n;
|
||||||
if (vnid)
|
if (vnid)
|
||||||
*vnid = n->vnid;
|
*vnid = n->vnid;
|
||||||
goto done;
|
goto done;
|
||||||
|
|
||||||
err_insnl:
|
err_insnl:
|
||||||
SLL_REMOVE(ns->nodes, nlnext, n);
|
SLL_REMOVE(ns->nodes, nlnext, n);
|
||||||
err_lns:
|
err_lns:
|
||||||
@@ -784,7 +784,7 @@ int googlefs_create(fs_volume *_volume, fs_vnode *_dir, const char *name, int om
|
|||||||
TRACE((PFS"create(%ld, %Ld, '%s', 0x%08lx)\n", ns->nsid, dir->vnid, name, omode));
|
TRACE((PFS"create(%ld, %Ld, '%s', 0x%08lx)\n", ns->nsid, dir->vnid, name, omode));
|
||||||
/* don't let ppl mess our fs up */
|
/* don't let ppl mess our fs up */
|
||||||
return ENOSYS;
|
return ENOSYS;
|
||||||
|
|
||||||
err = googlefs_create_gen(_volume, dir, name, omode, perms, vnid, &n, NULL, false, false);
|
err = googlefs_create_gen(_volume, dir, name, omode, perms, vnid, &n, NULL, false, false);
|
||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
@@ -804,7 +804,7 @@ static int googlefs_unlink_gen(fs_volume *_volume, fs_node *dir, const char *nam
|
|||||||
return err;
|
return err;
|
||||||
err = ENOENT;
|
err = ENOENT;
|
||||||
/* no need to check for S_ISDIR */
|
/* no need to check for S_ISDIR */
|
||||||
n = (fs_node *)SLL_FIND(dir->children, next,
|
n = (fs_node *)SLL_FIND(dir->children, next,
|
||||||
(sll_compare_func)compare_fs_node_by_name, (void *)name);
|
(sll_compare_func)compare_fs_node_by_name, (void *)name);
|
||||||
if (n) {
|
if (n) {
|
||||||
if (n->children)
|
if (n->children)
|
||||||
@@ -887,7 +887,7 @@ static int googlefs_mkdir_gen(fs_volume *_volume, fs_vnode *_dir, const char *na
|
|||||||
fs_node *n;
|
fs_node *n;
|
||||||
int i;
|
int i;
|
||||||
TRACE((PFS"mkdir_gen(%ld, %Ld, '%s', 0x%08lx, %c)\n", ns->nsid, dir->vnid, name, perms, uniq?'t':'f'));
|
TRACE((PFS"mkdir_gen(%ld, %Ld, '%s', 0x%08lx, %c)\n", ns->nsid, dir->vnid, name, perms, uniq?'t':'f'));
|
||||||
|
|
||||||
if (strlen(name) > GOOGLEFS_NAME_LEN-1)
|
if (strlen(name) > GOOGLEFS_NAME_LEN-1)
|
||||||
return ENAMETOOLONG;
|
return ENAMETOOLONG;
|
||||||
err = LOCK(&dir->l);
|
err = LOCK(&dir->l);
|
||||||
@@ -896,24 +896,24 @@ static int googlefs_mkdir_gen(fs_volume *_volume, fs_vnode *_dir, const char *na
|
|||||||
err = ENOTDIR;
|
err = ENOTDIR;
|
||||||
if (!S_ISDIR(dir->st.st_mode))
|
if (!S_ISDIR(dir->st.st_mode))
|
||||||
goto err_l;
|
goto err_l;
|
||||||
n = (fs_node *)SLL_FIND(dir->children, next,
|
n = (fs_node *)SLL_FIND(dir->children, next,
|
||||||
(sll_compare_func)compare_fs_node_by_name, (void *)name);
|
(sll_compare_func)compare_fs_node_by_name, (void *)name);
|
||||||
err = EEXIST;
|
err = EEXIST;
|
||||||
if (n && !uniq) /* already existing entry in there! */
|
if (n && !uniq) /* already existing entry in there! */
|
||||||
goto err_l;
|
goto err_l;
|
||||||
|
|
||||||
strncpy(newname, name, GOOGLEFS_NAME_LEN);
|
strncpy(newname, name, GOOGLEFS_NAME_LEN);
|
||||||
newname[GOOGLEFS_NAME_LEN-1] = '\0';
|
newname[GOOGLEFS_NAME_LEN-1] = '\0';
|
||||||
for (i = 1; n && i < 5000; i++) { /* uniquify the name */
|
for (i = 1; n && i < 5000; i++) { /* uniquify the name */
|
||||||
//sprintf("%"#(GOOGLEFS_NAME_LEN-8)"s %05d", name, i);
|
//sprintf("%"#(GOOGLEFS_NAME_LEN-8)"s %05d", name, i);
|
||||||
sprintf("%56s %05d", name, i);
|
sprintf("%56s %05d", name, i);
|
||||||
n = (fs_node *)SLL_FIND(dir->children, next,
|
n = (fs_node *)SLL_FIND(dir->children, next,
|
||||||
(sll_compare_func)compare_fs_node_by_name, (void *)newname);
|
(sll_compare_func)compare_fs_node_by_name, (void *)newname);
|
||||||
}
|
}
|
||||||
if (n) /* still there! */
|
if (n) /* still there! */
|
||||||
goto err_l;
|
goto err_l;
|
||||||
name = newname;
|
name = newname;
|
||||||
|
|
||||||
err = ENOMEM;
|
err = ENOMEM;
|
||||||
n = malloc(sizeof(fs_node));
|
n = malloc(sizeof(fs_node));
|
||||||
if (!n)
|
if (!n)
|
||||||
@@ -952,7 +952,7 @@ static int googlefs_mkdir_gen(fs_volume *_volume, fs_vnode *_dir, const char *na
|
|||||||
if (node)
|
if (node)
|
||||||
*node = n;
|
*node = n;
|
||||||
goto done;
|
goto done;
|
||||||
|
|
||||||
err_insnl:
|
err_insnl:
|
||||||
SLL_REMOVE(ns->nodes, nlnext, n);
|
SLL_REMOVE(ns->nodes, nlnext, n);
|
||||||
err_lns:
|
err_lns:
|
||||||
@@ -1066,7 +1066,7 @@ int googlefs_read_attrdir(fs_volume *_volume, fs_vnode *_node, fs_attr_dir_cooki
|
|||||||
for (i = 0; !ae && i < 10 && node->attrs[i].name; i++)
|
for (i = 0; !ae && i < 10 && node->attrs[i].name; i++)
|
||||||
if (i + count_indirect == cookie->dir_current)
|
if (i + count_indirect == cookie->dir_current)
|
||||||
ae = &node->attrs[i];
|
ae = &node->attrs[i];
|
||||||
|
|
||||||
if (ae) {
|
if (ae) {
|
||||||
TRACE((PFS "read_attrdir: giving %s\n", ae->name));
|
TRACE((PFS "read_attrdir: giving %s\n", ae->name));
|
||||||
buf->d_dev = ns->nsid;
|
buf->d_dev = ns->nsid;
|
||||||
@@ -1079,12 +1079,12 @@ int googlefs_read_attrdir(fs_volume *_volume, fs_vnode *_node, fs_attr_dir_cooki
|
|||||||
*num = 1;
|
*num = 1;
|
||||||
} else
|
} else
|
||||||
*num = 0;
|
*num = 0;
|
||||||
|
|
||||||
UNLOCK(&node->l);
|
UNLOCK(&node->l);
|
||||||
return B_OK;
|
return B_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Haiku and BeOs differ in the way the handle attributes at the vfs layer.
|
/* Haiku and BeOs differ in the way the handle attributes at the vfs layer.
|
||||||
BeOS uses atomic calls on the vnode,
|
BeOS uses atomic calls on the vnode,
|
||||||
Haiku retains the open/close/read/write semantics for attributes (loosing atomicity).
|
Haiku retains the open/close/read/write semantics for attributes (loosing atomicity).
|
||||||
Here we don't care much though, open is used for both to factorize attribute lookup. <- TODO
|
Here we don't care much though, open is used for both to factorize attribute lookup. <- TODO
|
||||||
@@ -1135,7 +1135,7 @@ int googlefs_open_attr_h(fs_volume *_volume, fs_vnode *_node, const char *name,
|
|||||||
err = SLL_INSERT(node->opened, next, fc);
|
err = SLL_INSERT(node->opened, next, fc);
|
||||||
if (err)
|
if (err)
|
||||||
goto err_linsert;
|
goto err_linsert;
|
||||||
|
|
||||||
*cookie = fc;
|
*cookie = fc;
|
||||||
err = B_OK;
|
err = B_OK;
|
||||||
goto all_ok;
|
goto all_ok;
|
||||||
@@ -1165,7 +1165,7 @@ int googlefs_close_attr_h(fs_volume *_volume, fs_vnode *_node, fs_file_cookie *c
|
|||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
SLL_REMOVE(node->opened, next, cookie);
|
SLL_REMOVE(node->opened, next, cookie);
|
||||||
|
|
||||||
all_ok:
|
all_ok:
|
||||||
err_n_l:
|
err_n_l:
|
||||||
UNLOCK(&node->l);
|
UNLOCK(&node->l);
|
||||||
@@ -1218,7 +1218,7 @@ int googlefs_read_attr(fs_volume *_volume, fs_vnode *_node, fs_file_cookie *cook
|
|||||||
return EINVAL;
|
return EINVAL;
|
||||||
|
|
||||||
err = LOCK(&node->l);
|
err = LOCK(&node->l);
|
||||||
|
|
||||||
if (ae && pos < ae->size) {
|
if (ae && pos < ae->size) {
|
||||||
memcpy(buf, (char *)ae->value + pos, MIN(*len, ae->size-pos));
|
memcpy(buf, (char *)ae->value + pos, MIN(*len, ae->size-pos));
|
||||||
*len = MIN(*len, ae->size-pos);
|
*len = MIN(*len, ae->size-pos);
|
||||||
@@ -1227,7 +1227,7 @@ int googlefs_read_attr(fs_volume *_volume, fs_vnode *_node, fs_file_cookie *cook
|
|||||||
*len = 0;
|
*len = 0;
|
||||||
err = ENOENT;
|
err = ENOENT;
|
||||||
}
|
}
|
||||||
|
|
||||||
UNLOCK(&node->l);
|
UNLOCK(&node->l);
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
@@ -1270,7 +1270,7 @@ int googlefs_open_query(fs_volume *_volume, const char *query, ulong flags,
|
|||||||
return EINVAL;
|
return EINVAL;
|
||||||
|
|
||||||
// filter out queries that aren't for us, we don't want to trigger google searches when apps check for mails, ... :)
|
// filter out queries that aren't for us, we don't want to trigger google searches when apps check for mails, ... :)
|
||||||
|
|
||||||
err = B_NO_MEMORY;
|
err = B_NO_MEMORY;
|
||||||
c = malloc(sizeof(fs_query_cookie));
|
c = malloc(sizeof(fs_query_cookie));
|
||||||
if (!c)
|
if (!c)
|
||||||
@@ -1300,7 +1300,7 @@ int googlefs_open_query(fs_volume *_volume, const char *query, ulong flags,
|
|||||||
goto err_qs;
|
goto err_qs;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!accepted) {
|
if (!accepted) {
|
||||||
free(qstring);
|
free(qstring);
|
||||||
/* return an empty cookie */
|
/* return an empty cookie */
|
||||||
@@ -1310,7 +1310,7 @@ int googlefs_open_query(fs_volume *_volume, const char *query, ulong flags,
|
|||||||
TRACE((PFS"open_query: QUERY: '%s'\n", qstring));
|
TRACE((PFS"open_query: QUERY: '%s'\n", qstring));
|
||||||
/* reuse query if it's not too old */
|
/* reuse query if it's not too old */
|
||||||
LOCK(&ns->l);
|
LOCK(&ns->l);
|
||||||
qn = SLL_FIND(ns->queries, qnext,
|
qn = SLL_FIND(ns->queries, qnext,
|
||||||
(sll_compare_func)compare_fs_node_by_recent_query_string, (void *)qstring);
|
(sll_compare_func)compare_fs_node_by_recent_query_string, (void *)qstring);
|
||||||
UNLOCK(&ns->l);
|
UNLOCK(&ns->l);
|
||||||
reused = (qn != NULL);
|
reused = (qn != NULL);
|
||||||
@@ -1349,14 +1349,14 @@ int googlefs_open_query(fs_volume *_volume, const char *query, ulong flags,
|
|||||||
err = google_request_open(qstring, _volume, qn, &qn->request);
|
err = google_request_open(qstring, _volume, qn, &qn->request);
|
||||||
if (err)
|
if (err)
|
||||||
goto err_gn;
|
goto err_gn;
|
||||||
|
|
||||||
TRACE((PFS"open_query: request_open done\n"));
|
TRACE((PFS"open_query: request_open done\n"));
|
||||||
#ifndef NO_SEARCH
|
#ifndef NO_SEARCH
|
||||||
err = google_request_process(qn->request);
|
err = google_request_process(qn->request);
|
||||||
if (err)
|
if (err)
|
||||||
goto err_gro;
|
goto err_gro;
|
||||||
TRACE((PFS"open_query: request_process done\n"));
|
TRACE((PFS"open_query: request_process done\n"));
|
||||||
|
|
||||||
#else
|
#else
|
||||||
/* fake entries */
|
/* fake entries */
|
||||||
for (i = 0; i < 10; i++) {
|
for (i = 0; i < 10; i++) {
|
||||||
@@ -1367,11 +1367,11 @@ int googlefs_open_query(fs_volume *_volume, const char *query, ulong flags,
|
|||||||
n->attrs[0].value = &n->attrs[1].value;
|
n->attrs[0].value = &n->attrs[1].value;
|
||||||
n->attrs[0].size = sizeof(int32);
|
n->attrs[0].size = sizeof(int32);
|
||||||
n->attrs[0].name = "GOOGLE:order";
|
n->attrs[0].name = "GOOGLE:order";
|
||||||
notify_attribute_changed(ns->nsid, n->vnid, n->attrs[0].name, B_ATTR_CHANGED);
|
notify_attribute_changed(ns->nsid, -1, n->vnid, n->attrs[0].name, B_ATTR_CHANGED);
|
||||||
if (err)
|
if (err)
|
||||||
goto err_gn;
|
goto err_gn;
|
||||||
}
|
}
|
||||||
#endif /*NO_SEARCH*/
|
#endif /*NO_SEARCH*/
|
||||||
//
|
//
|
||||||
//err = google_request_close(q->request);
|
//err = google_request_close(q->request);
|
||||||
|
|
||||||
@@ -1509,7 +1509,7 @@ int googlefs_push_result_to_query(struct google_request *request, struct google_
|
|||||||
return EINVAL;
|
return EINVAL;
|
||||||
|
|
||||||
// filter out queries that aren't for us, we don't want to trigger google searches when apps check for mails, ... :)
|
// filter out queries that aren't for us, we don't want to trigger google searches when apps check for mails, ... :)
|
||||||
|
|
||||||
/* stripped name for folder */
|
/* stripped name for folder */
|
||||||
strncpy(ename, result->name, GOOGLEFS_NAME_LEN);
|
strncpy(ename, result->name, GOOGLEFS_NAME_LEN);
|
||||||
ename[GOOGLEFS_NAME_LEN-1] = '\0';
|
ename[GOOGLEFS_NAME_LEN-1] = '\0';
|
||||||
@@ -1517,7 +1517,7 @@ int googlefs_push_result_to_query(struct google_request *request, struct google_
|
|||||||
p = ename;
|
p = ename;
|
||||||
while ((p = strchr(p, '/')))
|
while ((p = strchr(p, '/')))
|
||||||
*p++ = '_';
|
*p++ = '_';
|
||||||
|
|
||||||
err = googlefs_create_gen(_volume, qn, ename, 0, 0644, NULL, &n, bookmark_attrs, false, true);
|
err = googlefs_create_gen(_volume, qn, ename, 0, 0644, NULL, &n, bookmark_attrs, false, true);
|
||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
@@ -1528,32 +1528,32 @@ int googlefs_push_result_to_query(struct google_request *request, struct google_
|
|||||||
n->attrs[i].value = result->name;
|
n->attrs[i].value = result->name;
|
||||||
n->attrs[i].size = strlen(result->name)+1;
|
n->attrs[i].size = strlen(result->name)+1;
|
||||||
n->attrs[i].name = "META:title";
|
n->attrs[i].name = "META:title";
|
||||||
notify_attribute_changed(ns->nsid, n->vnid, n->attrs[i].name, B_ATTR_CREATED);
|
notify_attribute_changed(ns->nsid, -1, n->vnid, n->attrs[i].name, B_ATTR_CREATED);
|
||||||
i++;
|
i++;
|
||||||
n->attrs[i].type = 'CSTR';
|
n->attrs[i].type = 'CSTR';
|
||||||
n->attrs[i].value = result->url;
|
n->attrs[i].value = result->url;
|
||||||
n->attrs[i].size = strlen(result->url)+1;
|
n->attrs[i].size = strlen(result->url)+1;
|
||||||
n->attrs[i].name = "META:url";
|
n->attrs[i].name = "META:url";
|
||||||
notify_attribute_changed(ns->nsid, n->vnid, n->attrs[i].name, B_ATTR_CREATED);
|
notify_attribute_changed(ns->nsid, -1, n->vnid, n->attrs[i].name, B_ATTR_CREATED);
|
||||||
i++;
|
i++;
|
||||||
n->attrs[i].type = 'CSTR';
|
n->attrs[i].type = 'CSTR';
|
||||||
n->attrs[i].value = request->query_string;
|
n->attrs[i].value = request->query_string;
|
||||||
n->attrs[i].size = strlen(request->query_string)+1;
|
n->attrs[i].size = strlen(request->query_string)+1;
|
||||||
n->attrs[i].name = "META:keyw";
|
n->attrs[i].name = "META:keyw";
|
||||||
notify_attribute_changed(ns->nsid, n->vnid, n->attrs[i].name, B_ATTR_CREATED);
|
notify_attribute_changed(ns->nsid, -1, n->vnid, n->attrs[i].name, B_ATTR_CREATED);
|
||||||
i++;
|
i++;
|
||||||
n->attrs[i].type = 'LONG';
|
n->attrs[i].type = 'LONG';
|
||||||
n->attrs[i].value = &result->id;
|
n->attrs[i].value = &result->id;
|
||||||
n->attrs[i].size = sizeof(int32);
|
n->attrs[i].size = sizeof(int32);
|
||||||
n->attrs[i].name = "GOOGLE:order";
|
n->attrs[i].name = "GOOGLE:order";
|
||||||
notify_attribute_changed(ns->nsid, n->vnid, n->attrs[i].name, B_ATTR_CREATED);
|
notify_attribute_changed(ns->nsid, -1, n->vnid, n->attrs[i].name, B_ATTR_CREATED);
|
||||||
i++;
|
i++;
|
||||||
if (result->snipset[0]) {
|
if (result->snipset[0]) {
|
||||||
n->attrs[i].type = 'CSTR';
|
n->attrs[i].type = 'CSTR';
|
||||||
n->attrs[i].value = result->snipset;
|
n->attrs[i].value = result->snipset;
|
||||||
n->attrs[i].size = strlen(result->snipset)+1;
|
n->attrs[i].size = strlen(result->snipset)+1;
|
||||||
n->attrs[i].name = "GOOGLE:excerpt";
|
n->attrs[i].name = "GOOGLE:excerpt";
|
||||||
notify_attribute_changed(ns->nsid, n->vnid, n->attrs[i].name, B_ATTR_CREATED);
|
notify_attribute_changed(ns->nsid, -1, n->vnid, n->attrs[i].name, B_ATTR_CREATED);
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
if (result->cache_url[0]) {
|
if (result->cache_url[0]) {
|
||||||
@@ -1561,7 +1561,7 @@ int googlefs_push_result_to_query(struct google_request *request, struct google_
|
|||||||
n->attrs[i].value = result->cache_url;
|
n->attrs[i].value = result->cache_url;
|
||||||
n->attrs[i].size = strlen(result->cache_url)+1;
|
n->attrs[i].size = strlen(result->cache_url)+1;
|
||||||
n->attrs[i].name = "GOOGLE:cache_url";
|
n->attrs[i].name = "GOOGLE:cache_url";
|
||||||
notify_attribute_changed(ns->nsid, n->vnid, n->attrs[i].name, B_ATTR_CREATED);
|
notify_attribute_changed(ns->nsid, -1, n->vnid, n->attrs[i].name, B_ATTR_CREATED);
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
if (result->similar_url[0]) {
|
if (result->similar_url[0]) {
|
||||||
@@ -1569,7 +1569,7 @@ int googlefs_push_result_to_query(struct google_request *request, struct google_
|
|||||||
n->attrs[i].value = result->similar_url;
|
n->attrs[i].value = result->similar_url;
|
||||||
n->attrs[i].size = strlen(result->similar_url)+1;
|
n->attrs[i].size = strlen(result->similar_url)+1;
|
||||||
n->attrs[i].name = "GOOGLE:similar_url";
|
n->attrs[i].name = "GOOGLE:similar_url";
|
||||||
notify_attribute_changed(ns->nsid, n->vnid, n->attrs[i].name, B_ATTR_CREATED);
|
notify_attribute_changed(ns->nsid, -1, n->vnid, n->attrs[i].name, B_ATTR_CREATED);
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
UNLOCK(&n->l);
|
UNLOCK(&n->l);
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2009-2010, Haiku Inc. All rights reserved.
|
* Copyright 2009-2016, Haiku Inc. All rights reserved.
|
||||||
* Distributed under the terms of the MIT License.
|
* Distributed under the terms of the MIT License.
|
||||||
*
|
*
|
||||||
* Authors:
|
* Authors:
|
||||||
@@ -853,7 +853,7 @@ AttributeFile::RemoveAttribute(const char *name, AttributeEntry **_entry)
|
|||||||
else
|
else
|
||||||
delete entry;
|
delete entry;
|
||||||
|
|
||||||
notify_attribute_changed(fVolumeID, fFileInode, name, B_ATTR_REMOVED);
|
notify_attribute_changed(fVolumeID, -1, fFileInode, name, B_ATTR_REMOVED);
|
||||||
return B_OK;
|
return B_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -876,7 +876,7 @@ AttributeFile::AddAttribute(AttributeEntry *entry)
|
|||||||
fEntries = newEntries;
|
fEntries = newEntries;
|
||||||
fEntries[fFile->entry_count++] = entry;
|
fEntries[fFile->entry_count++] = entry;
|
||||||
|
|
||||||
notify_attribute_changed(fVolumeID, fFileInode, entry->Name(),
|
notify_attribute_changed(fVolumeID, -1, fFileInode, entry->Name(),
|
||||||
B_ATTR_CREATED);
|
B_ATTR_CREATED);
|
||||||
|
|
||||||
return B_OK;
|
return B_OK;
|
||||||
@@ -1068,7 +1068,7 @@ AttributeEntry::Write(off_t position, const void *buffer, size_t *length)
|
|||||||
}
|
}
|
||||||
|
|
||||||
memcpy(fData + position, buffer, *length);
|
memcpy(fData + position, buffer, *length);
|
||||||
notify_attribute_changed(fParent->VolumeID(), fParent->FileInode(),
|
notify_attribute_changed(fParent->VolumeID(), -1, fParent->FileInode(),
|
||||||
fEntry->name, B_ATTR_CHANGED);
|
fEntry->name, B_ATTR_CHANGED);
|
||||||
return B_OK;
|
return B_OK;
|
||||||
}
|
}
|
||||||
@@ -1752,6 +1752,7 @@ overlay_read_fs_info(fs_volume *volume, struct fs_info *info)
|
|||||||
if (result != B_OK)
|
if (result != B_OK)
|
||||||
return result;
|
return result;
|
||||||
|
|
||||||
|
info->flags &= B_FS_SUPPORTS_MONITOR_CHILDREN;
|
||||||
info->flags |= B_FS_HAS_MIME | B_FS_HAS_ATTR /*| B_FS_HAS_QUERY*/;
|
info->flags |= B_FS_HAS_MIME | B_FS_HAS_ATTR /*| B_FS_HAS_QUERY*/;
|
||||||
return B_OK;
|
return B_OK;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2009, Haiku Inc. All rights reserved.
|
* Copyright 2009-2016, Haiku Inc. All rights reserved.
|
||||||
* Distributed under the terms of the MIT License.
|
* Distributed under the terms of the MIT License.
|
||||||
*
|
*
|
||||||
* Authors:
|
* Authors:
|
||||||
@@ -74,8 +74,8 @@ struct overlay_dirent {
|
|||||||
|
|
||||||
void dispose_attribute(fs_volume *volume, ino_t fileInode)
|
void dispose_attribute(fs_volume *volume, ino_t fileInode)
|
||||||
{
|
{
|
||||||
notify_attribute_changed(volume->id, fileInode, name,
|
notify_attribute_changed(volume->id, -1, fileInode,
|
||||||
B_ATTR_REMOVED);
|
name, B_ATTR_REMOVED);
|
||||||
free(name);
|
free(name);
|
||||||
free(this);
|
free(this);
|
||||||
}
|
}
|
||||||
@@ -547,7 +547,7 @@ OverlayInode::WriteStat(const struct stat *stat, uint32 statMask)
|
|||||||
if (!fIsModified)
|
if (!fIsModified)
|
||||||
SetModified();
|
SetModified();
|
||||||
|
|
||||||
notify_stat_changed(SuperVolume()->id, fInodeNumber, statMask);
|
notify_stat_changed(SuperVolume()->id, -1, fInodeNumber, statMask);
|
||||||
return B_OK;
|
return B_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -843,10 +843,10 @@ OverlayInode::Write(void *_cookie, off_t position, const void *buffer,
|
|||||||
|
|
||||||
fStat.st_mtime = time(NULL);
|
fStat.st_mtime = time(NULL);
|
||||||
if (fIsAttribute) {
|
if (fIsAttribute) {
|
||||||
notify_attribute_changed(SuperVolume()->id, fInodeNumber,
|
notify_attribute_changed(SuperVolume()->id, -1,
|
||||||
fName, B_ATTR_CHANGED);
|
fInodeNumber, fName, B_ATTR_CHANGED);
|
||||||
} else {
|
} else {
|
||||||
notify_stat_changed(SuperVolume()->id, fInodeNumber,
|
notify_stat_changed(SuperVolume()->id, -1, fInodeNumber,
|
||||||
B_STAT_MODIFICATION_TIME);
|
B_STAT_MODIFICATION_TIME);
|
||||||
}
|
}
|
||||||
return B_OK;
|
return B_OK;
|
||||||
@@ -903,10 +903,10 @@ OverlayInode::Write(void *_cookie, off_t position, const void *buffer,
|
|||||||
fStat.st_mtime = time(NULL);
|
fStat.st_mtime = time(NULL);
|
||||||
|
|
||||||
if (fIsAttribute) {
|
if (fIsAttribute) {
|
||||||
notify_attribute_changed(SuperVolume()->id, fInodeNumber, fName,
|
notify_attribute_changed(SuperVolume()->id, -1, fInodeNumber, fName,
|
||||||
B_ATTR_CHANGED);
|
B_ATTR_CHANGED);
|
||||||
} else {
|
} else {
|
||||||
notify_stat_changed(SuperVolume()->id, fInodeNumber,
|
notify_stat_changed(SuperVolume()->id, -1, fInodeNumber,
|
||||||
B_STAT_MODIFICATION_TIME | (sizeChanged ? B_STAT_SIZE : 0));
|
B_STAT_MODIFICATION_TIME | (sizeChanged ? B_STAT_SIZE : 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1219,7 +1219,7 @@ OverlayInode::_PopulateStat()
|
|||||||
{
|
{
|
||||||
if (fHasStat)
|
if (fHasStat)
|
||||||
return B_OK;
|
return B_OK;
|
||||||
|
|
||||||
fHasStat = true;
|
fHasStat = true;
|
||||||
if (fIsAttribute) {
|
if (fIsAttribute) {
|
||||||
if (fName == NULL || fSuperVnode.ops->open_attr == NULL
|
if (fName == NULL || fSuperVnode.ops->open_attr == NULL
|
||||||
@@ -1503,8 +1503,8 @@ OverlayInode::_CreateCommon(const char *name, int type, int perms,
|
|||||||
*_node = node;
|
*_node = node;
|
||||||
|
|
||||||
if (attribute) {
|
if (attribute) {
|
||||||
notify_attribute_changed(SuperVolume()->id, fInodeNumber, entry->name,
|
notify_attribute_changed(SuperVolume()->id, -1, fInodeNumber,
|
||||||
B_ATTR_CREATED);
|
entry->name, B_ATTR_CREATED);
|
||||||
} else {
|
} else {
|
||||||
notify_entry_created(SuperVolume()->id, fInodeNumber, entry->name,
|
notify_entry_created(SuperVolume()->id, fInodeNumber, entry->name,
|
||||||
entry->inode_number);
|
entry->inode_number);
|
||||||
@@ -2164,9 +2164,9 @@ overlay_rename_attr(fs_volume *volume, fs_vnode *vnode,
|
|||||||
node->SetSuperVnode(toNode->SuperVnode());
|
node->SetSuperVnode(toNode->SuperVnode());
|
||||||
node->SetInodeNumber(toNode->InodeNumber());
|
node->SetInodeNumber(toNode->InodeNumber());
|
||||||
|
|
||||||
notify_attribute_changed(volume->id, fromNode->InodeNumber(), fromName,
|
notify_attribute_changed(volume->id, -1, fromNode->InodeNumber(), fromName,
|
||||||
B_ATTR_REMOVED);
|
B_ATTR_REMOVED);
|
||||||
notify_attribute_changed(volume->id, toNode->InodeNumber(), toName,
|
notify_attribute_changed(volume->id, -1, toNode->InodeNumber(), toName,
|
||||||
B_ATTR_CREATED);
|
B_ATTR_CREATED);
|
||||||
|
|
||||||
free(oldName);
|
free(oldName);
|
||||||
@@ -2183,7 +2183,7 @@ overlay_remove_attr(fs_volume *volume, fs_vnode *vnode, const char *name)
|
|||||||
if (result != B_OK)
|
if (result != B_OK)
|
||||||
return result;
|
return result;
|
||||||
|
|
||||||
notify_attribute_changed(volume->id, node->InodeNumber(), name,
|
notify_attribute_changed(volume->id, -1, node->InodeNumber(), name,
|
||||||
B_ATTR_REMOVED);
|
B_ATTR_REMOVED);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1694,7 +1694,7 @@ fs_wstat(fs_volume *_volume, fs_vnode *_node, const struct stat *st, uint32 mask
|
|||||||
XDRInPacketDestroy(&reply);
|
XDRInPacketDestroy(&reply);
|
||||||
XDROutPacketDestroy(&call);
|
XDROutPacketDestroy(&call);
|
||||||
|
|
||||||
return notify_stat_changed(_volume->id, node->vnid, mask);
|
return notify_stat_changed(_volume->id, -1, node->vnid, mask);
|
||||||
}
|
}
|
||||||
|
|
||||||
static status_t
|
static status_t
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2012 Haiku, Inc. All rights reserved.
|
* Copyright 2012-2016 Haiku, Inc. All rights reserved.
|
||||||
* Distributed under the terms of the MIT License.
|
* Distributed under the terms of the MIT License.
|
||||||
*
|
*
|
||||||
* Authors:
|
* Authors:
|
||||||
@@ -304,7 +304,7 @@ DirectoryCache::NotifyChanges(DirectoryCacheSnapshot* oldSnapshot,
|
|||||||
if (!found) {
|
if (!found) {
|
||||||
if (fAttrDir) {
|
if (fAttrDir) {
|
||||||
notify_attribute_changed(fInode->GetFileSystem()->DevId(),
|
notify_attribute_changed(fInode->GetFileSystem()->DevId(),
|
||||||
fInode->ID(), newCurrent->fName, B_ATTR_CREATED);
|
-1, fInode->ID(), newCurrent->fName, B_ATTR_CREATED);
|
||||||
} else {
|
} else {
|
||||||
notify_entry_created(fInode->GetFileSystem()->DevId(),
|
notify_entry_created(fInode->GetFileSystem()->DevId(),
|
||||||
fInode->ID(), newCurrent->fName, newCurrent->fNode);
|
fInode->ID(), newCurrent->fName, newCurrent->fNode);
|
||||||
@@ -321,7 +321,7 @@ DirectoryCache::NotifyChanges(DirectoryCacheSnapshot* oldSnapshot,
|
|||||||
while (oldCurrent != NULL) {
|
while (oldCurrent != NULL) {
|
||||||
if (fAttrDir) {
|
if (fAttrDir) {
|
||||||
notify_attribute_changed(fInode->GetFileSystem()->DevId(),
|
notify_attribute_changed(fInode->GetFileSystem()->DevId(),
|
||||||
fInode->ID(), oldCurrent->fName, B_ATTR_REMOVED);
|
-1, fInode->ID(), oldCurrent->fName, B_ATTR_REMOVED);
|
||||||
} else {
|
} else {
|
||||||
notify_entry_removed(fInode->GetFileSystem()->DevId(), fInode->ID(),
|
notify_entry_removed(fInode->GetFileSystem()->DevId(), fInode->ID(),
|
||||||
oldCurrent->fName, oldCurrent->fNode);
|
oldCurrent->fName, oldCurrent->fNode);
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2012 Haiku, Inc. All rights reserved.
|
* Copyright 2012-2016 Haiku, Inc. All rights reserved.
|
||||||
* Distributed under the terms of the MIT License.
|
* Distributed under the terms of the MIT License.
|
||||||
*
|
*
|
||||||
* Authors:
|
* Authors:
|
||||||
@@ -293,7 +293,7 @@ Inode::Remove(const char* name, FileType type, ino_t* id)
|
|||||||
*id = FileIdToInoT(fileID);
|
*id = FileIdToInoT(fileID);
|
||||||
|
|
||||||
if (type == NF4NAMEDATTR) {
|
if (type == NF4NAMEDATTR) {
|
||||||
notify_attribute_changed(fFileSystem->DevId(), ID(), name,
|
notify_attribute_changed(fFileSystem->DevId(), -1, ID(), name,
|
||||||
B_ATTR_REMOVED);
|
B_ATTR_REMOVED);
|
||||||
} else {
|
} else {
|
||||||
notify_entry_removed(fFileSystem->DevId(), ID(), name,
|
notify_entry_removed(fFileSystem->DevId(), ID(), name,
|
||||||
@@ -382,9 +382,9 @@ Inode::Rename(Inode* from, Inode* to, const char* fromName, const char* toName,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (attribute) {
|
if (attribute) {
|
||||||
notify_attribute_changed(from->fFileSystem->DevId(), from->ID(),
|
notify_attribute_changed(from->fFileSystem->DevId(), -1, from->ID(),
|
||||||
fromName, B_ATTR_REMOVED);
|
fromName, B_ATTR_REMOVED);
|
||||||
notify_attribute_changed(to->fFileSystem->DevId(), to->ID(), toName,
|
notify_attribute_changed(to->fFileSystem->DevId(), -1, to->ID(), toName,
|
||||||
B_ATTR_CREATED);
|
B_ATTR_CREATED);
|
||||||
} else {
|
} else {
|
||||||
notify_entry_moved(from->fFileSystem->DevId(), from->ID(), fromName,
|
notify_entry_moved(from->fFileSystem->DevId(), from->ID(), fromName,
|
||||||
@@ -898,7 +898,7 @@ Inode::SetDelegation(Delegation* delegation)
|
|||||||
fMetaCache.InvalidateStat();
|
fMetaCache.InvalidateStat();
|
||||||
struct stat st;
|
struct stat st;
|
||||||
Stat(&st);
|
Stat(&st);
|
||||||
fMetaCache.LockValid();
|
fMetaCache.LockValid();
|
||||||
|
|
||||||
fDelegation = delegation;
|
fDelegation = delegation;
|
||||||
fOpenState->AcquireReference();
|
fOpenState->AcquireReference();
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2012 Haiku, Inc. All rights reserved.
|
* Copyright 2012-2016 Haiku, Inc. All rights reserved.
|
||||||
* Distributed under the terms of the MIT License.
|
* Distributed under the terms of the MIT License.
|
||||||
*
|
*
|
||||||
* Authors:
|
* Authors:
|
||||||
@@ -79,7 +79,7 @@ MetadataCache::GrowFile(size_t newSize)
|
|||||||
fStatCache.st_size = max_c((off_t)newSize, fStatCache.st_size);
|
fStatCache.st_size = max_c((off_t)newSize, fStatCache.st_size);
|
||||||
|
|
||||||
if (oldSize != fStatCache.st_size) {
|
if (oldSize != fStatCache.st_size) {
|
||||||
notify_stat_changed(fInode->GetFileSystem()->DevId(), fInode->ID(),
|
notify_stat_changed(fInode->GetFileSystem()->DevId(), -1, fInode->ID(),
|
||||||
B_STAT_SIZE);
|
B_STAT_SIZE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -181,6 +181,7 @@ MetadataCache::NotifyChanges(const struct stat* oldStat,
|
|||||||
sizeof(struct timespec) == 0))
|
sizeof(struct timespec) == 0))
|
||||||
flags |= B_STAT_MODIFICATION_TIME;
|
flags |= B_STAT_MODIFICATION_TIME;
|
||||||
|
|
||||||
notify_stat_changed(fInode->GetFileSystem()->DevId(), fInode->ID(), flags);
|
notify_stat_changed(fInode->GetFileSystem()->DevId(), -1, fInode->ID(),
|
||||||
|
flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -63,18 +63,18 @@ fs_open_attrib_dir(fs_volume *_vol, fs_vnode *_node, void **_cookie)
|
|||||||
ni = NULL;
|
ni = NULL;
|
||||||
ctx = NULL;
|
ctx = NULL;
|
||||||
*_cookie = cookie;
|
*_cookie = cookie;
|
||||||
|
|
||||||
exit:
|
exit:
|
||||||
|
|
||||||
if (ctx != NULL)
|
if (ctx != NULL)
|
||||||
ntfs_attr_put_search_ctx(ctx);
|
ntfs_attr_put_search_ctx(ctx);
|
||||||
if (ni != NULL)
|
if (ni != NULL)
|
||||||
ntfs_inode_close(ni);
|
ntfs_inode_close(ni);
|
||||||
|
|
||||||
TRACE("%s - EXIT, result is %s\n", __FUNCTION__, strerror(result));
|
TRACE("%s - EXIT, result is %s\n", __FUNCTION__, strerror(result));
|
||||||
|
|
||||||
UNLOCK_VOL(ns);
|
UNLOCK_VOL(ns);
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -130,7 +130,7 @@ fs_rewind_attrib_dir(fs_volume *_vol, fs_vnode *_node, void *_cookie)
|
|||||||
TRACE("%s - EXIT, result is %s\n", __FUNCTION__, strerror(result));
|
TRACE("%s - EXIT, result is %s\n", __FUNCTION__, strerror(result));
|
||||||
|
|
||||||
UNLOCK_VOL(ns);
|
UNLOCK_VOL(ns);
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -160,18 +160,18 @@ fs_read_attrib_dir(fs_volume *_vol, fs_vnode *_node, void *_cookie,
|
|||||||
// it's the actual file body
|
// it's the actual file body
|
||||||
if (attr->name_length == 0)
|
if (attr->name_length == 0)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
name = ntfs_attr_name_get((const ntfschar *)(((char *)attr)
|
name = ntfs_attr_name_get((const ntfschar *)(((char *)attr)
|
||||||
+ attr->name_offset), attr->name_length);
|
+ attr->name_offset), attr->name_length);
|
||||||
|
|
||||||
if(strncmp(name, kHaikuAttrPrefix, strlen(kHaikuAttrPrefix)) !=0 ) {
|
if(strncmp(name, kHaikuAttrPrefix, strlen(kHaikuAttrPrefix)) !=0 ) {
|
||||||
TRACE("found AT_DATA '%s' - Skip\n", name);
|
TRACE("found AT_DATA '%s' - Skip\n", name);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
TRACE("found AT_DATA '%s' - Found\n", name);
|
TRACE("found AT_DATA '%s' - Found\n", name);
|
||||||
|
|
||||||
real_name = name + strlen(kHaikuAttrPrefix);
|
real_name = name + strlen(kHaikuAttrPrefix);
|
||||||
|
|
||||||
bufsize = MIN(bufsize, sizeof(struct dirent) + strlen(real_name) + 1);
|
bufsize = MIN(bufsize, sizeof(struct dirent) + strlen(real_name) + 1);
|
||||||
entry->d_ino = node->vnid;
|
entry->d_ino = node->vnid;
|
||||||
entry->d_dev = ns->id;
|
entry->d_dev = ns->id;
|
||||||
@@ -197,7 +197,7 @@ exit:
|
|||||||
strerror(result), *num);
|
strerror(result), *num);
|
||||||
|
|
||||||
UNLOCK_VOL(ns);
|
UNLOCK_VOL(ns);
|
||||||
|
|
||||||
if (result)
|
if (result)
|
||||||
*num = 0;
|
*num = 0;
|
||||||
else
|
else
|
||||||
@@ -218,9 +218,9 @@ fs_create_attrib(fs_volume *_vol, fs_vnode *_node, const char* name,
|
|||||||
int ulen;
|
int ulen;
|
||||||
ntfs_inode *ni = NULL;
|
ntfs_inode *ni = NULL;
|
||||||
ntfs_attr *na = NULL;
|
ntfs_attr *na = NULL;
|
||||||
status_t result = B_NO_ERROR;
|
status_t result = B_NO_ERROR;
|
||||||
|
|
||||||
if (ns->flags & B_FS_IS_READONLY) {
|
if (ns->flags & B_FS_IS_READONLY) {
|
||||||
return B_READ_ONLY_DEVICE;
|
return B_READ_ONLY_DEVICE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -250,7 +250,7 @@ fs_create_attrib(fs_volume *_vol, fs_vnode *_node, const char* name,
|
|||||||
char ntfs_attr_name[MAX_PATH] = {0};
|
char ntfs_attr_name[MAX_PATH] = {0};
|
||||||
strcat(ntfs_attr_name, kHaikuAttrPrefix);
|
strcat(ntfs_attr_name, kHaikuAttrPrefix);
|
||||||
strcat(ntfs_attr_name,name);
|
strcat(ntfs_attr_name,name);
|
||||||
|
|
||||||
uname = ntfs_calloc(MAX_PATH);
|
uname = ntfs_calloc(MAX_PATH);
|
||||||
ulen = ntfs_mbstoucs(ntfs_attr_name, &uname);
|
ulen = ntfs_mbstoucs(ntfs_attr_name, &uname);
|
||||||
if (ulen < 0) {
|
if (ulen < 0) {
|
||||||
@@ -261,7 +261,7 @@ fs_create_attrib(fs_volume *_vol, fs_vnode *_node, const char* name,
|
|||||||
|
|
||||||
na = ntfs_attr_open(ni, AT_DATA, uname, ulen);
|
na = ntfs_attr_open(ni, AT_DATA, uname, ulen);
|
||||||
if (na != NULL) {
|
if (na != NULL) {
|
||||||
if (ntfs_attr_truncate(na, 0)) {
|
if (ntfs_attr_truncate(na, 0)) {
|
||||||
result = errno;
|
result = errno;
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
@@ -278,7 +278,7 @@ fs_create_attrib(fs_volume *_vol, fs_vnode *_node, const char* name,
|
|||||||
TRACE("%s - ntfs_attr_open: %s\n", __FUNCTION__,
|
TRACE("%s - ntfs_attr_open: %s\n", __FUNCTION__,
|
||||||
strerror(result));
|
strerror(result));
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(ntfs_attr_pwrite(na, 0, sizeof(uint32), &type) < 0 ) {
|
if(ntfs_attr_pwrite(na, 0, sizeof(uint32), &type) < 0 ) {
|
||||||
result = errno;
|
result = errno;
|
||||||
@@ -356,7 +356,7 @@ fs_open_attrib(fs_volume *_vol, fs_vnode *_node, const char *name,
|
|||||||
char ntfs_attr_name[MAX_PATH] = {0};
|
char ntfs_attr_name[MAX_PATH] = {0};
|
||||||
strcat(ntfs_attr_name, kHaikuAttrPrefix);
|
strcat(ntfs_attr_name, kHaikuAttrPrefix);
|
||||||
strcat(ntfs_attr_name, name);
|
strcat(ntfs_attr_name, name);
|
||||||
|
|
||||||
uname = ntfs_calloc(MAX_PATH);
|
uname = ntfs_calloc(MAX_PATH);
|
||||||
ulen = ntfs_mbstoucs(ntfs_attr_name, &uname);
|
ulen = ntfs_mbstoucs(ntfs_attr_name, &uname);
|
||||||
if (ulen < 0) {
|
if (ulen < 0) {
|
||||||
@@ -367,7 +367,7 @@ fs_open_attrib(fs_volume *_vol, fs_vnode *_node, const char *name,
|
|||||||
na = ntfs_attr_open(ni, AT_DATA, uname, ulen);
|
na = ntfs_attr_open(ni, AT_DATA, uname, ulen);
|
||||||
if (na != NULL) {
|
if (na != NULL) {
|
||||||
if (openMode & O_TRUNC) {
|
if (openMode & O_TRUNC) {
|
||||||
if (ns->flags & B_FS_IS_READONLY) {
|
if (ns->flags & B_FS_IS_READONLY) {
|
||||||
result = B_READ_ONLY_DEVICE;
|
result = B_READ_ONLY_DEVICE;
|
||||||
goto exit;
|
goto exit;
|
||||||
} else {
|
} else {
|
||||||
@@ -445,7 +445,7 @@ fs_free_attrib_cookie(fs_volume *_vol, fs_vnode *_node, void *_cookie)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
status_t
|
status_t
|
||||||
fs_read_attrib_stat(fs_volume *_vol, fs_vnode *_node, void *_cookie,
|
fs_read_attrib_stat(fs_volume *_vol, fs_vnode *_node, void *_cookie,
|
||||||
struct stat *stat)
|
struct stat *stat)
|
||||||
{
|
{
|
||||||
@@ -453,8 +453,8 @@ fs_read_attrib_stat(fs_volume *_vol, fs_vnode *_node, void *_cookie,
|
|||||||
vnode *node = (vnode *)_node->private_node;
|
vnode *node = (vnode *)_node->private_node;
|
||||||
attrcookie *cookie = (attrcookie *)_cookie;
|
attrcookie *cookie = (attrcookie *)_cookie;
|
||||||
ntfs_inode *ni = NULL;
|
ntfs_inode *ni = NULL;
|
||||||
ntfs_attr *na = NULL;
|
ntfs_attr *na = NULL;
|
||||||
status_t result = B_NO_ERROR;
|
status_t result = B_NO_ERROR;
|
||||||
|
|
||||||
LOCK_VOL(ns);
|
LOCK_VOL(ns);
|
||||||
|
|
||||||
@@ -466,7 +466,7 @@ fs_read_attrib_stat(fs_volume *_vol, fs_vnode *_node, void *_cookie,
|
|||||||
na = ntfs_attr_open(ni, AT_DATA, cookie->uname, cookie->uname_len);
|
na = ntfs_attr_open(ni, AT_DATA, cookie->uname, cookie->uname_len);
|
||||||
if (na == NULL) {
|
if (na == NULL) {
|
||||||
result = errno;
|
result = errno;
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
stat->st_type = cookie->type;
|
stat->st_type = cookie->type;
|
||||||
@@ -476,15 +476,15 @@ exit:
|
|||||||
if (na != NULL)
|
if (na != NULL)
|
||||||
ntfs_attr_close(na);
|
ntfs_attr_close(na);
|
||||||
if (ni != NULL)
|
if (ni != NULL)
|
||||||
ntfs_inode_close(ni);
|
ntfs_inode_close(ni);
|
||||||
|
|
||||||
UNLOCK_VOL(ns);
|
UNLOCK_VOL(ns);
|
||||||
|
|
||||||
return B_NO_ERROR;
|
return B_NO_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
status_t
|
status_t
|
||||||
fs_read_attrib(fs_volume *_vol, fs_vnode *_node, void *_cookie, off_t pos,
|
fs_read_attrib(fs_volume *_vol, fs_vnode *_node, void *_cookie, off_t pos,
|
||||||
void *buffer, size_t *len)
|
void *buffer, size_t *len)
|
||||||
{
|
{
|
||||||
@@ -505,7 +505,7 @@ fs_read_attrib(fs_volume *_vol, fs_vnode *_node, void *_cookie, off_t pos,
|
|||||||
LOCK_VOL(ns);
|
LOCK_VOL(ns);
|
||||||
|
|
||||||
TRACE("%s - ENTER vnid: %d\n", __FUNCTION__, node->vnid);
|
TRACE("%s - ENTER vnid: %d\n", __FUNCTION__, node->vnid);
|
||||||
|
|
||||||
ni = ntfs_inode_open(ns->ntvol, node->vnid);
|
ni = ntfs_inode_open(ns->ntvol, node->vnid);
|
||||||
if (ni == NULL) {
|
if (ni == NULL) {
|
||||||
result = errno;
|
result = errno;
|
||||||
@@ -514,9 +514,9 @@ fs_read_attrib(fs_volume *_vol, fs_vnode *_node, void *_cookie, off_t pos,
|
|||||||
na = ntfs_attr_open(ni, AT_DATA, cookie->uname, cookie->uname_len);
|
na = ntfs_attr_open(ni, AT_DATA, cookie->uname, cookie->uname_len);
|
||||||
if (na == NULL) {
|
if (na == NULL) {
|
||||||
result = errno;
|
result = errno;
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
pos += sizeof(uint32);
|
pos += sizeof(uint32);
|
||||||
|
|
||||||
// it is a named stream
|
// it is a named stream
|
||||||
@@ -551,11 +551,11 @@ exit:
|
|||||||
ntfs_attr_close(na);
|
ntfs_attr_close(na);
|
||||||
if (ni != NULL)
|
if (ni != NULL)
|
||||||
ntfs_inode_close(ni);
|
ntfs_inode_close(ni);
|
||||||
|
|
||||||
TRACE("%s - EXIT, result is %s\n", __FUNCTION__, strerror(result));
|
TRACE("%s - EXIT, result is %s\n", __FUNCTION__, strerror(result));
|
||||||
|
|
||||||
UNLOCK_VOL(ns);
|
UNLOCK_VOL(ns);
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -576,8 +576,8 @@ fs_write_attrib(fs_volume *_vol, fs_vnode *_node, void *_cookie, off_t pos,
|
|||||||
status_t result = B_NO_ERROR;
|
status_t result = B_NO_ERROR;
|
||||||
|
|
||||||
TRACE("%s - ENTER vnode: %d\n", __FUNCTION__, node->vnid);
|
TRACE("%s - ENTER vnode: %d\n", __FUNCTION__, node->vnid);
|
||||||
|
|
||||||
if (ns->flags & B_FS_IS_READONLY) {
|
if (ns->flags & B_FS_IS_READONLY) {
|
||||||
return B_READ_ONLY_DEVICE;
|
return B_READ_ONLY_DEVICE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -596,8 +596,8 @@ fs_write_attrib(fs_volume *_vol, fs_vnode *_node, void *_cookie, off_t pos,
|
|||||||
na = ntfs_attr_open(ni, AT_DATA, cookie->uname, cookie->uname_len);
|
na = ntfs_attr_open(ni, AT_DATA, cookie->uname, cookie->uname_len);
|
||||||
if (na == NULL) {
|
if (na == NULL) {
|
||||||
result = errno;
|
result = errno;
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
pos += sizeof(uint32);
|
pos += sizeof(uint32);
|
||||||
|
|
||||||
@@ -611,7 +611,7 @@ fs_write_attrib(fs_volume *_vol, fs_vnode *_node, void *_cookie, off_t pos,
|
|||||||
if (ntfs_attr_truncate(na, pos + size))
|
if (ntfs_attr_truncate(na, pos + size))
|
||||||
size = na->data_size - pos;
|
size = na->data_size - pos;
|
||||||
else
|
else
|
||||||
notify_stat_changed(ns->id, MREF(ni->mft_no), B_STAT_SIZE);
|
notify_stat_changed(ns->id, -1, MREF(ni->mft_no), B_STAT_SIZE);
|
||||||
}
|
}
|
||||||
|
|
||||||
while (size) {
|
while (size) {
|
||||||
@@ -636,28 +636,28 @@ fs_write_attrib(fs_volume *_vol, fs_vnode *_node, void *_cookie, off_t pos,
|
|||||||
result = EINVAL;
|
result = EINVAL;
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ntfs_ucstombs(na->name, na->name_len, &attr_name, 0) >= 0) {
|
if (ntfs_ucstombs(na->name, na->name_len, &attr_name, 0) >= 0) {
|
||||||
if (attr_name != NULL) {
|
if (attr_name != NULL) {
|
||||||
if(strncmp(attr_name, kHaikuAttrPrefix, strlen(kHaikuAttrPrefix)) !=0 )
|
if(strncmp(attr_name, kHaikuAttrPrefix, strlen(kHaikuAttrPrefix)) !=0 )
|
||||||
goto exit;
|
goto exit;
|
||||||
real_name = attr_name + strlen(kHaikuAttrPrefix);
|
real_name = attr_name + strlen(kHaikuAttrPrefix);
|
||||||
notify_attribute_changed(ns->id, MREF(ni->mft_no),
|
notify_attribute_changed(ns->id, -1, MREF(ni->mft_no),
|
||||||
real_name, B_ATTR_CHANGED);
|
real_name, B_ATTR_CHANGED);
|
||||||
free(attr_name);
|
free(attr_name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
exit:
|
exit:
|
||||||
if (na != NULL)
|
if (na != NULL)
|
||||||
ntfs_attr_close(na);
|
ntfs_attr_close(na);
|
||||||
if (ni != NULL)
|
if (ni != NULL)
|
||||||
ntfs_inode_close(ni);
|
ntfs_inode_close(ni);
|
||||||
|
|
||||||
TRACE("%s - EXIT, result is %s\n", __FUNCTION__, strerror(result));
|
TRACE("%s - EXIT, result is %s\n", __FUNCTION__, strerror(result));
|
||||||
|
|
||||||
UNLOCK_VOL(ns);
|
UNLOCK_VOL(ns);
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -670,18 +670,18 @@ fs_remove_attrib(fs_volume *_vol, fs_vnode *_node, const char* name)
|
|||||||
char ntfs_attr_name[MAX_PATH]={0};
|
char ntfs_attr_name[MAX_PATH]={0};
|
||||||
ntfschar *uname = NULL;
|
ntfschar *uname = NULL;
|
||||||
int ulen;
|
int ulen;
|
||||||
ntfs_inode *ni = NULL;
|
ntfs_inode *ni = NULL;
|
||||||
status_t result = B_NO_ERROR;
|
status_t result = B_NO_ERROR;
|
||||||
|
|
||||||
TRACE("%s - ENTER - name: [%s]\n", __FUNCTION__, name);
|
TRACE("%s - ENTER - name: [%s]\n", __FUNCTION__, name);
|
||||||
|
|
||||||
if (ns->flags & B_FS_IS_READONLY) {
|
if (ns->flags & B_FS_IS_READONLY) {
|
||||||
ERROR("ntfs is read-only\n");
|
ERROR("ntfs is read-only\n");
|
||||||
return B_READ_ONLY_DEVICE;
|
return B_READ_ONLY_DEVICE;
|
||||||
}
|
}
|
||||||
|
|
||||||
LOCK_VOL(ns);
|
LOCK_VOL(ns);
|
||||||
|
|
||||||
if (node == NULL) {
|
if (node == NULL) {
|
||||||
result = EINVAL;
|
result = EINVAL;
|
||||||
goto exit;
|
goto exit;
|
||||||
@@ -691,18 +691,18 @@ fs_remove_attrib(fs_volume *_vol, fs_vnode *_node, const char* name)
|
|||||||
if (ni == NULL) {
|
if (ni == NULL) {
|
||||||
result = errno;
|
result = errno;
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
strcat(ntfs_attr_name, kHaikuAttrPrefix);
|
strcat(ntfs_attr_name, kHaikuAttrPrefix);
|
||||||
strcat(ntfs_attr_name, name);
|
strcat(ntfs_attr_name, name);
|
||||||
|
|
||||||
uname = ntfs_calloc(MAX_PATH);
|
uname = ntfs_calloc(MAX_PATH);
|
||||||
ulen = ntfs_mbstoucs(ntfs_attr_name, &uname);
|
ulen = ntfs_mbstoucs(ntfs_attr_name, &uname);
|
||||||
if (ulen < 0) {
|
if (ulen < 0) {
|
||||||
result = EILSEQ;
|
result = EILSEQ;
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ntfs_attr_remove(ni, AT_DATA, uname, ulen)) {
|
if (ntfs_attr_remove(ni, AT_DATA, uname, ulen)) {
|
||||||
result = ENOENT;
|
result = ENOENT;
|
||||||
goto exit;
|
goto exit;
|
||||||
@@ -712,17 +712,18 @@ fs_remove_attrib(fs_volume *_vol, fs_vnode *_node, const char* name)
|
|||||||
ni->flags |= FILE_ATTR_ARCHIVE;
|
ni->flags |= FILE_ATTR_ARCHIVE;
|
||||||
NInoFileNameSetDirty(ni);
|
NInoFileNameSetDirty(ni);
|
||||||
}
|
}
|
||||||
notify_attribute_changed(ns->id, MREF(ni->mft_no), name, B_ATTR_REMOVED);
|
notify_attribute_changed(ns->id, -1, MREF(ni->mft_no), name,
|
||||||
exit:
|
B_ATTR_REMOVED);
|
||||||
|
exit:
|
||||||
if (uname != NULL)
|
if (uname != NULL)
|
||||||
free(uname);
|
free(uname);
|
||||||
|
|
||||||
if (ni != NULL)
|
if (ni != NULL)
|
||||||
ntfs_inode_close(ni);
|
ntfs_inode_close(ni);
|
||||||
|
|
||||||
TRACE("%s - EXIT, result is %s\n", __FUNCTION__, strerror(result));
|
TRACE("%s - EXIT, result is %s\n", __FUNCTION__, strerror(result));
|
||||||
|
|
||||||
UNLOCK_VOL(ns);
|
UNLOCK_VOL(ns);
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -116,7 +116,7 @@ get_node_type(ntfs_inode* ni, int* _type)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static u64
|
static u64
|
||||||
ntfs_inode_lookup(fs_volume *_vol, ino_t parent, const char *name)
|
ntfs_inode_lookup(fs_volume *_vol, ino_t parent, const char *name)
|
||||||
{
|
{
|
||||||
nspace *ns = (nspace*)_vol->private_volume;
|
nspace *ns = (nspace*)_vol->private_volume;
|
||||||
@@ -124,7 +124,7 @@ ntfs_inode_lookup(fs_volume *_vol, ino_t parent, const char *name)
|
|||||||
int uname_len;
|
int uname_len;
|
||||||
u64 ino = (u64)-1;
|
u64 ino = (u64)-1;
|
||||||
u64 inum;
|
u64 inum;
|
||||||
ntfs_inode *dir_ni;
|
ntfs_inode *dir_ni;
|
||||||
|
|
||||||
/* Open target directory. */
|
/* Open target directory. */
|
||||||
dir_ni = ntfs_inode_open(ns->ntvol, parent);
|
dir_ni = ntfs_inode_open(ns->ntvol, parent);
|
||||||
@@ -133,7 +133,7 @@ ntfs_inode_lookup(fs_volume *_vol, ino_t parent, const char *name)
|
|||||||
if (uname_len < 0) {
|
if (uname_len < 0) {
|
||||||
errno = EINVAL;
|
errno = EINVAL;
|
||||||
return (ino);
|
return (ino);
|
||||||
}
|
}
|
||||||
/* Lookup file */
|
/* Lookup file */
|
||||||
inum = ntfs_inode_lookup_by_name(dir_ni, uname, uname_len);
|
inum = ntfs_inode_lookup_by_name(dir_ni, uname, uname_len);
|
||||||
/* never return inodes 0 and 1 */
|
/* never return inodes 0 and 1 */
|
||||||
@@ -152,11 +152,11 @@ ntfs_inode_lookup(fs_volume *_vol, ino_t parent, const char *name)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
ntfs_remove(fs_volume *_vol, ino_t parent, const char *name)
|
ntfs_remove(fs_volume *_vol, ino_t parent, const char *name)
|
||||||
{
|
{
|
||||||
nspace *ns = (nspace*)_vol->private_volume;
|
nspace *ns = (nspace*)_vol->private_volume;
|
||||||
|
|
||||||
ntfschar *uname = NULL;
|
ntfschar *uname = NULL;
|
||||||
ntfs_inode *ni = NULL;
|
ntfs_inode *ni = NULL;
|
||||||
ntfs_inode *dir_ni = NULL;
|
ntfs_inode *dir_ni = NULL;
|
||||||
@@ -193,17 +193,17 @@ ntfs_remove(fs_volume *_vol, ino_t parent, const char *name)
|
|||||||
result = EINVAL;
|
result = EINVAL;
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ntfs_delete(ns->ntvol, (char*)NULL, ni, dir_ni, uname, uname_len))
|
if (ntfs_delete(ns->ntvol, (char*)NULL, ni, dir_ni, uname, uname_len))
|
||||||
result = EINVAL;
|
result = EINVAL;
|
||||||
/* ntfs_delete() always closes ni and dir_ni */
|
/* ntfs_delete() always closes ni and dir_ni */
|
||||||
ni = dir_ni = NULL;
|
ni = dir_ni = NULL;
|
||||||
exit:
|
exit:
|
||||||
if (ni != NULL)
|
if (ni != NULL)
|
||||||
ntfs_inode_close(ni);
|
ntfs_inode_close(ni);
|
||||||
if (dir_ni != NULL)
|
if (dir_ni != NULL)
|
||||||
ntfs_inode_close(dir_ni);
|
ntfs_inode_close(dir_ni);
|
||||||
|
|
||||||
free(uname);
|
free(uname);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
@@ -268,7 +268,7 @@ fs_identify_partition(int fd, partition_data *partition, void **_cookie)
|
|||||||
if (ntVolume->vol_name && ntVolume->vol_name[0] != '\0')
|
if (ntVolume->vol_name && ntVolume->vol_name[0] != '\0')
|
||||||
strcpy(cookie->label, ntVolume->vol_name);
|
strcpy(cookie->label, ntVolume->vol_name);
|
||||||
ntfs_umount(ntVolume, true);
|
ntfs_umount(ntVolume, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
*_cookie = cookie;
|
*_cookie = cookie;
|
||||||
@@ -313,14 +313,14 @@ fs_get_supported_operations(partition_data* partition, uint32 mask)
|
|||||||
status_t
|
status_t
|
||||||
fs_initialize(int fd, partition_id partitionID, const char* name,
|
fs_initialize(int fd, partition_id partitionID, const char* name,
|
||||||
const char* parameterString, off_t partitionSize, disk_job_id job)
|
const char* parameterString, off_t partitionSize, disk_job_id job)
|
||||||
{
|
{
|
||||||
char devpath[MAX_PATH];
|
char devpath[MAX_PATH];
|
||||||
status_t result = B_OK;
|
status_t result = B_OK;
|
||||||
|
|
||||||
TRACE("fs_initialize - [%s] - [%s]\n",name, parameterString);
|
TRACE("fs_initialize - [%s] - [%s]\n",name, parameterString);
|
||||||
|
|
||||||
update_disk_device_job_progress(job, 0);
|
update_disk_device_job_progress(job, 0);
|
||||||
|
|
||||||
if (ioctl(fd, B_GET_PATH_FOR_DEVICE, devpath) != 0) {
|
if (ioctl(fd, B_GET_PATH_FOR_DEVICE, devpath) != 0) {
|
||||||
result = mkntfs_main(devpath, name);
|
result = mkntfs_main(devpath, name);
|
||||||
if (result != 0)
|
if (result != 0)
|
||||||
@@ -414,7 +414,7 @@ fs_mount(fs_volume *_vol, const char *device, ulong flags, const char *args,
|
|||||||
gNTFSVnodeOps.read_attr = fs_read_attrib;
|
gNTFSVnodeOps.read_attr = fs_read_attrib;
|
||||||
gNTFSVnodeOps.read_attr_stat = fs_read_attrib_stat;
|
gNTFSVnodeOps.read_attr_stat = fs_read_attrib_stat;
|
||||||
gNTFSVnodeOps.write_attr = fs_write_attrib;
|
gNTFSVnodeOps.write_attr = fs_write_attrib;
|
||||||
gNTFSVnodeOps.remove_attr = fs_remove_attrib;
|
gNTFSVnodeOps.remove_attr = fs_remove_attrib;
|
||||||
}
|
}
|
||||||
|
|
||||||
ns->ntvol = utils_mount_volume(device, mountFlags | NTFS_MNT_RECOVER);
|
ns->ntvol = utils_mount_volume(device, mountFlags | NTFS_MNT_RECOVER);
|
||||||
@@ -521,7 +521,7 @@ fs_rfsstat(fs_volume *_vol, struct fs_info *fss)
|
|||||||
|
|
||||||
size = (double)((10 * diskSize + divisor - 1) / divisor);
|
size = (double)((10 * diskSize + divisor - 1) / divisor);
|
||||||
snprintf(fss->volume_name, sizeof(fss->volume_name), "%g %cB NTFS Volume",
|
snprintf(fss->volume_name, sizeof(fss->volume_name), "%g %cB NTFS Volume",
|
||||||
size / 10, unit);
|
size / 10, unit);
|
||||||
} else
|
} else
|
||||||
fss->volume_name[i + 1] = 0;
|
fss->volume_name[i + 1] = 0;
|
||||||
|
|
||||||
@@ -598,7 +598,7 @@ fs_walk(fs_volume *_vol, fs_vnode *_dir, const char *file, ino_t *_vnid)
|
|||||||
|
|
||||||
if (newNode!=NULL)
|
if (newNode!=NULL)
|
||||||
newNode->parent_vnid = baseNode->vnid;
|
newNode->parent_vnid = baseNode->vnid;
|
||||||
|
|
||||||
*_vnid = vnid;
|
*_vnid = vnid;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -686,7 +686,7 @@ fs_read_vnode(fs_volume *_vol, ino_t vnid, fs_vnode *_node, int *_type,
|
|||||||
|
|
||||||
newNode->vnid = vnid;
|
newNode->vnid = vnid;
|
||||||
newNode->parent_vnid = ntfs_mft_get_parent_ref(ni);
|
newNode->parent_vnid = ntfs_mft_get_parent_ref(ni);
|
||||||
|
|
||||||
if (ns->fake_attrib) {
|
if (ns->fake_attrib) {
|
||||||
if (ni->mrec->flags & MFT_RECORD_IS_DIRECTORY)
|
if (ni->mrec->flags & MFT_RECORD_IS_DIRECTORY)
|
||||||
set_mime(newNode, NULL);
|
set_mime(newNode, NULL);
|
||||||
@@ -905,7 +905,7 @@ fs_wstat(fs_volume *_vol, fs_vnode *_node, const struct stat *st, uint32 mask)
|
|||||||
|
|
||||||
ntfs_mark_free_space_outdated(ns);
|
ntfs_mark_free_space_outdated(ns);
|
||||||
|
|
||||||
notify_stat_changed(ns->id, MREF(ni->mft_no), mask);
|
notify_stat_changed(ns->id, -1, MREF(ni->mft_no), mask);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -916,7 +916,7 @@ fs_wstat(fs_volume *_vol, fs_vnode *_node, const struct stat *st, uint32 mask)
|
|||||||
ni->last_data_change_time = timespec2ntfs(st->st_mtim);
|
ni->last_data_change_time = timespec2ntfs(st->st_mtim);
|
||||||
ni->last_mft_change_time = timespec2ntfs(st->st_ctim);
|
ni->last_mft_change_time = timespec2ntfs(st->st_ctim);
|
||||||
|
|
||||||
notify_stat_changed(ns->id, MREF(ni->mft_no), mask);
|
notify_stat_changed(ns->id, -1, MREF(ni->mft_no), mask);
|
||||||
}
|
}
|
||||||
|
|
||||||
exit:
|
exit:
|
||||||
@@ -1057,9 +1057,9 @@ fs_create(fs_volume *_vol, fs_vnode *_dir, const char *name, int omode,
|
|||||||
status_t result = B_NO_ERROR;
|
status_t result = B_NO_ERROR;
|
||||||
int unameLength;
|
int unameLength;
|
||||||
|
|
||||||
if (ns->flags & B_FS_IS_READONLY) {
|
if (ns->flags & B_FS_IS_READONLY) {
|
||||||
return B_READ_ONLY_DEVICE;
|
return B_READ_ONLY_DEVICE;
|
||||||
}
|
}
|
||||||
|
|
||||||
LOCK_VOL(ns);
|
LOCK_VOL(ns);
|
||||||
|
|
||||||
@@ -1111,7 +1111,7 @@ fs_create(fs_volume *_vol, fs_vnode *_dir, const char *name, int omode,
|
|||||||
if (na != NULL) {
|
if (na != NULL) {
|
||||||
if (ntfs_attr_truncate(na, 0))
|
if (ntfs_attr_truncate(na, 0))
|
||||||
result = errno;
|
result = errno;
|
||||||
ntfs_attr_close(na);
|
ntfs_attr_close(na);
|
||||||
} else
|
} else
|
||||||
result = errno;
|
result = errno;
|
||||||
}
|
}
|
||||||
@@ -1121,7 +1121,7 @@ fs_create(fs_volume *_vol, fs_vnode *_dir, const char *name, int omode,
|
|||||||
ni = ntfs_create(dir_ni, securid, uname, unameLength, S_IFREG);
|
ni = ntfs_create(dir_ni, securid, uname, unameLength, S_IFREG);
|
||||||
if (ni != NULL) {
|
if (ni != NULL) {
|
||||||
ino_t vnid = MREF(ni->mft_no);
|
ino_t vnid = MREF(ni->mft_no);
|
||||||
|
|
||||||
newNode = (vnode*)ntfs_calloc(sizeof(vnode));
|
newNode = (vnode*)ntfs_calloc(sizeof(vnode));
|
||||||
if (newNode == NULL) {
|
if (newNode == NULL) {
|
||||||
result = ENOMEM;
|
result = ENOMEM;
|
||||||
@@ -1130,17 +1130,17 @@ fs_create(fs_volume *_vol, fs_vnode *_dir, const char *name, int omode,
|
|||||||
|
|
||||||
newNode->vnid = vnid;
|
newNode->vnid = vnid;
|
||||||
newNode->parent_vnid = dir->vnid;
|
newNode->parent_vnid = dir->vnid;
|
||||||
|
|
||||||
ni->flags |= FILE_ATTR_ARCHIVE;
|
ni->flags |= FILE_ATTR_ARCHIVE;
|
||||||
NInoSetDirty(ni);
|
NInoSetDirty(ni);
|
||||||
|
|
||||||
result = publish_vnode(_vol, vnid, (void*)newNode, &gNTFSVnodeOps,
|
result = publish_vnode(_vol, vnid, (void*)newNode, &gNTFSVnodeOps,
|
||||||
S_IFREG, 0);
|
S_IFREG, 0);
|
||||||
|
|
||||||
if (ntfs_inode_close_in_dir(ni, dir_ni)) {
|
if (ntfs_inode_close_in_dir(ni, dir_ni)) {
|
||||||
result = EINVAL;
|
result = EINVAL;
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
*_vnid = vnid;
|
*_vnid = vnid;
|
||||||
|
|
||||||
@@ -1151,8 +1151,8 @@ fs_create(fs_volume *_vol, fs_vnode *_dir, const char *name, int omode,
|
|||||||
set_mime(newNode, name);
|
set_mime(newNode, name);
|
||||||
}
|
}
|
||||||
|
|
||||||
ntfs_mark_free_space_outdated(ns);
|
ntfs_mark_free_space_outdated(ns);
|
||||||
fs_ntfs_update_times(_vol, dir_ni, NTFS_UPDATE_MCTIME);
|
fs_ntfs_update_times(_vol, dir_ni, NTFS_UPDATE_MCTIME);
|
||||||
notify_entry_created(ns->id, dir->vnid, name, vnid);
|
notify_entry_created(ns->id, dir->vnid, name, vnid);
|
||||||
} else
|
} else
|
||||||
result = errno;
|
result = errno;
|
||||||
@@ -1163,7 +1163,7 @@ exit:
|
|||||||
*_cookie = cookie;
|
*_cookie = cookie;
|
||||||
else
|
else
|
||||||
free(cookie);
|
free(cookie);
|
||||||
|
|
||||||
if (dir_ni != NULL)
|
if (dir_ni != NULL)
|
||||||
ntfs_inode_close(dir_ni);
|
ntfs_inode_close(dir_ni);
|
||||||
|
|
||||||
@@ -1316,7 +1316,7 @@ fs_write(fs_volume *_vol, fs_vnode *_node, void *_cookie, off_t offset,
|
|||||||
if (ntfs_attr_truncate(na, offset + size))
|
if (ntfs_attr_truncate(na, offset + size))
|
||||||
size = na->data_size - offset;
|
size = na->data_size - offset;
|
||||||
else
|
else
|
||||||
notify_stat_changed(ns->id, node->vnid, B_STAT_SIZE);
|
notify_stat_changed(ns->id, -1, node->vnid, B_STAT_SIZE);
|
||||||
}
|
}
|
||||||
|
|
||||||
while (size) {
|
while (size) {
|
||||||
@@ -1504,10 +1504,10 @@ fs_create_symlink(fs_volume *_vol, fs_vnode *_dir, const char *name,
|
|||||||
int utargetLength;
|
int utargetLength;
|
||||||
status_t result = B_NO_ERROR;
|
status_t result = B_NO_ERROR;
|
||||||
le32 securid = const_cpu_to_le32(0);
|
le32 securid = const_cpu_to_le32(0);
|
||||||
|
|
||||||
if (ns->flags & B_FS_IS_READONLY) {
|
if (ns->flags & B_FS_IS_READONLY) {
|
||||||
return B_READ_ONLY_DEVICE;
|
return B_READ_ONLY_DEVICE;
|
||||||
}
|
}
|
||||||
|
|
||||||
LOCK_VOL(ns);
|
LOCK_VOL(ns);
|
||||||
|
|
||||||
@@ -1517,10 +1517,10 @@ fs_create_symlink(fs_volume *_vol, fs_vnode *_dir, const char *name,
|
|||||||
result = EINVAL;
|
result = EINVAL;
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
dir_ni = ntfs_inode_open(ns->ntvol, dir->vnid);
|
dir_ni = ntfs_inode_open(ns->ntvol, dir->vnid);
|
||||||
if (dir_ni == NULL) {
|
if (dir_ni == NULL) {
|
||||||
result = ENOENT;
|
result = ENOENT;
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1548,7 +1548,7 @@ fs_create_symlink(fs_volume *_vol, fs_vnode *_dir, const char *name,
|
|||||||
|
|
||||||
newNode->vnid = vnid;
|
newNode->vnid = vnid;
|
||||||
newNode->parent_vnid = MREF(dir_ni->mft_no);
|
newNode->parent_vnid = MREF(dir_ni->mft_no);
|
||||||
|
|
||||||
ni->flags |= FILE_ATTR_ARCHIVE;
|
ni->flags |= FILE_ATTR_ARCHIVE;
|
||||||
NInoSetDirty(ni);
|
NInoSetDirty(ni);
|
||||||
|
|
||||||
@@ -1556,15 +1556,15 @@ fs_create_symlink(fs_volume *_vol, fs_vnode *_dir, const char *name,
|
|||||||
result = publish_vnode(_vol, vnid, (void*)newNode, &gNTFSVnodeOps,
|
result = publish_vnode(_vol, vnid, (void*)newNode, &gNTFSVnodeOps,
|
||||||
S_IFREG, 0);
|
S_IFREG, 0);
|
||||||
put_vnode(_vol, vnid);
|
put_vnode(_vol, vnid);
|
||||||
|
|
||||||
if (ntfs_inode_close_in_dir(ni, dir_ni)) {
|
if (ntfs_inode_close_in_dir(ni, dir_ni)) {
|
||||||
result = EINVAL;
|
result = EINVAL;
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
ntfs_mark_free_space_outdated(ns);
|
ntfs_mark_free_space_outdated(ns);
|
||||||
fs_ntfs_update_times(_vol, dir_ni, NTFS_UPDATE_MCTIME);
|
fs_ntfs_update_times(_vol, dir_ni, NTFS_UPDATE_MCTIME);
|
||||||
notify_entry_created(ns->id, MREF(dir_ni->mft_no), name, vnid);
|
notify_entry_created(ns->id, MREF(dir_ni->mft_no), name, vnid);
|
||||||
} else
|
} else
|
||||||
result = errno;
|
result = errno;
|
||||||
|
|
||||||
@@ -1630,16 +1630,16 @@ fs_mkdir(fs_volume *_vol, fs_vnode *_dir, const char *name, int perms)
|
|||||||
ni = ntfs_create(dir_ni, securid, uname, unameLength, S_IFDIR);
|
ni = ntfs_create(dir_ni, securid, uname, unameLength, S_IFDIR);
|
||||||
if (ni != NULL) {
|
if (ni != NULL) {
|
||||||
ino_t vnid = MREF(ni->mft_no);
|
ino_t vnid = MREF(ni->mft_no);
|
||||||
|
|
||||||
newNode = (vnode*)ntfs_calloc(sizeof(vnode));
|
newNode = (vnode*)ntfs_calloc(sizeof(vnode));
|
||||||
if (newNode == NULL) {
|
if (newNode == NULL) {
|
||||||
result = ENOMEM;
|
result = ENOMEM;
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
newNode->vnid = vnid;
|
newNode->vnid = vnid;
|
||||||
newNode->parent_vnid = MREF(dir_ni->mft_no);
|
newNode->parent_vnid = MREF(dir_ni->mft_no);
|
||||||
|
|
||||||
ni->flags |= FILE_ATTR_ARCHIVE;
|
ni->flags |= FILE_ATTR_ARCHIVE;
|
||||||
NInoSetDirty(ni);
|
NInoSetDirty(ni);
|
||||||
|
|
||||||
@@ -1700,51 +1700,51 @@ fs_rename(fs_volume *_vol, fs_vnode *_odir, const char *name,
|
|||||||
|
|
||||||
LOCK_VOL(ns);
|
LOCK_VOL(ns);
|
||||||
|
|
||||||
TRACE("NTFS:fs_rename - oldname:%s newname:%s\n", name, newname);
|
TRACE("NTFS:fs_rename - oldname:%s newname:%s\n", name, newname);
|
||||||
|
|
||||||
inode = ntfs_inode_lookup(_vol, parent_vnid, name);
|
inode = ntfs_inode_lookup(_vol, parent_vnid, name);
|
||||||
if (inode == (u64)-1) {
|
if (inode == (u64)-1) {
|
||||||
result = EINVAL;
|
result = EINVAL;
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Check whether target is present */
|
/* Check whether target is present */
|
||||||
target_inode = ntfs_inode_lookup(_vol, newparent_vnid, newname);
|
target_inode = ntfs_inode_lookup(_vol, newparent_vnid, newname);
|
||||||
|
|
||||||
if (target_inode == (u64)-1) {
|
if (target_inode == (u64)-1) {
|
||||||
ntfschar *uname = NULL;
|
ntfschar *uname = NULL;
|
||||||
int uname_len;
|
int uname_len;
|
||||||
|
|
||||||
result = get_vnode(_vol, inode, (void**)&file);
|
result = get_vnode(_vol, inode, (void**)&file);
|
||||||
if (result != B_NO_ERROR)
|
if (result != B_NO_ERROR)
|
||||||
goto exit;
|
goto exit;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
ni = ntfs_inode_open(ns->ntvol, inode);
|
ni = ntfs_inode_open(ns->ntvol, inode);
|
||||||
if (!ni) {
|
if (!ni) {
|
||||||
result = EINVAL;
|
result = EINVAL;
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
uname_len = ntfs_mbstoucs(newname, &uname);
|
uname_len = ntfs_mbstoucs(newname, &uname);
|
||||||
if (uname_len < 0) {
|
if (uname_len < 0) {
|
||||||
result = EINVAL;
|
result = EINVAL;
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
dir_ni = ntfs_inode_open(ns->ntvol, newparent_vnid);
|
dir_ni = ntfs_inode_open(ns->ntvol, newparent_vnid);
|
||||||
if (!dir_ni) {
|
if (!dir_ni) {
|
||||||
result = EINVAL;
|
result = EINVAL;
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ntfs_link(ni, dir_ni, uname, uname_len)) {
|
if (ntfs_link(ni, dir_ni, uname, uname_len)) {
|
||||||
result = EINVAL;
|
result = EINVAL;
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
ni->flags |= FILE_ATTR_ARCHIVE;
|
ni->flags |= FILE_ATTR_ARCHIVE;
|
||||||
|
|
||||||
fs_ntfs_update_times(_vol, ni, NTFS_UPDATE_CTIME);
|
fs_ntfs_update_times(_vol, ni, NTFS_UPDATE_CTIME);
|
||||||
fs_ntfs_update_times(_vol, dir_ni, NTFS_UPDATE_MCTIME);
|
fs_ntfs_update_times(_vol, dir_ni, NTFS_UPDATE_MCTIME);
|
||||||
|
|
||||||
@@ -1753,13 +1753,13 @@ fs_rename(fs_volume *_vol, fs_vnode *_odir, const char *name,
|
|||||||
set_mime(file, NULL);
|
set_mime(file, NULL);
|
||||||
else
|
else
|
||||||
set_mime(file, newname);
|
set_mime(file, newname);
|
||||||
notify_attribute_changed(ns->id, file->vnid, "BEOS:TYPE",
|
notify_attribute_changed(ns->id, -1, file->vnid, "BEOS:TYPE",
|
||||||
B_ATTR_CHANGED);
|
B_ATTR_CHANGED);
|
||||||
}
|
}
|
||||||
|
|
||||||
ntfs_inode_close(dir_ni);
|
ntfs_inode_close(dir_ni);
|
||||||
ntfs_inode_close(ni);
|
ntfs_inode_close(ni);
|
||||||
|
|
||||||
free(uname);
|
free(uname);
|
||||||
|
|
||||||
ntfs_remove(_vol, parent_vnid, name);
|
ntfs_remove(_vol, parent_vnid, name);
|
||||||
@@ -1767,10 +1767,10 @@ fs_rename(fs_volume *_vol, fs_vnode *_odir, const char *name,
|
|||||||
file->parent_vnid = newparent_vnid;
|
file->parent_vnid = newparent_vnid;
|
||||||
|
|
||||||
put_vnode(_vol, file->vnid);
|
put_vnode(_vol, file->vnid);
|
||||||
|
|
||||||
notify_entry_moved(ns->id, parent_vnid, name, newparent_vnid,
|
notify_entry_moved(ns->id, parent_vnid, name, newparent_vnid,
|
||||||
newname, inode);
|
newname, inode);
|
||||||
} else
|
} else
|
||||||
result = EINVAL;
|
result = EINVAL;
|
||||||
exit:
|
exit:
|
||||||
TRACE("fs_rename - EXIT, result is %s\n", strerror(result));
|
TRACE("fs_rename - EXIT, result is %s\n", strerror(result));
|
||||||
@@ -1814,13 +1814,13 @@ fs_rmdir(fs_volume *_vol, fs_vnode *_dir, const char *name)
|
|||||||
ino = ntfs_inode_lookup(_vol, dir->vnid, name);
|
ino = ntfs_inode_lookup(_vol, dir->vnid, name);
|
||||||
if (ino == (u64)-1) {
|
if (ino == (u64)-1) {
|
||||||
result = EINVAL;
|
result = EINVAL;
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
result = get_vnode(_vol, ino, (void**)&file);
|
result = get_vnode(_vol, ino, (void**)&file);
|
||||||
if (result != B_NO_ERROR)
|
if (result != B_NO_ERROR)
|
||||||
goto exit;
|
goto exit;
|
||||||
|
|
||||||
ni = ntfs_inode_open(ns->ntvol, file->vnid);
|
ni = ntfs_inode_open(ns->ntvol, file->vnid);
|
||||||
if (ni != NULL) {
|
if (ni != NULL) {
|
||||||
if (!(ni->mrec->flags & MFT_RECORD_IS_DIRECTORY)) {
|
if (!(ni->mrec->flags & MFT_RECORD_IS_DIRECTORY)) {
|
||||||
@@ -1836,31 +1836,31 @@ fs_rmdir(fs_volume *_vol, fs_vnode *_dir, const char *name)
|
|||||||
result = EINVAL;
|
result = EINVAL;
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
result = ntfs_remove(_vol, dir->vnid, name);
|
result = ntfs_remove(_vol, dir->vnid, name);
|
||||||
if(result != B_NO_ERROR) {
|
if(result != B_NO_ERROR) {
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
notify_entry_removed(ns->id, dir->vnid, name, file->vnid);
|
notify_entry_removed(ns->id, dir->vnid, name, file->vnid);
|
||||||
|
|
||||||
remove_vnode(_vol, file->vnid);
|
remove_vnode(_vol, file->vnid);
|
||||||
|
|
||||||
put_vnode(_vol, ino);
|
put_vnode(_vol, ino);
|
||||||
|
|
||||||
dir_ni = ntfs_inode_open(ns->ntvol, dir->vnid);
|
dir_ni = ntfs_inode_open(ns->ntvol, dir->vnid);
|
||||||
if (dir_ni != NULL) {
|
if (dir_ni != NULL) {
|
||||||
fs_ntfs_update_times(_vol, dir_ni, NTFS_UPDATE_MCTIME);
|
fs_ntfs_update_times(_vol, dir_ni, NTFS_UPDATE_MCTIME);
|
||||||
ntfs_inode_close(dir_ni);
|
ntfs_inode_close(dir_ni);
|
||||||
}
|
}
|
||||||
|
|
||||||
ntfs_mark_free_space_outdated(ns);
|
ntfs_mark_free_space_outdated(ns);
|
||||||
|
|
||||||
exit:
|
exit:
|
||||||
if (ni != NULL)
|
if (ni != NULL)
|
||||||
ntfs_inode_close(ni);
|
ntfs_inode_close(ni);
|
||||||
|
|
||||||
TRACE("fs_rmdir - EXIT, result is %s\n", strerror(result));
|
TRACE("fs_rmdir - EXIT, result is %s\n", strerror(result));
|
||||||
|
|
||||||
UNLOCK_VOL(ns);
|
UNLOCK_VOL(ns);
|
||||||
@@ -1901,13 +1901,13 @@ fs_unlink(fs_volume *_vol, fs_vnode *_dir, const char *name)
|
|||||||
inode = ntfs_inode_lookup(_vol, dir->vnid, name);
|
inode = ntfs_inode_lookup(_vol, dir->vnid, name);
|
||||||
if (inode == (u64)-1) {
|
if (inode == (u64)-1) {
|
||||||
result = EINVAL;
|
result = EINVAL;
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
result = get_vnode(_vol, inode, (void**)&file);
|
result = get_vnode(_vol, inode, (void**)&file);
|
||||||
if (result != B_NO_ERROR)
|
if (result != B_NO_ERROR)
|
||||||
goto exit;
|
goto exit;
|
||||||
|
|
||||||
result = ntfs_remove(_vol, dir->vnid, name);
|
result = ntfs_remove(_vol, dir->vnid, name);
|
||||||
if(result != B_NO_ERROR) {
|
if(result != B_NO_ERROR) {
|
||||||
goto exit;
|
goto exit;
|
||||||
@@ -1917,7 +1917,7 @@ fs_unlink(fs_volume *_vol, fs_vnode *_dir, const char *name)
|
|||||||
|
|
||||||
remove_vnode(_vol, file->vnid);
|
remove_vnode(_vol, file->vnid);
|
||||||
|
|
||||||
put_vnode(_vol, inode);
|
put_vnode(_vol, inode);
|
||||||
|
|
||||||
dir_ni = ntfs_inode_open(ns->ntvol, dir->vnid);
|
dir_ni = ntfs_inode_open(ns->ntvol, dir->vnid);
|
||||||
if (dir_ni != NULL) {
|
if (dir_ni != NULL) {
|
||||||
@@ -1926,7 +1926,7 @@ fs_unlink(fs_volume *_vol, fs_vnode *_dir, const char *name)
|
|||||||
}
|
}
|
||||||
|
|
||||||
ntfs_mark_free_space_outdated(ns);
|
ntfs_mark_free_space_outdated(ns);
|
||||||
|
|
||||||
exit:
|
exit:
|
||||||
TRACE("fs_unlink - EXIT, result is %s\n", strerror(result));
|
TRACE("fs_unlink - EXIT, result is %s\n", strerror(result));
|
||||||
|
|
||||||
|
|||||||
@@ -680,7 +680,9 @@ void
|
|||||||
Volume::PackageLinkNodeChanged(Node* node, uint32 statFields,
|
Volume::PackageLinkNodeChanged(Node* node, uint32 statFields,
|
||||||
const OldNodeAttributes& oldAttributes)
|
const OldNodeAttributes& oldAttributes)
|
||||||
{
|
{
|
||||||
notify_stat_changed(ID(), node->ID(), statFields);
|
Directory* parent = node->Parent();
|
||||||
|
notify_stat_changed(ID(), parent != NULL ? parent->ID() : -1, node->ID(),
|
||||||
|
statFields);
|
||||||
_NotifyNodeChanged(node, statFields, oldAttributes);
|
_NotifyNodeChanged(node, statFields, oldAttributes);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1261,7 +1263,8 @@ Volume::_AddPackageNode(Directory* directory, PackageNode* packageNode,
|
|||||||
// The new package node has become the one representing the node.
|
// The new package node has become the one representing the node.
|
||||||
// Send stat changed notification for directories and entry
|
// Send stat changed notification for directories and entry
|
||||||
// removed + created notifications for files and symlinks.
|
// removed + created notifications for files and symlinks.
|
||||||
notify_stat_changed(ID(), node->ID(), kAllStatFields);
|
notify_stat_changed(ID(), directory->ID(), node->ID(),
|
||||||
|
kAllStatFields);
|
||||||
// TODO: Actually the attributes might change, too!
|
// TODO: Actually the attributes might change, too!
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1356,7 +1359,8 @@ Volume::_RemovePackageNode(Directory* directory, PackageNode* packageNode,
|
|||||||
// Send stat changed notification for directories and entry
|
// Send stat changed notification for directories and entry
|
||||||
// removed + created notifications for files and symlinks.
|
// removed + created notifications for files and symlinks.
|
||||||
if (S_ISDIR(packageNode->Mode())) {
|
if (S_ISDIR(packageNode->Mode())) {
|
||||||
notify_stat_changed(ID(), node->ID(), kAllStatFields);
|
notify_stat_changed(ID(), directory->ID(), node->ID(),
|
||||||
|
kAllStatFields);
|
||||||
// TODO: Actually the attributes might change, too!
|
// TODO: Actually the attributes might change, too!
|
||||||
} else {
|
} else {
|
||||||
notify_entry_removed(ID(), directory->ID(), node->Name(),
|
notify_entry_removed(ID(), directory->ID(), node->Name(),
|
||||||
|
|||||||
@@ -4,7 +4,8 @@ local userlandFSTop = [ FDirName $(HAIKU_TOP) src add-ons kernel
|
|||||||
file_systems userlandfs ] ;
|
file_systems userlandfs ] ;
|
||||||
local userlandFSIncludes = [ PrivateHeaders userlandfs ] ;
|
local userlandFSIncludes = [ PrivateHeaders userlandfs ] ;
|
||||||
|
|
||||||
UsePrivateHeaders kernel shared ;
|
UsePrivateHeaders shared ;
|
||||||
|
UsePrivateKernelHeaders ;
|
||||||
|
|
||||||
SubDirHdrs [ FDirName $(userlandFSIncludes) shared ] ;
|
SubDirHdrs [ FDirName $(userlandFSIncludes) shared ] ;
|
||||||
|
|
||||||
|
|||||||
@@ -70,7 +70,7 @@ notify_if_stat_changed(Volume *volume, Node *node)
|
|||||||
{
|
{
|
||||||
if (volume && node && node->IsModified()) {
|
if (volume && node && node->IsModified()) {
|
||||||
uint32 statFields = node->MarkUnmodified();
|
uint32 statFields = node->MarkUnmodified();
|
||||||
notify_stat_changed(volume->GetID(), node->GetID(), statFields);
|
notify_stat_changed(volume->GetID(), -1, node->GetID(), statFields);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1093,11 +1093,11 @@ private:
|
|||||||
// debugging
|
// debugging
|
||||||
int32 fIteratorID;
|
int32 fIteratorID;
|
||||||
int32 fGetNextCounter;
|
int32 fGetNextCounter;
|
||||||
static vint32 fNextIteratorID;
|
static int32 fNextIteratorID;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
vint32 DirectoryCookie::fNextIteratorID = 0;
|
int32 DirectoryCookie::fNextIteratorID = 0;
|
||||||
|
|
||||||
|
|
||||||
// ramfs_create_dir
|
// ramfs_create_dir
|
||||||
@@ -1531,7 +1531,7 @@ ramfs_create_attr(fs_volume* _volume, fs_vnode* _node, const char *name,
|
|||||||
|
|
||||||
attribute->SetType(type);
|
attribute->SetType(type);
|
||||||
|
|
||||||
notify_attribute_changed(volume->GetID(), node->GetID(), name,
|
notify_attribute_changed(volume->GetID(), -1, node->GetID(), name,
|
||||||
B_ATTR_CREATED);
|
B_ATTR_CREATED);
|
||||||
|
|
||||||
// else truncate if requested
|
// else truncate if requested
|
||||||
@@ -1540,7 +1540,7 @@ ramfs_create_attr(fs_volume* _volume, fs_vnode* _node, const char *name,
|
|||||||
if (error != B_OK)
|
if (error != B_OK)
|
||||||
return error;
|
return error;
|
||||||
|
|
||||||
notify_attribute_changed(volume->GetID(), node->GetID(), name,
|
notify_attribute_changed(volume->GetID(), -1, node->GetID(), name,
|
||||||
B_ATTR_CHANGED);
|
B_ATTR_CHANGED);
|
||||||
}
|
}
|
||||||
NodeMTimeUpdater mTimeUpdater(node);
|
NodeMTimeUpdater mTimeUpdater(node);
|
||||||
@@ -1598,8 +1598,8 @@ ramfs_open_attr(fs_volume* _volume, fs_vnode* _node, const char *name,
|
|||||||
error = attribute->SetSize(0);
|
error = attribute->SetSize(0);
|
||||||
|
|
||||||
if (error == B_OK) {
|
if (error == B_OK) {
|
||||||
notify_attribute_changed(volume->GetID(), node->GetID(), name,
|
notify_attribute_changed(volume->GetID(), -1, node->GetID(),
|
||||||
B_ATTR_CHANGED);
|
name, B_ATTR_CHANGED);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
NodeMTimeUpdater mTimeUpdater(node);
|
NodeMTimeUpdater mTimeUpdater(node);
|
||||||
@@ -1718,7 +1718,7 @@ ramfs_write_attr(fs_volume* _volume, fs_vnode* _node, void* _cookie,
|
|||||||
|
|
||||||
// notify listeners
|
// notify listeners
|
||||||
if (error == B_OK) {
|
if (error == B_OK) {
|
||||||
notify_attribute_changed(volume->GetID(), node->GetID(), name,
|
notify_attribute_changed(volume->GetID(), -1, node->GetID(), name,
|
||||||
B_ATTR_CHANGED);
|
B_ATTR_CHANGED);
|
||||||
}
|
}
|
||||||
} else
|
} else
|
||||||
@@ -1797,7 +1797,7 @@ ramfs_remove_attr(fs_volume* _volume, fs_vnode* _node, const char *name)
|
|||||||
|
|
||||||
// notify listeners
|
// notify listeners
|
||||||
if (error == B_OK) {
|
if (error == B_OK) {
|
||||||
notify_attribute_changed(volume->GetID(), node->GetID(), name,
|
notify_attribute_changed(volume->GetID(), -1, node->GetID(), name,
|
||||||
B_ATTR_REMOVED);
|
B_ATTR_REMOVED);
|
||||||
}
|
}
|
||||||
} else
|
} else
|
||||||
|
|||||||
@@ -211,8 +211,8 @@ KernelRequestHandler::_HandleRequest(NotifyListenerRequest* request)
|
|||||||
PRINT(("notify_stat_changed(%" B_PRId32 ", %" B_PRId64 ", "
|
PRINT(("notify_stat_changed(%" B_PRId32 ", %" B_PRId64 ", "
|
||||||
"0x%" B_PRIx32 ")\n", request->device, request->node,
|
"0x%" B_PRIx32 ")\n", request->device, request->node,
|
||||||
request->details));
|
request->details));
|
||||||
result = notify_stat_changed(request->device, request->node,
|
result = notify_stat_changed(request->device,
|
||||||
request->details);
|
request->directory, request->node, request->details);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case B_ATTR_CHANGED:
|
case B_ATTR_CHANGED:
|
||||||
@@ -220,7 +220,8 @@ KernelRequestHandler::_HandleRequest(NotifyListenerRequest* request)
|
|||||||
"\"%s\", 0x%" B_PRIx32 ")\n", request->device,
|
"\"%s\", 0x%" B_PRIx32 ")\n", request->device,
|
||||||
request->node, name, (int32)request->details));
|
request->node, name, (int32)request->details));
|
||||||
result = notify_attribute_changed(request->device,
|
result = notify_attribute_changed(request->device,
|
||||||
request->node, name, (int32)request->details);
|
request->directory, request->node, name,
|
||||||
|
(int32)request->details);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
|||||||
@@ -96,23 +96,24 @@ notify_entry_moved(dev_t device, ino_t fromDirectory,
|
|||||||
|
|
||||||
// notify_stat_changed
|
// notify_stat_changed
|
||||||
status_t
|
status_t
|
||||||
notify_stat_changed(dev_t device, ino_t node, uint32 statFields)
|
notify_stat_changed(dev_t device, ino_t directory, ino_t node,
|
||||||
|
uint32 statFields)
|
||||||
{
|
{
|
||||||
return UserlandFS::KernelEmu::notify_listener(B_STAT_CHANGED, statFields,
|
return UserlandFS::KernelEmu::notify_listener(B_STAT_CHANGED, statFields,
|
||||||
device, 0, 0, node, NULL, NULL);
|
device, 0, directory, node, NULL, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// notify_attribute_changed
|
// notify_attribute_changed
|
||||||
status_t
|
status_t
|
||||||
notify_attribute_changed(dev_t device, ino_t node, const char *attribute,
|
notify_attribute_changed(dev_t device, ino_t directory, ino_t node,
|
||||||
int32 cause)
|
const char *attribute, int32 cause)
|
||||||
{
|
{
|
||||||
if (!attribute)
|
if (!attribute)
|
||||||
return B_BAD_VALUE;
|
return B_BAD_VALUE;
|
||||||
|
|
||||||
return UserlandFS::KernelEmu::notify_listener(B_ATTR_CHANGED, cause,
|
return UserlandFS::KernelEmu::notify_listener(B_ATTR_CHANGED, cause,
|
||||||
device, 0, 0, node, NULL, attribute);
|
device, 0, directory, node, NULL, attribute);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2002-2012, Axel Dörfler, axeld@pinc-software.de.
|
* Copyright 2002-2016, Axel Dörfler, axeld@pinc-software.de.
|
||||||
* Distributed under the terms of the MIT License.
|
* Distributed under the terms of the MIT License.
|
||||||
*
|
*
|
||||||
* Copyright 2001-2002, Travis Geiselbrecht. All rights reserved.
|
* Copyright 2001-2002, Travis Geiselbrecht. All rights reserved.
|
||||||
@@ -196,6 +196,15 @@ current_timespec()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static ino_t
|
||||||
|
get_parent_id(struct devfs_vnode* vnode)
|
||||||
|
{
|
||||||
|
if (vnode->parent != NULL)
|
||||||
|
return vnode->parent->id;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static int32
|
static int32
|
||||||
scan_mode(void)
|
scan_mode(void)
|
||||||
{
|
{
|
||||||
@@ -378,7 +387,7 @@ devfs_insert_in_dir(struct devfs_vnode* dir, struct devfs_vnode* vnode,
|
|||||||
if (notify) {
|
if (notify) {
|
||||||
notify_entry_created(sDeviceFileSystem->id, dir->id, vnode->name,
|
notify_entry_created(sDeviceFileSystem->id, dir->id, vnode->name,
|
||||||
vnode->id);
|
vnode->id);
|
||||||
notify_stat_changed(sDeviceFileSystem->id, dir->id,
|
notify_stat_changed(sDeviceFileSystem->id, get_parent_id(dir), dir->id,
|
||||||
B_STAT_MODIFICATION_TIME);
|
B_STAT_MODIFICATION_TIME);
|
||||||
}
|
}
|
||||||
return B_OK;
|
return B_OK;
|
||||||
@@ -407,8 +416,8 @@ devfs_remove_from_dir(struct devfs_vnode* dir, struct devfs_vnode* removeNode,
|
|||||||
if (notify) {
|
if (notify) {
|
||||||
notify_entry_removed(sDeviceFileSystem->id, dir->id, vnode->name,
|
notify_entry_removed(sDeviceFileSystem->id, dir->id, vnode->name,
|
||||||
vnode->id);
|
vnode->id);
|
||||||
notify_stat_changed(sDeviceFileSystem->id, dir->id,
|
notify_stat_changed(sDeviceFileSystem->id, get_parent_id(dir),
|
||||||
B_STAT_MODIFICATION_TIME);
|
dir->id, B_STAT_MODIFICATION_TIME);
|
||||||
}
|
}
|
||||||
return B_OK;
|
return B_OK;
|
||||||
}
|
}
|
||||||
@@ -1833,7 +1842,7 @@ devfs_write_stat(fs_volume* _volume, fs_vnode* _vnode, const struct stat* stat,
|
|||||||
if (statMask & B_STAT_CREATION_TIME)
|
if (statMask & B_STAT_CREATION_TIME)
|
||||||
vnode->creation_time = stat->st_crtim;
|
vnode->creation_time = stat->st_crtim;
|
||||||
|
|
||||||
notify_stat_changed(fs->id, vnode->id, statMask);
|
notify_stat_changed(fs->id, get_parent_id(vnode), vnode->id, statMask);
|
||||||
return B_OK;
|
return B_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2081,8 +2090,8 @@ devfs_rename_partition(const char* devicePath, const char* oldName,
|
|||||||
|
|
||||||
notify_entry_moved(sDeviceFileSystem->id, device->parent->id, oldName,
|
notify_entry_moved(sDeviceFileSystem->id, device->parent->id, oldName,
|
||||||
device->parent->id, newName, node->id);
|
device->parent->id, newName, node->id);
|
||||||
notify_stat_changed(sDeviceFileSystem->id, device->parent->id,
|
notify_stat_changed(sDeviceFileSystem->id, get_parent_id(device->parent),
|
||||||
B_STAT_MODIFICATION_TIME);
|
device->parent->id, B_STAT_MODIFICATION_TIME);
|
||||||
|
|
||||||
return B_OK;
|
return B_OK;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2003-2008, Axel Dörfler, axeld@pinc-software.de. All rights reserved.
|
* Copyright 2003-2016, Axel Dörfler, axeld@pinc-software.de. All rights reserved.
|
||||||
* Copyright 2005-2008, Ingo Weinhold, bonefish@users.sf.net.
|
* Copyright 2005-2008, Ingo Weinhold, bonefish@users.sf.net.
|
||||||
* Copyright 2010, Clemens Zeidler, haiku@clemens-zeidler.de.
|
* Copyright 2010, Clemens Zeidler, haiku@clemens-zeidler.de.
|
||||||
*
|
*
|
||||||
@@ -97,9 +97,10 @@ class NodeMonitorService : public NotificationService {
|
|||||||
status_t NotifyEntryMoved(dev_t device, ino_t fromDirectory,
|
status_t NotifyEntryMoved(dev_t device, ino_t fromDirectory,
|
||||||
const char *fromName, ino_t toDirectory, const char *toName,
|
const char *fromName, ino_t toDirectory, const char *toName,
|
||||||
ino_t node);
|
ino_t node);
|
||||||
status_t NotifyStatChanged(dev_t device, ino_t node, uint32 statFields);
|
status_t NotifyStatChanged(dev_t device, ino_t directory, ino_t node,
|
||||||
status_t NotifyAttributeChanged(dev_t device, ino_t node,
|
uint32 statFields);
|
||||||
const char *attribute, int32 cause);
|
status_t NotifyAttributeChanged(dev_t device, ino_t directory,
|
||||||
|
ino_t node, const char *attribute, int32 cause);
|
||||||
status_t NotifyUnmount(dev_t device);
|
status_t NotifyUnmount(dev_t device);
|
||||||
status_t NotifyMount(dev_t device, dev_t parentDevice,
|
status_t NotifyMount(dev_t device, dev_t parentDevice,
|
||||||
ino_t parentDirectory);
|
ino_t parentDirectory);
|
||||||
@@ -547,7 +548,7 @@ NodeMonitorService::_GetInterestedMonitorListeners(dev_t device, ino_t node,
|
|||||||
// iterate through the listeners until we find one with matching flags
|
// iterate through the listeners until we find one with matching flags
|
||||||
MonitorListenerList::Iterator iterator = monitor->listeners.GetIterator();
|
MonitorListenerList::Iterator iterator = monitor->listeners.GetIterator();
|
||||||
while (monitor_listener *listener = iterator.Next()) {
|
while (monitor_listener *listener = iterator.Next()) {
|
||||||
if (listener->flags & flags) {
|
if ((listener->flags & flags) == flags) {
|
||||||
interested_monitor_listener_list &list
|
interested_monitor_listener_list &list
|
||||||
= interestedListeners[interestedListenerCount++];
|
= interestedListeners[interestedListenerCount++];
|
||||||
list.iterator = iterator;
|
list.iterator = iterator;
|
||||||
@@ -571,7 +572,7 @@ NodeMonitorService::_GetInterestedVolumeListeners(dev_t device, uint32 flags,
|
|||||||
// iterate through the listeners until we find one with matching flags
|
// iterate through the listeners until we find one with matching flags
|
||||||
MonitorListenerList::Iterator iterator = monitor->listeners.GetIterator();
|
MonitorListenerList::Iterator iterator = monitor->listeners.GetIterator();
|
||||||
while (monitor_listener *listener = iterator.Next()) {
|
while (monitor_listener *listener = iterator.Next()) {
|
||||||
if (listener->flags & flags) {
|
if ((listener->flags & flags) == flags) {
|
||||||
interested_monitor_listener_list &list
|
interested_monitor_listener_list &list
|
||||||
= interestedListeners[interestedListenerCount++];
|
= interestedListeners[interestedListenerCount++];
|
||||||
list.iterator = iterator;
|
list.iterator = iterator;
|
||||||
@@ -730,21 +731,29 @@ NodeMonitorService::NotifyEntryMoved(dev_t device, ino_t fromDirectory,
|
|||||||
|
|
||||||
|
|
||||||
inline status_t
|
inline status_t
|
||||||
NodeMonitorService::NotifyStatChanged(dev_t device, ino_t node,
|
NodeMonitorService::NotifyStatChanged(dev_t device, ino_t directory, ino_t node,
|
||||||
uint32 statFields)
|
uint32 statFields)
|
||||||
{
|
{
|
||||||
RecursiveLocker locker(fRecursiveLock);
|
RecursiveLocker locker(fRecursiveLock);
|
||||||
|
|
||||||
// get the lists of all interested listeners
|
// get the lists of all interested listeners depending on whether its an
|
||||||
|
// interim update or not
|
||||||
interested_monitor_listener_list interestedListeners[3];
|
interested_monitor_listener_list interestedListeners[3];
|
||||||
int32 interestedListenerCount = 0;
|
int32 interestedListenerCount = 0;
|
||||||
|
uint32 watchFlag = (statFields & B_STAT_INTERIM_UPDATE) != 0
|
||||||
|
? B_WATCH_INTERIM_STAT : B_WATCH_STAT;
|
||||||
|
|
||||||
// ... for the volume
|
// ... for the volume
|
||||||
_GetInterestedVolumeListeners(device, B_WATCH_STAT,
|
_GetInterestedVolumeListeners(device, watchFlag, interestedListeners,
|
||||||
interestedListeners, interestedListenerCount);
|
interestedListenerCount);
|
||||||
// ... for the node, depending on whether its an interim update or not
|
// ... for the directory
|
||||||
_GetInterestedMonitorListeners(device, node,
|
if (directory >= 0) {
|
||||||
(statFields & B_STAT_INTERIM_UPDATE) != 0
|
_GetInterestedMonitorListeners(device, directory,
|
||||||
? B_WATCH_INTERIM_STAT : B_WATCH_STAT,
|
B_WATCH_CHILDREN | watchFlag,
|
||||||
|
interestedListeners, interestedListenerCount);
|
||||||
|
}
|
||||||
|
// ... and for the node
|
||||||
|
_GetInterestedMonitorListeners(device, node, watchFlag,
|
||||||
interestedListeners, interestedListenerCount);
|
interestedListeners, interestedListenerCount);
|
||||||
|
|
||||||
if (interestedListenerCount == 0)
|
if (interestedListenerCount == 0)
|
||||||
@@ -775,8 +784,8 @@ NodeMonitorService::NotifyStatChanged(dev_t device, ino_t node,
|
|||||||
- another error code otherwise.
|
- another error code otherwise.
|
||||||
*/
|
*/
|
||||||
status_t
|
status_t
|
||||||
NodeMonitorService::NotifyAttributeChanged(dev_t device, ino_t node,
|
NodeMonitorService::NotifyAttributeChanged(dev_t device, ino_t directory,
|
||||||
const char *attribute, int32 cause)
|
ino_t node, const char *attribute, int32 cause)
|
||||||
{
|
{
|
||||||
if (!attribute)
|
if (!attribute)
|
||||||
return B_BAD_VALUE;
|
return B_BAD_VALUE;
|
||||||
@@ -789,6 +798,12 @@ NodeMonitorService::NotifyAttributeChanged(dev_t device, ino_t node,
|
|||||||
// ... for the volume
|
// ... for the volume
|
||||||
_GetInterestedVolumeListeners(device, B_WATCH_ATTR,
|
_GetInterestedVolumeListeners(device, B_WATCH_ATTR,
|
||||||
interestedListeners, interestedListenerCount);
|
interestedListeners, interestedListenerCount);
|
||||||
|
// ... for the directory
|
||||||
|
if (directory >= 0) {
|
||||||
|
_GetInterestedMonitorListeners(device, directory,
|
||||||
|
B_WATCH_CHILDREN | B_WATCH_ATTR,
|
||||||
|
interestedListeners, interestedListenerCount);
|
||||||
|
}
|
||||||
// ... for the node
|
// ... for the node
|
||||||
_GetInterestedMonitorListeners(device, node, B_WATCH_ATTR,
|
_GetInterestedMonitorListeners(device, node, B_WATCH_ATTR,
|
||||||
interestedListeners, interestedListenerCount);
|
interestedListeners, interestedListenerCount);
|
||||||
@@ -802,6 +817,8 @@ NodeMonitorService::NotifyAttributeChanged(dev_t device, ino_t node,
|
|||||||
message.SetTo(messageBuffer, sizeof(messageBuffer), B_NODE_MONITOR);
|
message.SetTo(messageBuffer, sizeof(messageBuffer), B_NODE_MONITOR);
|
||||||
message.AddInt32("opcode", B_ATTR_CHANGED);
|
message.AddInt32("opcode", B_ATTR_CHANGED);
|
||||||
message.AddInt32("device", device);
|
message.AddInt32("device", device);
|
||||||
|
if (directory >= 0)
|
||||||
|
message.AddInt64("directory", directory);
|
||||||
message.AddInt64("node", node);
|
message.AddInt64("node", node);
|
||||||
message.AddString("attr", attribute);
|
message.AddString("attr", attribute);
|
||||||
message.AddInt32("cause", cause); // Haiku only
|
message.AddInt32("cause", cause); // Haiku only
|
||||||
@@ -1155,9 +1172,11 @@ notify_entry_moved(dev_t device, ino_t fromDirectory,
|
|||||||
- another error code otherwise.
|
- another error code otherwise.
|
||||||
*/
|
*/
|
||||||
status_t
|
status_t
|
||||||
notify_stat_changed(dev_t device, ino_t node, uint32 statFields)
|
notify_stat_changed(dev_t device, ino_t directory, ino_t node,
|
||||||
|
uint32 statFields)
|
||||||
{
|
{
|
||||||
return sNodeMonitorService.NotifyStatChanged(device, node, statFields);
|
return sNodeMonitorService.NotifyStatChanged(device, directory, node,
|
||||||
|
statFields);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -1172,11 +1191,11 @@ notify_stat_changed(dev_t device, ino_t node, uint32 statFields)
|
|||||||
- another error code otherwise.
|
- another error code otherwise.
|
||||||
*/
|
*/
|
||||||
status_t
|
status_t
|
||||||
notify_attribute_changed(dev_t device, ino_t node, const char *attribute,
|
notify_attribute_changed(dev_t device, ino_t directory, ino_t node,
|
||||||
int32 cause)
|
const char *attribute, int32 cause)
|
||||||
{
|
{
|
||||||
return sNodeMonitorService.NotifyAttributeChanged(device, node, attribute,
|
return sNodeMonitorService.NotifyAttributeChanged(device, directory, node,
|
||||||
cause);
|
attribute, cause);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2002-2009, Axel Dörfler, axeld@pinc-software.de.
|
* Copyright 2002-2016, Axel Dörfler, axeld@pinc-software.de.
|
||||||
* Distributed under the terms of the MIT License.
|
* Distributed under the terms of the MIT License.
|
||||||
*
|
*
|
||||||
* Copyright 2001-2002, Travis Geiselbrecht. All rights reserved.
|
* Copyright 2001-2002, Travis Geiselbrecht. All rights reserved.
|
||||||
@@ -149,6 +149,15 @@ current_timespec()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static ino_t
|
||||||
|
get_parent_id(struct rootfs_vnode* vnode)
|
||||||
|
{
|
||||||
|
if (vnode->parent != NULL)
|
||||||
|
return vnode->parent->id;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static struct rootfs_vnode*
|
static struct rootfs_vnode*
|
||||||
rootfs_create_vnode(struct rootfs* fs, struct rootfs_vnode* parent,
|
rootfs_create_vnode(struct rootfs* fs, struct rootfs_vnode* parent,
|
||||||
const char* name, int type)
|
const char* name, int type)
|
||||||
@@ -264,7 +273,8 @@ rootfs_insert_in_dir(struct rootfs* fs, struct rootfs_vnode* dir,
|
|||||||
vnode->parent = dir;
|
vnode->parent = dir;
|
||||||
dir->modification_time = current_timespec();
|
dir->modification_time = current_timespec();
|
||||||
|
|
||||||
notify_stat_changed(fs->id, dir->id, B_STAT_MODIFICATION_TIME);
|
notify_stat_changed(fs->id, get_parent_id(dir), dir->id,
|
||||||
|
B_STAT_MODIFICATION_TIME);
|
||||||
return B_OK;
|
return B_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -289,7 +299,8 @@ rootfs_remove_from_dir(struct rootfs* fs, struct rootfs_vnode* dir,
|
|||||||
vnode->dir_next = NULL;
|
vnode->dir_next = NULL;
|
||||||
|
|
||||||
dir->modification_time = current_timespec();
|
dir->modification_time = current_timespec();
|
||||||
notify_stat_changed(fs->id, dir->id, B_STAT_MODIFICATION_TIME);
|
notify_stat_changed(fs->id, get_parent_id(dir), dir->id,
|
||||||
|
B_STAT_MODIFICATION_TIME);
|
||||||
return B_OK;
|
return B_OK;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1057,7 +1068,7 @@ rootfs_write_stat(fs_volume* _volume, fs_vnode* _vnode, const struct stat* stat,
|
|||||||
|
|
||||||
locker.Unlock();
|
locker.Unlock();
|
||||||
|
|
||||||
notify_stat_changed(fs->id, vnode->id, statMask);
|
notify_stat_changed(fs->id, get_parent_id(vnode), vnode->id, statMask);
|
||||||
return B_OK;
|
return B_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -33,16 +33,16 @@ fssh_notify_entry_moved(fssh_mount_id device, fssh_vnode_id fromDirectory,
|
|||||||
|
|
||||||
|
|
||||||
fssh_status_t
|
fssh_status_t
|
||||||
fssh_notify_stat_changed(fssh_mount_id device, fssh_vnode_id node,
|
fssh_notify_stat_changed(fssh_mount_id device, fssh_vnode_id dir,
|
||||||
uint32_t statFields)
|
fssh_vnode_id node, uint32_t statFields)
|
||||||
{
|
{
|
||||||
return FSSH_B_OK;
|
return FSSH_B_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
fssh_status_t
|
fssh_status_t
|
||||||
fssh_notify_attribute_changed(fssh_mount_id device, fssh_vnode_id node,
|
fssh_notify_attribute_changed(fssh_mount_id device, fssh_vnode_id dir,
|
||||||
const char *attribute, int32_t cause)
|
fssh_vnode_id node, const char *attribute, int32_t cause)
|
||||||
{
|
{
|
||||||
return FSSH_B_OK;
|
return FSSH_B_OK;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user