Author: ngie
Date: Thu Jun 22 07:08:18 2017
New Revision: 320222
URL: https://svnweb.freebsd.org/changeset/base/320222

Log:
  MFC r308139,r308157,r308160,r316818,r318250,r318443:
  
  r308139 (by bapt):
  
  cron(8): add support for /etc/cron.d and /usr/local/etc/cron.d
  
  For automation tools it is way easier to maintain files in directories rather
  than modifying /etc/crontab.
  
  The files in those directories are in the same format as /etc/crontab
  
  Relnotes:     yes
  
  r308157 (by bapt):
  
  Fix typo in cron(8) date
  
  r308160 (by bapt):
  
  syslogd(8): add an 'include' keyword
  
  All the '.conf' files not beginning with a '.' contained int he directory
  following the keyword will be included.
  
  This keyword can only be used in the first level configuration files.
  
  Modify the default syslogd.conf to 'include' /etc/syslog.d and
  /usr/local/etc/syslog.d
  
  It simplify a lot handling of syslog from automation tools.
  
  Relnotes:     yes
  
  r316818:
  
  Conditionally install /etc/pam.d/ftp* and /etc/pam.d/telnetd
  
  /etc/pam.d/ftp* should be installed with MK_FTP != no and
  /etc/pam.d/telnetd should be installed when MK_TELNET != no.
  
  r318250:
  
  Handle the logfiles in newsyslog and syslogd conditionally, based on
  src.conf(5) knobs
  
  This will allow consumers of FreeBSD to use the unmodified configuration
  files out of the box more than previously.
  
  Both newsyslog.conf and syslog.conf:
  - /var/log/lpd-errs (MK_LPR != no)
  - /var/log/ppp.log (MK_PPP != no)
  - /var/log/xferlog (MK_FTP != no)
  
  newsyslog.conf:
  - /var/log/amd.log (MK_AMD != no)
  - /var/log/pflog (MK_PF != no)
  - /var/log/sendmail.st (MK_SENDMAIL != no)
  
  r318443:
  
  Conditionally handle the crontab entry for atrun(8)
  
  The default crontab prior to this commit assumes atrun(8) is always
  present, which isn't true if MK_AT == no. Move atrun(8) execution
  from /etc/crontab to /etc/cron.d/at, and base /etc/cron.d/at's installation
  on MK_AT. cron(8) will detect /etc/cron.d/at's presence when the configuration
  is loaded and run atrun every 5 minutes like it would prior to this commit.
  
  SHELL and PATH are duplicated between /etc/crontab and /etc/cron.d/at
  because atrun(8) executes programs, which may rely on environment
  set in the current default /etc/crontab.
  
  Noted by:     bdrewery (in an internal review)
  Relnotes:     yes (may need to add environmental modifications to
                     /etc/cron.d/at)

Added:
  stable/10/etc/cron.d/
     - copied from r318443, head/etc/cron.d/
  stable/10/etc/newsyslog.conf.d/amd.conf
     - copied, changed from r318250, head/etc/newsyslog.conf.d/amd.conf
  stable/10/etc/newsyslog.conf.d/ftp.conf
     - copied, changed from r318250, head/etc/newsyslog.conf.d/ftp.conf
  stable/10/etc/newsyslog.conf.d/lpr.conf
     - copied, changed from r318250, head/etc/newsyslog.conf.d/lpr.conf
  stable/10/etc/newsyslog.conf.d/pf.conf
     - copied, changed from r318250, head/etc/newsyslog.conf.d/pf.conf
  stable/10/etc/newsyslog.conf.d/ppp.conf
     - copied, changed from r318250, head/etc/newsyslog.conf.d/ppp.conf
  stable/10/etc/newsyslog.conf.d/sendmail.conf
     - copied unchanged from r318250, head/etc/newsyslog.conf.d/sendmail.conf
  stable/10/etc/syslog.d/
     - copied from r318250, head/etc/syslog.d/
Modified:
  stable/10/etc/Makefile
  stable/10/etc/cron.d/Makefile
  stable/10/etc/crontab
  stable/10/etc/mtree/BSD.root.dist
  stable/10/etc/newsyslog.conf
  stable/10/etc/newsyslog.conf.d/Makefile
  stable/10/etc/pam.d/Makefile
  stable/10/etc/syslog.conf
  stable/10/etc/syslog.d/Makefile
  stable/10/tools/build/mk/OptionalObsoleteFiles.inc
  stable/10/usr.sbin/cron/cron/cron.8
  stable/10/usr.sbin/cron/cron/cron.h
  stable/10/usr.sbin/cron/cron/database.c
  stable/10/usr.sbin/cron/cron/pathnames.h
  stable/10/usr.sbin/cron/lib/misc.c
  stable/10/usr.sbin/syslogd/syslog.conf.5
  stable/10/usr.sbin/syslogd/syslogd.c
