# HG changeset patch # User Rob Landley # Date 1232317165 21600 # Node ID 6e03d6a8df23ae90dcedc9d41500338fa50fa2b7 # Parent 157eab6dcdd2e58a697de542ad23209af3f99ae1 Add mkswap. diff -r 157eab6dcdd2 -r 6e03d6a8df23 lib/lib.c --- a/lib/lib.c Wed Jan 14 20:41:37 2009 -0600 +++ b/lib/lib.c Sun Jan 18 16:19:25 2009 -0600 @@ -266,6 +266,16 @@ if (len != writeall(fd, buf, len)) perror_exit("xwrite"); } +// Die if lseek fails, probably due to being called on a pipe. + +off_t xlseek(int fd, off_t offset, int whence) +{ + offset = lseek(fd, offset, whence); + if (offset<0) perror_exit("lseek"); + + return offset; +} + char *xgetcwd(void) { char *buf = getcwd(NULL, 0); diff -r 157eab6dcdd2 -r 6e03d6a8df23 lib/lib.h --- a/lib/lib.h Wed Jan 14 20:41:37 2009 -0600 +++ b/lib/lib.h Sun Jan 18 16:19:25 2009 -0600 @@ -73,6 +73,7 @@ size_t xread(int fd, void *buf, size_t len); void xreadall(int fd, void *buf, size_t len); void xwrite(int fd, void *buf, size_t len); +off_t xlseek(int fd, off_t offset, int whence); char *readfile(char *name); char *xreadfile(char *name); char *xgetcwd(void); diff -r 157eab6dcdd2 -r 6e03d6a8df23 toys/mkswap.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/toys/mkswap.c Sun Jan 18 16:19:25 2009 -0600 @@ -0,0 +1,42 @@ +/* vi: set sw=4 ts=4: + * + * mkswap.c - Format swap device. + * + * Copyright 2009 Rob Landley + * + * Not in SUSv3. + +USE_MKSWAP(NEWTOY(mkswap, "<1>2", TOYFLAG_SBIN)) + +config MKSWAP + bool "mkswap" + default y + help + usage: mkswap DEVICE + + Format a Linux v1 swap device. +*/ + +#include "toys.h" + +void mkswap_main(void) +{ + int fd = xopen(*toys.optargs, O_RDWR), pagesize = getpagesize(); + off_t len = fdlength(fd); + unsigned int pages = (len/pagesize)-1, *swap = (unsigned int *)toybuf; + + // Write header. Note that older kernel versions checked signature + // on disk (not in cache) during swapon, so sync after writing. + + swap[0] = 1; + swap[1] = pages; + xlseek(fd, 1024, SEEK_SET); + xwrite(fd, swap, 129*sizeof(unsigned int)); + xlseek(fd, pagesize-10, SEEK_SET); + xwrite(fd, "SWAPSPACE2", 10); + fsync(fd); + + if (CFG_TOYBOX_FREE) close(fd); + + printf("Swapspace size: %luk\n", pages*(unsigned long)(pagesize/1024)); +}