xref: /minix3/minix/lib/libvtreefs/stadir.c (revision 7c48de6cc4c6d56f2277d378dba01dbac8a8c3b9)
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