return NT_STATUS_NOT_IMPLEMENTED;
}
-static int skel_get_real_filename(struct vfs_handle_struct *handle,
- const struct smb_filename *path,
- const char *name,
- TALLOC_CTX *mem_ctx, char **found_name)
+static NTSTATUS skel_get_real_filename(struct vfs_handle_struct *handle,
+ const struct smb_filename *path,
+ const char *name,
+ TALLOC_CTX *mem_ctx,
+ char **found_name)
{
- errno = ENOSYS;
- return -1;
+ return NT_STATUS_NOT_IMPLEMENTED;
}
static const char *skel_connectpath(struct vfs_handle_struct *handle,
streams);
}
-static int skel_get_real_filename(struct vfs_handle_struct *handle,
- const struct smb_filename *path,
- const char *name,
- TALLOC_CTX *mem_ctx, char **found_name)
+static NTSTATUS skel_get_real_filename(struct vfs_handle_struct *handle,
+ const struct smb_filename *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);
* Version 46 - Rename SMB_VFS_KERNEL_FLOCK to SMB_VFS_FILESYSTEM_SHAREMODE
* Version 46 - Add flags and xferlen args to SMB_VFS_OFFLOAD_READ_RECV
* Version 46 - Add SMB_VFS_FSTATAT
+ * Version 46 - Change SMB_VFS_GET_REAL_FILENAME to return NTSTATUS
*/
#define SMB_VFS_INTERFACE_VERSION 46
unsigned int *num_streams,
struct stream_struct **streams);
- int (*get_real_filename_fn)(struct vfs_handle_struct *handle,
- const struct smb_filename *path,
- const char *name,
- TALLOC_CTX *mem_ctx,
- char **found_name);
+ NTSTATUS (*get_real_filename_fn)(struct vfs_handle_struct *handle,
+ const struct smb_filename *path,
+ const char *name,
+ TALLOC_CTX *mem_ctx,
+ char **found_name);
const char *(*connectpath_fn)(struct vfs_handle_struct *handle,
const struct smb_filename *smb_fname);
TALLOC_CTX *mem_ctx,
unsigned int *num_streams,
struct stream_struct **streams);
-int smb_vfs_call_get_real_filename(struct vfs_handle_struct *handle,
- const struct smb_filename *path,
- const char *name,
- TALLOC_CTX *mem_ctx,
- char **found_name);
+NTSTATUS smb_vfs_call_get_real_filename(struct vfs_handle_struct *handle,
+ const struct smb_filename *path,
+ const char *name,
+ TALLOC_CTX *mem_ctx,
+ char **found_name);
const char *smb_vfs_call_connectpath(struct vfs_handle_struct *handle,
const struct smb_filename *smb_fname);
NTSTATUS smb_vfs_call_brl_lock_windows(struct vfs_handle_struct *handle,
TALLOC_CTX *mem_ctx,
unsigned int *num_streams,
struct stream_struct **streams);
-int vfs_not_implemented_get_real_filename(struct vfs_handle_struct *handle,
- const struct smb_filename *path,
- const char *name,
- TALLOC_CTX *mem_ctx,
- char **found_name);
+NTSTATUS vfs_not_implemented_get_real_filename(
+ struct vfs_handle_struct *handle,
+ const struct smb_filename *path,
+ const char *name,
+ TALLOC_CTX *mem_ctx,
+ char **found_name);
const char *vfs_not_implemented_connectpath(struct vfs_handle_struct *handle,
const struct smb_filename *smb_fname);
NTSTATUS vfs_not_implemented_brl_lock_windows(struct vfs_handle_struct *handle,
return -1;
}
-static int cephwrap_get_real_filename(struct vfs_handle_struct *handle,
- const struct smb_filename *path,
- const char *name,
- TALLOC_CTX *mem_ctx,
- char **found_name)
+static NTSTATUS cephwrap_get_real_filename(
+ struct vfs_handle_struct *handle,
+ const struct smb_filename *path,
+ const char *name,
+ TALLOC_CTX *mem_ctx,
+ char **found_name)
{
/*
* Don't fall back to get_real_filename so callers can differentiate
* between a full directory scan and an actual case-insensitive stat.
*/
- errno = EOPNOTSUPP;
- return -1;
+ return NT_STATUS_NOT_SUPPORTED;
}
static const char *cephwrap_connectpath(struct vfs_handle_struct *handle,
aname, value, size, flags);
}
-static int ceph_snap_gmt_get_real_filename(struct vfs_handle_struct *handle,
- const struct smb_filename *path,
- const char *name,
- TALLOC_CTX *mem_ctx,
- char **found_name)
+static NTSTATUS ceph_snap_gmt_get_real_filename(
+ struct vfs_handle_struct *handle,
+ const struct smb_filename *path,
+ const char *name,
+ TALLOC_CTX *mem_ctx,
+ char **found_name)
{
time_t timestamp = 0;
char stripped[PATH_MAX + 1];
char conv[PATH_MAX + 1];
struct smb_filename conv_fname;
int ret;
+ NTSTATUS status;
ret = ceph_snap_gmt_strip_snapshot(handle, path,
×tamp, stripped, sizeof(stripped));
if (ret < 0) {
- errno = -ret;
- return -1;
+ return map_nt_error_from_unix(-ret);
}
if (timestamp == 0) {
return SMB_VFS_NEXT_GET_REAL_FILENAME(handle, path, name,
ret = ceph_snap_gmt_convert_dir(handle, stripped,
timestamp, conv, sizeof(conv));
if (ret < 0) {
- errno = -ret;
- return -1;
+ return map_nt_error_from_unix(-ret);
}
conv_fname = (struct smb_filename) {
.base_name = conv,
};
- ret = SMB_VFS_NEXT_GET_REAL_FILENAME(handle, &conv_fname, name,
- mem_ctx, found_name);
- return ret;
+ status = SMB_VFS_NEXT_GET_REAL_FILENAME(
+ handle, &conv_fname, name, mem_ctx, found_name);
+ return status;
}
static uint64_t ceph_snap_gmt_disk_free(vfs_handle_struct *handle,
return NT_STATUS_OK;
}
-static int vfswrap_get_real_filename(struct vfs_handle_struct *handle,
- const struct smb_filename *path,
- const char *name,
- TALLOC_CTX *mem_ctx,
- char **found_name)
+static NTSTATUS vfswrap_get_real_filename(struct vfs_handle_struct *handle,
+ const struct smb_filename *path,
+ const char *name,
+ TALLOC_CTX *mem_ctx,
+ char **found_name)
{
/*
* Don't fall back to get_real_filename so callers can differentiate
* between a full directory scan and an actual case-insensitive stat.
*/
- errno = EOPNOTSUPP;
- return -1;
+ return NT_STATUS_NOT_SUPPORTED;
}
static const char *vfswrap_connectpath(struct vfs_handle_struct *handle,
return result;
}
-static int smb_full_audit_get_real_filename(struct vfs_handle_struct *handle,
- const struct smb_filename *path,
- const char *name,
- TALLOC_CTX *mem_ctx,
- char **found_name)
+static NTSTATUS smb_full_audit_get_real_filename(
+ struct vfs_handle_struct *handle,
+ const struct smb_filename *path,
+ const char *name,
+ TALLOC_CTX *mem_ctx,
+ char **found_name)
{
- int result;
+ NTSTATUS result;
result = SMB_VFS_NEXT_GET_REAL_FILENAME(handle, path, name, mem_ctx,
found_name);
- do_log(SMB_VFS_OP_GET_REAL_FILENAME, (result == 0), handle,
+ do_log(SMB_VFS_OP_GET_REAL_FILENAME,
+ NT_STATUS_IS_OK(result),
+ handle,
"%s/%s->%s",
- path->base_name, name, (result == 0) ? *found_name : "");
+ path->base_name,
+ name,
+ NT_STATUS_IS_OK(result) ? *found_name : "");
return result;
}
return -1;
}
-static int vfs_gluster_get_real_filename(struct vfs_handle_struct *handle,
- const struct smb_filename *path,
- const char *name,
- TALLOC_CTX *mem_ctx,
- char **found_name)
+static NTSTATUS vfs_gluster_get_real_filename(
+ struct vfs_handle_struct *handle,
+ const struct smb_filename *path,
+ const char *name,
+ TALLOC_CTX *mem_ctx,
+ char **found_name)
{
int ret;
char key_buf[GLUSTER_NAME_MAX + 64];
char val_buf[GLUSTER_NAME_MAX + 1];
if (strlen(name) >= GLUSTER_NAME_MAX) {
- errno = ENAMETOOLONG;
- return -1;
+ return NT_STATUS_OBJECT_NAME_INVALID;
}
snprintf(key_buf, GLUSTER_NAME_MAX + 64,
if (errno == ENOATTR) {
errno = ENOENT;
}
- return -1;
+ return map_nt_error_from_unix(errno);
}
*found_name = talloc_strdup(mem_ctx, val_buf);
if (found_name[0] == NULL) {
- errno = ENOMEM;
- return -1;
+ return NT_STATUS_NO_MEMORY;
}
- return 0;
+ return NT_STATUS_OK;
}
static const char *vfs_gluster_connectpath(struct vfs_handle_struct *handle,
#define GLUSTER_NAME_MAX 255
-static int vfs_gluster_fuse_get_real_filename(struct vfs_handle_struct *handle,
- const struct smb_filename *path,
- const char *name,
- TALLOC_CTX *mem_ctx,
- char **_found_name)
+static NTSTATUS vfs_gluster_fuse_get_real_filename(
+ struct vfs_handle_struct *handle,
+ const struct smb_filename *path,
+ const char *name,
+ TALLOC_CTX *mem_ctx,
+ char **_found_name)
{
int ret;
char key_buf[GLUSTER_NAME_MAX + 64];
char *found_name = NULL;
if (strlen(name) >= GLUSTER_NAME_MAX) {
- errno = ENAMETOOLONG;
- return -1;
+ return NT_STATUS_OBJECT_NAME_INVALID;
}
snprintf(key_buf, GLUSTER_NAME_MAX + 64,
if (errno == ENOATTR) {
errno = ENOENT;
}
- return -1;
+ return map_nt_error_from_unix(errno);
}
found_name = talloc_strdup(mem_ctx, val_buf);
if (found_name == NULL) {
- errno = ENOMEM;
- return -1;
+ return NT_STATUS_NO_MEMORY;
}
*_found_name = found_name;
- return 0;
+ return NT_STATUS_OK;
}
struct device_mapping_entry {
}
#endif /* HAVE_KERNEL_OPLOCKS_LINUX */
-static int vfs_gpfs_get_real_filename(struct vfs_handle_struct *handle,
- const struct smb_filename *path,
- const char *name,
- TALLOC_CTX *mem_ctx,
- char **found_name)
+static NTSTATUS vfs_gpfs_get_real_filename(struct vfs_handle_struct *handle,
+ const struct smb_filename *path,
+ const char *name,
+ TALLOC_CTX *mem_ctx,
+ char **found_name)
{
int result;
char *full_path = NULL;
SMB_VFS_HANDLE_GET_DATA(handle, config,
struct gpfs_config_data,
- return -1);
+ return NT_STATUS_INTERNAL_ERROR);
if (!config->getrealfilename) {
return SMB_VFS_NEXT_GET_REAL_FILENAME(handle, path, name,
tmpbuf, sizeof(tmpbuf),
&full_path, &to_free);
if (full_path_len == -1) {
- errno = ENOMEM;
- return -1;
+ return NT_STATUS_NO_MEMORY;
}
buflen = sizeof(real_pathname) - 1;
if (result == -1) {
DEBUG(10, ("smbd_gpfs_get_realfilename_path returned %s\n",
strerror(errno)));
- return -1;
+ return map_nt_error_from_unix(errno);
}
/*
name = strrchr_m(real_pathname, '/');
if (name == NULL) {
- errno = ENOENT;
- return -1;
+ return NT_STATUS_OBJECT_NAME_NOT_FOUND;
}
*found_name = talloc_strdup(mem_ctx, name+1);
if (*found_name == NULL) {
- errno = ENOMEM;
- return -1;
+ return NT_STATUS_NO_MEMORY;
}
- return 0;
+ return NT_STATUS_OK;
}
static void sd2gpfs_control(uint16_t control, struct gpfs_acl *gacl)
}
_PUBLIC_
-int vfs_not_implemented_get_real_filename(struct vfs_handle_struct *handle,
- const struct smb_filename *path,
- const char *name,
- TALLOC_CTX *mem_ctx,
- char **found_name)
+NTSTATUS vfs_not_implemented_get_real_filename(
+ struct vfs_handle_struct *handle,
+ const struct smb_filename *path,
+ const char *name,
+ TALLOC_CTX *mem_ctx,
+ char **found_name)
{
- errno = ENOSYS;
- return -1;
+ return NT_STATUS_NOT_IMPLEMENTED;
}
_PUBLIC_
return status;
}
-static int shadow_copy2_get_real_filename(struct vfs_handle_struct *handle,
- const struct smb_filename *fname,
- const char *name,
- TALLOC_CTX *mem_ctx,
- char **found_name)
+static NTSTATUS shadow_copy2_get_real_filename(
+ struct vfs_handle_struct *handle,
+ const struct smb_filename *fname,
+ const char *name,
+ TALLOC_CTX *mem_ctx,
+ char **found_name)
{
struct shadow_copy2_private *priv = NULL;
struct shadow_copy2_config *config = NULL;
time_t timestamp = 0;
char *stripped = NULL;
- ssize_t ret;
- int saved_errno = 0;
char *conv;
struct smb_filename conv_fname;
+ NTSTATUS status;
SMB_VFS_HANDLE_GET_DATA(handle, priv, struct shadow_copy2_private,
- return -1);
+ return NT_STATUS_INTERNAL_ERROR);
config = priv->config;
DBG_DEBUG("Path=[%s] name=[%s]\n", smb_fname_str_dbg(fname), name);
if (!shadow_copy2_strip_snapshot(talloc_tos(), handle, fname,
×tamp, &stripped)) {
+ status = map_nt_error_from_unix(errno);
DEBUG(10, ("shadow_copy2_strip_snapshot failed\n"));
- return -1;
+ return status;
}
if (timestamp == 0) {
DEBUG(10, ("timestamp == 0\n"));
conv = shadow_copy2_convert(talloc_tos(), handle, stripped, timestamp);
if (conv == NULL) {
+ status = map_nt_error_from_unix(errno);
+
if (!config->snapdirseverywhere) {
DBG_DEBUG("shadow_copy2_convert [%s] failed\n", stripped);
- return -1;
+ return status;
}
/*
DBG_DEBUG("Use stripped [%s] as conv\n", stripped);
conv = talloc_strdup(talloc_tos(), stripped);
if (conv == NULL) {
- TALLOC_FREE(stripped);
- return -1;
+ return NT_STATUS_NO_MEMORY;
}
}
DEBUG(10, ("Calling NEXT_GET_REAL_FILE_NAME for conv=[%s], "
"name=[%s]\n", conv, name));
- ret = SMB_VFS_NEXT_GET_REAL_FILENAME(handle, &conv_fname, name,
- mem_ctx, found_name);
- DEBUG(10, ("NEXT_REAL_FILE_NAME returned %d\n", (int)ret));
- if (ret == 0) {
- return 0;
+ status = SMB_VFS_NEXT_GET_REAL_FILENAME(
+ handle, &conv_fname, name, mem_ctx, found_name);
+ DEBUG(10, ("NEXT_REAL_FILE_NAME returned %s\n", nt_errstr(status)));
+ if (NT_STATUS_IS_OK(status)) {
+ return NT_STATUS_OK;
}
- if (errno != EOPNOTSUPP) {
+ if (!NT_STATUS_EQUAL(status, NT_STATUS_NOT_SUPPORTED)) {
TALLOC_FREE(conv);
- errno = EOPNOTSUPP;
- return -1;
+ return NT_STATUS_NOT_SUPPORTED;
}
- ret = get_real_filename_full_scan(handle->conn,
- conv,
- name,
- false,
- mem_ctx,
- found_name);
- if (ret != 0) {
- saved_errno = errno;
+ status = get_real_filename_full_scan(handle->conn,
+ conv,
+ name,
+ false,
+ mem_ctx,
+ found_name);
+ if (!NT_STATUS_IS_OK(status)) {
DBG_DEBUG("Scan [%s] for [%s] failed\n",
conv, name);
- errno = saved_errno;
- return -1;
+ return status;
}
DBG_DEBUG("Scan [%s] for [%s] returned [%s]\n",
conv, name, *found_name);
TALLOC_FREE(conv);
- return 0;
+ return NT_STATUS_OK;
}
static const char *shadow_copy2_connectpath(struct vfs_handle_struct *handle,
aname, value, size, flags);
}
-static int snapper_gmt_get_real_filename(struct vfs_handle_struct *handle,
- const struct smb_filename *fpath,
- const char *name,
- TALLOC_CTX *mem_ctx,
- char **found_name)
+static NTSTATUS snapper_gmt_get_real_filename(
+ struct vfs_handle_struct *handle,
+ const struct smb_filename *fpath,
+ const char *name,
+ TALLOC_CTX *mem_ctx,
+ char **found_name)
{
time_t timestamp;
char *stripped;
- ssize_t ret;
- int saved_errno;
char *conv;
struct smb_filename conv_fname;
+ NTSTATUS status;
if (!snapper_gmt_strip_snapshot(talloc_tos(), handle, fpath,
×tamp, &stripped)) {
- return -1;
+ return NT_STATUS_NO_MEMORY;
}
if (timestamp == 0) {
return SMB_VFS_NEXT_GET_REAL_FILENAME(handle, fpath, name,
if (stripped[0] == '\0') {
*found_name = talloc_strdup(mem_ctx, name);
if (*found_name == NULL) {
- errno = ENOMEM;
- return -1;
+ return NT_STATUS_NO_MEMORY;
}
- return 0;
+ return NT_STATUS_OK;
}
conv = snapper_gmt_convert(talloc_tos(), handle, stripped, timestamp);
TALLOC_FREE(stripped);
if (conv == NULL) {
- return -1;
+ return map_nt_error_from_unix(errno);
}
conv_fname = (struct smb_filename) {
.base_name = conv,
};
- ret = SMB_VFS_NEXT_GET_REAL_FILENAME(handle, &conv_fname, name,
- mem_ctx, found_name);
- saved_errno = errno;
+ status = SMB_VFS_NEXT_GET_REAL_FILENAME(
+ handle, &conv_fname, name, mem_ctx, found_name);
TALLOC_FREE(conv);
- errno = saved_errno;
- return ret;
+ return status;
}
static uint64_t snapper_gmt_disk_free(vfs_handle_struct *handle,
return result;
}
-static int smb_time_audit_get_real_filename(struct vfs_handle_struct *handle,
- const struct smb_filename *path,
- const char *name,
- TALLOC_CTX *mem_ctx,
- char **found_name)
+static NTSTATUS smb_time_audit_get_real_filename(
+ struct vfs_handle_struct *handle,
+ const struct smb_filename *path,
+ const char *name,
+ TALLOC_CTX *mem_ctx,
+ char **found_name)
{
- int result;
+ NTSTATUS result;
struct timespec ts1,ts2;
double timediff;
char *talloced = NULL;
char *pathreal = NULL;
char *found_name = NULL;
- int ret;
+ NTSTATUS status;
SET_STAT_INVALID(*pst);
* Try case-insensitive stat if the fs has the ability. This avoids
* scanning the whole directory.
*/
- ret = SMB_VFS_GET_REAL_FILENAME(dptr->conn,
- dptr->smb_dname,
- dptr->wcard,
- ctx,
- &found_name);
- if (ret == 0) {
+ status = SMB_VFS_GET_REAL_FILENAME(dptr->conn,
+ dptr->smb_dname,
+ dptr->wcard,
+ ctx,
+ &found_name);
+ if (NT_STATUS_IS_OK(status)) {
name = found_name;
goto clean;
- } else if (errno == ENOENT) {
+ } else if (NT_STATUS_EQUAL(status, NT_STATUS_OBJECT_NAME_NOT_FOUND)) {
/* The case-insensitive lookup was authoritative. */
goto clean;
}
#include "smbd/smbd.h"
#include "smbd/globals.h"
-static int get_real_filename(connection_struct *conn,
- struct smb_filename *path,
- const char *name,
- TALLOC_CTX *mem_ctx,
- char **found_name);
+static NTSTATUS get_real_filename(connection_struct *conn,
+ struct smb_filename *path,
+ const char *name,
+ TALLOC_CTX *mem_ctx,
+ char **found_name);
static NTSTATUS check_name(connection_struct *conn,
const struct smb_filename *smb_fname);
bool short_case_preserve;
};
-static NTSTATUS unix_convert_step_search_fail(struct uc_state *state)
+static NTSTATUS unix_convert_step_search_fail(
+ struct uc_state *state, NTSTATUS status)
{
char *unmangled;
* to NT_STATUS_OBJECT_PATH_NOT_FOUND
* in the filename walk.
*/
-
- if (errno == ENOENT ||
- errno == ENOTDIR ||
- errno == ELOOP)
- {
- return NT_STATUS_OBJECT_PATH_NOT_FOUND;
+ if (NT_STATUS_EQUAL(status, NT_STATUS_OBJECT_NAME_NOT_FOUND) ||
+ NT_STATUS_EQUAL(status, NT_STATUS_STOPPED_ON_SYMLINK) ||
+ NT_STATUS_EQUAL(status, NT_STATUS_NOT_A_DIRECTORY)) {
+ status = NT_STATUS_OBJECT_PATH_NOT_FOUND;
}
- return map_nt_error_from_unix(errno);
+ return status;
}
/*
* here.
*/
- if (errno == EACCES) {
+ if (NT_STATUS_EQUAL(status, NT_STATUS_ACCESS_DENIED)) {
if ((state->ucf_flags & UCF_PREP_CREATEFILE) == 0) {
/*
* Could be a symlink pointing to
* error out of filename_convert().
*/
int ret;
- NTSTATUS status;
struct smb_filename dname = (struct smb_filename) {
.base_name = state->dirpath,
.twrp = state->smb_fname->twrp,
* nevertheless want to allow
* users creating a file.
*/
- errno = 0;
+ status = NT_STATUS_OK;
}
}
- if ((errno != 0) && (errno != ENOENT)) {
+ if (!NT_STATUS_IS_OK(status) &&
+ !NT_STATUS_EQUAL(status, NT_STATUS_OBJECT_NAME_NOT_FOUND)) {
/*
* ENOTDIR and ELOOP both map to
* NT_STATUS_OBJECT_PATH_NOT_FOUND
* in the filename walk.
*/
- if (errno == ENOTDIR || errno == ELOOP) {
- return NT_STATUS_OBJECT_PATH_NOT_FOUND;
+ if (NT_STATUS_EQUAL(status, NT_STATUS_NOT_A_DIRECTORY) ||
+ NT_STATUS_EQUAL(status, NT_STATUS_STOPPED_ON_SYMLINK)) {
+ status = NT_STATUS_OBJECT_PATH_NOT_FOUND;
}
- return map_nt_error_from_unix(errno);
+ return status;
}
/*
char dot[2] = ".";
char *found_name = NULL;
int ret;
+ NTSTATUS status;
/*
* Check if the name exists up to this point.
dname.base_name = dot;
}
- ret = get_real_filename(state->conn,
- &dname,
- state->name,
- talloc_tos(),
- &found_name);
- if (ret != 0) {
- return unix_convert_step_search_fail(state);
+ status = get_real_filename(state->conn,
+ &dname,
+ state->name,
+ talloc_tos(),
+ &found_name);
+ if (!NT_STATUS_IS_OK(status)) {
+ return unix_convert_step_search_fail(state, status);
}
/*
If the name looks like a mangled name then try via the mangling functions
****************************************************************************/
-int get_real_filename_full_scan(connection_struct *conn,
- const char *path,
- const char *name,
- bool mangled,
- TALLOC_CTX *mem_ctx,
- char **found_name)
+NTSTATUS get_real_filename_full_scan(connection_struct *conn,
+ const char *path,
+ const char *name,
+ bool mangled,
+ TALLOC_CTX *mem_ctx,
+ char **found_name)
{
struct smb_Dir *cur_dir = NULL;
const char *dname = NULL;
* there, then the original stat(2) would have found it.
*/
if (!mangled && !(conn->fs_capabilities & FILE_CASE_SENSITIVE_SEARCH)) {
- errno = ENOENT;
- return -1;
+ return NT_STATUS_OBJECT_NAME_NOT_FOUND;
}
/*
0);
if (smb_fname == NULL) {
TALLOC_FREE(unmangled_name);
- return -1;
+ return NT_STATUS_NO_MEMORY;
}
/* open the directory */
nt_errstr(status));
TALLOC_FREE(unmangled_name);
TALLOC_FREE(smb_fname);
- errno = map_errno_from_nt_status(status);
- return -1;
+ return status;
}
TALLOC_FREE(smb_fname);
TALLOC_FREE(unmangled_name);
TALLOC_FREE(cur_dir);
if (!*found_name) {
- errno = ENOMEM;
TALLOC_FREE(talloced);
- return -1;
+ return NT_STATUS_NO_MEMORY;
}
TALLOC_FREE(talloced);
- return 0;
+ return NT_STATUS_OK;
}
TALLOC_FREE(talloced);
}
TALLOC_FREE(unmangled_name);
TALLOC_FREE(cur_dir);
- errno = ENOENT;
- return -1;
+ return NT_STATUS_OBJECT_NAME_NOT_FOUND;
}
/****************************************************************************
fallback.
****************************************************************************/
-static int get_real_filename(connection_struct *conn,
- struct smb_filename *path,
- const char *name,
- TALLOC_CTX *mem_ctx,
- char **found_name)
+static NTSTATUS get_real_filename(connection_struct *conn,
+ struct smb_filename *path,
+ const char *name,
+ TALLOC_CTX *mem_ctx,
+ char **found_name)
{
- int ret;
+ NTSTATUS status;
bool mangled;
mangled = mangle_is_mangled(name, conn->params);
}
/* Try the vfs first to take advantage of case-insensitive stat. */
- ret = SMB_VFS_GET_REAL_FILENAME(conn,
- path,
- name,
- mem_ctx,
- found_name);
+ status = SMB_VFS_GET_REAL_FILENAME(conn,
+ path,
+ name,
+ mem_ctx,
+ found_name);
/*
* If the case-insensitive stat was successful, or returned an error
* other than EOPNOTSUPP then there is no need to fall back on the
* full directory scan.
*/
- if (ret == 0 || (ret == -1 && errno != EOPNOTSUPP)) {
- return ret;
+ if (NT_STATUS_IS_OK(status) ||
+ !NT_STATUS_EQUAL(status, NT_STATUS_NOT_SUPPORTED)) {
+ return status;
}
return get_real_filename_full_scan(conn,
NTSTATUS canonicalize_snapshot_path(struct smb_filename *smb_fname,
uint32_t ucf_flags,
NTTIME twrp);
-int get_real_filename_full_scan(connection_struct *conn,
- const char *path,
- const char *name,
- bool mangled,
- TALLOC_CTX *mem_ctx,
- char **found_name);
+NTSTATUS get_real_filename_full_scan(connection_struct *conn,
+ const char *path,
+ const char *name,
+ bool mangled,
+ TALLOC_CTX *mem_ctx,
+ char **found_name);
char *get_original_lcomp(TALLOC_CTX *ctx,
connection_struct *conn,
const char *filename_in,
num_streams, streams);
}
-int smb_vfs_call_get_real_filename(struct vfs_handle_struct *handle,
- const struct smb_filename *path,
- const char *name,
- TALLOC_CTX *mem_ctx,
- char **found_name)
+NTSTATUS smb_vfs_call_get_real_filename(struct vfs_handle_struct *handle,
+ const struct smb_filename *path,
+ const char *name,
+ TALLOC_CTX *mem_ctx,
+ char **found_name)
{
VFS_FIND(get_real_filename);
return handle->fns->get_real_filename_fn(handle, path, name, mem_ctx,