Blame gfs2/tune/main.c

Packit 6ef888
#include <stdio.h>
Packit 6ef888
#include <stdlib.h>
Packit 6ef888
#include <libgen.h>
Packit 6ef888
#include <sysexits.h>
Packit 6ef888
Packit 6ef888
#include <sys/types.h>
Packit 6ef888
#include <sys/stat.h>
Packit 6ef888
#include <fcntl.h>
Packit 6ef888
Packit 6ef888
Packit 6ef888
#include <libintl.h>
Packit 6ef888
#define _(String) gettext(String)
Packit 6ef888
Packit 6ef888
#include <string.h>
Packit 6ef888
#include <errno.h>
Packit 6ef888
#include <unistd.h>
Packit 6ef888
#include "tunegfs2.h"
Packit 6ef888
Packit 6ef888
struct tunegfs2 tunegfs2_struct;
Packit 6ef888
struct tunegfs2 *tfs = &tunegfs2_struct;
Packit 6ef888
Packit 6ef888
Packit 6ef888
static void parse_mount_options(char *arg)
Packit 6ef888
{
Packit 6ef888
	struct opt_map *m;
Packit 6ef888
	char *s, *c;
Packit 6ef888
	int l;
Packit 6ef888
	struct opt_map {
Packit 6ef888
		const char *tag;
Packit 6ef888
		int *flag;
Packit 6ef888
		char **val;
Packit 6ef888
	} map[]= {
Packit 6ef888
		{ "lockproto=", &tfs->opt_proto, &tfs->proto },
Packit 6ef888
		{ "locktable=", &tfs->opt_table, &tfs->table },
Packit 6ef888
		{ NULL, 0, NULL }
Packit 6ef888
	};
Packit 6ef888
Packit 6ef888
	s = arg;
Packit 6ef888
	for (m = &map[0]; m->tag; m++) {
Packit 6ef888
		l = strlen(m->tag);
Packit 6ef888
		if (!strncmp(s, m->tag, l)) {
Packit 6ef888
			*(m->flag) = 1;
Packit 6ef888
			*(m->val) = s + l;
Packit 6ef888
			c = strchr(*(m->val), ',');
Packit 6ef888
			if (!c)
Packit 6ef888
				break;
Packit 6ef888
			*c='\0';
Packit 6ef888
			s = c+1;
Packit 6ef888
		}
Packit 6ef888
	}
Packit 6ef888
}
Packit 6ef888
Packit 6ef888
static void usage(char *name)
Packit 6ef888
{
Packit 6ef888
	printf("%s %s [-hlV] [-L <%s>] [-U <%s>] [-o <%s>] <%s>\n",
Packit 6ef888
	       _("Usage:"), basename(name), _("label"), _("UUID"),
Packit 6ef888
	       _("mount options"), _("device"));
Packit 6ef888
}
Packit 6ef888
Packit 6ef888
static void version(void)
Packit 6ef888
{
Packit 6ef888
	printf("tunegfs2 (%s %s)\n", __DATE__, __TIME__);
Packit 6ef888
}
Packit 6ef888
Packit 6ef888
int main(int argc, char **argv)
Packit 6ef888
{
Packit 6ef888
	int c, status;
Packit 6ef888
Packit 6ef888
	memset(tfs, 0, sizeof(struct tunegfs2));
Packit 6ef888
	while((c = getopt(argc, argv, "hL:U:lo:V")) != -1) {
Packit 6ef888
		switch(c) {
Packit 6ef888
		case 'h':
Packit 6ef888
			usage(argv[0]);
Packit 6ef888
			return 0;
Packit 6ef888
		case 'L':
Packit 6ef888
			tfs->opt_label = 1;
Packit 6ef888
			tfs->label = optarg;
Packit 6ef888
			break;
Packit 6ef888
		case 'U':
Packit 6ef888
			tfs->opt_uuid = 1;
Packit 6ef888
			tfs->uuid = optarg;
Packit 6ef888
			break;
Packit 6ef888
		case 'l':
Packit 6ef888
			tfs->opt_list = 1;
Packit 6ef888
			break;
Packit 6ef888
		case 'o':
Packit 6ef888
			parse_mount_options(optarg);
Packit 6ef888
			break;
Packit 6ef888
		case 'V':
Packit 6ef888
			version();
Packit 6ef888
			return 0;
Packit 6ef888
		default:
Packit 6ef888
			fprintf(stderr, _("Invalid option: %c\n"), c);
Packit 6ef888
			usage(argv[0]);
Packit 6ef888
			return EX_USAGE;
Packit 6ef888
		}
Packit 6ef888
	}
Packit 6ef888
Packit 6ef888
	if ((argc - optind) != 1) {
Packit 6ef888
		fprintf(stderr, _("Incorrect number of arguments\n"));
Packit 6ef888
		usage(argv[0]);
Packit 6ef888
		return EX_USAGE;
Packit 6ef888
	}
Packit 6ef888
Packit 6ef888
	if (tfs->opt_label && tfs->opt_table) {
Packit 6ef888
		fprintf(stderr, _("The -L argument cannot be used with the 'locktable' option\n"));
Packit 6ef888
		usage(argv[0]);
Packit 6ef888
		return EX_USAGE;
Packit 6ef888
	}
Packit 6ef888
Packit 6ef888
	tfs->devicename = argv[optind];
Packit 6ef888
	tfs->fd = open(tfs->devicename, O_RDWR); 
Packit 6ef888
Packit 6ef888
	if (tfs->fd < 0) {
Packit 6ef888
		fprintf(stderr, _("Unable to open device %s\n"),
Packit 6ef888
				tfs->devicename);
Packit 6ef888
		return EX_IOERR;
Packit 6ef888
	}
Packit 6ef888
Packit 6ef888
	status = read_super(tfs);
Packit 6ef888
	if (status)
Packit 6ef888
		goto out;
Packit 6ef888
Packit 6ef888
	if (tfs->opt_uuid) {
Packit 6ef888
		status = change_uuid(tfs, tfs->uuid);
Packit 6ef888
		if (status)
Packit 6ef888
			goto out;
Packit 6ef888
	}
Packit 6ef888
Packit 6ef888
	if (tfs->opt_proto) {
Packit 6ef888
		status = change_lockproto(tfs, tfs->proto);
Packit 6ef888
		if (status)
Packit 6ef888
			goto out;
Packit 6ef888
	}
Packit 6ef888
Packit 6ef888
	if (tfs->opt_label) {
Packit 6ef888
		status = change_locktable(tfs, tfs->label);
Packit 6ef888
		if (status)
Packit 6ef888
			goto out;
Packit 6ef888
	}
Packit 6ef888
Packit 6ef888
	if (tfs->opt_table) {
Packit 6ef888
		status = change_locktable(tfs, tfs->table);
Packit 6ef888
		if (status)
Packit 6ef888
			goto out;
Packit 6ef888
	}
Packit 6ef888
Packit 6ef888
	if (tfs->opt_label || tfs->opt_uuid || tfs->opt_table ||
Packit 6ef888
	    tfs->opt_proto) {
Packit 6ef888
		status = write_super(tfs);
Packit 6ef888
		if (status)
Packit 6ef888
			goto out;
Packit 6ef888
	}
Packit 6ef888
Packit 6ef888
	if (tfs->opt_list) {
Packit 6ef888
		version();
Packit 6ef888
		print_super(tfs);
Packit 6ef888
	}
Packit 6ef888
Packit 6ef888
	close(tfs->fd);
Packit 6ef888
out:
Packit 6ef888
	return status;
Packit 6ef888
}