summaryrefslogtreecommitdiffstats
path: root/sbin
diff options
context:
space:
mode:
authormckusick <mckusick@FreeBSD.org>2002-07-17 02:03:19 +0000
committermckusick <mckusick@FreeBSD.org>2002-07-17 02:03:19 +0000
commit3abb526f86a27b005f352fb91f605228876fa8f7 (patch)
tree5b5d1d91499a541486f56f84b49c10edeafd66b2 /sbin
parent9498a983a938cec96851b64642f0b62bba7d1827 (diff)
downloadFreeBSD-src-3abb526f86a27b005f352fb91f605228876fa8f7.zip
FreeBSD-src-3abb526f86a27b005f352fb91f605228876fa8f7.tar.gz
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.
Diffstat (limited to 'sbin')
-rw-r--r--sbin/dump/traverse.c8
-rw-r--r--sbin/restore/dirs.c18
-rw-r--r--sbin/restore/restore.h2
-rw-r--r--sbin/restore/tape.c28
4 files changed, 37 insertions, 19 deletions
diff --git a/sbin/dump/traverse.c b/sbin/dump/traverse.c
index 733ac26..4cbce6e 100644
--- a/sbin/dump/traverse.c
+++ b/sbin/dump/traverse.c
@@ -407,8 +407,8 @@ dumpino(union dinode *dp, ino_t ino)
spcl.c_atimensec = dp->dp1.di_atimensec;
spcl.c_mtime = _time32_to_time(dp->dp1.di_mtime);
spcl.c_mtimensec = dp->dp1.di_mtimensec;
- spcl.c_createtime = 0;
- spcl.c_createtimensec = 0;
+ spcl.c_birthtime = 0;
+ spcl.c_birthtimensec = 0;
spcl.c_rdev = dp->dp1.di_rdev;
spcl.c_file_flags = dp->dp1.di_flags;
spcl.c_uid = dp->dp1.di_uid;
@@ -420,8 +420,8 @@ dumpino(union dinode *dp, ino_t ino)
spcl.c_atimensec = dp->dp2.di_atimensec;
spcl.c_mtime = _time64_to_time(dp->dp2.di_mtime);
spcl.c_mtimensec = dp->dp2.di_mtimensec;
- spcl.c_createtime = _time64_to_time(dp->dp2.di_createtime);
- spcl.c_createtimensec = dp->dp2.di_creatensec;
+ spcl.c_birthtime = _time64_to_time(dp->dp2.di_birthtime);
+ spcl.c_birthtimensec = dp->dp2.di_birthnsec;
spcl.c_rdev = dp->dp2.di_rdev;
spcl.c_file_flags = dp->dp2.di_flags;
spcl.c_uid = dp->dp2.di_uid;
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;
OpenPOWER on IntegriCloud