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