fsal_status_t WRAP_GPFSFSAL_readlink(fsal_handle_t * p_linkhandle, /* IN */ fsal_op_context_t * p_context, /* IN */ fsal_path_t * p_link_content, /* OUT */ fsal_attrib_list_t * p_link_attributes /* [ IN/OUT ] */ ) { return GPFSFSAL_readlink((gpfsfsal_handle_t *) p_linkhandle, (gpfsfsal_op_context_t *) p_context, p_link_content, p_link_attributes); }
static fsal_status_t readsymlink(struct fsal_obj_handle *obj_hdl, struct gsh_buffdesc *link_content, bool refresh) { fsal_errors_t fsal_error = ERR_FSAL_NO_ERROR; int retval = 0; struct gpfs_fsal_obj_handle *myself = NULL; fsal_status_t status; if (obj_hdl->type != SYMBOLIC_LINK) { fsal_error = ERR_FSAL_FAULT; goto out; } myself = container_of(obj_hdl, struct gpfs_fsal_obj_handle, obj_handle); if (refresh) { /* lazy load or LRU'd storage */ size_t retlink; char link_buff[PATH_MAX]; retlink = PATH_MAX - 1; if (myself->u.symlink.link_content != NULL) { gsh_free(myself->u.symlink.link_content); myself->u.symlink.link_content = NULL; myself->u.symlink.link_size = 0; } status = GPFSFSAL_readlink(obj_hdl, op_ctx, link_buff, &retlink); if (FSAL_IS_ERROR(status)) return status; myself->u.symlink.link_content = gsh_malloc(retlink + 1); memcpy(myself->u.symlink.link_content, link_buff, retlink); myself->u.symlink.link_content[retlink] = '\0'; myself->u.symlink.link_size = retlink + 1; } if (myself->u.symlink.link_content == NULL) { fsal_error = ERR_FSAL_FAULT; /* probably a better error?? */ goto out; } link_content->len = myself->u.symlink.link_size; link_content->addr = gsh_malloc(link_content->len); memcpy(link_content->addr, myself->u.symlink.link_content, link_content->len); out: return fsalstat(fsal_error, retval); }