1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125
|
/*
* Copyright (C) 2004-2006 by CERN/IT/GD/CT
* All rights reserved
*/
#ifndef lint
static char sccsid[] = "@(#)$RCSfile: dpm-addfs.c,v $ $Revision: 1.3 $ $Date: 2007/01/09 10:12:30 $ CERN IT-GD/CT Jean-Philippe Baud";
#endif /* not lint */
/* dpm-addfs - add a filesystem to a disk pool */
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include "Cgetopt.h"
#include "dpm_api.h"
#include "serrno.h"
int help_flag;
main(argc, argv)
int argc;
char **argv;
{
int c;
char *dp;
int errflg = 0;
char *fs = NULL;
static struct Coptions longopts[] = {
{"fs", REQUIRED_ARGUMENT, 0, OPT_FS},
{"help", NO_ARGUMENT, &help_flag, 1},
{"poolname", REQUIRED_ARGUMENT, 0, OPT_POOL_NAME},
{"server", REQUIRED_ARGUMENT, 0, OPT_FS_SERVER},
{"status", REQUIRED_ARGUMENT, 0, OPT_STATUS},
{0, 0, 0, 0}
};
char *p;
char *poolname = NULL;
char *server = NULL;
int status = 0;
char statusa[50];
Copterr = 1;
Coptind = 1;
while ((c = Cgetopt_long (argc, argv, "", longopts, NULL)) != EOF) {
switch (c) {
case OPT_FS:
if (strlen (Coptarg) > 79) {
fprintf (stderr,
"filesystem name too long: %s\n", Coptarg);
errflg++;
} else
fs = Coptarg;
break;
case OPT_FS_SERVER:
if (strlen (Coptarg) > CA_MAXHOSTNAMELEN) {
fprintf (stderr,
"server name too long: %s\n", Coptarg);
errflg++;
} else
server = Coptarg;
break;
case OPT_POOL_NAME:
if (strlen (Coptarg) > CA_MAXPOOLNAMELEN) {
fprintf (stderr,
"pool name too long: %s\n", Coptarg);
errflg++;
} else
poolname = Coptarg;
break;
case OPT_STATUS:
if (isdigit (*Coptarg)) {
if ((status = strtol (Coptarg, &dp, 10)) < 0 ||
*dp != '\0') {
fprintf (stderr,
"invalid status %s\n", Coptarg);
errflg++;
}
} else {
if (strlen (Coptarg) >= sizeof (statusa)) {
fprintf (stderr,
"invalid status %s\n", Coptarg);
errflg++;
break;
}
status = 0;
strcpy (statusa, Coptarg);
p = strtok (statusa, "|");
while (p) {
if (strcmp (p, "DISABLED") == 0)
status |= FS_DISABLED;
else if (strcmp (p, "RDONLY") == 0)
status |= FS_RDONLY;
else {
fprintf (stderr,
"invalid status %s\n", Coptarg);
errflg++;
break;
}
p = strtok (NULL, "|");
}
}
break;
case '?':
errflg++;
break;
default:
break;
}
}
if (Coptind < argc || poolname == NULL || server == NULL || fs == NULL) {
errflg++;
}
if (errflg || help_flag) {
fprintf (stderr, "usage: %s %s", argv[0],
"--poolname pool_name --server fs_server --fs fs_name [--st status] [--help]\n");
exit (errflg ? USERR : 0);
}
if (dpm_addfs (poolname, server, fs, status) < 0) {
fprintf (stderr, "dpm-addfs %s %s %s: %s\n", poolname, server,
fs, (serrno == EEXIST) ? "Filesystem already part of a pool" : sstrerror(serrno));
exit (USERR);
}
exit (0);
}
|