static int skel_get_real_filename(struct vfs_handle_struct *handle, const char *path, const char *name, TALLOC_CTX *mem_ctx, char **found_name) { return SMB_VFS_NEXT_GET_REAL_FILENAME(handle, path, name, mem_ctx, found_name); }
static int vfs_gpfs_get_real_filename(struct vfs_handle_struct *handle, const char *path, const char *name, TALLOC_CTX *mem_ctx, char **found_name) { int result; char *full_path; char real_pathname[PATH_MAX+1]; int buflen; full_path = talloc_asprintf(talloc_tos(), "%s/%s", path, name); if (full_path == NULL) { errno = ENOMEM; return -1; } buflen = sizeof(real_pathname) - 1; result = smbd_gpfs_get_realfilename_path(full_path, real_pathname, &buflen); TALLOC_FREE(full_path); if ((result == -1) && (errno == ENOSYS)) { return SMB_VFS_NEXT_GET_REAL_FILENAME( handle, path, name, mem_ctx, found_name); } if (result == -1) { DEBUG(10, ("smbd_gpfs_get_realfilename_path returned %s\n", strerror(errno))); return -1; } /* * GPFS does not necessarily null-terminate the returned path * but instead returns the buffer length in buflen. */ if (buflen < sizeof(real_pathname)) { real_pathname[buflen] = '\0'; } else { real_pathname[sizeof(real_pathname)-1] = '\0'; } DEBUG(10, ("smbd_gpfs_get_realfilename_path: %s/%s -> %s\n", path, name, real_pathname)); name = strrchr_m(real_pathname, '/'); if (name == NULL) { errno = ENOENT; return -1; } *found_name = talloc_strdup(mem_ctx, name+1); if (*found_name == NULL) { errno = ENOMEM; return -1; } return 0; }