2 * swaplabel.c - Print or change the label / UUID of a swap partition
4 * Copyright (C) 2010 Jason Borden <jborden@bluehost.com>
5 * Copyright (C) 2010 Karel Zak <kzak@redhat.com>
7 * Usage: swaplabel [-L label] [-U UUID] device
9 * This file may be redistributed under the terms of the GNU Public License
17 #include <sys/types.h>
31 #include "closestream.h"
33 #include "swapheader.h"
34 #include "swapprober.h"
36 #define SWAP_UUID_OFFSET (offsetof(struct swap_header_v1_2, uuid))
37 #define SWAP_LABEL_OFFSET (offsetof(struct swap_header_v1_2, volume_name))
39 /* Print the swap partition information */
40 static int print_info(blkid_probe pr
)
44 if (!blkid_probe_lookup_value(pr
, "LABEL", &data
, NULL
))
45 printf("LABEL: %s\n", data
);
47 if (!blkid_probe_lookup_value(pr
, "UUID", &data
, NULL
))
48 printf("UUID: %s\n", data
);
53 /* Change the swap partition info */
55 static int change_info(const char *devname
, const char *label
, const char *uuid
)
57 static int change_info(const char *devname
, const char *label
,
58 const char *uuid
__attribute__((__unused__
)))
63 fd
= open(devname
, O_RDWR
);
65 warn(_("cannot open %s"), devname
);
69 /* Write the uuid if it was provided */
73 if (uuid_parse(uuid
, newuuid
) == -1)
74 warnx(_("failed to parse UUID: %s"), uuid
);
76 if (lseek(fd
, SWAP_UUID_OFFSET
, SEEK_SET
) !=
78 warn(_("%s: failed to seek to swap UUID"), devname
);
81 } else if (write_all(fd
, newuuid
, sizeof(newuuid
))) {
82 warn(_("%s: failed to write UUID"), devname
);
88 /* Write the label if it was provided */
90 char newlabel
[SWAP_LABEL_LENGTH
];
92 if (lseek(fd
, SWAP_LABEL_OFFSET
, SEEK_SET
) != SWAP_LABEL_OFFSET
) {
93 warn(_("%s: failed to seek to swap label "), devname
);
96 memset(newlabel
, 0, sizeof(newlabel
));
97 xstrncpy(newlabel
, label
, sizeof(newlabel
));
99 if (strlen(label
) > strlen(newlabel
))
100 warnx(_("label is too long. Truncating it to '%s'"),
102 if (write_all(fd
, newlabel
, sizeof(newlabel
))) {
103 warn(_("%s: failed to write label"), devname
);
108 if (close_fd(fd
) != 0) {
109 warn(_("write failed: %s"), devname
);
119 static void __attribute__((__noreturn__
)) usage(void)
122 fputs(USAGE_HEADER
, out
);
123 fprintf(out
, _(" %s [options] <device>\n"),
124 program_invocation_short_name
);
126 fputs(USAGE_SEPARATOR
, out
);
127 fputs(_("Display or change the label or UUID of a swap area.\n"), out
);
129 fputs(USAGE_OPTIONS
, out
);
130 fputs(_(" -L, --label <label> specify a new label\n"
131 " -U, --uuid <uuid> specify a new uuid\n"), out
);
132 fputs(USAGE_SEPARATOR
, out
);
133 printf(USAGE_HELP_OPTIONS(21));
134 printf(USAGE_MAN_TAIL("swaplabel(8)"));
138 int main(int argc
, char *argv
[])
140 blkid_probe pr
= NULL
;
141 char *uuid
= NULL
, *label
= NULL
, *devname
;
144 static const struct option longopts
[] = {
145 { "help", no_argument
, NULL
, 'h' },
146 { "version", no_argument
, NULL
, 'V' },
147 { "label", required_argument
, NULL
, 'L' },
148 { "uuid", required_argument
, NULL
, 'U' },
152 setlocale(LC_ALL
, "");
153 bindtextdomain(PACKAGE
, LOCALEDIR
);
155 close_stdout_atexit();
157 while ((c
= getopt_long(argc
, argv
, "hVL:U:", longopts
, NULL
)) != -1) {
163 print_version(EXIT_SUCCESS
);
171 warnx(_("ignore -U (UUIDs are unsupported)"));
175 errtryhelp(EXIT_FAILURE
);
179 if (optind
== argc
) {
180 warnx(_("no device specified"));
181 errtryhelp(EXIT_FAILURE
);
183 devname
= argv
[optind
];
184 pr
= get_swap_prober(devname
);
187 rc
= change_info(devname
, label
, uuid
);
190 blkid_free_probe(pr
);
192 return rc
? EXIT_FAILURE
: EXIT_SUCCESS
;