Overhaul the daemon uptime functions.
[paraslash.git] / daemon.c
index b7a0a32..ffdec4e 100644 (file)
--- a/daemon.c
+++ b/daemon.c
@@ -26,7 +26,6 @@ struct daemon {
        char *logfile_name;
        /** Current loglevel, see \ref daemon_set_loglevel(). */
        int loglevel;
-
        /** Used by \ref server_uptime() and \ref uptime_str(). */
        time_t startuptime;
        /** The file pointer if the logfile is open. */
@@ -277,43 +276,59 @@ void drop_privileges_or_die(const char *username, const char *groupname)
 }
 
 /**
- * Set/get the server uptime.
+ * Set the server startup time.
+ *
+ * \param startuptime The value to store as the server start time.
  *
- * \param set_or_get Chose one of the two modes.
+ * This should be called once on startup with \a startuptime either NULL or a
+ * pointer to a struct timeval which contains the current time. If \a
+ * startuptime is NULL, the server start time is set to the current time.
  *
- * This should be called at startup time with \a set_or_get equal to \p
- * UPTIME_SET which sets the uptime to zero.  Subsequent calls with \a
- * set_or_get equal to \p UPTIME_GET return the uptime.
+ * \sa time(2), difftime(3) \ref get_server_uptime(), \ref
+ * get_server_uptime_str().
+ */
+void set_server_start_time(const struct timeval *startuptime)
+{
+       if (startuptime)
+               me->startuptime = startuptime->tv_sec;
+       else
+               time(&me->startuptime);
+}
 
- * \return Zero if called with \a set_or_get equal to \p UPTIME_SET, the number
- * of seconds elapsed since the last reset otherwise.
+/**
+ * Get the server uptime.
+ *
+ * \param current_time The current time.
+ *
+ * The \a current_time pointer may be \p NULL. In this case the function
+ * obtains the current time from the system.
  *
- * \sa time(2), difftime(3).
+ * \return This returns the server uptime in seconds, i.e. the difference
+ * between the current time and the value stored previously via \ref
+ * set_server_start_time().
  */
-time_t server_uptime(enum uptime set_or_get)
+time_t get_server_uptime(const struct timeval *current_time)
 {
-       time_t now;
-       double diff;
+       time_t t;
 
-       if (set_or_get == UPTIME_SET) {
-               time(&me->startuptime);
-               return 0;
-       }
-       time(&now);
-       diff = difftime(now, me->startuptime);
-       return (time_t) diff;
+       if (current_time)
+               return current_time->tv_sec - me->startuptime;
+       time(&t);
+       return difftime(t, me->startuptime);
 }
 
 /**
- * Construct string containing uptime.
+ * Construct a string containing the current uptime.
+ *
+ * \param current_time See a \ref get_server_uptime().
  *
  * \return A dynamically allocated string of the form "days:hours:minutes".
  *
  * \sa server_uptime.
  */
-__malloc char *uptime_str(void)
+__malloc char *get_server_uptime_str(const struct timeval *current_time)
 {
-       long t = server_uptime(UPTIME_GET);
+       long t = get_server_uptime(current_time);
        return make_message("%li:%02li:%02li", t / 86400,
                (t / 3600) % 24, (t / 60) % 60);
 }