diff options
Diffstat (limited to 'mdk-stage1/lomount.c')
| -rw-r--r-- | mdk-stage1/lomount.c | 37 |
1 files changed, 18 insertions, 19 deletions
diff --git a/mdk-stage1/lomount.c b/mdk-stage1/lomount.c index d940ec36f..caca48ea1 100644 --- a/mdk-stage1/lomount.c +++ b/mdk-stage1/lomount.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. @@ -60,7 +60,7 @@ struct loop_info #define LOOP_GET_STATUS 0x4C03 int -set_loop (const char *device, const char *file, int gz) +set_loop (const char *device, const char *file) { struct loop_info loopinfo; int fd, ffd, mode; @@ -79,10 +79,6 @@ set_loop (const char *device, const char *file, int gz) strncpy(loopinfo.lo_name, file, LO_NAME_SIZE); loopinfo.lo_name[LO_NAME_SIZE - 1] = 0; loopinfo.lo_offset = 0; - if (gz) { - my_insmod("gzloop", ANY_DRIVER_TYPE, NULL); - loopinfo.lo_encrypt_type = 13; /* LO_CRYPT_GZ */ - } #ifdef MCL_FUTURE /* @@ -115,24 +111,24 @@ set_loop (const char *device, const char *file, int gz) } -char* find_free_loop(void) +char* find_free_loop() { - char loopdev[] = "/dev/loop0"; struct loop_info loopinfo; int i; - for (i=0; i<8; i++) { + for (i=0; i<256; i++) { int fd; - loopdev[9] = '0' + i; - ensure_dev_exists(loopdev); - fd = open(loopdev, O_RDONLY); + char ldev[100]; + sprintf(ldev, "/dev/loop%d", i); + ensure_dev_exists(ldev); + fd = open(ldev, O_RDONLY); if (!ioctl(fd, LOOP_GET_STATUS, &loopinfo)) { close(fd); continue; } if (errno == ENXIO) { - log_message("%s is available", loopdev); + log_message("%s is available", ldev); close(fd); - return strdup(loopdev); + return strdup(ldev); } else { log_perror("LOOP_GET_STATUS(unexpected error)"); close(fd); @@ -160,7 +156,7 @@ del_loop(char * loopdev) } int -lomount(char *loopfile, char *where, char **dev, int gz) +lomount(char *loopfile, char *where, char **dev, int compressed) { long int flag; @@ -169,7 +165,10 @@ lomount(char *loopfile, char *where, char **dev, int gz) flag = MS_MGC_VAL; flag |= MS_RDONLY; - my_insmod("loop", ANY_DRIVER_TYPE, NULL); + my_modprobe("loop", ANY_DRIVER_TYPE, "max_loop=256"); + if (compressed) { + my_modprobe("squashfs", ANY_DRIVER_TYPE, NULL); + } if (!(loopdev = find_free_loop())) { log_message("could not find a free loop"); @@ -178,12 +177,12 @@ lomount(char *loopfile, char *where, char **dev, int gz) if (dev) *dev = loopdev; - if (set_loop(loopdev, loopfile, gz)) { + if (set_loop(loopdev, loopfile)) { log_message("set_loop failed on %s (%s)", loopdev, strerror(errno)); return 1; } - if (my_mount(loopdev, where, "iso9660", 0)) { + if (my_mount(loopdev, where, compressed ? "squashfs" : "iso9660", 0)) { del_loop(loopdev); return 1; } |
