* @param type
* The entry type (regular file - VREG, symbolic link - VLNK,
* or directory - VDIR)
+ * @param mode
+ * The mode bits of the newly created node
* @return
* Pointer to the new ramfs_node
*/
-struct ramfs_node *ramfs_allocate_node(const char *name, int type);
+struct ramfs_node *ramfs_allocate_node(const char *name, int type, mode_t mode);
/**
* Frees a ramfs node.
}
struct ramfs_node *
-ramfs_allocate_node(const char *name, int type)
+ramfs_allocate_node(const char *name, int type, mode_t mode)
{
struct ramfs_node *np;
strlcpy(np->rn_name, name, np->rn_namelen + 1);
np->rn_type = type;
+ mode &= 0777;
if (type == VDIR)
- np->rn_mode = S_IFDIR|0777;
+ np->rn_mode = S_IFDIR|mode;
else if (type == VLNK)
np->rn_mode = S_IFLNK|0777;
else
- np->rn_mode = S_IFREG|0777;
+ np->rn_mode = S_IFREG|mode;
set_times_to_now(&(np->rn_ctime), &(np->rn_atime), &(np->rn_mtime));
np->rn_owns_buf = true;
}
static struct ramfs_node *
-ramfs_add_node(struct ramfs_node *dnp, const char *name, int type)
+ramfs_add_node(struct ramfs_node *dnp, const char *name, int type, mode_t mode)
{
struct ramfs_node *np, *prev;
- np = ramfs_allocate_node(name, type);
+ np = ramfs_allocate_node(name, type, mode);
if (np == NULL)
return NULL;
if (!S_ISDIR(mode))
return EINVAL;
- np = ramfs_add_node(dvp->v_data, name, VDIR);
+ np = ramfs_add_node(dvp->v_data, name, VDIR, mode);
if (np == NULL)
return ENOMEM;
np->rn_size = 0;
if (strlen(name) > NAME_MAX)
return ENAMETOOLONG;
- np = ramfs_add_node(dvp->v_data, name, VLNK);
+ np = ramfs_add_node(dvp->v_data, name, VLNK, 0);
if (np == NULL)
return ENOMEM;
if (!S_ISREG(mode))
return EINVAL;
- np = ramfs_add_node(dvp->v_data, name, VREG);
+ np = ramfs_add_node(dvp->v_data, name, VREG, mode);
if (np == NULL)
return ENOMEM;
return 0;
} else {
/* Create new file or directory */
old_np = vp1->v_data;
- np = ramfs_add_node(dvp2->v_data, name2, old_np->rn_type);
+ np = ramfs_add_node(dvp2->v_data, name2,
+ old_np->rn_type, old_np->rn_mode);
if (np == NULL)
return ENOMEM;