void conf_file(FILE *f) { char *line; while ((line=conf_line(f))) { switch(match_keyword(line)) { case Devices: devline(line); break; case Array: arrayline(line); break; case Mailaddr: mailline(line); break; case Mailfrom: mailfromline(line); break; case Program: programline(line); break; case CreateDev: createline(line); break; case Homehost: homehostline(line); break; case AutoMode: autoline(line); break; case Policy: policyline(line, rule_policy); break; case PartPolicy: policyline(line, rule_part); break; default: pr_err("Unknown keyword %s\n", line); } free_line(line); } }
void load_conffile(char *conffile) { FILE *f; char *line; if (loaded) return; if (conffile == NULL) conffile = DefaultConfFile; 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; } if (f == NULL) return; loaded = 1; while ((line=conf_line(f))) { switch(match_keyword(line)) { case 0: /* DEVICE */ devline(line); break; 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); } free_line(line); } fclose(f); /* printf("got file\n"); */ }
void load_conffile(void) { FILE *f; char *line; if (loaded) return; if (conffile == NULL) conffile = DefaultConfFile; 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; } if (f == NULL) return; loaded = 1; while ((line=conf_line(f))) { switch(match_keyword(line)) { case Devices: devline(line); break; case Array: arrayline(line); break; case Mailaddr: mailline(line); break; case Mailfrom: mailfromline(line); break; case Program: programline(line); break; case CreateDev: createline(line); break; case Homehost: homehostline(line); break; default: fprintf(stderr, Name ": Unknown keyword %s\n", line); } free_line(line); } fclose(f); /* printf("got file\n"); */ }
struct mdstat_ent *mdstat_read(int hold, int start) { FILE *f; struct mdstat_ent *all, *rv, **end, **insert_here; char *line; if (hold && mdstat_fd != -1) { lseek(mdstat_fd, 0L, 0); f = fdopen(dup(mdstat_fd), "r"); } else f = fopen("/proc/mdstat", "r"); if (f == NULL) return NULL; all = NULL; end = &all; for (; (line = conf_line(f)) ; free_line(line)) { struct mdstat_ent *ent; char *w; int devnum; int in_devs = 0; char *ep; if (strcmp(line, "Personalities")==0) continue; if (strcmp(line, "read_ahead")==0) continue; if (strcmp(line, "unused")==0) continue; insert_here = NULL; /* Better be an md line.. */ if (strncmp(line, "md", 2)!= 0) continue; if (strncmp(line, "md_d", 4) == 0) devnum = -1-strtoul(line+4, &ep, 10); else if (strncmp(line, "md", 2) == 0) devnum = strtoul(line+2, &ep, 10); else continue; if (ep == NULL || *ep ) { /* fprintf(stderr, Name ": bad /proc/mdstat line starts: %s\n", line); */ continue; } ent = malloc(sizeof(*ent)); if (!ent) { fprintf(stderr, Name ": malloc failed reading /proc/mdstat.\n"); free_line(line); break; } ent->dev = ent->level = ent->pattern= NULL; ent->next = NULL; ent->percent = -1; ent->active = -1; ent->resync = 0; ent->dev = strdup(line); ent->devnum = devnum; for (w=dl_next(line); w!= line ; w=dl_next(w)) { int l = strlen(w); char *eq; if (strcmp(w, "active")==0) ent->active = 1; else if (strcmp(w, "inactive")==0) ent->active = 0; else if (ent->active >=0 && ent->level == NULL && w[0] != '(' /*readonly*/) { ent->level = strdup(w); in_devs = 1; } else if (in_devs && strcmp(w, "blocks")==0) in_devs = 0; else if (in_devs && strncmp(w, "md", 2)==0) { /* This has an md device as a component. * If that device is already in the list, * make sure we insert before there. */ struct mdstat_ent **ih; int dn2; if (strncmp(w, "md_d", 4)==0) dn2 = -1-strtoul(w+4, &ep, 10); else dn2 = strtoul(w+2, &ep, 10); ih = &all; while (ih != insert_here && *ih && (*ih)->devnum != dn2) ih = & (*ih)->next; insert_here = ih; } else if (!ent->pattern && w[0] == '[' && (w[1] == 'U' || w[1] == '_')) { ent->pattern = strdup(w+1); if (ent->pattern[l-2]==']') ent->pattern[l-2] = '\0'; } else if (ent->percent == -1 && strncmp(w, "re", 2)== 0 && w[l-1] == '%' && (eq=strchr(w, '=')) != NULL ) { ent->percent = atoi(eq+1); if (strncmp(w,"resync", 4)==0) ent->resync = 1; } else if (ent->percent == -1 && strncmp(w, "resync", 4)==0) { ent->resync = 1; } else if (ent->percent == -1 && w[0] >= '0' && w[0] <= '9' && w[l-1] == '%') { ent->percent = atoi(w); } } if (insert_here && (*insert_here)) { ent->next = *insert_here; *insert_here = ent; } else { *end = ent; end = &ent->next; } } if (hold && mdstat_fd == -1) mdstat_fd = dup(fileno(f)); fclose(f); /* If we might want to start array, * reverse the order, so that components comes before composites */ if (start) { rv = NULL; while (all) { struct mdstat_ent *e = all; all = all->next; e->next = rv; rv = e; } } else rv = all; return rv; }