Peter Robinson ecd5f4
diff -ur -x configure at-3.1.13.orig/atd.c at-3.1.13/atd.c
Peter Robinson ecd5f4
--- at-3.1.13.orig/atd.c	2011-11-16 11:30:22.424764253 -0500
Peter Robinson ecd5f4
+++ at-3.1.13/atd.c	2011-11-16 16:41:12.102831656 -0500
Peter Robinson ecd5f4
@@ -815,6 +815,54 @@
Peter Robinson ecd5f4
     return next_job;
Peter Robinson ecd5f4
 }
Peter Robinson ecd5f4
 
Peter Robinson ecd5f4
+#ifdef HAVE_CLOCK_GETTIME
Peter Robinson ecd5f4
+timer_t timer;
Peter Robinson ecd5f4
+struct itimerspec timeout;
Peter Robinson ecd5f4
+
Peter Robinson ecd5f4
+void timer_setup()
Peter Robinson ecd5f4
+{
Peter Robinson ecd5f4
+    struct sigevent sev;
Peter Robinson ecd5f4
+
Peter Robinson ecd5f4
+    sev.sigev_notify = SIGEV_SIGNAL;
Peter Robinson ecd5f4
+    sev.sigev_signo = SIGHUP;
Peter Robinson ecd5f4
+    sev.sigev_value.sival_ptr = &timer;
Peter Robinson ecd5f4
+
Peter Robinson ecd5f4
+    memset(&timeout, 0, sizeof(timeout));
Peter Robinson ecd5f4
+
Peter Robinson ecd5f4
+    if (timer_create(CLOCK_REALTIME, &sev, &timer) < 0)
Peter Robinson ecd5f4
+	    pabort("unable to create timer");
Peter Robinson ecd5f4
+}
Peter Robinson ecd5f4
+
Peter Robinson ecd5f4
+time_t atd_gettime()
Peter Robinson ecd5f4
+{
Peter Robinson ecd5f4
+    struct timespec curtime;
Peter Robinson ecd5f4
+
Peter Robinson ecd5f4
+    clock_gettime(CLOCK_REALTIME, &curtime);
Peter Robinson ecd5f4
+
Peter Robinson ecd5f4
+    return curtime.tv_sec;
Peter Robinson ecd5f4
+}
Peter Robinson ecd5f4
+
Peter Robinson ecd5f4
+void atd_setalarm(time_t next)
Peter Robinson ecd5f4
+{
Peter Robinson ecd5f4
+    timeout.it_value.tv_sec = next;
Peter Robinson ecd5f4
+    timer_settime(timer, TIMER_ABSTIME, &timeout, NULL);
Peter Robinson ecd5f4
+    pause();
Peter Robinson ecd5f4
+}
Peter Robinson ecd5f4
+#else
Peter Robinson ecd5f4
+void timer_setup()
Peter Robinson ecd5f4
+{
Peter Robinson ecd5f4
+}
Peter Robinson ecd5f4
+
Peter Robinson ecd5f4
+time_t atd_gettime()
Peter Robinson ecd5f4
+{
Peter Robinson ecd5f4
+    return time(NULL);
Peter Robinson ecd5f4
+}
Peter Robinson ecd5f4
+
Peter Robinson ecd5f4
+void atd_setalarm(time_t next)
Peter Robinson ecd5f4
+{
Peter Robinson ecd5f4
+    sleep(next - atd_gettime());
Peter Robinson ecd5f4
+}
Peter Robinson ecd5f4
+#endif
Peter Robinson ecd5f4
 /* Global functions */
Peter Robinson ecd5f4
 
Peter Robinson ecd5f4
 int
Peter Robinson ecd5f4
@@ -835,7 +883,6 @@
Peter Robinson ecd5f4
     struct sigaction act;
Peter Robinson ecd5f4
     struct passwd *pwe;
Peter Robinson ecd5f4
     struct group *ge;
Peter Robinson ecd5f4
-
Peter Robinson ecd5f4
 #ifdef WITH_SELINUX
Peter Robinson ecd5f4
     selinux_enabled=is_selinux_enabled();
