X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?p=secnet.git;a=blobdiff_plain;f=util.c;h=e34336c77e4cc171f69555ad87b00d1e6f762e5d;hp=426fc69c1a9e922931c52c23d88377dbcf743f1d;hb=6f146b5d44db84d647d18805ca58586e1555a0a4;hpb=61dbc9e060153651a0d4eecac5a5fab1c36fa530 diff --git a/util.c b/util.c index 426fc69..e34336c 100644 --- a/util.c +++ b/util.c @@ -40,6 +40,7 @@ #include "util.h" #include "unaligned.h" #include "magic.h" +#include "ipaddr.h" #define MIN_BUFFER_SIZE 64 #define DEFAULT_BUFFER_SIZE 4096 @@ -70,17 +71,30 @@ char *safe_strdup(const char *s, const char *message) void *safe_malloc(size_t size, const char *message) { void *r; + if (!size) + return 0; r=malloc(size); if (!r) { fatal_perror("%s",message); } return r; } -void *safe_malloc_ary(size_t size, size_t count, const char *message) { +void *safe_realloc_ary(void *p, size_t size, size_t count, + const char *message) { if (count >= INT_MAX/size) { fatal("array allocation overflow: %s", message); } - return safe_malloc(size*count, message); + assert(size && count); + p = realloc(p, size*count); + if (!p) + fatal_perror("%s", message); + return p; +} + +void *safe_malloc_ary(size_t size, size_t count, const char *message) { + if (!size || !count) + return 0; + return safe_realloc_ary(0,size,count,message); } /* Convert a buffer into its MP_INT representation */ @@ -478,6 +492,29 @@ extern void slilog_part(struct log_if *lf, int priority, const char *message, .. va_end(ap); } +void string_item_to_iaddr(const item_t *item, uint16_t port, union iaddr *ia, + const char *desc) +{ +#ifndef CONFIG_IPV6 + + ia->sin.sin_family=AF_INET; + ia->sin.sin_addr.s_addr=string_item_to_ipaddr(item,desc); + +#else /* CONFIG_IPV6 => we have adns_text2addr */ + + if (item->type!=t_string) + cfgfatal(item->loc,desc,"expecting a string IP (v4 or v6) address\n"); + socklen_t salen=sizeof(*ia); + int r=adns_text2addr(item->data.string, port, + adns_qf_addrlit_ipv4_quadonly, + &ia->sa, &salen); + assert(r!=ENOSPC); + if (r) cfgfatal(item->loc,desc,"invalid IP (v4 or v6) address: %s\n", + strerror(r)); + +#endif /* CONFIG_IPV6 */ +} + #define IADDR_NBUFS_SHIFT 3 #define IADDR_NBUFS (1 << IADDR_NBUFS_SHIFT)