(void)ssl_printf(ssl, "removed %d zones\n", num);
}
+/** check syntax of newly added RR */
+static int
+check_RR_syntax(RES* ssl, char* str, int line)
+{
+ uint8_t rr[LDNS_RR_BUF_SIZE];
+ size_t len = sizeof(rr), dname_len = 0;
+ int s = sldns_str2wire_rr_buf(str, rr, &len, &dname_len, 3600,
+ NULL, 0, NULL, 0);
+ if(s != 0) {
+ char linestr[32];
+ if(line == 0)
+ linestr[0]=0;
+ else snprintf(linestr, sizeof(linestr), "line %d ", line);
+ if(!ssl_printf(ssl, "error parsing local-data at %sposition %d '%s': %s\n",
+ linestr, LDNS_WIREPARSE_OFFSET(s), str,
+ sldns_get_errorstr_parse(s)))
+ return 0;
+ return 0;
+ }
+ return 1;
+}
+
/** Add new RR data */
static int
-perform_data_add(RES* ssl, struct local_zones* zones, char* arg)
+perform_data_add(RES* ssl, struct local_zones* zones, char* arg, int line)
{
+ if(!check_RR_syntax(ssl, arg, line)) {
+ return 0;
+ }
if(!local_zones_add_RR(zones, arg)) {
ssl_printf(ssl,"error in syntax or out of memory, %s\n", arg);
return 0;
static void
do_data_add(RES* ssl, struct local_zones* zones, char* arg)
{
- if(!perform_data_add(ssl, zones, arg))
+ if(!perform_data_add(ssl, zones, arg, 0))
return;
send_ok(ssl);
}
do_datas_add(RES* ssl, struct local_zones* zones)
{
char buf[2048];
- int num = 0;
+ int num = 0, line = 0;
while(ssl_read_line(ssl, buf, sizeof(buf))) {
if(buf[0] == 0x04 && buf[1] == 0)
break; /* end of transmission */
- if(!perform_data_add(ssl, zones, buf)) {
+ line++;
+ if(!perform_data_add(ssl, zones, buf, line)) {
if(!ssl_printf(ssl, "error for input line: %s\n", buf))
return;
}