Directory Properties:
  stable/10/   (props changed)

Modified: stable/10/etc/Makefile
==============================================================================
--- stable/10/etc/Makefile      Thu Jun 22 06:25:34 2017        (r320221)
+++ stable/10/etc/Makefile      Thu Jun 22 07:08:18 2017        (r320222)
@@ -4,7 +4,9 @@
 .include <bsd.own.mk>
 
 SUBDIR=        \
-       newsyslog.conf.d
+       cron.d \
+       newsyslog.conf.d \
+       syslog.d
 
 .if ${MK_SENDMAIL} != "no"
 SUBDIR+=sendmail

Modified: stable/10/etc/cron.d/Makefile
==============================================================================
--- head/etc/cron.d/Makefile    Thu May 18 06:33:55 2017        (r318443)
+++ stable/10/etc/cron.d/Makefile       Thu Jun 22 07:08:18 2017        
(r320222)
@@ -1,6 +1,6 @@
 # $FreeBSD$
 
-.include <src.opts.mk>
+.include <bsd.own.mk>
 
 .if ${MK_AT} != "no"
 FILES+=                at

Modified: stable/10/etc/crontab
==============================================================================
--- stable/10/etc/crontab       Thu Jun 22 06:25:34 2017        (r320221)
+++ stable/10/etc/crontab       Thu Jun 22 07:08:18 2017        (r320222)
@@ -7,8 +7,6 @@ PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin
 #
 #minute        hour    mday    month   wday    who     command
 #
-*/5    *       *       *       *       root    /usr/libexec/atrun
-#
 # Save some entropy so that /dev/random can re-seed on boot.
 */11   *       *       *       *       operator /usr/libexec/save-entropy
 #

Modified: stable/10/etc/mtree/BSD.root.dist
==============================================================================
--- stable/10/etc/mtree/BSD.root.dist   Thu Jun 22 06:25:34 2017        
(r320221)
+++ stable/10/etc/mtree/BSD.root.dist   Thu Jun 22 07:08:18 2017        
(r320222)
@@ -30,6 +30,8 @@
         ..
         bluetooth
         ..
+        cron.d
+        ..
         defaults
         ..
         devd
@@ -71,6 +73,8 @@
         ssh
         ..
         ssl
+        ..
+        syslog.d
         ..
         zfs
         ..

Modified: stable/10/etc/newsyslog.conf
==============================================================================
--- stable/10/etc/newsyslog.conf        Thu Jun 22 06:25:34 2017        
(r320221)
+++ stable/10/etc/newsyslog.conf        Thu Jun 22 07:08:18 2017        
(r320222)
@@ -18,7 +18,6 @@
 #
 # logfilename          [owner:group]    mode count size when  flags 
[/pid_file] [sig_num]
 /var/log/all.log                       600  7     *    @T00  J
-/var/log/amd.log                       644  7     100  *     J
 /var/log/auth.log                      600  7     100  @0101T JC
 /var/log/console.log                   600  5     100  *     J
 /var/log/cron                          600  3     100  *     JC
@@ -26,18 +25,13 @@
 /var/log/debug.log                     600  7     100  *     JC
 /var/log/init.log                      644  3     100  *     J
 /var/log/kerberos.log                  600  7     100  *     J
-/var/log/lpd-errs                      644  7     100  *     JC
 /var/log/maillog                       640  7     *    @T00  JC
 /var/log/messages                      644  5     100  @0101T JC
 /var/log/monthly.log                   640  12    *    $M1D0 JN
-/var/log/pflog                         600  3     100  *     JB    
/var/run/pflogd.pid
-/var/log/ppp.log       root:network    640  3     100  *     JC
 /var/log/devd.log                      644  3     100  *     JC
 /var/log/security                      600  10    100  *     JC
-/var/log/sendmail.st                   640  10    *    168   BN
 /var/log/utx.log                       644  3     *    @01T05 B
 /var/log/weekly.log                    640  5     *    $W6D0 JN
