diff options
-rw-r--r-- | src/zonefile.c | 57 | ||||
-rw-r--r-- | src/zonefile.h | 15 |
2 files changed, 70 insertions, 2 deletions
diff --git a/src/zonefile.c b/src/zonefile.c index 1dd3d2d..3f00212 100644 --- a/src/zonefile.c +++ b/src/zonefile.c @@ -6,7 +6,62 @@ #include "zonefile.h" -int zonefile_parse_to_list (void** _list, char* _file) { +int zonefile_parse_line(database_t *_database, char *_line) { + unsigned int i, o, start; + char *parts[5]; + + /* Does this work? */ + memset(&parts, 0, sizeof(parts)); + + start = 0; + for ( i=0; i < 4; i++ ) { + for ( o=start; _line[o] && _line[o] != ' '; o++ ); + + parts[i] = &_line[start]; + + if(!_line[o]) + break; + + _line[o] = '\0'; + + start = o+1; + } + + /* parts is the first 5 space-seperated parts of _line */ + + return -1; +} + +int zonefile_to_database (database_t *_database, char* _file) { + FILE *zfile = NULL; + char *line = NULL; + ssize_t line_len = 0; + unsigned int line_cnt = 0; + + zfile = fopen(_file, "r"); + if (!zfile) { + LOGPRINTF(_LOG_ERRNO, "Could not open %s", _file); + return -1; + } + + while(!feof(zfile)) { + line_cnt ++; + line_len = getline(&line, 0, zfile); + + /* getline includes the line break. ONLY UNIX!! */ + if( line[line_len - 2] == '\n' ) + line[line_len - 2] = '\0'; + + if ( zonefile_parse_line(_database, line) < 0) { + LOGPRINTF(_LOG_ERROR, "Error is in line %u", line_cnt) + return -1; + } + + free(line); + line = NULL; + } + + fclose(zfile); return -1; } diff --git a/src/zonefile.h b/src/zonefile.h index 8c2dac3..98f1fa3 100644 --- a/src/zonefile.h +++ b/src/zonefile.h @@ -7,5 +7,18 @@ #pragma once #include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#include "database.h" +#include "log.h" + +/** + * NOT COMPATIBLE WITH STANDARD ZONEFILES! + * use FIXED format + * <name> <ttl> <class> <type> <value> + */ +int zonefile_to_database (database_t *_database, char* _file); + +int zonefile_parse_line(database_t *_database, char *_line); -int zonefile_parse_to_list (void** _list, char* _file); |