aboutsummaryrefslogtreecommitdiff
path: root/util-linux/mkswap.c
diff options
context:
space:
mode:
authorErik Andersen <andersen@codepoet.org>2000-02-08 19:58:47 +0000
committerErik Andersen <andersen@codepoet.org>2000-02-08 19:58:47 +0000
commite49d5ecbbe51718fa925b6890a735e5937cc2aa2 (patch)
treec90bda10731ad9333ce3b404f993354c9fc104b8 /util-linux/mkswap.c
parentc0bf817bbc5c7867fbe8fb76d5c39f8ee802692f (diff)
downloadbusybox-w32-e49d5ecbbe51718fa925b6890a735e5937cc2aa2.tar.gz
busybox-w32-e49d5ecbbe51718fa925b6890a735e5937cc2aa2.tar.bz2
busybox-w32-e49d5ecbbe51718fa925b6890a735e5937cc2aa2.zip
Some formatting updates (ran the code through indent)
-Erik
Diffstat (limited to 'util-linux/mkswap.c')
-rw-r--r--util-linux/mkswap.c197
1 files changed, 100 insertions, 97 deletions
diff --git a/util-linux/mkswap.c b/util-linux/mkswap.c
index 601188f86..130d24162 100644
--- a/util-linux/mkswap.c
+++ b/util-linux/mkswap.c
@@ -1,3 +1,4 @@
1/* vi: set sw=4 ts=4: */
1/* 2/*
2 * mkswap.c - set up a linux swap device 3 * mkswap.c - set up a linux swap device
3 * 4 *
@@ -40,20 +41,21 @@
40#include <string.h> 41#include <string.h>
41#include <fcntl.h> 42#include <fcntl.h>
42#include <stdlib.h> 43#include <stdlib.h>
43#include <sys/ioctl.h> /* for _IO */ 44#include <sys/ioctl.h> /* for _IO */
44#include <sys/utsname.h> 45#include <sys/utsname.h>
45#include <sys/stat.h> 46#include <sys/stat.h>
46#include <asm/page.h> /* for PAGE_SIZE and PAGE_SHIFT */ 47#include <asm/page.h> /* for PAGE_SIZE and PAGE_SHIFT */
47 /* we also get PAGE_SIZE via getpagesize() */ 48 /* we also get PAGE_SIZE via getpagesize() */
48 49
49 50
50static const char mkswap_usage[] = "mkswap [-c] [-v0|-v1] device [block-count]\n\n" 51static const char mkswap_usage[] =
51"Prepare a disk partition to be used as a swap partition.\n\n" 52 "mkswap [-c] [-v0|-v1] device [block-count]\n\n"
52"Options:\n" 53 "Prepare a disk partition to be used as a swap partition.\n\n"
53"\t-c\t\tCheck for read-ability.\n" 54 "Options:\n" "\t-c\t\tCheck for read-ability.\n"
54"\t-v0\t\tMake version 0 swap [max 128 Megs].\n" 55 "\t-v0\t\tMake version 0 swap [max 128 Megs].\n"
55"\t-v1\t\tMake version 1 swap [big!] (default for kernels > 2.1.117).\n" 56 "\t-v1\t\tMake version 1 swap [big!] (default for kernels > 2.1.117).\n"
56"\tblock-count\tNumber of block to use (default is entire partition).\n"; 57
58 "\tblock-count\tNumber of block to use (default is entire partition).\n";
57 59
58 60
59#ifndef _IO 61#ifndef _IO
@@ -64,8 +66,8 @@ static const char mkswap_usage[] = "mkswap [-c] [-v0|-v1] device [block-count]\n
64#define BLKGETSIZE _IO(0x12,96) 66#define BLKGETSIZE _IO(0x12,96)
65#endif 67#endif
66 68
67static char * program_name = "mkswap"; 69static char *program_name = "mkswap";
68static char * device_name = NULL; 70static char *device_name = NULL;
69static int DEV = -1; 71static int DEV = -1;
70static long PAGES = 0; 72static long PAGES = 0;
71static int check = 0; 73static int check = 0;
@@ -74,8 +76,8 @@ static int version = -1;
74 76
75#define MAKE_VERSION(p,q,r) (65536*(p) + 256*(q) + (r)) 77#define MAKE_VERSION(p,q,r) (65536*(p) + 256*(q) + (r))
76 78
77static int 79static int linux_version_code(void)
78linux_version_code(void) { 80{
79 struct utsname my_utsname; 81 struct utsname my_utsname;
80 int p, q, r; 82 int p, q, r;
81 83
@@ -83,7 +85,7 @@ linux_version_code(void) {
83 p = atoi(strtok(my_utsname.release, ".")); 85 p = atoi(strtok(my_utsname.release, "."));
84 q = atoi(strtok(NULL, ".")); 86 q = atoi(strtok(NULL, "."));
85 r = atoi(strtok(NULL, ".")); 87 r = atoi(strtok(NULL, "."));
86 return MAKE_VERSION(p,q,r); 88 return MAKE_VERSION(p, q, r);
87 } 89 }
88 return 0; 90 return 0;
89} 91}
@@ -98,7 +100,7 @@ static int pagesize;
98static int *signature_page; 100static int *signature_page;
99 101
100struct swap_header_v1 { 102struct swap_header_v1 {
101 char bootbits[1024]; /* Space for disklabel etc. */ 103 char bootbits[1024]; /* Space for disklabel etc. */
102 unsigned int version; 104 unsigned int version;
103 unsigned int last_page; 105 unsigned int last_page;
104 unsigned int nr_badpages; 106 unsigned int nr_badpages;
@@ -106,8 +108,8 @@ struct swap_header_v1 {
106 unsigned int badpages[1]; 108 unsigned int badpages[1];
107} *p; 109} *p;
108 110
109static void 111static void init_signature_page()
110init_signature_page() { 112{
111 pagesize = getpagesize(); 113 pagesize = getpagesize();
112 114
113#ifdef PAGE_SIZE 115#ifdef PAGE_SIZE
@@ -115,15 +117,15 @@ init_signature_page() {
115 fprintf(stderr, "Assuming pages of size %d\n", pagesize); 117 fprintf(stderr, "Assuming pages of size %d\n", pagesize);
116#endif 118#endif
117 signature_page = (int *) malloc(pagesize); 119 signature_page = (int *) malloc(pagesize);
118 memset(signature_page,0,pagesize); 120 memset(signature_page, 0, pagesize);
119 p = (struct swap_header_v1 *) signature_page; 121 p = (struct swap_header_v1 *) signature_page;
120} 122}
121 123
122static void 124static void write_signature(char *sig)
123write_signature(char *sig) { 125{
124 char *sp = (char *) signature_page; 126 char *sp = (char *) signature_page;
125 127
126 strncpy(sp+pagesize-10, sig, 10); 128 strncpy(sp + pagesize - 10, sig, 10);
127} 129}
128 130
129#define V0_MAX_PAGES (8 * (pagesize - 10)) 131#define V0_MAX_PAGES (8 * (pagesize - 10))
@@ -172,42 +174,46 @@ It is roughly 2GB on i386, PPC, m68k, ARM, 1GB on sparc, 512MB on mips,
172 174
173#define MAX_BADPAGES ((pagesize-1024-128*sizeof(int)-10)/sizeof(int)) 175#define MAX_BADPAGES ((pagesize-1024-128*sizeof(int)-10)/sizeof(int))
174 176
175static void bit_set (unsigned int *addr, unsigned int nr) 177static void bit_set(unsigned int *addr, unsigned int nr)
176{ 178{
177 unsigned int r, m; 179 unsigned int r, m;
178 180
179 addr += nr / (8 * sizeof(int)); 181 addr += nr / (8 * sizeof(int));
182
180 r = *addr; 183 r = *addr;
181 m = 1 << (nr & (8 * sizeof(int) - 1)); 184 m = 1 << (nr & (8 * sizeof(int) - 1));
185
182 *addr = r | m; 186 *addr = r | m;
183} 187}
184 188
185static int bit_test_and_clear (unsigned int *addr, unsigned int nr) 189static int bit_test_and_clear(unsigned int *addr, unsigned int nr)
186{ 190{
187 unsigned int r, m; 191 unsigned int r, m;
188 192
189 addr += nr / (8 * sizeof(int)); 193 addr += nr / (8 * sizeof(int));
194
190 r = *addr; 195 r = *addr;
191 m = 1 << (nr & (8 * sizeof(int) - 1)); 196 m = 1 << (nr & (8 * sizeof(int) - 1));
197
192 *addr = r & ~m; 198 *addr = r & ~m;
193 return (r & m) != 0; 199 return (r & m) != 0;
194} 200}
195 201
196 202
197void 203void die(const char *str)
198die(const char *str) { 204{
199 fprintf(stderr, "%s: %s\n", program_name, str); 205 fprintf(stderr, "%s: %s\n", program_name, str);
200 exit( FALSE); 206 exit(FALSE);
201} 207}
202 208
203void 209void page_ok(int page)
204page_ok(int page) { 210{
205 if (version==0) 211 if (version == 0)
206 bit_set(signature_page, page); 212 bit_set(signature_page, page);
207} 213}
208 214
209void 215void page_bad(int page)
210page_bad(int page) { 216{
211 if (version == 0) 217 if (version == 0)
212 bit_test_and_clear(signature_page, page); 218 bit_test_and_clear(signature_page, page);
213 else { 219 else {
@@ -218,8 +224,8 @@ page_bad(int page) {
218 badpages++; 224 badpages++;
219} 225}
220 226
221void 227void check_blocks(void)
222check_blocks(void) { 228{
223 unsigned int current_page; 229 unsigned int current_page;
224 int do_seek = 1; 230 int do_seek = 1;
225 char *buffer; 231 char *buffer;
@@ -233,8 +239,8 @@ check_blocks(void) {
233 page_ok(current_page++); 239 page_ok(current_page++);
234 continue; 240 continue;
235 } 241 }
236 if (do_seek && lseek(DEV,current_page*pagesize,SEEK_SET) != 242 if (do_seek && lseek(DEV, current_page * pagesize, SEEK_SET) !=
237 current_page*pagesize) 243 current_page * pagesize)
238 die("seek failed in check_blocks"); 244 die("seek failed in check_blocks");
239 if ((do_seek = (pagesize != read(DEV, buffer, pagesize)))) { 245 if ((do_seek = (pagesize != read(DEV, buffer, pagesize)))) {
240 page_bad(current_page++); 246 page_bad(current_page++);
@@ -248,30 +254,28 @@ check_blocks(void) {
248 printf("%d bad pages\n", badpages); 254 printf("%d bad pages\n", badpages);
249} 255}
250 256
251static long valid_offset (int fd, int offset) 257static long valid_offset(int fd, int offset)
252{ 258{
253 char ch; 259 char ch;
254 260
255 if (lseek (fd, offset, 0) < 0) 261 if (lseek(fd, offset, 0) < 0)
256 return 0; 262 return 0;
257 if (read (fd, &ch, 1) < 1) 263 if (read(fd, &ch, 1) < 1)
258 return 0; 264 return 0;
259 return 1; 265 return 1;
260} 266}
261 267
262static int 268static int find_size(int fd)
263find_size (int fd)
264{ 269{
265 unsigned int high, low; 270 unsigned int high, low;
266 271
267 low = 0; 272 low = 0;
268 for (high = 1; high > 0 && valid_offset (fd, high); high *= 2) 273 for (high = 1; high > 0 && valid_offset(fd, high); high *= 2)
269 low = high; 274 low = high;
270 while (low < high - 1) 275 while (low < high - 1) {
271 {
272 const int mid = (low + high) / 2; 276 const int mid = (low + high) / 2;
273 277
274 if (valid_offset (fd, mid)) 278 if (valid_offset(fd, mid))
275 low = mid; 279 low = mid;
276 else 280 else
277 high = mid; 281 high = mid;
@@ -280,11 +284,10 @@ find_size (int fd)
280} 284}
281 285
282/* return size in pages, to avoid integer overflow */ 286/* return size in pages, to avoid integer overflow */
283static long 287static long get_size(const char *file)
284get_size(const char *file)
285{ 288{
286 int fd; 289 int fd;
287 long size; 290 long size;
288 291
289 fd = open(file, O_RDONLY); 292 fd = open(file, O_RDONLY);
290 if (fd < 0) { 293 if (fd < 0) {
@@ -292,7 +295,8 @@ get_size(const char *file)
292 exit(1); 295 exit(1);
293 } 296 }
294 if (ioctl(fd, BLKGETSIZE, &size) >= 0) { 297 if (ioctl(fd, BLKGETSIZE, &size) >= 0) {
295 int sectors_per_page = pagesize/512; 298 int sectors_per_page = pagesize / 512;
299
296 size /= sectors_per_page; 300 size /= sectors_per_page;
297 } else { 301 } else {
298 size = find_size(fd) / pagesize; 302 size = find_size(fd) / pagesize;
@@ -301,9 +305,9 @@ get_size(const char *file)
301 return size; 305 return size;
302} 306}
303 307
304int mkswap_main(int argc, char ** argv) 308int mkswap_main(int argc, char **argv)
305{ 309{
306 char * tmp; 310 char *tmp;
307 struct stat statbuf; 311 struct stat statbuf;
308 int sz; 312 int sz;
309 int maxpages; 313 int maxpages;
@@ -314,56 +318,56 @@ int mkswap_main(int argc, char ** argv)
314 if (argc && *argv) 318 if (argc && *argv)
315 program_name = *argv; 319 program_name = *argv;
316 320
317 init_signature_page(); /* get pagesize */ 321 init_signature_page(); /* get pagesize */
318 322
319 while (argc-- > 1) { 323 while (argc-- > 1) {
320 argv++; 324 argv++;
321 if (argv[0][0] != '-') { 325 if (argv[0][0] != '-') {
322 if (device_name) { 326 if (device_name) {
323 int blocks_per_page = pagesize/1024; 327 int blocks_per_page = pagesize / 1024;
324 PAGES = strtol(argv[0],&tmp,0)/blocks_per_page; 328
329 PAGES = strtol(argv[0], &tmp, 0) / blocks_per_page;
325 if (*tmp) 330 if (*tmp)
326 usage( mkswap_usage); 331 usage(mkswap_usage);
327 } else 332 } else
328 device_name = argv[0]; 333 device_name = argv[0];
329 } else { 334 } else {
330 switch (argv[0][1]) { 335 switch (argv[0][1]) {
331 case 'c': 336 case 'c':
332 check=1; 337 check = 1;
333 break; 338 break;
334 case 'f': 339 case 'f':
335 force=1; 340 force = 1;
336 break; 341 break;
337 case 'v': 342 case 'v':
338 version=atoi(argv[0]+2); 343 version = atoi(argv[0] + 2);
339 break; 344 break;
340 default: 345 default:
341 usage( mkswap_usage); 346 usage(mkswap_usage);
342 } 347 }
343 } 348 }
344 } 349 }
345 if (!device_name) { 350 if (!device_name) {
346 fprintf(stderr, 351 fprintf(stderr,
347 "%s: error: Nowhere to set up swap on?\n", 352 "%s: error: Nowhere to set up swap on?\n", program_name);
348 program_name); 353 usage(mkswap_usage);
349 usage( mkswap_usage);
350 } 354 }
351 sz = get_size(device_name); 355 sz = get_size(device_name);
352 if (!PAGES) { 356 if (!PAGES) {
353 PAGES = sz; 357 PAGES = sz;
354 } else if (PAGES > sz && !force) { 358 } else if (PAGES > sz && !force) {
355 fprintf(stderr, 359 fprintf(stderr,
356 "%s: error: " 360 "%s: error: "
357 "size %ld is larger than device size %d\n", 361 "size %ld is larger than device size %d\n",
358 program_name, 362 program_name,
359 PAGES*(pagesize/1024), sz*(pagesize/1024)); 363 PAGES * (pagesize / 1024), sz * (pagesize / 1024));
360 exit( FALSE); 364 exit(FALSE);
361 } 365 }
362 366
363 if (version == -1) { 367 if (version == -1) {
364 if (PAGES <= V0_MAX_PAGES) 368 if (PAGES <= V0_MAX_PAGES)
365 version = 0; 369 version = 0;
366 else if (linux_version_code() < MAKE_VERSION(2,1,117)) 370 else if (linux_version_code() < MAKE_VERSION(2, 1, 117))
367 version = 0; 371 version = 0;
368 else if (pagesize < 2048) 372 else if (pagesize < 2048)
369 version = 0; 373 version = 0;
@@ -372,21 +376,21 @@ int mkswap_main(int argc, char ** argv)
372 } 376 }
373 if (version != 0 && version != 1) { 377 if (version != 0 && version != 1) {
374 fprintf(stderr, "%s: error: unknown version %d\n", 378 fprintf(stderr, "%s: error: unknown version %d\n",
375 program_name, version); 379 program_name, version);
376 usage( mkswap_usage); 380 usage(mkswap_usage);
377 } 381 }
378 if (PAGES < 10) { 382 if (PAGES < 10) {
379 fprintf(stderr, 383 fprintf(stderr,
380 "%s: error: swap area needs to be at least %ldkB\n", 384 "%s: error: swap area needs to be at least %ldkB\n",
381 program_name, (long)(10 * pagesize / 1024)); 385 program_name, (long) (10 * pagesize / 1024));
382 usage( mkswap_usage); 386 usage(mkswap_usage);
383 } 387 }
384#if 0 388#if 0
385 maxpages = ((version == 0) ? V0_MAX_PAGES : V1_MAX_PAGES); 389 maxpages = ((version == 0) ? V0_MAX_PAGES : V1_MAX_PAGES);
386#else 390#else
387 if (!version) 391 if (!version)
388 maxpages = V0_MAX_PAGES; 392 maxpages = V0_MAX_PAGES;
389 else if (linux_version_code() >= MAKE_VERSION(2,2,1)) 393 else if (linux_version_code() >= MAKE_VERSION(2, 2, 1))
390 maxpages = V1_MAX_PAGES; 394 maxpages = V1_MAX_PAGES;
391 else { 395 else {
392 maxpages = V1_OLD_MAX_PAGES; 396 maxpages = V1_OLD_MAX_PAGES;
@@ -397,29 +401,29 @@ int mkswap_main(int argc, char ** argv)
397 if (PAGES > maxpages) { 401 if (PAGES > maxpages) {
398 PAGES = maxpages; 402 PAGES = maxpages;
399 fprintf(stderr, "%s: warning: truncating swap area to %ldkB\n", 403 fprintf(stderr, "%s: warning: truncating swap area to %ldkB\n",
400 program_name, PAGES * pagesize / 1024); 404 program_name, PAGES * pagesize / 1024);
401 } 405 }
402 406
403 DEV = open(device_name,O_RDWR); 407 DEV = open(device_name, O_RDWR);
404 if (DEV < 0 || fstat(DEV, &statbuf) < 0) { 408 if (DEV < 0 || fstat(DEV, &statbuf) < 0) {
405 perror(device_name); 409 perror(device_name);
406 exit( FALSE); 410 exit(FALSE);
407 } 411 }
408 if (!S_ISBLK(statbuf.st_mode)) 412 if (!S_ISBLK(statbuf.st_mode))
409 check=0; 413 check = 0;
410 else if (statbuf.st_rdev == 0x0300 || statbuf.st_rdev == 0x0340) 414 else if (statbuf.st_rdev == 0x0300 || statbuf.st_rdev == 0x0340)
411 die("Will not try to make swapdevice on '%s'"); 415 die("Will not try to make swapdevice on '%s'");
412 416
413#ifdef __sparc__ 417#ifdef __sparc__
414 if (!force && version == 0) { 418 if (!force && version == 0) {
415 /* Don't overwrite partition table unless forced */ 419 /* Don't overwrite partition table unless forced */
416 unsigned char *buffer = (unsigned char *)signature_page; 420 unsigned char *buffer = (unsigned char *) signature_page;
417 unsigned short *q, sum; 421 unsigned short *q, sum;
418 422
419 if (read(DEV, buffer, 512) != 512) 423 if (read(DEV, buffer, 512) != 512)
420 die("fatal: first page unreadable"); 424 die("fatal: first page unreadable");
421 if (buffer[508] == 0xDA && buffer[509] == 0xBE) { 425 if (buffer[508] == 0xDA && buffer[509] == 0xBE) {
422 q = (unsigned short *)(buffer + 510); 426 q = (unsigned short *) (buffer + 510);
423 for (sum = 0; q >= (unsigned short *) buffer;) 427 for (sum = 0; q >= (unsigned short *) buffer;)
424 sum ^= *q--; 428 sum ^= *q--;
425 if (!sum) { 429 if (!sum) {
@@ -427,9 +431,8 @@ int mkswap_main(int argc, char ** argv)
427%s: Device '%s' contains a valid Sun disklabel.\n\ 431%s: Device '%s' contains a valid Sun disklabel.\n\
428This probably means creating v0 swap would destroy your partition table\n\ 432This probably means creating v0 swap would destroy your partition table\n\
429No swap created. If you really want to create swap v0 on that device, use\n\ 433No swap created. If you really want to create swap v0 on that device, use\n\
430the -f option to force it.\n", 434the -f option to force it.\n", program_name, device_name);
431 program_name, device_name); 435 exit(FALSE);
432 exit( FALSE);
433 } 436 }
434 } 437 }
435 } 438 }
@@ -437,11 +440,11 @@ the -f option to force it.\n",
437 440
438 if (version == 0 || check) 441 if (version == 0 || check)
439 check_blocks(); 442 check_blocks();
440 if (version == 0 && !bit_test_and_clear(signature_page,0)) 443 if (version == 0 && !bit_test_and_clear(signature_page, 0))
441 die("fatal: first page unreadable"); 444 die("fatal: first page unreadable");
442 if (version == 1) { 445 if (version == 1) {
443 p->version = version; 446 p->version = version;
444 p->last_page = PAGES-1; 447 p->last_page = PAGES - 1;
445 p->nr_badpages = badpages; 448 p->nr_badpages = badpages;
446 } 449 }
447 450
@@ -449,14 +452,14 @@ the -f option to force it.\n",
449 if (goodpages <= 0) 452 if (goodpages <= 0)
450 die("Unable to set up swap-space: unreadable"); 453 die("Unable to set up swap-space: unreadable");
451 printf("Setting up swapspace version %d, size = %ld bytes\n", 454 printf("Setting up swapspace version %d, size = %ld bytes\n",
452 version, (long)(goodpages*pagesize)); 455 version, (long) (goodpages * pagesize));
453 write_signature((version == 0) ? "SWAP-SPACE" : "SWAPSPACE2"); 456 write_signature((version == 0) ? "SWAP-SPACE" : "SWAPSPACE2");
454 457
455 offset = ((version == 0) ? 0 : 1024); 458 offset = ((version == 0) ? 0 : 1024);
456 if (lseek(DEV, offset, SEEK_SET) != offset) 459 if (lseek(DEV, offset, SEEK_SET) != offset)
457 die("unable to rewind swap-device"); 460 die("unable to rewind swap-device");
458 if (write(DEV,(char*)signature_page+offset, pagesize-offset) 461 if (write(DEV, (char *) signature_page + offset, pagesize - offset)
459 != pagesize-offset) 462 != pagesize - offset)
460 die("unable to write signature page"); 463 die("unable to write signature page");
461 464
462 /* 465 /*
@@ -464,6 +467,6 @@ the -f option to force it.\n",
464 * is not actually on disk. (This is a kernel bug.) 467 * is not actually on disk. (This is a kernel bug.)
465 */ 468 */
466 if (fsync(DEV)) 469 if (fsync(DEV))
467 die("fsync failed"); 470 die("fsync failed");
468 exit ( TRUE); 471 exit(TRUE);
469} 472}