*/
#include "includes.h"
+#include "../librpc/gen_ndr/ndr_netlogon.h"
+#include "smbd/globals.h"
#undef DBGC_CLASS
#define DBGC_CLASS DBGC_VFS
-extern userdom_struct current_user_info;
-
/**********************************************************
Under mapfile we expect a table of the following format:
This is to redirect a DFS client to a host close to it.
***********************************************************/
-static char *read_target_host(TALLOC_CTX *ctx, const char *mapfile)
+static char *read_target_host(TALLOC_CTX *ctx, const char *mapfile,
+ const char *clientaddr)
{
XFILE *f;
char buf[1024];
DEBUG(10, ("Scanning mapfile [%s]\n", mapfile));
while (x_fgets(buf, sizeof(buf), f) != NULL) {
- char addr[INET6_ADDRSTRLEN];
if ((strlen(buf) > 0) && (buf[strlen(buf)-1] == '\n'))
buf[strlen(buf)-1] = '\0';
*space = '\0';
- if (strncmp(client_addr(get_client_fd(),addr,sizeof(addr)),
- buf, strlen(buf)) == 0) {
+ if (strncmp(clientaddr, buf, strlen(buf)) == 0) {
found = true;
break;
}
DEBUG(10, ("Expanding from table [%s]\n", mapfilename));
- if ((targethost = read_target_host(ctx, mapfilename)) == NULL) {
+ targethost = read_target_host(
+ ctx, conn->sconn->client_id.addr, mapfilename);
+ if (targethost == NULL) {
DEBUG(1, ("Could not expand target host from file %s\n",
mapfilename));
return NULL;
targethost = talloc_sub_advanced(ctx,
lp_servicename(SNUM(conn)),
- conn->user,
+ conn->session_info->unix_name,
conn->connectpath,
- conn->server_info->gid,
- get_current_username(),
- current_user_info.domain,
+ conn->session_info->utok.gid,
+ conn->session_info->sanitized_username,
+ conn->session_info->info3->base.domain.string,
targethost);
DEBUG(10, ("Expanded targethost to %s\n", targethost));
TALLOC_CTX *ctx = talloc_tos();
int result;
char *target = TALLOC_ARRAY(ctx, char, PATH_MAX+1);
+ size_t len;
if (!target) {
errno = ENOMEM;
return -1;
}
+ if (bufsiz == 0) {
+ errno = EINVAL;
+ return -1;
+ }
+
result = SMB_VFS_NEXT_READLINK(handle, path, target,
PATH_MAX);
- if (result < 0)
+ if (result <= 0)
return result;
target[result] = '\0';
- if ((strncmp(target, "msdfs:", strlen("msdfs:")) == 0) &&
+ if ((strncmp(target, "msdfs:", 6) == 0) &&
(strchr_m(target, '@') != NULL)) {
target = expand_msdfs_target(ctx, handle->conn, target);
if (!target) {
}
}
- safe_strcpy(buf, target, bufsiz-1);
- return strlen(buf);
-}
+ len = MIN(bufsiz, strlen(target));
+
+ memcpy(buf, target, len);
-/* VFS operations structure */
+ TALLOC_FREE(target);
+ return len;
+}
-static vfs_op_tuple expand_msdfs_ops[] = {
- {SMB_VFS_OP(expand_msdfs_readlink), SMB_VFS_OP_READLINK,
- SMB_VFS_LAYER_TRANSPARENT},
- {SMB_VFS_OP(NULL), SMB_VFS_OP_NOOP, SMB_VFS_LAYER_NOOP}
+static struct vfs_fn_pointers vfs_expand_msdfs_fns = {
+ .vfs_readlink = expand_msdfs_readlink
};
NTSTATUS vfs_expand_msdfs_init(void);
NTSTATUS vfs_expand_msdfs_init(void)
{
return smb_register_vfs(SMB_VFS_INTERFACE_VERSION, "expand_msdfs",
- expand_msdfs_ops);
+ &vfs_expand_msdfs_fns);
}