-/var/log/xferlog                       600  7     100  *     JC
 
 <include> /etc/newsyslog.conf.d/*
 <include> /usr/local/etc/newsyslog.conf.d/*

Modified: stable/10/etc/newsyslog.conf.d/Makefile
==============================================================================
--- stable/10/etc/newsyslog.conf.d/Makefile     Thu Jun 22 06:25:34 2017        
(r320221)
+++ stable/10/etc/newsyslog.conf.d/Makefile     Thu Jun 22 07:08:18 2017        
(r320222)
@@ -6,8 +6,32 @@ BINDIR=                /etc/newsyslog.conf.d
 
 FILES=
 
+.if ${MK_AMD} != "no"
+FILES+=                amd.conf
+.endif
+
+.if ${MK_FTP} != "no"
+FILES+=                ftp.conf
+.endif
+
+.if ${MK_LPR} != "no"
+FILES+=                lpr.conf
+.endif
+
 .if ${MK_OFED} != "no"
 FILES+=                opensm.conf
+.endif
+
+.if ${MK_PF} != "no"
+FILES+=                pf.conf
+.endif
+
+.if ${MK_PPP} != "no"
+FILES+=                ppp.conf
+.endif
+
+.if ${MK_SENDMAIL} != "no"
+FILES+=                sendmail.conf
 .endif
 
 .include <bsd.prog.mk>

Copied and modified: stable/10/etc/newsyslog.conf.d/amd.conf (from r318250, 
head/etc/newsyslog.conf.d/amd.conf)
==============================================================================
--- head/etc/newsyslog.conf.d/amd.conf  Sat May 13 03:10:50 2017        
(r318250, copy source)
+++ stable/10/etc/newsyslog.conf.d/amd.conf     Thu Jun 22 07:08:18 2017        
(r320222)
@@ -1,2 +1,2 @@
 # $FreeBSD$
-/var/log/amd.log                       644  7     1000 *     J
+/var/log/amd.log                       644  7     100  *     J

Copied and modified: stable/10/etc/newsyslog.conf.d/ftp.conf (from r318250, 
head/etc/newsyslog.conf.d/ftp.conf)
==============================================================================
--- head/etc/newsyslog.conf.d/ftp.conf  Sat May 13 03:10:50 2017        
(r318250, copy source)
+++ stable/10/etc/newsyslog.conf.d/ftp.conf     Thu Jun 22 07:08:18 2017        
(r320222)
@@ -1,2 +1,2 @@
 # $FreeBSD$
-/var/log/xferlog                       600  7     1000 *     JC
+/var/log/xferlog                       600  7     100  *     JC

Copied and modified: stable/10/etc/newsyslog.conf.d/lpr.conf (from r318250, 
head/etc/newsyslog.conf.d/lpr.conf)
==============================================================================
--- head/etc/newsyslog.conf.d/lpr.conf  Sat May 13 03:10:50 2017        
(r318250, copy source)
+++ stable/10/etc/newsyslog.conf.d/lpr.conf     Thu Jun 22 07:08:18 2017        
(r320222)
@@ -1,2 +1,2 @@
 # $FreeBSD$
-/var/log/lpd-errs                      644  7     1000 *     JC
+/var/log/lpd-errs                      644  7     100  *     JC

Copied and modified: stable/10/etc/newsyslog.conf.d/pf.conf (from r318250, 
head/etc/newsyslog.conf.d/pf.conf)
==============================================================================
--- head/etc/newsyslog.conf.d/pf.conf   Sat May 13 03:10:50 2017        
(r318250, copy source)
+++ stable/10/etc/newsyslog.conf.d/pf.conf      Thu Jun 22 07:08:18 2017        
(r320222)
@@ -1,2 +1,2 @@
 # $FreeBSD$
-/var/log/pflog                         600  3     1000 *     JB    
/var/run/pflogd.pid
+/var/log/pflog                         600  3     100  *     JB    
/var/run/pflogd.pid

Copied and modified: stable/10/etc/newsyslog.conf.d/ppp.conf (from r318250, 
head/etc/newsyslog.conf.d/ppp.conf)
==============================================================================
--- head/etc/newsyslog.conf.d/ppp.conf  Sat May 13 03:10:50 2017        
(r318250, copy source)
+++ stable/10/etc/newsyslog.conf.d/ppp.conf     Thu Jun 22 07:08:18 2017        
(r320222)
@@ -1,2 +1,2 @@
 # $FreeBSD$
-/var/log/ppp.log       root:network    640  3     1000 *     JC
+/var/log/ppp.log       root:network    640  3     100  *     JC

Copied: stable/10/etc/newsyslog.conf.d/sendmail.conf (from r318250, 
head/etc/newsyslog.conf.d/sendmail.conf)
==============================================================================
--- /dev/null   00:00:00 1970   (empty, because file is newly added)
+++ stable/10/etc/newsyslog.conf.d/sendmail.conf        Thu Jun 22 07:08:18 
2017        (r320222, copy of r318250, head/etc/newsyslog.conf.d/sendmail.conf)
@@ -0,0 +1,2 @@
+# $FreeBSD$
+/var/log/sendmail.st                   640  10    *    168   BN

Modified: stable/10/etc/pam.d/Makefile
==============================================================================
--- stable/10/etc/pam.d/Makefile        Thu Jun 22 06:25:34 2017        
(r320221)
+++ stable/10/etc/pam.d/Makefile        Thu Jun 22 07:08:18 2017        
(r320222)
@@ -1,23 +1,52 @@
 # $FreeBSD$
 
+.include <bsd.own.mk>
+
 NO_OBJ=
 
+FILESGROUPS=   FILES
+
 FILES= README \
-       atrun \
        cron \
-       ftpd \
        imap \
        login \
        other \
        passwd pop3 \
-       rsh \
        sshd su system \
-       telnetd \
        xdm
 
 FILESDIR=      /etc/pam.d
 FILESMODE=     644
-FILESMODE_README=      444
+
+.if ${MK_AT} != "no"
+FILESGROUPS+=  AT
+AT+=   atrun
+ATDIR=         ${FILESDIR}
+ATMODE=                ${FILESMODE}
+.endif
+
+.if ${MK_FTP} != "no"
+FILESGROUPS+=  FTP
+FTP+=  ftpd
+FTPDIR=                ${FILESDIR}
+FTPMODE=       ${FILESMODE}
 LINKS= ${FILESDIR}/ftpd ${FILESDIR}/ftp
+.endif
+
+.if ${MK_RCMDS} != "no"
+FILESGROUPS+=  RCMDS
+RCMDS+=                rsh
+RCMDSDIR=      ${FILESDIR}
+RCMDSMODE=     ${FILESMODE}
+.endif
+
+.if ${MK_TELNET} != "no"
+FILESGROUPS+=  TELNET
+TELNET+=       telnetd
+TELNETDIR=     ${FILESDIR}
+TELNETMODE=    ${FILESMODE}
+.endif
+
+FILESMODE_README=      444
 
 .include <bsd.prog.mk>

Modified: stable/10/etc/syslog.conf
==============================================================================
--- stable/10/etc/syslog.conf   Thu Jun 22 06:25:34 2017        (r320221)
+++ stable/10/etc/syslog.conf   Thu Jun 22 07:08:18 2017        (r320222)
@@ -10,8 +10,6 @@
 security.*                                     /var/log/security
 auth.info;authpriv.info                                /var/log/auth.log
 mail.info                                      /var/log/maillog
-lpr.info                                       /var/log/lpd-errs
-ftp.info                                       /var/log/xferlog
 cron.*                                         /var/log/cron
 !-devd
 *.=debug                                       /var/log/debug.log
@@ -31,6 +29,6 @@ cron.*                                                
/var/log/cron
 # Uncomment this if you wish to see messages produced by devd
 # !devd
 # *.>=notice                                   /var/log/devd.log
-!ppp
-*.*                                            /var/log/ppp.log
 !*
+include                                                /etc/syslog.d
+include                                                /usr/local/etc/syslog.d

Modified: stable/10/etc/syslog.d/Makefile
==============================================================================
--- head/etc/syslog.d/Makefile  Sat May 13 03:10:50 2017        (r318250)
+++ stable/10/etc/syslog.d/Makefile     Thu Jun 22 07:08:18 2017        
(r320222)
@@ -1,6 +1,6 @@
 # $FreeBSD$
 
-.include <src.opts.mk>
+.include <bsd.own.mk>
 
 .if ${MK_FTP} != "no"
 FILES+=                ftp.conf

Modified: stable/10/tools/build/mk/OptionalObsoleteFiles.inc
==============================================================================
--- stable/10/tools/build/mk/OptionalObsoleteFiles.inc  Thu Jun 22 06:25:34 
2017        (r320221)
+++ stable/10/tools/build/mk/OptionalObsoleteFiles.inc  Thu Jun 22 07:08:18 
2017        (r320222)
@@ -56,6 +56,7 @@ OLD_FILES+=usr/share/man/man8/iasl.8.gz
 
 .if ${MK_AMD} == no
 OLD_FILES+=etc/amd.map
+OLD_FILES+=etc/newsyslog.conf.d/amd.conf
 OLD_FILES+=etc/rc.d/amd
 OLD_FILES+=usr/bin/pawd
 OLD_FILES+=usr/sbin/amd
@@ -1063,7 +1064,11 @@ OLD_FILES+=usr/share/man/man8/fmtree.8.gz
 
 .if ${MK_FTP} == no
 OLD_FILES+=etc/ftpusers
+OLD_FILES+=etc/newsyslog.conf.d/ftp.conf
+OLD_FILES+=etc/pam.d/ftp
+OLD_FILES+=etc/pam.d/ftpd
 OLD_FILES+=etc/rc.d/ftpd
+OLD_FILES+=etc/syslog.d/ftp.conf
 OLD_FILES+=usr/bin/ftp
 OLD_FILES+=usr/bin/gate-ftp
 OLD_FILES+=usr/bin/pftp
@@ -3816,7 +3821,9 @@ OLD_FILES+=usr/share/man/man8/updatedb.8.gz
 .if ${MK_LPR} == no
 OLD_FILES+=etc/hosts.lpd
 OLD_FILES+=etc/printcap
+OLD_FILES+=etc/newsyslog.conf.d/lpr.conf
 OLD_FILES+=etc/rc.d/lpd
+OLD_FILES+=etc/syslog.d/lpr.conf
 OLD_FILES+=usr/bin/lp
 OLD_FILES+=usr/bin/lpq
 OLD_FILES+=usr/bin/lpr
@@ -4192,6 +4199,7 @@ OLD_DIRS+=usr/share/examples/pc-sysinstall
 .endif
 
 .if ${MK_PF} == no
+OLD_FILES+=etc/newsyslog.conf.d/pf.conf
 OLD_FILES+=etc/periodic/security/520.pfdenied
 OLD_FILES+=etc/pf.os
 OLD_FILES+=etc/rc.d/ftp-proxy
@@ -4260,7 +4268,9 @@ OLD_FILES+=usr/share/man/man8/portsnap.8.gz
 .endif
 
 .if ${MK_PPP} == no
+OLD_FILES+=etc/newsyslog.conf.d/ppp.conf
 OLD_FILES+=etc/ppp/ppp.conf
+OLD_FILES+=etc/syslog.d/ppp.conf
 OLD_DIRS+=etc/ppp
 OLD_FILES+=usr/sbin/ppp
 OLD_FILES+=usr/sbin/pppctl
@@ -4460,6 +4470,7 @@ OLD_FILES+=usr/share/man/man8/rtquery.8.gz
 .endif
 
 .if ${MK_SENDMAIL} == no
+OLD_FILES+=etc/newsyslog.conf.d/sendmail.conf
 OLD_FILES+=etc/periodic/daily/150.clean-hoststat
 OLD_FILES+=etc/periodic/daily/440.status-mailq
 OLD_FILES+=etc/periodic/daily/460.status-mail-rejects
@@ -4778,6 +4789,7 @@ OLD_FILES+=usr/share/nls/uk_UA.UTF-8/tcsh.cat
 .endif
 
 .if ${MK_TELNET} == no
+OLD_FILES+=etc/pam.d/telnetd
 OLD_FILES+=usr/bin/telnet
 OLD_FILES+=usr/libexec/telnetd
 OLD_FILES+=usr/share/man/man1/telnet.1.gz

Modified: stable/10/usr.sbin/cron/cron/cron.8
==============================================================================
--- stable/10/usr.sbin/cron/cron/cron.8 Thu Jun 22 06:25:34 2017        
(r320221)
+++ stable/10/usr.sbin/cron/cron/cron.8 Thu Jun 22 07:08:18 2017        
(r320222)
@@ -17,7 +17,7 @@
 .\"
 .\" $FreeBSD$
 .\"
-.Dd June 29, 2008
+.Dd October 31, 2016
 .Dt CRON 8
 .Os
 .Sh NAME
@@ -52,7 +52,11 @@ The
 .Nm
 utility also searches for
 .Pa /etc/crontab
-which is in a different format (see
+and files in
+.Pa /etc/cron.d
+and
+.Pa /usr/local/etc/cron.d
+which are in a different format (see
 .Xr crontab 5 ) .
 .Pp
 The

Modified: stable/10/usr.sbin/cron/cron/cron.h
==============================================================================
--- stable/10/usr.sbin/cron/cron/cron.h Thu Jun 22 06:25:34 2017        
(r320221)
+++ stable/10/usr.sbin/cron/cron/cron.h Thu Jun 22 07:08:18 2017        
(r320222)
@@ -218,7 +218,7 @@ void                set_cron_uid(void),
                unget_char(int, FILE *),
                free_entry(entry *),
                skip_comments(FILE *),
-               log_it(char *, int, char *, char *),
+               log_it(char *, int, char *, const char *),
                log_close(void);
 
 int            job_runqueue(void),

Modified: stable/10/usr.sbin/cron/cron/database.c
==============================================================================
--- stable/10/usr.sbin/cron/cron/database.c     Thu Jun 22 06:25:34 2017        
(r320221)
+++ stable/10/usr.sbin/cron/cron/database.c     Thu Jun 22 07:08:18 2017        
(r320222)
@@ -45,9 +45,18 @@ load_database(old_db)
        DIR             *dir;
        struct stat     statbuf;
        struct stat     syscron_stat;
+       time_t          maxmtime;
        DIR_T           *dp;
        cron_db         new_db;
        user            *u, *nu;
+       struct {
+               const char *name;
+               struct stat st;
+       } syscrontabs [] = {
+               { SYSCRONTABS },
+               { LOCALSYSCRONTABS }
+       };
+       int i;
 
        Debug(DLOAD, ("[%d] load_database()\n", getpid()))
 
@@ -65,6 +74,16 @@ load_database(old_db)
        if (stat(SYSCRONTAB, &syscron_stat) < OK)
                syscron_stat.st_mtime = 0;
 
+       maxmtime = TMAX(statbuf.st_mtime, syscron_stat.st_mtime);
+
+       for (i = 0; i < nitems(syscrontabs); i++) {
+               if (stat(syscrontabs[i].name, &syscrontabs[i].st) != -1) {
+                       maxmtime = TMAX(syscrontabs[i].st.st_mtime, maxmtime);
+               } else {
+                       syscrontabs[i].st.st_mtime = 0;
+               }
+       }
+
        /* if spooldir's mtime has not changed, we don't need to fiddle with
         * the database.
         *
@@ -72,7 +91,7 @@ load_database(old_db)
         * so is guaranteed to be different than the stat() mtime the first
         * time this function is called.
         */
