diff --git a/internal.h b/internal.h index 9611c1922..39f7e0c5e 100644 --- a/internal.h +++ b/internal.h @@ -177,6 +177,8 @@ extern pid_t findInitPid(); #if defined BB_FEATURE_MOUNT_LOOP extern int del_loop(const char *device); +extern int set_loop(const char *device, const char *file, int offset, int *loopro); +extern char *find_unused_loop_device (void); #endif #if defined BB_GUNZIP || defined BB_GZIP || defined BB_PRINTF || defined BB_TAIL diff --git a/mount.c b/mount.c index 3c1568aad..4b0901f2a 100644 --- a/mount.c +++ b/mount.c @@ -51,8 +51,6 @@ #include #include -static int set_loop(const char *device, const char *file, int offset, int *loopro); -static char *find_unused_loop_device (void); static int use_loop = 0; #endif @@ -177,75 +175,6 @@ extern void whine_if_fstab_is_missing() #endif -#if defined BB_FEATURE_MOUNT_LOOP -static 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"); - close(fd); - close(ffd); - return 1; - } - if (ioctl(fd, LOOP_SET_STATUS, &loopinfo) < 0) { - (void) ioctl(fd, LOOP_CLR_FD, 0); - perror("ioctl: LOOP_SET_STATUS"); - close(fd); - close(ffd); - return 1; - } - close(fd); - close(ffd); - return 0; -} - -char *find_unused_loop_device (void) -{ - char dev[20]; - int i, fd; - struct stat statbuf; - struct loop_info loopinfo; - - for(i = 0; i <= 7; i++) { - sprintf(dev, "/dev/loop%d", i); - if (stat (dev, &statbuf) == 0 && S_ISBLK(statbuf.st_mode)) { - if ((fd = open (dev, O_RDONLY)) >= 0) { - if(ioctl (fd, LOOP_GET_STATUS, &loopinfo) == -1) { - if (errno == ENXIO) { /* probably free */ - close (fd); - return strdup(dev); - } - } - close (fd); - } - } - } - return NULL; -} -#endif /* BB_FEATURE_MOUNT_LOOP */ - /* Seperate standard mount options from the nonstandard string options */ static void parse_mount_options ( char *options, unsigned long *flags, char *strflags) diff --git a/util-linux/mount.c b/util-linux/mount.c index 3c1568aad..4b0901f2a 100644 --- a/util-linux/mount.c +++ b/util-linux/mount.c @@ -51,8 +51,6 @@ #include #include -static int set_loop(const char *device, const char *file, int offset, int *loopro); -static char *find_unused_loop_device (void); static int use_loop = 0; #endif @@ -177,75 +175,6 @@ extern void whine_if_fstab_is_missing() #endif -#if defined BB_FEATURE_MOUNT_LOOP -static 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"); - close(fd); - close(ffd); - return 1; - } - if (ioctl(fd, LOOP_SET_STATUS, &loopinfo) < 0) { - (void) ioctl(fd, LOOP_CLR_FD, 0); - perror("ioctl: LOOP_SET_STATUS"); - close(fd); - close(ffd); - return 1; - } - close(fd); - close(ffd); - return 0; -} - -char *find_unused_loop_device (void) -{ - char dev[20]; - int i, fd; - struct stat statbuf; - struct loop_info loopinfo; - - for(i = 0; i <= 7; i++) { - sprintf(dev, "/dev/loop%d", i); - if (stat (dev, &statbuf) == 0 && S_ISBLK(statbuf.st_mode)) { - if ((fd = open (dev, O_RDONLY)) >= 0) { - if(ioctl (fd, LOOP_GET_STATUS, &loopinfo) == -1) { - if (errno == ENXIO) { /* probably free */ - close (fd); - return strdup(dev); - } - } - close (fd); - } - } - } - return NULL; -} -#endif /* BB_FEATURE_MOUNT_LOOP */ - /* Seperate standard mount options from the nonstandard string options */ static void parse_mount_options ( char *options, unsigned long *flags, char *strflags) diff --git a/utility.c b/utility.c index 643c3b5f2..5ff03d7a0 100644 --- a/utility.c +++ b/utility.c @@ -1169,6 +1169,74 @@ extern int del_loop(const char *device) close(fd); return( TRUE); } -#endif + +extern 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"); + close(fd); + close(ffd); + return 1; + } + if (ioctl(fd, LOOP_SET_STATUS, &loopinfo) < 0) { + (void) ioctl(fd, LOOP_CLR_FD, 0); + perror("ioctl: LOOP_SET_STATUS"); + close(fd); + close(ffd); + return 1; + } + close(fd); + close(ffd); + return 0; +} + +extern char *find_unused_loop_device (void) +{ + char dev[20]; + int i, fd; + struct stat statbuf; + struct loop_info loopinfo; + + for(i = 0; i <= 7; i++) { + sprintf(dev, "/dev/loop%d", i); + if (stat (dev, &statbuf) == 0 && S_ISBLK(statbuf.st_mode)) { + if ((fd = open (dev, O_RDONLY)) >= 0) { + if(ioctl (fd, LOOP_GET_STATUS, &loopinfo) == -1) { + if (errno == ENXIO) { /* probably free */ + close (fd); + return strdup(dev); + } + } + close (fd); + } + } + } + return NULL; +} +#endif /* BB_FEATURE_MOUNT_LOOP */ + /* END CODE */