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