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 }