mkswap.c 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. /* mkswap.c - Format swap device.
  2. *
  3. * Copyright 2009 Rob Landley <rob@landley.net>
  4. USE_MKSWAP(NEWTOY(mkswap, "<1>1L:", TOYFLAG_SBIN))
  5. config MKSWAP
  6. bool "mkswap"
  7. default y
  8. help
  9. usage: mkswap [-L LABEL] DEVICE
  10. Set up a Linux swap area on a device or file.
  11. */
  12. #define FOR_mkswap
  13. #include "toys.h"
  14. GLOBALS(
  15. char *L;
  16. )
  17. void mkswap_main(void)
  18. {
  19. int fd = xopen(*toys.optargs, O_RDWR), pagesize = sysconf(_SC_PAGE_SIZE);
  20. off_t len = fdlength(fd);
  21. unsigned int pages = (len/pagesize)-1, *swap = (unsigned int *)toybuf;
  22. char *label = (char *)(swap+7), *uuid = (char *)(swap+3);
  23. // Write header. Note that older kernel versions checked signature
  24. // on disk (not in cache) during swapon, so sync after writing.
  25. swap[0] = 1;
  26. swap[1] = pages;
  27. xlseek(fd, 1024, SEEK_SET);
  28. create_uuid(uuid);
  29. if (TT.L) strncpy(label, TT.L, 15);
  30. xwrite(fd, swap, 129*sizeof(unsigned int));
  31. xlseek(fd, pagesize-10, SEEK_SET);
  32. xwrite(fd, "SWAPSPACE2", 10);
  33. fsync(fd);
  34. if (CFG_TOYBOX_FREE) close(fd);
  35. if (TT.L) sprintf(toybuf, ", LABEL=%s", label);
  36. else *toybuf = 0;
  37. printf("Swapspace size: %luk%s, UUID=%s\n",
  38. pages*(unsigned long)(pagesize/1024),
  39. toybuf, show_uuid(uuid));
  40. }