1*6a54128fSAndroid Build Coastguard Worker /*
2*6a54128fSAndroid Build Coastguard Worker * e2label.c - Print or change the volume label on an ext2 fs
3*6a54128fSAndroid Build Coastguard Worker *
4*6a54128fSAndroid Build Coastguard Worker * Written by Andries Brouwer ([email protected]), 970714
5*6a54128fSAndroid Build Coastguard Worker *
6*6a54128fSAndroid Build Coastguard Worker * Copyright 1997, 1998 by Theodore Ts'o.
7*6a54128fSAndroid Build Coastguard Worker *
8*6a54128fSAndroid Build Coastguard Worker * %Begin-Header%
9*6a54128fSAndroid Build Coastguard Worker * This file may be redistributed under the terms of the GNU Public
10*6a54128fSAndroid Build Coastguard Worker * License.
11*6a54128fSAndroid Build Coastguard Worker * %End-Header%
12*6a54128fSAndroid Build Coastguard Worker */
13*6a54128fSAndroid Build Coastguard Worker
14*6a54128fSAndroid Build Coastguard Worker #include "config.h"
15*6a54128fSAndroid Build Coastguard Worker #include <stdio.h>
16*6a54128fSAndroid Build Coastguard Worker #include <string.h>
17*6a54128fSAndroid Build Coastguard Worker #include <fcntl.h>
18*6a54128fSAndroid Build Coastguard Worker #include <ctype.h>
19*6a54128fSAndroid Build Coastguard Worker #include <termios.h>
20*6a54128fSAndroid Build Coastguard Worker #include <time.h>
21*6a54128fSAndroid Build Coastguard Worker #ifdef HAVE_GETOPT_H
22*6a54128fSAndroid Build Coastguard Worker #include <getopt.h>
23*6a54128fSAndroid Build Coastguard Worker #else
24*6a54128fSAndroid Build Coastguard Worker extern char *optarg;
25*6a54128fSAndroid Build Coastguard Worker extern int optind;
26*6a54128fSAndroid Build Coastguard Worker #endif
27*6a54128fSAndroid Build Coastguard Worker #ifdef HAVE_UNISTD_H
28*6a54128fSAndroid Build Coastguard Worker #include <unistd.h>
29*6a54128fSAndroid Build Coastguard Worker #endif
30*6a54128fSAndroid Build Coastguard Worker #ifdef HAVE_STDLIB_H
31*6a54128fSAndroid Build Coastguard Worker #include <stdlib.h>
32*6a54128fSAndroid Build Coastguard Worker #endif
33*6a54128fSAndroid Build Coastguard Worker #ifdef HAVE_ERRNO_H
34*6a54128fSAndroid Build Coastguard Worker #include <errno.h>
35*6a54128fSAndroid Build Coastguard Worker #endif
36*6a54128fSAndroid Build Coastguard Worker #include "support/nls-enable.h"
37*6a54128fSAndroid Build Coastguard Worker
38*6a54128fSAndroid Build Coastguard Worker #define EXT2_SUPER_MAGIC 0xEF53
39*6a54128fSAndroid Build Coastguard Worker
40*6a54128fSAndroid Build Coastguard Worker #define VOLNAMSZ 16
41*6a54128fSAndroid Build Coastguard Worker
42*6a54128fSAndroid Build Coastguard Worker struct ext2_super_block {
43*6a54128fSAndroid Build Coastguard Worker char s_dummy0[56];
44*6a54128fSAndroid Build Coastguard Worker unsigned char s_magic[2];
45*6a54128fSAndroid Build Coastguard Worker char s_dummy1[62];
46*6a54128fSAndroid Build Coastguard Worker char s_volume_name[VOLNAMSZ];
47*6a54128fSAndroid Build Coastguard Worker char s_last_mounted[64];
48*6a54128fSAndroid Build Coastguard Worker char s_dummy2[824];
49*6a54128fSAndroid Build Coastguard Worker } sb;
50*6a54128fSAndroid Build Coastguard Worker
open_e2fs(char * dev,int mode)51*6a54128fSAndroid Build Coastguard Worker static int open_e2fs (char *dev, int mode)
52*6a54128fSAndroid Build Coastguard Worker {
53*6a54128fSAndroid Build Coastguard Worker int fd;
54*6a54128fSAndroid Build Coastguard Worker
55*6a54128fSAndroid Build Coastguard Worker fd = open(dev, mode);
56*6a54128fSAndroid Build Coastguard Worker if (fd < 0) {
57*6a54128fSAndroid Build Coastguard Worker perror(dev);
58*6a54128fSAndroid Build Coastguard Worker fprintf (stderr, _("e2label: cannot open %s\n"), dev);
59*6a54128fSAndroid Build Coastguard Worker exit(1);
60*6a54128fSAndroid Build Coastguard Worker }
61*6a54128fSAndroid Build Coastguard Worker if (lseek(fd, 1024, SEEK_SET) != 1024) {
62*6a54128fSAndroid Build Coastguard Worker perror(dev);
63*6a54128fSAndroid Build Coastguard Worker fprintf (stderr, _("e2label: cannot seek to superblock\n"));
64*6a54128fSAndroid Build Coastguard Worker exit(1);
65*6a54128fSAndroid Build Coastguard Worker }
66*6a54128fSAndroid Build Coastguard Worker if (read(fd, (char *) &sb, sizeof(sb)) != sizeof(sb)) {
67*6a54128fSAndroid Build Coastguard Worker perror(dev);
68*6a54128fSAndroid Build Coastguard Worker fprintf (stderr, _("e2label: error reading superblock\n"));
69*6a54128fSAndroid Build Coastguard Worker exit(1);
70*6a54128fSAndroid Build Coastguard Worker }
71*6a54128fSAndroid Build Coastguard Worker if (sb.s_magic[0] + 256*sb.s_magic[1] != EXT2_SUPER_MAGIC) {
72*6a54128fSAndroid Build Coastguard Worker fprintf (stderr, _("e2label: not an ext2 filesystem\n"));
73*6a54128fSAndroid Build Coastguard Worker exit(1);
74*6a54128fSAndroid Build Coastguard Worker }
75*6a54128fSAndroid Build Coastguard Worker
76*6a54128fSAndroid Build Coastguard Worker return fd;
77*6a54128fSAndroid Build Coastguard Worker }
78*6a54128fSAndroid Build Coastguard Worker
print_label(char * dev)79*6a54128fSAndroid Build Coastguard Worker static void print_label (char *dev)
80*6a54128fSAndroid Build Coastguard Worker {
81*6a54128fSAndroid Build Coastguard Worker char label[VOLNAMSZ+1];
82*6a54128fSAndroid Build Coastguard Worker
83*6a54128fSAndroid Build Coastguard Worker open_e2fs (dev, O_RDONLY);
84*6a54128fSAndroid Build Coastguard Worker snprintf(label, sizeof(label), "%.*s", EXT2_LEN_STR(sb.s_volume_name));
85*6a54128fSAndroid Build Coastguard Worker label[VOLNAMSZ] = 0;
86*6a54128fSAndroid Build Coastguard Worker printf("%s\n", label);
87*6a54128fSAndroid Build Coastguard Worker }
88*6a54128fSAndroid Build Coastguard Worker
change_label(char * dev,char * label)89*6a54128fSAndroid Build Coastguard Worker static void change_label (char *dev, char *label)
90*6a54128fSAndroid Build Coastguard Worker {
91*6a54128fSAndroid Build Coastguard Worker int fd;
92*6a54128fSAndroid Build Coastguard Worker
93*6a54128fSAndroid Build Coastguard Worker fd = open_e2fs(dev, O_RDWR);
94*6a54128fSAndroid Build Coastguard Worker memset(sb.s_volume_name, 0, VOLNAMSZ);
95*6a54128fSAndroid Build Coastguard Worker strncpy(sb.s_volume_name, label, VOLNAMSZ);
96*6a54128fSAndroid Build Coastguard Worker if (strlen(label) > VOLNAMSZ)
97*6a54128fSAndroid Build Coastguard Worker fprintf(stderr, _("Warning: label too long, truncating.\n"));
98*6a54128fSAndroid Build Coastguard Worker if (lseek(fd, 1024, SEEK_SET) != 1024) {
99*6a54128fSAndroid Build Coastguard Worker perror(dev);
100*6a54128fSAndroid Build Coastguard Worker fprintf (stderr, _("e2label: cannot seek to superblock again\n"));
101*6a54128fSAndroid Build Coastguard Worker exit(1);
102*6a54128fSAndroid Build Coastguard Worker }
103*6a54128fSAndroid Build Coastguard Worker if (write(fd, (char *) &sb, sizeof(sb)) != sizeof(sb)) {
104*6a54128fSAndroid Build Coastguard Worker perror(dev);
105*6a54128fSAndroid Build Coastguard Worker fprintf (stderr, _("e2label: error writing superblock\n"));
106*6a54128fSAndroid Build Coastguard Worker exit(1);
107*6a54128fSAndroid Build Coastguard Worker }
108*6a54128fSAndroid Build Coastguard Worker }
109*6a54128fSAndroid Build Coastguard Worker
main(int argc,char ** argv)110*6a54128fSAndroid Build Coastguard Worker int main (int argc, char ** argv)
111*6a54128fSAndroid Build Coastguard Worker {
112*6a54128fSAndroid Build Coastguard Worker if (argc == 2)
113*6a54128fSAndroid Build Coastguard Worker print_label(argv[1]);
114*6a54128fSAndroid Build Coastguard Worker else if (argc == 3)
115*6a54128fSAndroid Build Coastguard Worker change_label(argv[1], argv[2]);
116*6a54128fSAndroid Build Coastguard Worker else {
117*6a54128fSAndroid Build Coastguard Worker fprintf(stderr, _("Usage: e2label device [newlabel]\n"));
118*6a54128fSAndroid Build Coastguard Worker exit(1);
119*6a54128fSAndroid Build Coastguard Worker }
120*6a54128fSAndroid Build Coastguard Worker return 0;
121*6a54128fSAndroid Build Coastguard Worker }
122