15eefd0feSDavid van Moolenbroek /* VTreeFS - stadir.c - file and file system status management */
2433d6423SLionel Sambuc
3433d6423SLionel Sambuc #include "inc.h"
4433d6423SLionel Sambuc
5693ad767SDavid van Moolenbroek /*
6693ad767SDavid van Moolenbroek * Retrieve file status.
7433d6423SLionel Sambuc */
8693ad767SDavid van Moolenbroek int
fs_stat(ino_t ino_nr,struct stat * buf)9693ad767SDavid van Moolenbroek fs_stat(ino_t ino_nr, struct stat * buf)
10693ad767SDavid van Moolenbroek {
11433d6423SLionel Sambuc char path[PATH_MAX];
12433d6423SLionel Sambuc time_t cur_time;
13433d6423SLionel Sambuc struct inode *node;
14433d6423SLionel Sambuc int r;
15433d6423SLionel Sambuc
160dc5c83eSDavid van Moolenbroek if ((node = find_inode(ino_nr)) == NULL)
17433d6423SLionel Sambuc return EINVAL;
18433d6423SLionel Sambuc
19433d6423SLionel Sambuc /* Fill in the basic info. */
200dc5c83eSDavid van Moolenbroek buf->st_mode = node->i_stat.mode;
210dc5c83eSDavid van Moolenbroek buf->st_nlink = !is_inode_deleted(node);
220dc5c83eSDavid van Moolenbroek buf->st_uid = node->i_stat.uid;
230dc5c83eSDavid van Moolenbroek buf->st_gid = node->i_stat.gid;
240dc5c83eSDavid van Moolenbroek buf->st_rdev = (dev_t) node->i_stat.dev;
250dc5c83eSDavid van Moolenbroek buf->st_size = node->i_stat.size;
26433d6423SLionel Sambuc
27433d6423SLionel Sambuc /* If it is a symbolic link, return the size of the link target. */
28433d6423SLionel Sambuc if (S_ISLNK(node->i_stat.mode) && vtreefs_hooks->rdlink_hook != NULL) {
29433d6423SLionel Sambuc r = vtreefs_hooks->rdlink_hook(node, path, sizeof(path),
30433d6423SLionel Sambuc get_inode_cbdata(node));
31433d6423SLionel Sambuc
32433d6423SLionel Sambuc if (r == OK)
330dc5c83eSDavid van Moolenbroek buf->st_size = strlen(path);
34433d6423SLionel Sambuc }
35433d6423SLionel Sambuc
36433d6423SLionel Sambuc /* Take the current time as file time for all files. */
37ad80a203SDavid van Moolenbroek cur_time = clock_time(NULL);
380dc5c83eSDavid van Moolenbroek buf->st_atime = cur_time;
390dc5c83eSDavid van Moolenbroek buf->st_mtime = cur_time;
400dc5c83eSDavid van Moolenbroek buf->st_ctime = cur_time;
41433d6423SLionel Sambuc
420dc5c83eSDavid van Moolenbroek return OK;
43433d6423SLionel Sambuc }
44433d6423SLionel Sambuc
45693ad767SDavid van Moolenbroek /*
465eefd0feSDavid van Moolenbroek * Change file mode.
475eefd0feSDavid van Moolenbroek */
485eefd0feSDavid van Moolenbroek int
fs_chmod(ino_t ino_nr,mode_t * mode)495eefd0feSDavid van Moolenbroek fs_chmod(ino_t ino_nr, mode_t * mode)
505eefd0feSDavid van Moolenbroek {
515eefd0feSDavid van Moolenbroek struct inode *node;
52*7c48de6cSDavid van Moolenbroek struct inode_stat istat;
535eefd0feSDavid van Moolenbroek int r;
545eefd0feSDavid van Moolenbroek
555eefd0feSDavid van Moolenbroek if ((node = find_inode(ino_nr)) == NULL)
565eefd0feSDavid van Moolenbroek return EINVAL;
575eefd0feSDavid van Moolenbroek
585eefd0feSDavid van Moolenbroek if (vtreefs_hooks->chstat_hook == NULL)
595eefd0feSDavid van Moolenbroek return ENOSYS;
605eefd0feSDavid van Moolenbroek
61*7c48de6cSDavid van Moolenbroek get_inode_stat(node, &istat);
625eefd0feSDavid van Moolenbroek
63*7c48de6cSDavid van Moolenbroek istat.mode = (istat.mode & ~ALL_MODES) | (*mode & ALL_MODES);
645eefd0feSDavid van Moolenbroek
65*7c48de6cSDavid van Moolenbroek r = vtreefs_hooks->chstat_hook(node, &istat, get_inode_cbdata(node));
665eefd0feSDavid van Moolenbroek
675eefd0feSDavid van Moolenbroek if (r != OK)
685eefd0feSDavid van Moolenbroek return r;
695eefd0feSDavid van Moolenbroek
70*7c48de6cSDavid van Moolenbroek get_inode_stat(node, &istat);
715eefd0feSDavid van Moolenbroek
72*7c48de6cSDavid van Moolenbroek *mode = istat.mode;
735eefd0feSDavid van Moolenbroek
745eefd0feSDavid van Moolenbroek return OK;
755eefd0feSDavid van Moolenbroek }
765eefd0feSDavid van Moolenbroek
775eefd0feSDavid van Moolenbroek /*
785eefd0feSDavid van Moolenbroek * Change file ownership.
795eefd0feSDavid van Moolenbroek */
805eefd0feSDavid van Moolenbroek int
fs_chown(ino_t ino_nr,uid_t uid,gid_t gid,mode_t * mode)815eefd0feSDavid van Moolenbroek fs_chown(ino_t ino_nr, uid_t uid, gid_t gid, mode_t * mode)
825eefd0feSDavid van Moolenbroek {
835eefd0feSDavid van Moolenbroek struct inode *node;
84*7c48de6cSDavid van Moolenbroek struct inode_stat istat;
855eefd0feSDavid van Moolenbroek int r;
865eefd0feSDavid van Moolenbroek
875eefd0feSDavid van Moolenbroek if ((node = find_inode(ino_nr)) == NULL)
885eefd0feSDavid van Moolenbroek return EINVAL;
895eefd0feSDavid van Moolenbroek
905eefd0feSDavid van Moolenbroek if (vtreefs_hooks->chstat_hook == NULL)
915eefd0feSDavid van Moolenbroek return ENOSYS;
925eefd0feSDavid van Moolenbroek
93*7c48de6cSDavid van Moolenbroek get_inode_stat(node, &istat);
945eefd0feSDavid van Moolenbroek
95*7c48de6cSDavid van Moolenbroek istat.uid = uid;
96*7c48de6cSDavid van Moolenbroek istat.gid = gid;
97*7c48de6cSDavid van Moolenbroek istat.mode &= ~(S_ISUID | S_ISGID);
985eefd0feSDavid van Moolenbroek
99*7c48de6cSDavid van Moolenbroek r = vtreefs_hooks->chstat_hook(node, &istat, get_inode_cbdata(node));
1005eefd0feSDavid van Moolenbroek
1015eefd0feSDavid van Moolenbroek if (r != OK)
1025eefd0feSDavid van Moolenbroek return r;
1035eefd0feSDavid van Moolenbroek
104*7c48de6cSDavid van Moolenbroek get_inode_stat(node, &istat);
1055eefd0feSDavid van Moolenbroek
106*7c48de6cSDavid van Moolenbroek *mode = istat.mode;
1075eefd0feSDavid van Moolenbroek
1085eefd0feSDavid van Moolenbroek return OK;
1095eefd0feSDavid van Moolenbroek }
1105eefd0feSDavid van Moolenbroek
1115eefd0feSDavid van Moolenbroek /*
112693ad767SDavid van Moolenbroek * Retrieve file system statistics.
113433d6423SLionel Sambuc */
114693ad767SDavid van Moolenbroek int
fs_statvfs(struct statvfs * buf)115693ad767SDavid van Moolenbroek fs_statvfs(struct statvfs * buf)
116693ad767SDavid van Moolenbroek {
117433d6423SLionel Sambuc
1180dc5c83eSDavid van Moolenbroek buf->f_flag = ST_NOTRUNC;
119c21aa858SCristiano Giuffrida buf->f_namemax = NAME_MAX;
120433d6423SLionel Sambuc
1210dc5c83eSDavid van Moolenbroek return OK;
122433d6423SLionel Sambuc }
123