diff --git a/servers/pm/time.c b/servers/pm/time.c new file mode 100644 index 000000000..626fcd336 --- /dev/null +++ b/servers/pm/time.c @@ -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 +#include +#include +#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); +} +