aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRob Austein <sra@hactrn.net>2006-10-06 21:05:22 +0000
committerRob Austein <sra@hactrn.net>2006-10-06 21:05:22 +0000
commitbb56cf8fa97f0e26b7033c1960dcd63b315a34f0 (patch)
tree8fc9cb02f4e8039918c5749edf19bcde054c72f1
parent1da6fc503663e042fdd57ec3623feb746520aa39 (diff)
lockfile
svn path=/rcynic/rcynic.c; revision=366
-rw-r--r--rcynic/rcynic.c42
1 files changed, 27 insertions, 15 deletions
diff --git a/rcynic/rcynic.c b/rcynic/rcynic.c
index 922de6e4..97526482 100644
--- a/rcynic/rcynic.c
+++ b/rcynic/rcynic.c
@@ -1229,14 +1229,15 @@ int main(int argc, char *argv[])
{
int opt_jitter = 0, use_syslog = 0, syslog_facility = 0, syslog_perror = 0;
int opt_syslog = 0, opt_stdouterr = 0, opt_level = 0, opt_perror = 0;
- char *cfg_file = "rcynic.conf", path[FILENAME_MAX];
+ char *cfg_file = "rcynic.conf", path[FILENAME_MAX], *lockfile = NULL;
+ int c, i, j, ret = 1, jitter = 600, lockfd = -1;
STACK_OF(CONF_VALUE) *cfg_section = NULL;
STACK_OF(X509) *certs = NULL;
CONF *cfg_handle = NULL;
- int c, i, j, ret = 1, jitter = 600;
- time_t start, finish;
+ time_t start = 0, finish;
unsigned long hash;
rcynic_ctx_t rc;
+ unsigned delay;
long eline;
memset(&rc, 0, sizeof(rc));
@@ -1334,6 +1335,9 @@ int main(int argc, char *argv[])
else if (!name_cmp(val->name, "rsync-program"))
rc.rsync_program = strdup(val->value);
+ else if (!name_cmp(val->name, "lockfile"))
+ lockfile = strdup(val->value);
+
else if (!opt_jitter &&
!name_cmp(val->name, "jitter") &&
!configure_integer(&rc, &jitter, val->value))
@@ -1404,21 +1408,26 @@ int main(int argc, char *argv[])
(syslog_facility ? syslog_facility : LOG_LOCAL0));
if (jitter > 0) {
- unsigned delay;
-
if (RAND_bytes((unsigned char *) &delay, sizeof(delay)) <= 0) {
logmsg(&rc, log_sys_err, "Couldn't read random bytes");
goto done;
}
-
delay %= jitter;
-
logmsg(&rc, log_telemetry, "Delaying %u seconds before startup", delay);
-
while (delay > 0)
delay = sleep(delay);
}
+ if (lockfile &&
+ ((lockfd = open(lockfile, O_RDWR|O_CREAT|O_NONBLOCK, 0666)) < 0 ||
+ lockf(lockfd, F_TLOCK, 0) < 0)) {
+ if (lockfd >= 0 && errno == EAGAIN)
+ logmsg(&rc, log_telemetry, "Lock %s held by another process", lockfile);
+ else
+ logmsg(&rc, log_sys_err, "Problem locking %s: %s", lockfile, strerror(errno));
+ goto done;
+ }
+
start = time(0);
logmsg(&rc, log_telemetry, "Starting");
@@ -1520,13 +1529,16 @@ int main(int argc, char *argv[])
free(rc.unauthenticated);
if (rc.rsync_program)
free(rc.rsync_program);
-
- finish = time(0);
-
- logmsg(&rc, log_telemetry, "Finished, elapsed time %d:%02d:%02d",
- (finish - start) / 3600,
- (finish - start) / 60 % 60,
- (finish - start) % 60);
+ if (lockfile)
+ free(lockfile);
+
+ if (start) {
+ finish = time(0);
+ logmsg(&rc, log_telemetry, "Finished, elapsed time %d:%02d:%02d",
+ (finish - start) / 3600,
+ (finish - start) / 60 % 60,
+ (finish - start) % 60);
+ }
return ret;
}