Add swaplabel(8)
This commit is contained in:
parent
fd6f44d7bf
commit
aed9e3f6fa
1
LICENSE
1
LICENSE
@ -9,6 +9,7 @@ MIT/X Consortium License
|
|||||||
© 2014 Hiltjo Posthuma <hiltjo@codemadness.org>
|
© 2014 Hiltjo Posthuma <hiltjo@codemadness.org>
|
||||||
© 2014 Laslo Hunhold <dev@frign.de>
|
© 2014 Laslo Hunhold <dev@frign.de>
|
||||||
© 2014 Roberto E. Vargas Caballero <k0ga@shike2.com>
|
© 2014 Roberto E. Vargas Caballero <k0ga@shike2.com>
|
||||||
|
© 2014 Jan Tatje <jan@jnt.io>
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a
|
Permission is hereby granted, free of charge, to any person obtaining a
|
||||||
copy of this software and associated documentation files (the "Software"),
|
copy of this software and associated documentation files (the "Software"),
|
||||||
|
2
Makefile
2
Makefile
@ -70,6 +70,7 @@ SRC = \
|
|||||||
rmmod.c \
|
rmmod.c \
|
||||||
stat.c \
|
stat.c \
|
||||||
su.c \
|
su.c \
|
||||||
|
swaplabel.c \
|
||||||
swapoff.c \
|
swapoff.c \
|
||||||
swapon.c \
|
swapon.c \
|
||||||
switch_root.c \
|
switch_root.c \
|
||||||
@ -125,6 +126,7 @@ MAN8 = \
|
|||||||
pivot_root.8 \
|
pivot_root.8 \
|
||||||
readahead.8 \
|
readahead.8 \
|
||||||
rmmod.8 \
|
rmmod.8 \
|
||||||
|
swaplabel.8 \
|
||||||
swapoff.8 \
|
swapoff.8 \
|
||||||
swapon.8 \
|
swapon.8 \
|
||||||
switch_root.8 \
|
switch_root.8 \
|
||||||
|
1
TODO
1
TODO
@ -4,7 +4,6 @@ Tools
|
|||||||
vmstat
|
vmstat
|
||||||
top
|
top
|
||||||
Better ps support
|
Better ps support
|
||||||
swaplabel
|
|
||||||
losetup
|
losetup
|
||||||
lspci
|
lspci
|
||||||
mkswap [-L]
|
mkswap [-L]
|
||||||
|
11
swaplabel.8
Normal file
11
swaplabel.8
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
.TH SWAPLABEL 8 ubase-VERSION
|
||||||
|
.SH NAME
|
||||||
|
\fBswaplabel\fR - set the label of a swap filesystem
|
||||||
|
.SH SYNOPSIS
|
||||||
|
\fBswaplabel\fR [\fB-L\fI label\fR] \fIdevice\fR
|
||||||
|
.SH DESCRIPTION
|
||||||
|
\fBswaplabel\fR is used to change the label of a swap device or file.
|
||||||
|
.SH OPTIONS
|
||||||
|
.TP
|
||||||
|
\fB-L\fR
|
||||||
|
Change the label.
|
80
swaplabel.c
Normal file
80
swaplabel.c
Normal file
@ -0,0 +1,80 @@
|
|||||||
|
/* See LICENSE file for copyright and license details. */
|
||||||
|
#include <sys/types.h>
|
||||||
|
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
#include "util.h"
|
||||||
|
|
||||||
|
#define SWAP_MAGIC1 "SWAPSPACE2"
|
||||||
|
#define SWAP_MAGIC2 "SWAP-SPACE"
|
||||||
|
#define SWAP_MAGIC_LENGTH (10)
|
||||||
|
#define SWAP_MAGIC_OFFSET (sysconf(_SC_PAGESIZE) - SWAP_MAGIC_LENGTH)
|
||||||
|
#define SWAP_LABEL_LENGTH (16)
|
||||||
|
#define SWAP_LABEL_OFFSET (1024 + 4 + 4 + 4 + 16)
|
||||||
|
|
||||||
|
static void
|
||||||
|
usage(void)
|
||||||
|
{
|
||||||
|
eprintf("usage: %s [-L label] device\n", argv0);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
main(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
int setlabel = 0;
|
||||||
|
int fd = -1;
|
||||||
|
char magic[10] = { 0 };
|
||||||
|
char *label = NULL;
|
||||||
|
char *device = NULL;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
ARGBEGIN {
|
||||||
|
case 'L':
|
||||||
|
setlabel = 1;
|
||||||
|
label = EARGF(usage());
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
usage();
|
||||||
|
} ARGEND;
|
||||||
|
|
||||||
|
if (argc < 1)
|
||||||
|
usage();
|
||||||
|
device = argv[0];
|
||||||
|
|
||||||
|
fd = open(device, O_RDWR);
|
||||||
|
if (fd < 0)
|
||||||
|
eprintf("open %s:", device);
|
||||||
|
|
||||||
|
if (lseek(fd, SWAP_MAGIC_OFFSET, SEEK_SET) != SWAP_MAGIC_OFFSET)
|
||||||
|
eprintf("failed seeking to magic position:");
|
||||||
|
if (read(fd, magic, SWAP_MAGIC_LENGTH) != SWAP_MAGIC_LENGTH)
|
||||||
|
eprintf("reading magic failed:");
|
||||||
|
if (memcmp(magic, SWAP_MAGIC1, 10) && memcmp(magic, SWAP_MAGIC2, 10))
|
||||||
|
eprintf("%s: is not a swap partition\n", device);
|
||||||
|
if (lseek(fd, SWAP_LABEL_OFFSET, SEEK_SET) != SWAP_LABEL_OFFSET)
|
||||||
|
eprintf("failed seeking to label position:");
|
||||||
|
|
||||||
|
if (!setlabel) {
|
||||||
|
label = emalloc(SWAP_LABEL_LENGTH);
|
||||||
|
if (read(fd, label, SWAP_LABEL_LENGTH) != SWAP_LABEL_LENGTH)
|
||||||
|
eprintf("reading label failed:");
|
||||||
|
for (i = 0; i < SWAP_LABEL_LENGTH && label[i] != '\0'; i++)
|
||||||
|
if (i == (SWAP_LABEL_LENGTH - 1) && label[i] != '\0')
|
||||||
|
eprintf("invalid label\n");
|
||||||
|
printf("label: %s\n", label);
|
||||||
|
free(label);
|
||||||
|
} else {
|
||||||
|
if (strlen(label) + 1 > SWAP_LABEL_LENGTH)
|
||||||
|
eprintf("label too long\n");
|
||||||
|
if (write(fd, label, strlen(label) + 1) != (ssize_t)strlen(label) + 1)
|
||||||
|
eprintf("writing label failed:");
|
||||||
|
}
|
||||||
|
|
||||||
|
fsync(fd);
|
||||||
|
close(fd);
|
||||||
|
return 0;
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user