diff options
-rw-r--r-- | source3/modules/vfs_onefs.c | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/source3/modules/vfs_onefs.c b/source3/modules/vfs_onefs.c index 860a3ae7d9..123139f729 100644 --- a/source3/modules/vfs_onefs.c +++ b/source3/modules/vfs_onefs.c @@ -205,6 +205,45 @@ static int onefs_statvfs(vfs_handle_struct *handle, const char *path, return result; } +static int onefs_get_real_filename(vfs_handle_struct *handle, const char *path, + const char *name, TALLOC_CTX *mem_ctx, + char **found_name) +{ + SMB_STRUCT_STAT sb; + struct stat_extra se; + int result; + char *full_name = NULL; + + ZERO_STRUCT(se); + se.se_version = ESTAT_CURRENT_VERSION; + se.se_flags = ESTAT_CASE_INSENSITIVE | ESTAT_SYMLINK_NOFOLLOW; + + if (*path != '\0') { + if (!(full_name = talloc_asprintf(mem_ctx, "%s/%s", path, name))) { + errno = ENOMEM; + DEBUG(2, ("talloc_asprintf failed\n")); + result = -1; + goto done; + } + } + + if ((result = estat(full_name ? full_name : name, &sb, &se)) != 0) { + DEBUG(2, ("error calling estat: %s\n", strerror(errno))); + goto done; + } + + *found_name = talloc_strdup(mem_ctx, se.se_realname); + if (*found_name == NULL) { + errno = ENOMEM; + result = -1; + goto done; + } + +done: + TALLOC_FREE(full_name); + return result; +} + static int onefs_ntimes(vfs_handle_struct *handle, const char *fname, struct smb_file_time *ft) { @@ -302,6 +341,8 @@ static vfs_op_tuple onefs_ops[] = { SMB_VFS_LAYER_OPAQUE}, {SMB_VFS_OP(onefs_statvfs), SMB_VFS_OP_STATVFS, SMB_VFS_LAYER_OPAQUE}, + {SMB_VFS_OP(onefs_get_real_filename), SMB_VFS_OP_GET_REAL_FILENAME, + SMB_VFS_LAYER_OPAQUE}, {SMB_VFS_OP(NULL), SMB_VFS_OP_NOOP, SMB_VFS_LAYER_NOOP} }; |