diff --git a/libbb/loop.c b/libbb/loop.c index 81dfca4d1..2f9d02924 100644 --- a/libbb/loop.c +++ b/libbb/loop.c @@ -90,23 +90,24 @@ int set_loop(char **device, const char *file, int offset) bb_loop_info loopinfo; struct stat statbuf; int i, dfd, ffd, mode, rc=-1; - + /* Open the file. Barf if this doesn't work. */ if((ffd = open(file, mode=O_RDWR))<0 && (ffd = open(file,mode=O_RDONLY))<0) - return errno; + return -errno; /* Find a loop device. */ try=*device ? : dev; for(i=0;rc;i++) { sprintf(dev, LOOP_FORMAT, i); + /* Ran out of block devices, return failure. */ if(stat(try, &statbuf) || !S_ISBLK(statbuf.st_mode)) { - rc=ENOENT; + rc=-ENOENT; break; } /* Open the sucker and check its loopiness. */ if((dfd=open(try, mode))<0 && errno==EROFS) - dfd=open(try,mode=O_RDONLY); + dfd=open(try, mode = O_RDONLY); if(dfd<0) goto try_again; rc=ioctl(dfd, BB_LOOP_GET_STATUS, &loopinfo); @@ -120,6 +121,7 @@ int set_loop(char **device, const char *file, int offset) if(!ioctl(dfd, LOOP_SET_FD, ffd) && !ioctl(dfd, BB_LOOP_SET_STATUS, &loopinfo)) rc=0; else ioctl(dfd, LOOP_CLR_FD, 0); + /* If this block device already set up right, re-use it. (Yes this is racy, but associating two loop devices with the same file isn't pretty either. In general, mounting the same file twice @@ -137,12 +139,3 @@ try_again: return mode==O_RDONLY ? 1 : 0; } else return rc; } - -/* END CODE */ -/* -Local Variables: -c-file-style: "linux" -c-basic-offset: 4 -tab-width: 4 -End: -*/