minix/minix/lib/libvtreefs/stadir.c
Cristiano Giuffrida c21aa858e2 libvtreefs: dynamically allocate long inode names
Extended by David van Moolenbroek to continue using static buffers
for short inode names, so as to prevent important file system
services such as procfs from running out of memory at runtime.

Change-Id: I6f841741ee9944fc87dbdb78b5cdaa2abee9da76
2015-06-29 10:57:24 +00:00

123 lines
2.2 KiB
C

/* VTreeFS - stadir.c - file and file system status management */
#include "inc.h"
/*
* Retrieve file status.
*/
int
fs_stat(ino_t ino_nr, struct stat * buf)
{
char path[PATH_MAX];
time_t cur_time;
struct inode *node;
int r;
if ((node = find_inode(ino_nr)) == NULL)
return EINVAL;
/* Fill in the basic info. */
buf->st_mode = node->i_stat.mode;
buf->st_nlink = !is_inode_deleted(node);
buf->st_uid = node->i_stat.uid;
buf->st_gid = node->i_stat.gid;
buf->st_rdev = (dev_t) node->i_stat.dev;
buf->st_size = node->i_stat.size;
/* If it is a symbolic link, return the size of the link target. */
if (S_ISLNK(node->i_stat.mode) && vtreefs_hooks->rdlink_hook != NULL) {
r = vtreefs_hooks->rdlink_hook(node, path, sizeof(path),
get_inode_cbdata(node));
if (r == OK)
buf->st_size = strlen(path);
}
/* Take the current time as file time for all files. */
cur_time = clock_time(NULL);
buf->st_atime = cur_time;
buf->st_mtime = cur_time;
buf->st_ctime = cur_time;
return OK;
}
/*
* Change file mode.
*/
int
fs_chmod(ino_t ino_nr, mode_t * mode)
{
struct inode *node;
struct inode_stat stat;
int r;
if ((node = find_inode(ino_nr)) == NULL)
return EINVAL;
if (vtreefs_hooks->chstat_hook == NULL)
return ENOSYS;
get_inode_stat(node, &stat);
stat.mode = (stat.mode & ~ALL_MODES) | (*mode & ALL_MODES);
r = vtreefs_hooks->chstat_hook(node, &stat, get_inode_cbdata(node));
if (r != OK)
return r;
get_inode_stat(node, &stat);
*mode = stat.mode;
return OK;
}
/*
* Change file ownership.
*/
int
fs_chown(ino_t ino_nr, uid_t uid, gid_t gid, mode_t * mode)
{
struct inode *node;
struct inode_stat stat;
int r;
if ((node = find_inode(ino_nr)) == NULL)
return EINVAL;
if (vtreefs_hooks->chstat_hook == NULL)
return ENOSYS;
get_inode_stat(node, &stat);
stat.uid = uid;
stat.gid = gid;
stat.mode &= ~(S_ISUID | S_ISGID);
r = vtreefs_hooks->chstat_hook(node, &stat, get_inode_cbdata(node));
if (r != OK)
return r;
get_inode_stat(node, &stat);
*mode = stat.mode;
return OK;
}
/*
* Retrieve file system statistics.
*/
int
fs_statvfs(struct statvfs * buf)
{
buf->f_flag = ST_NOTRUNC;
buf->f_namemax = NAME_MAX;
return OK;
}