diff --git a/sys/fs/cd9660/cd9660_node.h b/sys/fs/cd9660/cd9660_node.h --- a/sys/fs/cd9660/cd9660_node.h +++ b/sys/fs/cd9660/cd9660_node.h @@ -47,6 +47,7 @@ struct timespec iso_atime; /* time of last access */ struct timespec iso_mtime; /* time of last modification */ struct timespec iso_ctime; /* time file changed */ + struct timespec iso_birthtime; /* time file created */ u_short iso_mode; /* files access mode and type */ uid_t iso_uid; /* owner user id */ gid_t iso_gid; /* owner group id */ diff --git a/sys/fs/cd9660/cd9660_node.c b/sys/fs/cd9660/cd9660_node.c --- a/sys/fs/cd9660/cd9660_node.c +++ b/sys/fs/cd9660/cd9660_node.c @@ -184,13 +184,14 @@ * Only the first two are meaningful for struct * stat. */ - struct timespec birthtime; - - if (!cd9660_tstamp_conv17(ap->ctime, &birthtime)) - memset(&birthtime, 0, sizeof(birthtime)); + if (!cd9660_tstamp_conv17(ap->ctime, + &inop->inode.iso_birthtime)) + memset(&inop->inode.iso_birthtime, 0, + sizeof(inop->inode.iso_birthtime)); if (!cd9660_tstamp_conv17(ap->mtime, &inop->inode.iso_mtime)) - inop->inode.iso_mtime = birthtime; + inop->inode.iso_mtime = + inop->inode.iso_birthtime; inop->inode.iso_ctime = inop->inode.iso_mtime; inop->inode.iso_atime = inop->inode.iso_mtime; } else @@ -200,6 +201,7 @@ cd9660_tstamp_conv7(isodir->date,&inop->inode.iso_ctime,ftype); inop->inode.iso_atime = inop->inode.iso_ctime; inop->inode.iso_mtime = inop->inode.iso_ctime; + inop->inode.iso_birthtime = inop->inode.iso_ctime; } if (bp2) brelse(bp2); diff --git a/sys/fs/cd9660/cd9660_rrip.c b/sys/fs/cd9660/cd9660_rrip.c --- a/sys/fs/cd9660/cd9660_rrip.c +++ b/sys/fs/cd9660/cd9660_rrip.c @@ -376,14 +376,20 @@ /* Check a format of time stamp (7bytes/17bytes) */ if (!(*p->flags & ISO_SUSP_TSTAMP_FORM17)) { if (*p->flags & ISO_SUSP_TSTAMP_CREAT) { + cd9660_tstamp_conv7(ptime, + &ana->inop->inode.iso_birthtime, ISO_FTYPE_RRIP); ptime += 7; + } else { + memset(&ana->inop->inode.iso_birthtime, 0, + sizeof(struct timespec)); } if (*p->flags & ISO_SUSP_TSTAMP_MODIFY) { cd9660_tstamp_conv7(ptime, &ana->inop->inode.iso_mtime, ISO_FTYPE_RRIP); ptime += 7; } else { - memset(&ana->inop->inode.iso_mtime, 0, sizeof(struct timespec)); + ana->inop->inode.iso_mtime = + ana->inop->inode.iso_birthtime; } if (*p->flags & ISO_SUSP_TSTAMP_ACCESS) { cd9660_tstamp_conv7(ptime, &ana->inop->inode.iso_atime, @@ -400,13 +406,19 @@ } } else { if (*p->flags & ISO_SUSP_TSTAMP_CREAT) { + cd9660_tstamp_conv17(ptime, + &ana->inop->inode.iso_birthtime); ptime += 17; + } else { + memset(&ana->inop->inode.iso_birthtime, 0, + sizeof(struct timespec)); } if (*p->flags & ISO_SUSP_TSTAMP_MODIFY) { cd9660_tstamp_conv17(ptime, &ana->inop->inode.iso_mtime); ptime += 17; } else { - memset(&ana->inop->inode.iso_mtime, 0, sizeof(struct timespec)); + ana->inop->inode.iso_mtime = + ana->inop->inode.iso_birthtime; } if (*p->flags & ISO_SUSP_TSTAMP_ACCESS) { cd9660_tstamp_conv17(ptime, &ana->inop->inode.iso_atime); diff --git a/sys/fs/cd9660/cd9660_vnops.c b/sys/fs/cd9660/cd9660_vnops.c --- a/sys/fs/cd9660/cd9660_vnops.c +++ b/sys/fs/cd9660/cd9660_vnops.c @@ -191,6 +191,7 @@ vap->va_atime = ip->inode.iso_atime; vap->va_mtime = ip->inode.iso_mtime; vap->va_ctime = ip->inode.iso_ctime; + vap->va_birthtime = ip->inode.iso_birthtime; vap->va_rdev = VN_ISDEV(vp) ? ip->inode.iso_rdev : NODEV; vap->va_size = ip->i_size;