1 /* VTreeFS - link.c - by Alen Stojanov and David van Moolenbroek */ 2 3 #include "inc.h" 4 5 /*===========================================================================* 6 * fs_rdlink * 7 *===========================================================================*/ 8 ssize_t fs_rdlink(ino_t ino_nr, struct fsdriver_data *data, size_t bytes) 9 { 10 /* Retrieve symbolic link target. 11 */ 12 char path[PATH_MAX]; 13 struct inode *node; 14 size_t len; 15 int r; 16 17 if ((node = find_inode(ino_nr)) == NULL) 18 return EINVAL; 19 20 /* Call the rdlink hook. */ 21 assert(vtreefs_hooks->rdlink_hook != NULL); 22 assert(!is_inode_deleted(node)); /* symlinks cannot be opened */ 23 24 r = vtreefs_hooks->rdlink_hook(node, path, sizeof(path), 25 get_inode_cbdata(node)); 26 if (r != OK) return r; 27 28 len = strlen(path); 29 assert(len > 0 && len < sizeof(path)); 30 31 if (len > bytes) 32 len = bytes; 33 34 /* Copy out the result. */ 35 if ((r = fsdriver_copyout(data, 0, path, len)) != OK) 36 return r; 37 38 return len; 39 } 40