]> git.ipfire.org Git - thirdparty/mdadm.git/blobdiff - config.c
mdadm-1.0.0
[thirdparty/mdadm.git] / config.c
index 39ef56ba1db928c40b9fda4818e9d5184d5dc321..eef32480076efb93247789ddf7efdca53bf30ed1 100644 (file)
--- a/config.c
+++ b/config.c
@@ -1,7 +1,7 @@
 /*
- * 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
@@ -27,8 +27,9 @@
  *           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
@@ -199,7 +203,7 @@ struct conf_dev {
 
 
 
-int devline(char *line) 
+void devline(char *line) 
 {
        char *w;
        struct conf_dev *cd;
@@ -229,8 +233,11 @@ void arrayline(char *line)
 
        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] == '/') {
@@ -273,6 +280,15 @@ void arrayline(char *line)
                                        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);
@@ -291,7 +307,37 @@ void arrayline(char *line)
                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)
@@ -313,9 +359,15 @@ 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);
                }
@@ -326,6 +378,18 @@ void load_conffile(char *conffile)
 /*    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)
 {
@@ -358,16 +422,16 @@ mddev_dev_t conf_get_devs(char *conffile)
                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;
 }