Marcela Mašláňová 5b86b9
diff -up at-3.1.14/atd.c.timers at-3.1.14/atd.c
Marcela Mašláňová 5b86b9
--- at-3.1.14/atd.c.timers	2013-12-02 11:03:01.250080057 +0100
Marcela Mašláňová 5b86b9
+++ at-3.1.14/atd.c	2013-12-02 11:06:15.560243498 +0100
Marcela Mašláňová 5b86b9
@@ -831,6 +831,54 @@ run_loop()
Marcela Mašláňová 5b86b9
     return next_job;
Marcela Mašláňová 5b86b9
 }
Marcela Mašláňová 5b86b9
 
Marcela Mašláňová 5b86b9
+#ifdef HAVE_CLOCK_GETTIME
Marcela Mašláňová 5b86b9
+timer_t timer;
Marcela Mašláňová 5b86b9
+struct itimerspec timeout;
Marcela Mašláňová 5b86b9
+
Marcela Mašláňová 5b86b9
+void timer_setup()
Marcela Mašláňová 5b86b9
+{
Marcela Mašláňová 5b86b9
+    struct sigevent sev;
Marcela Mašláňová 5b86b9
+
Marcela Mašláňová 5b86b9
+    sev.sigev_notify = SIGEV_SIGNAL;
Marcela Mašláňová 5b86b9
+    sev.sigev_signo = SIGHUP;
Marcela Mašláňová 5b86b9
+    sev.sigev_value.sival_ptr = &timer;
Marcela Mašláňová 5b86b9
+
Marcela Mašláňová 5b86b9
+    memset(&timeout, 0, sizeof(timeout));
Marcela Mašláňová 5b86b9
+
Marcela Mašláňová 5b86b9
+    if (timer_create(CLOCK_REALTIME, &sev, &timer) < 0)
Marcela Mašláňová 5b86b9
+           pabort("unable to create timer");
Marcela Mašláňová 5b86b9
+}
Marcela Mašláňová 5b86b9
+
Marcela Mašláňová 5b86b9
+time_t atd_gettime()
Marcela Mašláňová 5b86b9
+{
Marcela Mašláňová 5b86b9
+    struct timespec curtime;
Marcela Mašláňová 5b86b9
+
Marcela Mašláňová 5b86b9
+    clock_gettime(CLOCK_REALTIME, &curtime);
Marcela Mašláňová 5b86b9
+
Marcela Mašláňová 5b86b9
+    return curtime.tv_sec;
Marcela Mašláňová 5b86b9
+}
Marcela Mašláňová 5b86b9
+
Marcela Mašláňová 5b86b9
+void atd_setalarm(time_t next)
Marcela Mašláňová 5b86b9
+{
Marcela Mašláňová 5b86b9
+    timeout.it_value.tv_sec = next;
Marcela Mašláňová 5b86b9
+    timer_settime(timer, TIMER_ABSTIME, &timeout, NULL);
Marcela Mašláňová 5b86b9
+    pause();
Marcela Mašláňová 5b86b9
+}
Marcela Mašláňová 5b86b9
+#else
Marcela Mašláňová 5b86b9
+void timer_setup()
Marcela Mašláňová 5b86b9
+{
Marcela Mašláňová 5b86b9
+}
Marcela Mašláňová 5b86b9
+
Marcela Mašláňová 5b86b9
+time_t atd_gettime()
Marcela Mašláňová 5b86b9
+{
Marcela Mašláňová 5b86b9
+    return time(NULL);
Marcela Mašláňová 5b86b9
+}
Marcela Mašláňová 5b86b9
+
Marcela Mašláňová 5b86b9
+void atd_setalarm(time_t next)
Marcela Mašláňová 5b86b9
+{
Marcela Mašláňová 5b86b9
+    sleep(next - atd_gettime());
Marcela Mašláňová 5b86b9
+}
Marcela Mašláňová 5b86b9
+#endif
Marcela Mašláňová 5b86b9
 /* Global functions */
Marcela Mašláňová 5b86b9
 
Marcela Mašláňová 5b86b9
 int
Marcela Mašláňová 5b86b9
@@ -936,7 +984,7 @@ main(int argc, char *argv[])
Marcela Mašláňová 5b86b9
     sigaction(SIGCHLD, &act, NULL);
Marcela Mašláňová 5b86b9
 
