diff options
Diffstat (limited to 'mdk-stage1/mount.c')
| -rw-r--r-- | mdk-stage1/mount.c | 154 | 
1 files changed, 20 insertions, 134 deletions
| diff --git a/mdk-stage1/mount.c b/mdk-stage1/mount.c index 40b94a8ec..14b2b2fc2 100644 --- a/mdk-stage1/mount.c +++ b/mdk-stage1/mount.c @@ -1,7 +1,7 @@  /* - * Guillaume Cottenceau (gc@mandrakesoft.com) + * Guillaume Cottenceau (gc)   * - * Copyright 2000 Mandrakesoft + * Copyright 2000 Mandriva   *   * This software may be freely redistributed under the terms of the GNU   * public license. @@ -19,14 +19,17 @@   *   */ +// for asprintf: +#define _GNU_SOURCE +#include <stdio.h>  #include <stdlib.h>  #include <unistd.h>  #include <string.h> -#include <stdio.h>  #include <sys/mount.h>  #include <sys/stat.h>  #include <sys/types.h>  #include "log.h" +#include "utils.h"  #include "modules.h"  #include "mount.h" @@ -36,110 +39,16 @@  /* WARNING: this won't work if the argument is not /dev/ based */  int ensure_dev_exists(const char * dev)  { -	int major, minor; -	int type = S_IFBLK; /* my default type is block. don't forget to change for chars */ -	const char * name;  	struct stat buf; -	char * ptr; -	name = &dev[5]; /* we really need that dev be passed as /dev/something.. */ -  	if (!stat(dev, &buf))  		return 0; /* if the file already exists, we assume it's correct */ -	if (ptr_begins_static_str(name, "sd")) { -		/* SCSI disks */ -		major = 8; -		minor = (name[2] - 'a') << 4; -		if (name[3] && name[4]) -			minor += 10 + (name[4] - '0'); -		else if (name[3]) -			minor += (name[3] - '0'); -	} else if (ptr_begins_static_str(name, "hd")) { -		/* IDE disks/cd's */ -		if (name[2] == 'a') -			major = 3, minor = 0; -		else if (name[2] == 'b') -			major = 3, minor = 64; -		else if (name[2] == 'c') -			major = 22, minor = 0; -		else if (name[2] == 'd') -			major = 22, minor = 64; -		else if (name[2] == 'e') -			major = 33, minor = 0; -		else if (name[2] == 'f') -			major = 33, minor = 64; -		else if (name[2] == 'g') -			major = 34, minor = 0; -		else if (name[2] == 'h') -			major = 34, minor = 64; -		else if (name[2] == 'i') -			major = 56, minor = 0; -		else if (name[2] == 'j') -			major = 56, minor = 64; -		else if (name[2] == 'k') -			major = 57, minor = 0; -		else if (name[2] == 'l') -			major = 57, minor = 64; -		else if (name[2] == 'm') -			major = 88, minor = 0; -		else if (name[2] == 'n') -			major = 88, minor = 64; -		else if (name[2] == 'o') -			major = 89, minor = 0; -		else if (name[2] == 'p') -			major = 89, minor = 64; -		else if (name[2] == 'q') -			major = 90, minor = 0; -		else if (name[2] == 'r') -			major = 90, minor = 64; -		else if (name[2] == 's') -			major = 91, minor = 0; -		else if (name[2] == 't') -			major = 91, minor = 64; -		else -			return -1; -		 -		if (name[3] && name[4]) -			minor += 10 + (name[4] - '0'); -		else if (name[3]) -			minor += (name[3] - '0'); -	} else if (ptr_begins_static_str(name , "sr")) { -		/* SCSI cd's */ -		major = 11; -		minor = name[2] - '0'; -	} else if (ptr_begins_static_str(name, "ida/") || -		   ptr_begins_static_str(name, "cciss/")) { -		/* Compaq Smart Array "ida/c0d0{p1}" */ -		ptr = strchr(name, '/'); -		mkdir("/dev/ida", 0755); -		mkdir("/dev/cciss", 0755); -		major = ptr_begins_static_str(name, "ida/") ? 72 : 104 + charstar_to_int(ptr+2); -		ptr = strchr(ptr, 'd'); -		minor = 16 * charstar_to_int(ptr+1); -		ptr = strchr(ptr, 'p'); -		minor += charstar_to_int(ptr+1); -	} else if (ptr_begins_static_str(name, "rd/")) { -		/* DAC960 "rd/cXdXXpX" */ -		mkdir("/dev/rd", 0755); -		major = 48 + charstar_to_int(name+4); -		ptr = strchr(name+4, 'd'); -		minor = 8 * charstar_to_int(ptr+1); -		ptr = strchr(ptr, 'p'); -		minor += charstar_to_int(ptr+1); -	} else if (ptr_begins_static_str(name, "loop")) { -		major = 7; -		minor = name[4] - '0'; -	} else if (ptr_begins_static_str(name, "chloop")) { -		major = 100; -		minor = name[6] - '0'; -	} else { -		log_message("I don't know how to create device %s, please post bugreport to me!", dev); -		return -1; -	} +	// give udev some time to create nodes if module was just insmoded: +	system("udevadm settle"); -	if (mknod(dev, type | 0600, makedev(major, minor))) { -		log_perror(dev); +	if (!stat(dev, &buf)) { +		log_message("I don't know how to create device %s, please post bugreport to me!", dev);  		return -1;  	} @@ -150,7 +59,6 @@ int ensure_dev_exists(const char * dev)  /* mounts, creating the device if needed+possible */  int my_mount(char *dev, char *location, char *fs, int force_rw)  { -	unsigned long flags = MS_MGC_VAL | (force_rw ? 0 : MS_RDONLY);  	char * opts = NULL;  	struct stat buf;  	int rc; @@ -182,42 +90,20 @@ int my_mount(char *dev, char *location, char *fs, int force_rw)  		}  	} -	if (!strcmp(fs, "supermount")) { -		my_insmod("supermount", ANY_DRIVER_TYPE, NULL, 1); -		my_insmod("isofs", ANY_DRIVER_TYPE, NULL, 1); -		opts = alloca(500); -                sprintf(opts, "dev=%s,fs=iso9660,tray_lock=always", dev); -                dev = "none"; -	} -  #ifndef DISABLE_MEDIAS -	if (!strcmp(fs, "vfat")) { -		my_insmod("vfat", ANY_DRIVER_TYPE, NULL, 1); +	if (!strcmp(fs, "nfs")) +		opts = "nolock"; +	if (!strcmp(fs, "vfat"))  		opts = "check=relaxed"; -	} - -	if (!strcmp(fs, "ntfs")) { -		my_insmod("ntfs", ANY_DRIVER_TYPE, NULL, 1); -	} - -	if (!strcmp(fs, "reiserfs")) -		my_insmod("reiserfs", ANY_DRIVER_TYPE, NULL, 1); -  #endif -	if (!strcmp(fs, "iso9660")) -		my_insmod("isofs", ANY_DRIVER_TYPE, NULL, 1); - -#ifndef DISABLE_NETWORK -	if (!strcmp(fs, "nfs")) { -		my_insmod("nfs", ANY_DRIVER_TYPE, NULL, 1); -		log_message("preparing nfsmount for %s", dev); -		rc = nfsmount_prepare(dev, &opts); -		if (rc != 0) -			return rc; +	char *cmd; +	rc = asprintf(&cmd, "mount %s %s -t %s -o %s%s > /dev/null 2>&1", dev, location, fs, (force_rw ? "" : "ro,"), (opts ? opts : "")); +	if (rc == -1) { +		log_perror("asprint allocation failure"); +		rmdir(location); +		return rc;  	} -#endif - -	rc = mount(dev, location, fs, flags, opts); +	rc = system(cmd);  	if (rc != 0) {  		log_perror("mount failed");  		rmdir(location); | 
