return NT_STATUS_OK;
}
+static int atname_destructor(struct smb_filename *smb_fname)
+{
+ destroy_fsp_smb_fname_link(&smb_fname->fsp_link);
+ return 0;
+}
+
+/**
+ * Turn a path into a parent pathref and atname
+ *
+ * This returns the parent pathref in _parent and the name relative to it. If
+ * smb_fname was a pathref (ie smb_fname->fsp != NULL), then _atname will be a
+ * pathref as well, ie _atname->fsp will point at the same fsp as
+ * smb_fname->fsp.
+ **/
+NTSTATUS parent_pathref(TALLOC_CTX *mem_ctx,
+ struct files_struct *dirfsp,
+ const struct smb_filename *smb_fname,
+ struct smb_filename **_parent,
+ struct smb_filename **_atname)
+{
+ struct smb_filename *parent = NULL;
+ struct smb_filename *atname = NULL;
+ NTSTATUS status;
+ int ret;
+ bool ok;
+
+ ok = parent_smb_fname(mem_ctx,
+ smb_fname,
+ &parent,
+ &atname);
+ if (!ok) {
+ return NT_STATUS_NO_MEMORY;
+ }
+
+ ret = vfs_stat(dirfsp->conn, parent);
+ if (ret != 0) {
+ TALLOC_FREE(parent);
+ return map_nt_error_from_unix(errno);
+ }
+
+ status = openat_pathref_fsp(dirfsp, parent);
+ if (NT_STATUS_EQUAL(status, NT_STATUS_STOPPED_ON_SYMLINK)) {
+ status = NT_STATUS_OBJECT_NAME_NOT_FOUND;
+ }
+ if (!NT_STATUS_IS_OK(status)) {
+ TALLOC_FREE(parent);
+ return status;
+ }
+
+ if (smb_fname->fsp != NULL) {
+ status = fsp_smb_fname_link(smb_fname->fsp,
+ &atname->fsp_link,
+ &atname->fsp);
+ if (!NT_STATUS_IS_OK(status)) {
+ TALLOC_FREE(parent);
+ return status;
+ }
+ talloc_set_destructor(atname, atname_destructor);
+ }
+ *_parent = parent;
+ *_atname = atname;
+ return NT_STATUS_OK;
+}
+
/****************************************************************************
Close all open files for a connection.
****************************************************************************/
uint32_t flags,
struct smb_filename **_smb_fname);
+NTSTATUS parent_pathref(TALLOC_CTX *mem_ctx,
+ struct files_struct *dirfsp,
+ const struct smb_filename *smb_fname,
+ struct smb_filename **_parent,
+ struct smb_filename **_atname);
+
/* The following definitions come from smbd/ipc.c */
NTSTATUS nt_status_np_pipe(NTSTATUS status);