device_open() gets the relative path from devfs mount point, not just the

name of the node.
devfs_read_stat() now (presumably temporary) sets the size of the device
for partitions and reports a block device rather than a character device
if the size unequals zero.


git-svn-id: file:///srv/svn/repos/haiku/trunk/current@9085 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Axel Dörfler
2004-09-28 03:22:56 +00:00
parent af069b1a47
commit da63fa920a
+59 -1
View File
@@ -588,6 +588,40 @@ out:
}
/** Construct complete device name (as used for device_open()).
* This is safe to use only when the device is in use (and therefore
* cannot be unpublished during the iteration).
*/
static void
get_device_name(struct devfs_vnode *vnode, char *buffer, size_t size)
{
struct devfs_vnode *leaf = vnode;
size_t offset = 0;
// count levels
for (; vnode->parent && vnode->parent != vnode; vnode = vnode->parent) {
offset += strlen(vnode->name) + 1;
}
// construct full path name
for (vnode = leaf; vnode->parent && vnode->parent != vnode; vnode = vnode->parent) {
size_t length = strlen(vnode->name);
size_t start = offset - length - 1;
if (size >= offset) {
strcpy(buffer + start, vnode->name);
if (vnode != leaf)
buffer[offset - 1] = '/';
}
offset = start;
}
}
// #pragma mark -
@@ -830,7 +864,10 @@ devfs_open(fs_volume _fs, fs_vnode _vnode, int openMode, fs_cookie *_cookie)
vnode->stream.u.dev.node->parent->cookie, openMode,
&cookie->u.dev.dcookie);
} else {
status = vnode->stream.u.dev.ops->open(vnode->name, openMode,
char buffer[B_FILE_NAME_LENGTH];
get_device_name(vnode, buffer, sizeof(buffer));
status = vnode->stream.u.dev.ops->open(buffer, openMode,
&cookie->u.dev.dcookie);
}
}
@@ -1220,6 +1257,27 @@ devfs_read_stat(fs_volume _fs, fs_vnode _vnode, struct stat *stat)
stat->st_mtime = stat->st_ctime = vnode->modification_time;
stat->st_crtime = vnode->creation_time;
// ToDo: this only works for partitions right now - if we should decide
// to keep this feature, we should have a better solution
if (S_ISCHR(vnode->stream.type)) {
//device_geometry geometry;
// if it's a real block device, then let's report a useful size
if (vnode->stream.u.dev.part_map != NULL) {
stat->st_size = vnode->stream.u.dev.part_map->size;
#if 0
} else if (vnode->stream.u.dev.info->control(cookie->u.dev.dcookie,
B_GET_GEOMETRY, &geometry, sizeof(struct device_geometry)) >= B_OK) {
stat->st_size = 1LL * geometry.head_count * geometry.cylinder_count
* geometry.sectors_per_track * geometry.bytes_per_sector;
#endif
}
// is this a real block device? then let's have it reported like that
if (stat->st_size != 0)
stat->st_mode = S_IFBLK | (vnode->stream.type & S_IUMSK);
}
return B_OK;
}