summaryrefslogtreecommitdiffstats
path: root/mdk-stage1/lomount.c
diff options
context:
space:
mode:
Diffstat (limited to 'mdk-stage1/lomount.c')
-rw-r--r--mdk-stage1/lomount.c37
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;
}