Hi David,

> --- newsyslog.c.bak     Thu Oct 22 21:18:12 2009
> +++ newsyslog.c Thu Oct 22 22:00:09 2009
> @@ -756,6 +756,9 @@
>         char file1[MAXPATHLEN], file2[MAXPATHLEN], *suffix;
>         int numdays = ent->numlogs;
> 
> +       /* We start counting at 0 so reduce for correct maximum */
> +       numdays--;
> +
>         /* Remove oldest log (may not exist) */
>         (void)snprintf(file1, sizeof(file1), "%s.%d", oldlog, numdays);
>         (void)snprintf(file2, sizeof(file2), "%s.%d%s", oldlog, numdays,

That does part of the job, but looks slightly ugly.

When applied to a running system, it lets the excessive archive file
sit around forever, or until you manually delete it.

I like the following better:
Remove all _consecutive_ archive files above the requested limit.
That's also useful after lowering the "count" in newsyslog.conf.

Note that the loop may be terminated earlier when rotating for real
than in -n mode; specifically, when unlink() fails.
But that's fine because -n is supposed to tell you what would be tried.
Of course, what you try to do may still fail.

Any OKs?


Index: newsyslog.c
===================================================================
RCS file: /cvs/src/usr.bin/newsyslog/newsyslog.c,v
retrieving revision 1.86
diff -u -p -r1.86 newsyslog.c
--- newsyslog.c 27 Oct 2009 23:59:40 -0000      1.86
+++ newsyslog.c 10 Jan 2010 00:36:43 -0000
@@ -750,22 +750,25 @@ void
 rotate(struct conf_entry *ent, const char *oldlog)
 {
        char file1[MAXPATHLEN], file2[MAXPATHLEN], *suffix;
-       int numdays = ent->numlogs;
+       int numdays = ent->numlogs - 1;
+       int done = 0;
 
-       /* Remove oldest log (may not exist) */
-       (void)snprintf(file1, sizeof(file1), "%s.%d", oldlog, numdays);
-       (void)snprintf(file2, sizeof(file2), "%s.%d%s", oldlog, numdays,
-           COMPRESS_POSTFIX);
-
-       if (noaction) {
-               printf("\trm -f %s %s\n", file1, file2);
-       } else {
-               (void)unlink(file1);
-               (void)unlink(file2);
-       }
+       /* Remove old logs */
+       do {
+               (void)snprintf(file1, sizeof(file1), "%s.%d", oldlog, numdays);
+               (void)snprintf(file2, sizeof(file2), "%s.%d%s", oldlog,
+                   numdays, COMPRESS_POSTFIX);
+               if (noaction) {
+                       printf("\trm -f %s %s\n", file1, file2);
+                       done = access(file1, 0) && access(file2, 0);
+               } else {
+                       done = unlink(file1) && unlink(file2);
+               }
+               numdays++;
+       } while (done == 0);
 
        /* Move down log files */
-       while (numdays--) {
+       for (numdays = ent->numlogs - 1; numdays >= 0; numdays--) {
                /*
                 * If both the compressed archive and the non-compressed archive
                 * exist, we decide which to rotate based on the CE_COMPACT flag

Reply via email to