On Fri, 14 Jul 2017 22:59:58 +0200, Jeremie Courreges-Anglas wrote:

> "Todd C. Miller" <todd.mil...@courtesan.com> writes:
> 
> > On Fri, 14 Jul 2017 22:15:49 +0200, Jeremie Courreges-Anglas wrote:
> >
> >> the proposal in
> >> 
> >>   https://marc.info/?l=openbsd-misc&m=150001966325010&w=2
> >> 
> >> made me look at newsyslog and its manually linked lists.  Here's a stab
> >> at using TAILQs instead.
> >
> > Oh good, now I don't have to do it ;-)
> 
> ;)
> 
> > I have a diff to make change errx() into warnx() + continue.
> 
> I have a similar diff which is a bit intrusive, as it tries to properly
> free resources allocated in parse_file().  Maybe show us yours first?

This doesn't attempt to free any resources.  One thing I wanted to
do was to make parse_file() return an error value when there was a
parse error so the exit code could be non-zero.

 - todd

Index: usr.bin/newsyslog/newsyslog.c
===================================================================
RCS file: /cvs/src/usr.bin/newsyslog/newsyslog.c,v
retrieving revision 1.103
diff -u -p -u -r1.103 newsyslog.c
--- usr.bin/newsyslog/newsyslog.c       14 Jul 2017 20:51:17 -0000      1.103
+++ usr.bin/newsyslog/newsyslog.c       14 Jul 2017 21:11:29 -0000
@@ -510,9 +510,11 @@ parse_file(struct entrylist *list, int *
                        *group++ = '\0';
                        if (*q) {
                                if (!(isnumberstr(q))) {
-                                       if ((pwd = getpwnam(q)) == NULL)
-                                               errx(1, "%s:%d: unknown user: 
%s",
+                                       if ((pwd = getpwnam(q)) == NULL) {
+                                               warnx("%s:%d: unknown user: %s",
                                                    conf, lineno, q);
+                                               continue;
+                                       }
                                        working->uid = pwd->pw_uid;
                                } else
                                        working->uid = atoi(q);
@@ -522,9 +524,11 @@ parse_file(struct entrylist *list, int *
                        q = group;
                        if (*q) {
                                if (!(isnumberstr(q))) {
-                                       if ((grp = getgrnam(q)) == NULL)
-                                               errx(1, "%s:%d: unknown group: 
%s",
+                                       if ((grp = getgrnam(q)) == NULL) {
+                                               warnx("%s:%d: unknown group: 
%s",
                                                    conf, lineno, q);
+                                               continue;
+                                       }
                                        working->gid = grp->gr_gid;
                                } else
                                        working->gid = atoi(q);
@@ -539,15 +543,19 @@ parse_file(struct entrylist *list, int *
                }
 
                l = strtol(q, &ep, 8);
-               if (*ep != '\0' || l < 0 || l > ALLPERMS)
-                       errx(1, "%s:%d: bad permissions: %s", conf, lineno, q);
+               if (*ep != '\0' || l < 0 || l > ALLPERMS) {
+                       warnx("%s:%d: bad permissions: %s", conf, lineno, q);
+                       continue;
+               }
                working->permissions = (mode_t)l;
 
                q = parse = missing_field(sob(++parse), errline, lineno);
                *(parse = son(parse)) = '\0';
                l = strtol(q, &ep, 10);
-               if (*ep != '\0' || l < 0 || l >= INT_MAX)
-                       errx(1, "%s:%d: bad number: %s", conf, lineno, q);
+               if (*ep != '\0' || l < 0 || l >= INT_MAX) {
+                       warnx("%s:%d: bad number: %s", conf, lineno, q);
+                       continue;
+               }
                working->numlogs = (int)l;
 
                q = parse = missing_field(sob(++parse), errline, lineno);
@@ -561,23 +569,29 @@ parse_file(struct entrylist *list, int *
                q = parse = missing_field(sob(++parse), errline, lineno);
                *(parse = son(parse)) = '\0';
                l = strtol(q, &ep, 10);
-               if (l < 0 || l >= INT_MAX)
-                       errx(1, "%s:%d: interval out of range: %s", conf,
+               if (l < 0 || l >= INT_MAX) {
+                       warnx("%s:%d: interval out of range: %s", conf,
                            lineno, q);
+                       continue;
+               }
                working->hours = (int)l;
                switch (*ep) {
                case '\0':
                        break;
                case '@':
                        working->trim_at = parse8601(ep + 1);
-                       if (working->trim_at == (time_t) - 1)
-                               errx(1, "%s:%d: bad time: %s", conf, lineno, q);
+                       if (working->trim_at == (time_t) - 1) {
+                               warnx("%s:%d: bad time: %s", conf, lineno, q);
+                               continue;
+                       }
                        working->flags |= CE_TRIMAT;
                        break;
                case '$':
                        working->trim_at = parseDWM(ep + 1);
-                       if (working->trim_at == (time_t) - 1)
-                               errx(1, "%s:%d: bad time: %s", conf, lineno, q);
+                       if (working->trim_at == (time_t) - 1) {
+                               warnx("%s:%d: bad time: %s", conf, lineno, q);
+                               continue;
+                       }
                        working->flags |= CE_TRIMAT;
                        break;
                case '*':
@@ -585,8 +599,8 @@ parse_file(struct entrylist *list, int *
                                break;
                        /* FALLTHROUGH */
                default:
-                       errx(1, "%s:%d: bad interval/at: %s", conf, lineno, q);
-                       break;
+                       warnx("%s:%d: bad interval/at: %s", conf, lineno, q);
+                       continue;
                }
 
                q = sob(++parse);       /* Optional field */
@@ -612,9 +626,9 @@ parse_file(struct entrylist *list, int *
                                        working->flags |= CE_FOLLOW;
                                        break;
                                default:
-                                       errx(1, "%s:%d: illegal flag: `%c'",
+                                       warnx("%s:%d: illegal flag: `%c'",
                                            conf, lineno, *q);
-                                       break;
+                                       continue;
                                }
                                q++;
                        }
@@ -631,9 +645,11 @@ parse_file(struct entrylist *list, int *
                                break;
                        if (*q == '/') {
                                *(parse = son(parse)) = '\0';
-                               if (strlen(q) >= PATH_MAX)
-                                       errx(1, "%s:%d: pathname too long: %s",
+                               if (strlen(q) >= PATH_MAX) {
+                                       warnx("%s:%d: pathname too long: %s",
                                            conf, lineno, q);
+                                       continue;
+                               }
                                working->pidfile = strdup(q);
                                if (working->pidfile == NULL)
                                        err(1, "strdup");
@@ -656,23 +672,29 @@ parse_file(struct entrylist *list, int *
                                                break;
                                        }
                                }
-                               if (i == NSIG)
-                                       errx(1, "%s:%d: unknown signal: %s",
+                               if (i == NSIG) {
+                                       warnx("%s:%d: unknown signal: %s",
                                            conf, lineno, q);
+                                       continue;
+                               }
                        } else if (working->flags & CE_MONITOR) {
                                *(parse = son(parse)) = '\0';
                                working->whom = strdup(q);
                                if (working->whom == NULL)
                                        err(1, "strdup");
-                       } else
-                               errx(1, "%s:%d: unrecognized field: %s",
+                       } else {
+                               warnx("%s:%d: unrecognized field: %s",
                                    conf, lineno, q);
+                               continue;
+                       }
                }
                free(errline);
 
-               if ((working->flags & CE_MONITOR) && working->whom == NULL)
-                       errx(1, "%s:%d: missing monitor notification field",
+               if ((working->flags & CE_MONITOR) && working->whom == NULL) {
+                       warnx("%s:%d: missing monitor notification field",
                            conf, lineno);
+                       continue;
+               }
 
                /* If there is an arcdir, set working->backdir. */
                if (arcdir != NULL && working->logbase != NULL) {
@@ -701,15 +723,19 @@ parse_file(struct entrylist *list, int *
                if (working->backdir != NULL) {
                        if (snprintf(line, sizeof(line), "%s/%s.%d%s",
                            working->backdir, working->logbase,
-                           working->numlogs, COMPRESS_POSTFIX) >= PATH_MAX)
-                               errx(1, "%s:%d: pathname too long: %s",
+                           working->numlogs, COMPRESS_POSTFIX) >= PATH_MAX) {
+                               warnx("%s:%d: pathname too long: %s",
                                    conf, lineno, q);
+                               continue;
+                       }
                } else {
                        if (snprintf(line, sizeof(line), "%s.%d%s",
                            working->log, working->numlogs, COMPRESS_POSTFIX)
-                           >= PATH_MAX)
-                               errx(1, "%s:%d: pathname too long: %s",
+                           >= PATH_MAX) {
+                               warnx("%s:%d: pathname too long: %s",
                                    conf, lineno, working->log);
+                               continue;
+                       }
                }
                TAILQ_INSERT_TAIL(list, working, next);
                (*nentries)++;

Reply via email to