NTTIME twrp,
struct files_struct **_dirfsp,
struct smb_filename **_smb_fname,
- struct open_symlink_err **_symlink_err)
+ struct reparse_data_buffer **_symlink_err)
{
struct smb_filename *smb_dirname = NULL;
struct smb_filename *smb_fname_rel = NULL;
struct smb_filename *smb_fname = NULL;
- struct open_symlink_err *symlink_err = NULL;
+ struct reparse_data_buffer *symlink_err = NULL;
const bool posix = (ucf_flags & UCF_POSIX_PATHNAMES);
char *dirname = NULL;
const char *fname_rel = NULL;
if (NT_STATUS_EQUAL(status, NT_STATUS_STOPPED_ON_SYMLINK)) {
struct symlink_reparse_struct
- *lnk = &symlink_err->reparse->parsed.lnk;
+ *lnk = &symlink_err->parsed.lnk;
size_t unparsed = lnk->unparsed_path_length;
size_t name_in_len, dirname_len;
* Upper layers might need the link target. Here we
* still have the relname around, get the symlink err.
*/
- status = create_open_symlink_err(mem_ctx,
- smb_dirname->fsp,
- smb_fname_rel,
- &symlink_err);
+ status = read_symlink_reparse(mem_ctx,
+ smb_dirname->fsp,
+ smb_fname_rel,
+ &symlink_err);
if (!NT_STATUS_IS_OK(status)) {
DBG_DEBUG("Could not read symlink for %s: %s\n",
smb_fname_str_dbg(
struct files_struct **_dirfsp,
struct smb_filename **_smb_fname)
{
- struct open_symlink_err *symlink_err = NULL;
+ struct reparse_data_buffer *symlink_err = NULL;
struct symlink_reparse_struct *lnk = NULL;
NTSTATUS status;
char *target = NULL;
if (!NT_STATUS_EQUAL(status, NT_STATUS_STOPPED_ON_SYMLINK)) {
return status;
}
- lnk = &symlink_err->reparse->parsed.lnk;
+ lnk = &symlink_err->parsed.lnk;
/*
* If we're on an MSDFS share, see if this is
return (*dir) != NULL;
}
-NTSTATUS create_open_symlink_err(TALLOC_CTX *mem_ctx,
- files_struct *dirfsp,
- struct smb_filename *smb_relname,
- struct open_symlink_err **_err)
-{
- struct open_symlink_err *err = NULL;
- NTSTATUS status;
-
- err = talloc_zero(mem_ctx, struct open_symlink_err);
- if (err == NULL) {
- return NT_STATUS_NO_MEMORY;
- }
-
- status = read_symlink_reparse(err, dirfsp, smb_relname, &err->reparse);
- if (!NT_STATUS_IS_OK(status)) {
- TALLOC_FREE(err);
- return status;
- }
-
- *_err = err;
- return NT_STATUS_OK;
-}
-
/*
* Create the memcache-key for GETREALFILENAME_CACHE: This supplements
* the stat cache for the last component to be looked up. Cache
return fd;
}
-NTSTATUS openat_pathref_fsp_nosymlink(TALLOC_CTX *mem_ctx,
- struct connection_struct *conn,
- struct files_struct *in_dirfsp,
- const char *path_in,
- NTTIME twrp,
- bool posix,
- struct smb_filename **_smb_fname,
- struct open_symlink_err **_symlink_err)
+NTSTATUS openat_pathref_fsp_nosymlink(
+ TALLOC_CTX *mem_ctx,
+ struct connection_struct *conn,
+ struct files_struct *in_dirfsp,
+ const char *path_in,
+ NTTIME twrp,
+ bool posix,
+ struct smb_filename **_smb_fname,
+ struct reparse_data_buffer **_symlink_err)
{
struct files_struct *dirfsp = in_dirfsp;
struct smb_filename full_fname = {
.flags = full_fname.flags,
};
struct smb_filename *result = NULL;
- struct open_symlink_err *symlink_err = NULL;
+ struct reparse_data_buffer *symlink_err = NULL;
struct files_struct *fsp = NULL;
char *path = NULL, *next = NULL;
bool ok, is_toplevel;
* below.
*/
- status = create_open_symlink_err(mem_ctx,
- dirfsp,
- &rel_fname,
- &symlink_err);
+ status = read_symlink_reparse(mem_ctx,
+ dirfsp,
+ &rel_fname,
+ &symlink_err);
if (!NT_STATUS_IS_OK(status)) {
- DBG_DEBUG("create_open_symlink_err failed: %s\n",
+ DBG_DEBUG("read_symlink_reparse failed: %s\n",
nt_errstr(status));
goto fail;
}
* freadlink.
*/
- status = create_open_symlink_err(mem_ctx,
- dirfsp,
- NULL,
- &symlink_err);
+ status = read_symlink_reparse(mem_ctx,
+ dirfsp,
+ NULL,
+ &symlink_err);
if (!NT_STATUS_IS_OK(status)) {
- DBG_DEBUG("create_open_symlink_err failed: %s\n",
+ DBG_DEBUG("read_symlink_reparse failed: %s\n",
nt_errstr(status));
status = NT_STATUS_NOT_A_DIRECTORY;
goto fail;
goto fail;
}
- symlink_err->reparse->parsed.lnk
- .unparsed_path_length = unparsed;
+ symlink_err->parsed.lnk.unparsed_path_length = unparsed;
status = NT_STATUS_STOPPED_ON_SYMLINK;
goto fail;
* Last component was a symlink we opened with O_PATH, fail it
* here.
*/
- status = create_open_symlink_err(mem_ctx,
- fsp,
- NULL,
- &symlink_err);
+ status = read_symlink_reparse(mem_ctx,
+ fsp,
+ NULL,
+ &symlink_err);
if (!NT_STATUS_IS_OK(status)) {
return status;
}
struct files_struct **_base_fsp,
struct smb_filename *smb_fname);
-struct open_symlink_err {
- struct reparse_data_buffer *reparse;
-};
+struct reparse_data_buffer;
-NTSTATUS create_open_symlink_err(TALLOC_CTX *mem_ctx,
- files_struct *dirfsp,
- struct smb_filename *smb_relname,
- struct open_symlink_err **_err);
-
-NTSTATUS openat_pathref_fsp_nosymlink(TALLOC_CTX *mem_ctx,
- struct connection_struct *conn,
- struct files_struct *dirfsp,
- const char *path_in,
- NTTIME twrp,
- bool posix,
- struct smb_filename **_smb_fname,
- struct open_symlink_err **_symlink_err);
+NTSTATUS openat_pathref_fsp_nosymlink(
+ TALLOC_CTX *mem_ctx,
+ struct connection_struct *conn,
+ struct files_struct *dirfsp,
+ const char *path_in,
+ NTTIME twrp,
+ bool posix,
+ struct smb_filename **_smb_fname,
+ struct reparse_data_buffer **_symlink_err);
NTSTATUS openat_pathref_fsp_lcomp(struct files_struct *dirfsp,
struct smb_filename *smb_fname_rel,
uint32_t ucf_flags);
struct smb_filename *smb_relname,
char **_substitute);
-struct reparse_data_buffer;
-
NTSTATUS read_symlink_reparse(TALLOC_CTX *mem_ctx,
struct files_struct *dirfsp,
struct smb_filename *smb_relname,