Whamcloud - gitweb
2b4f1711dd4165a107bc69b91de335732242a663
[tools/e2fsprogs.git] / misc / e2label.c
1 /*
2  * e2label.c            - Print or change the volume label on an ext2 fs
3  *
4  * aeb, 970714
5  *
6  */
7
8 #include <fcntl.h>
9 #include <stdio.h>
10
11 #define EXT2_SUPER_MAGIC 0xEF53
12
13 #define VOLNAMSZ 16
14
15 struct ext2_super_block {
16         char  s_dummy0[56];
17         unsigned char  s_magic[2];
18         char  s_dummy1[62];
19         char  s_volume_name[VOLNAMSZ];
20         char  s_last_mounted[64];
21         char  s_dummy2[824];
22 } sb;
23
24 int
25 open_e2fs (char *dev, int mode) {
26         int fd;
27
28         fd = open(dev, mode);
29         if (fd < 0) {
30              perror(dev);
31              fprintf (stderr, "e2label: cannot open %s\n", dev);
32              exit(1);
33         }
34         if (lseek(fd, 1024, SEEK_SET) != 1024) {
35              perror(dev);
36              fprintf (stderr, "e2label: cannot seek to superblock\n");
37              exit(1);
38         }
39         if (read(fd, (char *) &sb, sizeof(sb)) != sizeof(sb)) {
40              perror(dev);
41              fprintf (stderr, "e2label: error reading superblock\n");
42              exit(1);
43         }
44         if (sb.s_magic[0] + 256*sb.s_magic[1] != EXT2_SUPER_MAGIC) {
45              fprintf (stderr, "e2label: not an ext2 filesystem\n");
46              exit(1);
47         }
48
49         return fd;
50 }
51
52 void
53 print_label (char *dev) {
54         char label[VOLNAMSZ+1];
55
56         open_e2fs (dev, O_RDONLY);
57         label[VOLNAMSZ] = 0;
58         strncpy(label, sb.s_volume_name, VOLNAMSZ);
59         printf("%s\n", label);
60 }
61
62 void
63 change_label (char *dev, char *label) {
64         int fd;
65
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) {
70              perror(dev);
71              fprintf (stderr, "e2label: cannot seek to superblock again\n");
72              exit(1);
73         }
74         if (write(fd, (char *) &sb, sizeof(sb)) != sizeof(sb)) {
75              perror(dev);
76              fprintf (stderr, "e2label: error writing superblock\n");
77              exit(1);
78         }
79 }
80
81 int
82 main (int argc, char ** argv) {
83         if (argc == 2)
84              print_label(argv[1]);
85         else if (argc == 3)
86              change_label(argv[1], argv[2]);
87         else {
88              fprintf(stderr, "Usage: e2label device [newlabel]\n");
89              exit(1);
90         }
91         return 0;
92 }