Added a devfs_publish_directory() function that just tries to make sure

that a path is available (like "mkdir -p").


git-svn-id: file:///srv/svn/repos/haiku/trunk/current@11015 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Axel Dörfler 2005-01-25 02:17:02 +00:00
parent 9d2a7c104c
commit 7ec59908da
1 changed files with 79 additions and 2 deletions

View File

@ -486,6 +486,71 @@ err1:
}
static status_t
publish_directory(struct devfs *fs, const char *path)
{
ASSERT_LOCKED_MUTEX(&fs->lock);
// copy the path over to a temp buffer so we can munge it
KPath tempPath(path);
char *temp = tempPath.LockBuffer();
// create the path leading to the device
// parse the path passed in, stripping out '/'
struct devfs_vnode *dir = fs->root_vnode;
struct devfs_vnode *vnode = NULL;
status_t status = B_OK;
int32 i = 0, last = 0;
for (;temp[last] ;) {
if (temp[i] == '/') {
temp[i] = '\0';
i++;
} else if (temp[i] != '\0') {
i++;
continue;
}
TRACE(("\tpath component '%s'\n", &temp[last]));
// we have a path component
vnode = devfs_find_in_dir(dir, &temp[last]);
if (vnode) {
if (S_ISDIR(vnode->stream.type)) {
last = i;
dir = vnode;
continue;
}
// we hit something on our path that's not a directory
status = B_FILE_EXISTS;
goto out;
} else {
vnode = devfs_create_vnode(fs, dir, &temp[last]);
if (!vnode) {
status = B_NO_MEMORY;
goto out;
}
}
// set up the new directory
vnode->stream.type = S_IFDIR | 0755;
vnode->stream.u.dir.dir_head = NULL;
vnode->stream.u.dir.jar_head = NULL;
hash_insert(sDeviceFileSystem->vnode_list_hash, vnode);
devfs_insert_in_dir(dir, vnode);
last = i;
dir = vnode;
}
out:
return status;
}
static status_t
publish_node(struct devfs *fs, const char *path, struct devfs_vnode **_node)
{
@ -505,10 +570,10 @@ publish_node(struct devfs *fs, const char *path, struct devfs_vnode **_node)
bool atLeaf = false;
for (;;) {
if (temp[i] == 0) {
if (temp[i] == '\0') {
atLeaf = true; // we'll be done after this one
} else if (temp[i] == '/') {
temp[i] = 0;
temp[i] = '\0';
i++;
} else {
i++;
@ -1756,3 +1821,15 @@ devfs_publish_device(const char *path, void *obsolete, device_hooks *ops)
return publish_device(sDeviceFileSystem, path, NULL, NULL, ops);
}
extern "C" status_t
devfs_publish_directory(const char *path)
{
mutex_lock(&sDeviceFileSystem->lock);
status_t status = publish_directory(sDeviceFileSystem, path);
mutex_unlock(&sDeviceFileSystem->lock);
return status;
}