1 /* VTreeFS - link.c - by Alen Stojanov and David van Moolenbroek */ 2 3 #include "inc.h" 4 5 /*===========================================================================* 6 * fs_rdlink * 7 *===========================================================================*/ 8 int fs_rdlink(void) 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(fs_m_in.m_vfs_fs_rdlink.inode)) == 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 > fs_m_in.m_vfs_fs_rdlink.mem_size) 32 len = fs_m_in.m_vfs_fs_rdlink.mem_size; 33 34 /* Copy out the result. */ 35 r = sys_safecopyto(fs_m_in.m_source, fs_m_in.m_vfs_fs_rdlink.grant, 0, 36 (vir_bytes) path, len); 37 if (r != OK) return r; 38 39 fs_m_out.m_fs_vfs_rdlink.nbytes = len; 40 return OK; 41 } 42