From 959a1722faec6b30510c788c49dcb4b7cb96d1e0 Mon Sep 17 00:00:00 2001 From: Mystery Man Date: Fri, 20 Feb 2004 00:03:26 +0000 Subject: This commit was manufactured by cvs2svn to create tag 'V10_0_21mdk'. --- mdk-stage1/lomount.c | 203 --------------------------------------------------- 1 file changed, 203 deletions(-) delete mode 100644 mdk-stage1/lomount.c (limited to 'mdk-stage1/lomount.c') diff --git a/mdk-stage1/lomount.c b/mdk-stage1/lomount.c deleted file mode 100644 index 1ad05cbee..000000000 --- a/mdk-stage1/lomount.c +++ /dev/null @@ -1,203 +0,0 @@ -/* - * Guillaume Cottenceau (gc@mandrakesoft.com) - * - * Copyright 2000 MandrakeSoft - * - * This software may be freely redistributed under the terms of the GNU - * public license. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - */ - -/* This code comes from util-linux-2.10n (mount/lomount.c) - * (this is a simplified version of this code) - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "stage1.h" -#include "frontend.h" -#include "log.h" -#include "mount.h" -#include "modules.h" - -#include "lomount.h" - - -#define LO_NAME_SIZE 64 -#define LO_KEY_SIZE 32 - -struct loop_info -{ - int lo_number; /* ioctl r/o */ - dev_t lo_device; /* ioctl r/o */ - unsigned long lo_inode; /* ioctl r/o */ - dev_t lo_rdevice; /* ioctl r/o */ - int lo_offset; - int lo_encrypt_type; - int lo_encrypt_key_size; /* ioctl w/o */ - int lo_flags; /* ioctl r/o */ - char lo_name[LO_NAME_SIZE]; - unsigned char lo_encrypt_key[LO_KEY_SIZE]; /* ioctl w/o */ - unsigned long lo_init[2]; - char reserved[4]; -}; - -#define LOOP_SET_FD 0x4C00 -#define LOOP_CLR_FD 0x4C01 -#define LOOP_SET_STATUS 0x4C02 -#define LOOP_GET_STATUS 0x4C03 - -int -set_loop (const char *device, const char *file, int gz) -{ - struct loop_info loopinfo; - int fd, ffd, mode; - - mode = O_RDONLY; - - if ((ffd = open (file, mode)) < 0) - return 1; - - if ((fd = open (device, mode)) < 0) { - close(ffd); - return 1; - } - - memset(&loopinfo, 0, sizeof (loopinfo)); - 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, 1); - loopinfo.lo_encrypt_type = 13; /* LO_CRYPT_GZ */ - } - -#ifdef MCL_FUTURE - /* - * Oh-oh, sensitive data coming up. Better lock into memory to prevent - * passwd etc being swapped out and left somewhere on disk. - */ - - if(mlockall(MCL_CURRENT|MCL_FUTURE)) { - log_message("CRITICAL Couldn't lock into memory! %s (memlock)", strerror(errno)); - return 1; - } -#endif - - if (ioctl(fd, LOOP_SET_FD, ffd) < 0) { - close(fd); - close(ffd); - return 1; - } - - if (ioctl(fd, LOOP_SET_STATUS, &loopinfo) < 0) { - (void) ioctl (fd, LOOP_CLR_FD, 0); - close(fd); - close(ffd); - return 1; - } - - close(fd); - close(ffd); - return 0; -} - - -char* find_free_loop(int chloop) -{ - char loopdev[] = "/dev/loop0"; - char chloopdev[] = "/dev/chloop0"; - char * ldev = chloop ? chloopdev : loopdev; - struct loop_info loopinfo; - int i; - for (i=0; i<8; i++) { - int fd; - ldev[strlen(ldev)-1] = '0' + 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 (!loopdev) - return; - - if ((fd = open (loopdev, O_RDONLY)) < 0) - return; - - if (ioctl (fd, LOOP_CLR_FD, 0) < 0) - return; - - close (fd); -} - -int -lomount(char *loopfile, char *where, char **dev, int gz) -{ - - long int flag; - char * loopdev; - int chloop = 0; - - flag = MS_MGC_VAL; - flag |= MS_RDONLY; - -#ifdef MANDRAKE_MOVE - my_insmod("change_loop", ANY_DRIVER_TYPE, NULL, 1); - chloop = 1; -#else - my_insmod("loop", ANY_DRIVER_TYPE, NULL, 1); -#endif - - if (!(loopdev = find_free_loop(chloop))) { - log_message("could not find a free loop"); - return 1; - } - if (dev) - *dev = loopdev; - - if (set_loop(loopdev, loopfile, gz)) { - log_message("set_loop failed on %s (%s)", loopdev, strerror(errno)); - return 1; - } - - if (my_mount(loopdev, where, "iso9660", 0)) { - del_loop(loopdev); - return 1; - } - - log_message("lomount succeeded for %s on %s", loopfile, where); - return 0; -} - - -- cgit v1.2.1