aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--internal.h2
-rw-r--r--mount.c71
-rw-r--r--util-linux/mount.c71
-rw-r--r--utility.c70
4 files changed, 71 insertions, 143 deletions
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 <sys/ioctl.h>
#include <linux/loop.h>
-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 <sys/ioctl.h>
#include <linux/loop.h>
-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 */