xref: /plan9/sys/src/cmd/fossil/last.c (revision e569ccb51977f66f2b762edac90ad8d00e69e6cb)
1*e569ccb5SDavid du Colombier #include <u.h>
2*e569ccb5SDavid du Colombier #include <libc.h>
3*e569ccb5SDavid du Colombier 
4*e569ccb5SDavid du Colombier void
usage(void)5*e569ccb5SDavid du Colombier usage(void)
6*e569ccb5SDavid du Colombier {
7*e569ccb5SDavid du Colombier 	fprint(2, "usage: fossil/last disk\n");
8*e569ccb5SDavid du Colombier 	exits("usage");
9*e569ccb5SDavid du Colombier }
10*e569ccb5SDavid du Colombier 
11*e569ccb5SDavid du Colombier void
main(int argc,char ** argv)12*e569ccb5SDavid du Colombier main(int argc, char **argv)
13*e569ccb5SDavid du Colombier {
14*e569ccb5SDavid du Colombier 	int fd, bs, addr;
15*e569ccb5SDavid du Colombier 	char buf[20];
16*e569ccb5SDavid du Colombier 
17*e569ccb5SDavid du Colombier 	ARGBEGIN{
18*e569ccb5SDavid du Colombier 	default:
19*e569ccb5SDavid du Colombier 		usage();
20*e569ccb5SDavid du Colombier 	}ARGEND
21*e569ccb5SDavid du Colombier 
22*e569ccb5SDavid du Colombier 	if(argc != 1)
23*e569ccb5SDavid du Colombier 		usage();
24*e569ccb5SDavid du Colombier 
25*e569ccb5SDavid du Colombier 	if((fd = open(argv[0], OREAD)) < 0)
26*e569ccb5SDavid du Colombier 		sysfatal("open %s: %r", argv[0]);
27*e569ccb5SDavid du Colombier 
28*e569ccb5SDavid du Colombier 	werrstr("end of file");
29*e569ccb5SDavid du Colombier 	if(seek(fd, 131072, 0) < 0 || readn(fd, buf, 20) != 20)
30*e569ccb5SDavid du Colombier 		sysfatal("error reading %s: %r", argv[0]);
31*e569ccb5SDavid du Colombier 	fmtinstall('H', encodefmt);
32*e569ccb5SDavid du Colombier 	if(memcmp(buf, "\x37\x76\xAE\x89", 4) != 0)
33*e569ccb5SDavid du Colombier 		sysfatal("bad magic %.4H != 3776AE89", buf);
34*e569ccb5SDavid du Colombier 	bs = buf[7]|(buf[6]<<8);
35*e569ccb5SDavid du Colombier 	addr = (buf[8]<<24)|(buf[9]<<16)|(buf[10]<<8)|buf[11];
36*e569ccb5SDavid du Colombier 	if(seek(fd, (vlong)bs*addr+34, 0) < 0 || readn(fd, buf, 20) != 20)
37*e569ccb5SDavid du Colombier 		sysfatal("error reading %s: %r", argv[0]);
38*e569ccb5SDavid du Colombier 	print("vac:%.20lH\n", buf);
39*e569ccb5SDavid du Colombier 	exits(0);
40*e569ccb5SDavid du Colombier }
41