Marcela Mašláňová 5b86b9
     if (!run_as_daemon) {
Marcela Mašláňová 5b86b9
-	now = time(NULL);
Marcela Mašláňová 5b86b9
+	now = atd_gettime();
Marcela Mašláňová 5b86b9
 	run_loop();
Marcela Mašláňová 5b86b9
 	exit(EXIT_SUCCESS);
Marcela Mašláňová 5b86b9
     }
Marcela Mašláňová 5b86b9
@@ -959,13 +1007,14 @@ main(int argc, char *argv[])
Marcela Mašláňová 5b86b9
     act.sa_handler = set_term;
Marcela Mašláňová 5b86b9
     sigaction(SIGINT, &act, NULL);
Marcela Mašláňová 5b86b9
 
Marcela Mašláňová 5b86b9
+    timer_setup();
Marcela Mašláňová 5b86b9
     daemon_setup();
Marcela Mašláňová 5b86b9
 
Marcela Mašláňová 5b86b9
     do {
Marcela Mašláňová 5b86b9
-	now = time(NULL);
Marcela Mašláňová 5b86b9
+	now = atd_gettime();
Marcela Mašláňová 5b86b9
 	next_invocation = run_loop();
Marcela Mašláňová 5b86b9
 	if (next_invocation > now) {
Marcela Mašláňová 5b86b9
-	    sleep(next_invocation - now);
Marcela Mašláňová 5b86b9
+	    atd_setalarm(next_invocation);
Marcela Mašláňová 5b86b9
 	}
Marcela Mašláňová 5b86b9
     } while (!term_signal);
Marcela Mašláňová 5b86b9
     daemon_cleanup();
Marcela Mašláňová 5b86b9
diff -up at-3.1.14/config.h.in.timers at-3.1.14/config.h.in
Marcela Mašláňová 5b86b9
--- at-3.1.14/config.h.in.timers	2013-12-02 11:00:27.000000000 +0100
Marcela Mašláňová 5b86b9
+++ at-3.1.14/config.h.in	2013-12-02 11:02:06.521033976 +0100
Marcela Mašláňová 5b86b9
@@ -38,6 +38,9 @@
Marcela Mašláňová 5b86b9
 /* Define to 1 if you have the `getloadavg' function. */
Marcela Mašláňová 5b86b9
 #undef HAVE_GETLOADAVG
Marcela Mašláňová 5b86b9
 
Marcela Mašláňová 5b86b9
+/* Define to 1 if you have the `clock_gettime' function. */
Marcela Mašláňová 5b86b9
+#undef HAVE_TIMER_CREATE
Marcela Mašláňová 5b86b9
+
Marcela Mašláňová 5b86b9
 /* Define to 1 if you have the <getopt.h> header file. */
Marcela Mašláňová 5b86b9
 #undef HAVE_GETOPT_H
Marcela Mašláňová 5b86b9
 
Marcela Mašláňová 5b86b9
diff -up at-3.1.14/configure.ac.timers at-3.1.14/configure.ac
Marcela Mašláňová 5b86b9
--- at-3.1.14/configure.ac.timers	2013-12-02 11:00:27.000000000 +0100
Marcela Mašláňová 5b86b9
+++ at-3.1.14/configure.ac	2013-12-02 11:02:45.217066560 +0100
Marcela Mašláňová 5b86b9
@@ -254,6 +254,10 @@ AC_CHECK_LIB(selinux, is_selinux_enabled
Marcela Mašláňová 5b86b9
 AC_SUBST(SELINUXLIB)
Marcela Mašláňová 5b86b9
 AC_SUBST(WITH_SELINUX)
Marcela Mašláňová 5b86b9
 
Marcela Mašláňová 5b86b9
+dnl check for POSIX timer functions
Marcela Mašláňová 5b86b9
+AC_SEARCH_LIBS([timer_create],[rt])
Marcela Mašláňová 5b86b9
+AC_CHECK_FUNCS([timer_create])
Marcela Mašláňová 5b86b9
+
Marcela Mašláňová 5b86b9
 AC_MSG_CHECKING(groupname to run under)
Marcela Mašláňová 5b86b9
 AC_ARG_WITH(daemon_groupname,
Marcela Mašláňová 5b86b9
 [ --with-daemon_groupname=DAEMON_GROUPNAME	Groupname to run under (default daemon) ],