r23792: convert Samba4 to GPLv3
[ira/wip.git] / source4 / ntvfs / ipc / ipc_rap.c
index d2cd0b38d57381f5df34672a930bba46927b3b6d..605a172a706b1ef560db21f434e6fffd69892004 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,
    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/interfaces.h"
+#include "libcli/rap/rap.h"
+#include "ntvfs/ipc/proto.h"
+#include "librpc/ndr/libndr.h"
 
 #define NERR_Success 0
 #define NERR_badpass 86
@@ -52,14 +55,14 @@ static void rap_heap_restore(struct rap_string_heap *heap,
 
 struct rap_call {
        TALLOC_CTX *mem_ctx;
-       uint16 callno;
+       uint16_t callno;
        const char *paramdesc;
        const char *datadesc;
 
-       uint16 status;
-       uint16 convert;
+       uint16_t status;
+       uint16_t convert;
 
-       uint16 rcv_paramlen, rcv_datalen;
+       uint16_t rcv_paramlen, rcv_datalen;
 
        struct ndr_push *ndr_push_param;
        struct ndr_push *ndr_push_data;
@@ -76,7 +79,7 @@ static struct rap_call *new_rap_srv_call(TALLOC_CTX *mem_ctx,
 {
        struct rap_call *call;
 
-       call = talloc_p(mem_ctx, struct rap_call);
+       call = talloc(mem_ctx, struct rap_call);
 
        if (call == NULL)
                return NULL;
@@ -91,7 +94,7 @@ static struct rap_call *new_rap_srv_call(TALLOC_CTX *mem_ctx,
        call->ndr_pull_data = ndr_pull_init_blob(&trans->in.data, mem_ctx);
        call->ndr_pull_data->flags = RAPNDR_FLAGS;
 
-       call->heap = talloc_p(mem_ctx, struct rap_string_heap);
+       call->heap = talloc(mem_ctx, struct rap_string_heap);
 
        if (call->heap == NULL)
                return NULL;
@@ -103,20 +106,20 @@ static struct rap_call *new_rap_srv_call(TALLOC_CTX *mem_ctx,
        return call;
 }
 
-static NTSTATUS rap_srv_pull_word(struct rap_call *call, uint16 *result)
+static NTSTATUS rap_srv_pull_word(struct rap_call *call, uint16_t *result)
 {
        if (*call->paramdesc++ != 'W')
                return NT_STATUS_INVALID_PARAMETER;
 
-       return ndr_pull_uint16(call->ndr_pull_param, result);
+       return ndr_pull_uint16(call->ndr_pull_param, NDR_SCALARS, result);
 }
 
-static NTSTATUS rap_srv_pull_dword(struct rap_call *call, uint32 *result)
+static NTSTATUS rap_srv_pull_dword(struct rap_call *call, uint32_t *result)
 {
        if (*call->paramdesc++ != 'D')
                return NT_STATUS_INVALID_PARAMETER;
 
-       return ndr_pull_uint32(call->ndr_pull_param, result);
+       return ndr_pull_uint32(call->ndr_pull_param, NDR_SCALARS, result);
 }
 
 static NTSTATUS rap_srv_pull_string(struct rap_call *call, const char **result)
@@ -134,14 +137,14 @@ static NTSTATUS rap_srv_pull_string(struct rap_call *call, const char **result)
        return ndr_pull_string(call->ndr_pull_param, NDR_SCALARS, result);
 }
 
-static NTSTATUS rap_srv_pull_bufsize(struct rap_call *call, uint16 *bufsize)
+static NTSTATUS rap_srv_pull_bufsize(struct rap_call *call, uint16_t *bufsize)
 {
        NTSTATUS result;
 
        if ( (*call->paramdesc++ != 'r') || (*call->paramdesc++ != 'L') )
                return NT_STATUS_INVALID_PARAMETER;
 
-       result = ndr_pull_uint16(call->ndr_pull_param, bufsize);
+       result = ndr_pull_uint16(call->ndr_pull_param, NDR_SCALARS, bufsize);
 
        if (!NT_STATUS_IS_OK(result))
                return result;
@@ -175,12 +178,13 @@ static NTSTATUS rap_push_string(struct ndr_push *data_push,
 
        heap->offset -= space;
 
-       NDR_CHECK(ndr_push_uint16(data_push, heap->offset));
-       NDR_CHECK(ndr_push_uint16(data_push, 0));
+       NDR_CHECK(ndr_push_uint16(data_push, NDR_SCALARS, heap->offset));
+       NDR_CHECK(ndr_push_uint16(data_push, NDR_SCALARS, 0));
 
-       heap->strings = talloc_realloc(heap->mem_ctx, heap->strings,
-                                      sizeof(*heap->strings) *
-                                      (heap->num_strings + 1));
+       heap->strings = talloc_realloc(heap->mem_ctx,
+                                        heap->strings,
+                                        const char *,
+                                        heap->num_strings + 1);
 
        if (heap->strings == NULL)
                return NT_STATUS_NO_MEMORY;
@@ -198,8 +202,7 @@ static NTSTATUS rap_push_string(struct ndr_push *data_push,
                                goto done; \
                         } while (0)
 
-static NTSTATUS _rap_netshareenum(struct smbsrv_request *req,
-                                 struct rap_call *call)
+static NTSTATUS _rap_netshareenum(struct rap_call *call)
 {
        struct rap_NetShareEnum r;
        NTSTATUS result;
@@ -222,7 +225,7 @@ static NTSTATUS _rap_netshareenum(struct smbsrv_request *req,
                break;
        }
 
-       result = rap_netshareenum(req, &r);
+       result = rap_netshareenum(call, &r);
 
        if (!NT_STATUS_IS_OK(result))
                return result;
@@ -239,17 +242,17 @@ static NTSTATUS _rap_netshareenum(struct smbsrv_request *req,
                switch(r.in.level) {
                case 0:
                        NDR_OK(ndr_push_bytes(call->ndr_push_data,
-                                             r.out.info[i].info0.name,
+                                             (const uint8_t *)r.out.info[i].info0.name,
                                              sizeof(r.out.info[i].info0.name)));
                        break;
                case 1:
                        NDR_OK(ndr_push_bytes(call->ndr_push_data,
-                                             r.out.info[i].info1.name,
+                                             (const uint8_t *)r.out.info[i].info1.name,
                                              sizeof(r.out.info[i].info1.name)));
                        NDR_OK(ndr_push_uint8(call->ndr_push_data,
-                                             r.out.info[i].info1.pad));
+                                             NDR_SCALARS, r.out.info[i].info1.pad));
                        NDR_OK(ndr_push_uint16(call->ndr_push_data,
-                                              r.out.info[i].info1.type));
+                                              NDR_SCALARS, r.out.info[i].info1.type));
 
                        NDR_OK(rap_push_string(call->ndr_push_data,
                                               call->heap,
@@ -270,8 +273,8 @@ static NTSTATUS _rap_netshareenum(struct smbsrv_request *req,
 
        call->status = r.out.status;
 
-       NDR_CHECK(ndr_push_uint16(call->ndr_push_param, r.out.count));
-       NDR_CHECK(ndr_push_uint16(call->ndr_push_param, r.out.available));
+       NDR_CHECK(ndr_push_uint16(call->ndr_push_param, NDR_SCALARS, r.out.count));
+       NDR_CHECK(ndr_push_uint16(call->ndr_push_param, NDR_SCALARS, r.out.available));
 
        result = NT_STATUS_OK;
 
@@ -279,8 +282,7 @@ static NTSTATUS _rap_netshareenum(struct smbsrv_request *req,
        return result;
 }
 
-static NTSTATUS _rap_netserverenum2(struct smbsrv_request *req,
-                                   struct rap_call *call)
+static NTSTATUS _rap_netserverenum2(struct rap_call *call)
 {
        struct rap_NetServerEnum2 r;
        NTSTATUS result;
@@ -305,7 +307,7 @@ static NTSTATUS _rap_netserverenum2(struct smbsrv_request *req,
                break;
        }
 
-       result = rap_netserverenum2(req, &r);
+       result = rap_netserverenum2(call, &r);
 
        if (!NT_STATUS_IS_OK(result))
                return result;
@@ -322,19 +324,19 @@ static NTSTATUS _rap_netserverenum2(struct smbsrv_request *req,
                switch(r.in.level) {
                case 0:
                        NDR_OK(ndr_push_bytes(call->ndr_push_data,
-                                             r.out.info[i].info0.name,
+                                             (const uint8_t *)r.out.info[i].info0.name,
                                              sizeof(r.out.info[i].info0.name)));
                        break;
                case 1:
                        NDR_OK(ndr_push_bytes(call->ndr_push_data,
-                                             r.out.info[i].info1.name,
+                                             (const uint8_t *)r.out.info[i].info1.name,
                                              sizeof(r.out.info[i].info1.name)));
                        NDR_OK(ndr_push_uint8(call->ndr_push_data,
-                                             r.out.info[i].info1.version_major));
+                                             NDR_SCALARS, r.out.info[i].info1.version_major));
                        NDR_OK(ndr_push_uint8(call->ndr_push_data,
-                                             r.out.info[i].info1.version_minor));
+                                             NDR_SCALARS, r.out.info[i].info1.version_minor));
                        NDR_OK(ndr_push_uint32(call->ndr_push_data,
-                                              r.out.info[i].info1.servertype));
+                                              NDR_SCALARS, r.out.info[i].info1.servertype));
 
                        NDR_OK(rap_push_string(call->ndr_push_data,
                                               call->heap,
@@ -355,8 +357,8 @@ static NTSTATUS _rap_netserverenum2(struct smbsrv_request *req,
 
        call->status = r.out.status;
 
-       NDR_CHECK(ndr_push_uint16(call->ndr_push_param, r.out.count));
-       NDR_CHECK(ndr_push_uint16(call->ndr_push_param, r.out.available));
+       NDR_CHECK(ndr_push_uint16(call->ndr_push_param, NDR_SCALARS, r.out.count));
+       NDR_CHECK(ndr_push_uint16(call->ndr_push_param, NDR_SCALARS, r.out.available));
 
        result = NT_STATUS_OK;
 
@@ -364,29 +366,25 @@ static NTSTATUS _rap_netserverenum2(struct smbsrv_request *req,
        return result;
 }
 
-static NTSTATUS api_Unsupported(struct smbsrv_request *req,
-                               struct rap_call *call)
+static NTSTATUS api_Unsupported(struct rap_call *call)
 {
        call->status = NERR_notsupported;
        call->convert = 0;
        return NT_STATUS_OK;
 }
 
-#define RAP_NetShareEnum 0
-#define RAP_NetServerEnum2 104
-
 static const struct
 {
        const char *name;
        int id;
-       NTSTATUS (*fn)(struct smbsrv_request *req, struct rap_call *call);
+       NTSTATUS (*fn)(struct rap_call *call);
 } api_commands[] = {
-       {"NetShareEnum", RAP_NetShareEnum, _rap_netshareenum },
+       {"NetShareEnum", RAP_WshareEnum, _rap_netshareenum },
        {"NetServerEnum2", RAP_NetServerEnum2, _rap_netserverenum2 },
        {NULL, -1, api_Unsupported}
 };
 
-NTSTATUS ipc_rap_call(struct smbsrv_request *req, struct smb_trans2 *trans)
+NTSTATUS ipc_rap_call(TALLOC_CTX *mem_ctx, struct smb_trans2 *trans)
 {
        int i;
        NTSTATUS result;
@@ -395,19 +393,19 @@ NTSTATUS ipc_rap_call(struct smbsrv_request *req, struct smb_trans2 *trans)
        struct ndr_push *final_param;
        struct ndr_push *final_data;
 
-       call = new_rap_srv_call(req->mem_ctx, trans);
+       call = new_rap_srv_call(mem_ctx, trans);
 
        if (call == NULL)
                return NT_STATUS_NO_MEMORY;
 
-       NDR_CHECK(ndr_pull_uint16(call->ndr_pull_param, &call->callno));
+       NDR_CHECK(ndr_pull_uint16(call->ndr_pull_param, NDR_SCALARS, &call->callno));
        NDR_CHECK(ndr_pull_string(call->ndr_pull_param, NDR_SCALARS,
                                  &call->paramdesc));
        NDR_CHECK(ndr_pull_string(call->ndr_pull_param, NDR_SCALARS,
                                  &call->datadesc));
 
-       call->ndr_push_param = ndr_push_init_ctx(req->mem_ctx);
-       call->ndr_push_data = ndr_push_init_ctx(req->mem_ctx);
+       call->ndr_push_param = ndr_push_init_ctx(call);
+       call->ndr_push_data = ndr_push_init_ctx(call);
 
        if ((call->ndr_push_param == NULL) || (call->ndr_push_data == NULL))
                return NT_STATUS_NO_MEMORY;
@@ -415,13 +413,13 @@ NTSTATUS ipc_rap_call(struct smbsrv_request *req, struct smb_trans2 *trans)
        call->ndr_push_param->flags = RAPNDR_FLAGS;
        call->ndr_push_data->flags = RAPNDR_FLAGS;
 
-       result = NT_STATUS_NOT_IMPLEMENTED;
+       result = NT_STATUS_INVALID_SYSTEM_SERVICE;
 
        for (i=0; api_commands[i].name != NULL; i++) {
                if (api_commands[i].id == call->callno) {
                        DEBUG(5, ("Running RAP call %s\n",
                                  api_commands[i].name));
-                       result = api_commands[i].fn(req, call);
+                       result = api_commands[i].fn(call);
                        break;
                }
        }
@@ -432,8 +430,8 @@ NTSTATUS ipc_rap_call(struct smbsrv_request *req, struct smb_trans2 *trans)
        result_param = ndr_push_blob(call->ndr_push_param);
        result_data = ndr_push_blob(call->ndr_push_data);
 
-       final_param = ndr_push_init_ctx(req->mem_ctx);
-       final_data = ndr_push_init_ctx(req->mem_ctx);
+       final_param = ndr_push_init_ctx(call);
+       final_data = ndr_push_init_ctx(call);
 
        if ((final_param == NULL) || (final_data == NULL))
                return NT_STATUS_NO_MEMORY;
@@ -441,9 +439,9 @@ NTSTATUS ipc_rap_call(struct smbsrv_request *req, struct smb_trans2 *trans)
        final_param->flags = RAPNDR_FLAGS;
        final_data->flags = RAPNDR_FLAGS;
 
-       NDR_CHECK(ndr_push_uint16(final_param, call->status));
+       NDR_CHECK(ndr_push_uint16(final_param, NDR_SCALARS, call->status));
        NDR_CHECK(ndr_push_uint16(final_param,
-                                 call->heap->offset - result_data.length));
+                                 NDR_SCALARS, call->heap->offset - result_data.length));
        NDR_CHECK(ndr_push_bytes(final_param, result_param.data,
                                 result_param.length));