"WERROR" => 4,
"boolean32" => 4,
"unsigned32" => 4,
+ "ipv4address" => 4,
"hyper" => 8,
"NTTIME_hyper" => 8
);
"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
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]
{
NTSTATUS status;
struct nbt_name_packet *packet;
- const char *addr;
- struct in_addr in;
int i;
status = nbt_name_request_recv(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);
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);
{
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) ||
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);
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);
{
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) ||
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);
} epm_rhs_tcp;
typedef struct {
- ipv4_addr ipaddr;
+ ipv4address ipaddr;
} epm_rhs_ip;
typedef struct {
interface misc
{
- typedef [public,noprint] struct {
- uint32 addr;
- } ipv4_addr;
-
typedef [public,noprint,gensize] struct {
uint32 time_low;
uint16 time_mid;
typedef struct {
nb_flags nb_flags;
- ipv4_addr ipaddr;
+ ipv4address ipaddr;
} nbt_rdata_address;
typedef struct {
*/
#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))
}
+/*
+ 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);
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;
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:
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:
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:
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));
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:
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) {