mirror of
https://github.com/samba-team/samba.git
synced 2025-01-22 22:04:08 +03:00
r5155: define ipv4address as a based IDL type, mapped to a "const char *" in
the header, and defined on the wire as a 4 byte network byte order IP. This means the calling code doesn't have to worry about network byte order conversions.
This commit is contained in:
parent
cbc1f17282
commit
72048e3717
@ -302,6 +302,7 @@ my %type_alignments =
|
||||
"WERROR" => 4,
|
||||
"boolean32" => 4,
|
||||
"unsigned32" => 4,
|
||||
"ipv4address" => 4,
|
||||
"hyper" => 8,
|
||||
"NTTIME_hyper" => 8
|
||||
);
|
||||
@ -538,7 +539,8 @@ my %type_mappings =
|
||||
"udlong" => "uint64_t",
|
||||
"hyper" => "uint64_t",
|
||||
"NTTIME_1sec" => "NTTIME",
|
||||
"NTTIME_hyper" => "NTTIME"
|
||||
"NTTIME_hyper" => "NTTIME",
|
||||
"ipv4address" => "const char *"
|
||||
);
|
||||
|
||||
# map from a IDL type to a C header type
|
||||
|
@ -91,6 +91,14 @@
|
||||
|
||||
typedef int BOOL;
|
||||
|
||||
/*
|
||||
we use struct ipv4_addr to avoid having to include all the
|
||||
system networking headers everywhere
|
||||
*/
|
||||
struct ipv4_addr {
|
||||
uint32_t addr;
|
||||
};
|
||||
|
||||
#ifndef HAVE_STRERROR
|
||||
extern char *sys_errlist[];
|
||||
#define strerror(i) sys_errlist[i]
|
||||
|
@ -72,8 +72,6 @@ NTSTATUS nbt_name_query_recv(struct nbt_name_request *req,
|
||||
{
|
||||
NTSTATUS status;
|
||||
struct nbt_name_packet *packet;
|
||||
const char *addr;
|
||||
struct in_addr in;
|
||||
int i;
|
||||
|
||||
status = nbt_name_request_recv(req);
|
||||
@ -102,13 +100,8 @@ NTSTATUS nbt_name_query_recv(struct nbt_name_request *req,
|
||||
}
|
||||
|
||||
for (i=0;i<io->out.num_addrs;i++) {
|
||||
in.s_addr = htonl(packet->answers[0].rdata.netbios.addresses[i].ipaddr.addr);
|
||||
addr = inet_ntoa(in);
|
||||
if (addr == NULL) {
|
||||
talloc_free(req);
|
||||
return NT_STATUS_NO_MEMORY;
|
||||
}
|
||||
io->out.reply_addrs[i] = talloc_strdup(mem_ctx, addr);
|
||||
io->out.reply_addrs[i] = talloc_steal(mem_ctx,
|
||||
packet->answers[0].rdata.netbios.addresses[i].ipaddr);
|
||||
}
|
||||
|
||||
talloc_steal(mem_ctx, io->out.name.name);
|
||||
|
@ -64,7 +64,8 @@ struct nbt_name_request *nbt_name_refresh_send(struct nbt_name_socket *nbtsock,
|
||||
struct nbt_rdata_address, 1);
|
||||
if (packet->additional[0].rdata.netbios.addresses == NULL) goto failed;
|
||||
packet->additional[0].rdata.netbios.addresses[0].nb_flags = io->in.nb_flags;
|
||||
packet->additional[0].rdata.netbios.addresses[0].ipaddr.addr = htonl(inet_addr(io->in.address));
|
||||
packet->additional[0].rdata.netbios.addresses[0].ipaddr =
|
||||
talloc_strdup(packet->additional, io->in.address);
|
||||
|
||||
req = nbt_name_request_send(nbtsock, io->in.dest_addr, lp_nbt_port(), packet,
|
||||
timeval_current_ofs(io->in.timeout, 0), False);
|
||||
@ -86,8 +87,6 @@ NTSTATUS nbt_name_refresh_recv(struct nbt_name_request *req,
|
||||
{
|
||||
NTSTATUS status;
|
||||
struct nbt_name_packet *packet;
|
||||
const char *addr;
|
||||
struct in_addr in;
|
||||
|
||||
status = nbt_name_request_recv(req);
|
||||
if (!NT_STATUS_IS_OK(status) ||
|
||||
@ -112,13 +111,8 @@ NTSTATUS nbt_name_refresh_recv(struct nbt_name_request *req,
|
||||
talloc_free(req);
|
||||
return NT_STATUS_INVALID_NETWORK_RESPONSE;
|
||||
}
|
||||
in.s_addr = htonl(packet->answers[0].rdata.netbios.addresses[0].ipaddr.addr);
|
||||
addr = inet_ntoa(in);
|
||||
if (addr == NULL) {
|
||||
talloc_free(req);
|
||||
return NT_STATUS_NO_MEMORY;
|
||||
}
|
||||
io->out.reply_addr = talloc_strdup(mem_ctx, addr);
|
||||
io->out.reply_addr = talloc_steal(mem_ctx,
|
||||
packet->answers[0].rdata.netbios.addresses[0].ipaddr);
|
||||
talloc_steal(mem_ctx, io->out.name.name);
|
||||
talloc_steal(mem_ctx, io->out.name.scope);
|
||||
|
||||
|
@ -67,7 +67,9 @@ struct nbt_name_request *nbt_name_register_send(struct nbt_name_socket *nbtsock,
|
||||
struct nbt_rdata_address, 1);
|
||||
if (packet->additional[0].rdata.netbios.addresses == NULL) goto failed;
|
||||
packet->additional[0].rdata.netbios.addresses[0].nb_flags = io->in.nb_flags;
|
||||
packet->additional[0].rdata.netbios.addresses[0].ipaddr.addr = htonl(inet_addr(io->in.address));
|
||||
packet->additional[0].rdata.netbios.addresses[0].ipaddr =
|
||||
talloc_strdup(packet->additional, io->in.address);
|
||||
if (packet->additional[0].rdata.netbios.addresses[0].ipaddr == NULL) goto failed;
|
||||
|
||||
req = nbt_name_request_send(nbtsock, io->in.dest_addr, lp_nbt_port(), packet,
|
||||
timeval_current_ofs(io->in.timeout, 0), False);
|
||||
@ -89,8 +91,6 @@ NTSTATUS nbt_name_register_recv(struct nbt_name_request *req,
|
||||
{
|
||||
NTSTATUS status;
|
||||
struct nbt_name_packet *packet;
|
||||
const char *addr;
|
||||
struct in_addr in;
|
||||
|
||||
status = nbt_name_request_recv(req);
|
||||
if (!NT_STATUS_IS_OK(status) ||
|
||||
@ -115,13 +115,8 @@ NTSTATUS nbt_name_register_recv(struct nbt_name_request *req,
|
||||
talloc_free(req);
|
||||
return NT_STATUS_INVALID_NETWORK_RESPONSE;
|
||||
}
|
||||
in.s_addr = htonl(packet->answers[0].rdata.netbios.addresses[0].ipaddr.addr);
|
||||
addr = inet_ntoa(in);
|
||||
if (addr == NULL) {
|
||||
talloc_free(req);
|
||||
return NT_STATUS_NO_MEMORY;
|
||||
}
|
||||
io->out.reply_addr = talloc_strdup(mem_ctx, addr);
|
||||
io->out.reply_addr = talloc_steal(mem_ctx,
|
||||
packet->answers[0].rdata.netbios.addresses[0].ipaddr);
|
||||
talloc_steal(mem_ctx, io->out.name.name);
|
||||
talloc_steal(mem_ctx, io->out.name.scope);
|
||||
|
||||
|
@ -99,7 +99,7 @@ interface epmapper
|
||||
} epm_rhs_tcp;
|
||||
|
||||
typedef struct {
|
||||
ipv4_addr ipaddr;
|
||||
ipv4address ipaddr;
|
||||
} epm_rhs_ip;
|
||||
|
||||
typedef struct {
|
||||
|
@ -6,10 +6,6 @@
|
||||
|
||||
interface misc
|
||||
{
|
||||
typedef [public,noprint] struct {
|
||||
uint32 addr;
|
||||
} ipv4_addr;
|
||||
|
||||
typedef [public,noprint,gensize] struct {
|
||||
uint32 time_low;
|
||||
uint16 time_mid;
|
||||
|
@ -102,7 +102,7 @@ interface nbt
|
||||
|
||||
typedef struct {
|
||||
nb_flags nb_flags;
|
||||
ipv4_addr ipaddr;
|
||||
ipv4address ipaddr;
|
||||
} nbt_rdata_address;
|
||||
|
||||
typedef struct {
|
||||
|
@ -21,6 +21,7 @@
|
||||
*/
|
||||
|
||||
#include "includes.h"
|
||||
#include "system/network.h"
|
||||
|
||||
#define NDR_BE(ndr) (((ndr)->flags & (LIBNDR_FLAG_BIGENDIAN|LIBNDR_FLAG_LITTLE_ENDIAN)) == LIBNDR_FLAG_BIGENDIAN)
|
||||
#define NDR_SVAL(ndr, ofs) (NDR_BE(ndr)?RSVAL(ndr->data,ofs):SVAL(ndr->data,ofs))
|
||||
@ -1017,6 +1018,39 @@ NTSTATUS ndr_pull_time_t(struct ndr_pull *ndr, time_t *t)
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
pull a ipv4address
|
||||
*/
|
||||
NTSTATUS ndr_pull_ipv4address(struct ndr_pull *ndr, const char **address)
|
||||
{
|
||||
struct ipv4_addr in;
|
||||
NDR_CHECK(ndr_pull_uint32(ndr, &in.addr));
|
||||
in.addr = htonl(in.addr);
|
||||
*address = talloc_strdup(ndr, sys_inet_ntoa(in));
|
||||
NT_STATUS_HAVE_NO_MEMORY(*address);
|
||||
return NT_STATUS_OK;
|
||||
}
|
||||
|
||||
/*
|
||||
push a ipv4address
|
||||
*/
|
||||
NTSTATUS ndr_push_ipv4address(struct ndr_push *ndr, const char *address)
|
||||
{
|
||||
uint32_t addr = interpret_addr(address);
|
||||
NDR_CHECK(ndr_push_uint32(ndr, htonl(addr)));
|
||||
return NT_STATUS_OK;
|
||||
}
|
||||
|
||||
/*
|
||||
print a ipv4address
|
||||
*/
|
||||
void ndr_print_ipv4address(struct ndr_print *ndr, const char *name,
|
||||
const char *address)
|
||||
{
|
||||
ndr->print(ndr, "%-25s: %s", name, address);
|
||||
}
|
||||
|
||||
|
||||
void ndr_print_struct(struct ndr_print *ndr, const char *name, const char *type)
|
||||
{
|
||||
ndr->print(ndr, "%s: struct %s", name, type);
|
||||
|
@ -386,15 +386,7 @@ const char *dcerpc_floor_get_rhs_data(TALLOC_CTX *mem_ctx, struct epm_floor *flo
|
||||
return talloc_asprintf(mem_ctx, "%d", floor->rhs.http.port);
|
||||
|
||||
case EPM_PROTOCOL_IP:
|
||||
if (floor->rhs.ip.ipaddr.addr == 0) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
{
|
||||
struct ipv4_addr in;
|
||||
in.addr = htonl(floor->rhs.ip.ipaddr.addr);
|
||||
return talloc_strdup(mem_ctx, sys_inet_ntoa(in));
|
||||
}
|
||||
return talloc_strdup(mem_ctx, floor->rhs.ip.ipaddr);
|
||||
|
||||
case EPM_PROTOCOL_NCACN:
|
||||
return NULL;
|
||||
@ -457,11 +449,8 @@ static NTSTATUS dcerpc_floor_set_rhs_data(TALLOC_CTX *mem_ctx, struct epm_floor
|
||||
return NT_STATUS_OK;
|
||||
|
||||
case EPM_PROTOCOL_IP:
|
||||
if (strlen(data) > 0) {
|
||||
floor->rhs.ip.ipaddr.addr = ntohl(interpret_addr(data));
|
||||
} else {
|
||||
floor->rhs.ip.ipaddr.addr = 0;
|
||||
}
|
||||
floor->rhs.ip.ipaddr = talloc_strdup(mem_ctx, data);
|
||||
NT_STATUS_HAVE_NO_MEMORY(floor->rhs.ip.ipaddr);
|
||||
return NT_STATUS_OK;
|
||||
|
||||
case EPM_PROTOCOL_NCACN:
|
||||
@ -474,23 +463,17 @@ static NTSTATUS dcerpc_floor_set_rhs_data(TALLOC_CTX *mem_ctx, struct epm_floor
|
||||
|
||||
case EPM_PROTOCOL_SMB:
|
||||
floor->rhs.smb.unc = talloc_strdup(mem_ctx, data);
|
||||
if (!floor->rhs.smb.unc) {
|
||||
return NT_STATUS_NO_MEMORY;
|
||||
}
|
||||
NT_STATUS_HAVE_NO_MEMORY(floor->rhs.smb.unc);
|
||||
return NT_STATUS_OK;
|
||||
|
||||
case EPM_PROTOCOL_PIPE:
|
||||
floor->rhs.pipe.path = talloc_strdup(mem_ctx, data);
|
||||
if (!floor->rhs.pipe.path) {
|
||||
return NT_STATUS_NO_MEMORY;
|
||||
}
|
||||
NT_STATUS_HAVE_NO_MEMORY(floor->rhs.pipe.path);
|
||||
return NT_STATUS_OK;
|
||||
|
||||
case EPM_PROTOCOL_NETBIOS:
|
||||
floor->rhs.netbios.name = talloc_strdup(mem_ctx, data);
|
||||
if (!floor->rhs.netbios.name) {
|
||||
return NT_STATUS_NO_MEMORY;
|
||||
}
|
||||
NT_STATUS_HAVE_NO_MEMORY(floor->rhs.netbios.name);
|
||||
return NT_STATUS_OK;
|
||||
|
||||
case EPM_PROTOCOL_NCALRPC:
|
||||
@ -506,16 +489,12 @@ static NTSTATUS dcerpc_floor_set_rhs_data(TALLOC_CTX *mem_ctx, struct epm_floor
|
||||
|
||||
case EPM_PROTOCOL_STREETTALK:
|
||||
floor->rhs.streettalk.streettalk = talloc_strdup(mem_ctx, data);
|
||||
if (!floor->rhs.streettalk.streettalk) {
|
||||
return NT_STATUS_NO_MEMORY;
|
||||
}
|
||||
NT_STATUS_HAVE_NO_MEMORY(floor->rhs.streettalk.streettalk);
|
||||
return NT_STATUS_OK;
|
||||
|
||||
case EPM_PROTOCOL_UNIX_DS:
|
||||
floor->rhs.unix_ds.path = talloc_strdup(mem_ctx, data);
|
||||
if (!floor->rhs.unix_ds.path) {
|
||||
return NT_STATUS_NO_MEMORY;
|
||||
}
|
||||
NT_STATUS_HAVE_NO_MEMORY(floor->rhs.unix_ds.path);
|
||||
return NT_STATUS_OK;
|
||||
|
||||
case EPM_PROTOCOL_NULL:
|
||||
|
@ -60,7 +60,9 @@ static void nbt_name_query_reply(struct nbt_name_socket *nbtsock,
|
||||
struct nbt_rdata_address, 1);
|
||||
if (packet->answers[0].rdata.netbios.addresses == NULL) goto failed;
|
||||
packet->answers[0].rdata.netbios.addresses[0].nb_flags = nb_flags;
|
||||
packet->answers[0].rdata.netbios.addresses[0].ipaddr.addr = htonl(inet_addr(address));
|
||||
packet->answers[0].rdata.netbios.addresses[0].ipaddr =
|
||||
talloc_strdup(packet->answers, address);
|
||||
if (packet->answers[0].rdata.netbios.addresses[0].ipaddr == NULL) goto failed;
|
||||
|
||||
DEBUG(7,("Sending name query reply for %s<%02x> at %s to %s:%d\n",
|
||||
name->name, name->type, src_address, address, src_port));
|
||||
|
@ -63,12 +63,7 @@ static void display_tower(TALLOC_CTX *mem_ctx, struct epm_tower *twr)
|
||||
break;
|
||||
|
||||
case EPM_PROTOCOL_IP:
|
||||
printf(" IP:");
|
||||
{
|
||||
struct ipv4_addr in;
|
||||
in.addr = htonl(rhs->ip.ipaddr.addr);
|
||||
printf("%s", sys_inet_ntoa(in));
|
||||
}
|
||||
printf(" IP:%s", rhs->ip.ipaddr);
|
||||
break;
|
||||
|
||||
case EPM_PROTOCOL_PIPE:
|
||||
@ -158,7 +153,7 @@ static BOOL test_Map(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
|
||||
|
||||
twr->tower.floors[4].lhs.protocol = EPM_PROTOCOL_IP;
|
||||
twr->tower.floors[4].lhs.info.lhs_data = data_blob(NULL, 0);
|
||||
twr->tower.floors[4].rhs.ip.ipaddr.addr = 0;
|
||||
twr->tower.floors[4].rhs.ip.ipaddr = "0.0.0.0";
|
||||
|
||||
status = dcerpc_epm_Map(p, mem_ctx, &r);
|
||||
if (NT_STATUS_IS_OK(status) && r.out.result == 0) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user