r26429: Avoid use of global_smb_iconv_convenience.
[ira/wip.git] / source4 / torture / rap / rap.c
index f05183a0336b762b78274c4423ac22e5e8f1a5a1..d39a83034d98e4e248d3d11498268cb694e44e6b 100644 (file)
@@ -6,7 +6,7 @@
    
    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,
@@ -15,8 +15,7 @@
    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.
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
 
 #include "includes.h"
 #include "libcli/raw/libcliraw.h"
 #include "libcli/libcli.h"
 #include "librpc/ndr/libndr.h"
+#include "param/param.h"
+
+#define RAP_GOTO(call) do { \
+       NTSTATUS _status; \
+       _status = call; \
+       if (!NT_STATUS_IS_OK(_status)) { \
+               result = _status; \
+               goto done; \
+       } \
+} while (0)
+
+#define NDR_GOTO(call) do { \
+       enum ndr_err_code _ndr_err; \
+       _ndr_err = call; \
+       if (!NDR_ERR_CODE_IS_SUCCESS(_ndr_err)) { \
+               result = ndr_map_error2ntstatus(_ndr_err); \
+               goto done; \
+       } \
+} while (0)
+
+#define NDR_RETURN(call) do { \
+       enum ndr_err_code _ndr_err; \
+       _ndr_err = call; \
+       if (!NDR_ERR_CODE_IS_SUCCESS(_ndr_err)) { \
+               return ndr_map_error2ntstatus(_ndr_err); \
+       } \
+} while (0)
 
 struct rap_call {
        uint16_t callno;
@@ -142,8 +168,8 @@ static NTSTATUS rap_pull_string(TALLOC_CTX *mem_ctx, struct ndr_pull *ndr,
        const char *p;
        size_t len;
 
-       NDR_CHECK(ndr_pull_uint16(ndr, NDR_SCALARS, &string_offset));
-       NDR_CHECK(ndr_pull_uint16(ndr, NDR_SCALARS, &ignore));
+       NDR_RETURN(ndr_pull_uint16(ndr, NDR_SCALARS, &string_offset));
+       NDR_RETURN(ndr_pull_uint16(ndr, NDR_SCALARS, &ignore));
 
        string_offset -= convert;
 
@@ -156,8 +182,8 @@ static NTSTATUS rap_pull_string(TALLOC_CTX *mem_ctx, struct ndr_pull *ndr,
        if ( string_offset + len + 1 >  ndr->data_size )
                return NT_STATUS_INVALID_PARAMETER;
 
-       *dest = talloc_zero_size(mem_ctx, len+1);
-       pull_string(*dest, p, len+1, len, STR_ASCII);
+       *dest = talloc_zero_array(mem_ctx, char, len+1);
+       pull_string(lp_iconv_convenience(global_loadparm), *dest, p, len+1, len, STR_ASCII);
 
        return NT_STATUS_OK;
 }
@@ -185,14 +211,14 @@ static NTSTATUS rap_cli_do_call(struct smbcli_tree *tree, struct rap_call *call)
        trans.in.setup = NULL;
        trans.in.trans_name = "\\PIPE\\LANMAN";
 
-       NDR_CHECK(ndr_push_uint16(params, NDR_SCALARS, call->callno));
+       NDR_RETURN(ndr_push_uint16(params, NDR_SCALARS, call->callno));
        if (call->paramdesc)
-               NDR_CHECK(ndr_push_string(params, NDR_SCALARS, call->paramdesc));
+               NDR_RETURN(ndr_push_string(params, NDR_SCALARS, call->paramdesc));
        if (call->datadesc)
-               NDR_CHECK(ndr_push_string(params, NDR_SCALARS, call->datadesc));
+               NDR_RETURN(ndr_push_string(params, NDR_SCALARS, call->datadesc));
 
        param_blob = ndr_push_blob(call->ndr_push_param);
-       NDR_CHECK(ndr_push_bytes(params, param_blob.data,
+       NDR_RETURN(ndr_push_bytes(params, param_blob.data,
                                 param_blob.length));
 
        trans.in.params = ndr_push_blob(params);
@@ -212,11 +238,6 @@ static NTSTATUS rap_cli_do_call(struct smbcli_tree *tree, struct rap_call *call)
        return result;
 }
 
-#define NDR_OK(call) do { NTSTATUS _status; \
-                             _status = call; \
-                             if (!NT_STATUS_IS_OK(_status)) \
-                               goto done; \
-                        } while (0)
 
 static NTSTATUS smbcli_rap_netshareenum(struct smbcli_tree *tree,
                                        TALLOC_CTX *mem_ctx,
@@ -249,10 +270,10 @@ static NTSTATUS smbcli_rap_netshareenum(struct smbcli_tree *tree,
        if (!NT_STATUS_IS_OK(result))
                goto done;
 
-       NDR_OK(ndr_pull_uint16(call->ndr_pull_param, NDR_SCALARS, &r->out.status));
-       NDR_OK(ndr_pull_uint16(call->ndr_pull_param, NDR_SCALARS, &r->out.convert));
-       NDR_OK(ndr_pull_uint16(call->ndr_pull_param, NDR_SCALARS, &r->out.count));
-       NDR_OK(ndr_pull_uint16(call->ndr_pull_param, NDR_SCALARS, &r->out.available));
+       NDR_GOTO(ndr_pull_uint16(call->ndr_pull_param, NDR_SCALARS, &r->out.status));
+       NDR_GOTO(ndr_pull_uint16(call->ndr_pull_param, NDR_SCALARS, &r->out.convert));
+       NDR_GOTO(ndr_pull_uint16(call->ndr_pull_param, NDR_SCALARS, &r->out.count));
+       NDR_GOTO(ndr_pull_uint16(call->ndr_pull_param, NDR_SCALARS, &r->out.available));
 
        r->out.info = talloc_array(mem_ctx, union rap_shareenum_info, r->out.count);
 
@@ -264,17 +285,17 @@ static NTSTATUS smbcli_rap_netshareenum(struct smbcli_tree *tree,
        for (i=0; i<r->out.count; i++) {
                switch(r->in.level) {
                case 0:
-                       NDR_OK(ndr_pull_bytes(call->ndr_pull_data,
+                       NDR_GOTO(ndr_pull_bytes(call->ndr_pull_data,
                                              (uint8_t *)r->out.info[i].info0.name, 13));
                        break;
                case 1:
-                       NDR_OK(ndr_pull_bytes(call->ndr_pull_data,
+                       NDR_GOTO(ndr_pull_bytes(call->ndr_pull_data,
                                              (uint8_t *)r->out.info[i].info1.name, 13));
-                       NDR_OK(ndr_pull_bytes(call->ndr_pull_data,
+                       NDR_GOTO(ndr_pull_bytes(call->ndr_pull_data,
                                              (uint8_t *)&r->out.info[i].info1.pad, 1));
-                       NDR_OK(ndr_pull_uint16(call->ndr_pull_data,
+                       NDR_GOTO(ndr_pull_uint16(call->ndr_pull_data,
                                               NDR_SCALARS, &r->out.info[i].info1.type));
-                       NDR_OK(rap_pull_string(mem_ctx, call->ndr_pull_data,
+                       RAP_GOTO(rap_pull_string(mem_ctx, call->ndr_pull_data,
                                               r->out.convert,
                                               &r->out.info[i].info1.comment));
                        break;
@@ -288,7 +309,7 @@ static NTSTATUS smbcli_rap_netshareenum(struct smbcli_tree *tree,
        return result;
 }
 
-static BOOL test_netshareenum(struct smbcli_tree *tree)
+static bool test_netshareenum(struct smbcli_tree *tree)
 {
        struct rap_NetShareEnum r;
        int i;
@@ -298,7 +319,7 @@ static BOOL test_netshareenum(struct smbcli_tree *tree)
        r.in.bufsize = 8192;
 
        if (!NT_STATUS_IS_OK(smbcli_rap_netshareenum(tree, tmp_ctx, &r)))
-               return False;
+               return false;
 
        for (i=0; i<r.out.count; i++) {
                printf("%s %d %s\n", r.out.info[i].info1.name,
@@ -308,7 +329,7 @@ static BOOL test_netshareenum(struct smbcli_tree *tree)
 
        talloc_free(tmp_ctx);
 
-       return True;
+       return true;
 }
 
 static NTSTATUS smbcli_rap_netserverenum2(struct smbcli_tree *tree,
@@ -346,10 +367,10 @@ static NTSTATUS smbcli_rap_netserverenum2(struct smbcli_tree *tree,
 
        result = NT_STATUS_INVALID_PARAMETER;
 
-       NDR_OK(ndr_pull_uint16(call->ndr_pull_param, NDR_SCALARS, &r->out.status));
-       NDR_OK(ndr_pull_uint16(call->ndr_pull_param, NDR_SCALARS, &r->out.convert));
-       NDR_OK(ndr_pull_uint16(call->ndr_pull_param, NDR_SCALARS, &r->out.count));
-       NDR_OK(ndr_pull_uint16(call->ndr_pull_param, NDR_SCALARS, &r->out.available));
+       NDR_GOTO(ndr_pull_uint16(call->ndr_pull_param, NDR_SCALARS, &r->out.status));
+       NDR_GOTO(ndr_pull_uint16(call->ndr_pull_param, NDR_SCALARS, &r->out.convert));
+       NDR_GOTO(ndr_pull_uint16(call->ndr_pull_param, NDR_SCALARS, &r->out.count));
+       NDR_GOTO(ndr_pull_uint16(call->ndr_pull_param, NDR_SCALARS, &r->out.available));
 
        r->out.info = talloc_array(mem_ctx, union rap_server_info, r->out.count);
 
@@ -361,19 +382,19 @@ static NTSTATUS smbcli_rap_netserverenum2(struct smbcli_tree *tree,
        for (i=0; i<r->out.count; i++) {
                switch(r->in.level) {
                case 0:
-                       NDR_OK(ndr_pull_bytes(call->ndr_pull_data,
+                       NDR_GOTO(ndr_pull_bytes(call->ndr_pull_data,
                                              (uint8_t *)r->out.info[i].info0.name, 16));
                        break;
                case 1:
-                       NDR_OK(ndr_pull_bytes(call->ndr_pull_data,
+                       NDR_GOTO(ndr_pull_bytes(call->ndr_pull_data,
                                              (uint8_t *)r->out.info[i].info1.name, 16));
-                       NDR_OK(ndr_pull_bytes(call->ndr_pull_data,
+                       NDR_GOTO(ndr_pull_bytes(call->ndr_pull_data,
                                              &r->out.info[i].info1.version_major, 1));
-                       NDR_OK(ndr_pull_bytes(call->ndr_pull_data,
+                       NDR_GOTO(ndr_pull_bytes(call->ndr_pull_data,
                                              &r->out.info[i].info1.version_minor, 1));
-                       NDR_OK(ndr_pull_uint32(call->ndr_pull_data,
+                       NDR_GOTO(ndr_pull_uint32(call->ndr_pull_data,
                                               NDR_SCALARS, &r->out.info[i].info1.servertype));
-                       NDR_OK(rap_pull_string(mem_ctx, call->ndr_pull_data,
+                       RAP_GOTO(rap_pull_string(mem_ctx, call->ndr_pull_data,
                                               r->out.convert,
                                               &r->out.info[i].info1.comment));
                }
@@ -386,7 +407,7 @@ static NTSTATUS smbcli_rap_netserverenum2(struct smbcli_tree *tree,
        return result;
 }
 
-static BOOL test_netserverenum(struct smbcli_tree *tree)
+static bool test_netserverenum(struct smbcli_tree *tree)
 {
        struct rap_NetServerEnum2 r;
        int i;
@@ -399,7 +420,7 @@ static BOOL test_netserverenum(struct smbcli_tree *tree)
        r.in.domain = NULL;
 
        if (!NT_STATUS_IS_OK(smbcli_rap_netserverenum2(tree, tmp_ctx, &r)))
-               return False;
+               return false;
 
        for (i=0; i<r.out.count; i++) {
                switch (r.in.level) {
@@ -416,10 +437,10 @@ static BOOL test_netserverenum(struct smbcli_tree *tree)
 
        talloc_free(tmp_ctx);
 
-       return True;
+       return true;
 }
 
-NTSTATUS smbcli_rap_netservergetinfo(struct smbcli_tree *tree,
+_PUBLIC_ NTSTATUS smbcli_rap_netservergetinfo(struct smbcli_tree *tree,
                                     TALLOC_CTX *mem_ctx,
                                     struct rap_WserverGetInfo *r)
 {
@@ -451,25 +472,25 @@ NTSTATUS smbcli_rap_netservergetinfo(struct smbcli_tree *tree,
        if (!NT_STATUS_IS_OK(result))
                goto done;
 
-       NDR_OK(ndr_pull_uint16(call->ndr_pull_param, NDR_SCALARS, &r->out.status));
-       NDR_OK(ndr_pull_uint16(call->ndr_pull_param, NDR_SCALARS, &r->out.convert));
-       NDR_OK(ndr_pull_uint16(call->ndr_pull_param, NDR_SCALARS, &r->out.available));
+       NDR_GOTO(ndr_pull_uint16(call->ndr_pull_param, NDR_SCALARS, &r->out.status));
+       NDR_GOTO(ndr_pull_uint16(call->ndr_pull_param, NDR_SCALARS, &r->out.convert));
+       NDR_GOTO(ndr_pull_uint16(call->ndr_pull_param, NDR_SCALARS, &r->out.available));
 
        switch(r->in.level) {
        case 0:
-               NDR_OK(ndr_pull_bytes(call->ndr_pull_data,
+               NDR_GOTO(ndr_pull_bytes(call->ndr_pull_data,
                                      (uint8_t *)r->out.info.info0.name, 16));
                break;
        case 1:
-               NDR_OK(ndr_pull_bytes(call->ndr_pull_data,
+               NDR_GOTO(ndr_pull_bytes(call->ndr_pull_data,
                                      (uint8_t *)r->out.info.info1.name, 16));
-               NDR_OK(ndr_pull_bytes(call->ndr_pull_data,
+               NDR_GOTO(ndr_pull_bytes(call->ndr_pull_data,
                                      &r->out.info.info1.version_major, 1));
-               NDR_OK(ndr_pull_bytes(call->ndr_pull_data,
+               NDR_GOTO(ndr_pull_bytes(call->ndr_pull_data,
                                      &r->out.info.info1.version_minor, 1));
-               NDR_OK(ndr_pull_uint32(call->ndr_pull_data,
+               NDR_GOTO(ndr_pull_uint32(call->ndr_pull_data,
                                       NDR_SCALARS, &r->out.info.info1.servertype));
-               NDR_OK(rap_pull_string(mem_ctx, call->ndr_pull_data,
+               RAP_GOTO(rap_pull_string(mem_ctx, call->ndr_pull_data,
                                       r->out.convert,
                                       &r->out.info.info1.comment));
        }
@@ -478,14 +499,14 @@ NTSTATUS smbcli_rap_netservergetinfo(struct smbcli_tree *tree,
        return result;
 }
 
-static BOOL test_netservergetinfo(struct smbcli_tree *tree)
+static bool test_netservergetinfo(struct smbcli_tree *tree)
 {
        struct rap_WserverGetInfo r;
-       BOOL res = True;
+       bool res = true;
        TALLOC_CTX *mem_ctx;
 
        if (!(mem_ctx = talloc_new(tree))) {
-               return False;
+               return false;
        }
 
        r.in.bufsize = 0xffff;
@@ -499,9 +520,9 @@ static BOOL test_netservergetinfo(struct smbcli_tree *tree)
        return res;
 }
 
-static BOOL test_rap(struct smbcli_tree *tree)
+static bool test_rap(struct smbcli_tree *tree)
 {
-       BOOL res = True;
+       bool res = true;
 
        res &= test_netserverenum(tree);
        res &= test_netshareenum(tree);
@@ -510,20 +531,20 @@ static BOOL test_rap(struct smbcli_tree *tree)
        return res;
 }
 
-BOOL torture_rap_basic(struct torture_context *torture)
+bool torture_rap_basic(struct torture_context *torture)
 {
        struct smbcli_state *cli;
-       BOOL ret = True;
+       bool ret = true;
        TALLOC_CTX *mem_ctx;
 
-       if (!torture_open_connection(&cli, 0)) {
-               return False;
+       if (!torture_open_connection(&cli, torture, 0)) {
+               return false;
        }
 
        mem_ctx = talloc_init("torture_rap_basic");
 
        if (!test_rap(cli->tree)) {
-               ret = False;
+               ret = false;
        }
 
        torture_close_connection(cli);
@@ -532,7 +553,7 @@ BOOL torture_rap_basic(struct torture_context *torture)
        return ret;
 }
 
-BOOL torture_rap_scan(struct torture_context *torture)
+bool torture_rap_scan(struct torture_context *torture)
 {
        TALLOC_CTX *mem_ctx;
        struct smbcli_state *cli;
@@ -540,8 +561,8 @@ BOOL torture_rap_scan(struct torture_context *torture)
 
        mem_ctx = talloc_init("torture_rap_scan");
 
-       if (!torture_open_connection(&cli, 0)) {
-               return False;
+       if (!torture_open_connection(&cli, torture, 0)) {
+               return false;
        }
        
        for (callno = 0; callno < 0xffff; callno++) {
@@ -558,7 +579,7 @@ BOOL torture_rap_scan(struct torture_context *torture)
 
        torture_close_connection(cli);
 
-       return True;
+       return true;
 }
 
 NTSTATUS torture_rap_init(void)