/*
 * e2label.c		- Print or change the volume label on an ext2 fs
 *
 * Written by Andries Brouwer (aeb@cwi.nl), 970714
 * 
 * Copyright 1997, 1998 by Theodore Ts'o.
 *
 * %Begin-Header%
 * This file may be redistributed under the terms of the GNU Public
 * License.
 * %End-Header%
 */

#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <ctype.h>
#include <termios.h>
#include <time.h>
#ifdef HAVE_GETOPT_H
#include <getopt.h>
#else
extern char *optarg;
extern int optind;
#endif
#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif
#ifdef HAVE_STDLIB_H
#include <stdlib.h>
#endif
#ifdef HAVE_ERRNO_H
#include <errno.h>
#endif
#include "nls-enable.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;

static 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;
}

static void print_label (char *dev)
{
	char label[VOLNAMSZ+1];

	open_e2fs (dev, O_RDONLY);
	strncpy(label, sb.s_volume_name, VOLNAMSZ);
	label[VOLNAMSZ] = 0;
	printf("%s\n", label);
}

static 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 (strlen(label) > VOLNAMSZ)
		fprintf(stderr, _("Warning: label too long, truncating.\n"));
	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;
}
