diff options
Diffstat (limited to 'mdk-stage1/lomount.c')
| -rw-r--r-- | mdk-stage1/lomount.c | 84 |
1 files changed, 53 insertions, 31 deletions
diff --git a/mdk-stage1/lomount.c b/mdk-stage1/lomount.c index 281de4a93..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. @@ -110,62 +110,84 @@ set_loop (const char *device, const char *file) return 0; } -int -del_loop (const char *device) + +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(char * loopdev) { int fd; - if ((fd = open (device, O_RDONLY)) < 0) - return 1; + if (!loopdev) + return; + + if ((fd = open (loopdev, O_RDONLY)) < 0) + return; if (ioctl (fd, LOOP_CLR_FD, 0) < 0) - return 1; + return; close (fd); - return 0; } - -char * loopdev = "/dev/loop3"; /* Ugly. But do I care? */ - 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")) { + if (my_mount(loopdev, where, compressed ? "squashfs" : "iso9660", 0)) { del_loop(loopdev); return 1; } - log_message("lomount succeded for %s on %s", loopfile, where); - return 0; -} - - -int -loumount() -{ - if (umount(loopdev)) { - log_perror("loumount"); - return 1; - } - - if (del_loop(loopdev)) { - log_perror("del_loop"); - return 1; - } + log_message("lomount succeeded for %s on %s", loopfile, where); return 0; } |
