2 * e2label.c - Print or change the volume label on an ext2 fs
11 #define EXT2_SUPER_MAGIC 0xEF53
15 struct ext2_super_block {
17 unsigned char s_magic[2];
19 char s_volume_name[VOLNAMSZ];
20 char s_last_mounted[64];
25 open_e2fs (char *dev, int mode) {
31 fprintf (stderr, "e2label: cannot open %s\n", dev);
34 if (lseek(fd, 1024, SEEK_SET) != 1024) {
36 fprintf (stderr, "e2label: cannot seek to superblock\n");
39 if (read(fd, (char *) &sb, sizeof(sb)) != sizeof(sb)) {
41 fprintf (stderr, "e2label: error reading superblock\n");
44 if (sb.s_magic[0] + 256*sb.s_magic[1] != EXT2_SUPER_MAGIC) {
45 fprintf (stderr, "e2label: not an ext2 filesystem\n");
53 print_label (char *dev) {
54 char label[VOLNAMSZ+1];
56 open_e2fs (dev, O_RDONLY);
58 strncpy(label, sb.s_volume_name, VOLNAMSZ);
59 printf("%s\n", label);
63 change_label (char *dev, char *label) {
66 fd = open_e2fs(dev, O_RDWR);
67 memset(sb.s_volume_name, 0, VOLNAMSZ);
68 strncpy(sb.s_volume_name, label, VOLNAMSZ);
69 if (lseek(fd, 1024, SEEK_SET) != 1024) {
71 fprintf (stderr, "e2label: cannot seek to superblock again\n");
74 if (write(fd, (char *) &sb, sizeof(sb)) != sizeof(sb)) {
76 fprintf (stderr, "e2label: error writing superblock\n");
82 main (int argc, char ** argv) {
86 change_label(argv[1], argv[2]);
88 fprintf(stderr, "Usage: e2label device [newlabel]\n");