/* This file takes care of those system calls that deal with time. * * The entry points into this file are * do_utime: perform the UTIME system call * do_stime: PM informs FS about STIME system call */ #include "fs.h" #include #include #include "file.h" #include "fproc.h" #include "param.h" #include #include "vmnt.h" /*===========================================================================* * do_utime * *===========================================================================*/ PUBLIC int do_utime() { /* Perform the utime(name, timep) system call. */ register int len; struct utime_req req; struct lookup_req lookup_req; struct node_details res; int r; /* Adjust for case of 'timep' being NULL; * utime_strlen then holds the actual size: strlen(name)+1. */ len = m_in.utime_length; if (len == 0) len = m_in.utime_strlen; if (fetch_name(m_in.utime_file, len, M1) != OK) return(err_code); /* Fill in lookup request fields */ lookup_req.path = user_fullpath; lookup_req.lastc = NULL; lookup_req.flags = EAT_PATH; /* Request lookup */ if ((r = lookup(&lookup_req, &res)) != OK) return r; /* Fill in request fields.*/ if (m_in.utime_length == 0) { req.actime = 0; req.modtime = clock_time(); } else { req.actime = m_in.utime_actime; req.modtime = m_in.utime_modtime; } req.fs_e = res.fs_e; req.inode_nr = res.inode_nr; req.uid = fp->fp_effuid; req.gid = fp->fp_effgid; /* Issue request */ return req_utime(&req); } /*===========================================================================* * do_stime * *===========================================================================*/ PUBLIC int do_stime() { struct vmnt *vmp; /* Perform the stime(tp) system call. */ boottime = (long) m_in.pm_stime; /* Send new time for all FS processes */ for (vmp = &vmnt[0]; vmp < &vmnt[NR_MNTS]; ++vmp) { if (vmp->m_fs_e) req_stime(vmp->m_fs_e, boottime); } return OK; }