xref: /plan9/sys/src/cmd/swap.c (revision 9a747e4fd48b9f4522c70c07e8f882a15030f964)
13e12c5d1SDavid du Colombier #include <u.h>
23e12c5d1SDavid du Colombier #include <libc.h>
33e12c5d1SDavid du Colombier 
43e12c5d1SDavid du Colombier void error(char *);
53e12c5d1SDavid du Colombier 
63e12c5d1SDavid du Colombier void
main(int argc,char ** argv)73e12c5d1SDavid du Colombier main(int argc, char **argv)
83e12c5d1SDavid du Colombier {
9*9a747e4fSDavid du Colombier 	Dir *d;
103e12c5d1SDavid du Colombier 	int swapfd, cswfd;
113e12c5d1SDavid du Colombier 	char buf[128], *p;
123e12c5d1SDavid du Colombier 	int i, j;
133e12c5d1SDavid du Colombier 
143e12c5d1SDavid du Colombier 	if(argc != 2) {
153e12c5d1SDavid du Colombier 		print("Usage: swap path\n");
163e12c5d1SDavid du Colombier 		exits("swap: failed");
173e12c5d1SDavid du Colombier 	}
183e12c5d1SDavid du Colombier 
19*9a747e4fSDavid du Colombier 	d = dirstat(argv[1]);
20*9a747e4fSDavid du Colombier 	if(d == nil){
213e12c5d1SDavid du Colombier 		print("swap: can't stat %s: %r\n", argv[1]);
223e12c5d1SDavid du Colombier 		exits("swap: failed");
233e12c5d1SDavid du Colombier 	}
24*9a747e4fSDavid du Colombier 	if(d->type != 'M'){		/* kernel device */
253e12c5d1SDavid du Colombier 		swapfd = open(argv[1], ORDWR);
263e12c5d1SDavid du Colombier 		p = argv[1];
273e12c5d1SDavid du Colombier 	}
283e12c5d1SDavid du Colombier 	else {
293e12c5d1SDavid du Colombier 		p = getenv("sysname");
303e12c5d1SDavid du Colombier 		if(p == 0)
313e12c5d1SDavid du Colombier 			p = "swap";
323e12c5d1SDavid du Colombier 		sprint(buf, "%s/%sXXXXXXX", argv[1], p);
333e12c5d1SDavid du Colombier 		p = mktemp(buf);
343e12c5d1SDavid du Colombier 		swapfd = create(p, ORDWR|ORCLOSE, 0600);
353e12c5d1SDavid du Colombier 	}
363e12c5d1SDavid du Colombier 
373e12c5d1SDavid du Colombier 	if(swapfd < 0 || (p[0] == '/' && p[1] == '\0')) {
383e12c5d1SDavid du Colombier 		print("swap: failed to make a file: %r\n");
393e12c5d1SDavid du Colombier 		exits("swap: failed");
403e12c5d1SDavid du Colombier 	}
413e12c5d1SDavid du Colombier 
423e12c5d1SDavid du Colombier 	i = create("/env/swap", OWRITE, 0666);
433e12c5d1SDavid du Colombier 	if(i < 0)
443e12c5d1SDavid du Colombier 		error("open /env/swap");
453e12c5d1SDavid du Colombier 
463e12c5d1SDavid du Colombier 	if(write(i, p, strlen(p)) != strlen(p))
473e12c5d1SDavid du Colombier 		error("sysname");
483e12c5d1SDavid du Colombier 	close(i);
49219b2ee8SDavid du Colombier 	print("swap: %s\n", p);
503e12c5d1SDavid du Colombier 
513e12c5d1SDavid du Colombier 	cswfd = open("/dev/swap", OWRITE);
523e12c5d1SDavid du Colombier 	if(cswfd < 0)
533e12c5d1SDavid du Colombier 		error("open: /dev/swap");
543e12c5d1SDavid du Colombier 
553e12c5d1SDavid du Colombier 	j = sprint(buf, "%d", swapfd);
563e12c5d1SDavid du Colombier 	if(write(cswfd, buf, j) != j)
573e12c5d1SDavid du Colombier 		error("write: /dev/swap");
58219b2ee8SDavid du Colombier 	exits(0);
593e12c5d1SDavid du Colombier }
603e12c5d1SDavid du Colombier 
613e12c5d1SDavid du Colombier void
error(char * s)623e12c5d1SDavid du Colombier error(char *s)
633e12c5d1SDavid du Colombier {
643e12c5d1SDavid du Colombier 	perror(s);
653e12c5d1SDavid du Colombier 	exits(s);
663e12c5d1SDavid du Colombier }
67