loop device code: readability improvement

This commit is contained in:
Denis Vlasenko 2007-04-19 00:09:34 +00:00
parent 3ace9fa6d8
commit c34d35557b
2 changed files with 20 additions and 13 deletions

View File

@ -84,7 +84,7 @@ int set_loop(char **device, const char *file, unsigned long long offset)
char dev[20], *try; char dev[20], *try;
bb_loop_info loopinfo; bb_loop_info loopinfo;
struct stat statbuf; struct stat statbuf;
int i, dfd, ffd, mode, rc=-1; int i, dfd, ffd, mode, rc = -1;
/* Open the file. Barf if this doesn't work. */ /* Open the file. Barf if this doesn't work. */
mode = O_RDWR; mode = O_RDWR;
@ -98,12 +98,12 @@ int set_loop(char **device, const char *file, unsigned long long offset)
/* Find a loop device. */ /* Find a loop device. */
try = *device ? : dev; try = *device ? : dev;
for (i=0;rc;i++) { for (i = 0; rc; i++) {
sprintf(dev, LOOP_FORMAT, i); sprintf(dev, LOOP_FORMAT, i);
/* Ran out of block devices, return failure. */ /* Ran out of block devices, return failure. */
if (stat(try, &statbuf) || !S_ISBLK(statbuf.st_mode)) { if (stat(try, &statbuf) || !S_ISBLK(statbuf.st_mode)) {
rc=-ENOENT; rc = -ENOENT;
break; break;
} }
/* Open the sucker and check its loopiness. */ /* Open the sucker and check its loopiness. */
@ -112,19 +112,22 @@ int set_loop(char **device, const char *file, unsigned long long offset)
mode = O_RDONLY; mode = O_RDONLY;
dfd = open(try, mode); dfd = open(try, mode);
} }
if (dfd < 0) goto try_again; if (dfd < 0)
goto try_again;
rc = ioctl(dfd, BB_LOOP_GET_STATUS, &loopinfo); rc = ioctl(dfd, BB_LOOP_GET_STATUS, &loopinfo);
/* If device free, claim it. */ /* If device is free, claim it. */
if (rc && errno == ENXIO) { if (rc && errno == ENXIO) {
memset(&loopinfo, 0, sizeof(loopinfo)); memset(&loopinfo, 0, sizeof(loopinfo));
safe_strncpy((char *)loopinfo.lo_file_name, file, LO_NAME_SIZE); safe_strncpy((char *)loopinfo.lo_file_name, file, LO_NAME_SIZE);
loopinfo.lo_offset = offset; loopinfo.lo_offset = offset;
/* Associate free loop device with file. */ /* Associate free loop device with file. */
if (!ioctl(dfd, LOOP_SET_FD, ffd)) { if (!ioctl(dfd, LOOP_SET_FD, ffd)) {
if (!ioctl(dfd, BB_LOOP_SET_STATUS, &loopinfo)) rc = 0; if (!ioctl(dfd, BB_LOOP_SET_STATUS, &loopinfo))
else ioctl(dfd, LOOP_CLR_FD, 0); rc = 0;
else
ioctl(dfd, LOOP_CLR_FD, 0);
} }
/* If this block device already set up right, re-use it. /* If this block device already set up right, re-use it.
@ -132,7 +135,7 @@ int set_loop(char **device, const char *file, unsigned long long offset)
file isn't pretty either. In general, mounting the same file twice file isn't pretty either. In general, mounting the same file twice
without using losetup manually is problematic.) without using losetup manually is problematic.)
*/ */
} else if (strcmp(file,(char *)loopinfo.lo_file_name) } else if (strcmp(file, (char *)loopinfo.lo_file_name) != 0
|| offset != loopinfo.lo_offset) { || offset != loopinfo.lo_offset) {
rc = -1; rc = -1;
} }
@ -142,8 +145,9 @@ try_again:
} }
close(ffd); close(ffd);
if (!rc) { if (!rc) {
if (!*device) *device = xstrdup(dev); if (!*device)
return mode==O_RDONLY ? 1 : 0; *device = xstrdup(dev);
return (mode == O_RDONLY) ? 1 : 0;
} }
return rc; return rc;
} }

View File

@ -45,9 +45,11 @@ int losetup_main(int argc, char **argv)
bb_perror_nomsg_and_die(); bb_perror_nomsg_and_die();
} else if (argc == 1) { } else if (argc == 1) {
char *s = query_loop(argv[0]); char *s = query_loop(argv[0]);
if (!s) bb_perror_nomsg_and_die(); if (!s)
bb_perror_nomsg_and_die();
printf("%s: %s\n", argv[0], s); printf("%s: %s\n", argv[0], s);
if (ENABLE_FEATURE_CLEAN_UP) free(s); if (ENABLE_FEATURE_CLEAN_UP)
free(s);
} else { } else {
char dev[sizeof(LOOP_NAME"0")] = LOOP_NAME"0"; char dev[sizeof(LOOP_NAME"0")] = LOOP_NAME"0";
char c; char c;
@ -57,7 +59,8 @@ int losetup_main(int argc, char **argv)
s = query_loop(dev); s = query_loop(dev);
if (s) { if (s) {
printf("%s: %s\n", dev, s); printf("%s: %s\n", dev, s);
if (ENABLE_FEATURE_CLEAN_UP) free(s); if (ENABLE_FEATURE_CLEAN_UP)
free(s);
} }
} }
} }