ubase

suckless linux base utils
git clone git://git.suckless.org/ubase
Log | Files | Refs | README | LICENSE

mkswap.c (1739B)


      1 /* See LICENSE file for copyright and license details. */
      2 #include <sys/stat.h>
      3 
      4 #include <fcntl.h>
      5 #include <stdio.h>
      6 #include <stdlib.h>
      7 #include <string.h>
      8 #include <unistd.h>
      9 
     10 #include "util.h"
     11 
     12 #define SWAP_UUID_LENGTH 16
     13 #define SWAP_LABEL_LENGTH 16
     14 #define SWAP_MIN_PAGES 10
     15 
     16 struct swap_hdr {
     17 	char	      bootbits[1024];
     18 	unsigned int  version;
     19 	unsigned int  last_page;
     20 	unsigned int  nr_badpages;
     21 	unsigned char uuid[SWAP_UUID_LENGTH];
     22 	char	      volume_name[SWAP_LABEL_LENGTH];
     23 	unsigned int  padding[117];
     24 	unsigned int  badpages[1];
     25 };
     26 
     27 static void
     28 usage(void)
     29 {
     30 	eprintf("usage: %s device\n", argv0);
     31 }
     32 
     33 int
     34 main(int argc, char *argv[])
     35 {
     36 	int fd;
     37 	unsigned int pages;
     38 	long pagesize;
     39 	struct stat sb;
     40 	char *buf;
     41 	struct swap_hdr *hdr;
     42 
     43 	ARGBEGIN {
     44 	default:
     45 		usage();
     46 	} ARGEND;
     47 
     48 	if (argc < 1)
     49 		usage();
     50 
     51 	pagesize = sysconf(_SC_PAGESIZE);
     52 	if (pagesize <= 0) {
     53 		pagesize = sysconf(_SC_PAGE_SIZE);
     54 		if (pagesize <= 0)
     55 			eprintf("can't determine pagesize\n");
     56 	}
     57 
     58 	fd = open(argv[0], O_RDWR);
     59 	if (fd < 0)
     60 		eprintf("open %s:", argv[0]);
     61 	if (fstat(fd, &sb) < 0)
     62 		eprintf("stat %s:", argv[0]);
     63 
     64 	buf = ecalloc(1, pagesize);
     65 
     66 	pages = sb.st_size / pagesize;
     67 	if (pages < SWAP_MIN_PAGES)
     68 		eprintf("swap space needs to be at least %ldKiB\n",
     69 			SWAP_MIN_PAGES * pagesize / 1024);
     70 
     71 	/* Fill up the swap header */
     72 	hdr = (struct swap_hdr *)buf;
     73 	hdr->version = 1;
     74 	hdr->last_page = pages - 1;
     75 	strncpy(buf + pagesize - 10, "SWAPSPACE2", 10);
     76 
     77 	printf("Setting up swapspace version 1, size = %luKiB\n",
     78 	       (pages - 1) * pagesize / 1024);
     79 
     80 	/* Write out the signature page */
     81 	if (write(fd, buf, pagesize) != pagesize)
     82 		eprintf("unable to write signature page\n");
     83 
     84 	fsync(fd);
     85 	close(fd);
     86 	free(buf);
     87 
     88 	return 0;
     89 }