]> Zhao Yanbai Git Server - minix.git/commitdiff
Added time.c
authorJorrit Herder <jnherder@minix3.org>
Tue, 31 May 2005 10:57:19 +0000 (10:57 +0000)
committerJorrit Herder <jnherder@minix3.org>
Tue, 31 May 2005 10:57:19 +0000 (10:57 +0000)
servers/pm/time.c [new file with mode: 0644]

diff --git a/servers/pm/time.c b/servers/pm/time.c
new file mode 100644 (file)
index 0000000..626fcd3
--- /dev/null
@@ -0,0 +1,86 @@
+/* This file takes care of those system calls that deal with time.
+ *
+ * The entry points into this file are
+ *   do_time:          perform the TIME system call
+ *   do_stime:         perform the STIME system call
+ *   do_tims:          perform the TIMES system call
+ */
+
+#include "pm.h"
+#include <minix/callnr.h>
+#include <minix/com.h>
+#include <signal.h>
+#include "mproc.h"
+#include "param.h"
+
+PRIVATE time_t boottime;
+
+
+/*===========================================================================*
+ *                             do_time                                      *
+ *===========================================================================*/
+PUBLIC int do_time()
+{
+/* Perform the time(tp) system call. This returns the time in seconds since 
+ * 1.1.1970.  MINIX is an astrophysically naive system that assumes the earth 
+ * rotates at a constant rate and that such things as leap seconds do not 
+ * exist.
+ */
+  clock_t uptime;
+  int s;
+
+  if ( (s=sys_getuptime(&uptime)) != OK) 
+       panic("PM: warning, do_time couldn't get uptime", s);
+
+  mp->mp_reply.reply_time = (time_t) (boottime + (uptime/HZ));
+  return(OK);
+}
+
+
+/*===========================================================================*
+ *                             do_stime                                     *
+ *===========================================================================*/
+PUBLIC int do_stime()
+{
+/* Perform the stime(tp) system call. Retrieve the system's uptime (ticks 
+ * since boot) and store the time in seconds at system boot in the global
+ * variable 'boottime'.
+ */
+  clock_t uptime;
+  int s;
+
+  if (mp->mp_effuid != SUPER_USER) { 
+      return(EPERM);
+  }
+  if ( (s=sys_getuptime(&uptime)) != OK) 
+      panic("PM: warning, do_stime couldn't get uptime", s);
+  boottime = (long) m_in.stime - (uptime/HZ);
+
+  /* Also inform FS about the new system time. */
+  tell_fs(STIME, boottime, 0, 0);
+
+  return(OK);
+}
+
+
+/*===========================================================================*
+ *                             do_times                                             *
+ *===========================================================================*/
+PUBLIC int do_times()
+{
+/* Perform the times(buffer) system call. */
+  register struct mproc *rmp = mp;
+  clock_t t[5];
+  int s;
+
+  if (OK != (s=sys_times(who, t)))
+      panic("PM: warning, do_times couldn't get times", s);
+  rmp->mp_reply.reply_t1 = t[0];               /* user time */
+  rmp->mp_reply.reply_t2 = t[1];               /* system time */
+  rmp->mp_reply.reply_t3 = rmp->mp_child_utime;        /* child user time */
+  rmp->mp_reply.reply_t4 = rmp->mp_child_stime;        /* child system time */
+  rmp->mp_reply.reply_t5 = t[4];               /* uptime since boot */
+
+  return(OK);
+}
+