1
0
mirror of https://github.com/samba-team/samba.git synced 2025-02-02 09:47:23 +03:00

r19200: Implement smbcli_rap_netservergetinfo. To be used in RPC-SAMBA3SPOOLSS and

others that might need the server name.

Volker
(This used to be commit 03eaf0edf9f8a6d70375f9f12810b4fbb860290a)
This commit is contained in:
Volker Lendecke 2006-10-09 11:19:30 +00:00 committed by Gerald (Jerry) Carter
parent 2338e97832
commit 5c46265048
2 changed files with 102 additions and 6 deletions

View File

@ -343,3 +343,17 @@ struct rap_NetServerEnum2 {
union rap_server_info *info;
} out;
};
struct rap_WserverGetInfo {
struct {
uint16_t level;
uint16_t bufsize;
} in;
struct {
uint16_t status;
uint16_t convert;
uint16_t available;
union rap_server_info info;
} out;
};

View File

@ -113,6 +113,12 @@ static void rap_cli_expect_multiple_entries(struct rap_call *call)
call->rcv_paramlen += 4; /* uint16_t entry count, uint16_t total */
}
static void rap_cli_expect_word(struct rap_call *call)
{
rap_cli_push_paramdesc(call, 'h');
call->rcv_paramlen += 2;
}
static void rap_cli_push_string(struct rap_call *call, const char *str)
{
if (str == NULL) {
@ -313,7 +319,7 @@ static NTSTATUS smbcli_rap_netserverenum2(struct smbcli_state *cli,
NTSTATUS result = NT_STATUS_UNSUCCESSFUL;
int i;
call = new_rap_cli_call(NULL, RAP_NetServerEnum2);
call = new_rap_cli_call(mem_ctx, RAP_NetServerEnum2);
if (call == NULL)
return NT_STATUS_NO_MEMORY;
@ -413,17 +419,93 @@ static BOOL test_netserverenum(struct smbcli_state *cli)
return True;
}
NTSTATUS smbcli_rap_netservergetinfo(struct smbcli_state *cli,
TALLOC_CTX *mem_ctx,
struct rap_WserverGetInfo *r)
{
struct rap_call *call;
NTSTATUS result = NT_STATUS_UNSUCCESSFUL;
if (!(call = new_rap_cli_call(mem_ctx, RAP_WserverGetInfo))) {
return NT_STATUS_NO_MEMORY;
}
rap_cli_push_word(call, r->in.level);
rap_cli_push_rcvbuf(call, r->in.bufsize);
rap_cli_expect_word(call);
switch(r->in.level) {
case 0:
rap_cli_expect_format(call, "B16");
break;
case 1:
rap_cli_expect_format(call, "B16BBDz");
break;
default:
result = NT_STATUS_INVALID_PARAMETER;
goto done;
}
result = rap_cli_do_call(cli, call);
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));
switch(r->in.level) {
case 0:
NDR_OK(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,
(uint8_t *)r->out.info.info1.name, 16));
NDR_OK(ndr_pull_bytes(call->ndr_pull_data,
&r->out.info.info1.version_major, 1));
NDR_OK(ndr_pull_bytes(call->ndr_pull_data,
&r->out.info.info1.version_minor, 1));
NDR_OK(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,
r->out.convert,
&r->out.info.info1.comment));
}
done:
talloc_free(call);
return result;
}
static BOOL test_netservergetinfo(struct smbcli_state *cli)
{
struct rap_WserverGetInfo r;
BOOL res = True;
TALLOC_CTX *mem_ctx;
if (!(mem_ctx = talloc_new(cli))) {
return False;
}
r.in.bufsize = 0xffff;
r.in.level = 0;
res &= NT_STATUS_IS_OK(smbcli_rap_netservergetinfo(cli, mem_ctx, &r));
r.in.level = 1;
res &= NT_STATUS_IS_OK(smbcli_rap_netservergetinfo(cli, mem_ctx, &r));
talloc_free(mem_ctx);
return res;
}
static BOOL test_rap(struct smbcli_state *cli)
{
BOOL res = True;
if (!test_netserverenum(cli))
res = False;
if (!test_netshareenum(cli))
res = False;
res &= test_netserverenum(cli);
res &= test_netshareenum(cli);
res &= test_netservergetinfo(cli);
return res;
}