int utimensat3d(int dir, const char* path, const struct timespec* tms, int flags) { register char* sp; register int r; time_t atime; time_t mtime; #if FS Mount_t* mp; #endif if (state.in_2d) return(UTIMETS(path, tms)); if (tms) { atime = atimeof(tms); mtime = mtimeof(tms); } else atime = mtime = time((time_t*)0); #if FS if (!fscall(NiL, MSG_utime, 0, path, atime, mtime)) return(state.ret); mp = monitored(); #endif if (dir != AT_FDCWD && *path != '/') sp = (char*)path; else if (!(sp = pathreal(path, P_TOP, NiL))) return(-1); r = UTIMENSAT(dir, sp, tms, flags); #if FS if (!r) { if (mp) fscall(mp, MSG_utime, 0, path, atime, mtime); for (mp = state.global; mp; mp = mp->global) if (fssys(mp, MSG_utime)) fscall(mp, MSG_utime, 0, path, atime, mtime); } #endif return(r); }
ulong timeof(char *name, int force) { Symtab *sym; ulong t; if(utfrune(name, '(')) return atimeof(force, name); /* archive */ if(force) return mtime(name); sym = symlook(name, S_TIME, 0); if (sym) return sym->u.value; /* uggh */ t = mkmtime(name, 0); if(t == 0) return 0; symlook(name, S_TIME, (void*)t); /* install time in cache */ return t; }