#include <errno.h>
#include <signal.h>
#include <arpa/nameser.h>
+#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/time.h>
#include <dirent.h>
#include <unistd.h>
+#ifdef HAVE_SYS_SOCKET_H
+#include <sys/socket.h>
+#endif
#define FALSE 0
#define TRUE 1
#define Ustrlen(s) (int)strlen(CCS(s))
#define Ustrncmp(s,t,n) strncmp(CCS(s),CCS(t),n)
#define Ustrncpy(s,t,n) strncpy(CS(s),CCS(t),n)
+#define Ustrtok(s,t) (uschar*)strtok(CS(s),CCS(t))
typedef struct zoneitem {
uschar *zone;
switch (tvalue)
{
case ns_t_soa:
- p = strtok(p, " ");
- ep = p + strlen(p);
+ p = Ustrtok(p, " ");
+ ep = p + Ustrlen(p);
if (ep[-1] != '.') sprintf(CS ep, "%s.", zone);
pk = packname(p, pk); /* primary ns */
- p = strtok(NULL, " ");
+ p = Ustrtok(NULL, " ");
pk = packname(p , pk); /* responsible mailbox */
- *(p += strlen(p)) = ' ';
+ *(p += Ustrlen(p)) = ' ';
while (isspace(*p)) p++;
pk = longfield(&p, pk); /* serial */
pk = longfield(&p, pk); /* refresh */
break;
case ns_t_a:
- for (i = 0; i < 4; i++)
- {
- value = 0;
- while (isdigit(*p)) value = value*10 + *p++ - '0';
- *pk++ = value;
- p++;
- }
+ inet_pton(AF_INET, CCS p, pk); /* FIXME: error checking */
+ pk += 4;
break;
- /* The only occurrence of a double colon is for ::1 */
case ns_t_aaaa:
- if (Ustrcmp(p, "::1") == 0)
- {
- memset(pk, 0, 15);
- pk += 15;
- *pk++ = 1;
- }
- else for (i = 0; i < 8; i++)
- {
- value = 0;
- while (isxdigit(*p))
- {
- value = value * 16 + toupper(*p) - (isdigit(*p)? '0' : '7');
- p++;
- }
- *pk++ = (value >> 8) & 255;
- *pk++ = value & 255;
- p++;
- }
+ inet_pton(AF_INET6, CCS p, pk); /* FIXME: error checking */
+ pk += 16;
break;
case ns_t_mx: