Fix problems with event context not being the parent.
[gd/samba-autobuild/.git] / source4 / torture / rpc / dfs.c
index afa647e71c3858133dbf54b367822a37f22b904b..56564769229e210053192cdd4370125731e9168c 100644 (file)
@@ -1,19 +1,19 @@
-/* 
+/*
    Unix SMB/CIFS implementation.
    test suite for rpc dfs operations
 
    Copyright (C) Andrew Tridgell 2003
-   
+
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
+   the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.
-   
+
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.
-   
+
    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
                return true;\
        }\
 
-static bool test_NetShareAdd(TALLOC_CTX *mem_ctx, const char *host, const char *sharename, const char *dir)
+static bool test_NetShareAdd(TALLOC_CTX *mem_ctx,
+                            struct torture_context *tctx,
+                            const char *host,
+                            const char *sharename,
+                            const char *dir)
 {
        NTSTATUS status;
        struct srvsvc_NetShareInfo2 i;
@@ -52,7 +56,7 @@ static bool test_NetShareAdd(TALLOC_CTX *mem_ctx, const char *host, const char *
 
        printf("Creating share %s\n", sharename);
 
-       if (!(libnetctx = libnet_context_init(NULL))) {
+       if (!(libnetctx = libnet_context_init(tctx->ev, tctx->lp_ctx))) {
                return false;
        }
 
@@ -73,7 +77,7 @@ static bool test_NetShareAdd(TALLOC_CTX *mem_ctx, const char *host, const char *
 
        status = libnet_AddShare(libnetctx, mem_ctx, &r);
        if (!NT_STATUS_IS_OK(status)) {
-               d_printf("Failed to add new share: %s (%s)\n", 
+               d_printf("Failed to add new share: %s (%s)\n",
                        nt_errstr(status), r.out.error_string);
                return false;
        }
@@ -81,7 +85,10 @@ static bool test_NetShareAdd(TALLOC_CTX *mem_ctx, const char *host, const char *
        return true;
 }
 
-static bool test_NetShareDel(TALLOC_CTX *mem_ctx, const char *host, const char *sharename)
+static bool test_NetShareDel(TALLOC_CTX *mem_ctx,
+                            struct torture_context *tctx,
+                            const char *host,
+                            const char *sharename)
 {
        NTSTATUS status;
        struct libnet_context* libnetctx;
@@ -89,7 +96,7 @@ static bool test_NetShareDel(TALLOC_CTX *mem_ctx, const char *host, const char *
 
        printf("Deleting share %s\n", sharename);
 
-       if (!(libnetctx = libnet_context_init(NULL))) {
+       if (!(libnetctx = libnet_context_init(tctx->ev, tctx->lp_ctx))) {
                return false;
        }
 
@@ -100,7 +107,7 @@ static bool test_NetShareDel(TALLOC_CTX *mem_ctx, const char *host, const char *
 
        status = libnet_DelShare(libnetctx, mem_ctx, &r);
        if (!NT_STATUS_IS_OK(status)) {
-               d_printf("Failed to delete share: %s (%s)\n", 
+               d_printf("Failed to delete share: %s (%s)\n",
                        nt_errstr(status), r.out.error_string);
                return false;
        }
@@ -108,15 +115,16 @@ static bool test_NetShareDel(TALLOC_CTX *mem_ctx, const char *host, const char *
        return true;
 }
 
-static bool test_CreateDir(TALLOC_CTX *mem_ctx, 
-                          struct smbcli_state **cli, 
-                          const char *host, 
-                          const char *share, 
+static bool test_CreateDir(TALLOC_CTX *mem_ctx,
+                          struct smbcli_state **cli,
+                          struct torture_context *tctx,
+                          const char *host,
+                          const char *share,
                           const char *dir)
 {
        printf("Creating directory %s\n", dir);
 
-       if (!torture_open_connection_share(mem_ctx, cli, host, share, NULL)) {
+       if (!torture_open_connection_share(mem_ctx, cli, tctx, host, share, NULL)) {
                return false;
        }
 
@@ -127,19 +135,23 @@ static bool test_CreateDir(TALLOC_CTX *mem_ctx,
        return true;
 }
 
-static bool test_DeleteDir(struct smbcli_state *cli, const char *dir)
+static bool test_DeleteDir(struct smbcli_state *cli,
+                          const char *dir)
 {
        printf("Deleting directory %s\n", dir);
 
        if (smbcli_deltree(cli->tree, dir) == -1) {
-               printf("Unable to delete dir %s - %s\n", dir, smbcli_errstr(cli->tree));
+               printf("Unable to delete dir %s - %s\n", dir,
+                       smbcli_errstr(cli->tree));
                return false;
        }
 
        return true;
 }
 
-static bool test_GetManagerVersion(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, enum dfs_ManagerVersion *version)
+static bool test_GetManagerVersion(struct dcerpc_pipe *p,
+                                  TALLOC_CTX *mem_ctx,
+                                  enum dfs_ManagerVersion *version)
 {
        NTSTATUS status;
        struct dfs_GetManagerVersion r;
@@ -155,7 +167,9 @@ static bool test_GetManagerVersion(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, e
        return true;
 }
 
-static bool test_ManagerInitialize(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, const char *host)
+static bool test_ManagerInitialize(struct dcerpc_pipe *p,
+                                  TALLOC_CTX *mem_ctx,
+                                  const char *host)
 {
        NTSTATUS status;
        enum dfs_ManagerVersion version;
@@ -175,7 +189,8 @@ static bool test_ManagerInitialize(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, c
                printf("ManagerInitialize failed - %s\n", nt_errstr(status));
                return false;
        } else if (!W_ERROR_IS_OK(r.out.result)) {
-               printf("dfs_ManagerInitialize failed - %s\n", win_errstr(r.out.result));
+               printf("dfs_ManagerInitialize failed - %s\n",
+                       win_errstr(r.out.result));
                IS_DFS_VERSION_UNSUPPORTED_CALL_W2K3(version, r.out.result);
                return false;
        }
@@ -183,7 +198,9 @@ static bool test_ManagerInitialize(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, c
        return true;
 }
 
-static bool test_GetInfoLevel(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, uint16_t level,
+static bool test_GetInfoLevel(struct dcerpc_pipe *p,
+                             TALLOC_CTX *mem_ctx,
+                             uint16_t level,
                              const char *root)
 {
        NTSTATUS status;
@@ -200,7 +217,7 @@ static bool test_GetInfoLevel(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, uint16
        if (!NT_STATUS_IS_OK(status)) {
                printf("GetInfo failed - %s\n", nt_errstr(status));
                return false;
-       } else if (!W_ERROR_IS_OK(r.out.result) && 
+       } else if (!W_ERROR_IS_OK(r.out.result) &&
                   !W_ERROR_EQUAL(WERR_NO_MORE_ITEMS, r.out.result)) {
                printf("dfs_GetInfo failed - %s\n", win_errstr(r.out.result));
                return false;
@@ -209,7 +226,9 @@ static bool test_GetInfoLevel(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, uint16
        return true;
 }
 
-static bool test_GetInfo(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, const char *root)
+static bool test_GetInfo(struct dcerpc_pipe *p,
+                        TALLOC_CTX *mem_ctx,
+                        const char *root)
 {
        bool ret = true;
        /* 103, 104, 105, 106 is only available on Set */
