Refactor the TAL loading code a bit (move the file parsing back into
tal.c) and adjust the regress test to use this new function. This fixes
the regress test and makes the code a bit nicer.

OK?
-- 
:wq Claudio

Index: usr.sbin/rpki-client/extern.h
===================================================================
RCS file: /cvs/src/usr.sbin/rpki-client/extern.h,v
retrieving revision 1.10
diff -u -p -r1.10 extern.h
--- usr.sbin/rpki-client/extern.h       31 Oct 2019 08:36:43 -0000      1.10
+++ usr.sbin/rpki-client/extern.h       1 Nov 2019 19:59:50 -0000
@@ -230,6 +230,7 @@ extern int verbose;
 void            tal_buffer(char **, size_t *, size_t *, const struct tal *);
 void            tal_free(struct tal *);
 struct tal     *tal_parse(const char *, char *);
+char           *tal_read_file(const char *);
 struct tal     *tal_read(int);
 
 void            cert_buffer(char **, size_t *, size_t *, const struct cert *);
Index: usr.sbin/rpki-client/main.c
===================================================================
RCS file: /cvs/src/usr.sbin/rpki-client/main.c,v
retrieving revision 1.21
diff -u -p -r1.21 main.c
--- usr.sbin/rpki-client/main.c 31 Oct 2019 08:36:43 -0000      1.21
+++ usr.sbin/rpki-client/main.c 1 Nov 2019 20:01:35 -0000
@@ -22,7 +22,6 @@
 #include <sys/wait.h>
 
 #include <assert.h>
-#include <ctype.h>
 #include <err.h>
 #include <dirent.h>
 #include <fcntl.h>
