diff options
author | NeilBrown <neilb@suse.de> | 2008-11-04 20:50:39 +1100 |
---|---|---|
committer | NeilBrown <neilb@suse.de> | 2008-11-04 20:50:39 +1100 |
commit | 11fb4c054f7e440be699be5db683e891e3eaf3a5 (patch) | |
tree | 2e6b32b3ab26e119d3691b62944366adeefb7ce0 | |
parent | a4bc1720ff51ed81ef3cd088f362d3a8a80bd1bc (diff) | |
download | mdadm-11fb4c054f7e440be699be5db683e891e3eaf3a5.tar.gz mdadm-11fb4c054f7e440be699be5db683e891e3eaf3a5.tar.xz mdadm-11fb4c054f7e440be699be5db683e891e3eaf3a5.zip |
mdopen: fix up name parsing.
I think this is closer to what I want. Fewer surprises anyway.
-rw-r--r-- | mdopen.c | 33 |
1 files changed, 24 insertions, 9 deletions
@@ -180,25 +180,40 @@ int create_mddev(char *dev, char *name, int autof, int trustworthy, use_mdp = 0; else use_mdp = 1; + /* recreate name: /dev/md/0 or /dev/md/d0 */ + sprintf(cname, "%s%d", use_mdp?"d":"", num); } else strcpy(cname, dev); - /* 'cname' must not contain a slash, may not start or end - * with a digit, and may only be empty if num is present. + /* 'cname' must not contain a slash, and may not be + * empty. */ - if (strchr(cname, '/') != NULL || - isdigit(cname[0]) || - (cname[0] && isdigit(cname[strlen(cname)])) - ) { + if (strchr(cname, '/') != NULL) { fprintf(stderr, Name ": %s is an invalid name " "for an md device.\n", dev); return -1; } - if (cname[0] == 0 && num < 0) { + if (cname[0] == 0) { fprintf(stderr, Name ": %s is an invalid name " "for an md device (empty!).", dev); return -1; } + if (num < 0) { + /* If cname is 'N' or 'dN', we get dev number + * from there. + */ + char *sp = cname; + char *ep; + if (cname[0] == 'd') + sp++; + num = strtoul(sp, &ep, 10); + if (ep == sp || *ep || num < 0) + num = -1; + else if (cname[0] == 'd') + use_mdp = 1; + else + use_mdp = 0; + } } /* Now determine device number */ @@ -271,8 +286,8 @@ int create_mddev(char *dev, char *name, int autof, int trustworthy, strcpy(chosen, devname); /* We have a device number and name. - * If we can detect udev, just open the device and we - * are done. + * If we cannot detect udev, we need to make + * devices and links ourselves. */ if (stat("/dev/.udev", &stb) != 0 || check_env("MDADM_NO_UDEV")) { |