@@ -224,7 +243,10 @@ static bool test_GetInfo(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, const char
        return ret;
 }
 
-static bool test_EnumLevelEx(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, uint16_t level, const char *dfs_name)
+static bool test_EnumLevelEx(struct dcerpc_pipe *p,
+                            TALLOC_CTX *mem_ctx,
+                            uint16_t level,
+                            const char *dfs_name)
 {
        NTSTATUS status;
        struct dfs_EnumEx rex;
@@ -233,7 +255,7 @@ static bool test_EnumLevelEx(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, uint16_
        struct dfs_Info1 s;
        struct dfs_EnumArray1 e1;
        bool ret = true;
-       
+
        rex.in.level = level;
        rex.in.bufsize = (uint32_t)-1;
        rex.in.total = &total;
@@ -257,7 +279,8 @@ static bool test_EnumLevelEx(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, uint16_
        if (level == 1 && rex.out.total) {
                int i;
                for (i=0;i<*rex.out.total;i++) {
-                       const char *root = talloc_strdup(mem_ctx, rex.out.info->e.info1->s[i].path);
+                       const char *root = talloc_strdup(mem_ctx,
+                               rex.out.info->e.info1->s[i].path);
                        if (!test_GetInfo(p, mem_ctx, root)) {
                                ret = false;
                        }
@@ -268,9 +291,12 @@ static bool test_EnumLevelEx(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, uint16_
                int i,k;
                for (i=0;i<*rex.out.total;i++) {
                        uint16_t levels[] = {1, 2, 3, 4, 200}; /* 300 */
-                       const char *root = talloc_strdup(mem_ctx, rex.out.info->e.info300->s[i].dom_root);
+                       const char *root = talloc_strdup(mem_ctx,
+                               rex.out.info->e.info300->s[i].dom_root);
                        for (k=0;k<ARRAY_SIZE(levels);k++) {
-                               if (!test_EnumLevelEx(p, mem_ctx, levels[k], root)) {
+                               if (!test_EnumLevelEx(p, mem_ctx,
+                                                     levels[k], root))
+                               {
                                        ret = false;
                                }
                        }
@@ -284,7 +310,9 @@ static bool test_EnumLevelEx(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, uint16_
 }
 
 
-static bool test_EnumLevel(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, uint16_t level)
+static bool test_EnumLevel(struct dcerpc_pipe *p,
+                          TALLOC_CTX *mem_ctx,
+                          uint16_t level)
 {
        NTSTATUS status;
        struct dfs_Enum r;
@@ -293,7 +321,7 @@ static bool test_EnumLevel(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, uint16_t
        struct dfs_Info1 s;
        struct dfs_EnumArray1 e1;
        bool ret = true;
-       
+
        r.in.level = level;
        r.in.bufsize = (uint32_t)-1;
        r.in.total = &total;
@@ -304,14 +332,14 @@ static bool test_EnumLevel(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, uint16_t
        e.e.info1->count = 0;
        e.e.info1->s = &s;
        s.path = NULL;
-       
+
        printf("Testing Enum level %u\n", level);
 
        status = dcerpc_dfs_Enum(p, mem_ctx, &r);
        if (!NT_STATUS_IS_OK(status)) {
                printf("Enum failed - %s\n", nt_errstr(status));
                return false;
-       } else if (!W_ERROR_IS_OK(r.out.result) && 
+       } else if (!W_ERROR_IS_OK(r.out.result) &&
                   !W_ERROR_EQUAL(WERR_NO_MORE_ITEMS, r.out.result)) {
                printf("dfs_Enum failed - %s\n", win_errstr(r.out.result));
                return false;
@@ -325,7 +353,7 @@ static bool test_EnumLevel(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, uint16_t
                                ret = false;
                        }
                }
-               
+
        }
 
        return ret;
@@ -335,7 +363,7 @@ static bool test_EnumLevel(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, uint16_t
 static bool test_Enum(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx)
 {
        bool ret = true;
-       uint16_t levels[] = {1, 2, 3, 4, 200, 300};
+       uint16_t levels[] = {1, 2, 3, 4, 5, 6, 200, 300};
        int i;
 
        for (i=0;i<ARRAY_SIZE(levels);i++) {
@@ -347,10 +375,12 @@ static bool test_Enum(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx)
        return ret;
 }
 
-static bool test_EnumEx(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, const char *host)
+static bool test_EnumEx(struct dcerpc_pipe *p,
+                       TALLOC_CTX *mem_ctx,
+                       const char *host)
 {
        bool ret = true;
-       uint16_t levels[] = {1, 2, 3, 4, 200, 300};
+       uint16_t levels[] = {1, 2, 3, 4, 5, 6, 200, 300};
        int i;
 
        for (i=0;i<ARRAY_SIZE(levels);i++) {
@@ -362,7 +392,10 @@ static bool test_EnumEx(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, const char *
        return ret;
 }
 
-static bool test_RemoveStdRoot(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, const char *host, const char *sharename)
+static bool test_RemoveStdRoot(struct dcerpc_pipe *p,
+                              TALLOC_CTX *mem_ctx,
+                              const char *host,
+                              const char *sharename)
 {
        struct dfs_RemoveStdRoot r;
        NTSTATUS status;
@@ -378,14 +411,18 @@ static bool test_RemoveStdRoot(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, const
                printf("RemoveStdRoot failed - %s\n", nt_errstr(status));
                return false;
        } else if (!W_ERROR_IS_OK(r.out.result)) {
-               printf("dfs_RemoveStdRoot failed - %s\n", win_errstr(r.out.result));
+               printf("dfs_RemoveStdRoot failed - %s\n",
+                       win_errstr(r.out.result));
                return false;
        }
 
        return true;
 }
 
-static bool test_AddStdRoot(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, const char *host, const char *sharename)
+static bool test_AddStdRoot(struct dcerpc_pipe *p,
+                           TALLOC_CTX *mem_ctx,
+                           const char *host,
+                           const char *sharename)
 {
        NTSTATUS status;
        struct dfs_AddStdRoot r;
@@ -402,14 +439,18 @@ static bool test_AddStdRoot(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, const ch
                printf("AddStdRoot failed - %s\n", nt_errstr(status));
                return false;
        } else if (!W_ERROR_IS_OK(r.out.result)) {
-               printf("dfs_AddStdRoot failed - %s\n", win_errstr(r.out.result));
+               printf("dfs_AddStdRoot failed - %s\n",
+                       win_errstr(r.out.result));
                return false;
        }
 
        return true;
 }
 
-static bool test_AddStdRootForced(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, const char *host, const char *sharename)
+static bool test_AddStdRootForced(struct dcerpc_pipe *p,
+                                 TALLOC_CTX *mem_ctx,
+                                 const char *host,
+                                 const char *sharename)
 {
        NTSTATUS status;
        struct dfs_AddStdRootForced r;
@@ -431,7 +472,8 @@ static bool test_AddStdRootForced(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, co
                printf("AddStdRootForced failed - %s\n", nt_errstr(status));
                return false;
        } else if (!W_ERROR_IS_OK(r.out.result)) {
-               printf("dfs_AddStdRootForced failed - %s\n", win_errstr(r.out.result));
+               printf("dfs_AddStdRootForced failed - %s\n",
+                       win_errstr(r.out.result));
                IS_DFS_VERSION_UNSUPPORTED_CALL_W2K3(version, r.out.result);
                return false;
        }
@@ -439,10 +481,11 @@ static bool test_AddStdRootForced(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, co
        return test_RemoveStdRoot(p, mem_ctx, host, sharename);
 }
 
-static void test_cleanup_stdroot(struct dcerpc_pipe *p, 
-                                TALLOC_CTX *mem_ctx, 
-                                const char *host, 
-                                const char *sharename, 
+static void test_cleanup_stdroot(struct dcerpc_pipe *p,
+                                TALLOC_CTX *mem_ctx,
+                                struct torture_context *tctx,
+                                const char *host,
+                                const char *sharename,
                                 const char *dir)
 {
        struct smbcli_state *cli;
@@ -450,30 +493,33 @@ static void test_cleanup_stdroot(struct dcerpc_pipe *p,
        printf("Cleaning up StdRoot\n");
 
        test_RemoveStdRoot(p, mem_ctx, host, sharename);
-       test_NetShareDel(mem_ctx, host, sharename);
-       torture_open_connection_share(mem_ctx, &cli, host, "C$", NULL);
+       test_NetShareDel(mem_ctx, tctx, host, sharename);
+       torture_open_connection_share(mem_ctx, &cli, tctx, host, "C$", NULL);
        test_DeleteDir(cli, dir);
        torture_close_connection(cli);
 }
 
-static bool test_StdRoot(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, const char *host)
+static bool test_StdRoot(struct dcerpc_pipe *p,
+                        TALLOC_CTX *mem_ctx,
+                        struct torture_context *tctx,
+                        const char *host)
 {
        const char *sharename = SMBTORTURE_DFS_SHARENAME;
        const char *dir = SMBTORTURE_DFS_DIRNAME;
        const char *path = SMBTORTURE_DFS_PATHNAME;
        struct smbcli_state *cli;
-       bool ret;
+       bool ret = true;
 
        printf("Testing StdRoot\n");
 
-       test_cleanup_stdroot(p, mem_ctx, host, sharename, dir);
+       test_cleanup_stdroot(p, mem_ctx, tctx, host, sharename, dir);
 
-       ret &= test_CreateDir(mem_ctx, &cli, host, "C$", dir);
-       ret &= test_NetShareAdd(mem_ctx, host, sharename, path);
+       ret &= test_CreateDir(mem_ctx, &cli, tctx, host, "C$", dir);
+       ret &= test_NetShareAdd(mem_ctx, tctx, host, sharename, path);
        ret &= test_AddStdRoot(p, mem_ctx, host, sharename);
        ret &= test_RemoveStdRoot(p, mem_ctx, host, sharename);
        ret &= test_AddStdRootForced(p, mem_ctx, host, sharename);
-       ret &= test_NetShareDel(mem_ctx, host, sharename);
+       ret &= test_NetShareDel(mem_ctx, tctx, host, sharename);
        ret &= test_DeleteDir(cli, dir);
 
        torture_close_connection(cli);
@@ -481,6 +527,121 @@ static bool test_StdRoot(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, const char
        return ret;
 }
 
+static bool test_GetDcAddress(struct dcerpc_pipe *p,
+                             TALLOC_CTX *mem_ctx,
+                             const char *host)
+{
+       NTSTATUS status;
+       struct dfs_GetDcAddress r;
+       uint8_t is_root = 0;
+       uint32_t ttl = 0;
+       const char *ptr;
+
+       printf("Testing GetDcAddress\n");
+
+       ptr = host;
+
+       r.in.servername = host;
+       r.in.server_fullname = r.out.server_fullname = &ptr;
+       r.in.is_root = r.out.is_root = &is_root;
+       r.in.ttl = r.out.ttl = &ttl;
+
+       status = dcerpc_dfs_GetDcAddress(p, mem_ctx, &r);
+       if (!NT_STATUS_IS_OK(status)) {
+               printf("GetDcAddress failed - %s\n", nt_errstr(status));
+               return false;
+       } else if (!W_ERROR_IS_OK(r.out.result)) {
+               printf("dfs_GetDcAddress failed - %s\n",
+                       win_errstr(r.out.result));
+               return false;
+       }
+
+       return true;
+}
+
+static bool test_SetDcAddress(struct dcerpc_pipe *p,
+                             TALLOC_CTX *mem_ctx,
+                             const char *host)
+{
+       NTSTATUS status;
+       struct dfs_SetDcAddress r;
+
+       printf("Testing SetDcAddress\n");
+
+       r.in.servername = host;
+       r.in.server_fullname = host;
+       r.in.flags = 0;
+       r.in.ttl = 1000;
+
+       status = dcerpc_dfs_SetDcAddress(p, mem_ctx, &r);
+       if (!NT_STATUS_IS_OK(status)) {
+               printf("SetDcAddress failed - %s\n", nt_errstr(status));
+               return false;
+       } else if (!W_ERROR_IS_OK(r.out.result)) {
+               printf("dfs_SetDcAddress failed - %s\n",
+                       win_errstr(r.out.result));
+               return false;
+       }
+
+       return true;
+}
+
+static bool test_DcAddress(struct dcerpc_pipe *p,
+                          TALLOC_CTX *mem_ctx,
+                          const char *host)
+{
+       if (!test_GetDcAddress(p, mem_ctx, host)) {
+               return false;
+       }
+
+       if (!test_SetDcAddress(p, mem_ctx, host)) {
+               return false;
+       }
+
+       return true;
+}
+
+static bool test_FlushFtTable(struct dcerpc_pipe *p,
+                             TALLOC_CTX *mem_ctx,
+                             const char *host,
+                             const char *sharename)
+{
+       NTSTATUS status;
+       struct dfs_FlushFtTable r;
+       enum dfs_ManagerVersion version;
+
+       printf("Testing FlushFtTable\n");
+
+       if (!test_GetManagerVersion(p, mem_ctx, &version)) {
+               return false;
+       }
+
+       r.in.servername = host;
+       r.in.rootshare = sharename;
+
+       status = dcerpc_dfs_FlushFtTable(p, mem_ctx, &r);
+       if (!NT_STATUS_IS_OK(status)) {
+               printf("FlushFtTable failed - %s\n", nt_errstr(status));
+               return false;
+       } else if (!W_ERROR_IS_OK(r.out.result)) {
+               printf("dfs_FlushFtTable failed - %s\n",
+                       win_errstr(r.out.result));
+               IS_DFS_VERSION_UNSUPPORTED_CALL_W2K3(version, r.out.result);
+               return false;
+       }
+
+       return true;
+}
+
+static bool test_FtRoot(struct dcerpc_pipe *p,
+                       TALLOC_CTX *mem_ctx,
+                       const char *host)
+{
+       const char *sharename = SMBTORTURE_DFS_SHARENAME;
+
+       return test_FlushFtTable(p, mem_ctx, host, sharename);
+}
+
 bool torture_rpc_dfs(struct torture_context *torture)
 {
        NTSTATUS status;
@@ -496,7 +657,9 @@ bool torture_rpc_dfs(struct torture_context *torture)
        ret &= test_ManagerInitialize(p, torture, host);
        ret &= test_Enum(p, torture);
        ret &= test_EnumEx(p, torture, host);
-       ret &= test_StdRoot(p, torture, host);
+       ret &= test_StdRoot(p, torture, torture, host);
+       ret &= test_FtRoot(p, torture, host);
+       ret &= test_DcAddress(p, torture, host);
 
        return ret;
 }