2 * e2label.c - Print or change the volume label on an ext2 fs
4 * Written by Andries Brouwer (aeb@cwi.nl), 970714
6 * Copyright 1997, 1998 by Theodore Ts'o.
9 * This file may be redistributed under the terms of the GNU Public
33 #define EXT2_SUPER_MAGIC 0xEF53
37 struct ext2_super_block {
39 unsigned char s_magic[2];
41 char s_volume_name[VOLNAMSZ];
42 char s_last_mounted[64];
46 static int open_e2fs (char *dev, int mode)
53 fprintf (stderr, "e2label: cannot open %s\n", dev);
56 if (lseek(fd, 1024, SEEK_SET) != 1024) {
58 fprintf (stderr, "e2label: cannot seek to superblock\n");
61 if (read(fd, (char *) &sb, sizeof(sb)) != sizeof(sb)) {
63 fprintf (stderr, "e2label: error reading superblock\n");
66 if (sb.s_magic[0] + 256*sb.s_magic[1] != EXT2_SUPER_MAGIC) {
67 fprintf (stderr, "e2label: not an ext2 filesystem\n");
74 static void print_label (char *dev)
76 char label[VOLNAMSZ+1];
78 open_e2fs (dev, O_RDONLY);
79 strncpy(label, sb.s_volume_name, VOLNAMSZ);
81 printf("%s\n", label);
84 static void change_label (char *dev, char *label)
88 fd = open_e2fs(dev, O_RDWR);
89 memset(sb.s_volume_name, 0, VOLNAMSZ);
90 strncpy(sb.s_volume_name, label, VOLNAMSZ);
91 if (strlen(label) > VOLNAMSZ)
92 fprintf(stderr, "Warning: label too long, truncating.\n");
93 if (lseek(fd, 1024, SEEK_SET) != 1024) {
95 fprintf (stderr, "e2label: cannot seek to superblock again\n");
98 if (write(fd, (char *) &sb, sizeof(sb)) != sizeof(sb)) {
100 fprintf (stderr, "e2label: error writing superblock\n");
105 int main (int argc, char ** argv)
108 print_label(argv[1]);
110 change_label(argv[1], argv[2]);
112 fprintf(stderr, "Usage: e2label device [newlabel]\n");