Peter Robinson ecd5f4
 #endif
Peter Robinson ecd5f4
@@ -912,7 +959,7 @@
Peter Robinson ecd5f4
     sigaction(SIGCHLD, &act, NULL);
Peter Robinson ecd5f4
 
Peter Robinson ecd5f4
     if (!run_as_daemon) {
Peter Robinson ecd5f4
-	now = time(NULL);
Peter Robinson ecd5f4
+	now = atd_gettime();
Peter Robinson ecd5f4
 	run_loop();
Peter Robinson ecd5f4
 	exit(EXIT_SUCCESS);
Peter Robinson ecd5f4
     }
Peter Robinson ecd5f4
@@ -935,13 +982,15 @@
Peter Robinson ecd5f4
     act.sa_handler = set_term;
Peter Robinson ecd5f4
     sigaction(SIGINT, &act, NULL);
Peter Robinson ecd5f4
 
Peter Robinson ecd5f4
+    timer_setup();
Peter Robinson ecd5f4
+
Peter Robinson ecd5f4
     daemon_setup();
Peter Robinson ecd5f4
 
Peter Robinson ecd5f4
     do {
Peter Robinson ecd5f4
-	now = time(NULL);
Peter Robinson ecd5f4
+	now = atd_gettime();
Peter Robinson ecd5f4
 	next_invocation = run_loop();
Peter Robinson ecd5f4
 	if (next_invocation > now) {
Peter Robinson ecd5f4
-	    sleep(next_invocation - now);
Peter Robinson ecd5f4
+	    atd_setalarm(next_invocation);
Peter Robinson ecd5f4
 	}
Peter Robinson ecd5f4
     } while (!term_signal);
Peter Robinson ecd5f4
     daemon_cleanup();
Peter Robinson ecd5f4
diff -ur -x configure at-3.1.13.orig/config.h.in at-3.1.13/config.h.in
Peter Robinson ecd5f4
--- at-3.1.13.orig/config.h.in	2011-11-16 11:30:22.424764253 -0500
Peter Robinson ecd5f4
+++ at-3.1.13/config.h.in	2011-11-16 16:32:44.485426754 -0500
Peter Robinson ecd5f4
@@ -38,6 +38,9 @@
Peter Robinson ecd5f4
 /* Define to 1 if you have the `getloadavg' function. */
Peter Robinson ecd5f4
 #undef HAVE_GETLOADAVG
Peter Robinson ecd5f4
 
Peter Robinson ecd5f4
+/* Define to 1 if you have the `clock_gettime' function. */
Peter Robinson ecd5f4
+#undef HAVE_TIMER_CREATE
Peter Robinson ecd5f4
+
Peter Robinson ecd5f4
 /* Define to 1 if you have the <getopt.h> header file. */
Peter Robinson ecd5f4
 #undef HAVE_GETOPT_H
Peter Robinson ecd5f4
 
Peter Robinson ecd5f4
diff -ur -x configure at-3.1.13.orig/configure.ac at-3.1.13/configure.ac
Peter Robinson ecd5f4
--- at-3.1.13.orig/configure.ac	2011-11-16 11:30:22.425764254 -0500
Peter Robinson ecd5f4
+++ at-3.1.13/configure.ac	2011-11-16 16:31:29.791561747 -0500
Peter Robinson ecd5f4
@@ -274,5 +274,9 @@
Peter Robinson ecd5f4
 AC_SUBST(SELINUXLIB)
Peter Robinson ecd5f4
 AC_SUBST(WITH_SELINUX)
Peter Robinson ecd5f4
 
Peter Robinson ecd5f4
+dnl check for POSIX timer functions
Peter Robinson ecd5f4
+AC_SEARCH_LIBS([timer_create],[rt])
Peter Robinson ecd5f4
+AC_CHECK_FUNCS([timer_create])
Peter Robinson ecd5f4
+
Peter Robinson ecd5f4
 AC_CONFIG_FILES(Makefile atrun atd.8 atrun.8 at.1 at.allow.5 batch)
Peter Robinson ecd5f4
 AC_OUTPUT