/*
* mdadm - manage Linux "md" devices aka RAID arrays.
*
- * Copyright (C) 2001-2002 Neil Brown <neilb@cse.unsw.edu.au>
+ * Copyright (C) 2001-2006 Neil Brown <neilb@suse.de>
*
*
* This program is free software; you can redistribute it and/or modify
char DefaultConfFile[] = CONFFILE;
char DefaultAltConfFile[] = CONFFILE2;
-char *keywords[] = { "devices", "array",
- "mailaddr", "program", "mailfrom",
- "create",
- NULL };
+enum linetype { Devices, Array, Mailaddr, Mailfrom, Program, CreateDev, Homehost, LTEnd };
+char *keywords[] = {
+ [Devices] = "devices",
+ [Array] = "array",
+ [Mailaddr] = "mailaddr",
+ [Mailfrom] = "mailfrom",
+ [Program] = "program",
+ [CreateDev] = "create",
+ [Homehost] = "homehost",
+ [LTEnd] = NULL
+};
/*
* match_keyword returns an index into the keywords array, or -1 for no match
#endif
};
-int parse_auto(char *str, char *msg)
+int parse_auto(char *str, char *msg, int config)
{
int autof;
if (str == NULL || *str == 0)
- autof = -2;
+ autof = 2;
else if (strcasecmp(str,"no")==0)
- autof = -3;
+ autof = 1;
else if (strcasecmp(str,"yes")==0)
- autof = -2;
+ autof = 2;
else if (strcasecmp(str,"md")==0)
- autof = -1;
+ autof = config?5:3;
else {
/* There might be digits, and maybe a hypen, at the end */
char *e = str + strlen(str);
if (e > str && e[-1] == '-')
e--;
len = e - str;
- if ((len == 3 && strncasecmp(str,"mdp",3)==0) ||
- (len == 1 && strncasecmp(str,"p",1)==0) ||
- (len >= 4 && strncasecmp(str,"part",4)==0))
- autof = num;
- else {
+ if ((len == 2 && strncasecmp(str,"md",2)==0)) {
+ autof = config ? 5 : 3;
+ } else if ((len == 3 && strncasecmp(str,"mdp",3)==0)) {
+ autof = config ? 6 : 4;
+ } else if ((len == 1 && strncasecmp(str,"p",1)==0) ||
+ (len >= 4 && strncasecmp(str,"part",4)==0)) {
+ autof = 6;
+ } else {
fprintf(stderr, Name ": %s arg of \"%s\" unrecognised: use no,yes,md,mdp,part\n"
" optionally followed by a number.\n",
msg, str);
exit(2);
}
+ autof |= num << 3;
}
return autof;
}
+
static void createline(char *line)
{
char *w;
for (w=dl_next(line); w!=line; w=dl_next(w)) {
if (strncasecmp(w, "auto=", 5) == 0)
- createinfo.autof = parse_auto(w+5, "auto=");
+ createinfo.autof = parse_auto(w+5, "auto=", 1);
else if (strncasecmp(w, "owner=", 6) == 0) {
if (w[6] == 0) {
fprintf(stderr, Name ": missing owner name\n");
fprintf(stderr, Name ": metadata format %s unknown, ignored.\n", w+9);
} else if (strncasecmp(w, "auto=", 5) == 0 ) {
/* whether to create device special files as needed */
- mis.autof = parse_auto(w+5, "auto type");
+ mis.autof = parse_auto(w+5, "auto type", 0);
} else {
fprintf(stderr, Name ": unrecognised word on ARRAY line: %s\n",
w);
}
}
+static char *home_host = NULL;
+void homehostline(char *line)
+{
+ char *w;
+
+ for (w=dl_next(line); w != line ; w=dl_next(w)) {
+ if (home_host == NULL)
+ home_host = strdup(w);
+ else
+ fprintf(stderr, Name ": excess host name on HOMEHOST line: %s - ignored\n",
+ w);
+ }
+}
+
int loaded = 0;
loaded = 1;
while ((line=conf_line(f))) {
switch(match_keyword(line)) {
- case 0: /* DEVICE */
+ case Devices:
devline(line);
break;
- case 1: /* ARRAY */
+ case Array:
arrayline(line);
break;
- case 2: /* MAIL */
+ case Mailaddr:
mailline(line);
break;
- case 3: /* PROGRAM */
- programline(line);
- break;
- case 4: /* MAILFROM */
+ case Mailfrom:
mailfromline(line);
break;
- case 5: /* CREATE */
+ case Program:
+ programline(line);
+ break;
+ case CreateDev:
createline(line);
break;
+ case Homehost:
+ homehostline(line);
+ break;
default:
fprintf(stderr, Name ": Unknown keyword %s\n", line);
}
return alert_program;
}
+char *conf_get_homehost(char *conffile)
+{
+ load_conffile(conffile);
+ return home_host;
+}
+
struct createinfo *conf_get_create_info(char *conffile)
{
load_conffile(conffile);