Blame gfs2/tune/main.c

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