aboutsummaryrefslogtreecommitdiff
path: root/toys/other/mkswap.c
blob: 3106ea8e3d60aef3733b362b190f349ea6cc88b6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
/* mkswap.c - Format swap device.
 *
 * Copyright 2009 Rob Landley <rob@landley.net>

USE_MKSWAP(NEWTOY(mkswap, "<1>1L:", TOYFLAG_SBIN))

config MKSWAP
  bool "mkswap"
  default y
  help
    usage: mkswap [-L LABEL] DEVICE

    Set up a Linux swap area on a device or file.
*/

#define FOR_mkswap
#include "toys.h"

GLOBALS(
  char *L;
)

void mkswap_main(void)
{
  int fd = xopen(*toys.optargs, O_RDWR), pagesize = sysconf(_SC_PAGE_SIZE);
  off_t len = fdlength(fd);
  unsigned int pages = (len/pagesize)-1, *swap = (unsigned int *)toybuf;
  char *label = (char *)(swap+7), *uuid = (char *)(swap+3);

  // 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);
  create_uuid(uuid);
  if (TT.L) strncpy(label, TT.L, 15);
  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);

  if (TT.L) sprintf(toybuf, ", LABEL=%s", label);
  else *toybuf = 0;
  printf("Swapspace size: %luk%s, UUID=%s\n",
    pages*(unsigned long)(pagesize/1024),
    toybuf, show_uuid(uuid));
}