.autof = 2, /* by default, create devices with standard names */
.symlinks = 1,
.names = 0, /* By default, stick with numbered md devices. */
+ .bblist = 1, /* Use a bad block list by default */
#ifdef DEBIAN
.gid = 6, /* disk */
.mode = 0660,
createinfo.names = 1;
else if (strncasecmp(w, "names=no", 11) == 0)
createinfo.names = 0;
+ else if (strncasecmp(w, "bbl=no", 11) == 0)
+ createinfo.bblist = 0;
+ else if (strncasecmp(w, "bbl=yes", 11) == 0)
+ createinfo.bblist = 1;
else {
pr_err("unrecognised word on CREATE line: %s\n",
w);
{
char *w;
- for (w=dl_next(line); w != line ; w=dl_next(w)) {
+ for (w=dl_next(line); w != line ; w=dl_next(w))
if (alert_email == NULL)
alert_email = xstrdup(w);
- else
- pr_err("excess address on MAIL line: %s - ignored\n",
- w);
- }
}
static char *alert_mail_from = NULL;
{
char *w;
- for (w=dl_next(line); w != line ; w=dl_next(w)) {
+ for (w=dl_next(line); w != line ; w=dl_next(w))
if (alert_program == NULL)
alert_program = xstrdup(w);
- else
- pr_err("excess program on PROGRAM line: %s - ignored\n",
- w);
- }
}
static char *home_host = NULL;
home_host = xstrdup("");
else
home_host = xstrdup(w);
- }else
- pr_err("excess host name on HOMEHOST line: %s - ignored\n",
- w);
+ }
}
}
int homehost = 0;
int i;
- if (auto_seen) {
- pr_err("AUTO line may only be give once."
- " Subsequent lines ignored\n");
+ if (auto_seen)
return;
- }
+ auto_seen = 1;
+
/* Parse the 'auto' line creating policy statements for the 'auto' policy.
*
* The default is 'yes' but the 'auto' line might over-ride that.
* been seen gets an appropriate auto= entry.
*/
+ /* If environment variable MDADM_CONF_AUTO is defined, then
+ * it is prepended to the auto line. This allow a script
+ * to easily disable some metadata types.
+ */
+ w = getenv("MDADM_CONF_AUTO");
+ if (w && *w) {
+ char *l = xstrdup(w);
+ char *head = line;
+ w = strtok(l, " \t");
+ while (w) {
+ char *nw = dl_strdup(w);
+ dl_insert(head, nw);
+ head = nw;
+ w = strtok(NULL, " \t");
+ }
+ free(l);
+ }
+
for (super_cnt = 0; superlist[super_cnt]; super_cnt++)
;
seen = xcalloc(super_cnt, 1);
{
FILE *f;
char *confdir = NULL;
+ char *head;
- if (loaded) return;
+ if (loaded)
+ return;
if (conffile == NULL) {
conffile = DefaultConfFile;
confdir = DefaultConfDir;
}
- if (strcmp(conffile, "none") == 0) {
- loaded = 1;
- return;
- }
if (strcmp(conffile, "partitions")==0) {
char *list = dl_strdup("DEV");
dl_init(list);
dl_add(list, dl_strdup("partitions"));
devline(list);
free_line(list);
- loaded = 1;
- return;
- }
- f = fopen(conffile, "r");
- /* Debian chose to relocate mdadm.conf into /etc/mdadm/.
- * To allow Debian users to compile from clean source and still
- * have a working mdadm, we read /etc/mdadm/mdadm.conf
- * if /etc/mdadm.conf doesn't exist
- */
- if (f == NULL &&
- conffile == DefaultConfFile) {
- f = fopen(DefaultAltConfFile, "r");
- if (f) {
- conffile = DefaultAltConfFile;
- confdir = DefaultAltConfDir;
+ } else if (strcmp(conffile, "none") != 0) {
+ f = fopen(conffile, "r");
+ /* Debian chose to relocate mdadm.conf into /etc/mdadm/.
+ * To allow Debian users to compile from clean source and still
+ * have a working mdadm, we read /etc/mdadm/mdadm.conf
+ * if /etc/mdadm.conf doesn't exist
+ */
+ if (f == NULL &&
+ conffile == DefaultConfFile) {
+ f = fopen(DefaultAltConfFile, "r");
+ if (f) {
+ conffile = DefaultAltConfFile;
+ confdir = DefaultAltConfDir;
+ }
}
- }
- if (f) {
- loaded = 1;
- conf_file_or_dir(f);
- fclose(f);
- }
- if (confdir) {
- f = fopen(confdir, "r");
if (f) {
- loaded = 1;
conf_file_or_dir(f);
fclose(f);
}
+ if (confdir) {
+ f = fopen(confdir, "r");
+ if (f) {
+ conf_file_or_dir(f);
+ fclose(f);
+ }
+ }
}
+ /* If there was no AUTO line, process an empty line
+ * now so that the MDADM_CONF_AUTO env var gets processed.
+ */
+ head = dl_strdup("AUTO");
+ dl_init(head);
+ autoline(head);
+ free_line(head);
+
+ loaded = 1;
}
char *conf_get_mailaddr(void)