diff options
Diffstat (limited to 'losetup.c')
-rw-r--r-- | losetup.c | 190 |
1 files changed, 0 insertions, 190 deletions
diff --git a/losetup.c b/losetup.c deleted file mode 100644 index 2908dbc..0000000 --- a/losetup.c +++ /dev/null @@ -1,190 +0,0 @@ -/* - * losetup.c - setup and control loop devices - */ - - -#include "internal.h" - -const char losetup_usage[] = "losetup\n" -"\n" -"\tlosetup loop_device give info\n" -"\tlosetup -d loop_device delete\n" -"\tlosetup [ -o offset ] loop_device file setup\n"; - -/* from mount-2.6d */ - -/* - * losetup.c - setup and control loop devices - */ - -#include <stdio.h> -#include <string.h> -#include <ctype.h> -#include <fcntl.h> -#include <unistd.h> -#include <getopt.h> -#include <errno.h> -#include <sys/ioctl.h> -#include <linux/fs.h> -/* #include "loop.h" */ - -/* - * include/linux/loop.h - * - * Written by Theodore Ts'o, 3/29/93. - * - * Copyright 1993 by Theodore Ts'o. Redistribution of this file is - * permitted under the GNU Public License. - */ - -#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]; -}; - -/* - * IOCTL commands --- we will commandeer 0x4C ('L') - */ - -#define LOOP_SET_FD 0x4C00 -#define LOOP_CLR_FD 0x4C01 -#define LOOP_SET_STATUS 0x4C02 -#define LOOP_GET_STATUS 0x4C03 - -/* #include "lomount.h" */ - -extern int set_loop (const char *, const char *, int, int *); -extern int del_loop (const char *); - -static void show_loop(const char *device) -{ - struct loop_info loopinfo; - int fd; - - if ((fd = open(device, O_RDWR)) < 0) { - perror(device); - return; - } - if (ioctl(fd, LOOP_GET_STATUS, &loopinfo) < 0) { - perror("Cannot get loop info"); - close(fd); - return; - } - printf("%s: [%04x]:%ld (%s) offset %d\n", - device, (unsigned int)loopinfo.lo_device, loopinfo.lo_inode, - loopinfo.lo_name, loopinfo.lo_offset); - close(fd); -} - - -int set_loop(const char *device, const char *file, int offset, int *loopro) -{ - struct loop_info loopinfo; - int fd, ffd, mode; - - mode = *loopro ? O_RDONLY : O_RDWR; - if ((ffd = open (file, mode)) < 0 && !*loopro - && (errno != EROFS || (ffd = open (file, mode = O_RDONLY)) < 0)) { - perror (file); - return 1; - } - if ((fd = open (device, mode)) < 0) { - close(ffd); - perror (device); - return 1; - } - *loopro = (mode == O_RDONLY); - - memset(&loopinfo, 0, sizeof(loopinfo)); - strncpy(loopinfo.lo_name, file, LO_NAME_SIZE); - loopinfo.lo_name[LO_NAME_SIZE-1] = 0; - - loopinfo.lo_offset = offset; - - loopinfo.lo_encrypt_key_size = 0; - if (ioctl(fd, LOOP_SET_FD, ffd) < 0) { - perror("ioctl: LOOP_SET_FD"); - exit(1); - } - if (ioctl(fd, LOOP_SET_STATUS, &loopinfo) < 0) { - (void) ioctl(fd, LOOP_CLR_FD, 0); - perror("ioctl: LOOP_SET_STATUS"); - exit(1); - } - close(fd); - close(ffd); - return 0; -} - -int del_loop(const char *device) -{ - int fd; - - if ((fd = open(device, O_RDONLY)) < 0) { - perror(device); - exit(1); - } - if (ioctl(fd, LOOP_CLR_FD, 0) < 0) { - perror("ioctl: LOOP_CLR_FD"); - exit(1); - } - close(fd); - return(0); -} - - -static int losetup_usage_fn(void) -{ - fprintf(stderr, losetup_usage); - exit(1); -} - -int losetup_main(struct FileInfo * i, int argc, char * * argv) -{ - char *offset; - int delete,off,c; - int ro = 0; - - delete = off = 0; - offset = NULL; - while ((c = getopt(argc,argv,"do:")) != EOF) { - switch (c) { - case 'd': - delete = 1; - break; - case 'o': - offset = optarg; - break; - default: - losetup_usage_fn(); - } - } - if (argc == 1) losetup_usage_fn(); - if ((delete && (argc != optind+1 || offset)) || - (!delete && (argc < optind+1 || argc > optind+2))) - losetup_usage_fn(); - if (argc == optind+1) - if (delete) - del_loop(argv[optind]); - else - show_loop(argv[optind]); - else { - if (offset && sscanf(offset,"%d",&off) != 1) - losetup_usage_fn(); - set_loop(argv[optind],argv[optind+1],off,&ro); - } - return 0; -} |