On Wed, 11 Nov 2015 14:43:47 -0700, "Todd C. Miller" wrote:
> There's limited backward compatibility so you can run a new crontab
> with an older cron daemon.
Revised diff, I neglected to send out the cron.c changes in the
first one.
- todd
Index: usr.sbin/cron/client.c
===================================================================
RCS file: /cvs/src/usr.sbin/cron/client.c,v
retrieving revision 1.6
diff -u -p -u -r1.6 client.c
--- usr.sbin/cron/client.c 11 Nov 2015 17:05:23 -0000 1.6
+++ usr.sbin/cron/client.c 11 Nov 2015 21:56:18 -0000
@@ -19,9 +19,12 @@
#include <sys/types.h>
#include <sys/socket.h>
+#include <sys/stat.h>
#include <sys/un.h>
#include <bitstring.h> /* for structs.h */
+#include <err.h>
+#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@@ -92,13 +95,17 @@ void
poke_daemon(const char *spool_dir, unsigned char cookie)
{
int sock = -1;
+ const char *cronsock = CRONSOCK;
+ struct stat sb;
struct sockaddr_un s_un;
+ if (stat(cronsock, &sb) != 0)
+ cronsock = CRONSOCK_OLD; /* backwards compatibility */
+
bzero(&s_un, sizeof(s_un));
- if (snprintf(s_un.sun_path, sizeof s_un.sun_path, "%s/%s",
- CRON_SPOOL, CRONSOCK) >= sizeof(s_un.sun_path)) {
- fprintf(stderr, "%s: %s/%s: path too long\n",
- __progname, CRON_SPOOL, CRONSOCK);
+ if (strlcpy(s_un.sun_path, cronsock, sizeof(s_un.sun_path)) >=
+ sizeof(s_un.sun_path)) {
+ warnc(ENAMETOOLONG, "%s", cronsock);
return;
}
s_un.sun_family = AF_UNIX;
@@ -106,8 +113,7 @@ poke_daemon(const char *spool_dir, unsig
connect(sock, (struct sockaddr *)&s_un, sizeof(s_un)) == 0)
send(sock, &cookie, 1, MSG_NOSIGNAL);
else
- fprintf(stderr, "%s: warning, cron does not appear to be "
- "running.\n", __progname);
+ warnx("warning, cron does not appear to be running");
if (sock >= 0)
close(sock);
}
Index: usr.sbin/cron/cron.c
===================================================================
RCS file: /cvs/src/usr.sbin/cron/cron.c,v
retrieving revision 1.68
diff -u -p -u -r1.68 cron.c
--- usr.sbin/cron/cron.c 11 Nov 2015 17:19:22 -0000 1.68
+++ usr.sbin/cron/cron.c 11 Nov 2015 21:56:18 -0000
@@ -431,9 +431,9 @@ open_socket(void)
exit(EXIT_FAILURE);
}
bzero(&s_un, sizeof(s_un));
- if (snprintf(s_un.sun_path, sizeof(s_un.sun_path), "%s/%s",
- CRON_SPOOL, CRONSOCK) >= sizeof(s_un.sun_path)) {
- fprintf(stderr, "%s/%s: path too long\n", CRON_SPOOL, CRONSOCK);
+ if (strlcpy(s_un.sun_path, CRONSOCK, sizeof(s_un.sun_path))
+ >= sizeof(s_un.sun_path)) {
+ fprintf(stderr, "%s: path too long\n", CRONSOCK);
log_it("CRON", "DEATH", "path too long");
exit(EXIT_FAILURE);
}
Index: usr.sbin/cron/pathnames.h
===================================================================
RCS file: /cvs/src/usr.sbin/cron/pathnames.h,v
retrieving revision 1.20
diff -u -p -u -r1.20 pathnames.h
--- usr.sbin/cron/pathnames.h 9 Nov 2015 16:00:39 -0000 1.20
+++ usr.sbin/cron/pathnames.h 11 Nov 2015 21:56:18 -0000
@@ -50,9 +50,9 @@
/* CRONSOCK is the name of the socket used by at and
* crontab to poke cron to re-read the at and cron
* spool files while cron is asleep.
- * It lives in the spool directory.
*/
-#define CRONSOCK ".sock"
+#define CRONSOCK "/var/run/cron.sock"
+#define CRONSOCK_OLD CRON_SPOOL "/.sock"
/* cron allow/deny file. At least cron.deny must
* exist for ordinary users to run crontab.