The following reply was made to PR bin/166448; it has been noted by GNATS. From: Eugene Grosbein <eu...@grosbein.pp.ru> To: bug-follo...@freebsd.org Cc: Subject: Re: bin/166448: [patch] newsyslog -t fails to find previous rotated log Date: Wed, 28 Mar 2012 02:10:50 +0700
Sorry, I've sent buggy patch (does stat() on wrong filename). Here is corrected one. --- usr.sbin/newsyslog/newsyslog.c.orig 2012-02-13 17:02:03.000000000 +0400 +++ usr.sbin/newsyslog/newsyslog.c 2012-03-27 22:53:46.000000000 +0400 @@ -2206,6 +2206,79 @@ return (kbytes(dbtob(sb.st_blocks))); } +/* Return the age of previous old log file, when using time based filenames. */ +static time_t +find_oldest_timelog(const char *dir, const char *logfname) +{ + struct stat sb; + int c, valid; + size_t logfname_len; + struct tm tm; + time_t oldt; + struct dirent *dp; + DIR *dirp; + char *s; + char tmp[MAXPATHLEN]; + + if ((dirp = opendir(dir)) == NULL) + err(1, "Cannot open log directory '%s'", dir); + + oldt = -1; + logfname_len = strlen(logfname); + while ((dp = readdir(dirp)) != NULL) { + if (dp->d_type != DT_REG) + continue; + /* Ignore everything but files with our logfile prefix */ + if (strncmp(dp->d_name, logfname, logfname_len) != 0) + continue; + /* Ignore the actual non-rotated logfile */ + if (dp->d_namlen == logfname_len) + continue; + /* + * Make sure we have found a logfile, so the + * postfix is valid, IE format is: '.<time>(.[bg]z)?'. + */ + if (dp->d_name[logfname_len] != '.') { + if (verbose) + printf("Ignoring %s which has unexpected " + "extension '%s'\n", dp->d_name, + &dp->d_name[logfname_len]); + continue; + } + if ((s = strptime(&dp->d_name[logfname_len + 1], + timefnamefmt, &tm)) == NULL) { + if (verbose) + printf("Ignoring %s which does not " + "match time format\n", dp->d_name); + continue; + } + + valid = 0; + c = 0; + while (!valid && c < COMPRESS_TYPES) + if (strcmp(s, compress_type[c++].suffix) == 0) + valid = 1; + + if (valid != 1) { + if (verbose) + printf("Ignoring %s which has unexpected " + "extension '%s'\n", dp->d_name, s); + continue; + } + snprintf(tmp, sizeof(tmp), "%s/%s", dir, dp->d_name); + if (stat(tmp, &sb) < 0) + err(1, "Cannot stat '%s'", tmp); + + /* We have found more recent old logfile */ + if (oldt < sb.st_mtime) + oldt = sb.st_mtime; + } + closedir(dirp); + + /* Return -1 if nothing found */ + return oldt; +} + /* Return the age of old log file (file.0) */ static int age_old_log(char *file) @@ -2241,6 +2314,17 @@ (void) strlcpy(tmp, file, sizeof(tmp)); } + if (timefnamefmt != NULL) { + char *bd; + time_t t; + + if ((bd = dirname(tmp)) == NULL) + err(1, "'%s'", tmp); + if ((t = find_oldest_timelog(bd, basename(tmp))) == -1) + return (-1); + return ((int)(ptimeget_secs(timenow) - t + 1800) / 3600); + } + strlcat(tmp, ".0", sizeof(tmp)); logfile_suffix = get_logfile_suffix(tmp); if (logfile_suffix == NULL) _______________________________________________ freebsd-bugs@freebsd.org mailing list http://lists.freebsd.org/mailman/listinfo/freebsd-bugs To unsubscribe, send any mail to "freebsd-bugs-unsubscr...@freebsd.org"