e2fsprogs/misc/e2label.c
Theodore Ts'o d1154eb460 Shorten compile commands run by the build system
The DEFS line in MCONFIG had gotten so long that it exceeded 4k, and
this was starting to cause some tools heartburn.  It also made "make
V=1" almost useless, since trying to following the individual commands
run by make was lost in the noise of all of the defines.

So fix this by putting the configure-generated defines in lib/config.h
and the directory pathnames to lib/dirpaths.h.

In addition, clean up some vestigal defines in configure.in and in the
Makefiles to further shorten the cc command lines.

Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
2011-09-18 17:34:37 -04:00

122 lines
2.5 KiB
C

/*
* 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 "config.h"
#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;
}