random from within the range at file read time. Very useful if you
want to avoid having a fleet of machines melt a server by all trying to
contact it at a precise time every morning. See docs for details.
Reviewed by: christos, apb, vixie, others.
XXX apb suggests, quite reasonably, that ?10-16/2 should mean
something like 10,12,14,16 or 11,13,15. I'm too lazy to do it right
now, but it should be done.
XXX vixie suggests, quite reasonably, that if you're using "?" one
should delay randomly by 0-59 seconds. In the modern NTP world, you
could imagine that with a million well synchronized machines the
second just at the minute would be hit quite hard. I'm too lazy to do
it right now, but it should be done.
XXX cron needs to be updated to Vixie's cron 4.1 code.
Remove a "(void)&" construction: iop is used by the parent
and always set after the vfork(). Also flag some parameters __unused
so this will compile with -Wextra.
- cast more returns to void.
- use waitpid instead of wait() to wait for our process, not accidentally
wait for other children.
- return exitstatus only if exited, and return the termination signal otherwise.
in crontab -l.
The problem is that the skip_header code has a side effect of trying to
write to the new temporary cron tab if we run out of comments. Since we
don't have an output file in -l, we core-dump trying to fputc to NULL.
Simplify the logic so that we don't write in the skip_header function,
and we always return the first character after the comment lines to the
caller, skipping the '\n'.
startup time ("reboot" of cron, not the system), so okay_to_go() must
always say they are good to go. Otherwise they never will. All other
meta-timetags pertain to regular times, so they are (or were)
unaffected.
Problem noted by tron and successfully assigned to me by perry.
I simplified the patch addressed certain security concerns. I only
allowed setusercontext() to set resource limits/priority and umask,
because these are the values that are relevant from login.conf. The
rest of the settings (uid/gid/initgroups) should be done using e->uid
and e->gid like they were before, not from:
struct passwd *pwd = getpwnam(getenv("LOGNAME"));
Finally login_cap's (path/env) are irrelevant in this context since
we want to use our e->envp anyway to execute the command.