s3-talloc Change TALLOC_ARRAY() to talloc_array()
[samba.git] / source3 / modules / vfs_expand_msdfs.c
index 0d09d213e1177975a3cf7e535ebfd493e4a8173d..eb7c6fed6b5e17e6b58417d4a20de0fcc3fb7d42 100644 (file)
  */
 
 #include "includes.h"
+#include "system/filesys.h"
+#include "smbd/smbd.h"
+#include "../librpc/gen_ndr/ndr_netlogon.h"
+#include "smbd/globals.h"
+#include "auth.h"
 
 #undef DBGC_CLASS
 #define DBGC_CLASS DBGC_VFS
@@ -35,7 +40,8 @@
   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];
@@ -53,7 +59,6 @@ static char *read_target_host(TALLOC_CTX *ctx, const char *mapfile)
        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';
@@ -69,8 +74,7 @@ static char *read_target_host(TALLOC_CTX *ctx, const char *mapfile)
 
                *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;
                }
@@ -135,7 +139,9 @@ static char *expand_msdfs_target(TALLOC_CTX *ctx,
 
        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;
@@ -143,11 +149,11 @@ static char *expand_msdfs_target(TALLOC_CTX *ctx,
 
        targethost = talloc_sub_advanced(ctx,
                                lp_servicename(SNUM(conn)),
-                               conn->server_info->unix_name,
+                               conn->session_info->unix_name,
                                conn->connectpath,
-                               conn->server_info->utok.gid,
-                               conn->server_info->sanitized_username,
-                               pdb_get_domain(conn->server_info->sam_account),
+                               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));
@@ -172,21 +178,27 @@ static int expand_msdfs_readlink(struct vfs_handle_struct *handle,
 {
        TALLOC_CTX *ctx = talloc_tos();
        int result;
-       char *target = TALLOC_ARRAY(ctx, char, PATH_MAX+1);
+       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) {
@@ -195,21 +207,21 @@ static int expand_msdfs_readlink(struct vfs_handle_struct *handle,
                }
        }
 
-       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);
 }