diff --git a/COPYING.anacron b/COPYING.anacron new file mode 100644 index 0000000..d159169 --- /dev/null +++ b/COPYING.anacron @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. diff --git a/ChangeLog b/ChangeLog index e4ed9fa..a5a3fe4 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,107 @@ +2019-10-31 Tomas Mraz + + * Release new version 1.5.5 + +2019-10-31 Tomas Mraz + + * Avoid warning for strncat. + +2019-10-29 Christian Kastner + + * crontab.1: Various fixes and improvements + +2019-10-30 Christian Kastner + + * crontab: fsync to check for full disk + +2019-10-30 Christian Kastner + + * crontab: Add Y/N to retry prompt + +2019-10-30 Christian Kastner + + * entries: Explicitly validate upper ranges and steps + +2019-10-29 Christian Kastner + + * crond: report missing newline before EOF + +2019-09-09 Christian Hesse + + * do not log carriage return + +2019-08-22 sgerwk + + * skip directories when given as crontabs + +2019-07-22 Stephane Blondon + + * crontab -l colors comment lines in a different color + +2019-07-09 sgerwk + + * fix compile instruction: configure is generated by autogen.sh + +2019-07-08 Tomas Mraz + + * getdtablesize() can return very high values in containers + +2019-05-11 John Horne + + * Power supply name not detected correctly. + +2019-05-07 Tomas Mraz + + * Revert "Avoid creating pid files when crond doesn't fork" + +2019-04-15 Tomas Mraz + + * anacron: fix types in comparisons + +2019-03-31 Sami Kerola + + * mics: stop using plain integer as NULL pointer + +2019-03-31 Sami Kerola + + * cron: fix type in comparison + +2019-03-31 Sami Kerola + + * cron: fix variable shadowing + +2019-03-31 Sami Kerola + + * cron: mark signal number arguments in signal handlers unused + +2019-04-08 Tomáš Mráz + + * Update readme.md with recent releases + +2019-04-08 Tomas Mraz + + * Move allowed() and related function to security.c + +2019-03-31 Sami Kerola + + * build-sys: enable anacron by default + +2019-03-31 Sami Kerola + + * build-sys: use none-recursive build + +2019-04-02 sgerwk + + * cronnext: optionally select jobs by substring + +2019-03-18 Tomas Mraz + + * crond: Do not abort loading crontab prematurely in case of error + +2019-03-18 Tomas Mraz + + * Release new version 1.5.4 + 2019-03-18 Tomas Mraz * crond: Fix regression from last release diff --git a/INSTALL b/INSTALL index 9917612..c68f6d1 100644 --- a/INSTALL +++ b/INSTALL @@ -6,6 +6,9 @@ Run the usual autotools combination of: make make install +If no "configure" script is present, generate it by: +./autogen.sh + The executable files will be installed in /usr/local/* by default. Configure Options diff --git a/Makefile.am b/Makefile.am index b0e04f2..8b95e6e 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,9 +1,18 @@ -SUBDIRS = src man anacron +AM_CFLAGS = -I$(top_srcdir) + +BUILT_SOURCES = +CLEANFILES = +EXTRA_DIST = +bin_PROGRAMS = +common_nodist = +sbin_PROGRAMS = dist_noinst_HEADERS = \ cronie_common.h -EXTRA_DIST = \ +EXTRA_DIST += \ + README.anacron \ + COPYING.anacron \ cronie.init \ crond.sysconfig \ contrib/anacrontab \ @@ -19,3 +28,7 @@ dist_pam_DATA = pam/crond else EXTRA_DIST += pam/crond endif + +include anacron/Makemodule.am +include man/Makemodule.am +include src/Makemodule.am diff --git a/Makefile.in b/Makefile.in index 7cd50a8..50e1892 100644 --- a/Makefile.in +++ b/Makefile.in @@ -14,6 +14,9 @@ @SET_MAKE@ +# Makefile.am - two binaries crond and crontab + + VPATH = @srcdir@ am__is_gnu_make = { \ @@ -89,7 +92,20 @@ PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ +bin_PROGRAMS = src/cronnext$(EXEEXT) src/crontab$(EXEEXT) +sbin_PROGRAMS = $(am__EXEEXT_1) src/crond$(EXEEXT) @PAM_FALSE@am__append_1 = pam/crond + +# Makefile.am - two binaries crond and crontab +@ANACRON_TRUE@am__append_2 = anacron/anacron +@ANACRON_TRUE@am__append_3 = anacron-paths.h +@ANACRON_TRUE@am__append_4 = $(common_nodist) + +# This header contains all the paths. +# If they are configurable, they are declared in configure script. +# Depends on this Makefile, because it uses make variables. +@ANACRON_TRUE@am__append_5 = anacron-paths.h +@ANACRON_TRUE@am__append_6 = $(anacron_man) subdir = . ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac @@ -104,6 +120,53 @@ mkinstalldirs = $(install_sh) -d CONFIG_HEADER = config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = +am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(sbindir)" \ + "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(man5dir)" \ + "$(DESTDIR)$(man8dir)" "$(DESTDIR)$(pamdir)" +@ANACRON_TRUE@am__EXEEXT_1 = anacron/anacron$(EXEEXT) +PROGRAMS = $(bin_PROGRAMS) $(sbin_PROGRAMS) +am__anacron_anacron_SOURCES_DIST = anacron-paths.h anacron/global.h \ + anacron/gregor.c anacron/gregor.h anacron/lock.c anacron/log.c \ + anacron/main.c anacron/matchrx.c anacron/matchrx.h \ + anacron/readtab.c anacron/runjob.c +am__dirstamp = $(am__leading_dot)dirstamp +@ANACRON_TRUE@am_anacron_anacron_OBJECTS = anacron/gregor.$(OBJEXT) \ +@ANACRON_TRUE@ anacron/lock.$(OBJEXT) anacron/log.$(OBJEXT) \ +@ANACRON_TRUE@ anacron/main.$(OBJEXT) anacron/matchrx.$(OBJEXT) \ +@ANACRON_TRUE@ anacron/readtab.$(OBJEXT) \ +@ANACRON_TRUE@ anacron/runjob.$(OBJEXT) +am__objects_1 = +am__objects_2 = $(am__objects_1) +@ANACRON_TRUE@nodist_anacron_anacron_OBJECTS = $(am__objects_2) +anacron_anacron_OBJECTS = $(am_anacron_anacron_OBJECTS) \ + $(nodist_anacron_anacron_OBJECTS) +am__DEPENDENCIES_1 = +@ANACRON_TRUE@anacron_anacron_DEPENDENCIES = $(am__DEPENDENCIES_1) \ +@ANACRON_TRUE@ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) +am__objects_3 = src/entry.$(OBJEXT) src/env.$(OBJEXT) \ + src/misc.$(OBJEXT) src/pw_dup.$(OBJEXT) +am_src_crond_OBJECTS = src/cron.$(OBJEXT) src/database.$(OBJEXT) \ + src/do_command.$(OBJEXT) src/job.$(OBJEXT) src/popen.$(OBJEXT) \ + src/security.$(OBJEXT) src/user.$(OBJEXT) $(am__objects_3) +nodist_src_crond_OBJECTS = $(am__objects_2) +src_crond_OBJECTS = $(am_src_crond_OBJECTS) \ + $(nodist_src_crond_OBJECTS) +src_crond_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +am_src_cronnext_OBJECTS = src/cronnext.$(OBJEXT) \ + src/database.$(OBJEXT) src/job.$(OBJEXT) src/user.$(OBJEXT) \ + $(am__objects_3) +nodist_src_cronnext_OBJECTS = $(am__objects_2) +src_cronnext_OBJECTS = $(am_src_cronnext_OBJECTS) \ + $(nodist_src_cronnext_OBJECTS) +src_cronnext_LDADD = $(LDADD) +am_src_crontab_OBJECTS = src/crontab.$(OBJEXT) src/security.$(OBJEXT) \ + $(am__objects_3) +nodist_src_crontab_OBJECTS = $(am__objects_2) +src_crontab_OBJECTS = $(am_src_crontab_OBJECTS) \ + $(nodist_src_crontab_OBJECTS) +src_crontab_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false @@ -116,22 +179,45 @@ AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = -SOURCES = -DIST_SOURCES = -RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ - ctags-recursive dvi-recursive html-recursive info-recursive \ - install-data-recursive install-dvi-recursive \ - install-exec-recursive install-html-recursive \ - install-info-recursive install-pdf-recursive \ - install-ps-recursive install-recursive installcheck-recursive \ - installdirs-recursive pdf-recursive ps-recursive \ - tags-recursive uninstall-recursive +DEFAULT_INCLUDES = -I.@am__isrc@ +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__maybe_remake_depfiles = depfiles +am__depfiles_remade = anacron/$(DEPDIR)/gregor.Po \ + anacron/$(DEPDIR)/lock.Po anacron/$(DEPDIR)/log.Po \ + anacron/$(DEPDIR)/main.Po anacron/$(DEPDIR)/matchrx.Po \ + anacron/$(DEPDIR)/readtab.Po anacron/$(DEPDIR)/runjob.Po \ + src/$(DEPDIR)/cron.Po src/$(DEPDIR)/cronnext.Po \ + src/$(DEPDIR)/crontab.Po src/$(DEPDIR)/database.Po \ + src/$(DEPDIR)/do_command.Po src/$(DEPDIR)/entry.Po \ + src/$(DEPDIR)/env.Po src/$(DEPDIR)/job.Po \ + src/$(DEPDIR)/misc.Po src/$(DEPDIR)/popen.Po \ + src/$(DEPDIR)/pw_dup.Po src/$(DEPDIR)/security.Po \ + src/$(DEPDIR)/user.Po +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +SOURCES = $(anacron_anacron_SOURCES) $(nodist_anacron_anacron_SOURCES) \ + $(src_crond_SOURCES) $(nodist_src_crond_SOURCES) \ + $(src_cronnext_SOURCES) $(nodist_src_cronnext_SOURCES) \ + $(src_crontab_SOURCES) $(nodist_src_crontab_SOURCES) +DIST_SOURCES = $(am__anacron_anacron_SOURCES_DIST) \ + $(src_crond_SOURCES) $(src_cronnext_SOURCES) \ + $(src_crontab_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac -am__dist_pam_DATA_DIST = pam/crond am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ @@ -159,17 +245,14 @@ am__uninstall_files_from_dir = { \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } -am__installdirs = "$(DESTDIR)$(pamdir)" +man1dir = $(mandir)/man1 +man5dir = $(mandir)/man5 +man8dir = $(mandir)/man8 +NROFF = nroff +MANS = $(dist_man_MANS) +am__dist_pam_DATA_DIST = pam/crond DATA = $(dist_pam_DATA) HEADERS = $(dist_noinst_HEADERS) -RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ - distclean-recursive maintainer-clean-recursive -am__recursive_targets = \ - $(RECURSIVE_TARGETS) \ - $(RECURSIVE_CLEAN_TARGETS) \ - $(am__extra_recursive_targets) -AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ - cscope distdir distdir-am dist dist-all distcheck am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) \ $(LISP)config.h.in # Read a list of newline-separated strings from the standard input, @@ -191,10 +274,12 @@ am__define_uniq_tagged_files = \ ETAGS = etags CTAGS = ctags CSCOPE = cscope -DIST_SUBDIRS = $(SUBDIRS) -am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/config.h.in AUTHORS \ - COPYING ChangeLog INSTALL NEWS README compile config.guess \ - config.sub depcomp install-sh missing +AM_RECURSIVE_TARGETS = cscope +am__DIST_COMMON = $(dist_man_MANS) $(srcdir)/Makefile.in \ + $(srcdir)/anacron/Makemodule.am $(srcdir)/config.h.in \ + $(srcdir)/man/Makemodule.am $(srcdir)/src/Makemodule.am \ + AUTHORS COPYING ChangeLog INSTALL NEWS README compile \ + config.guess config.sub depcomp install-sh missing DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) @@ -205,31 +290,6 @@ am__remove_distdir = \ || { sleep 5 && rm -rf "$(distdir)"; }; \ else :; fi am__post_remove_distdir = $(am__remove_distdir) -am__relativize = \ - dir0=`pwd`; \ - sed_first='s,^\([^/]*\)/.*$$,\1,'; \ - sed_rest='s,^[^/]*/*,,'; \ - sed_last='s,^.*/\([^/]*\)$$,\1,'; \ - sed_butlast='s,/*[^/]*$$,,'; \ - while test -n "$$dir1"; do \ - first=`echo "$$dir1" | sed -e "$$sed_first"`; \ - if test "$$first" != "."; then \ - if test "$$first" = ".."; then \ - dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ - dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ - else \ - first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ - if test "$$first2" = "$$first"; then \ - dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ - else \ - dir2="../$$dir2"; \ - fi; \ - dir0="$$dir0"/"$$first"; \ - fi; \ - fi; \ - dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ - done; \ - reldir="$$dir2" DIST_ARCHIVES = $(distdir).tar.gz GZIP_ENV = --best DIST_TARGETS = dist-gzip @@ -344,23 +404,93 @@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ -SUBDIRS = src man anacron +AM_CFLAGS = -I$(top_srcdir) +BUILT_SOURCES = $(am__append_4) $(common_nodist) + +# This header contains all the paths. +# If they are configurable, they are declared in configure script. +# Depends on this Makefile, because it uses make variables. +# CCD 2010/09/10 added CRON_HOSTNAME for clustered-cron. +CLEANFILES = $(am__append_5) cron-paths.h +EXTRA_DIST = README.anacron COPYING.anacron cronie.init \ + crond.sysconfig contrib/anacrontab contrib/0anacron \ + contrib/0hourly contrib/dailyjobs contrib/cronie.systemd \ + anacron/ChangeLog.anacron $(am__append_1) $(anacron_man) +common_nodist = $(am__append_3) cron-paths.h dist_noinst_HEADERS = \ cronie_common.h -EXTRA_DIST = cronie.init crond.sysconfig contrib/anacrontab \ - contrib/0anacron contrib/0hourly contrib/dailyjobs \ - contrib/cronie.systemd anacron/ChangeLog.anacron \ - $(am__append_1) @PAM_TRUE@pamdir = $(sysconfdir)/pam.d @PAM_TRUE@dist_pam_DATA = pam/crond -all: config.h - $(MAKE) $(AM_MAKEFLAGS) all-recursive +@ANACRON_TRUE@anacron_anacron_SOURCES = \ +@ANACRON_TRUE@ anacron-paths.h \ +@ANACRON_TRUE@ anacron/global.h \ +@ANACRON_TRUE@ anacron/gregor.c \ +@ANACRON_TRUE@ anacron/gregor.h \ +@ANACRON_TRUE@ anacron/lock.c \ +@ANACRON_TRUE@ anacron/log.c \ +@ANACRON_TRUE@ anacron/main.c \ +@ANACRON_TRUE@ anacron/matchrx.c \ +@ANACRON_TRUE@ anacron/matchrx.h \ +@ANACRON_TRUE@ anacron/readtab.c \ +@ANACRON_TRUE@ anacron/runjob.c + +@ANACRON_TRUE@nodist_anacron_anacron_SOURCES = $(common_nodist) +@ANACRON_TRUE@anacron_anacron_LDADD = $(LIBSELINUX) $(LIBPAM) $(LIBAUDIT) +dist_man_MANS = man/cron.8 man/crond.8 man/cronnext.1 man/crontab.1 \ + man/crontab.5 $(am__append_6) +anacron_man = \ + man/anacrontab.5 \ + man/anacron.8 + +src_crond_SOURCES = \ + src/cron.c \ + src/database.c \ + src/do_command.c \ + src/job.c \ + src/popen.c \ + src/security.c \ + src/user.c \ + $(common_src) + +src_crontab_SOURCES = \ + src/crontab.c \ + src/security.c \ + $(common_src) + +src_cronnext_SOURCES = \ + src/cronnext.c \ + src/database.c \ + src/job.c \ + src/user.c \ + $(common_src) + +common_src = \ + src/bitstring.h \ + src/entry.c \ + src/env.c \ + src/externs.h \ + src/funcs.h \ + src/globals.h \ + src/macros.h \ + src/misc.c \ + src/pathnames.h \ + src/pw_dup.c \ + src/structs.h + +nodist_src_crond_SOURCES = $(common_nodist) +nodist_src_crontab_SOURCES = $(common_nodist) +nodist_src_cronnext_SOURCES = $(common_nodist) +src_crond_LDADD = $(LIBSELINUX) $(LIBPAM) $(LIBAUDIT) +src_crontab_LDADD = $(LIBSELINUX) $(LIBPAM) $(LIBAUDIT) +all: $(BUILT_SOURCES) config.h + $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: +.SUFFIXES: .c .o .obj am--refresh: Makefile @: -$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(srcdir)/anacron/Makemodule.am $(srcdir)/man/Makemodule.am $(srcdir)/src/Makemodule.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ @@ -382,6 +512,7 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__maybe_remake_depfiles);; \ esac; +$(srcdir)/anacron/Makemodule.am $(srcdir)/man/Makemodule.am $(srcdir)/src/Makemodule.am $(am__empty): $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) $(SHELL) ./config.status --recheck @@ -406,6 +537,331 @@ $(srcdir)/config.h.in: $(am__configure_deps) distclean-hdr: -rm -f config.h stamp-h1 +install-binPROGRAMS: $(bin_PROGRAMS) + @$(NORMAL_INSTALL) + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ + fi; \ + for p in $$list; do echo "$$p $$p"; done | \ + sed 's/$(EXEEXT)$$//' | \ + while read p p1; do if test -f $$p \ + ; then echo "$$p"; echo "$$p"; else :; fi; \ + done | \ + sed -e 'p;s,.*/,,;n;h' \ + -e 's|.*|.|' \ + -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ + sed 'N;N;N;s,\n, ,g' | \ + $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ + { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ + if ($$2 == $$4) files[d] = files[d] " " $$1; \ + else { print "f", $$3 "/" $$4, $$1; } } \ + END { for (d in files) print "f", d, files[d] }' | \ + while read type dir files; do \ + if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ + test -z "$$files" || { \ + echo " $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ + $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ + } \ + ; done + +uninstall-binPROGRAMS: + @$(NORMAL_UNINSTALL) + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + files=`for p in $$list; do echo "$$p"; done | \ + sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ + -e 's/$$/$(EXEEXT)/' \ + `; \ + test -n "$$list" || exit 0; \ + echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(bindir)" && rm -f $$files + +clean-binPROGRAMS: + -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) +install-sbinPROGRAMS: $(sbin_PROGRAMS) + @$(NORMAL_INSTALL) + @list='$(sbin_PROGRAMS)'; test -n "$(sbindir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(sbindir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(sbindir)" || exit 1; \ + fi; \ + for p in $$list; do echo "$$p $$p"; done | \ + sed 's/$(EXEEXT)$$//' | \ + while read p p1; do if test -f $$p \ + ; then echo "$$p"; echo "$$p"; else :; fi; \ + done | \ + sed -e 'p;s,.*/,,;n;h' \ + -e 's|.*|.|' \ + -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ + sed 'N;N;N;s,\n, ,g' | \ + $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ + { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ + if ($$2 == $$4) files[d] = files[d] " " $$1; \ + else { print "f", $$3 "/" $$4, $$1; } } \ + END { for (d in files) print "f", d, files[d] }' | \ + while read type dir files; do \ + if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ + test -z "$$files" || { \ + echo " $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(sbindir)$$dir'"; \ + $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(sbindir)$$dir" || exit $$?; \ + } \ + ; done + +uninstall-sbinPROGRAMS: + @$(NORMAL_UNINSTALL) + @list='$(sbin_PROGRAMS)'; test -n "$(sbindir)" || list=; \ + files=`for p in $$list; do echo "$$p"; done | \ + sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ + -e 's/$$/$(EXEEXT)/' \ + `; \ + test -n "$$list" || exit 0; \ + echo " ( cd '$(DESTDIR)$(sbindir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(sbindir)" && rm -f $$files + +clean-sbinPROGRAMS: + -test -z "$(sbin_PROGRAMS)" || rm -f $(sbin_PROGRAMS) +anacron/$(am__dirstamp): + @$(MKDIR_P) anacron + @: > anacron/$(am__dirstamp) +anacron/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) anacron/$(DEPDIR) + @: > anacron/$(DEPDIR)/$(am__dirstamp) +anacron/gregor.$(OBJEXT): anacron/$(am__dirstamp) \ + anacron/$(DEPDIR)/$(am__dirstamp) +anacron/lock.$(OBJEXT): anacron/$(am__dirstamp) \ + anacron/$(DEPDIR)/$(am__dirstamp) +anacron/log.$(OBJEXT): anacron/$(am__dirstamp) \ + anacron/$(DEPDIR)/$(am__dirstamp) +anacron/main.$(OBJEXT): anacron/$(am__dirstamp) \ + anacron/$(DEPDIR)/$(am__dirstamp) +anacron/matchrx.$(OBJEXT): anacron/$(am__dirstamp) \ + anacron/$(DEPDIR)/$(am__dirstamp) +anacron/readtab.$(OBJEXT): anacron/$(am__dirstamp) \ + anacron/$(DEPDIR)/$(am__dirstamp) +anacron/runjob.$(OBJEXT): anacron/$(am__dirstamp) \ + anacron/$(DEPDIR)/$(am__dirstamp) + +anacron/anacron$(EXEEXT): $(anacron_anacron_OBJECTS) $(anacron_anacron_DEPENDENCIES) $(EXTRA_anacron_anacron_DEPENDENCIES) anacron/$(am__dirstamp) + @rm -f anacron/anacron$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(anacron_anacron_OBJECTS) $(anacron_anacron_LDADD) $(LIBS) +src/$(am__dirstamp): + @$(MKDIR_P) src + @: > src/$(am__dirstamp) +src/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/$(DEPDIR) + @: > src/$(DEPDIR)/$(am__dirstamp) +src/cron.$(OBJEXT): src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp) +src/database.$(OBJEXT): src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) +src/do_command.$(OBJEXT): src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) +src/job.$(OBJEXT): src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp) +src/popen.$(OBJEXT): src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp) +src/security.$(OBJEXT): src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) +src/user.$(OBJEXT): src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp) +src/entry.$(OBJEXT): src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp) +src/env.$(OBJEXT): src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp) +src/misc.$(OBJEXT): src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp) +src/pw_dup.$(OBJEXT): src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) + +src/crond$(EXEEXT): $(src_crond_OBJECTS) $(src_crond_DEPENDENCIES) $(EXTRA_src_crond_DEPENDENCIES) src/$(am__dirstamp) + @rm -f src/crond$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(src_crond_OBJECTS) $(src_crond_LDADD) $(LIBS) +src/cronnext.$(OBJEXT): src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) + +src/cronnext$(EXEEXT): $(src_cronnext_OBJECTS) $(src_cronnext_DEPENDENCIES) $(EXTRA_src_cronnext_DEPENDENCIES) src/$(am__dirstamp) + @rm -f src/cronnext$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(src_cronnext_OBJECTS) $(src_cronnext_LDADD) $(LIBS) +src/crontab.$(OBJEXT): src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) + +src/crontab$(EXEEXT): $(src_crontab_OBJECTS) $(src_crontab_DEPENDENCIES) $(EXTRA_src_crontab_DEPENDENCIES) src/$(am__dirstamp) + @rm -f src/crontab$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(src_crontab_OBJECTS) $(src_crontab_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + -rm -f anacron/*.$(OBJEXT) + -rm -f src/*.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@anacron/$(DEPDIR)/gregor.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@anacron/$(DEPDIR)/lock.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@anacron/$(DEPDIR)/log.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@anacron/$(DEPDIR)/main.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@anacron/$(DEPDIR)/matchrx.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@anacron/$(DEPDIR)/readtab.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@anacron/$(DEPDIR)/runjob.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/cron.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/cronnext.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/crontab.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/database.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/do_command.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/entry.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/env.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/job.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/misc.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/popen.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/pw_dup.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/security.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/user.Po@am__quote@ # am--include-marker + +$(am__depfiles_remade): + @$(MKDIR_P) $(@D) + @echo '# dummy' >$@-t && $(am__mv) $@-t $@ + +am--depfiles: $(am__depfiles_remade) + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` +install-man1: $(dist_man_MANS) + @$(NORMAL_INSTALL) + @list1=''; \ + list2='$(dist_man_MANS)'; \ + test -n "$(man1dir)" \ + && test -n "`echo $$list1$$list2`" \ + || exit 0; \ + echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \ + { for i in $$list1; do echo "$$i"; done; \ + if test -n "$$list2"; then \ + for i in $$list2; do echo "$$i"; done \ + | sed -n '/\.1[a-z]*$$/p'; \ + fi; \ + } | while read p; do \ + if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; echo "$$p"; \ + done | \ + sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ + sed 'N;N;s,\n, ,g' | { \ + list=; while read file base inst; do \ + if test "$$base" = "$$inst"; then list="$$list $$file"; else \ + echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ + $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \ + fi; \ + done; \ + for i in $$list; do echo "$$i"; done | $(am__base_list) | \ + while read files; do \ + test -z "$$files" || { \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \ + done; } + +uninstall-man1: + @$(NORMAL_UNINSTALL) + @list=''; test -n "$(man1dir)" || exit 0; \ + files=`{ for i in $$list; do echo "$$i"; done; \ + l2='$(dist_man_MANS)'; for i in $$l2; do echo "$$i"; done | \ + sed -n '/\.1[a-z]*$$/p'; \ + } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ + dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir) +install-man5: $(dist_man_MANS) + @$(NORMAL_INSTALL) + @list1=''; \ + list2='$(dist_man_MANS)'; \ + test -n "$(man5dir)" \ + && test -n "`echo $$list1$$list2`" \ + || exit 0; \ + echo " $(MKDIR_P) '$(DESTDIR)$(man5dir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(man5dir)" || exit 1; \ + { for i in $$list1; do echo "$$i"; done; \ + if test -n "$$list2"; then \ + for i in $$list2; do echo "$$i"; done \ + | sed -n '/\.5[a-z]*$$/p'; \ + fi; \ + } | while read p; do \ + if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; echo "$$p"; \ + done | \ + sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^5][0-9a-z]*$$,5,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ + sed 'N;N;s,\n, ,g' | { \ + list=; while read file base inst; do \ + if test "$$base" = "$$inst"; then list="$$list $$file"; else \ + echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man5dir)/$$inst'"; \ + $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man5dir)/$$inst" || exit $$?; \ + fi; \ + done; \ + for i in $$list; do echo "$$i"; done | $(am__base_list) | \ + while read files; do \ + test -z "$$files" || { \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man5dir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(man5dir)" || exit $$?; }; \ + done; } + +uninstall-man5: + @$(NORMAL_UNINSTALL) + @list=''; test -n "$(man5dir)" || exit 0; \ + files=`{ for i in $$list; do echo "$$i"; done; \ + l2='$(dist_man_MANS)'; for i in $$l2; do echo "$$i"; done | \ + sed -n '/\.5[a-z]*$$/p'; \ + } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^5][0-9a-z]*$$,5,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ + dir='$(DESTDIR)$(man5dir)'; $(am__uninstall_files_from_dir) +install-man8: $(dist_man_MANS) + @$(NORMAL_INSTALL) + @list1=''; \ + list2='$(dist_man_MANS)'; \ + test -n "$(man8dir)" \ + && test -n "`echo $$list1$$list2`" \ + || exit 0; \ + echo " $(MKDIR_P) '$(DESTDIR)$(man8dir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(man8dir)" || exit 1; \ + { for i in $$list1; do echo "$$i"; done; \ + if test -n "$$list2"; then \ + for i in $$list2; do echo "$$i"; done \ + | sed -n '/\.8[a-z]*$$/p'; \ + fi; \ + } | while read p; do \ + if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; echo "$$p"; \ + done | \ + sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^8][0-9a-z]*$$,8,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ + sed 'N;N;s,\n, ,g' | { \ + list=; while read file base inst; do \ + if test "$$base" = "$$inst"; then list="$$list $$file"; else \ + echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man8dir)/$$inst'"; \ + $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man8dir)/$$inst" || exit $$?; \ + fi; \ + done; \ + for i in $$list; do echo "$$i"; done | $(am__base_list) | \ + while read files; do \ + test -z "$$files" || { \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man8dir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(man8dir)" || exit $$?; }; \ + done; } + +uninstall-man8: + @$(NORMAL_UNINSTALL) + @list=''; test -n "$(man8dir)" || exit 0; \ + files=`{ for i in $$list; do echo "$$i"; done; \ + l2='$(dist_man_MANS)'; for i in $$l2; do echo "$$i"; done | \ + sed -n '/\.8[a-z]*$$/p'; \ + } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^8][0-9a-z]*$$,8,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ + dir='$(DESTDIR)$(man8dir)'; $(am__uninstall_files_from_dir) install-dist_pamDATA: $(dist_pam_DATA) @$(NORMAL_INSTALL) @list='$(dist_pam_DATA)'; test -n "$(pamdir)" || list=; \ @@ -428,61 +884,14 @@ uninstall-dist_pamDATA: files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pamdir)'; $(am__uninstall_files_from_dir) -# This directory's subdirectories are mostly independent; you can cd -# into them and run 'make' without going through this Makefile. -# To change the values of 'make' variables: instead of editing Makefiles, -# (1) if the variable is set in 'config.status', edit 'config.status' -# (which will cause the Makefiles to be regenerated when you run 'make'); -# (2) otherwise, pass the desired values on the 'make' command line. -$(am__recursive_targets): - @fail=; \ - if $(am__make_keepgoing); then \ - failcom='fail=yes'; \ - else \ - failcom='exit 1'; \ - fi; \ - dot_seen=no; \ - target=`echo $@ | sed s/-recursive//`; \ - case "$@" in \ - distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ - *) list='$(SUBDIRS)' ;; \ - esac; \ - for subdir in $$list; do \ - echo "Making $$target in $$subdir"; \ - if test "$$subdir" = "."; then \ - dot_seen=yes; \ - local_target="$$target-am"; \ - else \ - local_target="$$target"; \ - fi; \ - ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ - || eval $$failcom; \ - done; \ - if test "$$dot_seen" = "no"; then \ - $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ - fi; test -z "$$fail" - ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique -tags: tags-recursive +tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ - if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ - include_option=--etags-include; \ - empty_fix=.; \ - else \ - include_option=--include; \ - empty_fix=; \ - fi; \ - list='$(SUBDIRS)'; for subdir in $$list; do \ - if test "$$subdir" = .; then :; else \ - test ! -f $$subdir/TAGS || \ - set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ - fi; \ - done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ @@ -495,7 +904,7 @@ tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $$unique; \ fi; \ fi -ctags: ctags-recursive +ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) @@ -514,7 +923,7 @@ cscope: cscope.files clean-cscope: -rm -f cscope.files cscope.files: clean-cscope cscopelist -cscopelist: cscopelist-recursive +cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ @@ -569,31 +978,6 @@ distdir-am: $(DISTFILES) || exit 1; \ fi; \ done - @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ - if test "$$subdir" = .; then :; else \ - $(am__make_dryrun) \ - || test -d "$(distdir)/$$subdir" \ - || $(MKDIR_P) "$(distdir)/$$subdir" \ - || exit 1; \ - dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ - $(am__relativize); \ - new_distdir=$$reldir; \ - dir1=$$subdir; dir2="$(top_distdir)"; \ - $(am__relativize); \ - new_top_distdir=$$reldir; \ - echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ - echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ - ($(am__cd) $$subdir && \ - $(MAKE) $(AM_MAKEFLAGS) \ - top_distdir="$$new_top_distdir" \ - distdir="$$new_distdir" \ - am__remove_distdir=: \ - am__skip_length_check=: \ - am__skip_mode_fix=: \ - distdir) \ - || exit 1; \ - fi; \ - done -test -n "$(am__skip_mode_fix)" \ || find "$(distdir)" -type d ! -perm -755 \ -exec chmod u+rwx,go+rx {} \; -o \ @@ -726,22 +1110,23 @@ distcleancheck: distclean $(distcleancheck_listfiles) ; \ exit 1; } >&2 check-am: all-am -check: check-recursive -all-am: Makefile $(DATA) $(HEADERS) config.h -installdirs: installdirs-recursive -installdirs-am: - for dir in "$(DESTDIR)$(pamdir)"; do \ +check: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) check-am +all-am: Makefile $(PROGRAMS) $(MANS) $(DATA) $(HEADERS) config.h +installdirs: + for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(sbindir)" "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(man5dir)" "$(DESTDIR)$(man8dir)" "$(DESTDIR)$(pamdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done -install: install-recursive -install-exec: install-exec-recursive -install-data: install-data-recursive -uninstall: uninstall-recursive +install: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am -installcheck: installcheck-recursive +installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ @@ -755,103 +1140,214 @@ install-strip: mostlyclean-generic: clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + -rm -f anacron/$(DEPDIR)/$(am__dirstamp) + -rm -f anacron/$(am__dirstamp) + -rm -f src/$(DEPDIR)/$(am__dirstamp) + -rm -f src/$(am__dirstamp) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -clean: clean-recursive + -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) +clean: clean-am -clean-am: clean-generic mostlyclean-am +clean-am: clean-binPROGRAMS clean-generic clean-sbinPROGRAMS \ + mostlyclean-am -distclean: distclean-recursive +distclean: distclean-am -rm -f $(am__CONFIG_DISTCLEAN_FILES) + -rm -f anacron/$(DEPDIR)/gregor.Po + -rm -f anacron/$(DEPDIR)/lock.Po + -rm -f anacron/$(DEPDIR)/log.Po + -rm -f anacron/$(DEPDIR)/main.Po + -rm -f anacron/$(DEPDIR)/matchrx.Po + -rm -f anacron/$(DEPDIR)/readtab.Po + -rm -f anacron/$(DEPDIR)/runjob.Po + -rm -f src/$(DEPDIR)/cron.Po + -rm -f src/$(DEPDIR)/cronnext.Po + -rm -f src/$(DEPDIR)/crontab.Po + -rm -f src/$(DEPDIR)/database.Po + -rm -f src/$(DEPDIR)/do_command.Po + -rm -f src/$(DEPDIR)/entry.Po + -rm -f src/$(DEPDIR)/env.Po + -rm -f src/$(DEPDIR)/job.Po + -rm -f src/$(DEPDIR)/misc.Po + -rm -f src/$(DEPDIR)/popen.Po + -rm -f src/$(DEPDIR)/pw_dup.Po + -rm -f src/$(DEPDIR)/security.Po + -rm -f src/$(DEPDIR)/user.Po -rm -f Makefile -distclean-am: clean-am distclean-generic distclean-hdr distclean-tags +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-hdr distclean-tags -dvi: dvi-recursive +dvi: dvi-am dvi-am: -html: html-recursive +html: html-am html-am: -info: info-recursive +info: info-am info-am: -install-data-am: install-dist_pamDATA +install-data-am: install-dist_pamDATA install-man -install-dvi: install-dvi-recursive +install-dvi: install-dvi-am install-dvi-am: -install-exec-am: +install-exec-am: install-binPROGRAMS install-sbinPROGRAMS -install-html: install-html-recursive +install-html: install-html-am install-html-am: -install-info: install-info-recursive +install-info: install-info-am install-info-am: -install-man: +install-man: install-man1 install-man5 install-man8 -install-pdf: install-pdf-recursive +install-pdf: install-pdf-am install-pdf-am: -install-ps: install-ps-recursive +install-ps: install-ps-am install-ps-am: installcheck-am: -maintainer-clean: maintainer-clean-recursive +maintainer-clean: maintainer-clean-am -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -rf $(top_srcdir)/autom4te.cache + -rm -f anacron/$(DEPDIR)/gregor.Po + -rm -f anacron/$(DEPDIR)/lock.Po + -rm -f anacron/$(DEPDIR)/log.Po + -rm -f anacron/$(DEPDIR)/main.Po + -rm -f anacron/$(DEPDIR)/matchrx.Po + -rm -f anacron/$(DEPDIR)/readtab.Po + -rm -f anacron/$(DEPDIR)/runjob.Po + -rm -f src/$(DEPDIR)/cron.Po + -rm -f src/$(DEPDIR)/cronnext.Po + -rm -f src/$(DEPDIR)/crontab.Po + -rm -f src/$(DEPDIR)/database.Po + -rm -f src/$(DEPDIR)/do_command.Po + -rm -f src/$(DEPDIR)/entry.Po + -rm -f src/$(DEPDIR)/env.Po + -rm -f src/$(DEPDIR)/job.Po + -rm -f src/$(DEPDIR)/misc.Po + -rm -f src/$(DEPDIR)/popen.Po + -rm -f src/$(DEPDIR)/pw_dup.Po + -rm -f src/$(DEPDIR)/security.Po + -rm -f src/$(DEPDIR)/user.Po -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic -mostlyclean: mostlyclean-recursive +mostlyclean: mostlyclean-am -mostlyclean-am: mostlyclean-generic +mostlyclean-am: mostlyclean-compile mostlyclean-generic -pdf: pdf-recursive +pdf: pdf-am pdf-am: -ps: ps-recursive +ps: ps-am ps-am: -uninstall-am: uninstall-dist_pamDATA +uninstall-am: uninstall-binPROGRAMS uninstall-dist_pamDATA \ + uninstall-man uninstall-sbinPROGRAMS -.MAKE: $(am__recursive_targets) all install-am install-strip +uninstall-man: uninstall-man1 uninstall-man5 uninstall-man8 -.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \ - am--refresh check check-am clean clean-cscope clean-generic \ - cscope cscopelist-am ctags ctags-am dist dist-all dist-bzip2 \ - dist-gzip dist-lzip dist-shar dist-tarZ dist-xz dist-zip \ - distcheck distclean distclean-generic distclean-hdr \ - distclean-tags distcleancheck distdir distuninstallcheck dvi \ - dvi-am html html-am info info-am install install-am \ - install-data install-data-am install-dist_pamDATA install-dvi \ +.MAKE: all check install install-am install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am am--depfiles am--refresh check \ + check-am clean clean-binPROGRAMS clean-cscope clean-generic \ + clean-sbinPROGRAMS cscope cscopelist-am ctags ctags-am dist \ + dist-all dist-bzip2 dist-gzip dist-lzip dist-shar dist-tarZ \ + dist-xz dist-zip distcheck distclean distclean-compile \ + distclean-generic distclean-hdr distclean-tags distcleancheck \ + distdir distuninstallcheck dvi dvi-am html html-am info \ + info-am install install-am install-binPROGRAMS install-data \ + install-data-am install-dist_pamDATA install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ - install-pdf install-pdf-am install-ps install-ps-am \ + install-man1 install-man5 install-man8 install-pdf \ + install-pdf-am install-ps install-ps-am install-sbinPROGRAMS \ install-strip installcheck installcheck-am installdirs \ - installdirs-am maintainer-clean maintainer-clean-generic \ - mostlyclean mostlyclean-generic pdf pdf-am ps ps-am tags \ - tags-am uninstall uninstall-am uninstall-dist_pamDATA + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \ + tags tags-am uninstall uninstall-am uninstall-binPROGRAMS \ + uninstall-dist_pamDATA uninstall-man uninstall-man1 \ + uninstall-man5 uninstall-man8 uninstall-sbinPROGRAMS .PRECIOUS: Makefile +@ANACRON_TRUE@anacron-paths.h: Makefile +@ANACRON_TRUE@ @echo 'creating $@' +@ANACRON_TRUE@ @sed >$@ 's/ *\\$$//' <<\END #\ +@ANACRON_TRUE@ /* This file has been automatically generated. Do not edit. */ \ +@ANACRON_TRUE@ \ +@ANACRON_TRUE@ #ifndef _ANACRON_PATHS_H_ \ +@ANACRON_TRUE@ #define _ANACRON_PATHS_H_ \ +@ANACRON_TRUE@ #define ANACRON_SPOOL_DIR "$(ANACRON_SPOOL_DIR)" \ +@ANACRON_TRUE@ #define ANACRONTAB "$(ANACRONTAB)" \ +@ANACRON_TRUE@ #endif /* _ANACRON_PATHS_H_ */ \ +@ANACRON_TRUE@ END +cron-paths.h: Makefile + @echo 'creating $@' + @sed >$@ 's/ *\\$$//' <<\END #\ + /* This file has been automatically generated. Do not edit. */ \ + \ + #ifndef _CRON_PATHS_H_ \ + #define _CRON_PATHS_H_ \ + \ + /* SPOOLDIR is where the crontabs live. \ + * This directory will have its modtime updated \ + * whenever crontab(1) changes a crontab; this is \ + * the signal for cron(8) to look at each individual \ + * crontab file and reload those whose modtimes are \ + * newer than they were last time around (or which \ + * didn't exist last time around...) \ + * or it will be checked by inotify \ + */ \ + #define SPOOL_DIR "$(SPOOL_DIR)" \ + \ + /* CRON_HOSTNAME is file in SPOOL_DIR which, if it \ + * exists, and does not just contain a line matching \ + * the name returned by gethostname(), causes all \ + * crontabs in SPOOL_DIR to be ignored. This is \ + * intended to be used when clustering hosts sharing \ + * one NFS-mounted SPOOL_DIR, and where only one host \ + * should use the crontab files here at any one time. \ + */ \ + #define CRON_HOSTNAME ".cron.hostname" \ + \ + /* cron allow/deny file. At least cron.deny must \ + * exist for ordinary users to run crontab. \ + */ \ + #define CRON_ALLOW "$(sysconfdir)/cron.allow" \ + #define CRON_DENY "$(sysconfdir)/cron.deny" \ + \ + /* 4.3BSD-style crontab f.e. /etc/crontab */ \ + #define SYSCRONTAB "$(SYSCRONTAB)" \ + \ + /* system crontab dir f.e. /etc/cron.d/ */ \ + #define SYS_CROND_DIR "$(SYS_CROND_DIR)" \ + \ + #define SYSCONFDIR "$(sysconfdir)" \ + \ + #endif /* _CRON_PATHS_H_ */ \ + END # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. diff --git a/NEWS b/NEWS index b55e01a..ffc07ce 100644 --- a/NEWS +++ b/NEWS @@ -1,10 +1,24 @@ cronie NEWS -- history of user-visible changes. +Release 1.5.5 + +* Explicitly validate upper end of range and step to disallow entries + such as: 1-234/5678 * * * * .... +* crond: Report missing newline before EOF in syslog so the line is not + completely silently ignored. +* crontab -l colors comment lines in a different color. +* crond: Revert "Avoid creating pid files when crond doesn't fork". +* anacron is built by default. +* Use non-recursive build. +* cronnext: Allow to optionally select jobs by substring. + Release 1.5.4 + * crond: Fix regression from previous release. Only first job from a crontab was being run. Release 1.5.3 + * Fix CVE-2019-9704 and CVE-2019-9705 to avoid local DoS of the crond. * crontab: Make crontab without arguments fail. * crond: In PAM configuration include system-auth instead of password-auth. diff --git a/README b/README index c298ffe..d2c35c3 100644 --- a/README +++ b/README @@ -1,11 +1,13 @@ -17. January 2008 mmaslano (at) redhat (dot) com -Rename the fork on cronie. The source code could be found here: -http://mmaslano.fedorapeople.org/cronie/ or git archive here: -git://git.fedorahosted.org/git/cronie.git +Cronie contains the standard UNIX daemon crond that runs specified programs at +scheduled times and related tools. The source is based on the original vixie-cron +and has security and configuration enhancements like the ability to use pam and +SELinux. -3. October 2007 mmaslano (at) redhat (dot) com -This is a clone of 'original' vixie-cron. It was used in Red Hat|Fedora -system and patched for a long time. Now was made clone tagged with -version 4.2. -Changes are mainly in git commit messages, some older changes could be -found in spec changelog (contrib/vixie-cron.spec). +And why cronie? See http://www.urbandictionary.com/define.php?term=cronie + +Contact +------- + +Mailing list: `cronie-devel AT lists.fedorahosted DOT org` + +Bug reports and pull requests can be filled at the Github site. diff --git a/README.anacron b/README.anacron new file mode 100644 index 0000000..e1d5411 --- /dev/null +++ b/README.anacron @@ -0,0 +1,142 @@ + + What is Anacron ? + ----------------- + + Anacron is a periodic command scheduler. It executes commands at +intervals specified in days. Unlike cron, it does not assume that the +system is running continuously. It can therefore be used to control +the execution of daily, weekly and monthly jobs (or anything with a +period of n days), on systems that don't run 24 hours a day. When +installed and configured properly, Anacron will make sure that the +commands are run at the specified intervals as closely as +machine-uptime permits. + + Every time Anacron is run, it reads a configuration file that +specifies the jobs Anacron controls, and their periods in days. If a +job wasn't executed in the last n days, where n is the period of that +job, Anacron executes it. Anacron then records the date in a special +timestamp file that it keeps for each job, so it can know when to run +it again. When all the executed commands terminate, Anacron exits. + + It is recommended to run Anacron from the system boot-scripts. +This way the jobs "whose time has come" will be run shortly after the +machine boots. A delay can be specified for each job so that the +machine isn't overloaded at boot time. + + In addition to running Anacron from the boot-scripts, it is also +recommended to schedule it as a daily cron-job (usually at an early +morning hour), so that if the machine is kept running for a night, +jobs for the next day will still be executed. + + + Why this may be useful ? + ------------------------ + + Most Unix-like systems have daily, weekly and monthly scripts that +take care of various "housekeeping chores" such as log-rotation, +updating the "locate" and "man" databases, etc. Daily scripts are +usually scheduled as cron-jobs to execute around 1-7 AM. Weekly +scripts are scheduled to run on Sundays. On machines that are turned +off for the night or for the weekend, these scripts rarely get run. + + Anacron solves this problem. These jobs can simply be scheduled as +Anacron-jobs with periods of 1, 7 and a special target called @monthly. + + + What Anacron is not ? + --------------------- + + Anacron is not an attempt to make cron redundant. It cannot +currently be used to schedule commands at intervals smaller than days. +It also does not guarantee that the commands will be executed at any +specific day or hour. + + It isn't a full-time daemon. It has to be executed from boot +scripts, from cron-jobs, or explicitly. + + + For more details, see the anacron(8) manpage. + + + Requirements + ------------ + + - A Linux system. (maybe other *NIX systems) + - A functioning syslog daemon. + - A functioning /usr/lib/sendmail command. (all MTAs should have + that). + + + Compilation and Installation + ---------------------------- + + - Untar the source package. + + - Check the Makefile. Edit as required. + + - Check the top of "global.h". You may want to change the syslog + facility and priorities, and the path to your MTA's sendmail + compatible command (/usr/lib/sendmail). + + - cd to the directory. + + - Type "make". + You can safely ignore warnings of the form: "*.d: No such file or + directory" + + - Become root. Type "make install". + + + Setup + ----- + +1. Locate your system's daily, weekly and monthly cron-jobs. + See your cron documentation for more details. + +2. Decide which of these jobs should be controlled by Anacron. + Remember that Anacron does not guarantee execution at any specific + day of the month, day of the week, or time of day. Jobs for which + the timing is critical should probably not be controlled by + Anacron. + +3. Comment these jobs out of their crontab files. (You may have to + use the "crontab" command for this. See the cron documentation.) + +4. Put them in /etc/anacrontab. Note that the format is not the same + as the crontab entries. See the anacrontab(5) manpage. Here's an + example from a typical Debian system: + +-----Cut +# /etc/anacrontab example +SHELL=/bin/sh +PATH=/sbin:/bin:/usr/sbin:/usr/bin +# format: period delay job-identifier command +1 5 cron.daily run-parts /etc/cron.daily +7 10 cron.weekly run-parts /etc/cron.weekly +@monthly 15 cron.monthly run-parts /etc/cron.monthly +-----Cut + +5. Put the command "anacron -s" somewhere in your boot-scripts. + Make sure that syslogd is started before this command. + +6. Schedule the command "anacron -s" as a daily cron-job (preferably + at some early morning hour). This will make sure that jobs are run + when the systems is left running for a night. + +That's it. + +It is a good idea to check what your daily, weekly and monthly scripts +actually do, and disable any parts that may be irrelevant for your +system. + + + Credits + ------- + +Anacron was originally conceived and implemented by Christian Schwarz +. + +The current implementation is a complete rewrite by Itai Tzur +. + +Current code base maintained by Sean 'Shaleh' Perry . diff --git a/anacron-paths.h b/anacron-paths.h new file mode 100644 index 0000000..3e20979 --- /dev/null +++ b/anacron-paths.h @@ -0,0 +1,7 @@ +/* This file has been automatically generated. Do not edit. */ + +#ifndef _ANACRON_PATHS_H_ +#define _ANACRON_PATHS_H_ +#define ANACRON_SPOOL_DIR "/usr/local/var/spool/anacron" +#define ANACRONTAB "/usr/local/etc/anacrontab" +#endif /* _ANACRON_PATHS_H_ */ diff --git a/anacron/Makefile.in b/anacron/Makefile.in deleted file mode 100644 index b9fca22..0000000 --- a/anacron/Makefile.in +++ /dev/null @@ -1,647 +0,0 @@ -# Makefile.in generated by automake 1.16.1 from Makefile.am. -# @configure_input@ - -# Copyright (C) 1994-2018 Free Software Foundation, Inc. - -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - -@SET_MAKE@ - -VPATH = @srcdir@ -am__is_gnu_make = { \ - if test -z '$(MAKELEVEL)'; then \ - false; \ - elif test -n '$(MAKE_HOST)'; then \ - true; \ - elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ - true; \ - else \ - false; \ - fi; \ -} -am__make_running_with_option = \ - case $${target_option-} in \ - ?) ;; \ - *) echo "am__make_running_with_option: internal error: invalid" \ - "target option '$${target_option-}' specified" >&2; \ - exit 1;; \ - esac; \ - has_opt=no; \ - sane_makeflags=$$MAKEFLAGS; \ - if $(am__is_gnu_make); then \ - sane_makeflags=$$MFLAGS; \ - else \ - case $$MAKEFLAGS in \ - *\\[\ \ ]*) \ - bs=\\; \ - sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ - | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ - esac; \ - fi; \ - skip_next=no; \ - strip_trailopt () \ - { \ - flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ - }; \ - for flg in $$sane_makeflags; do \ - test $$skip_next = yes && { skip_next=no; continue; }; \ - case $$flg in \ - *=*|--*) continue;; \ - -*I) strip_trailopt 'I'; skip_next=yes;; \ - -*I?*) strip_trailopt 'I';; \ - -*O) strip_trailopt 'O'; skip_next=yes;; \ - -*O?*) strip_trailopt 'O';; \ - -*l) strip_trailopt 'l'; skip_next=yes;; \ - -*l?*) strip_trailopt 'l';; \ - -[dEDm]) skip_next=yes;; \ - -[JT]) skip_next=yes;; \ - esac; \ - case $$flg in \ - *$$target_option*) has_opt=yes; break;; \ - esac; \ - done; \ - test $$has_opt = yes -am__make_dryrun = (target_option=n; $(am__make_running_with_option)) -am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) -pkgdatadir = $(datadir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkglibexecdir = $(libexecdir)/@PACKAGE@ -am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -install_sh_DATA = $(install_sh) -c -m 644 -install_sh_PROGRAM = $(install_sh) -c -install_sh_SCRIPT = $(install_sh) -c -INSTALL_HEADER = $(INSTALL_DATA) -transform = $(program_transform_name) -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -build_triplet = @build@ -host_triplet = @host@ -@ANACRON_TRUE@sbin_PROGRAMS = anacron$(EXEEXT) -subdir = anacron -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/configure.ac -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) -mkinstalldirs = $(install_sh) -d -CONFIG_HEADER = $(top_builddir)/config.h -CONFIG_CLEAN_FILES = -CONFIG_CLEAN_VPATH_FILES = -am__installdirs = "$(DESTDIR)$(sbindir)" -PROGRAMS = $(sbin_PROGRAMS) -am__objects_1 = -am_anacron_OBJECTS = gregor.$(OBJEXT) lock.$(OBJEXT) log.$(OBJEXT) \ - main.$(OBJEXT) matchrx.$(OBJEXT) readtab.$(OBJEXT) \ - runjob.$(OBJEXT) $(am__objects_1) -nodist_anacron_OBJECTS = $(am__objects_1) -anacron_OBJECTS = $(am_anacron_OBJECTS) $(nodist_anacron_OBJECTS) -anacron_LDADD = $(LDADD) -am__DEPENDENCIES_1 = -anacron_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ - $(am__DEPENDENCIES_1) -AM_V_P = $(am__v_P_@AM_V@) -am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) -am__v_P_0 = false -am__v_P_1 = : -AM_V_GEN = $(am__v_GEN_@AM_V@) -am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) -am__v_GEN_0 = @echo " GEN " $@; -am__v_GEN_1 = -AM_V_at = $(am__v_at_@AM_V@) -am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) -am__v_at_0 = @ -am__v_at_1 = -DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) -depcomp = $(SHELL) $(top_srcdir)/depcomp -am__maybe_remake_depfiles = depfiles -am__depfiles_remade = ./$(DEPDIR)/gregor.Po ./$(DEPDIR)/lock.Po \ - ./$(DEPDIR)/log.Po ./$(DEPDIR)/main.Po ./$(DEPDIR)/matchrx.Po \ - ./$(DEPDIR)/readtab.Po ./$(DEPDIR)/runjob.Po -am__mv = mv -f -COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ - $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -AM_V_CC = $(am__v_CC_@AM_V@) -am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) -am__v_CC_0 = @echo " CC " $@; -am__v_CC_1 = -CCLD = $(CC) -LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ -AM_V_CCLD = $(am__v_CCLD_@AM_V@) -am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) -am__v_CCLD_0 = @echo " CCLD " $@; -am__v_CCLD_1 = -SOURCES = $(anacron_SOURCES) $(nodist_anacron_SOURCES) -DIST_SOURCES = $(anacron_SOURCES) -am__can_run_installinfo = \ - case $$AM_UPDATE_INFO_DIR in \ - n|no|NO) false;; \ - *) (install-info --version) >/dev/null 2>&1;; \ - esac -am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) -# Read a list of newline-separated strings from the standard input, -# and print each of them once, without duplicates. Input order is -# *not* preserved. -am__uniquify_input = $(AWK) '\ - BEGIN { nonempty = 0; } \ - { items[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in items) print i; }; } \ -' -# Make sure the list of sources is unique. This is necessary because, -# e.g., the same source file might be shared among _SOURCES variables -# for different programs/libraries. -am__define_uniq_tagged_files = \ - list='$(am__tagged_files)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | $(am__uniquify_input)` -ETAGS = etags -CTAGS = ctags -am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -ACLOCAL = @ACLOCAL@ -AMTAR = @AMTAR@ -AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ -ANACRONTAB = @ANACRONTAB@ -ANACRON_SPOOL_DIR = @ANACRON_SPOOL_DIR@ -AUTOCONF = @AUTOCONF@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -CC = @CC@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DAEMON_GROUPNAME = @DAEMON_GROUPNAME@ -DAEMON_USERNAME = @DAEMON_USERNAME@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -EXEEXT = @EXEEXT@ -GREP = @GREP@ -INSTALL = @INSTALL@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -LDFLAGS = @LDFLAGS@ -LIBAUDIT = @LIBAUDIT@ -LIBOBJS = @LIBOBJS@ -LIBPAM = @LIBPAM@ -LIBS = @LIBS@ -LIBSELINUX = @LIBSELINUX@ -LN_S = @LN_S@ -LTLIBOBJS = @LTLIBOBJS@ -MAKEINFO = @MAKEINFO@ -MKDIR_P = @MKDIR_P@ -OBJEXT = @OBJEXT@ -PACKAGE = @PACKAGE@ -PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -PACKAGE_NAME = @PACKAGE_NAME@ -PACKAGE_STRING = @PACKAGE_STRING@ -PACKAGE_TARNAME = @PACKAGE_TARNAME@ -PACKAGE_URL = @PACKAGE_URL@ -PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH_SEPARATOR = @PATH_SEPARATOR@ -SET_MAKE = @SET_MAKE@ -SHELL = @SHELL@ -SPOOL_DIR = @SPOOL_DIR@ -STRIP = @STRIP@ -SYSCRONTAB = @SYSCRONTAB@ -SYS_CROND_DIR = @SYS_CROND_DIR@ -VERSION = @VERSION@ -abs_builddir = @abs_builddir@ -abs_srcdir = @abs_srcdir@ -abs_top_builddir = @abs_top_builddir@ -abs_top_srcdir = @abs_top_srcdir@ -ac_ct_CC = @ac_ct_CC@ -am__include = @am__include@ -am__leading_dot = @am__leading_dot@ -am__quote = @am__quote@ -am__tar = @am__tar@ -am__untar = @am__untar@ -bindir = @bindir@ -build = @build@ -build_alias = @build_alias@ -build_cpu = @build_cpu@ -build_os = @build_os@ -build_vendor = @build_vendor@ -builddir = @builddir@ -datadir = @datadir@ -datarootdir = @datarootdir@ -docdir = @docdir@ -dvidir = @dvidir@ -editor_defined = @editor_defined@ -exec_prefix = @exec_prefix@ -host = @host@ -host_alias = @host_alias@ -host_cpu = @host_cpu@ -host_os = @host_os@ -host_vendor = @host_vendor@ -htmldir = @htmldir@ -includedir = @includedir@ -infodir = @infodir@ -install_sh = @install_sh@ -libdir = @libdir@ -libexecdir = @libexecdir@ -localedir = @localedir@ -localstatedir = @localstatedir@ -mandir = @mandir@ -mkdir_p = @mkdir_p@ -oldincludedir = @oldincludedir@ -pdfdir = @pdfdir@ -prefix = @prefix@ -program_transform_name = @program_transform_name@ -psdir = @psdir@ -sbindir = @sbindir@ -sharedstatedir = @sharedstatedir@ -srcdir = @srcdir@ -sysconfdir = @sysconfdir@ -target_alias = @target_alias@ -top_build_prefix = @top_build_prefix@ -top_builddir = @top_builddir@ -top_srcdir = @top_srcdir@ -anacron_SOURCES = \ - gregor.c lock.c log.c main.c matchrx.c readtab.c runjob.c \ - $(common_src) - -common_src = global.h gregor.h matchrx.h -common_nodist = anacron-paths.h -nodist_anacron_SOURCES = $(common_nodist) -BUILT_SOURCES = $(common_nodist) -AM_CFLAGS = -I$(top_srcdir) -LDADD = $(LIBSELINUX) $(LIBPAM) $(LIBAUDIT) -all: $(BUILT_SOURCES) - $(MAKE) $(AM_MAKEFLAGS) all-am - -.SUFFIXES: -.SUFFIXES: .c .o .obj -$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ - && { if test -f $@; then exit 0; else break; fi; }; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu anacron/Makefile'; \ - $(am__cd) $(top_srcdir) && \ - $(AUTOMAKE) --gnu anacron/Makefile -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - @case '$?' in \ - *config.status*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ - *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ - esac; - -$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -$(top_srcdir)/configure: $(am__configure_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(ACLOCAL_M4): $(am__aclocal_m4_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(am__aclocal_m4_deps): -install-sbinPROGRAMS: $(sbin_PROGRAMS) - @$(NORMAL_INSTALL) - @list='$(sbin_PROGRAMS)'; test -n "$(sbindir)" || list=; \ - if test -n "$$list"; then \ - echo " $(MKDIR_P) '$(DESTDIR)$(sbindir)'"; \ - $(MKDIR_P) "$(DESTDIR)$(sbindir)" || exit 1; \ - fi; \ - for p in $$list; do echo "$$p $$p"; done | \ - sed 's/$(EXEEXT)$$//' | \ - while read p p1; do if test -f $$p \ - ; then echo "$$p"; echo "$$p"; else :; fi; \ - done | \ - sed -e 'p;s,.*/,,;n;h' \ - -e 's|.*|.|' \ - -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ - sed 'N;N;N;s,\n, ,g' | \ - $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ - { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ - if ($$2 == $$4) files[d] = files[d] " " $$1; \ - else { print "f", $$3 "/" $$4, $$1; } } \ - END { for (d in files) print "f", d, files[d] }' | \ - while read type dir files; do \ - if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ - test -z "$$files" || { \ - echo " $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(sbindir)$$dir'"; \ - $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(sbindir)$$dir" || exit $$?; \ - } \ - ; done - -uninstall-sbinPROGRAMS: - @$(NORMAL_UNINSTALL) - @list='$(sbin_PROGRAMS)'; test -n "$(sbindir)" || list=; \ - files=`for p in $$list; do echo "$$p"; done | \ - sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ - -e 's/$$/$(EXEEXT)/' \ - `; \ - test -n "$$list" || exit 0; \ - echo " ( cd '$(DESTDIR)$(sbindir)' && rm -f" $$files ")"; \ - cd "$(DESTDIR)$(sbindir)" && rm -f $$files - -clean-sbinPROGRAMS: - -test -z "$(sbin_PROGRAMS)" || rm -f $(sbin_PROGRAMS) - -anacron$(EXEEXT): $(anacron_OBJECTS) $(anacron_DEPENDENCIES) $(EXTRA_anacron_DEPENDENCIES) - @rm -f anacron$(EXEEXT) - $(AM_V_CCLD)$(LINK) $(anacron_OBJECTS) $(anacron_LDADD) $(LIBS) - -mostlyclean-compile: - -rm -f *.$(OBJEXT) - -distclean-compile: - -rm -f *.tab.c - -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gregor.Po@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lock.Po@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/log.Po@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/main.Po@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/matchrx.Po@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/readtab.Po@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/runjob.Po@am__quote@ # am--include-marker - -$(am__depfiles_remade): - @$(MKDIR_P) $(@D) - @echo '# dummy' >$@-t && $(am__mv) $@-t $@ - -am--depfiles: $(am__depfiles_remade) - -.c.o: -@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< - -.c.obj: -@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` - -ID: $(am__tagged_files) - $(am__define_uniq_tagged_files); mkid -fID $$unique -tags: tags-am -TAGS: tags - -tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) - set x; \ - here=`pwd`; \ - $(am__define_uniq_tagged_files); \ - shift; \ - if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ - test -n "$$unique" || unique=$$empty_fix; \ - if test $$# -gt 0; then \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - "$$@" $$unique; \ - else \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - $$unique; \ - fi; \ - fi -ctags: ctags-am - -CTAGS: ctags -ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) - $(am__define_uniq_tagged_files); \ - test -z "$(CTAGS_ARGS)$$unique" \ - || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ - $$unique - -GTAGS: - here=`$(am__cd) $(top_builddir) && pwd` \ - && $(am__cd) $(top_srcdir) \ - && gtags -i $(GTAGS_ARGS) "$$here" -cscopelist: cscopelist-am - -cscopelist-am: $(am__tagged_files) - list='$(am__tagged_files)'; \ - case "$(srcdir)" in \ - [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ - *) sdir=$(subdir)/$(srcdir) ;; \ - esac; \ - for i in $$list; do \ - if test -f "$$i"; then \ - echo "$(subdir)/$$i"; \ - else \ - echo "$$sdir/$$i"; \ - fi; \ - done >> $(top_builddir)/cscope.files - -distclean-tags: - -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags - -distdir: $(BUILT_SOURCES) - $(MAKE) $(AM_MAKEFLAGS) distdir-am - -distdir-am: $(DISTFILES) - @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - list='$(DISTFILES)'; \ - dist_files=`for file in $$list; do echo $$file; done | \ - sed -e "s|^$$srcdirstrip/||;t" \ - -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ - case $$dist_files in \ - */*) $(MKDIR_P) `echo "$$dist_files" | \ - sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ - sort -u` ;; \ - esac; \ - for file in $$dist_files; do \ - if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - if test -d $$d/$$file; then \ - dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test -d "$(distdir)/$$file"; then \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ - else \ - test -f "$(distdir)/$$file" \ - || cp -p $$d/$$file "$(distdir)/$$file" \ - || exit 1; \ - fi; \ - done -check-am: all-am -check: $(BUILT_SOURCES) - $(MAKE) $(AM_MAKEFLAGS) check-am -all-am: Makefile $(PROGRAMS) -installdirs: - for dir in "$(DESTDIR)$(sbindir)"; do \ - test -z "$$dir" || $(MKDIR_P) "$$dir"; \ - done -install: $(BUILT_SOURCES) - $(MAKE) $(AM_MAKEFLAGS) install-am -install-exec: install-exec-am -install-data: install-data-am -uninstall: uninstall-am - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am - -installcheck: installcheck-am -install-strip: - if test -z '$(STRIP)'; then \ - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - install; \ - else \ - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ - fi -mostlyclean-generic: - -clean-generic: - -distclean-generic: - -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) - -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) - -maintainer-clean-generic: - @echo "This command is intended for maintainers to use" - @echo "it deletes files that may require special tools to rebuild." - -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) -clean: clean-am - -clean-am: clean-generic clean-sbinPROGRAMS mostlyclean-am - -distclean: distclean-am - -rm -f ./$(DEPDIR)/gregor.Po - -rm -f ./$(DEPDIR)/lock.Po - -rm -f ./$(DEPDIR)/log.Po - -rm -f ./$(DEPDIR)/main.Po - -rm -f ./$(DEPDIR)/matchrx.Po - -rm -f ./$(DEPDIR)/readtab.Po - -rm -f ./$(DEPDIR)/runjob.Po - -rm -f Makefile -distclean-am: clean-am distclean-compile distclean-generic \ - distclean-tags - -dvi: dvi-am - -dvi-am: - -html: html-am - -html-am: - -info: info-am - -info-am: - -install-data-am: - -install-dvi: install-dvi-am - -install-dvi-am: - -install-exec-am: install-sbinPROGRAMS - -install-html: install-html-am - -install-html-am: - -install-info: install-info-am - -install-info-am: - -install-man: - -install-pdf: install-pdf-am - -install-pdf-am: - -install-ps: install-ps-am - -install-ps-am: - -installcheck-am: - -maintainer-clean: maintainer-clean-am - -rm -f ./$(DEPDIR)/gregor.Po - -rm -f ./$(DEPDIR)/lock.Po - -rm -f ./$(DEPDIR)/log.Po - -rm -f ./$(DEPDIR)/main.Po - -rm -f ./$(DEPDIR)/matchrx.Po - -rm -f ./$(DEPDIR)/readtab.Po - -rm -f ./$(DEPDIR)/runjob.Po - -rm -f Makefile -maintainer-clean-am: distclean-am maintainer-clean-generic - -mostlyclean: mostlyclean-am - -mostlyclean-am: mostlyclean-compile mostlyclean-generic - -pdf: pdf-am - -pdf-am: - -ps: ps-am - -ps-am: - -uninstall-am: uninstall-sbinPROGRAMS - -.MAKE: all check install install-am install-strip - -.PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \ - clean-generic clean-sbinPROGRAMS cscopelist-am ctags ctags-am \ - distclean distclean-compile distclean-generic distclean-tags \ - distdir dvi dvi-am html html-am info info-am install \ - install-am install-data install-data-am install-dvi \ - install-dvi-am install-exec install-exec-am install-html \ - install-html-am install-info install-info-am install-man \ - install-pdf install-pdf-am install-ps install-ps-am \ - install-sbinPROGRAMS install-strip installcheck \ - installcheck-am installdirs maintainer-clean \ - maintainer-clean-generic mostlyclean mostlyclean-compile \ - mostlyclean-generic pdf pdf-am ps ps-am tags tags-am uninstall \ - uninstall-am uninstall-sbinPROGRAMS - -.PRECIOUS: Makefile - - -# This header contains all the paths. -# If they are configurable, they are declared in configure script. -# Depends on this Makefile, because it uses make variables. -anacron-paths.h: Makefile - @echo 'creating $@' - @sed >$@ 's/ *\\$$//' <<\END #\ - /* This file has been automatically generated. Do not edit. */ \ - \ - #ifndef _ANACRON_PATHS_H_ \ - #define _ANACRON_PATHS_H_ \ - #define ANACRON_SPOOL_DIR "$(ANACRON_SPOOL_DIR)" \ - #define ANACRONTAB "$(ANACRONTAB)" \ - #endif /* _ANACRON_PATHS_H_ */ \ - END - -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: diff --git a/anacron/Makefile.am b/anacron/Makemodule.am similarity index 54% rename from anacron/Makefile.am rename to anacron/Makemodule.am index d8642d9..394640f 100644 --- a/anacron/Makefile.am +++ b/anacron/Makemodule.am @@ -1,23 +1,28 @@ # Makefile.am - two binaries crond and crontab if ANACRON -sbin_PROGRAMS = anacron -endif +sbin_PROGRAMS += anacron/anacron +anacron_anacron_SOURCES = \ + anacron-paths.h \ + anacron/global.h \ + anacron/gregor.c \ + anacron/gregor.h \ + anacron/lock.c \ + anacron/log.c \ + anacron/main.c \ + anacron/matchrx.c \ + anacron/matchrx.h \ + anacron/readtab.c \ + anacron/runjob.c +common_nodist += anacron-paths.h +nodist_anacron_anacron_SOURCES = $(common_nodist) +BUILT_SOURCES += $(common_nodist) -anacron_SOURCES = \ - gregor.c lock.c log.c main.c matchrx.c readtab.c runjob.c \ - $(common_src) -common_src = global.h gregor.h matchrx.h -common_nodist = anacron-paths.h -nodist_anacron_SOURCES = $(common_nodist) -BUILT_SOURCES = $(common_nodist) - -AM_CFLAGS = -I$(top_srcdir) - -LDADD = $(LIBSELINUX) $(LIBPAM) $(LIBAUDIT) +anacron_anacron_LDADD = $(LIBSELINUX) $(LIBPAM) $(LIBAUDIT) # This header contains all the paths. # If they are configurable, they are declared in configure script. # Depends on this Makefile, because it uses make variables. +CLEANFILES += anacron-paths.h anacron-paths.h: Makefile @echo 'creating $@' @sed >$@ 's/ *\\$$//' <<\END #\ @@ -29,3 +34,4 @@ anacron-paths.h: Makefile #define ANACRONTAB "$(ANACRONTAB)" \ #endif /* _ANACRON_PATHS_H_ */ \ END +endif diff --git a/anacron/log.c b/anacron/log.c index 2c4c8ba..bfff77b 100644 --- a/anacron/log.c +++ b/anacron/log.c @@ -79,7 +79,12 @@ make_msg(const char *fmt, va_list args) /* There's some confusion in the documentation about what vsnprintf * returns when the buffer overflows. Hmmm... */ len = vsnprintf(msg, sizeof(msg), fmt, args); - if (len >= sizeof(msg) - 1) + if (len < 0) { + strncpy(msg, "(vsnprintf failed)", sizeof(msg)); + msg[sizeof(msg) - 1] = '\0'; + return; + } + if ((size_t) len >= sizeof(msg) - 1) strcpy(msg + sizeof(msg) - sizeof(truncated), truncated); } diff --git a/anacron/matchrx.c b/anacron/matchrx.c index e4c0d15..6906fa1 100644 --- a/anacron/matchrx.c +++ b/anacron/matchrx.c @@ -42,11 +42,13 @@ match_rx(const char *rx, char *string, unsigned int n_sub, /* char **substrings * This is not the most efficient, or elegant way of doing this. */ { - int r, n; + int r; + unsigned int n; regex_t crx; va_list va; char **substring; regmatch_t *sub_offsets; + sub_offsets = malloc(sizeof(regmatch_t) * (n_sub + 1)); if (sub_offsets == NULL) return -1; diff --git a/anacron/runjob.c b/anacron/runjob.c index 68681e4..a677463 100644 --- a/anacron/runjob.c +++ b/anacron/runjob.c @@ -53,7 +53,9 @@ temp_file(job_rec *jr) dir = P_tmpdir; len = snprintf(template, sizeof(template), "%s/$anacronXXXXXX", dir); - if (len >= sizeof(template)) + if (len < 0) + die_e("snprintf failed"); + else if ((size_t) len >= sizeof(template)) die_e("TMPDIR too long"); fdout = mkstemp(template); diff --git a/configure b/configure index b352684..c80e556 100755 --- a/configure +++ b/configure @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.69 for cronie 1.5.4. +# Generated by GNU Autoconf 2.69 for cronie 1.5.5. # # Report bugs to . # @@ -580,8 +580,8 @@ MAKEFLAGS= # Identity of this package. PACKAGE_NAME='cronie' PACKAGE_TARNAME='cronie' -PACKAGE_VERSION='1.5.4' -PACKAGE_STRING='cronie 1.5.4' +PACKAGE_VERSION='1.5.5' +PACKAGE_STRING='cronie 1.5.5' PACKAGE_BUGREPORT='mmaslano@redhat.com,tmraz@fedoraproject.org' PACKAGE_URL='' @@ -1307,7 +1307,7 @@ if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures cronie 1.5.4 to adapt to many kinds of systems. +\`configure' configures cronie 1.5.5 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1377,7 +1377,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of cronie 1.5.4:";; + short | recursive ) echo "Configuration of cronie 1.5.5:";; esac cat <<\_ACEOF @@ -1396,7 +1396,7 @@ CRONIE_HELP_STRING(--enable-relro,Build cronie with relro flag) BSD_STRING(--enable-bsd,Build cronie with BSD specific parts) --enable-pam Alias for --with-pam --enable-syscrontab Build cronie with system crontab enabled. - --enable-anacron Build also anacron. + --disable-anacron Do not build anacron. Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] @@ -1497,7 +1497,7 @@ fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -cronie configure 1.5.4 +cronie configure 1.5.5 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. @@ -1977,7 +1977,7 @@ cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by cronie $as_me 1.5.4, which was +It was created by cronie $as_me 1.5.5, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ @@ -2844,7 +2844,7 @@ fi # Define the identity of the package. PACKAGE='cronie' - VERSION='1.5.4' + VERSION='1.5.5' cat >>confdefs.h <<_ACEOF @@ -5400,6 +5400,8 @@ fi # Check whether --enable-anacron was given. if test "${enable_anacron+set}" = set; then : enableval=$enable_anacron; +else + enable_anacron=yes fi if test "$enable_anacron" = yes; then @@ -5423,7 +5425,7 @@ if test "$ANACRONTAB" = ""; then fi -ac_config_files="$ac_config_files Makefile src/Makefile man/Makefile anacron/Makefile" +ac_config_files="$ac_config_files Makefile" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure @@ -5963,7 +5965,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by cronie $as_me 1.5.4, which was +This file was extended by cronie $as_me 1.5.5, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -6029,7 +6031,7 @@ _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ -cronie config.status 1.5.4 +cronie config.status 1.5.5 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" @@ -6161,9 +6163,6 @@ do "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; - "src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;; - "man/Makefile") CONFIG_FILES="$CONFIG_FILES man/Makefile" ;; - "anacron/Makefile") CONFIG_FILES="$CONFIG_FILES anacron/Makefile" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac diff --git a/configure.ac b/configure.ac index 7200b24..bffe9ad 100644 --- a/configure.ac +++ b/configure.ac @@ -1,8 +1,8 @@ -AC_INIT([cronie],[1.5.4],[mmaslano@redhat.com,tmraz@fedoraproject.org]) +AC_INIT([cronie],[1.5.5],[mmaslano@redhat.com,tmraz@fedoraproject.org]) AC_CONFIG_HEADER([config.h]) AC_PREREQ(2.60) -AM_INIT_AUTOMAKE +AM_INIT_AUTOMAKE([subdir-objects]) m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])], [AC_SUBST([AM_DEFAULT_VERBOSITY], [1])]) @@ -253,13 +253,13 @@ CRONIE_CONF_VAR([SYSCRONTAB], [the current working directory of the running daem CRONIE_CONF_VAR([SYS_CROND_DIR], [the current working directory of the running daemon], [${sysconfdir}/cron.d]) CRONIE_CONF_VAR([SPOOL_DIR], [the directory where all the user cron tabs reside], [${localstatedir}/spool/cron]) -AC_ARG_ENABLE([anacron], [AS_HELP_STRING([--enable-anacron], [Build also anacron.])]) +AC_ARG_ENABLE([anacron], [AS_HELP_STRING([--disable-anacron], [Do not build anacron.])], [], [enable_anacron=yes]) AM_CONDITIONAL([ANACRON], [test "$enable_anacron" = yes]) if test "$enable_anacron" != no; then ANACRON_CONF_VAR([ANACRON_SPOOL_DIR],[The path for anacron locks.],[${localstatedir}/spool/anacron]) ANACRON_CONF_VAR([ANACRONTAB],[The anacron table for regular jobs.],[${sysconfdir}/anacrontab]) fi -AC_CONFIG_FILES([Makefile src/Makefile man/Makefile anacron/Makefile]) +AC_CONFIG_FILES([Makefile]) AC_OUTPUT diff --git a/contrib/0anacron b/contrib/0anacron index 027e8b7..8fc9be1 100644 --- a/contrib/0anacron +++ b/contrib/0anacron @@ -9,7 +9,7 @@ fi # Do not run jobs when on battery power online=1 -for psupply in AC ADP0 ; do +for psupply in AC ADP{0..9} ; do sysfile="/sys/class/power_supply/$psupply/online" if [ -f $sysfile ] ; then diff --git a/man/Makefile.am b/man/Makefile.am deleted file mode 100644 index 965b8fd..0000000 --- a/man/Makefile.am +++ /dev/null @@ -1,6 +0,0 @@ -dist_man_MANS = crontab.1 crontab.5 cron.8 crond.8 cronnext.1 -EXTRA_DIST = anacrontab.5 anacron.8 - -if ANACRON -dist_man_MANS += $(EXTRA_DIST) -endif diff --git a/man/Makefile.in b/man/Makefile.in deleted file mode 100644 index 13d7a13..0000000 --- a/man/Makefile.in +++ /dev/null @@ -1,593 +0,0 @@ -# Makefile.in generated by automake 1.16.1 from Makefile.am. -# @configure_input@ - -# Copyright (C) 1994-2018 Free Software Foundation, Inc. - -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - -@SET_MAKE@ -VPATH = @srcdir@ -am__is_gnu_make = { \ - if test -z '$(MAKELEVEL)'; then \ - false; \ - elif test -n '$(MAKE_HOST)'; then \ - true; \ - elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ - true; \ - else \ - false; \ - fi; \ -} -am__make_running_with_option = \ - case $${target_option-} in \ - ?) ;; \ - *) echo "am__make_running_with_option: internal error: invalid" \ - "target option '$${target_option-}' specified" >&2; \ - exit 1;; \ - esac; \ - has_opt=no; \ - sane_makeflags=$$MAKEFLAGS; \ - if $(am__is_gnu_make); then \ - sane_makeflags=$$MFLAGS; \ - else \ - case $$MAKEFLAGS in \ - *\\[\ \ ]*) \ - bs=\\; \ - sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ - | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ - esac; \ - fi; \ - skip_next=no; \ - strip_trailopt () \ - { \ - flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ - }; \ - for flg in $$sane_makeflags; do \ - test $$skip_next = yes && { skip_next=no; continue; }; \ - case $$flg in \ - *=*|--*) continue;; \ - -*I) strip_trailopt 'I'; skip_next=yes;; \ - -*I?*) strip_trailopt 'I';; \ - -*O) strip_trailopt 'O'; skip_next=yes;; \ - -*O?*) strip_trailopt 'O';; \ - -*l) strip_trailopt 'l'; skip_next=yes;; \ - -*l?*) strip_trailopt 'l';; \ - -[dEDm]) skip_next=yes;; \ - -[JT]) skip_next=yes;; \ - esac; \ - case $$flg in \ - *$$target_option*) has_opt=yes; break;; \ - esac; \ - done; \ - test $$has_opt = yes -am__make_dryrun = (target_option=n; $(am__make_running_with_option)) -am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) -pkgdatadir = $(datadir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkglibexecdir = $(libexecdir)/@PACKAGE@ -am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -install_sh_DATA = $(install_sh) -c -m 644 -install_sh_PROGRAM = $(install_sh) -c -install_sh_SCRIPT = $(install_sh) -c -INSTALL_HEADER = $(INSTALL_DATA) -transform = $(program_transform_name) -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -build_triplet = @build@ -host_triplet = @host@ -@ANACRON_TRUE@am__append_1 = $(EXTRA_DIST) -subdir = man -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/configure.ac -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) -mkinstalldirs = $(install_sh) -d -CONFIG_HEADER = $(top_builddir)/config.h -CONFIG_CLEAN_FILES = -CONFIG_CLEAN_VPATH_FILES = -AM_V_P = $(am__v_P_@AM_V@) -am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) -am__v_P_0 = false -am__v_P_1 = : -AM_V_GEN = $(am__v_GEN_@AM_V@) -am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) -am__v_GEN_0 = @echo " GEN " $@; -am__v_GEN_1 = -AM_V_at = $(am__v_at_@AM_V@) -am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) -am__v_at_0 = @ -am__v_at_1 = -SOURCES = -DIST_SOURCES = -am__can_run_installinfo = \ - case $$AM_UPDATE_INFO_DIR in \ - n|no|NO) false;; \ - *) (install-info --version) >/dev/null 2>&1;; \ - esac -am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; -am__vpath_adj = case $$p in \ - $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ - *) f=$$p;; \ - esac; -am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; -am__install_max = 40 -am__nobase_strip_setup = \ - srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` -am__nobase_strip = \ - for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" -am__nobase_list = $(am__nobase_strip_setup); \ - for p in $$list; do echo "$$p $$p"; done | \ - sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ - $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ - if (++n[$$2] == $(am__install_max)) \ - { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ - END { for (dir in files) print dir, files[dir] }' -am__base_list = \ - sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ - sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' -am__uninstall_files_from_dir = { \ - test -z "$$files" \ - || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ - || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ - $(am__cd) "$$dir" && rm -f $$files; }; \ - } -man1dir = $(mandir)/man1 -am__installdirs = "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(man5dir)" \ - "$(DESTDIR)$(man8dir)" -man5dir = $(mandir)/man5 -man8dir = $(mandir)/man8 -NROFF = nroff -MANS = $(dist_man_MANS) -am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) -am__DIST_COMMON = $(dist_man_MANS) $(srcdir)/Makefile.in -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -ACLOCAL = @ACLOCAL@ -AMTAR = @AMTAR@ -AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ -ANACRONTAB = @ANACRONTAB@ -ANACRON_SPOOL_DIR = @ANACRON_SPOOL_DIR@ -AUTOCONF = @AUTOCONF@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -CC = @CC@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DAEMON_GROUPNAME = @DAEMON_GROUPNAME@ -DAEMON_USERNAME = @DAEMON_USERNAME@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -EXEEXT = @EXEEXT@ -GREP = @GREP@ -INSTALL = @INSTALL@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -LDFLAGS = @LDFLAGS@ -LIBAUDIT = @LIBAUDIT@ -LIBOBJS = @LIBOBJS@ -LIBPAM = @LIBPAM@ -LIBS = @LIBS@ -LIBSELINUX = @LIBSELINUX@ -LN_S = @LN_S@ -LTLIBOBJS = @LTLIBOBJS@ -MAKEINFO = @MAKEINFO@ -MKDIR_P = @MKDIR_P@ -OBJEXT = @OBJEXT@ -PACKAGE = @PACKAGE@ -PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -PACKAGE_NAME = @PACKAGE_NAME@ -PACKAGE_STRING = @PACKAGE_STRING@ -PACKAGE_TARNAME = @PACKAGE_TARNAME@ -PACKAGE_URL = @PACKAGE_URL@ -PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH_SEPARATOR = @PATH_SEPARATOR@ -SET_MAKE = @SET_MAKE@ -SHELL = @SHELL@ -SPOOL_DIR = @SPOOL_DIR@ -STRIP = @STRIP@ -SYSCRONTAB = @SYSCRONTAB@ -SYS_CROND_DIR = @SYS_CROND_DIR@ -VERSION = @VERSION@ -abs_builddir = @abs_builddir@ -abs_srcdir = @abs_srcdir@ -abs_top_builddir = @abs_top_builddir@ -abs_top_srcdir = @abs_top_srcdir@ -ac_ct_CC = @ac_ct_CC@ -am__include = @am__include@ -am__leading_dot = @am__leading_dot@ -am__quote = @am__quote@ -am__tar = @am__tar@ -am__untar = @am__untar@ -bindir = @bindir@ -build = @build@ -build_alias = @build_alias@ -build_cpu = @build_cpu@ -build_os = @build_os@ -build_vendor = @build_vendor@ -builddir = @builddir@ -datadir = @datadir@ -datarootdir = @datarootdir@ -docdir = @docdir@ -dvidir = @dvidir@ -editor_defined = @editor_defined@ -exec_prefix = @exec_prefix@ -host = @host@ -host_alias = @host_alias@ -host_cpu = @host_cpu@ -host_os = @host_os@ -host_vendor = @host_vendor@ -htmldir = @htmldir@ -includedir = @includedir@ -infodir = @infodir@ -install_sh = @install_sh@ -libdir = @libdir@ -libexecdir = @libexecdir@ -localedir = @localedir@ -localstatedir = @localstatedir@ -mandir = @mandir@ -mkdir_p = @mkdir_p@ -oldincludedir = @oldincludedir@ -pdfdir = @pdfdir@ -prefix = @prefix@ -program_transform_name = @program_transform_name@ -psdir = @psdir@ -sbindir = @sbindir@ -sharedstatedir = @sharedstatedir@ -srcdir = @srcdir@ -sysconfdir = @sysconfdir@ -target_alias = @target_alias@ -top_build_prefix = @top_build_prefix@ -top_builddir = @top_builddir@ -top_srcdir = @top_srcdir@ -dist_man_MANS = crontab.1 crontab.5 cron.8 crond.8 cronnext.1 \ - $(am__append_1) -EXTRA_DIST = anacrontab.5 anacron.8 -all: all-am - -.SUFFIXES: -$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ - && { if test -f $@; then exit 0; else break; fi; }; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu man/Makefile'; \ - $(am__cd) $(top_srcdir) && \ - $(AUTOMAKE) --gnu man/Makefile -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - @case '$?' in \ - *config.status*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ - *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ - esac; - -$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -$(top_srcdir)/configure: $(am__configure_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(ACLOCAL_M4): $(am__aclocal_m4_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(am__aclocal_m4_deps): -install-man1: $(dist_man_MANS) - @$(NORMAL_INSTALL) - @list1=''; \ - list2='$(dist_man_MANS)'; \ - test -n "$(man1dir)" \ - && test -n "`echo $$list1$$list2`" \ - || exit 0; \ - echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \ - $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \ - { for i in $$list1; do echo "$$i"; done; \ - if test -n "$$list2"; then \ - for i in $$list2; do echo "$$i"; done \ - | sed -n '/\.1[a-z]*$$/p'; \ - fi; \ - } | while read p; do \ - if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ - echo "$$d$$p"; echo "$$p"; \ - done | \ - sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ - -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ - sed 'N;N;s,\n, ,g' | { \ - list=; while read file base inst; do \ - if test "$$base" = "$$inst"; then list="$$list $$file"; else \ - echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ - $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \ - fi; \ - done; \ - for i in $$list; do echo "$$i"; done | $(am__base_list) | \ - while read files; do \ - test -z "$$files" || { \ - echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \ - $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \ - done; } - -uninstall-man1: - @$(NORMAL_UNINSTALL) - @list=''; test -n "$(man1dir)" || exit 0; \ - files=`{ for i in $$list; do echo "$$i"; done; \ - l2='$(dist_man_MANS)'; for i in $$l2; do echo "$$i"; done | \ - sed -n '/\.1[a-z]*$$/p'; \ - } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ - -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ - dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir) -install-man5: $(dist_man_MANS) - @$(NORMAL_INSTALL) - @list1=''; \ - list2='$(dist_man_MANS)'; \ - test -n "$(man5dir)" \ - && test -n "`echo $$list1$$list2`" \ - || exit 0; \ - echo " $(MKDIR_P) '$(DESTDIR)$(man5dir)'"; \ - $(MKDIR_P) "$(DESTDIR)$(man5dir)" || exit 1; \ - { for i in $$list1; do echo "$$i"; done; \ - if test -n "$$list2"; then \ - for i in $$list2; do echo "$$i"; done \ - | sed -n '/\.5[a-z]*$$/p'; \ - fi; \ - } | while read p; do \ - if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ - echo "$$d$$p"; echo "$$p"; \ - done | \ - sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^5][0-9a-z]*$$,5,;x' \ - -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ - sed 'N;N;s,\n, ,g' | { \ - list=; while read file base inst; do \ - if test "$$base" = "$$inst"; then list="$$list $$file"; else \ - echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man5dir)/$$inst'"; \ - $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man5dir)/$$inst" || exit $$?; \ - fi; \ - done; \ - for i in $$list; do echo "$$i"; done | $(am__base_list) | \ - while read files; do \ - test -z "$$files" || { \ - echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man5dir)'"; \ - $(INSTALL_DATA) $$files "$(DESTDIR)$(man5dir)" || exit $$?; }; \ - done; } - -uninstall-man5: - @$(NORMAL_UNINSTALL) - @list=''; test -n "$(man5dir)" || exit 0; \ - files=`{ for i in $$list; do echo "$$i"; done; \ - l2='$(dist_man_MANS)'; for i in $$l2; do echo "$$i"; done | \ - sed -n '/\.5[a-z]*$$/p'; \ - } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^5][0-9a-z]*$$,5,;x' \ - -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ - dir='$(DESTDIR)$(man5dir)'; $(am__uninstall_files_from_dir) -install-man8: $(dist_man_MANS) - @$(NORMAL_INSTALL) - @list1=''; \ - list2='$(dist_man_MANS)'; \ - test -n "$(man8dir)" \ - && test -n "`echo $$list1$$list2`" \ - || exit 0; \ - echo " $(MKDIR_P) '$(DESTDIR)$(man8dir)'"; \ - $(MKDIR_P) "$(DESTDIR)$(man8dir)" || exit 1; \ - { for i in $$list1; do echo "$$i"; done; \ - if test -n "$$list2"; then \ - for i in $$list2; do echo "$$i"; done \ - | sed -n '/\.8[a-z]*$$/p'; \ - fi; \ - } | while read p; do \ - if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ - echo "$$d$$p"; echo "$$p"; \ - done | \ - sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^8][0-9a-z]*$$,8,;x' \ - -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ - sed 'N;N;s,\n, ,g' | { \ - list=; while read file base inst; do \ - if test "$$base" = "$$inst"; then list="$$list $$file"; else \ - echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man8dir)/$$inst'"; \ - $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man8dir)/$$inst" || exit $$?; \ - fi; \ - done; \ - for i in $$list; do echo "$$i"; done | $(am__base_list) | \ - while read files; do \ - test -z "$$files" || { \ - echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man8dir)'"; \ - $(INSTALL_DATA) $$files "$(DESTDIR)$(man8dir)" || exit $$?; }; \ - done; } - -uninstall-man8: - @$(NORMAL_UNINSTALL) - @list=''; test -n "$(man8dir)" || exit 0; \ - files=`{ for i in $$list; do echo "$$i"; done; \ - l2='$(dist_man_MANS)'; for i in $$l2; do echo "$$i"; done | \ - sed -n '/\.8[a-z]*$$/p'; \ - } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^8][0-9a-z]*$$,8,;x' \ - -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ - dir='$(DESTDIR)$(man8dir)'; $(am__uninstall_files_from_dir) -tags TAGS: - -ctags CTAGS: - -cscope cscopelist: - - -distdir: $(BUILT_SOURCES) - $(MAKE) $(AM_MAKEFLAGS) distdir-am - -distdir-am: $(DISTFILES) - @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - list='$(DISTFILES)'; \ - dist_files=`for file in $$list; do echo $$file; done | \ - sed -e "s|^$$srcdirstrip/||;t" \ - -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ - case $$dist_files in \ - */*) $(MKDIR_P) `echo "$$dist_files" | \ - sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ - sort -u` ;; \ - esac; \ - for file in $$dist_files; do \ - if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - if test -d $$d/$$file; then \ - dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test -d "$(distdir)/$$file"; then \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ - else \ - test -f "$(distdir)/$$file" \ - || cp -p $$d/$$file "$(distdir)/$$file" \ - || exit 1; \ - fi; \ - done -check-am: all-am -check: check-am -all-am: Makefile $(MANS) -installdirs: - for dir in "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(man5dir)" "$(DESTDIR)$(man8dir)"; do \ - test -z "$$dir" || $(MKDIR_P) "$$dir"; \ - done -install: install-am -install-exec: install-exec-am -install-data: install-data-am -uninstall: uninstall-am - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am - -installcheck: installcheck-am -install-strip: - if test -z '$(STRIP)'; then \ - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - install; \ - else \ - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ - fi -mostlyclean-generic: - -clean-generic: - -distclean-generic: - -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) - -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) - -maintainer-clean-generic: - @echo "This command is intended for maintainers to use" - @echo "it deletes files that may require special tools to rebuild." -clean: clean-am - -clean-am: clean-generic mostlyclean-am - -distclean: distclean-am - -rm -f Makefile -distclean-am: clean-am distclean-generic - -dvi: dvi-am - -dvi-am: - -html: html-am - -html-am: - -info: info-am - -info-am: - -install-data-am: install-man - -install-dvi: install-dvi-am - -install-dvi-am: - -install-exec-am: - -install-html: install-html-am - -install-html-am: - -install-info: install-info-am - -install-info-am: - -install-man: install-man1 install-man5 install-man8 - -install-pdf: install-pdf-am - -install-pdf-am: - -install-ps: install-ps-am - -install-ps-am: - -installcheck-am: - -maintainer-clean: maintainer-clean-am - -rm -f Makefile -maintainer-clean-am: distclean-am maintainer-clean-generic - -mostlyclean: mostlyclean-am - -mostlyclean-am: mostlyclean-generic - -pdf: pdf-am - -pdf-am: - -ps: ps-am - -ps-am: - -uninstall-am: uninstall-man - -uninstall-man: uninstall-man1 uninstall-man5 uninstall-man8 - -.MAKE: install-am install-strip - -.PHONY: all all-am check check-am clean clean-generic cscopelist-am \ - ctags-am distclean distclean-generic distdir dvi dvi-am html \ - html-am info info-am install install-am install-data \ - install-data-am install-dvi install-dvi-am install-exec \ - install-exec-am install-html install-html-am install-info \ - install-info-am install-man install-man1 install-man5 \ - install-man8 install-pdf install-pdf-am install-ps \ - install-ps-am install-strip installcheck installcheck-am \ - installdirs maintainer-clean maintainer-clean-generic \ - mostlyclean mostlyclean-generic pdf pdf-am ps ps-am tags-am \ - uninstall uninstall-am uninstall-man uninstall-man1 \ - uninstall-man5 uninstall-man8 - -.PRECIOUS: Makefile - - -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: diff --git a/man/Makemodule.am b/man/Makemodule.am new file mode 100644 index 0000000..e6479f6 --- /dev/null +++ b/man/Makemodule.am @@ -0,0 +1,16 @@ +dist_man_MANS = \ + man/cron.8 \ + man/crond.8 \ + man/cronnext.1 \ + man/crontab.1 \ + man/crontab.5 + +anacron_man = \ + man/anacrontab.5 \ + man/anacron.8 + +EXTRA_DIST += $(anacron_man) + +if ANACRON +dist_man_MANS += $(anacron_man) +endif diff --git a/man/cronnext.1 b/man/cronnext.1 index 89e4abe..deacf7c 100644 --- a/man/cronnext.1 +++ b/man/cronnext.1 @@ -6,7 +6,7 @@ cronnext \- time of next job cron will execute .B cronnext [\fB-i \fIusers\fR] [\fB-e \fIusers\fR] [\fB-s\fR] [\fB-a\fR] -[\fB-t \fItime\fR] [\fB-q \fItime\fR] +[\fB-t \fItime\fR] [\fB-q \fItime\fR] [\fB-j \fIcommand\fR] [\fB-l\fR] [\fB-c\fR] [\fB-f\fR] [\fB-h\fR] [\fB-V\fR] [file]... .SH DESCRIPTION @@ -52,6 +52,9 @@ and is internally rounded to the minute. Do not check jobs over this time, expressed in the same way as in option .BR -t . .TP +.BI "\-j " command +Only look for jobs that contain \fIcommand\fP as a substring. +.TP .B \-l Print the whole entries of the jobs that are the next to be executed by cron. The default is to only print their next time of execution. diff --git a/man/crontab.1 b/man/crontab.1 index e557a03..47b0b8f 100644 --- a/man/crontab.1 +++ b/man/crontab.1 @@ -22,7 +22,7 @@ .\" .\" $Id: crontab.1,v 1.7 2004/01/23 19:03:32 vixie Exp $ .\" -.TH CRONTAB 1 "2012-11-22" "cronie" "User Commands" +.TH CRONTAB 1 "2019-10-29" "cronie" "User Commands" .SH NAME crontab \- maintains crontab files for individual users .SH SYNOPSIS @@ -67,18 +67,21 @@ it is possible to use a network-mounted shared across a cluster of hosts and specify that only one of the hosts should run the crontab jobs in the particular directory at any one time. You may also use -.BR crontab (1) +.BR crontab from any of these hosts to edit the same shared set of crontab files, and to set and query which host should run the crontab jobs. .PP -Running cron jobs can be allowed or disallowed for different users. For -this purpose, use the +Scheduling cron jobs with +.BR crontab +can be allowed or disallowed for different users. For this purpose, use the .I cron.allow and .I cron.deny files. If the .I cron.allow -file exists, a user must be listed in it to be allowed to use cron If the +file exists, a user must be listed in it to be allowed to use +.BR crontab . +If the .I cron.allow file does not exist but the .I cron.deny @@ -86,12 +89,17 @@ file does exist, then a user must .I not be listed in the .I cron.deny -file in order to use cron. If neither of these files exists, only the -super user is allowed to use cron. Another way to restrict access to -cron is to use PAM authentication in +file in order to use +.BR crontab. +If neither of these files exist, then only the super user is allowed to use +.BR crontab . +.PP +Another way to restrict the scheduling of cron jobs beyond +.BR crontab +is to use PAM authentication in .I /etc/security/access.conf to set up users, which are allowed or disallowed to use -.I crontab +.BR crontab or modify system cron jobs in the .IR /etc/cron.d/ directory. @@ -106,12 +114,12 @@ directory is used. .B "\-u" Specifies the name of the user whose crontab is to be modified. If this option is not used, -.I crontab +.BR crontab examines "your" crontab, i.e., the crontab of the person executing the command. If no crontab exists for a particular user, it is created for -him the first time the +them the first time the .B crontab -u -command is used under his username. +command is used under their username. .TP .B "\-l" Displays the current crontab on standard output. @@ -178,6 +186,27 @@ option. .TP .B "\-V" Print version and exit. +.SH CAVEATS +The files +.I cron.allow +and +.I cron.deny +cannot be used to restrict the execution of cron jobs; they only restrict the +use of +.BR crontab . +In particular, restricting access to +.BR crontab +has no effect on an existing +.I crontab +of a user. Its jobs will continue to be executed until the crontab is removed. +.PP +The files +.I cron.allow +and +.I cron.deny +must be readable by the user invoking +.BR crontab . +If this is not the case, then they are treated as non-existent. .SH "SEE ALSO" .BR crontab (5), .BR cron (8) diff --git a/man/crontab.5 b/man/crontab.5 index a011c89..fe716fc 100644 --- a/man/crontab.5 +++ b/man/crontab.5 @@ -326,6 +326,11 @@ option on the crond command line. If inotify support is in use, changes in the symlinked crontabs are not automatically noticed by the cron daemon. The cron daemon must receive a SIGHUP signal to reload the crontabs. This is a limitation of the inotify API. +.PP +cron requires that each entry in a crontab end in a newline character. If the +last entry in a crontab is missing a newline (i.e.\& terminated by EOF), +cron will consider the crontab (at least partially) broken. +A warning will be written to syslog. .SH AUTHOR .MT vixie@isc.org Paul Vixie diff --git a/src/Makefile.in b/src/Makefile.in deleted file mode 100644 index 18b58b6..0000000 --- a/src/Makefile.in +++ /dev/null @@ -1,788 +0,0 @@ -# Makefile.in generated by automake 1.16.1 from Makefile.am. -# @configure_input@ - -# Copyright (C) 1994-2018 Free Software Foundation, Inc. - -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - -@SET_MAKE@ - -# Makefile.am - two binaries crond and crontab - -VPATH = @srcdir@ -am__is_gnu_make = { \ - if test -z '$(MAKELEVEL)'; then \ - false; \ - elif test -n '$(MAKE_HOST)'; then \ - true; \ - elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ - true; \ - else \ - false; \ - fi; \ -} -am__make_running_with_option = \ - case $${target_option-} in \ - ?) ;; \ - *) echo "am__make_running_with_option: internal error: invalid" \ - "target option '$${target_option-}' specified" >&2; \ - exit 1;; \ - esac; \ - has_opt=no; \ - sane_makeflags=$$MAKEFLAGS; \ - if $(am__is_gnu_make); then \ - sane_makeflags=$$MFLAGS; \ - else \ - case $$MAKEFLAGS in \ - *\\[\ \ ]*) \ - bs=\\; \ - sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ - | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ - esac; \ - fi; \ - skip_next=no; \ - strip_trailopt () \ - { \ - flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ - }; \ - for flg in $$sane_makeflags; do \ - test $$skip_next = yes && { skip_next=no; continue; }; \ - case $$flg in \ - *=*|--*) continue;; \ - -*I) strip_trailopt 'I'; skip_next=yes;; \ - -*I?*) strip_trailopt 'I';; \ - -*O) strip_trailopt 'O'; skip_next=yes;; \ - -*O?*) strip_trailopt 'O';; \ - -*l) strip_trailopt 'l'; skip_next=yes;; \ - -*l?*) strip_trailopt 'l';; \ - -[dEDm]) skip_next=yes;; \ - -[JT]) skip_next=yes;; \ - esac; \ - case $$flg in \ - *$$target_option*) has_opt=yes; break;; \ - esac; \ - done; \ - test $$has_opt = yes -am__make_dryrun = (target_option=n; $(am__make_running_with_option)) -am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) -pkgdatadir = $(datadir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkglibexecdir = $(libexecdir)/@PACKAGE@ -am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -install_sh_DATA = $(install_sh) -c -m 644 -install_sh_PROGRAM = $(install_sh) -c -install_sh_SCRIPT = $(install_sh) -c -INSTALL_HEADER = $(INSTALL_DATA) -transform = $(program_transform_name) -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -build_triplet = @build@ -host_triplet = @host@ -sbin_PROGRAMS = crond$(EXEEXT) -bin_PROGRAMS = crontab$(EXEEXT) cronnext$(EXEEXT) -subdir = src -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/configure.ac -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) -mkinstalldirs = $(install_sh) -d -CONFIG_HEADER = $(top_builddir)/config.h -CONFIG_CLEAN_FILES = -CONFIG_CLEAN_VPATH_FILES = -am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(sbindir)" -PROGRAMS = $(bin_PROGRAMS) $(sbin_PROGRAMS) -am__objects_1 = entry.$(OBJEXT) env.$(OBJEXT) misc.$(OBJEXT) \ - pw_dup.$(OBJEXT) -am_crond_OBJECTS = cron.$(OBJEXT) database.$(OBJEXT) user.$(OBJEXT) \ - job.$(OBJEXT) do_command.$(OBJEXT) popen.$(OBJEXT) \ - security.$(OBJEXT) $(am__objects_1) -am__objects_2 = -nodist_crond_OBJECTS = $(am__objects_2) -crond_OBJECTS = $(am_crond_OBJECTS) $(nodist_crond_OBJECTS) -crond_LDADD = $(LDADD) -am__DEPENDENCIES_1 = -crond_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ - $(am__DEPENDENCIES_1) -am_cronnext_OBJECTS = cronnext.$(OBJEXT) database.$(OBJEXT) \ - user.$(OBJEXT) job.$(OBJEXT) $(am__objects_1) -nodist_cronnext_OBJECTS = $(am__objects_2) -cronnext_OBJECTS = $(am_cronnext_OBJECTS) $(nodist_cronnext_OBJECTS) -cronnext_LDADD = $(LDADD) -cronnext_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ - $(am__DEPENDENCIES_1) -am_crontab_OBJECTS = crontab.$(OBJEXT) security.$(OBJEXT) \ - $(am__objects_1) -nodist_crontab_OBJECTS = $(am__objects_2) -crontab_OBJECTS = $(am_crontab_OBJECTS) $(nodist_crontab_OBJECTS) -crontab_LDADD = $(LDADD) -crontab_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ - $(am__DEPENDENCIES_1) -AM_V_P = $(am__v_P_@AM_V@) -am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) -am__v_P_0 = false -am__v_P_1 = : -AM_V_GEN = $(am__v_GEN_@AM_V@) -am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) -am__v_GEN_0 = @echo " GEN " $@; -am__v_GEN_1 = -AM_V_at = $(am__v_at_@AM_V@) -am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) -am__v_at_0 = @ -am__v_at_1 = -DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) -depcomp = $(SHELL) $(top_srcdir)/depcomp -am__maybe_remake_depfiles = depfiles -am__depfiles_remade = ./$(DEPDIR)/cron.Po ./$(DEPDIR)/cronnext.Po \ - ./$(DEPDIR)/crontab.Po ./$(DEPDIR)/database.Po \ - ./$(DEPDIR)/do_command.Po ./$(DEPDIR)/entry.Po \ - ./$(DEPDIR)/env.Po ./$(DEPDIR)/job.Po ./$(DEPDIR)/misc.Po \ - ./$(DEPDIR)/popen.Po ./$(DEPDIR)/pw_dup.Po \ - ./$(DEPDIR)/security.Po ./$(DEPDIR)/user.Po -am__mv = mv -f -COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ - $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -AM_V_CC = $(am__v_CC_@AM_V@) -am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) -am__v_CC_0 = @echo " CC " $@; -am__v_CC_1 = -CCLD = $(CC) -LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ -AM_V_CCLD = $(am__v_CCLD_@AM_V@) -am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) -am__v_CCLD_0 = @echo " CCLD " $@; -am__v_CCLD_1 = -SOURCES = $(crond_SOURCES) $(nodist_crond_SOURCES) $(cronnext_SOURCES) \ - $(nodist_cronnext_SOURCES) $(crontab_SOURCES) \ - $(nodist_crontab_SOURCES) -DIST_SOURCES = $(crond_SOURCES) $(cronnext_SOURCES) $(crontab_SOURCES) -am__can_run_installinfo = \ - case $$AM_UPDATE_INFO_DIR in \ - n|no|NO) false;; \ - *) (install-info --version) >/dev/null 2>&1;; \ - esac -am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) -# Read a list of newline-separated strings from the standard input, -# and print each of them once, without duplicates. Input order is -# *not* preserved. -am__uniquify_input = $(AWK) '\ - BEGIN { nonempty = 0; } \ - { items[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in items) print i; }; } \ -' -# Make sure the list of sources is unique. This is necessary because, -# e.g., the same source file might be shared among _SOURCES variables -# for different programs/libraries. -am__define_uniq_tagged_files = \ - list='$(am__tagged_files)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | $(am__uniquify_input)` -ETAGS = etags -CTAGS = ctags -am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -ACLOCAL = @ACLOCAL@ -AMTAR = @AMTAR@ -AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ -ANACRONTAB = @ANACRONTAB@ -ANACRON_SPOOL_DIR = @ANACRON_SPOOL_DIR@ -AUTOCONF = @AUTOCONF@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -CC = @CC@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DAEMON_GROUPNAME = @DAEMON_GROUPNAME@ -DAEMON_USERNAME = @DAEMON_USERNAME@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -EXEEXT = @EXEEXT@ -GREP = @GREP@ -INSTALL = @INSTALL@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -LDFLAGS = @LDFLAGS@ -LIBAUDIT = @LIBAUDIT@ -LIBOBJS = @LIBOBJS@ -LIBPAM = @LIBPAM@ -LIBS = @LIBS@ -LIBSELINUX = @LIBSELINUX@ -LN_S = @LN_S@ -LTLIBOBJS = @LTLIBOBJS@ -MAKEINFO = @MAKEINFO@ -MKDIR_P = @MKDIR_P@ -OBJEXT = @OBJEXT@ -PACKAGE = @PACKAGE@ -PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -PACKAGE_NAME = @PACKAGE_NAME@ -PACKAGE_STRING = @PACKAGE_STRING@ -PACKAGE_TARNAME = @PACKAGE_TARNAME@ -PACKAGE_URL = @PACKAGE_URL@ -PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH_SEPARATOR = @PATH_SEPARATOR@ -SET_MAKE = @SET_MAKE@ -SHELL = @SHELL@ -SPOOL_DIR = @SPOOL_DIR@ -STRIP = @STRIP@ -SYSCRONTAB = @SYSCRONTAB@ -SYS_CROND_DIR = @SYS_CROND_DIR@ -VERSION = @VERSION@ -abs_builddir = @abs_builddir@ -abs_srcdir = @abs_srcdir@ -abs_top_builddir = @abs_top_builddir@ -abs_top_srcdir = @abs_top_srcdir@ -ac_ct_CC = @ac_ct_CC@ -am__include = @am__include@ -am__leading_dot = @am__leading_dot@ -am__quote = @am__quote@ -am__tar = @am__tar@ -am__untar = @am__untar@ -bindir = @bindir@ -build = @build@ -build_alias = @build_alias@ -build_cpu = @build_cpu@ -build_os = @build_os@ -build_vendor = @build_vendor@ -builddir = @builddir@ -datadir = @datadir@ -datarootdir = @datarootdir@ -docdir = @docdir@ -dvidir = @dvidir@ -editor_defined = @editor_defined@ -exec_prefix = @exec_prefix@ -host = @host@ -host_alias = @host_alias@ -host_cpu = @host_cpu@ -host_os = @host_os@ -host_vendor = @host_vendor@ -htmldir = @htmldir@ -includedir = @includedir@ -infodir = @infodir@ -install_sh = @install_sh@ -libdir = @libdir@ -libexecdir = @libexecdir@ -localedir = @localedir@ -localstatedir = @localstatedir@ -mandir = @mandir@ -mkdir_p = @mkdir_p@ -oldincludedir = @oldincludedir@ -pdfdir = @pdfdir@ -prefix = @prefix@ -program_transform_name = @program_transform_name@ -psdir = @psdir@ -sbindir = @sbindir@ -sharedstatedir = @sharedstatedir@ -srcdir = @srcdir@ -sysconfdir = @sysconfdir@ -target_alias = @target_alias@ -top_build_prefix = @top_build_prefix@ -top_builddir = @top_builddir@ -top_srcdir = @top_srcdir@ -crond_SOURCES = \ - cron.c database.c user.c job.c do_command.c popen.c security.c \ - $(common_src) - -crontab_SOURCES = crontab.c security.c $(common_src) -cronnext_SOURCES = \ - cronnext.c database.c user.c job.c \ - $(common_src) - -common_src = entry.c env.c misc.c pw_dup.c \ - externs.h funcs.h globals.h macros.h pathnames.h structs.h \ - bitstring.h - -common_nodist = cron-paths.h -nodist_crond_SOURCES = $(common_nodist) -nodist_crontab_SOURCES = $(common_nodist) -nodist_cronnext_SOURCES = $(common_nodist) -BUILT_SOURCES = $(common_nodist) -AM_CFLAGS = -I$(top_srcdir) -LDADD = $(LIBSELINUX) $(LIBPAM) $(LIBAUDIT) - -# This header contains all the paths. -# If they are configurable, they are declared in configure script. -# Depends on this Makefile, because it uses make variables. -# CCD 2010/09/10 added CRON_HOSTNAME for clustered-cron. -CLEANFILES = cron-paths.h -all: $(BUILT_SOURCES) - $(MAKE) $(AM_MAKEFLAGS) all-am - -.SUFFIXES: -.SUFFIXES: .c .o .obj -$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ - && { if test -f $@; then exit 0; else break; fi; }; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/Makefile'; \ - $(am__cd) $(top_srcdir) && \ - $(AUTOMAKE) --gnu src/Makefile -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - @case '$?' in \ - *config.status*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ - *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ - esac; - -$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -$(top_srcdir)/configure: $(am__configure_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(ACLOCAL_M4): $(am__aclocal_m4_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(am__aclocal_m4_deps): -install-binPROGRAMS: $(bin_PROGRAMS) - @$(NORMAL_INSTALL) - @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ - if test -n "$$list"; then \ - echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ - $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ - fi; \ - for p in $$list; do echo "$$p $$p"; done | \ - sed 's/$(EXEEXT)$$//' | \ - while read p p1; do if test -f $$p \ - ; then echo "$$p"; echo "$$p"; else :; fi; \ - done | \ - sed -e 'p;s,.*/,,;n;h' \ - -e 's|.*|.|' \ - -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ - sed 'N;N;N;s,\n, ,g' | \ - $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ - { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ - if ($$2 == $$4) files[d] = files[d] " " $$1; \ - else { print "f", $$3 "/" $$4, $$1; } } \ - END { for (d in files) print "f", d, files[d] }' | \ - while read type dir files; do \ - if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ - test -z "$$files" || { \ - echo " $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ - $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ - } \ - ; done - -uninstall-binPROGRAMS: - @$(NORMAL_UNINSTALL) - @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ - files=`for p in $$list; do echo "$$p"; done | \ - sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ - -e 's/$$/$(EXEEXT)/' \ - `; \ - test -n "$$list" || exit 0; \ - echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ - cd "$(DESTDIR)$(bindir)" && rm -f $$files - -clean-binPROGRAMS: - -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) -install-sbinPROGRAMS: $(sbin_PROGRAMS) - @$(NORMAL_INSTALL) - @list='$(sbin_PROGRAMS)'; test -n "$(sbindir)" || list=; \ - if test -n "$$list"; then \ - echo " $(MKDIR_P) '$(DESTDIR)$(sbindir)'"; \ - $(MKDIR_P) "$(DESTDIR)$(sbindir)" || exit 1; \ - fi; \ - for p in $$list; do echo "$$p $$p"; done | \ - sed 's/$(EXEEXT)$$//' | \ - while read p p1; do if test -f $$p \ - ; then echo "$$p"; echo "$$p"; else :; fi; \ - done | \ - sed -e 'p;s,.*/,,;n;h' \ - -e 's|.*|.|' \ - -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ - sed 'N;N;N;s,\n, ,g' | \ - $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ - { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ - if ($$2 == $$4) files[d] = files[d] " " $$1; \ - else { print "f", $$3 "/" $$4, $$1; } } \ - END { for (d in files) print "f", d, files[d] }' | \ - while read type dir files; do \ - if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ - test -z "$$files" || { \ - echo " $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(sbindir)$$dir'"; \ - $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(sbindir)$$dir" || exit $$?; \ - } \ - ; done - -uninstall-sbinPROGRAMS: - @$(NORMAL_UNINSTALL) - @list='$(sbin_PROGRAMS)'; test -n "$(sbindir)" || list=; \ - files=`for p in $$list; do echo "$$p"; done | \ - sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ - -e 's/$$/$(EXEEXT)/' \ - `; \ - test -n "$$list" || exit 0; \ - echo " ( cd '$(DESTDIR)$(sbindir)' && rm -f" $$files ")"; \ - cd "$(DESTDIR)$(sbindir)" && rm -f $$files - -clean-sbinPROGRAMS: - -test -z "$(sbin_PROGRAMS)" || rm -f $(sbin_PROGRAMS) - -crond$(EXEEXT): $(crond_OBJECTS) $(crond_DEPENDENCIES) $(EXTRA_crond_DEPENDENCIES) - @rm -f crond$(EXEEXT) - $(AM_V_CCLD)$(LINK) $(crond_OBJECTS) $(crond_LDADD) $(LIBS) - -cronnext$(EXEEXT): $(cronnext_OBJECTS) $(cronnext_DEPENDENCIES) $(EXTRA_cronnext_DEPENDENCIES) - @rm -f cronnext$(EXEEXT) - $(AM_V_CCLD)$(LINK) $(cronnext_OBJECTS) $(cronnext_LDADD) $(LIBS) - -crontab$(EXEEXT): $(crontab_OBJECTS) $(crontab_DEPENDENCIES) $(EXTRA_crontab_DEPENDENCIES) - @rm -f crontab$(EXEEXT) - $(AM_V_CCLD)$(LINK) $(crontab_OBJECTS) $(crontab_LDADD) $(LIBS) - -mostlyclean-compile: - -rm -f *.$(OBJEXT) - -distclean-compile: - -rm -f *.tab.c - -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cron.Po@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cronnext.Po@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/crontab.Po@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/database.Po@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/do_command.Po@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/entry.Po@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/env.Po@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/job.Po@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/misc.Po@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/popen.Po@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pw_dup.Po@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/security.Po@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/user.Po@am__quote@ # am--include-marker - -$(am__depfiles_remade): - @$(MKDIR_P) $(@D) - @echo '# dummy' >$@-t && $(am__mv) $@-t $@ - -am--depfiles: $(am__depfiles_remade) - -.c.o: -@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< - -.c.obj: -@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` - -ID: $(am__tagged_files) - $(am__define_uniq_tagged_files); mkid -fID $$unique -tags: tags-am -TAGS: tags - -tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) - set x; \ - here=`pwd`; \ - $(am__define_uniq_tagged_files); \ - shift; \ - if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ - test -n "$$unique" || unique=$$empty_fix; \ - if test $$# -gt 0; then \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - "$$@" $$unique; \ - else \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - $$unique; \ - fi; \ - fi -ctags: ctags-am - -CTAGS: ctags -ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) - $(am__define_uniq_tagged_files); \ - test -z "$(CTAGS_ARGS)$$unique" \ - || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ - $$unique - -GTAGS: - here=`$(am__cd) $(top_builddir) && pwd` \ - && $(am__cd) $(top_srcdir) \ - && gtags -i $(GTAGS_ARGS) "$$here" -cscopelist: cscopelist-am - -cscopelist-am: $(am__tagged_files) - list='$(am__tagged_files)'; \ - case "$(srcdir)" in \ - [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ - *) sdir=$(subdir)/$(srcdir) ;; \ - esac; \ - for i in $$list; do \ - if test -f "$$i"; then \ - echo "$(subdir)/$$i"; \ - else \ - echo "$$sdir/$$i"; \ - fi; \ - done >> $(top_builddir)/cscope.files - -distclean-tags: - -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags - -distdir: $(BUILT_SOURCES) - $(MAKE) $(AM_MAKEFLAGS) distdir-am - -distdir-am: $(DISTFILES) - @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - list='$(DISTFILES)'; \ - dist_files=`for file in $$list; do echo $$file; done | \ - sed -e "s|^$$srcdirstrip/||;t" \ - -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ - case $$dist_files in \ - */*) $(MKDIR_P) `echo "$$dist_files" | \ - sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ - sort -u` ;; \ - esac; \ - for file in $$dist_files; do \ - if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - if test -d $$d/$$file; then \ - dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test -d "$(distdir)/$$file"; then \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ - else \ - test -f "$(distdir)/$$file" \ - || cp -p $$d/$$file "$(distdir)/$$file" \ - || exit 1; \ - fi; \ - done -check-am: all-am -check: $(BUILT_SOURCES) - $(MAKE) $(AM_MAKEFLAGS) check-am -all-am: Makefile $(PROGRAMS) -installdirs: - for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(sbindir)"; do \ - test -z "$$dir" || $(MKDIR_P) "$$dir"; \ - done -install: $(BUILT_SOURCES) - $(MAKE) $(AM_MAKEFLAGS) install-am -install-exec: install-exec-am -install-data: install-data-am -uninstall: uninstall-am - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am - -installcheck: installcheck-am -install-strip: - if test -z '$(STRIP)'; then \ - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - install; \ - else \ - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ - fi -mostlyclean-generic: - -clean-generic: - -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) - -distclean-generic: - -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) - -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) - -maintainer-clean-generic: - @echo "This command is intended for maintainers to use" - @echo "it deletes files that may require special tools to rebuild." - -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) -clean: clean-am - -clean-am: clean-binPROGRAMS clean-generic clean-sbinPROGRAMS \ - mostlyclean-am - -distclean: distclean-am - -rm -f ./$(DEPDIR)/cron.Po - -rm -f ./$(DEPDIR)/cronnext.Po - -rm -f ./$(DEPDIR)/crontab.Po - -rm -f ./$(DEPDIR)/database.Po - -rm -f ./$(DEPDIR)/do_command.Po - -rm -f ./$(DEPDIR)/entry.Po - -rm -f ./$(DEPDIR)/env.Po - -rm -f ./$(DEPDIR)/job.Po - -rm -f ./$(DEPDIR)/misc.Po - -rm -f ./$(DEPDIR)/popen.Po - -rm -f ./$(DEPDIR)/pw_dup.Po - -rm -f ./$(DEPDIR)/security.Po - -rm -f ./$(DEPDIR)/user.Po - -rm -f Makefile -distclean-am: clean-am distclean-compile distclean-generic \ - distclean-tags - -dvi: dvi-am - -dvi-am: - -html: html-am - -html-am: - -info: info-am - -info-am: - -install-data-am: - -install-dvi: install-dvi-am - -install-dvi-am: - -install-exec-am: install-binPROGRAMS install-sbinPROGRAMS - -install-html: install-html-am - -install-html-am: - -install-info: install-info-am - -install-info-am: - -install-man: - -install-pdf: install-pdf-am - -install-pdf-am: - -install-ps: install-ps-am - -install-ps-am: - -installcheck-am: - -maintainer-clean: maintainer-clean-am - -rm -f ./$(DEPDIR)/cron.Po - -rm -f ./$(DEPDIR)/cronnext.Po - -rm -f ./$(DEPDIR)/crontab.Po - -rm -f ./$(DEPDIR)/database.Po - -rm -f ./$(DEPDIR)/do_command.Po - -rm -f ./$(DEPDIR)/entry.Po - -rm -f ./$(DEPDIR)/env.Po - -rm -f ./$(DEPDIR)/job.Po - -rm -f ./$(DEPDIR)/misc.Po - -rm -f ./$(DEPDIR)/popen.Po - -rm -f ./$(DEPDIR)/pw_dup.Po - -rm -f ./$(DEPDIR)/security.Po - -rm -f ./$(DEPDIR)/user.Po - -rm -f Makefile -maintainer-clean-am: distclean-am maintainer-clean-generic - -mostlyclean: mostlyclean-am - -mostlyclean-am: mostlyclean-compile mostlyclean-generic - -pdf: pdf-am - -pdf-am: - -ps: ps-am - -ps-am: - -uninstall-am: uninstall-binPROGRAMS uninstall-sbinPROGRAMS - -.MAKE: all check install install-am install-strip - -.PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \ - clean-binPROGRAMS clean-generic clean-sbinPROGRAMS \ - cscopelist-am ctags ctags-am distclean distclean-compile \ - distclean-generic distclean-tags distdir dvi dvi-am html \ - html-am info info-am install install-am install-binPROGRAMS \ - install-data install-data-am install-dvi install-dvi-am \ - install-exec install-exec-am install-html install-html-am \ - install-info install-info-am install-man install-pdf \ - install-pdf-am install-ps install-ps-am install-sbinPROGRAMS \ - install-strip installcheck installcheck-am installdirs \ - maintainer-clean maintainer-clean-generic mostlyclean \ - mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \ - tags tags-am uninstall uninstall-am uninstall-binPROGRAMS \ - uninstall-sbinPROGRAMS - -.PRECIOUS: Makefile - -cron-paths.h: Makefile - @echo 'creating $@' - @sed >$@ 's/ *\\$$//' <<\END #\ - /* This file has been automatically generated. Do not edit. */ \ - \ - #ifndef _CRON_PATHS_H_ \ - #define _CRON_PATHS_H_ \ - \ - /* SPOOLDIR is where the crontabs live. \ - * This directory will have its modtime updated \ - * whenever crontab(1) changes a crontab; this is \ - * the signal for cron(8) to look at each individual \ - * crontab file and reload those whose modtimes are \ - * newer than they were last time around (or which \ - * didn't exist last time around...) \ - * or it will be checked by inotify \ - */ \ - #define SPOOL_DIR "$(SPOOL_DIR)" \ - \ - /* CRON_HOSTNAME is file in SPOOL_DIR which, if it \ - * exists, and does not just contain a line matching \ - * the name returned by gethostname(), causes all \ - * crontabs in SPOOL_DIR to be ignored. This is \ - * intended to be used when clustering hosts sharing \ - * one NFS-mounted SPOOL_DIR, and where only one host \ - * should use the crontab files here at any one time. \ - */ \ - #define CRON_HOSTNAME ".cron.hostname" \ - \ - /* cron allow/deny file. At least cron.deny must \ - * exist for ordinary users to run crontab. \ - */ \ - #define CRON_ALLOW "$(sysconfdir)/cron.allow" \ - #define CRON_DENY "$(sysconfdir)/cron.deny" \ - \ - /* 4.3BSD-style crontab f.e. /etc/crontab */ \ - #define SYSCRONTAB "$(SYSCRONTAB)" \ - \ - /* system crontab dir f.e. /etc/cron.d/ */ \ - #define SYS_CROND_DIR "$(SYS_CROND_DIR)" \ - \ - #define SYSCONFDIR "$(sysconfdir)" \ - \ - #endif /* _CRON_PATHS_H_ */ \ - END - -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: diff --git a/src/Makefile.am b/src/Makemodule.am similarity index 68% rename from src/Makefile.am rename to src/Makemodule.am index e832f12..b531d25 100644 --- a/src/Makefile.am +++ b/src/Makemodule.am @@ -1,27 +1,55 @@ # Makefile.am - two binaries crond and crontab -sbin_PROGRAMS = crond -bin_PROGRAMS = crontab cronnext +sbin_PROGRAMS += \ + src/crond -crond_SOURCES = \ - cron.c database.c user.c job.c do_command.c popen.c security.c \ +bin_PROGRAMS += \ + src/cronnext \ + src/crontab + +src_crond_SOURCES = \ + src/cron.c \ + src/database.c \ + src/do_command.c \ + src/job.c \ + src/popen.c \ + src/security.c \ + src/user.c \ $(common_src) -crontab_SOURCES = crontab.c security.c $(common_src) -cronnext_SOURCES = \ - cronnext.c database.c user.c job.c \ + +src_crontab_SOURCES = \ + src/crontab.c \ + src/security.c \ $(common_src) -common_src = entry.c env.c misc.c pw_dup.c \ - externs.h funcs.h globals.h macros.h pathnames.h structs.h \ - bitstring.h -common_nodist = cron-paths.h -nodist_crond_SOURCES = $(common_nodist) -nodist_crontab_SOURCES = $(common_nodist) -nodist_cronnext_SOURCES = $(common_nodist) -BUILT_SOURCES = $(common_nodist) -AM_CFLAGS = -I$(top_srcdir) +src_cronnext_SOURCES = \ + src/cronnext.c \ + src/database.c \ + src/job.c \ + src/user.c \ + $(common_src) -LDADD = $(LIBSELINUX) $(LIBPAM) $(LIBAUDIT) +common_src = \ + src/bitstring.h \ + src/entry.c \ + src/env.c \ + src/externs.h \ + src/funcs.h \ + src/globals.h \ + src/macros.h \ + src/misc.c \ + src/pathnames.h \ + src/pw_dup.c \ + src/structs.h + +common_nodist += cron-paths.h +nodist_src_crond_SOURCES = $(common_nodist) +nodist_src_crontab_SOURCES = $(common_nodist) +nodist_src_cronnext_SOURCES = $(common_nodist) +BUILT_SOURCES += $(common_nodist) + +src_crond_LDADD = $(LIBSELINUX) $(LIBPAM) $(LIBAUDIT) +src_crontab_LDADD = $(LIBSELINUX) $(LIBPAM) $(LIBAUDIT) ## if DEBUG ## noinst_PROGRAMS = debug @@ -31,7 +59,7 @@ LDADD = $(LIBSELINUX) $(LIBPAM) $(LIBAUDIT) # If they are configurable, they are declared in configure script. # Depends on this Makefile, because it uses make variables. # CCD 2010/09/10 added CRON_HOSTNAME for clustered-cron. -CLEANFILES = cron-paths.h +CLEANFILES += cron-paths.h cron-paths.h: Makefile @echo 'creating $@' @sed >$@ 's/ *\\$$//' <<\END #\ diff --git a/src/cron.c b/src/cron.c index 857d94b..7eabfe9 100644 --- a/src/cron.c +++ b/src/cron.c @@ -68,8 +68,9 @@ find_jobs(int, cron_db *, int, int, long), set_time(int), cron_sleep(int, cron_db *), sigchld_handler(int), -sighup_handler(int), -sigchld_reaper(void), sigintterm_handler(int), parse_args(int c, char *v[]); +sighup_handler(int ATTRIBUTE_UNUSED), +sigchld_reaper(void), +sigintterm_handler(int ATTRIBUTE_UNUSED), parse_args(int c, char *v[]); static volatile sig_atomic_t got_sighup, got_sigchld, got_sigintterm; static int timeRunning, virtualTime, clockTime; @@ -261,7 +262,7 @@ int main(int argc, char *argv[]) { */ setlocale(LC_ALL, ""); /* set locale to system defaults or to * that specified by any LC_* env vars */ - if ((cs = nl_langinfo(CODESET)) != 0L) + if ((cs = nl_langinfo(CODESET)) != NULL) strncpy(cron_default_mail_charset, cs, MAX_ENVSTR-1); else strcpy(cron_default_mail_charset, "US-ASCII"); @@ -651,15 +652,15 @@ static void cron_sleep(int target, cron_db * db) { } } -static void sighup_handler(int x) { +static void sighup_handler(int x ATTRIBUTE_UNUSED) { got_sighup = 1; } -static void sigchld_handler(int x) { +static void sigchld_handler(int x ATTRIBUTE_UNUSED) { got_sigchld = 1; } -static void sigintterm_handler(int x) { +static void sigintterm_handler(int x ATTRIBUTE_UNUSED) { got_sigintterm = 1; } diff --git a/src/cronnext.c b/src/cronnext.c index ef8a40d..0b19f70 100644 --- a/src/cronnext.c +++ b/src/cronnext.c @@ -25,6 +25,8 @@ #define MAIN_PROGRAM #include +#include +#include #include #include @@ -81,7 +83,7 @@ const char *flagname[]= { }; void printflags(char *indent, int flags) { - int f; + size_t f; int first = 1; printf("%s flagnames:", indent); @@ -197,11 +199,11 @@ time_t nextmatch(entry *e, time_t start, time_t end) { /* * match a user against a list */ -int matchuser(char *user, char *list) { +int matchuser(char *user_name, char *list) { char *pos; - size_t l = strlen(user); + size_t l = strlen(user_name); - for (pos = list; (pos = strstr(pos, user)) != NULL; pos += l) { + for (pos = list; (pos = strstr(pos, user_name)) != NULL; pos += l) { if ((pos != list) && (*(pos - 1) != ',')) continue; if ((pos[l] != '\0') && (pos[l] != ',')) @@ -216,7 +218,7 @@ int matchuser(char *user, char *list) { */ time_t cronnext(cron_db database, time_t start, time_t end, - char *include, char *exclude, int flags) { + char *include, char *exclude, char *command, int flags) { time_t closest, next; user *u; entry *e; @@ -242,7 +244,9 @@ time_t cronnext(cron_db database, if (flags & CRONTABS) printcrontab(u); - for (e = u->crontab; e; e = e->next) + for (e = u->crontab; e; e = e->next) { + if (command && strstr(e->cmd, command) == NULL) + continue; for (next = nextmatch(e, start, end); next <= end; next = nextmatch(e, next + 60, end)) { @@ -255,6 +259,7 @@ time_t cronnext(cron_db database, if (! (flags & ALLJOBS)) break; } + } } return closest; @@ -267,6 +272,7 @@ cron_db database(int installed, char **additional) { cron_db db = {NULL, NULL, (time_t) 0}; struct passwd pw; int fd; + struct stat ss; user *u; if (installed) @@ -278,6 +284,12 @@ cron_db database(int installed, char **additional) { perror(*additional); continue; } + fstat(fd, &ss); + if (S_ISDIR(ss.st_mode)) { + fprintf(stderr, "%s is a directory - skipping\n", *additional); + close(fd); + continue; + } memset(&pw, 0, sizeof(pw)); pw.pw_name = *additional; pw.pw_passwd = ""; @@ -305,6 +317,7 @@ void usage() { fprintf(stderr, " -a examine installed crontabs even if files are given\n"); fprintf(stderr, " -t time start from this time (seconds since epoch)\n"); fprintf(stderr, " -q time end check at this time (seconds since epoch)\n"); + fprintf(stderr, " -j cmd only check jobs that contain cmd as a substring\n"); fprintf(stderr, " -l print next jobs to be executed\n"); fprintf(stderr, " -c print next execution of each job\n"); fprintf(stderr, " -f print all jobs executed in the given interval\n"); @@ -317,7 +330,7 @@ void usage() { */ int main(int argn, char *argv[]) { int opt; - char *include, *exclude; + char *include, *exclude, *command; int flags; time_t start, next, end = 0; int endtime, printjobs; @@ -326,12 +339,13 @@ int main(int argn, char *argv[]) { include = NULL; exclude = NULL; + command = NULL; flags = SYSTEM; endtime = 0; printjobs = 0; start = time(NULL) / 60 * 60; - while (-1 != (opt = getopt(argn, argv, "i:e:ast:q:lcfhV"))) { + while (-1 != (opt = getopt(argn, argv, "i:e:ast:q:j:lcfhV"))) { switch (opt) { case 'i': include = optarg; @@ -352,6 +366,9 @@ int main(int argn, char *argv[]) { end = atoi(optarg) / 60 * 60; endtime = 1; break; + case 'j': + command = optarg; + break; case 'l': printjobs = 1; break; @@ -399,7 +416,7 @@ int main(int argn, char *argv[]) { db = database(installed || argv[optind] == NULL, argv + optind); /* find time of next scheduled command */ - next = cronnext(db, start, end, include, exclude, flags); + next = cronnext(db, start, end, include, exclude, command, flags); /* print time */ if (next == -1) @@ -410,7 +427,7 @@ int main(int argn, char *argv[]) { /* print next jobs */ if (printjobs) { printf("nextjobs:\n"); - cronnext(db, next, next, include, exclude, (flags & SYSTEM) | ENTRIES); + cronnext(db, next, next, include, exclude, command, (flags & SYSTEM) | ENTRIES); } return EXIT_SUCCESS; diff --git a/src/crontab.c b/src/crontab.c index 6f20888..68f31f0 100644 --- a/src/crontab.c +++ b/src/crontab.c @@ -66,6 +66,9 @@ #define NHEADER_LINES 0 +#define COMMENT_COLOR "\x1B[34m" +#define RESET_COLOR "\033[0m" + enum opt_t {opt_unknown, opt_list, opt_delete, opt_edit, opt_replace, opt_hostset, opt_hostget}; #if DEBUGGING @@ -392,6 +395,8 @@ static void list_cmd(void) { char n[MAX_FNAME]; FILE *f; int ch; + const int is_tty = isatty(STDOUT); + int new_line = 1; log_it(RealUser, Pid, "LIST", User, 0); if (!glue_strings(n, sizeof n, SPOOL_DIR, User, '/')) { @@ -409,8 +414,18 @@ static void list_cmd(void) { /* file is open. copy to stdout, close. */ Set_LineNum(1) - while (EOF != (ch = get_char(f))) + while (EOF != (ch = get_char(f))) { + if (is_tty && new_line) { + if (ch == '#') { + fputs(COMMENT_COLOR, stdout); + } + else { + fputs(RESET_COLOR, stdout); + } + } putchar(ch); + new_line = ch == '\n'; + } fclose(f); } @@ -419,7 +434,7 @@ static void delete_cmd(void) { if (PromptOnDelete == 1) { printf("crontab: really delete %s's crontab? ", User); fflush(stdout); - if ((fgets(n, MAX_FNAME - 1, stdin) == 0L) + if ((fgets(n, MAX_FNAME - 1, stdin) == NULL) || ((n[0] != 'Y') && (n[0] != 'y')) ) exit(0); @@ -700,7 +715,7 @@ static void edit_cmd(void) { perror("swapping uids back"); exit(ERROR_EXIT); } - if (NewCrontab == 0L) { + if (NewCrontab == NULL) { perror("fopen"); goto fatal; } @@ -709,10 +724,10 @@ static void edit_cmd(void) { break; case -1: for (;;) { - printf("Do you want to retry the same edit? "); + printf("Do you want to retry the same edit? (Y/N) "); fflush(stdout); q[0] = '\0'; - if (fgets(q, sizeof q, stdin) == 0L) + if (fgets(q, sizeof q, stdin) == NULL) continue; switch (q[0]) { case 'y': @@ -803,15 +818,14 @@ static int replace_cmd(void) { error = -2; goto done; } - fflush(tmp); - rewind(tmp); - if (ferror(tmp)) { + if (ferror(tmp) || fflush(tmp) || fsync(fileno(tmp))) { fprintf(stderr, "%s: error while writing new crontab to %s\n", ProgramName, TempFilename); fclose(tmp); error = -2; goto done; } + rewind(tmp); /* check the syntax of the file being installed. */ @@ -1041,7 +1055,7 @@ static void poke_daemon(void) { } } -static void die(int x) { +static void die(int x ATTRIBUTE_UNUSED) { if (TempFilename[0]) (void) unlink(TempFilename); _exit(ERROR_EXIT); diff --git a/src/database.c b/src/database.c index 66609d1..1986620 100644 --- a/src/database.c +++ b/src/database.c @@ -48,9 +48,6 @@ #include "globals.h" #include "pathnames.h" -#define TMAX(a,b) ((a)>(b)?(a):(b)) -#define TMIN(a,b) ((a)<(b)?(a):(b)) - /* size of the event structure, not counting name */ #define EVENT_SIZE (sizeof (struct inotify_event)) diff --git a/src/do_command.c b/src/do_command.c index aeee1d3..ed56775 100644 --- a/src/do_command.c +++ b/src/do_command.c @@ -46,7 +46,7 @@ static int safe_p(const char *, const char *); void do_command(entry * e, user * u) { pid_t pid = getpid(); int ev; - char **jobenv = 0L; + char **jobenv = NULL; Debug(DPROC, ("[%ld] do_command(%s, (%s,%ld,%ld))\n", (long) pid, e->cmd, u->name, @@ -238,7 +238,7 @@ static int child_process(entry * e, char **jobenv) { */ { char *shell = env_get("SHELL", jobenv); - int fd, fdmax = getdtablesize(); + int fd, fdmax = TMIN(getdtablesize(), MAX_CLOSE_FD); /* close all unwanted open file descriptors */ for(fd = STDERR + 1; fd < fdmax; fd++) { @@ -427,8 +427,14 @@ static int child_process(entry * e, char **jobenv) { gethostname(hostname, MAXHOSTNAMELEN); if (MailCmd[0] == '\0') { - if (snprintf(mailcmd, sizeof mailcmd, MAILFMT, MAILARG, mailfrom) - >= sizeof mailcmd) { + int len; + + len = snprintf(mailcmd, sizeof mailcmd, MAILFMT, MAILARG, mailfrom); + if (len < 0) { + fprintf(stderr, "mailcmd snprintf failed\n"); + (void) _exit(ERROR_EXIT); + } + if (sizeof mailcmd <= (size_t) len) { fprintf(stderr, "mailcmd too long\n"); (void) _exit(ERROR_EXIT); } @@ -450,7 +456,7 @@ static int child_process(entry * e, char **jobenv) { fprintf(mail, "Date: %s\n", arpadate(&StartTime)); #endif /*MAIL_DATE */ fprintf(mail, "MIME-Version: 1.0\n"); - if (content_type == 0L) { + if (content_type == NULL) { fprintf(mail, "Content-Type: text/plain; charset=%s\n", cron_default_mail_charset); } @@ -461,17 +467,17 @@ static int child_process(entry * e, char **jobenv) { char *nl = content_type; size_t ctlen = strlen(content_type); while ((*nl != '\0') - && ((nl = strchr(nl, '\n')) != 0L) + && ((nl = strchr(nl, '\n')) != NULL) && (nl < (content_type + ctlen)) ) *nl = ' '; fprintf(mail, "Content-Type: %s\n", content_type); } - if (content_transfer_encoding != 0L) { + if (content_transfer_encoding != NULL) { char *nl = content_transfer_encoding; size_t ctlen = strlen(content_transfer_encoding); while ((*nl != '\0') - && ((nl = strchr(nl, '\n')) != 0L) + && ((nl = strchr(nl, '\n')) != NULL) && (nl < (content_transfer_encoding + ctlen)) ) *nl = ' '; @@ -500,6 +506,8 @@ static int child_process(entry * e, char **jobenv) { */ while (EOF != (ch = getc(in))) { + if (ch == '\r') + continue; bytes++; if (mail) putc(ch, mail); diff --git a/src/entry.c b/src/entry.c index 8d8aed3..e3a3b1d 100644 --- a/src/entry.c +++ b/src/entry.c @@ -548,6 +548,13 @@ get_range(bitstr_t * bits, int low, int high, const char *names[], num3 = 1; } + /* num1 (through i) will be validated by set_element() below, but num2 + * and num3 are merely used as loop condition and increment, and must + * be validated separately. + */ + if (num2 < low || num2 > high || num3 > high) + return (EOF); + /* range. set all elements from num1 to num2, stepping * by num3. (the step is a downward-compatible extension * proposed conceptually by bob@acornrc, syntactically diff --git a/src/env.c b/src/env.c index 491f6f5..3336c51 100644 --- a/src/env.c +++ b/src/env.c @@ -23,6 +23,7 @@ #include #include +#include #include #include #include @@ -281,7 +282,7 @@ char *env_get(const char *name, char **envp) { while ((p = *envp++) != NULL) { if (!(q = strchr(p, '='))) continue; - if ((q - p) == len && !strncmp(p, name, len)) + if ((size_t)(q - p) == len && !strncmp(p, name, len)) return (q + 1); } return (NULL); diff --git a/src/macros.h b/src/macros.h index 74ffa26..cba5fb2 100644 --- a/src/macros.h +++ b/src/macros.h @@ -61,6 +61,7 @@ #define MAX_USER_ENVS 1000 /* maximum environment variables in user's crontab */ #define MAX_USER_ENTRIES 1000 /* maximum crontab entries in user's crontab */ #define MAX_GARBAGE 32768 /* max num of chars of comments and whitespaces between entries */ +#define MAX_CLOSE_FD 10000 /* max fd num to close when spawning a child process */ /* NOTE: these correspond to DebugFlagNames, * defined below. @@ -129,6 +130,9 @@ #define LAST_DOW 7 #define DOW_COUNT (LAST_DOW - FIRST_DOW + 1) +#define TMAX(a,b) ((a)>(b)?(a):(b)) +#define TMIN(a,b) ((a)<(b)?(a):(b)) + /* * Because crontab/at files may be owned by their respective users we * take extreme care in opening them. If the OS lacks the O_NOFOLLOW diff --git a/src/misc.c b/src/misc.c index 9129d1d..faf6ffb 100644 --- a/src/misc.c +++ b/src/misc.c @@ -315,9 +315,6 @@ void acquire_daemonlock(int closeflag) { return; } - if (NoFork == 1) - return; //move along, nothing to do here... - if (fd == -1) { pidfile = _PATH_CRON_PID; /* Initial mode is 0600 to prevent flock() race/DoS. */ @@ -460,76 +457,6 @@ int skip_comments(FILE * file) { return TRUE; } -/* int in_file(const char *string, FILE *file, int error) - * return TRUE if one of the lines in file matches string exactly, - * FALSE if no lines match, and error on error. - */ -static int in_file(const char *string, FILE * file, int error) { - char line[MAX_TEMPSTR]; - char *endp; - - if (fseek(file, 0L, SEEK_SET)) - return (error); - while (fgets(line, MAX_TEMPSTR, file)) { - if (line[0] != '\0') { - endp = &line[strlen(line) - 1]; - if (*endp != '\n') - return (error); - *endp = '\0'; - if (0 == strcmp(line, string)) - return (TRUE); - } - } - if (ferror(file)) - return (error); - return (FALSE); -} - -/* int allowed(const char *username, const char *allow_file, const char *deny_file) - * returns TRUE if (allow_file exists and user is listed) - * or (deny_file exists and user is NOT listed). - * root is always allowed. - */ -int allowed(const char *username, const char *allow_file, - const char *deny_file) { - FILE *fp; - int isallowed; - char buf[128]; - - if (getuid() == 0) - return TRUE; - isallowed = FALSE; - if ((fp = fopen(allow_file, "r")) != NULL) { - isallowed = in_file(username, fp, FALSE); - fclose(fp); - if ((getuid() == 0) && (!isallowed)) { - snprintf(buf, sizeof (buf), - "root used -u for user %s not in cron.allow", username); - log_it("crontab", getpid(), "warning", buf, 0); - isallowed = TRUE; - } - } - else if ((fp = fopen(deny_file, "r")) != NULL) { - isallowed = !in_file(username, fp, FALSE); - fclose(fp); - if ((getuid() == 0) && (!isallowed)) { - snprintf(buf, sizeof (buf), - "root used -u for user %s in cron.deny", username); - log_it("crontab", getpid(), "warning", buf, 0); - isallowed = TRUE; - } - } -#ifdef WITH_AUDIT - if (isallowed == FALSE) { - int audit_fd = audit_open(); - audit_log_user_message(audit_fd, AUDIT_USER_START, "cron deny", - NULL, NULL, NULL, 0); - close(audit_fd); - } -#endif - return (isallowed); -} - void log_it(const char *username, PID_T xpid, const char *event, const char *detail, int err) { #if defined(LOG_FILE) || DEBUGGING diff --git a/src/popen.c b/src/popen.c index eaea20a..4397264 100644 --- a/src/popen.c +++ b/src/popen.c @@ -81,12 +81,19 @@ FILE *cron_popen(char *program, const char *type, struct passwd *pw, char **jobe if (!pids) { if ((fds = getdtablesize()) <= 0) return (NULL); + if (fds > MAX_CLOSE_FD) + fds = MAX_CLOSE_FD; /* avoid allocating too much memory */ if (!(pids = (PID_T *) malloc((u_int) ((size_t)fds * sizeof (PID_T))))) return (NULL); memset((char *) pids, 0, (size_t)fds * sizeof (PID_T)); } if (pipe(pdes) < 0) return (NULL); + if (pdes[0] >= fds || pdes[1] >= fds) { + (void) close(pdes[0]); + (void) close(pdes[1]); + return NULL; + } /* break up string into pieces */ for (argc = 0, cp = program; argc < MAX_ARGS; cp = NULL) @@ -145,14 +152,16 @@ FILE *cron_popen(char *program, const char *type, struct passwd *pw, char **jobe } /* parent; assume fdopen can't fail... */ if (*type == 'r') { + fd = pdes[0]; iop = fdopen(pdes[0], type); (void) close(pdes[1]); } else { + fd = pdes[1]; iop = fdopen(pdes[1], type); (void) close(pdes[0]); } - pids[fileno(iop)] = pid; + pids[fd] = pid; pfree: return (iop); @@ -168,7 +177,8 @@ int cron_pclose(FILE * iop) { * pclose returns -1 if stream is not associated with a * `popened' command, or, if already `pclosed'. */ - if (pids == 0 || pids[fdes = fileno(iop)] == 0) + fdes = fileno(iop); + if (pids == NULL || fdes >= fds || pids[fdes] == 0L) return (-1); (void) fclose(iop); diff --git a/src/security.c b/src/security.c index 5213cf3..d4d768e 100644 --- a/src/security.c +++ b/src/security.c @@ -120,7 +120,7 @@ int cron_set_job_security_context(entry *e, user *u ATTRIBUTE_UNUSED, /* "minute-ly" job: Every minute for given hour/dow/month/dom. * Ensure that these jobs never run in the same minute: */ - minutely_time = time(0); + minutely_time = time(NULL); Debug(DSCH, ("Minute-ly job. Recording time %lu\n", minutely_time)); } @@ -169,7 +169,7 @@ int cron_set_job_security_context(entry *e, user *u ATTRIBUTE_UNUSED, *jobenv = build_env(e->envp); - time_t job_run_time = time(0L); + time_t job_run_time = time(NULL); if ((minutely_time > 0) && ((job_run_time / 60) != (minutely_time / 60))) { /* if a per-minute job is delayed into the next minute @@ -350,12 +350,12 @@ cron_get_job_range(user * u, security_context_t * ucontextp, char **jobenv) { if (is_selinux_enabled() <= 0) return 0; - if (ucontextp == 0L) + if (ucontextp == NULL) return -1; - *ucontextp = 0L; + *ucontextp = NULL; - if ((range = env_get("MLS_LEVEL", jobenv)) != 0L) { + if ((range = env_get("MLS_LEVEL", jobenv)) != NULL) { context_t ccon; if (!(ccon = context_new(u->scontext))) { log_it(u->name, getpid(), "context_new FAILED for MLS_LEVEL", @@ -404,7 +404,7 @@ static int cron_change_selinux_range(user * u, security_context_t ucontext) { if (is_selinux_enabled() <= 0) return 0; - if (u->scontext == 0L) { + if (u->scontext == NULL) { if (security_getenforce() > 0) { log_it(u->name, getpid(), "NULL security context for user", "", 0); return -1; @@ -592,7 +592,7 @@ get_security_context(const char *name, int crontab_fd, void free_security_context(security_context_t * scontext) { if (*scontext != NULL) { freecon(*scontext); - *scontext = 0L; + *scontext = NULL; } } #endif @@ -675,3 +675,74 @@ static char **build_env(char **cronenv) { return jobenv; #endif } + +/* int in_file(const char *string, FILE *file, int error) + * return TRUE if one of the lines in file matches string exactly, + * FALSE if no lines match, and error on error. + */ +static int in_file(const char *string, FILE * file, int error) { + char line[MAX_TEMPSTR]; + char *endp; + + if (fseek(file, 0L, SEEK_SET)) + return (error); + while (fgets(line, MAX_TEMPSTR, file)) { + if (line[0] != '\0') { + endp = &line[strlen(line) - 1]; + if (*endp != '\n') + return (error); + *endp = '\0'; + if (0 == strcmp(line, string)) + return (TRUE); + } + } + if (ferror(file)) + return (error); + return (FALSE); +} + +/* int allowed(const char *username, const char *allow_file, const char *deny_file) + * returns TRUE if (allow_file exists and user is listed) + * or (deny_file exists and user is NOT listed). + * root is always allowed. + */ +int allowed(const char *username, const char *allow_file, + const char *deny_file) { + FILE *fp; + int isallowed; + char buf[128]; + + if (getuid() == 0) + return TRUE; + isallowed = FALSE; + if ((fp = fopen(allow_file, "r")) != NULL) { + isallowed = in_file(username, fp, FALSE); + fclose(fp); + if ((getuid() == 0) && (!isallowed)) { + snprintf(buf, sizeof (buf), + "root used -u for user %s not in cron.allow", username); + log_it("crontab", getpid(), "warning", buf, 0); + isallowed = TRUE; + } + } + else if ((fp = fopen(deny_file, "r")) != NULL) { + isallowed = !in_file(username, fp, FALSE); + fclose(fp); + if ((getuid() == 0) && (!isallowed)) { + snprintf(buf, sizeof (buf), + "root used -u for user %s in cron.deny", username); + log_it("crontab", getpid(), "warning", buf, 0); + isallowed = TRUE; + } + } +#ifdef WITH_AUDIT + if (isallowed == FALSE) { + int audit_fd = audit_open(); + audit_log_user_message(audit_fd, AUDIT_USER_START, "cron deny", + NULL, NULL, NULL, 0); + close(audit_fd); + } +#endif + return (isallowed); +} + diff --git a/src/user.c b/src/user.c index c34d271..2771bac 100644 --- a/src/user.c +++ b/src/user.c @@ -124,6 +124,16 @@ load_user (int crontab_fd, struct passwd *pw, const char *uname, } status = load_env (envstr, file); switch (status) { + case ERR: + /* If envstr has content, we reached EOF + * without a newline, and the line will be + * ignored. + */ + if (envstr[0] != '\0') { + FileName = tabname; + log_error("missing newline before EOF"); + } + break; case FALSE: ++entries; if (!u->system && entries > MAX_USER_ENTRIES) {