summaryrefslogtreecommitdiffstats
path: root/mdk-stage1/probing.c
diff options
context:
space:
mode:
authorPascal Terjan <pterjan@mandriva.org>2010-05-13 07:58:38 +0000
committerPascal Terjan <pterjan@mandriva.org>2010-05-13 07:58:38 +0000
commitbaa779e2924f0291af7a4f8cb12253a0ce22882c (patch)
tree2aaa778a69b0718e4714ad173c7b57720409ecce /mdk-stage1/probing.c
parent41e0b5990407bcf4b3b4dafae11af2ad2d665e05 (diff)
downloaddrakx-baa779e2924f0291af7a4f8cb12253a0ce22882c.tar
drakx-baa779e2924f0291af7a4f8cb12253a0ce22882c.tar.gz
drakx-baa779e2924f0291af7a4f8cb12253a0ce22882c.tar.bz2
drakx-baa779e2924f0291af7a4f8cb12253a0ce22882c.tar.xz
drakx-baa779e2924f0291af7a4f8cb12253a0ce22882c.zip
create devices listed in /proc/partitions with correct major/minor (#57032)
Diffstat (limited to 'mdk-stage1/probing.c')
-rw-r--r--mdk-stage1/probing.c18
1 files changed, 15 insertions, 3 deletions
diff --git a/mdk-stage1/probing.c b/mdk-stage1/probing.c
index 3f9621705..f2f9fb52c 100644
--- a/mdk-stage1/probing.c
+++ b/mdk-stage1/probing.c
@@ -766,12 +766,24 @@ void find_media(enum media_bus bus)
log_message("Couldn't open /proc/partitions");
} else {
while (fgets(buf, sizeof(buf), f)) {
- char name[100];
+ char name[100] = "/dev/";
int major, minor, blocks;
+ struct stat statbuf;
+ char *ptr;
memset(name, 0, sizeof(name));
- sscanf(buf, " %d %d %d %s", &major, &minor, &blocks, name);
- if (streq(name, tmp_name) && tmp[count].type == DISK && ((blocks == 1048575) || (blocks == 1440)))
+ sscanf(buf, " %d %d %d %s", &major, &minor, &blocks, &name[5]);
+ if (streq(&name[5], tmp_name) && tmp[count].type == DISK && ((blocks == 1048575) || (blocks == 1440)))
tmp[count].type = FLOPPY;
+ /* Try to create all devices while we have major/minor */
+ if ((ptr = strchr(&name[5], '/'))) {
+ *ptr = '\0';
+ if (stat(name, &statbuf))
+ mkdir(name, 0755);
+ *ptr = '/';
+ }
+ if (stat(name, &statbuf) && mknod(name, S_IFBLK | 0600, makedev(major, minor))) {
+ log_perror(name);
+ }
}
fclose(f);
}