From 3abb526f86a27b005f352fb91f605228876fa8f7 Mon Sep 17 00:00:00 2001 From: mckusick Date: Wed, 17 Jul 2002 02:03:19 +0000 Subject: Change utimes to set the file creation time (for filesystems that support creation times such as UFS2) to the value of the modification time if the value of the modification time is older than the current creation time. See utimes(2) for further details. Sponsored by: DARPA & NAI Labs. --- sbin/restore/dirs.c | 18 ++++++++++++------ sbin/restore/restore.h | 2 ++ sbin/restore/tape.c | 28 +++++++++++++++++++--------- 3 files changed, 33 insertions(+), 15 deletions(-) (limited to 'sbin/restore') diff --git a/sbin/restore/dirs.c b/sbin/restore/dirs.c index 323e9ff..dba5738 100644 --- a/sbin/restore/dirs.c +++ b/sbin/restore/dirs.c @@ -82,7 +82,8 @@ static struct inotab *inotab[HASHSIZE]; */ struct modeinfo { ino_t ino; - struct timeval timep[2]; + struct timeval ctimep[2]; + struct timeval mtimep[2]; mode_t mode; uid_t uid; gid_t gid; @@ -597,7 +598,8 @@ setdirmodes(int flags) if (!Nflag) { (void) chown(cp, node.uid, node.gid); (void) chmod(cp, node.mode); - utimes(cp, node.timep); + utimes(cp, node.ctimep); + utimes(cp, node.mtimep); (void) chflags(cp, node.flags); } ep->e_flags &= ~NEW; @@ -685,10 +687,14 @@ allocinotab(struct context *ctxp, long seekpt) if (mf == NULL) return (itp); node.ino = ctxp->ino; - node.timep[0].tv_sec = ctxp->atime_sec; - node.timep[0].tv_usec = ctxp->atime_nsec / 1000; - node.timep[1].tv_sec = ctxp->mtime_sec; - node.timep[1].tv_usec = ctxp->mtime_nsec / 1000; + node.mtimep[0].tv_sec = ctxp->atime_sec; + node.mtimep[0].tv_usec = ctxp->atime_nsec / 1000; + node.mtimep[1].tv_sec = ctxp->mtime_sec; + node.mtimep[1].tv_usec = ctxp->mtime_nsec / 1000; + node.ctimep[0].tv_sec = ctxp->atime_sec; + node.ctimep[0].tv_usec = ctxp->atime_nsec / 1000; + node.ctimep[1].tv_sec = ctxp->birthtime_sec; + node.ctimep[1].tv_usec = ctxp->birthtime_nsec / 1000; node.mode = ctxp->mode; node.flags = ctxp->file_flags; node.uid = ctxp->uid; diff --git a/sbin/restore/restore.h b/sbin/restore/restore.h index cb10d81..6aff827 100644 --- a/sbin/restore/restore.h +++ b/sbin/restore/restore.h @@ -113,8 +113,10 @@ struct context { int rdev; /* device number of file */ time_t atime_sec; /* access time seconds */ time_t mtime_sec; /* modified time seconds */ + time_t birthtime_sec; /* creation time seconds */ int atime_nsec; /* access time nanoseconds */ int mtime_nsec; /* modified time nanoseconds */ + int birthtime_nsec; /* creation time nanoseconds */ off_t size; /* size of file */ char *name; /* name of file */ } curfile; diff --git a/sbin/restore/tape.c b/sbin/restore/tape.c index 2b2ab91..1392f59 100644 --- a/sbin/restore/tape.c +++ b/sbin/restore/tape.c @@ -521,15 +521,19 @@ extractfile(char *name) { int flags; mode_t mode; - struct timeval timep[2]; + struct timeval mtimep[2], ctimep[2]; struct entry *ep; curfile.name = name; curfile.action = USING; - timep[0].tv_sec = curfile.atime_sec; - timep[0].tv_usec = curfile.atime_nsec / 1000; - timep[1].tv_sec = curfile.mtime_sec; - timep[1].tv_usec = curfile.mtime_nsec / 1000; + mtimep[0].tv_sec = curfile.atime_sec; + mtimep[0].tv_usec = curfile.atime_nsec / 1000; + mtimep[1].tv_sec = curfile.mtime_sec; + mtimep[1].tv_usec = curfile.mtime_nsec / 1000; + ctimep[0].tv_sec = curfile.atime_sec; + ctimep[0].tv_usec = curfile.atime_nsec / 1000; + ctimep[1].tv_sec = curfile.birthtime_sec; + ctimep[1].tv_usec = curfile.birthtime_nsec / 1000; mode = curfile.mode; flags = curfile.file_flags; switch (mode & IFMT) { @@ -567,7 +571,8 @@ extractfile(char *name) if (linkit(lnkbuf, name, SYMLINK) == GOOD) { (void) lchown(name, curfile.uid, curfile.gid); (void) lchmod(name, mode); - (void) lutimes(name, timep); + (void) lutimes(name, ctimep); + (void) lutimes(name, mtimep); return (GOOD); } return (FAIL); @@ -588,7 +593,8 @@ extractfile(char *name) } (void) chown(name, curfile.uid, curfile.gid); (void) chmod(name, mode); - (void) utimes(name, timep); + (void) utimes(name, ctimep); + (void) utimes(name, mtimep); (void) chflags(name, flags); skipfile(); return (GOOD); @@ -610,7 +616,8 @@ extractfile(char *name) } (void) chown(name, curfile.uid, curfile.gid); (void) chmod(name, mode); - (void) utimes(name, timep); + (void) utimes(name, ctimep); + (void) utimes(name, mtimep); (void) chflags(name, flags); skipfile(); return (GOOD); @@ -634,7 +641,8 @@ extractfile(char *name) (void) fchmod(ofile, mode); getfile(xtrfile, xtrskip); (void) close(ofile); - utimes(name, timep); + (void) utimes(name, ctimep); + (void) utimes(name, mtimep); (void) chflags(name, flags); return (GOOD); } @@ -1174,6 +1182,8 @@ findinode(struct s_spcl *header) curfile.atime_nsec = header->c_atimensec; curfile.mtime_sec = header->c_mtime; curfile.mtime_nsec = header->c_mtimensec; + curfile.birthtime_sec = header->c_birthtime; + curfile.birthtime_nsec = header->c_birthtimensec; curfile.size = header->c_size; curfile.ino = header->c_inumber; break; -- cgit v1.1