diff options
author | Theodore Ts'o <tytso@mit.edu> | 1997-07-14 19:28:55 +0000 |
---|---|---|
committer | Theodore Ts'o <tytso@mit.edu> | 1997-07-14 19:28:55 +0000 |
commit | ab6b8ab64d5afb5393a9aa826fce26490127f785 (patch) | |
tree | c83e166073bc4ed44802054ed8186c2f0d0992df /misc/e2label.c | |
parent | a1230b1376dc5514a260134f53c23f8d2d1e61ce (diff) | |
download | e2fsprogs-ab6b8ab64d5afb5393a9aa826fce26490127f785.tar.gz |
ChangeLog, Makefile.in, e2label.c:
e2label.c: New file contributed by Andries Brouwer which provides an
easy-to-use interface to modify the filesystem label.
Diffstat (limited to 'misc/e2label.c')
-rw-r--r-- | misc/e2label.c | 92 |
1 files changed, 92 insertions, 0 deletions
diff --git a/misc/e2label.c b/misc/e2label.c new file mode 100644 index 00000000..2b4f1711 --- /dev/null +++ b/misc/e2label.c @@ -0,0 +1,92 @@ +/* + * e2label.c - Print or change the volume label on an ext2 fs + * + * aeb, 970714 + * + */ + +#include <fcntl.h> +#include <stdio.h> + +#define EXT2_SUPER_MAGIC 0xEF53 + +#define VOLNAMSZ 16 + +struct ext2_super_block { + char s_dummy0[56]; + unsigned char s_magic[2]; + char s_dummy1[62]; + char s_volume_name[VOLNAMSZ]; + char s_last_mounted[64]; + char s_dummy2[824]; +} sb; + +int +open_e2fs (char *dev, int mode) { + int fd; + + fd = open(dev, mode); + if (fd < 0) { + perror(dev); + fprintf (stderr, "e2label: cannot open %s\n", dev); + exit(1); + } + if (lseek(fd, 1024, SEEK_SET) != 1024) { + perror(dev); + fprintf (stderr, "e2label: cannot seek to superblock\n"); + exit(1); + } + if (read(fd, (char *) &sb, sizeof(sb)) != sizeof(sb)) { + perror(dev); + fprintf (stderr, "e2label: error reading superblock\n"); + exit(1); + } + if (sb.s_magic[0] + 256*sb.s_magic[1] != EXT2_SUPER_MAGIC) { + fprintf (stderr, "e2label: not an ext2 filesystem\n"); + exit(1); + } + + return fd; +} + +void +print_label (char *dev) { + char label[VOLNAMSZ+1]; + + open_e2fs (dev, O_RDONLY); + label[VOLNAMSZ] = 0; + strncpy(label, sb.s_volume_name, VOLNAMSZ); + printf("%s\n", label); +} + +void +change_label (char *dev, char *label) { + int fd; + + fd = open_e2fs(dev, O_RDWR); + memset(sb.s_volume_name, 0, VOLNAMSZ); + strncpy(sb.s_volume_name, label, VOLNAMSZ); + if (lseek(fd, 1024, SEEK_SET) != 1024) { + perror(dev); + fprintf (stderr, "e2label: cannot seek to superblock again\n"); + exit(1); + } + if (write(fd, (char *) &sb, sizeof(sb)) != sizeof(sb)) { + perror(dev); + fprintf (stderr, "e2label: error writing superblock\n"); + exit(1); + } +} + +int +main (int argc, char ** argv) { + if (argc == 2) + print_label(argv[1]); + else if (argc == 3) + change_label(argv[1], argv[2]); + else { + fprintf(stderr, "Usage: e2label device [newlabel]\n"); + exit(1); + } + return 0; +} |