1*cf5a6c84SAndroid Build Coastguard Worker /* mkswap.c - Format swap device.
2*cf5a6c84SAndroid Build Coastguard Worker *
3*cf5a6c84SAndroid Build Coastguard Worker * Copyright 2009 Rob Landley <[email protected]>
4*cf5a6c84SAndroid Build Coastguard Worker
5*cf5a6c84SAndroid Build Coastguard Worker USE_MKSWAP(NEWTOY(mkswap, "<1>1L:", TOYFLAG_SBIN))
6*cf5a6c84SAndroid Build Coastguard Worker
7*cf5a6c84SAndroid Build Coastguard Worker config MKSWAP
8*cf5a6c84SAndroid Build Coastguard Worker bool "mkswap"
9*cf5a6c84SAndroid Build Coastguard Worker default y
10*cf5a6c84SAndroid Build Coastguard Worker help
11*cf5a6c84SAndroid Build Coastguard Worker usage: mkswap [-L LABEL] DEVICE
12*cf5a6c84SAndroid Build Coastguard Worker
13*cf5a6c84SAndroid Build Coastguard Worker Set up a Linux swap area on a device or file.
14*cf5a6c84SAndroid Build Coastguard Worker */
15*cf5a6c84SAndroid Build Coastguard Worker
16*cf5a6c84SAndroid Build Coastguard Worker #define FOR_mkswap
17*cf5a6c84SAndroid Build Coastguard Worker #include "toys.h"
18*cf5a6c84SAndroid Build Coastguard Worker
GLOBALS(char * L;)19*cf5a6c84SAndroid Build Coastguard Worker GLOBALS(
20*cf5a6c84SAndroid Build Coastguard Worker char *L;
21*cf5a6c84SAndroid Build Coastguard Worker )
22*cf5a6c84SAndroid Build Coastguard Worker
23*cf5a6c84SAndroid Build Coastguard Worker void mkswap_main(void)
24*cf5a6c84SAndroid Build Coastguard Worker {
25*cf5a6c84SAndroid Build Coastguard Worker int fd = xopen(*toys.optargs, O_RDWR), pagesize = sysconf(_SC_PAGE_SIZE);
26*cf5a6c84SAndroid Build Coastguard Worker off_t len = fdlength(fd);
27*cf5a6c84SAndroid Build Coastguard Worker unsigned int pages = (len/pagesize)-1, *swap = (unsigned int *)toybuf;
28*cf5a6c84SAndroid Build Coastguard Worker char *label = (char *)(swap+7), *uuid = (char *)(swap+3);
29*cf5a6c84SAndroid Build Coastguard Worker
30*cf5a6c84SAndroid Build Coastguard Worker // Write header. Note that older kernel versions checked signature
31*cf5a6c84SAndroid Build Coastguard Worker // on disk (not in cache) during swapon, so sync after writing.
32*cf5a6c84SAndroid Build Coastguard Worker
33*cf5a6c84SAndroid Build Coastguard Worker swap[0] = 1;
34*cf5a6c84SAndroid Build Coastguard Worker swap[1] = pages;
35*cf5a6c84SAndroid Build Coastguard Worker xlseek(fd, 1024, SEEK_SET);
36*cf5a6c84SAndroid Build Coastguard Worker create_uuid(uuid);
37*cf5a6c84SAndroid Build Coastguard Worker if (TT.L) strncpy(label, TT.L, 15);
38*cf5a6c84SAndroid Build Coastguard Worker xwrite(fd, swap, 129*sizeof(unsigned int));
39*cf5a6c84SAndroid Build Coastguard Worker xlseek(fd, pagesize-10, SEEK_SET);
40*cf5a6c84SAndroid Build Coastguard Worker xwrite(fd, "SWAPSPACE2", 10);
41*cf5a6c84SAndroid Build Coastguard Worker fsync(fd);
42*cf5a6c84SAndroid Build Coastguard Worker
43*cf5a6c84SAndroid Build Coastguard Worker if (CFG_TOYBOX_FREE) close(fd);
44*cf5a6c84SAndroid Build Coastguard Worker
45*cf5a6c84SAndroid Build Coastguard Worker if (TT.L) sprintf(toybuf, ", LABEL=%.15s", TT.L);
46*cf5a6c84SAndroid Build Coastguard Worker else *toybuf = 0;
47*cf5a6c84SAndroid Build Coastguard Worker printf("Swapspace size: %luk%s, UUID=%s\n",
48*cf5a6c84SAndroid Build Coastguard Worker pages*(unsigned long)(pagesize/1024),
49*cf5a6c84SAndroid Build Coastguard Worker toybuf, show_uuid(uuid));
50*cf5a6c84SAndroid Build Coastguard Worker }
51