summaryrefslogtreecommitdiff
path: root/common/soa.c
diff options
context:
space:
mode:
authorStef Walter <stef@memberwebs.com>2008-06-09 17:22:43 +0000
committerStef Walter <stef@memberwebs.com>2008-06-09 17:22:43 +0000
commitb9ecd6e5e5b87fe1c4dab960e92246772002dd6a (patch)
treeeb05eb48888e391678fa706ec5f62b012df2456e /common/soa.c
parent3add3c0e19b659427a2624ec85daf67019b8ed7f (diff)
Merge the two dns plugins
Diffstat (limited to 'common/soa.c')
-rw-r--r--common/soa.c77
1 files changed, 77 insertions, 0 deletions
diff --git a/common/soa.c b/common/soa.c
new file mode 100644
index 0000000..c2bbcc4
--- /dev/null
+++ b/common/soa.c
@@ -0,0 +1,77 @@
+
+#include "soa.h"
+
+#include <assert.h>
+#include <string.h>
+#include <errno.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <ctype.h>
+
+#define SEPARATORS " \t\n\v()"
+
+int
+soa_serial_increment (const char *old_soa, char *new_soa, unsigned int new_len)
+{
+ unsigned long value;
+ const char *p, *beg;
+ char *end;
+ unsigned int len;
+
+ assert (old_soa);
+ assert (new_soa);
+
+ /* Check that we can add a digit */
+ len = strlen (old_soa);
+ assert (new_len >= len + 2);
+
+ p = old_soa;
+
+ /* Eat up space at the beginning */
+ while (*p && strchr (SEPARATORS, *p))
+ ++p;
+ /* Skip over domain name, to next sep */
+ while (*p && !strchr (SEPARATORS, *p))
+ ++p;
+ /* Eat up space between */
+ while (*p && strchr (SEPARATORS, *p))
+ ++p;
+ /* Skip over administrator email, to next sep */
+ while (*p && !strchr (SEPARATORS, *p))
+ ++p;
+ /* Eat up spaces between */
+ while (*p && strchr (SEPARATORS, *p))
+ ++p;
+
+ if (*p == 0 || !isdigit (*p)) {
+ errno = EINVAL;
+ return -1;
+ }
+
+ /* Parse the integer here */
+ beg = p;
+ value = strtoul (beg, &end, 10);
+ if (beg == end || !strchr (SEPARATORS, *end)) {
+ errno = EINVAL;
+ return -1;
+ }
+
+ /* Increment the integer appropriately */
+ if (value == 0xFFFFFFFF)
+ value = 1; /* Zero is recommended against in RFC 1982 */
+ else
+ ++value;
+
+ /* Build up the new SOA */
+ memset (new_soa, 0, new_len);
+ len = beg - old_soa;
+ strncpy (new_soa, old_soa, len);
+ snprintf (new_soa + len, 32, "%lu", value);
+ len = strlen (new_soa);
+ strcpy (new_soa + len, end);
+
+ len = strlen (new_soa);
+ assert (len < new_len);
+
+ return len;
+}