Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/usr.sbin/ldpd sync behaviour with man page: accept spaces, e...



details:   https://anonhg.NetBSD.org/src/rev/b136a80f9b83
branches:  trunk
changeset: 790614:b136a80f9b83
user:      kefren <kefren%NetBSD.org@localhost>
date:      Fri Oct 18 14:14:14 2013 +0000

description:
sync behaviour with man page: accept spaces, empty lines and comments

diffstat:

 usr.sbin/ldpd/conffile.c |  127 +++++++++++++++++++++++++++++-----------------
 1 files changed, 81 insertions(+), 46 deletions(-)

diffs (221 lines):

diff -r c9dcc6b7fd35 -r b136a80f9b83 usr.sbin/ldpd/conffile.c
--- a/usr.sbin/ldpd/conffile.c  Fri Oct 18 13:24:40 2013 +0000
+++ b/usr.sbin/ldpd/conffile.c  Fri Oct 18 14:14:14 2013 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: conffile.c,v 1.7 2013/10/17 18:10:23 kefren Exp $ */
+/* $NetBSD: conffile.c,v 1.8 2013/10/18 14:14:14 kefren Exp $ */
 
 /*
  * Copyright (c) 2010 The NetBSD Foundation, Inc.
@@ -31,7 +31,7 @@
 
 #include <arpa/inet.h>
 #include <netinet/in.h>
-
+#include <sys/mman.h>
 #include <ctype.h>
 #include <fcntl.h>
 #include <stdlib.h>
@@ -44,13 +44,15 @@
 #define NextCommand(x) strsep(&x, " ")
 #define LINEMAXSIZE 1024
 
+char *mapped, *nextline;
+size_t mapsize;
+
 extern int ldp_hello_time, ldp_keepalive_time, ldp_holddown_time, command_port,
        min_label, max_label, no_default_route, loop_detection;
-int confh;
 struct in_addr conf_ldp_id;
 
 static int conf_dispatch(char*);
-static int conf_readline(char*, size_t);
+static char * conf_getlinelimit(void);
 static int checkeol(char*);
 static int Fhellotime(char*);
 static int Fport(char*);
@@ -108,52 +110,59 @@
 int
 conf_parsefile(const char *fname)
 {
-       char buf[LINEMAXSIZE + 1];
+       char line[LINEMAXSIZE+1];
+       struct stat fs;
 
        SLIST_INIT(&conei_head);
        SLIST_INIT(&coifs_head);
        conf_ldp_id.s_addr = 0;
 
-       confh = open(fname, O_RDONLY, 0);
+       int confh = open(fname, O_RDONLY, 0);
 
-       if (confh == -1)
+       if (confh == -1 || fstat(confh, &fs) == -1 ||
+           (mapped = mmap(NULL, fs.st_size, PROT_READ, MAP_SHARED, confh, 0))
+           == MAP_FAILED)
                return E_CONF_IO;
 
-       for (parseline = 1; conf_readline(buf, sizeof(buf)) >= 0; parseline++)
-               if (conf_dispatch(buf) != 0) {
-                       close(confh);
-                       return parseline;
-               }
-
+       mapsize = fs.st_size;
+       nextline = mapped;
+       for (parseline = 1; ; parseline++) {
+               char *prev = nextline;
+               if ((nextline = conf_getlinelimit()) == NULL)
+                       break;
+               while (isspace((int)*prev) != 0 && prev < nextline)
+                       prev++;
+               if (nextline - prev < 2)
+                       continue;
+               else if (nextline - prev > LINEMAXSIZE)
+                       goto parerr;
+               memcpy(line, prev, nextline - prev);
+               if (line[0] == '#')
+                       continue;
+               else
+                       line[nextline - prev] = '\0';
+               if (conf_dispatch(line) != 0)
+                       goto parerr;
+       }
+       munmap(mapped, mapsize);
        close(confh);
        return 0;
+parerr:
+       munmap(mapped, mapsize);
+       close(confh);
+       return parseline;
 }
 
-/*
- * Reads a line from config file
- */
-int
-conf_readline(char *buf, size_t bufsize)
+char *
+conf_getlinelimit(void)
 {
-       size_t i;
+       char *p = nextline;
 
-       for (i = 0; i < bufsize; i++) {
-               if (read(confh, &buf[i], 1) != 1) {
-                       if (i == 0)
-                               return E_CONF_IO;
-                       break;
-               }
-               if (buf[i] == '\n')
-                       break;
-               if (i == 0 && isspace((unsigned char)buf[i]) != 0) {
-                       i--;
-                       continue;
-               }
-       }
-       if (i == bufsize)
-               return E_CONF_MEM;
-       buf[i] = '\0';
-       return i;
+       if (nextline < mapped || (size_t)(nextline - mapped) >= mapsize)
+               return NULL;
+
+       for (p = nextline; *p != '\n' && (size_t)(p - mapped) < mapsize; p++);
+       return p + 1;
 }
 
 /*
@@ -179,7 +188,7 @@
        else if (matched > 1)
                return E_CONF_AMBIGUOUS;
 
-       if (checkeol(nline) != 0)
+       if (nline == NULL || checkeol(nline) != 0)
                return E_CONF_PARAM;
        return main_commands[last_match].func(nline);
 }
@@ -193,6 +202,10 @@
 checkeol(char *line)
 {
        size_t len = strlen(line);
+       if (len > 0 && line[len - 1] == '\n') {
+               line[len - 1] = '\0';
+               len--;
+       }
        if (len > 0 && line[len - 1] == ';') {
                line[len - 1] = '\0';
                return 0;
@@ -289,7 +302,7 @@
        char *peer;
        struct conf_neighbour *nei;
        struct in_addr ad;
-       char buf[1024];
+       char buf[LINEMAXSIZE];
 
        peer = NextCommand(line);
        if (inet_pton(AF_INET, peer, &ad) != 1)
@@ -301,10 +314,21 @@
        nei->address.s_addr = ad.s_addr;
        SLIST_INSERT_HEAD(&conei_head, nei, neilist);
 
-       while (conf_readline(buf, sizeof(buf)) >= 0) {
+       for ( ; ; ) {
+               char *prev = nextline;
                parseline++;
-               if (buf[0] == '}')
-                       return 0;
+               nextline = conf_getlinelimit();
+               if (nextline == NULL || (size_t)(nextline - prev) > LINEMAXSIZE)
+                       return -1;
+               while (isspace((int)*prev) != 0 && prev < nextline)
+                       prev++;
+               memcpy(buf, prev, nextline - prev);
+               if (nextline - prev < 2 || buf[0] == '#')
+                       continue;
+               else if (buf[0] == '}')
+                       break;
+               else
+                       buf[nextline - prev] = '\0';
                if (Gneighbour(nei, buf) == -1)
                        return -1;
        }
@@ -352,7 +376,7 @@
 {
        char *ifname;
        struct conf_interface *conf_if = calloc(1, sizeof(*conf_if));
-       char buf[1024];
+       char buf[LINEMAXSIZE];
 
        ifname = NextCommand(line);
        if (conf_if == NULL || ifname == NULL)
@@ -360,14 +384,25 @@
        strlcpy(conf_if->if_name, ifname, IF_NAMESIZE);
        SLIST_INSERT_HEAD(&coifs_head, conf_if, iflist);
 
-       while (conf_readline(buf, sizeof(buf)) >= 0) {
+       for ( ; ; ) {
+               char *prev = nextline;
                parseline++;
-               if (buf[0] == '}')
-                       return 0;
+               nextline = conf_getlinelimit();
+               if (nextline == NULL || (size_t)(nextline - prev) > LINEMAXSIZE)
+                       return -1;
+               while (isspace((int)*prev) != 0 && prev < nextline)
+                       prev++;
+               memcpy(buf, prev, nextline - prev);
+               if (nextline - prev < 2 || buf[0] == '#')
+                       continue;
+               else if (buf[0] == '}')
+                       break;
+               else
+                       buf[nextline - prev] = '\0';
                if (Ginterface(conf_if, buf) == -1)
                        return -1;
        }
-       return -1;
+       return 0;
 }
 
 int



Home | Main Index | Thread Index | Old Index