xref: /plan9/sys/src/cmd/aux/flashfs/mkfs.c (revision 9a747e4fd48b9f4522c70c07e8f882a15030f964)
1*9a747e4fSDavid du Colombier #include <u.h>
2*9a747e4fSDavid du Colombier #include <libc.h>
3*9a747e4fSDavid du Colombier #include <auth.h>
4*9a747e4fSDavid du Colombier #include <fcall.h>
5*9a747e4fSDavid du Colombier #include <thread.h>
6*9a747e4fSDavid du Colombier #include <9p.h>
7*9a747e4fSDavid du Colombier #include "flashfs.h"
8*9a747e4fSDavid du Colombier 
9*9a747e4fSDavid du Colombier static void
usage(void)10*9a747e4fSDavid du Colombier usage(void)
11*9a747e4fSDavid du Colombier {
12*9a747e4fSDavid du Colombier 	fprint(2, "usage: %s [-n nsect] [-z sectsize] file\n", argv0);
13*9a747e4fSDavid du Colombier 	exits("usage");
14*9a747e4fSDavid du Colombier }
15*9a747e4fSDavid du Colombier 
16*9a747e4fSDavid du Colombier static ulong
argval(char * arg)17*9a747e4fSDavid du Colombier argval(char *arg)
18*9a747e4fSDavid du Colombier {
19*9a747e4fSDavid du Colombier 	long v;
20*9a747e4fSDavid du Colombier 	char *extra;
21*9a747e4fSDavid du Colombier 
22*9a747e4fSDavid du Colombier 	if(arg == nil)
23*9a747e4fSDavid du Colombier 		usage();
24*9a747e4fSDavid du Colombier 	v = strtol(arg, &extra, 0);
25*9a747e4fSDavid du Colombier 	if(*extra || v <= 0)
26*9a747e4fSDavid du Colombier 		usage();
27*9a747e4fSDavid du Colombier 	return v;
28*9a747e4fSDavid du Colombier }
29*9a747e4fSDavid du Colombier 
30*9a747e4fSDavid du Colombier void
main(int argc,char ** argv)31*9a747e4fSDavid du Colombier main(int argc, char **argv)
32*9a747e4fSDavid du Colombier {
33*9a747e4fSDavid du Colombier 	ulong i;
34*9a747e4fSDavid du Colombier 	int m, n;
35*9a747e4fSDavid du Colombier 	char *file;
36*9a747e4fSDavid du Colombier 	uchar hdr[MAXHDR];
37*9a747e4fSDavid du Colombier 
38*9a747e4fSDavid du Colombier 	ARGBEGIN {
39*9a747e4fSDavid du Colombier 	case 'n':
40*9a747e4fSDavid du Colombier 		nsects = argval(ARGF());
41*9a747e4fSDavid du Colombier 		break;
42*9a747e4fSDavid du Colombier 	case 'z':
43*9a747e4fSDavid du Colombier 		sectsize = argval(ARGF());
44*9a747e4fSDavid du Colombier 		break;
45*9a747e4fSDavid du Colombier 	default:
46*9a747e4fSDavid du Colombier 		usage();
47*9a747e4fSDavid du Colombier 	} ARGEND
48*9a747e4fSDavid du Colombier 
49*9a747e4fSDavid du Colombier 	if(argc != 1)
50*9a747e4fSDavid du Colombier 		usage();
51*9a747e4fSDavid du Colombier 	file = argv[0];
52*9a747e4fSDavid du Colombier 
53*9a747e4fSDavid du Colombier 	sectbuff = emalloc9p(sectsize);
54*9a747e4fSDavid du Colombier 	initdata(file, 1);
55*9a747e4fSDavid du Colombier 
56*9a747e4fSDavid du Colombier 	memmove(hdr, magic, MAGSIZE);
57*9a747e4fSDavid du Colombier 	m = putc3(&hdr[MAGSIZE], 0);
58*9a747e4fSDavid du Colombier 	n = putc3(&hdr[MAGSIZE + m], 0);
59*9a747e4fSDavid du Colombier 	clearsect(0);
60*9a747e4fSDavid du Colombier 	writedata(0, 0, hdr, MAGSIZE + m + n, 0);
61*9a747e4fSDavid du Colombier 
62*9a747e4fSDavid du Colombier 	for(i = 1; i < nsects - 1; i++)
63*9a747e4fSDavid du Colombier 		clearsect(i);
64*9a747e4fSDavid du Colombier 
65*9a747e4fSDavid du Colombier 	m = putc3(&hdr[MAGSIZE], 1);
66*9a747e4fSDavid du Colombier 	n = putc3(&hdr[MAGSIZE + m], 0);
67*9a747e4fSDavid du Colombier 	clearsect(nsects - 1);
68*9a747e4fSDavid du Colombier 	writedata(0, nsects - 1, hdr, MAGSIZE + m + n, 0);
69*9a747e4fSDavid du Colombier }
70