| @@ -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; |
| - | } |