-       if (old_db->mtime == TMAX(statbuf.st_mtime, syscron_stat.st_mtime)) {
+       if (old_db->mtime == maxmtime) {
                Debug(DLOAD, ("[%d] spool dir mtime unch, no load needed.\n",
                              getpid()))
                return;
@@ -83,13 +102,36 @@ load_database(old_db)
         * actually changed.  Whatever is left in the old database when
         * we're done is chaff -- crontabs that disappeared.
         */
-       new_db.mtime = TMAX(statbuf.st_mtime, syscron_stat.st_mtime);
+       new_db.mtime = maxmtime;
        new_db.head = new_db.tail = NULL;
 
        if (syscron_stat.st_mtime) {
                process_crontab("root", SYS_NAME,
                                SYSCRONTAB, &syscron_stat,
                                &new_db, old_db);
+       }
+
+       for (i = 0; i < nitems(syscrontabs); i++) {
+               char tabname[MAXPATHLEN];
+               if (syscrontabs[i].st.st_mtime == 0)
+                       continue;
+               if (!(dir = opendir(syscrontabs[i].name))) {
+                       log_it("CRON", getpid(), "OPENDIR FAILED",
+                           syscrontabs[i].name);
+                       (void) exit(ERROR_EXIT);
+               }
+
+               while (NULL != (dp = readdir(dir))) {
+                       if (dp->d_name[0] == '.')
+                               continue;
+                       if (dp->d_type != DT_REG)
+                               continue;
+                       snprintf(tabname, sizeof(tabname), "%s/%s",
+                           syscrontabs[i].name, dp->d_name);
+                       process_crontab("root", SYS_NAME, tabname,
+                           &syscrontabs[i].st, &new_db, old_db);
+               }
+               closedir(dir);
        }
 
        /* we used to keep this dir open all the time, for the sake of

Modified: stable/10/usr.sbin/cron/cron/pathnames.h
==============================================================================
--- stable/10/usr.sbin/cron/cron/pathnames.h    Thu Jun 22 06:25:34 2017        
(r320221)
+++ stable/10/usr.sbin/cron/cron/pathnames.h    Thu Jun 22 07:08:18 2017        
(r320222)
@@ -62,6 +62,8 @@
 
                        /* 4.3BSD-style crontab */
 #define SYSCRONTAB     "/etc/crontab"
+#define SYSCRONTABS    "/etc/cron.d"
+#define LOCALSYSCRONTABS       "/usr/local/etc/cron.d"
 
                        /* what editor to use if no EDITOR or VISUAL
                         * environment variable specified.

Modified: stable/10/usr.sbin/cron/lib/misc.c
==============================================================================
--- stable/10/usr.sbin/cron/lib/misc.c  Thu Jun 22 06:25:34 2017        
(r320221)
+++ stable/10/usr.sbin/cron/lib/misc.c  Thu Jun 22 07:08:18 2017        
(r320222)
@@ -385,11 +385,7 @@ out:       if (allow)
 
 
 void
-log_it(username, xpid, event, detail)
-       char    *username;
-       int     xpid;
-       char    *event;
-       char    *detail;
+log_it(char *username, int xpid, char *event, const char *detail)
 {
 #if defined(LOG_FILE) || DEBUGGING
        PID_T                   pid = xpid;

Modified: stable/10/usr.sbin/syslogd/syslog.conf.5
==============================================================================
--- stable/10/usr.sbin/syslogd/syslog.conf.5    Thu Jun 22 06:25:34 2017        
(r320221)
+++ stable/10/usr.sbin/syslogd/syslog.conf.5    Thu Jun 22 07:08:18 2017        
(r320222)
@@ -28,7 +28,7 @@
 .\"     @(#)syslog.conf.5      8.1 (Berkeley) 6/9/93
 .\" $FreeBSD$
 .\"
-.Dd September 12, 2012
+.Dd November 1, 2016
 .Dt SYSLOG.CONF 5
 .Os
 .Sh NAME
@@ -61,6 +61,12 @@ The
 field is separated from the
 .Em action
 field by one or more tab characters or spaces.
+.Pp
+A special
+.Em include
+keyword can be used to include all files with names ending in '.conf' and not
+beginning with a '.' contained in the directory following the keyword.
+This keyword can only be used in the first level configuration file.
 .Pp
 Note that if you use spaces as separators, your
 .Nm

Modified: stable/10/usr.sbin/syslogd/syslogd.c
==============================================================================
--- stable/10/usr.sbin/syslogd/syslogd.c        Thu Jun 22 06:25:34 2017        
(r320221)
+++ stable/10/usr.sbin/syslogd/syslogd.c        Thu Jun 22 07:08:18 2017        
(r320222)
@@ -97,6 +97,7 @@ __FBSDID("$FreeBSD$");
 #include <arpa/inet.h>
 
 #include <ctype.h>
+#include <dirent.h>
 #include <err.h>
 #include <errno.h>
 #include <fcntl.h>
@@ -120,6 +121,8 @@ __FBSDID("$FreeBSD$");
 const char     *ConfFile = _PATH_LOGCONF;
 const char     *PidFile = _PATH_LOGPID;
 const char     ctty[] = _PATH_CONSOLE;
+static const char      include_str[] = "include";
+static const char      include_ext[] = ".conf";
 
 #define        dprintf         if (Debug) printf
 
@@ -1548,96 +1551,46 @@ die(int signo)
        exit(1);
 }
 
-/*
- *  INIT -- Initialize syslogd from configuration table
- */
-static void
-init(int signo)
+static int
+configfiles(const struct dirent *dp)
 {
-       int i;
-       FILE *cf;
-       struct filed *f, *next, **nextp;
-       char *p;
-       char cline[LINE_MAX];
-       char prog[LINE_MAX];
-       char host[MAXHOSTNAMELEN];
-       char oldLocalHostName[MAXHOSTNAMELEN];
-       char hostMsg[2*MAXHOSTNAMELEN+40];
-       char bootfileMsg[LINE_MAX];
+       const char *p;
+       size_t ext_len;
 
-       dprintf("init\n");
+       if (dp->d_name[0] == '.')
+               return (0);
 
-       /*
-        * Load hostname (may have changed).
-        */
-       if (signo != 0)
-               (void)strlcpy(oldLocalHostName, LocalHostName,
-                   sizeof(oldLocalHostName));
-       if (gethostname(LocalHostName, sizeof(LocalHostName)))
-               err(EX_OSERR, "gethostname() failed");
-       if ((p = strchr(LocalHostName, '.')) != NULL) {
-               *p++ = '\0';
-               LocalDomain = p;
-       } else {
-               LocalDomain = "";
-       }
+       ext_len = sizeof(include_ext) -1;
 
-       /*
-        *  Close all open log files.
-        */
-       Initialized = 0;
-       for (f = Files; f != NULL; f = next) {
-               /* flush any pending output */
-               if (f->f_prevcount)
-                       fprintlog(f, 0, (char *)NULL);
+       if (dp->d_namlen <= ext_len)
+               return (0);
 
-               switch (f->f_type) {
-               case F_FILE:
-               case F_FORW:
-               case F_CONSOLE:
-               case F_TTY:
-                       close_filed(f);
-                       break;
-               case F_PIPE:
-                       if (f->f_un.f_pipe.f_pid > 0) {
-                               close_filed(f);
-                               deadq_enter(f->f_un.f_pipe.f_pid,
-                                           f->f_un.f_pipe.f_pname);
-                       }
-                       f->f_un.f_pipe.f_pid = 0;
-                       break;
-               }
-               next = f->f_next;
-               if (f->f_program) free(f->f_program);
-               if (f->f_host) free(f->f_host);
-               free((char *)f);
-       }
-       Files = NULL;
-       nextp = &Files;
+       p = &dp->d_name[dp->d_namlen - ext_len];
+       if (strcmp(p, include_ext) != 0)
+               return (0);
 
-       /* open the configuration file */
-       if ((cf = fopen(ConfFile, "r")) == NULL) {
-               dprintf("cannot open %s\n", ConfFile);
-               *nextp = (struct filed *)calloc(1, sizeof(*f));
-               if (*nextp == NULL) {
-                       logerror("calloc");
-                       exit(1);
-               }
-               cfline("*.ERR\t/dev/console", *nextp, "*", "*");
-               (*nextp)->f_next = (struct filed *)calloc(1, sizeof(*f));
-               if ((*nextp)->f_next == NULL) {
-                       logerror("calloc");
-                       exit(1);
-               }
-               cfline("*.PANIC\t*", (*nextp)->f_next, "*", "*");
-               Initialized = 1;
-               return;
-       }
+       return (1);
+}
 
+static void
+readconfigfile(FILE *cf, struct filed **nextp, int allow_includes)
+{
+       FILE *cf2;
+       struct filed *f;
+       struct dirent **ent;
+       char cline[LINE_MAX];
+       char host[MAXHOSTNAMELEN];
+       char prog[LINE_MAX];
+       char file[MAXPATHLEN];
+       char *p, *tmp;
+       int i, nents;
+       size_t include_len;
+
        /*
         *  Foreach line in the conf table, open that file.
         */
        f = NULL;
+       include_len = sizeof(include_str) -1;
        (void)strlcpy(host, "*", sizeof(host));
        (void)strlcpy(prog, "*", sizeof(prog));
        while (fgets(cline, sizeof(cline), cf) != NULL) {
@@ -1650,6 +1603,42 @@ init(int signo)
                        continue;
                if (*p == 0)
                        continue;
+               if (allow_includes &&
+                   strncmp(p, include_str, include_len) == 0 &&
+                   isspace(p[include_len])) {
+                       p += include_len;
+                       while (isspace(*p))
+                               p++;
+                       tmp = p;
+                       while (*tmp != '\0' && !isspace(*tmp))
+                               tmp++;
+                       *tmp = '\0';
+                       dprintf("Trying to include files in '%s'\n", p);
+                       nents = scandir(p, &ent, configfiles, alphasort);
+                       if (nents == -1) {
+                               dprintf("Unable to open '%s': %s\n", p,
+                                   strerror(errno));
+                               continue;
+                       }
+                       for (i = 0; i < nents; i++) {
+                               if (snprintf(file, sizeof(file), "%s/%s", p,
+                                   ent[i]->d_name) >= (int)sizeof(file)) {
+                                       dprintf("ignoring path too long: "
+                                           "'%s/%s'\n", p, ent[i]->d_name);
+                                       free(ent[i]);
+                                       continue;
+                               }
+                               free(ent[i]);
+                               cf2 = fopen(file, "r");
+                               if (cf2 == NULL)
+                                       continue;
+                               dprintf("reading %s\n", file);
+                               readconfigfile(cf2, nextp, 0);
+                               fclose(cf2);
+                       }
+                       free(ent);
+                       continue;
+               }
                if (*p == '#') {
                        p++;
                        if (*p != '!' && *p != '+' && *p != '-')
@@ -1711,6 +1700,91 @@ init(int signo)
                nextp = &f->f_next;
                cfline(cline, f, prog, host);
        }
+}
+
+/*
+ *  INIT -- Initialize syslogd from configuration table
+ */
+static void
+init(int signo)
+{
+       int i;
+       FILE *cf;
+       struct filed *f, *next, **nextp;
+       char *p;
+       char oldLocalHostName[MAXHOSTNAMELEN];
+       char hostMsg[2*MAXHOSTNAMELEN+40];
+       char bootfileMsg[LINE_MAX];
+
+       dprintf("init\n");
+
+       /*
+        * Load hostname (may have changed).
+        */
+       if (signo != 0)
+               (void)strlcpy(oldLocalHostName, LocalHostName,
+                   sizeof(oldLocalHostName));
+       if (gethostname(LocalHostName, sizeof(LocalHostName)))
+               err(EX_OSERR, "gethostname() failed");
+       if ((p = strchr(LocalHostName, '.')) != NULL) {
+               *p++ = '\0';
+               LocalDomain = p;
+       } else {
+               LocalDomain = "";
+       }
+
+       /*
+        *  Close all open log files.
+        */
+       Initialized = 0;
+       for (f = Files; f != NULL; f = next) {
+               /* flush any pending output */
+               if (f->f_prevcount)
+                       fprintlog(f, 0, (char *)NULL);
+
+               switch (f->f_type) {
+               case F_FILE:
+               case F_FORW:
+               case F_CONSOLE:
+               case F_TTY:
+                       close_filed(f);
+                       break;
+               case F_PIPE:
+                       if (f->f_un.f_pipe.f_pid > 0) {
+                               close_filed(f);
+                               deadq_enter(f->f_un.f_pipe.f_pid,
+                                           f->f_un.f_pipe.f_pname);
+                       }
+                       f->f_un.f_pipe.f_pid = 0;
+                       break;
+               }
+               next = f->f_next;
+               if (f->f_program) free(f->f_program);
+               if (f->f_host) free(f->f_host);
+               free((char *)f);
+       }
+       Files = NULL;
+
+       /* open the configuration file */
+       if ((cf = fopen(ConfFile, "r")) == NULL) {
+               dprintf("cannot open %s\n", ConfFile);
+               *nextp = (struct filed *)calloc(1, sizeof(*f));
+               if (*nextp == NULL) {
+                       logerror("calloc");
+                       exit(1);
+               }
+               cfline("*.ERR\t/dev/console", *nextp, "*", "*");
+               (*nextp)->f_next = (struct filed *)calloc(1, sizeof(*f));
+               if ((*nextp)->f_next == NULL) {
+                       logerror("calloc");
+                       exit(1);
+               }
+               cfline("*.PANIC\t*", (*nextp)->f_next, "*", "*");
+               Initialized = 1;
+               return;
+       }
+
+       readconfigfile(cf, &Files, 1);
 
        /* close the configuration file */
        (void)fclose(cf);
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to