Try to do all file operations even when one or some of them fail. Signed-off-by: Sami Kerola <kerolasa@xxxxxx> --- misc-utils/rename.c | 55 ++++++++++++++++++++++++++++++++++------------------- 1 file changed, 35 insertions(+), 20 deletions(-) diff --git a/misc-utils/rename.c b/misc-utils/rename.c index b945aaa..250070b 100644 --- a/misc-utils/rename.c +++ b/misc-utils/rename.c @@ -29,20 +29,26 @@ for i in $@; do N=`echo "$i" | sed "s/$FROM/$TO/g"`; mv "$i" "$N"; done static int do_rename(char *from, char *to, char *s, int verbose, int symtarget) { - char *newname, *where, *p, *q, *target = NULL; - int flen, tlen, slen; + char *newname = NULL, *where, *p, *q, *target = NULL; + int flen, tlen, slen, ret = 0; struct stat sb; if (symtarget) { - if (lstat(s, &sb) == -1) - err(EXIT_FAILURE, _("%s: lstat failed"), s); - - if (!S_ISLNK(sb.st_mode)) - errx(EXIT_FAILURE, _("%s: not a symbolic link"), s); + if (lstat(s, &sb) == -1) { + warn(_("%s: lstat failed"), s); + return 1; + } + if (!S_ISLNK(sb.st_mode)) { + warnx(_("%s: not a symbolic link"), s); + return 1; + } target = xmalloc(sb.st_size + 1); - if (readlink(s, target, sb.st_size + 1) < 0) - err(EXIT_FAILURE, _("%s: readlink failed"), s); + if (readlink(s, target, sb.st_size + 1) < 0) { + warn(_("%s: readlink failed"), s); + ret = 1; + goto out; + } target[sb.st_size] = '\0'; where = strstr(target, from); @@ -82,22 +88,31 @@ static int do_rename(char *from, char *to, char *s, int verbose, int symtarget) *q = 0; if (symtarget) { - if (0 > unlink(s)) - err(EXIT_FAILURE, _("%s: unlink failed"), s); - if (symlink(newname, s) != 0) - err(EXIT_FAILURE, _("%s: symlinking to %s failed"), s, newname); + if (0 > unlink(s)) { + warn(_("%s: unlink failed"), s); + ret = 1; + goto out; + } + if (symlink(newname, s) != 0) { + warn(_("%s: symlinking to %s failed"), s, newname); + ret = 1; + goto out; + } if (verbose) printf("%s: `%s' -> `%s'\n", s, target, newname); } else { - if (rename(s, newname) != 0) - err(EXIT_FAILURE, _("%s: rename to %s failed"), s, newname); + if (rename(s, newname) != 0) { + warn(_("%s: rename to %s failed"), s, newname); + ret = 1; + goto out; + } if (verbose) printf("`%s' -> `%s'\n", s, newname); } - + out: free(newname); free(target); - return 1; + return ret; } static void __attribute__ ((__noreturn__)) usage(FILE * out) @@ -119,7 +134,7 @@ static void __attribute__ ((__noreturn__)) usage(FILE * out) int main(int argc, char **argv) { char *from, *to; - int i, c, symtarget=0, verbose = 0; + int i, c, ret = 0, symtarget = 0, verbose = 0; static const struct option longopts[] = { {"verbose", no_argument, NULL, 'v'}, @@ -163,7 +178,7 @@ int main(int argc, char **argv) to = argv[1]; for (i = 2; i < argc; i++) - do_rename(from, to, argv[i], verbose, symtarget); + ret |= do_rename(from, to, argv[i], verbose, symtarget); - return EXIT_SUCCESS; + return ret; } -- 2.0.0 -- To unsubscribe from this list: send the line "unsubscribe util-linux" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html