Skip to content

Commit

Permalink
Create a pid file if running in daemon mode - casantos
Browse files Browse the repository at this point in the history
  • Loading branch information
ptc committed Mar 9, 2024
1 parent 1ec7e18 commit 3779c04
Show file tree
Hide file tree
Showing 4 changed files with 76 additions and 12 deletions.
12 changes: 11 additions & 1 deletion crond.8
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
crond - dillon's lightweight cron daemon
.SH SYNOPSIS
.PP
\f[B]crond [-s dir] [-c dir] [-t dir] [-m user\@host] [-M mailhandler] [-S|-L file] [-l loglevel] [-b|-f|-d]\f[]
\f[B]crond [-s dir] [-c dir] [-t dir] [-m user\@host] [-M mailhandler] [-S|-L file] [-P|-p file] [-l loglevel] [-b|-f|-d]\f[]
.SH OPTIONS
.PP
\f[B]crond\f[] is a background daemon that parses individual
Expand Down Expand Up @@ -69,6 +69,16 @@ log to specified file instead of syslog.
.RS
.RE
.TP
.B -P
do not create a process-id file.
.RS
.RE
.TP
.B -L file
Write process-id to specified file instead of /var/run/crond.pi
.RS
.RE
.TP
.B -l loglevel
log events at the specified, or more important, loglevels.
The default is `notice'.
Expand Down
3 changes: 3 additions & 0 deletions defs.h
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,9 @@
#ifndef CRONTABS
#define CRONTABS "/var/spool/cron/crontabs"
#endif
#ifndef PIDFILE
#define PIDFILE "/var/run/crond.pid"
#endif
#ifndef CRONSTAMPS
#define CRONSTAMPS "/var/spool/cron/cronstamps"
#endif
Expand Down
64 changes: 56 additions & 8 deletions main.c
Original file line number Diff line number Diff line change
Expand Up @@ -32,11 +32,13 @@ short DebugOpt = 0;
short LogLevel = LOG_LEVEL;
short ForegroundOpt = 0;
short SyslogOpt = 1;
short PidFileOpt = 1;
const char *CDir = CRONTABS;
const char *SCDir = SCRONTABS;
const char *TSDir = CRONSTAMPS;
const char *LogFile = NULL; /* opened with mode 0600 */
const char *LogHeader = LOGHEADER;
const char *PidFile = PIDFILE;
const char *SendMail = NULL;
const char *Mailto = NULL;
char *TempDir;
Expand Down Expand Up @@ -72,7 +74,7 @@ main(int ac, char **av)

opterr = 0;

while ((i = getopt(ac,av,"dl:L:fbSc:s:m:M:t:")) != -1) {
while ((i = getopt(ac,av,"dl:L:fbSc:s:m:M:t:Pp:")) != -1) {
switch (i) {
case 'l':
{
Expand Down Expand Up @@ -161,19 +163,28 @@ main(int ac, char **av)
case 'm':
if (*optarg != 0) Mailto = optarg;
break;
case 'P':
PidFileOpt = 0;
break;
case 'p':
PidFileOpt = 1;
PidFile = optarg;
break;
default:
/*
* check for parse error
*/
printf("dillon's cron daemon " VERSION "\n");
printf("crond [-s dir] [-c dir] [-t dir] [-m user@host] [-M mailer] [-S|-L [file]] [-l level] [-b|-f|-d]\n");
printf("crond [-s dir] [-c dir] [-t dir] [-m user@host] [-M mailer] [-S|-L [file]] [-P|-p [file]] [-l level] [-b|-f|-d]\n");
printf("-s directory of system crontabs (defaults to %s)\n", SCRONTABS);
printf("-c directory of per-user crontabs (defaults to %s)\n", CRONTABS);
printf("-t directory of timestamps (defaults to %s)\n", CRONSTAMPS);
printf("-m user@host where should cron output be directed? (defaults to local user)\n");
printf("-M mailer (defaults to %s)\n", SENDMAIL);
printf("-S log to syslog using identity '%s' (default)\n", LOG_IDENT);
printf("-L file log to specified file instead of syslog\n");
printf("-P do not create process-id file\n");
printf("-p file write pid to specified file instead of %s\n", PIDFILE);
printf("-l loglevel log events <= this level (defaults to %s (level %d))\n", LevelAry[LOG_LEVEL], LOG_LEVEL);
printf("-b run in background (default)\n");
printf("-f run in foreground\n");
Expand Down Expand Up @@ -219,16 +230,48 @@ main(int ac, char **av)

int fd;
int pid;
int pipe_fd[2];
int status;

if (pipe(pipe_fd) < 0) {
//pipe failed
perror("pipe");
exit(1);
}

if ((pid = fork()) < 0) {
/* fork failed */
perror("fork");
exit(1);
} else if (pid > 0) {
/* parent */
exit(0);
}
/* parent, reads from pipe */
close(pipe_fd[1]);
if (read(pipe_fd[0], &status, sizeof(status)) > 0) {
exit(status);
}
/* error: got zero bytes, so child just closed the write end */
exit(1);
}

/* child continues */
close(pipe_fd[0]);
status = 0;

/* write pid file or exit */

if (PidFileOpt) {
if ((fd = open(PidFile, O_WRONLY|O_CREAT|O_TRUNC, 0644)) < 0) {
status = errno;
fprintf(stderr, "failed to open PID file '%s', reason: %s\n", PidFile, strerror(status));
goto daemon_error;
}
if (fdprintf(fd, "%d\n", getpid()) < 0) {
status = errno;
fprintf(stderr, "failed to write PID file '%s', reason: %s\n", PidFile, strerror(status));
goto daemon_error;
}
close(fd);
}

/* become session leader, detach from terminal */

Expand Down Expand Up @@ -260,11 +303,16 @@ main(int ac, char **av)
fclose(stderr);
dup2(fd, 2);
} else {
int n = errno;
fdprintf(2, "failed to open logfile '%s', reason: %s\n", LogFile, strerror(n));
exit(n);
status = errno;
fdprintf(2, "failed to open logfile '%s', reason: %s\n", LogFile, strerror(errno));
goto daemon_error;
}
}
daemon_error:
write(pipe_fd[1], &status, sizeof(status));
if (status != 0) {
exit(status);
}
} else {
/* daemon in foreground */

Expand Down
9 changes: 6 additions & 3 deletions subs.c
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@

Prototype void printlogf(int level, const char *ctl, ...);
Prototype void fdprintlogf(int level, int fd, const char *ctl, ...);
Prototype void fdprintf(int fd, const char *ctl, ...);
Prototype int fdprintf(int fd, const char *ctl, ...);
Prototype void initsignals(void);
Prototype char Hostname[SMALL_BUFFER];

Expand Down Expand Up @@ -40,16 +40,19 @@ fdprintlogf(int level, int fd, const char *ctl, ...)
va_end(va);
}

void
int
fdprintf(int fd, const char *ctl, ...)
{
va_list va;
char buf[LOG_BUFFER];
int n;

va_start(va, ctl);
vsnprintf(buf, sizeof(buf), ctl, va);
write(fd, buf, strlen(buf));
n = write(fd, buf, strlen(buf));
va_end(va);

return n;
}

void
Expand Down

0 comments on commit 3779c04

Please sign in to comment.