/*
- * mdctl - manage Linux "md" devices aka RAID arrays.
+ * mdadm - manage Linux "md" devices aka RAID arrays.
*
- * Copyright (C) 2001 Neil Brown <neilb@cse.unsw.edu.au>
+ * Copyright (C) 2001-2002 Neil Brown <neilb@cse.unsw.edu.au>
*
*
* This program is free software; you can redistribute it and/or modify
* Australia
*/
-#include "mdctl.h"
+#include "mdadm.h"
#include "dlink.h"
+#include <sys/dir.h>
#include <glob.h>
#include <fnmatch.h>
*
*/
-char DefaultConfFile[] = "/etc/mdctl.conf";
+#ifndef CONFFILE
+#define CONFFILE "/etc/mdadm.conf"
+#endif
+char DefaultConfFile[] = CONFFILE;
-char *keywords[] = { "device", "array", NULL };
+char *keywords[] = { "device", "array", "mailaddr", "program", NULL };
/*
* match_keyword returns an index into the keywords array, or -1 for no match
-int devline(char *line)
+void devline(char *line)
{
char *w;
struct conf_dev *cd;
mis.uuid_set = 0;
mis.super_minor = -1;
+ mis.level = -10;
+ mis.raid_disks = -1;
mis.devices = NULL;
mis.devname = NULL;
+ mis.spare_group = NULL;
for (w=dl_next(line); w!=line; w=dl_next(w)) {
if (w[0] == '/') {
w);
else
mis.spare_group = strdup(w+12);
+ } else if (strncasecmp(w, "level=", 6) == 0 ) {
+ /* this is mainly for compatability with --brief output */
+ mis.level = map_name(pers, w+6);
+ } else if (strncasecmp(w, "disks=", 6) == 0 ) {
+ /* again, for compat */
+ mis.raid_disks = atoi(w+6);
+ } else if (strncasecmp(w, "num-devices=", 12) == 0 ) {
+ /* again, for compat */
+ mis.raid_disks = atoi(w+12);
} else {
fprintf(stderr, Name ": unrecognised word on ARRAY line: %s\n",
w);
mddevlp = &mi->next;
}
}
-
+
+static char *alert_email = NULL;
+void mailline(char *line)
+{
+ char *w;
+
+ for (w=dl_next(line); w != line ; w=dl_next(w)) {
+ if (alert_email == NULL)
+ alert_email = strdup(w);
+ else
+ fprintf(stderr, Name ": excess address on MAIL line: %s - ignored\n",
+ w);
+ }
+}
+
+
+static char *alert_program = NULL;
+void programline(char *line)
+{
+ char *w;
+
+ for (w=dl_next(line); w != line ; w=dl_next(w)) {
+ if (alert_program == NULL)
+ alert_program = strdup(w);
+ else
+ fprintf(stderr, Name ": excess program on PROGRAM line: %s - ignored\n",
+ w);
+ }
+}
+
+
int loaded = 0;
void load_conffile(char *conffile)
case 0: /* DEVICE */
devline(line);
break;
- case 1:
+ case 1: /* ARRAY */
arrayline(line);
break;
+ case 2: /* MAIL */
+ mailline(line);
+ break;
+ case 3: /* PROGRAM */
+ programline(line);
+ break;
default:
fprintf(stderr, Name ": Unknown keyword %s\n", line);
}
/* printf("got file\n"); */
}
+char *conf_get_mailaddr(char *conffile)
+{
+ load_conffile(conffile);
+ return alert_email;
+}
+
+char *conf_get_program(char *conffile)
+{
+ load_conffile(conffile);
+ return alert_program;
+}
+
mddev_ident_t conf_get_ident(char *conffile, char *dev)
{
glob(cd->name, flags, NULL, &globbuf);
flags |= GLOB_APPEND;
}
-
- for (i=0; i<globbuf.gl_pathc; i++) {
- mddev_dev_t t = malloc(sizeof(*t));
- t->devname = strdup(globbuf.gl_pathv[i]);
- t->next = dlist;
- dlist = t;
+ if (flags & GLOB_APPEND) {
+ for (i=0; i<globbuf.gl_pathc; i++) {
+ mddev_dev_t t = malloc(sizeof(*t));
+ t->devname = strdup(globbuf.gl_pathv[i]);
+ t->next = dlist;
+ dlist = t;
/* printf("one dev is %s\n", t->devname);*/
+ }
+ globfree(&globbuf);
}
- globfree(&globbuf);
-
return dlist;
}