#endif
size_t bufsize = 0;
char *link_target = NULL;
- struct smb_filename *smb_fname = NULL;
- NTSTATUS status;
+ struct smb_filename smb_fname;
if (pp_link_target) {
bufsize = 1024;
link_target = link_target_buf;
}
- status = create_synthetic_smb_fname(talloc_tos(), path, NULL, NULL,
- &smb_fname);
- if (!NT_STATUS_IS_OK(status)) {
- goto err;
- }
+ ZERO_STRUCT(smb_fname);
+ smb_fname.base_name = discard_const_p(char, path);
- if (SMB_VFS_LSTAT(conn, smb_fname) != 0) {
+ if (SMB_VFS_LSTAT(conn, &smb_fname) != 0) {
DEBUG(5,("is_msdfs_link_read_target: %s does not exist.\n",
path));
- TALLOC_FREE(smb_fname);
goto err;
}
- if (!S_ISLNK(smb_fname->st.st_ex_mode)) {
+ if (!S_ISLNK(smb_fname.st.st_ex_mode)) {
DEBUG(5,("is_msdfs_link_read_target: %s is not a link.\n",
path));
- TALLOC_FREE(smb_fname);
goto err;
}
if (sbufp != NULL) {
- *sbufp = smb_fname->st;
+ *sbufp = smb_fname.st;
}
- TALLOC_FREE(smb_fname);
referral_len = SMB_VFS_READLINK(conn, path, link_target, bufsize - 1);
if (referral_len == -1) {
conn->connectpath, pdp->reqpath));
/*
- * Note the unix path conversion here we're doing we can
+ * Note the unix path conversion here we're doing we
* throw away. We're looking for a symlink for a dfs
* resolution, if we don't find it we'll do another
* unix_convert later in the codepath.
- * If we needed to remember what we'd resolved in
- * dp->reqpath (as the original code did) we'd
- * copy (localhost, dp->reqpath) on any code
- * path below that returns True - but I don't
- * think this is needed. JRA.
*/
status = unix_convert(ctx, conn, pdp->reqpath, &smb_fname,
NT_STATUS_OBJECT_PATH_NOT_FOUND)) {
return status;
}
-
- /* Create an smb_fname to use below. */
- status = create_synthetic_smb_fname(ctx, pdp->reqpath, NULL,
- NULL, &smb_fname);
- if (!NT_STATUS_IS_OK(status)) {
+ if (smb_fname == NULL || smb_fname->base_name == NULL) {
return status;
}
}
**********************************************************************/
NTSTATUS get_referred_path(TALLOC_CTX *ctx,
+ struct auth_serversupplied_info *server_info,
const char *dfs_path,
struct junction_map *jucn,
int *consumedcntp,
snum = lp_servicenumber(jucn->service_name);
if(snum < 0) {
fstring service_name;
- fstrcpy(service_name, jucn->service_name);
- if ((snum = find_service(service_name)) < 0) {
+ if ((snum = find_service(jucn->service_name, service_name)) < 0) {
return NT_STATUS_NOT_FOUND;
}
TALLOC_FREE(jucn->service_name);
}
status = create_conn_struct(ctx, &conn, snum, lp_pathname(snum),
- NULL, &oldpath);
+ server_info, &oldpath);
if (!NT_STATUS_IS_OK(status)) {
TALLOC_FREE(pdp);
return status;
}
/* The following call can change cwd. */
- *pstatus = get_referred_path(ctx, pathnamep, junction,
- &consumedcnt, &self_referral);
+ *pstatus = get_referred_path(ctx, orig_conn->server_info,
+ pathnamep, junction,
+ &consumedcnt, &self_referral);
if (!NT_STATUS_IS_OK(*pstatus)) {
vfs_ChDir(orig_conn,orig_conn->connectpath);
talloc_destroy(ctx);
{
size_t cnt = 0;
SMB_STRUCT_DIR *dirp = NULL;
- char *dname = NULL;
+ const char *dname = NULL;
+ char *talloced = NULL;
const char *connect_path = lp_pathname(snum);
const char *msdfs_proxy = lp_msdfs_proxy(snum);
connection_struct *conn;
goto out;
}
- while ((dname = vfs_readdirname(conn, dirp, NULL)) != NULL) {
+ while ((dname = vfs_readdirname(conn, dirp, NULL, &talloced))
+ != NULL) {
if (is_msdfs_link(conn,
dname,
NULL)) {
cnt++;
}
+ TALLOC_FREE(talloced);
}
SMB_VFS_CLOSEDIR(conn,dirp);
{
size_t cnt = 0;
SMB_STRUCT_DIR *dirp = NULL;
- char *dname = NULL;
+ const char *dname = NULL;
+ char *talloced = NULL;
const char *connect_path = lp_pathname(snum);
char *service_name = lp_servicename(snum);
const char *msdfs_proxy = lp_msdfs_proxy(snum);
goto out;
}
- while ((dname = vfs_readdirname(conn, dirp, NULL)) != NULL) {
+ while ((dname = vfs_readdirname(conn, dirp, NULL, &talloced))
+ != NULL) {
char *link_target = NULL;
if (cnt >= jn_remain) {
DEBUG(2, ("form_junctions: ran out of MSDFS "
"junction slots"));
+ TALLOC_FREE(talloced);
goto out;
}
if (is_msdfs_link_internal(ctx,
dname);
if (!jucn[cnt].service_name ||
!jucn[cnt].volume_name) {
+ TALLOC_FREE(talloced);
goto out;
}
jucn[cnt].comment = "";
}
TALLOC_FREE(link_target);
}
+ TALLOC_FREE(talloced);
}
out:
connection_struct *conn,
bool dfs_pathnames,
const char *name_in,
+ bool allow_wcards,
char **pp_name_out,
bool *ppath_contains_wcard)
{
status = dfs_redirect(ctx,
conn,
name_in,
- True,
+ allow_wcards,
pp_name_out,
&path_contains_wcard);