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.c71
1 files changed, 47 insertions, 24 deletions
diff --git a/mdk-stage1/lomount.c b/mdk-stage1/lomount.c
index 991a862c7..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.
@@ -111,13 +111,41 @@ set_loop (const char *device, const char *file)
}
-char * loopdev = "/dev/loop3"; /* Ugly. But do I care? */
+char* find_free_loop()
+{
+ struct loop_info loopinfo;
+ int i;
+ for (i=0; i<256; i++) {
+ int fd;
+ 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", ldev);
+ close(fd);
+ return strdup(ldev);
+ } else {
+ log_perror("LOOP_GET_STATUS(unexpected error)");
+ close(fd);
+ continue;
+ }
+ }
+ return NULL;
+}
void
-del_loop(void)
+del_loop(char * loopdev)
{
int fd;
+ if (!loopdev)
+ return;
+
if ((fd = open (loopdev, O_RDONLY)) < 0)
return;
@@ -127,45 +155,40 @@ del_loop(void)
close (fd);
}
-
-static char * where_mounted = NULL;
-
int
-lomount(char *loopfile, char *where)
+lomount(char *loopfile, char *where, char **dev, int compressed)
{
long int flag;
+ char * loopdev;
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");
+ return 1;
+ }
+ if (dev)
+ *dev = loopdev;
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)) {
- del_loop();
+ if (my_mount(loopdev, where, compressed ? "squashfs" : "iso9660", 0)) {
+ del_loop(loopdev);
return 1;
}
- where_mounted = strdup(where);
log_message("lomount succeeded for %s on %s", loopfile, where);
return 0;
}
-int
-loumount()
-{
- if (where_mounted) {
- umount(where_mounted);
- where_mounted = NULL;
- }
- del_loop();
- return 0;
-}
-
-