xref: /minix3/minix/fs/isofs/link.c (revision c2f99d7c3a4651d2e8e327e073e38f0a52de0376)
1*c2f99d7cSDavid van Moolenbroek #include "inc.h"
2*c2f99d7cSDavid van Moolenbroek 
3*c2f99d7cSDavid van Moolenbroek ssize_t fs_rdlink(ino_t ino_nr, struct fsdriver_data *data, size_t bytes)
4*c2f99d7cSDavid van Moolenbroek {
5*c2f99d7cSDavid van Moolenbroek 	struct inode *i_node;
6*c2f99d7cSDavid van Moolenbroek 	size_t len;
7*c2f99d7cSDavid van Moolenbroek 	int r;
8*c2f99d7cSDavid van Moolenbroek 
9*c2f99d7cSDavid van Moolenbroek 	/* Try to get inode according to its index */
10*c2f99d7cSDavid van Moolenbroek 	if ((i_node = find_inode(ino_nr)) == NULL)
11*c2f99d7cSDavid van Moolenbroek 		return EINVAL; /* no inode found */
12*c2f99d7cSDavid van Moolenbroek 
13*c2f99d7cSDavid van Moolenbroek 	if (!S_ISLNK(i_node->i_stat.st_mode))
14*c2f99d7cSDavid van Moolenbroek 		return EACCES;
15*c2f99d7cSDavid van Moolenbroek 
16*c2f99d7cSDavid van Moolenbroek 	len = strlen(i_node->s_link);
17*c2f99d7cSDavid van Moolenbroek 	if (len > bytes)
18*c2f99d7cSDavid van Moolenbroek 		len = bytes;
19*c2f99d7cSDavid van Moolenbroek 
20*c2f99d7cSDavid van Moolenbroek 	if ((r = fsdriver_copyout(data, 0, i_node->s_link, len)) != OK)
21*c2f99d7cSDavid van Moolenbroek 		return r;
22*c2f99d7cSDavid van Moolenbroek 
23*c2f99d7cSDavid van Moolenbroek 	return len;
24*c2f99d7cSDavid van Moolenbroek }
25