changeset 340:6e03d6a8df23

Add mkswap.
author Rob Landley <rob@landley.net>
date Sun, 18 Jan 2009 16:19:25 -0600
parents 157eab6dcdd2
children 86e2bdb2ad66
files lib/lib.c lib/lib.h toys/mkswap.c
diffstat 3 files changed, 53 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- 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);
--- 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);
--- /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 <rob@landley.net>
+ *
+ * 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));
+}