@@ -463,59 +462,11 @@ queue_add_from_mft_set(int fd, struct en
 static void
 queue_add_tal(int fd, struct entityq *q, const char *file, size_t *eid)
 {
-       char            *nfile, *nbuf, *line = NULL, *buf = NULL;
-       FILE            *in;
-       ssize_t          n, i;
-       size_t           sz = 0, bsz = 0;
-       int              optcomment = 1;
-
-       if ((in = fopen(file, "r")) == NULL)
-               err(EXIT_FAILURE, "fopen: %s", file);
-
-       while ((n = getline(&line, &sz, in)) != -1) {
-               /* replace CRLF with just LF */
-               if (n > 1 && line[n - 1] == '\n' && line[n - 2] == '\r') {
-                       line[n - 2] = '\n';
-                       line[n - 1] = '\0';
-                       n--;
-               }
-               if (optcomment) {
-                       /* if this is comment, just eat the line */
-                       if (line[0] == '#')
-                               continue;
-                       optcomment = 0;
-                       /*
-                        * Empty line is end of section and needs
-                        * to be eaten as well.
-                        */
-                       if (line[0] == '\n')
-                               continue;
-               }
-
-               /* make sure every line is valid ascii */
-               for (i = 0; i < n; i++)
-                       if (!isprint(line[i]) && !isspace(line[i]))
-                               errx(EXIT_FAILURE, "getline: %s: "
-                                   "invalid content", file);
-
-               /* concat line to buf */
-               if ((nbuf = realloc(buf, bsz + n + 1)) == NULL)
-                       err(EXIT_FAILURE, NULL);
-               buf = nbuf;
-               bsz += n + 1;
-               strlcat(buf, line, bsz);
-               /* limit the buffer size */
-               if (bsz > 4096)
-                       errx(EXIT_FAILURE, "%s: file too big", file);
-       }
-
-       free(line);
-       if (ferror(in))
-               err(EXIT_FAILURE, "getline: %s", file);
-       fclose(in);
+       char    *nfile, *buf;
 
        if ((nfile = strdup(file)) == NULL)
                err(EXIT_FAILURE, "strdup");
+       buf = tal_read_file(file);
 
        /* Not in a repository, so directly add to queue. */
        entityq_add(fd, q, nfile, RTYPE_TAL, NULL, NULL, NULL, 0, buf, eid);
Index: usr.sbin/rpki-client/tal.c
===================================================================
RCS file: /cvs/src/usr.sbin/rpki-client/tal.c,v
retrieving revision 1.8
diff -u -p -r1.8 tal.c
--- usr.sbin/rpki-client/tal.c  31 Oct 2019 08:36:43 -0000      1.8
+++ usr.sbin/rpki-client/tal.c  1 Nov 2019 20:01:27 -0000
@@ -17,6 +17,7 @@
 
 #include <netinet/in.h>
 #include <assert.h>
+#include <ctype.h>
 #include <err.h>
 #include <libgen.h>
 #include <resolv.h>
@@ -154,6 +155,63 @@ tal_parse(const char *fn, char *buf)
        p->descr[dlen] = 0;
 
        return p;
+}
+
+char *
+tal_read_file(const char *file)
+{
+       char            *nbuf, *line = NULL, *buf = NULL;
+       FILE            *in;
+       ssize_t          n, i;
+       size_t           sz = 0, bsz = 0;
+       int              optcomment = 1;
+
+       if ((in = fopen(file, "r")) == NULL)
+               err(EXIT_FAILURE, "fopen: %s", file);
+
+       while ((n = getline(&line, &sz, in)) != -1) {
+               /* replace CRLF with just LF */
+               if (n > 1 && line[n - 1] == '\n' && line[n - 2] == '\r') {
+                       line[n - 2] = '\n';
+                       line[n - 1] = '\0';
+                       n--;
+               }
+               if (optcomment) {
+                       /* if this is comment, just eat the line */
+                       if (line[0] == '#')
+                               continue;
+                       optcomment = 0;
+                       /*
+                        * Empty line is end of section and needs
+                        * to be eaten as well.
+                        */
+                       if (line[0] == '\n')
+                               continue;
+               }
+
+               /* make sure every line is valid ascii */
+               for (i = 0; i < n; i++)
+                       if (!isprint(line[i]) && !isspace(line[i]))
+                               errx(EXIT_FAILURE, "getline: %s: "
+                                   "invalid content", file);
+
+               /* concat line to buf */
+               if ((nbuf = realloc(buf, bsz + n + 1)) == NULL)
+                       err(EXIT_FAILURE, NULL);
+               buf = nbuf;
+               bsz += n + 1;
+               strlcat(buf, line, bsz);
+               /* limit the buffer size */
+               if (bsz > 4096)
+                       errx(EXIT_FAILURE, "%s: file too big", file);
+       }
+
+       free(line);
+       if (ferror(in))
+               err(EXIT_FAILURE, "getline: %s", file);
+       fclose(in);
+
+       return buf;
 }
 
 /*
Index: regress/usr.sbin/rpki-client//test-tal.c
===================================================================
RCS file: /cvs/src/regress/usr.sbin/rpki-client/test-tal.c,v
retrieving revision 1.3
diff -u -p -r1.3 test-tal.c
--- regress/usr.sbin/rpki-client//test-tal.c    22 Aug 2019 21:31:48 -0000      
1.3
+++ regress/usr.sbin/rpki-client//test-tal.c    1 Nov 2019 20:03:18 -0000
@@ -46,6 +46,7 @@ int
 main(int argc, char *argv[])
 {
        int              c, i, verb = 0;
+       char            *buf;
        struct tal      *tal;
 
        ERR_load_crypto_strings();
@@ -68,8 +69,10 @@ main(int argc, char *argv[])
                errx(1, "argument missing");
 
        for (i = 0; i < argc; i++) {
-               if ((tal = tal_parse(argv[i])) == NULL)
+               buf = tal_read_file(argv[i]);
+               if ((tal = tal_parse(argv[i], buf)) == NULL)
                        break;
+               free(buf);
                if (verb)
                        tal_print(tal);
                tal_free(tal);

Reply via email to