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
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;
{
struct rap_call *call;
- call = talloc_p(mem_ctx, struct rap_call);
+ call = talloc(mem_ctx, struct rap_call);
if (call == NULL)
return NULL;
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;
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)
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;
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;
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;
break;
}
- result = rap_netshareenum(req, &r);
+ result = rap_netshareenum(call, &r);
if (!NT_STATUS_IS_OK(result))
return result;
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,
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;
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;
break;
}
- result = rap_netserverenum2(req, &r);
+ result = rap_netserverenum2(call, &r);
if (!NT_STATUS_IS_OK(result))
return result;
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,
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;
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;
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;
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;
}
}
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;
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));