--- /sys/src/cmd/fossil/9fsys.c +++ /sys/src/cmd/fossil/9fsys.c @@ -369,11 +369,13 @@ static int fsysSnap(Fsys* fsys, int argc, char* argv[]) { int doarchive; - char *usage = "usage: [fsys name] snap [-a] [-s /active] [-d /archive/yyyy/mmmm]"; - char *src, *dst; + char *usage = "usage: [fsys name] snap [-a] [-s /active] [-d /archive/yyyy/mmmm] [-t time]"; + char *src, *dst, *p; + ulong t; src = nil; dst = nil; + t = 0; doarchive = 0; ARGBEGIN{ default: @@ -389,11 +391,17 @@ fsysSnap(Fsys* fsys, int argc, char* argv[]) if((src = ARGF()) == nil) return cliError(usage); break; + case 't': + p = ARGF(); + if(p == nil) + return cliError(usage); + t = strtoul(argv[0], &p, 0); + break; }ARGEND if(argc) return cliError(usage); - if(!fsSnapshot(fsys->fs, src, dst, doarchive)) + if(!fsSnapshot(fsys->fs, src, dst, doarchive, t)) return 0; return 1; @@ -1125,7 +1133,7 @@ fsysCreate(Fsys* fsys, int argc, char* argv[]) if((parent = fileOpen(fsys->fs, p)) == nil) goto out; - file = fileCreate(parent, elem, mode, argv[1]); + file = fileCreate(parent, elem, mode, argv[1], 0); fileDecRef(parent); if(file == nil){ werrstr("create %s/%s: %r", p, elem); --- /sys/src/cmd/fossil/9p.c +++ /sys/src/cmd/fossil/9p.c @@ -641,7 +641,7 @@ rTcreate(Msg* m) if(m->t.perm & DMTMP) mode |= ModeTemporary; - if((file = fileCreate(fid->file, m->t.name, mode, fid->uid)) == nil){ + if((file = fileCreate(fid->file, m->t.name, mode, fid->uid, 0)) == nil){ fidPut(fid); return 0; } --- /sys/src/cmd/fossil/9user.c +++ /sys/src/cmd/fossil/9user.c @@ -391,13 +391,13 @@ usersFileWrite(Ubox* box) if((dir = fileOpen(fs, "/active")) == nil) goto tidy0; if((file = fileWalk(dir, uidadm)) == nil) - file = fileCreate(dir, uidadm, ModeDir|0775, uidadm); + file = fileCreate(dir, uidadm, ModeDir|0775, uidadm, 0); fileDecRef(dir); if(file == nil) goto tidy; dir = file; if((file = fileWalk(dir, "users")) == nil) - file = fileCreate(dir, "users", 0664, uidadm); + file = fileCreate(dir, "users", 0664, uidadm, 0); fileDecRef(dir); if(file == nil) goto tidy; --- /sys/src/cmd/fossil/file.c +++ /sys/src/cmd/fossil/file.c @@ -405,7 +405,7 @@ fileSetTmp(File *f, int istmp) } File * -fileCreate(File *f, char *elem, ulong mode, char *uid) +fileCreate(File *f, char *elem, ulong mode, char *uid, ulong t) { File *ff; DirEntry *dir; @@ -466,7 +466,9 @@ fileCreate(File *f, char *elem, ulong mode, char *uid) dir->uid = vtstrdup(uid); dir->gid = vtstrdup(f->dir.gid); dir->mid = vtstrdup(uid); - dir->mtime = time(0L); + if (t == 0) + t = time(0L); + dir->mtime = t; dir->mcount = 0; dir->ctime = dir->mtime; dir->atime = dir->mtime; --- /sys/src/cmd/fossil/flfmt.c +++ /sys/src/cmd/fossil/flfmt.c @@ -414,7 +414,7 @@ addFile(File *root, char *name, uint mode) { File *f; - f = fileCreate(root, name, mode | ModeDir, "adm"); + f = fileCreate(root, name, mode | ModeDir, "adm", 0); if(f == nil) sysfatal("could not create file: %s: %r", name); fileDecRef(f); --- /sys/src/cmd/fossil/flfmt9660.c +++ /sys/src/cmd/fossil/flfmt9660.c @@ -379,7 +379,7 @@ iso9660copy(Fs *fs) iso9660copydir(fs, root, (Cdir*)v->rootdir); fileDecRef(root); runlock(&fs->elk); - if(!fsSnapshot(fs, nil, nil, 0)) + if(!fsSnapshot(fs, nil, nil, 0, 0)) sysfatal("snapshot failed: %r"); rlock(&fs->elk); } @@ -536,7 +536,7 @@ if(d.mode&DMDIR) print("%*scopy %s %s %s %luo\n", ind*2, "", d.name, d.uid, d.gi mode = d.mode&0777; if(d.mode&DMDIR) mode |= ModeDir; - if((f = fileCreate(dir, d.name, mode, d.uid)) == nil) + if((f = fileCreate(dir, d.name, mode, d.uid, 0)) == nil) sysfatal("could not create file '%s': %r", d.name); if(d.mode&DMDIR) iso9660copydir(fs, f, c); --- /sys/src/cmd/fossil/fs.h +++ /sys/src/cmd/fossil/fs.h @@ -29,7 +29,7 @@ int fsHalt(Fs*); Fs *fsOpen(char*, VtConn*, long, int); int fsRedial(Fs*, char*); void fsSnapshotCleanup(Fs*, u32int); -int fsSnapshot(Fs*, char*, char*, int); +int fsSnapshot(Fs*, char*, char*, int, ulong); void fsSnapshotRemove(Fs*); int fsSync(Fs*); int fsUnhalt(Fs*); @@ -40,7 +40,7 @@ DirEntryEnum *deeOpen(File*); int deeRead(DirEntryEnum*, DirEntry*); int fileClri(File*, char*, char*); int fileClriPath(Fs*, char*, char*); -File *fileCreate(File*, char*, ulong, char*); +File *fileCreate(File*, char*, ulong, char*, ulong); int fileDecRef(File*); int fileGetDir(File*, DirEntry*); uvlong fileGetId(File*);