xref: /plan9/sys/src/cmd/swap.c (revision 219b2ee8daee37f4aad58d63f21287faa8e4ffdc)
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
73e12c5d1SDavid du Colombier main(int argc, char **argv)
83e12c5d1SDavid du Colombier {
93e12c5d1SDavid 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 
193e12c5d1SDavid du Colombier 	if(dirstat(argv[1], &d) < 0){
203e12c5d1SDavid du Colombier 		print("swap: can't stat %s: %r\n", argv[1]);
213e12c5d1SDavid du Colombier 		exits("swap: failed");
223e12c5d1SDavid du Colombier 	}
233e12c5d1SDavid du Colombier 	if(d.type != 'M'){		/* kernel device */
243e12c5d1SDavid du Colombier 		swapfd = open(argv[1], ORDWR);
253e12c5d1SDavid du Colombier 		p = argv[1];
263e12c5d1SDavid du Colombier 	}
273e12c5d1SDavid du Colombier 	else {
283e12c5d1SDavid du Colombier 		p = getenv("sysname");
293e12c5d1SDavid du Colombier 		if(p == 0)
303e12c5d1SDavid du Colombier 			p = "swap";
313e12c5d1SDavid du Colombier 		sprint(buf, "%s/%sXXXXXXX", argv[1], p);
323e12c5d1SDavid du Colombier 		p = mktemp(buf);
333e12c5d1SDavid du Colombier 		swapfd = create(p, ORDWR|ORCLOSE, 0600);
343e12c5d1SDavid du Colombier 	}
353e12c5d1SDavid du Colombier 
363e12c5d1SDavid du Colombier 	if(swapfd < 0 || (p[0] == '/' && p[1] == '\0')) {
373e12c5d1SDavid du Colombier 		print("swap: failed to make a file: %r\n");
383e12c5d1SDavid du Colombier 		exits("swap: failed");
393e12c5d1SDavid du Colombier 	}
403e12c5d1SDavid du Colombier 
413e12c5d1SDavid du Colombier 	i = create("/env/swap", OWRITE, 0666);
423e12c5d1SDavid du Colombier 	if(i < 0)
433e12c5d1SDavid du Colombier 		error("open /env/swap");
443e12c5d1SDavid du Colombier 
453e12c5d1SDavid du Colombier 	if(write(i, p, strlen(p)) != strlen(p))
463e12c5d1SDavid du Colombier 		error("sysname");
473e12c5d1SDavid du Colombier 	close(i);
48*219b2ee8SDavid du Colombier 	print("swap: %s\n", p);
493e12c5d1SDavid du Colombier 
503e12c5d1SDavid du Colombier 	cswfd = open("/dev/swap", OWRITE);
513e12c5d1SDavid du Colombier 	if(cswfd < 0)
523e12c5d1SDavid du Colombier 		error("open: /dev/swap");
533e12c5d1SDavid du Colombier 
543e12c5d1SDavid du Colombier 	j = sprint(buf, "%d", swapfd);
553e12c5d1SDavid du Colombier 	if(write(cswfd, buf, j) != j)
563e12c5d1SDavid du Colombier 		error("write: /dev/swap");
57*219b2ee8SDavid du Colombier 	exits(0);
583e12c5d1SDavid du Colombier }
593e12c5d1SDavid du Colombier 
603e12c5d1SDavid du Colombier void
613e12c5d1SDavid du Colombier error(char *s)
623e12c5d1SDavid du Colombier {
633e12c5d1SDavid du Colombier 	perror(s);
643e12c5d1SDavid du Colombier 	exits(s);
653e12c5d1SDavid du Colombier }
66