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