Index: cat/cat.c =================================================================== RCS file: /cvsroot/src/bin/cat/cat.c,v retrieving revision 1.35 diff -b -u -r1.35 cat.c --- cat/cat.c 13 Sep 2002 18:07:52 -0000 1.35 +++ cat/cat.c 26 Jul 2003 18:11:05 -0000 @@ -63,8 +63,9 @@ #include #include #include +#include -int bflag, eflag, fflag, lflag, nflag, sflag, tflag, vflag; +int bflag, eflag, fflag, lflag, nflag, sflag, stdout_ok, tflag, vflag; int rval; const char *filename; @@ -73,6 +74,7 @@ void cook_buf(FILE *); void raw_args(char *argv[]); void raw_cat(int); +char *printescaped(const char *); int main(int argc, char *argv[]) @@ -121,6 +123,8 @@ } argv += optind; + stdout_ok = isatty(STDOUT_FILENO); + if (lflag) { stdout_lock.l_len = 0; stdout_lock.l_start = 0; @@ -153,7 +157,10 @@ fp = stdin; else if ((fp = fopen(*argv, fflag ? "rf" : "r")) == NULL) { - warn("%s", *argv); + char *fn; + fn = printescaped(*argv); + warn("%s", fn); + free(fn); rval = 1; ++argv; continue; @@ -229,7 +236,10 @@ break; } if (ferror(fp)) { - warn("%s", filename); + char *fn; + fn = printescaped(filename); + warn("%s", fn); + free(fn); rval = 1; clearerr(fp); } @@ -241,6 +251,7 @@ raw_args(char **argv) { int fd; + char *fn; fd = fileno(stdin); filename = "stdin"; @@ -260,13 +271,17 @@ } if (!S_ISREG(st.st_mode)) { close(fd); - warnx("%s: not a regular file", *argv); + fn = printescaped(*argv); + warnx("%s: not a regular file", fn); + free(fn); goto skipnomsg; } } else if ((fd = open(*argv, O_RDONLY, 0)) < 0) { skip: - warn("%s", *argv); + fn = printescaped(*argv); + warn("%s", fn); + free(fn); skipnomsg: rval = 1; ++argv; @@ -290,6 +305,7 @@ struct stat sbuf; ssize_t nr, nw, off; int wfd; + char *fn; wfd = fileno(stdout); if (buf == NULL) { @@ -308,7 +324,31 @@ if ((nw = write(wfd, buf + off, (size_t)nr)) < 0) err(1, "stdout"); if (nr < 0) { - warn("%s", filename); + fn = printescaped(filename); + warn("%s", fn); + free(fn); rval = 1; } +} + +char * +printescaped(const char *src) +{ + size_t len; + char *retval; + + len = strlen(src); + if (len != 0 && SIZE_T_MAX/len <= 4) + errx(EXIT_FAILURE, "%s: name too long", src); + + retval = (char *)malloc(4*len+1); + if (retval != NULL) { + if (stdout_ok) + (void)strvis(retval, src, VIS_NL | VIS_CSTYLE); + else + (void)strcpy(retval, src); + return retval; + } else + errx(EXIT_FAILURE, "out of memory!"); + /* NOTREACHED */ } Index: chio/chio.c =================================================================== RCS file: /cvsroot/src/bin/chio/chio.c,v retrieving revision 1.19 diff -b -u -r1.19 chio.c --- chio/chio.c 11 Jun 2002 05:33:51 -0000 1.19 +++ chio/chio.c 26 Jul 2003 18:11:07 -0000 @@ -63,10 +63,13 @@ #include #include #include +#include #include "defs.h" #include "pathnames.h" +int stdout_ok; + int main(int, char *[]); static void usage(void); static void cleanup(void); @@ -75,6 +78,7 @@ static int parse_special(const char *); static int is_special(const char *); static const char *bits_to_string(int, const char *); +char *printescaped(const char *); static int do_move(const char *, int, char **); static int do_exchange(const char *, int, char **); @@ -154,6 +158,7 @@ break; default: usage(); + /* NOTREACHED */ } } argc -= optind; @@ -161,6 +166,9 @@ if (argc == 0) usage(); + /* NOTREACHED */ + + stdout_ok = isatty(STDOUT_FILENO); /* Get the default changer if not already specified. */ if (changer_name == NULL) @@ -169,11 +177,13 @@ /* Open the changer device. */ if ((changer_fd = open(changer_name, O_RDWR, 0600)) == -1) - err(1, "%s: open", changer_name); + err(1, "%s: open", printescaped(changer_name)); + /* NOTREACHED */ /* Register cleanup function. */ if (atexit(cleanup)) err(1, "can't register cleanup function"); + /* NOTREACHED */ /* Find the specified command. */ for (i = 0; commands[i].cc_name != NULL; ++i) @@ -181,6 +191,7 @@ break; if (commands[i].cc_name == NULL) errx(1, "unknown command: %s", *argv); + /* NOTREACHED */ /* Skip over the command name and call handler. */ ++argv; --argc; @@ -204,9 +215,11 @@ if (argc < 4) { warnx("%s: too few arguments", cname); usage(); + /*NOTREACHED*/ } else if (argc > 5) { warnx("%s: too many arguments", cname); usage(); + /*NOTREACHED*/ } (void)memset(&cmd, 0, sizeof(cmd)); @@ -242,7 +255,8 @@ /* Send command to changer. */ if (ioctl(changer_fd, CHIOMOVE, &cmd)) - err(1, "%s: CHIOMOVE", changer_name); + err(1, "%s: CHIOMOVE", printescaped(changer_name)); + /* NOTREACHED */ return (0); } @@ -263,9 +277,11 @@ if (argc < 4) { warnx("%s: too few arguments", cname); usage(); + /*NOTREACHED*/ } else if (argc > 8) { warnx("%s: too many arguments", cname); usage(); + /*NOTREACHED*/ } (void)memset(&cmd, 0, sizeof(cmd)); @@ -325,7 +341,8 @@ /* Send command to changer. */ if (ioctl(changer_fd, CHIOEXCHANGE, &cmd)) - err(1, "%s: CHIOEXCHANGE", changer_name); + err(1, "%s: CHIOEXCHANGE", printescaped(changer_name)); + /* NOTREACHED */ return (0); } @@ -346,9 +363,11 @@ if (argc < 2) { warnx("%s: too few arguments", cname); usage(); + /*NOTREACHED*/ } else if (argc > 3) { warnx("%s: too many arguments", cname); usage(); + /*NOTREACHED*/ } (void)memset(&cmd, 0, sizeof(cmd)); @@ -376,7 +395,8 @@ /* Send command to changer. */ if (ioctl(changer_fd, CHIOPOSITION, &cmd)) - err(1, "%s: CHIOPOSITION", changer_name); + err(1, "%s: CHIOPOSITION", printescaped(changer_name)); + /* NOTREACHED */ return (0); } @@ -386,22 +406,27 @@ do_params(const char *cname, int argc, char **argv) { struct changer_params data; + char *cn; /* No arguments to this command. */ if (argc) { warnx("%s: no arguements expected", cname); usage(); + /* NOTREACHED */ } + cn = printescaped(changer_name); + /* Get params from changer and display them. */ (void)memset(&data, 0, sizeof(data)); if (ioctl(changer_fd, CHIOGPARAMS, &data)) - err(1, "%s: CHIOGPARAMS", changer_name); + err(1, "%s: CHIOGPARAMS", cn); + /* NOTREACHED */ #define PLURAL(n) (n) > 1 ? "s" : "" (void)printf("%s: %d slot%s, %d drive%s, %d picker%s", - changer_name, + cn, data.cp_nslots, PLURAL(data.cp_nslots), data.cp_ndrives, PLURAL(data.cp_ndrives), data.cp_npickers, PLURAL(data.cp_npickers)); @@ -411,8 +436,9 @@ #undef PLURAL - (void)printf("\n%s: current picker: %d\n", changer_name, - data.cp_curpicker); + (void)printf("\n%s: current picker: %d\n", cn, data.cp_curpicker); + + free(cn); return (0); } @@ -422,18 +448,24 @@ do_getpicker(const char *cname, int argc, char **argv) { int picker; + char *cn; /* No arguments to this command. */ if (argc) { warnx("%s: no arguments expected", cname); usage(); + /*NOTREACHED*/ } + cn = printescaped(changer_name); + /* Get current picker from changer and display it. */ if (ioctl(changer_fd, CHIOGPICKER, &picker)) - err(1, "%s: CHIOGPICKER", changer_name); + err(1, "%s: CHIOGPICKER", cn); + /* NOTREACHED */ - (void)printf("%s: current picker: %d\n", changer_name, picker); + (void)printf("%s: current picker: %d\n", cn, picker); + free(cn); return (0); } @@ -446,16 +478,18 @@ if (argc < 1) { warnx("%s: too few arguments", cname); usage(); + /*NOTREACHED*/ } else if (argc > 1) { warnx("%s: too many arguments", cname); usage(); + /*NOTREACHED*/ } picker = parse_element_unit(*argv); /* Set the changer picker. */ if (ioctl(changer_fd, CHIOSPICKER, &picker)) - err(1, "%s: CHIOSPICKER", changer_name); + err(1, "%s: CHIOSPICKER", printescaped(changer_name)); return (0); } @@ -469,6 +503,7 @@ int i, chet, count, echet, flags, have_ucount, have_unit; int schet, ucount, unit; size_t size; + char *cn; flags = 0; have_ucount = 0; @@ -487,15 +522,19 @@ if (argc > 4) { warnx("%s: too many arguments", cname); usage(); + /*NOTREACHED*/ } + cn = printescaped(changer_name); + /* * Get params from changer. Specifically, we need the element * counts. */ (void)memset(&data, 0, sizeof(data)); if (ioctl(changer_fd, CHIOGPARAMS, &data)) - err(1, "%s: CHIOGPARAMS", changer_name); + err(1, "%s: CHIOGPARAMS", cn); + /* NOTREACHED */ schet = CHET_MT; echet = CHET_DT; @@ -509,10 +548,12 @@ if (argc != 1) { warnx("%s: malformed command line", cname); usage(); + /*NOTREACHED*/ } if (parse_special(argv[0]) != SW_VOLTAGS) errx(1, "%s: inappropriate special word: %s", cname, argv[0]); + /* NOTREACHED */ flags |= CESR_VOLTAGS; continue; } @@ -526,6 +567,7 @@ have_ucount) { warnx("%s: malformed command line", cname); usage(); + /*NOTREACHED*/ } schet = echet = parse_element_type(argv[0]); continue; @@ -538,6 +580,7 @@ if (schet != echet) { warnx("%s: malformed command line", cname); usage(); + /*NOTREACHED*/ } i = parse_element_unit(argv[0]); @@ -551,6 +594,7 @@ } else { warnx("%s: malformed command line", cname); usage(); + /*NOTREACHED*/ } } @@ -578,8 +622,9 @@ continue; else { (void)printf("%s: no %s elements\n", - changer_name, + cn, elements[chet].et_name); + free(cn); return (0); } } @@ -601,12 +646,14 @@ if ((unit + ucount) > count) errx(1, "%s: unvalid unit/count %d/%d", cname, unit, ucount); + /* NOTREACHED */ size = ucount * sizeof(struct changer_element_status); /* Allocate storage for the status bytes. */ if ((ces = malloc(size)) == NULL) errx(1, "can't allocate status storage"); + /* NOTREACHED */ (void)memset(ces, 0, size); (void)memset(&cmd, 0, sizeof(cmd)); @@ -624,7 +671,8 @@ if (ioctl(changer_fd, CHIOGSTATUS, &cmd)) { free(ces); - err(1, "%s: CHIOGSTATUS", changer_name); + err(1, "%s: CHIOGSTATUS", cn); + /* NOTREACHED */ } /* Dump the status for each element of this type. */ @@ -670,7 +718,8 @@ { if (ioctl(changer_fd, CHIOIELEM, NULL)) - err(1, "%s: CHIOIELEM", changer_name); + err(1, "%s: CHIOIELEM", printescaped(changer_name)); + /* NOTREACHED */ return (0); } @@ -699,6 +748,7 @@ if (argc < 1 || argc > 2) usage(); + /*NOTREACHED*/ for (i = 0; cdlu_subcmds[i].sw_name != NULL; i++) { if (strcmp(argv[0], cdlu_subcmds[i].sw_name) == 0) { @@ -708,6 +758,7 @@ } if (cdlu_subcmds[i].sw_name == NULL) usage(); + /*NOTREACHED*/ if (strcmp(argv[0], "abort") == 0) cmd.slot = 0; @@ -719,7 +770,8 @@ * XXX handling for cdlu; think about this some more. */ if (ioctl(changer_fd, CDIOCLOADUNLOAD, &cmd)) - err(1, "%s: CDIOCLOADUNLOAD", changer_name); + err(1, "%s: CDIOCLOADUNLOAD", printescaped(changer_name)); + /* NOTREACHED */ return (0); } @@ -825,4 +877,26 @@ commands[i].cc_args); exit(1); /* NOTREACHED */ +} + +char * +printescaped(const char *src) +{ + size_t len; + char *retval; + + len = strlen(src); + if (len != 0 && SIZE_T_MAX/len <= 4) + errx(EXIT_FAILURE, "%s: name too long", src); + + retval = (char *)malloc(4*len+1); + if (retval != NULL) { + if (stdout_ok) + (void)strvis(retval, src, VIS_NL | VIS_CSTYLE); + else + (void)strcpy(retval, src); + return retval; + } else + errx(EXIT_FAILURE, "out of memory!"); + /* NOTREACHED */ } Index: chmod/chmod.c =================================================================== RCS file: /cvsroot/src/bin/chmod/chmod.c,v retrieving revision 1.28 diff -b -u -r1.28 chmod.c --- chmod/chmod.c 7 Jul 2002 11:44:02 -0000 1.28 +++ chmod/chmod.c 26 Jul 2003 18:11:07 -0000 @@ -48,8 +48,9 @@ #endif #endif /* not lint */ -#include +#include #include +#include #include #include @@ -60,9 +61,13 @@ #include #include #include +#include + +int stdout_ok; int main(int, char *[]); void usage(void); +char *printescaped(const char *); int main(int argc, char *argv[]) @@ -71,7 +76,7 @@ FTSENT *p; mode_t *set; int Hflag, Lflag, Rflag, ch, fflag, fts_options, hflag, rval; - char *mode; + char *mode, *fn; int (*change_mode)(const char *, mode_t); setprogname(argv[0]); @@ -131,6 +136,8 @@ if (argc < 2) usage(); + stdout_ok = isatty(STDOUT_FILENO); + fts_options = FTS_PHYSICAL; if (Rflag) { if (hflag) @@ -162,14 +169,18 @@ (void)fts_set(ftsp, p, FTS_SKIP); break; case FTS_DNR: /* Warn, chmod, continue. */ - warnx("%s: %s", p->fts_path, strerror(p->fts_errno)); + fn = printescaped(p->fts_path); + warnx("%s: %s", fn, strerror(p->fts_errno)); + free(fn); rval = 1; break; case FTS_DP: /* Already changed at FTS_D. */ continue; case FTS_ERR: /* Warn, continue. */ case FTS_NS: - warnx("%s: %s", p->fts_path, strerror(p->fts_errno)); + fn = printescaped(p->fts_path); + warnx("%s: %s", fn, strerror(p->fts_errno)); + free(fn); rval = 1; continue; case FTS_SL: /* Ignore. */ @@ -188,7 +199,9 @@ } if ((*change_mode)(p->fts_accpath, getmode(set, p->fts_statp->st_mode)) && !fflag) { - warn("%s", p->fts_path); + fn = printescaped(p->fts_path); + warn("%s", fn); + free(fn); rval = 1; } } @@ -206,4 +219,26 @@ getprogname()); exit(1); /* NOTREACHED */ +} + +char * +printescaped(const char *src) +{ + size_t len; + char *retval; + + len = strlen(src); + if (len != 0 && SIZE_T_MAX/len <= 4) + errx(EXIT_FAILURE, "%s: name too long", src); + + retval = (char *)malloc(4*len+1); + if (retval != NULL) { + if (stdout_ok) + (void)strvis(retval, src, VIS_NL | VIS_CSTYLE); + else + (void)strcpy(retval, src); + return retval; + } else + errx(EXIT_FAILURE, "out of memory!"); + /* NOTREACHED */ } Index: cp/cp.c =================================================================== RCS file: /cvsroot/src/bin/cp/cp.c,v retrieving revision 1.32 diff -b -u -r1.32 cp.c --- cp/cp.c 16 Dec 2002 14:44:14 -0000 1.32 +++ cp/cp.c 26 Jul 2003 18:11:08 -0000 @@ -88,7 +88,7 @@ PATH_T to = { to.p_path, "" }; uid_t myuid; -int Rflag, fflag, iflag, pflag, rflag, vflag; +int Rflag, fflag, iflag, pflag, rflag, stdout_ok, vflag; mode_t myumask; enum op { FILE_TO_FILE, FILE_TO_DIR, DIR_TO_DNE }; @@ -153,13 +153,15 @@ if (argc < 2) usage(); + stdout_ok = isatty(STDOUT_FILENO); + fts_options = FTS_NOCHDIR | FTS_PHYSICAL; if (rflag) { if (Rflag) - errx(1, + errx(EXIT_FAILURE, "the -R and -r options may not be specified together."); if (Hflag || Lflag || Pflag) - errx(1, + errx(EXIT_FAILURE, "the -H, -L, and -P options may not be specified with the -r option."); fts_options &= ~FTS_PHYSICAL; fts_options |= FTS_LOGICAL; @@ -184,8 +186,10 @@ /* Save the target base in "to". */ target = argv[--argc]; - if (strlen(target) > MAXPATHLEN) - errx(1, "%s: name too long", target); + if (strlen(target) > MAXPATHLEN) { + errx(EXIT_FAILURE, "%s: name too long", printescaped(target)); + /* NOTREACHED */ + } (void)strcpy(to.p_path, target); to.p_end = to.p_path + strlen(to.p_path); if (to.p_path == to.p_end) { @@ -262,7 +266,7 @@ FTS *ftsp; FTSENT *curr; int base, dne, nlen, rval; - char *p, *tmp; + char *p, *tmp, *fn; base = 0; /* XXX gcc -Wuninitialized (see comment below) */ @@ -273,12 +277,15 @@ case FTS_NS: case FTS_DNR: case FTS_ERR: - warnx("%s: %s", - curr->fts_path, strerror(curr->fts_errno)); + fn = printescaped(curr->fts_path); + warnx("%s: %s", fn, strerror(curr->fts_errno)); + free(fn); rval = 1; continue; case FTS_DC: /* Warn, continue. */ - warnx("%s: directory causes a cycle", curr->fts_path); + fn = printescaped(curr->fts_path); + warnx("%s: directory causes a cycle", fn); + free(fn); rval = 1; continue; } @@ -290,8 +297,12 @@ if (type != FILE_TO_FILE) { if ((curr->fts_namelen + to.target_end - to.p_path + 1) > MAXPATHLEN) { - warnx("%s/%s: name too long (not copied)", - to.p_path, curr->fts_name); + char *tn; + tn = printescaped(to.p_path); + fn = printescaped(curr->fts_name); + warnx("%s/%s: name too long (not copied)", tn, fn); + free(fn); + free(tn); rval = 1; continue; } @@ -455,8 +466,14 @@ rval = 1; break; } - if (vflag) - (void)printf("%s -> %s\n", curr->fts_path, to.p_path); + if (vflag) { + char *tn; + fn = printescaped(curr->fts_path); + tn = printescaped(to.p_path); + (void)printf("%s -> %s\n", fn, tn); + free(fn); + free(tn); + } } if (errno) err(1, "fts_read"); Index: cp/extern.h =================================================================== RCS file: /cvsroot/src/bin/cp/extern.h,v retrieving revision 1.6 diff -b -u -r1.6 extern.h --- cp/extern.h 13 Sep 2001 09:53:59 -0000 1.6 +++ cp/extern.h 26 Jul 2003 18:11:09 -0000 @@ -46,7 +46,7 @@ extern PATH_T to; extern uid_t myuid; -extern int fflag, iflag, pflag; +extern int fflag, iflag, pflag, stdout_ok; extern mode_t myumask; #include @@ -59,6 +59,7 @@ int set_utimes(const char *, struct stat *); int setfile(struct stat *, int); void usage(void); +char *printescaped(const char *); __END_DECLS #endif /* !_EXTERN_H_ */ Index: cp/utils.c =================================================================== RCS file: /cvsroot/src/bin/cp/utils.c,v retrieving revision 1.23 diff -b -u -r1.23 utils.c --- cp/utils.c 20 Jan 2003 05:29:53 -0000 1.23 +++ cp/utils.c 26 Jul 2003 18:11:09 -0000 @@ -55,6 +55,7 @@ #include #include #include +#include #include "extern.h" @@ -335,4 +336,26 @@ getprogname(), getprogname()); exit(1); /* NOTREACHED */ +} + +char * +printescaped(const char *src) +{ + size_t len; + char *retval; + + len = strlen(src); + if (len != 0 && SIZE_T_MAX/len <= 4) + errx(EXIT_FAILURE, "%s: name too long", src); + + retval = (char *)malloc(4*len+1); + if (retval != NULL) { + if (stdout_ok) + (void)strvis(retval, src, VIS_NL | VIS_CSTYLE); + else + (void)strcpy(retval, src); + return retval; + } else + errx(EXIT_FAILURE, "out of memory!"); + /* NOTREACHED */ } Index: dd/dd.c =================================================================== RCS file: /cvsroot/src/bin/dd/dd.c,v retrieving revision 1.29 diff -b -u -r1.29 dd.c --- dd/dd.c 4 Sep 2002 04:21:54 -0000 1.29 +++ dd/dd.c 26 Jul 2003 18:11:10 -0000 @@ -131,7 +131,8 @@ } else { in.fd = open(in.name, O_RDONLY, 0); if (in.fd < 0) - err(1, "%s", in.name); + err(1, "%s", printescaped(in.name)); + /* NOTREACHED */ } getfdtype(&in); @@ -157,7 +158,8 @@ out.flags |= NOREAD; } if (out.fd < 0) - err(1, "%s", out.name); + err(1, "%s", printescaped(out.name)); + /* NOTREACHED */ } getfdtype(&out); @@ -234,7 +236,8 @@ struct stat sb; if (fstat(io->fd, &sb)) - err(1, "%s", io->name); + err(1, "%s", printescaped(io->name)); + /* NOTREACHED */ if (S_ISCHR(sb.st_mode)) io->flags |= ioctl(io->fd, MTIOCGET, &mt) ? ISCHR : ISTAPE; else if (lseek(io->fd, (off_t)0, SEEK_CUR) == -1 && errno == ESPIPE) @@ -273,13 +276,17 @@ /* Read error. */ if (n < 0) { + char *fn; + + fn = printescaped(in.name); /* * If noerror not specified, die. POSIX requires that * the warning message be followed by an I/O display. */ if (!(flags & C_NOERROR)) - err(1, "%s", in.name); - warn("%s", in.name); + err(1, "%s", fn); + /* NOTREACHED */ + warn("%s", fn); summary(); /* @@ -290,7 +297,7 @@ */ if (!(in.flags & (ISPIPE|ISTAPE)) && lseek(in.fd, (off_t)in.dbsz, SEEK_CUR)) - warn("%s", in.name); + warn("%s", fn); /* If sync not specified, omit block and continue. */ if (!(ddflags & C_SYNC)) @@ -300,6 +307,8 @@ in.dbcnt += in.dbrcnt = in.dbsz; ++st.in_full; + free(fn); + /* Handle full input blocks. */ } else if (n == in.dbsz) { in.dbcnt += in.dbrcnt = n; @@ -400,12 +409,17 @@ outp = out.db; for (n = force ? out.dbcnt : out.dbsz;; n = out.dbsz) { for (cnt = n;; cnt -= nw) { + char *fn; + + fn = printescaped(out.name); nw = bwrite(out.fd, outp, cnt); if (nw <= 0) { if (nw == 0) - errx(1, "%s: end of device", out.name); + errx(1, "%s: end of device", fn); + /* NOTREACHED */ if (errno != EINTR) - err(1, "%s", out.name); + err(1, "%s", fn); + /* NOTREACHED */ nw = 0; } outp += nw; @@ -422,12 +436,13 @@ break; if (out.flags & ISCHR && !warned) { warned = 1; - warnx("%s: short write on character device", - out.name); + warnx("%s: short write on character device", fn); } if (out.flags & ISTAPE) - errx(1, "%s: short write on tape device", - out.name); + errx(1, "%s: short write on tape device", fn); + /* NOTREACHED */ + + free(fn); } if ((out.dbcnt -= n) < out.dbsz) break; Index: dd/extern.h =================================================================== RCS file: /cvsroot/src/bin/dd/extern.h,v retrieving revision 1.13 diff -b -u -r1.13 extern.h --- dd/extern.h 26 Nov 2001 00:13:24 -0000 1.13 +++ dd/extern.h 26 Jul 2003 18:11:11 -0000 @@ -55,6 +55,7 @@ void unblock(void); void unblock_close(void); ssize_t bwrite(int, const void *, size_t); +char *printescaped(const char *); extern IO in, out; extern STAT st; Index: dd/misc.c =================================================================== RCS file: /cvsroot/src/bin/dd/misc.c,v retrieving revision 1.14 diff -b -u -r1.14 misc.c --- dd/misc.c 26 Nov 2001 00:56:33 -0000 1.14 +++ dd/misc.c 26 Jul 2003 18:11:11 -0000 @@ -46,6 +46,7 @@ #endif #endif /* not lint */ +#include #include #include @@ -55,6 +56,7 @@ #include #include #include +#include #include "dd.h" #include "extern.h" @@ -117,4 +119,26 @@ exit(0); /* NOTREACHED */ +} + +char * +printescaped(const char *src) +{ + size_t len; + char *retval; + + len = strlen(src); + if (len != 0 && SIZE_T_MAX/len <= 4) + errx(EXIT_FAILURE, "%s: name too long", src); + + retval = (char *)malloc(4*len+1); + if (retval != NULL) { + if (isatty(STDOUT_FILENO)) + (void)strvis(retval, src, VIS_NL | VIS_CSTYLE); + else + (void)strcpy(retval, src); + return retval; + } else + errx(EXIT_FAILURE, "out of memory!"); + /* NOTREACHED */ } Index: dd/position.c =================================================================== RCS file: /cvsroot/src/bin/dd/position.c,v retrieving revision 1.12 diff -b -u -r1.12 position.c --- dd/position.c 26 Nov 2001 00:56:33 -0000 1.12 +++ dd/position.c 26 Jul 2003 18:11:11 -0000 @@ -54,6 +54,7 @@ #include #include +#include #include #include @@ -75,7 +76,8 @@ if (!(in.flags & (ISPIPE|ISTAPE))) { if (lseek(in.fd, (off_t)in.offset * (off_t)in.dbsz, SEEK_CUR) == -1) - err(1, "%s", in.name); + err(1, "%s", printescaped(in.name)); + /* NOTREACHED */ return; } @@ -111,13 +113,17 @@ */ if (ddflags & C_NOERROR) { if (!warned) { - warn("%s", in.name); + char * fn; + fn = printescaped(in.name); + warn("%s", fn); + free(fn); warned = 1; summary(); } continue; } - err(1, "%s", in.name); + err(1, "%s", printescaped(in.name)); + /* NOTREACHED */ } } @@ -135,7 +141,8 @@ if (!(out.flags & ISTAPE)) { if (lseek(out.fd, (off_t)out.offset * (off_t)out.dbsz, SEEK_SET) == -1) - err(1, "%s", out.name); + err(1, "%s", printescaped(out.name)); + /* NOTREACHED */ return; } @@ -145,7 +152,8 @@ t_op.mt_count = out.offset; if (ioctl(out.fd, MTIOCTOP, &t_op) < 0) - err(1, "%s", out.name); + err(1, "%s", printescaped(out.name)); + /* NOTREACHED */ return; } @@ -155,7 +163,8 @@ continue; if (n < 0) - err(1, "%s", out.name); + err(1, "%s", printescaped(out.name)); + /* NOTREACHED */ /* * If reach EOF, fill with NUL characters; first, back up over @@ -165,11 +174,13 @@ t_op.mt_op = MTBSR; t_op.mt_count = 1; if (ioctl(out.fd, MTIOCTOP, &t_op) == -1) - err(1, "%s", out.name); + err(1, "%s", printescaped(out.name)); + /* NOTREACHED */ while (cnt++ < out.offset) if ((n = bwrite(out.fd, out.db, out.dbsz)) != out.dbsz) - err(1, "%s", out.name); + err(1, "%s", printescaped(out.name)); + /* NOTREACHED */ break; } } Index: ln/ln.c =================================================================== RCS file: /cvsroot/src/bin/ln/ln.c,v retrieving revision 1.21 diff -b -u -r1.21 ln.c --- ln/ln.c 27 Dec 2002 03:50:05 -0000 1.21 +++ ln/ln.c 26 Jul 2003 18:11:12 -0000 @@ -56,11 +56,14 @@ #include #include #include +#include int fflag; /* Unlink existing files. */ int hflag; /* Check new name for symlink first. */ int sflag; /* Symbolic, not hard, link. */ int vflag; /* Verbose output */ +int stdout_ok; /* stdout connected to a terminal */ + /* System link call. */ int (*linkf)(const char *, const char *); char linkch; @@ -68,6 +71,7 @@ int linkit(char *, char *, int); void usage(void); int main(int, char *[]); +char *printescaped(const char *); int main(int argc, char *argv[]) @@ -119,16 +123,19 @@ exit(linkit(argv[0], argv[1], 0)); /* NOTREACHED */ } + + stdout_ok = isatty(STDOUT_FILENO); + /* ln target1 target2 directory */ sourcedir = argv[argc - 1]; if (hflag && lstat(sourcedir, &sb) == 0 && S_ISLNK(sb.st_mode)) { /* we were asked not to follow symlinks, but found one at the target--simulate "not a directory" error */ errno = ENOTDIR; - err(1, "%s", sourcedir); + err(1, "%s", printescaped(sourcedir)); } if (stat(sourcedir, &sb)) - err(1, "%s", sourcedir); + err(1, "%s", printescaped(sourcedir)); if (!S_ISDIR(sb.st_mode)) usage(); for (exitval = 0; *argv != sourcedir; ++argv) @@ -142,11 +149,17 @@ { struct stat sb; char *p, path[MAXPATHLEN]; + char *sn, *tn; + + sn = printescaped(source); + tn = printescaped(target); if (!sflag) { /* If target doesn't exist, quit now. */ if (stat(target, &sb)) { - warn("%s", target); + warn("%s", tn); + free(sn); + free(tn); return (1); } } @@ -160,7 +173,9 @@ p = target; else ++p; - (void)snprintf(path, sizeof(path), "%s/%s", source, p); + p = printescaped(p); + (void)snprintf(path, sizeof(path), "%s/%s", sn, p); + free(p); source = path; } @@ -174,8 +189,10 @@ return (1); } if (vflag) - (void)printf("%s %c> %s\n", source, linkch, target); + (void)printf("%s %c> %s\n", sn, linkch, tn); + free(sn); + free(tn); return (0); } @@ -188,4 +205,26 @@ getprogname(), getprogname()); exit(1); /* NOTREACHED */ +} + +char * +printescaped(const char *src) +{ + size_t len; + char *retval; + + len = strlen(src); + if (len != 0 && SIZE_T_MAX/len <= 4) + errx(EXIT_FAILURE, "%s: name too long", src); + + retval = (char *)malloc(4*len+1); + if (retval != NULL) { + if (stdout_ok) + (void)strvis(retval, src, VIS_NL | VIS_CSTYLE); + else + (void)strcpy(retval, src); + return retval; + } else + errx(EXIT_FAILURE, "out of memory!"); + /* NOTREACHED */ } Index: mkdir/mkdir.c =================================================================== RCS file: /cvsroot/src/bin/mkdir/mkdir.c,v retrieving revision 1.29 diff -b -u -r1.29 mkdir.c --- mkdir/mkdir.c 10 Mar 2003 23:33:10 -0000 1.29 +++ mkdir/mkdir.c 26 Jul 2003 18:11:12 -0000 @@ -47,8 +47,9 @@ #endif #endif /* not lint */ -#include +#include #include +#include #include #include @@ -57,10 +58,14 @@ #include #include #include +#include + +int stdout_ok; /* stdout connected to a terminal */ int mkpath(char *, mode_t, mode_t); void usage(void); int main(int, char *[]); +char *printescaped(const char *); int main(int argc, char *argv[]) @@ -89,7 +94,8 @@ break; case 'm': if ((set = setmode(optarg)) == NULL) - errx(1, "invalid file mode: %s", optarg); + errx(1, "invalid file mode: %s", + printescaped(optarg)); mode = getmode(set, S_IRWXU | S_IRWXG | S_IRWXO); free(set); break; @@ -103,6 +109,8 @@ if (*argv == NULL) usage(); + stdout_ok = isatty(STDOUT_FILENO); + for (exitval = EXIT_SUCCESS; *argv != NULL; ++argv) { char *slash; @@ -127,7 +135,10 @@ */ if ((mode & ~(S_IRWXU|S_IRWXG|S_IRWXO)) != 0 && chmod(*argv, mode) == -1) { - warn("%s", *argv); + char *fn; + fn = printescaped(*argv); + warn("%s", fn); + free(fn); exitval = EXIT_FAILURE; } } @@ -147,11 +158,12 @@ mkpath(char *path, mode_t mode, mode_t dir_mode) { struct stat sb; - char *slash; + char *slash, *fn; int done, rv; done = 0; slash = path; + fn = printescaped(path); for (;;) { slash += strspn(slash, "/"); @@ -172,13 +184,15 @@ if (stat(path, &sb) < 0) { /* Not there; use mkdir()s error */ errno = sverrno; - warn("%s", path); + warn("%s", fn); + free(fn); return -1; } if (!S_ISDIR(sb.st_mode)) { /* Is there, but isn't a directory */ errno = ENOTDIR; - warn("%s", path); + warn("%s", fn); + free(fn); return -1; } } else if (done) { @@ -193,7 +207,8 @@ */ if ((mode & ~(S_IRWXU|S_IRWXG|S_IRWXO)) != 0 && chmod(path, mode) == -1) { - warn("%s", path); + warn("%s", fn); + free(fn); return -1; } } @@ -203,6 +218,8 @@ } *slash = '/'; } + + free(fn); return 0; } @@ -214,4 +231,26 @@ getprogname()); exit(EXIT_FAILURE); /* NOTREACHED */ +} + +char * +printescaped(const char *src) +{ + size_t len; + char *retval; + + len = strlen(src); + if (len != 0 && SIZE_T_MAX/len <= 4) + errx(EXIT_FAILURE, "%s: name too long", src); + + retval = (char *)malloc(4*len+1); + if (retval != NULL) { + if (stdout_ok) + (void)strvis(retval, src, VIS_NL | VIS_CSTYLE); + else + (void)strcpy(retval, src); + return retval; + } else + errx(EXIT_FAILURE, "out of memory!"); + /* NOTREACHED */ } Index: mv/mv.c =================================================================== RCS file: /cvsroot/src/bin/mv/mv.c,v retrieving revision 1.28 diff -b -u -r1.28 mv.c --- mv/mv.c 26 Dec 2002 21:37:17 -0000 1.28 +++ mv/mv.c 26 Jul 2003 18:11:13 -0000 @@ -65,17 +65,19 @@ #include #include #include +#include #include "pathnames.h" int fflg, iflg, vflg; -int stdin_ok; +int stdin_ok, stdout_ok; int copy(char *, char *); int do_move(char *, char *); int fastcopy(char *, char *, struct stat *); void usage(void); int main(int, char *[]); +char *printescaped(const char *); int main(int argc, char *argv[]) @@ -112,6 +114,7 @@ usage(); stdin_ok = isatty(STDIN_FILENO); + stdout_ok = isatty(STDOUT_FILENO); /* * If the stat on the target fails or the target isn't a directory, @@ -139,7 +142,9 @@ ++p; if ((baselen + (len = strlen(p))) >= MAXPATHLEN) { - warnx("%s: destination pathname too long", *argv); + char *fn = printescaped(*argv); + warnx("%s: destination pathname too long", fn); + free(fn); rval = 1; } else { memmove(endp, p, len + 1); @@ -156,6 +161,10 @@ { struct stat sb; char modep[15]; + char *fn, *tn; + + fn = printescaped(from); + tn = printescaped(to); /* * (1) If the destination path exists, the -f option is not specified @@ -176,29 +185,36 @@ if (iflg) { if (access(from, F_OK)) { - warn("rename %s", from); + warn("rename %s", fn); + free(fn); + free(tn); return (1); } - (void)fprintf(stderr, "overwrite %s? ", to); + (void)fprintf(stderr, "overwrite %s? ", tn); } else if (stdin_ok && access(to, W_OK) && !stat(to, &sb)) { if (access(from, F_OK)) { - warn("rename %s", from); + warn("rename %s", fn); + free(fn); + free(tn); return (1); } strmode(sb.st_mode, modep); (void)fprintf(stderr, "override %s%s%s/%s for %s? ", modep + 1, modep[9] == ' ' ? "" : " ", user_from_uid(sb.st_uid, 0), - group_from_gid(sb.st_gid, 0), to); + group_from_gid(sb.st_gid, 0), tn); } else ask = 0; if (ask) { if ((ch = getchar()) != EOF && ch != '\n') while (getchar() != '\n'); - if (ch != 'y' && ch != 'Y') + if (ch != 'y' && ch != 'Y') { + free(fn); + free(tn); return (0); } } + } /* * (2) If rename() succeeds, mv shall do nothing more with the @@ -215,12 +231,16 @@ */ if (!rename(from, to)) { if (vflg) - printf("%s -> %s\n", from, to); + printf("%s -> %s\n", fn, tn); + free(fn); + free(tn); return (0); } if (errno != EXDEV) { - warn("rename %s to %s", from, to); + warn("rename %s to %s", fn, tn); + free(fn); + free(tn); return (1); } @@ -232,7 +252,9 @@ */ if (!lstat(to, &sb)) { if ((S_ISDIR(sb.st_mode)) ? rmdir(to) : unlink(to)) { - warn("can't remove %s", to); + warn("can't remove %s", tn); + free(fn); + free(tn); return (1); } } @@ -242,9 +264,15 @@ * as a file hierarchy rooted in the destination path... */ if (lstat(from, &sb)) { - warn("%s", from); + warn("%s", fn); + free(fn); + free(tn); return (1); } + + free(fn); + free(tn); + return (S_ISREG(sb.st_mode) ? fastcopy(from, to, &sb) : copy(from, to)); } @@ -256,32 +284,44 @@ static u_int blen; static char *bp; int nread, from_fd, to_fd; + char *fn, *tn; + + fn = printescaped(from); + tn = printescaped(to); if ((from_fd = open(from, O_RDONLY, 0)) < 0) { - warn("%s", from); + warn("%s", fn); + free(fn); + free(tn); return (1); } if ((to_fd = open(to, O_CREAT | O_TRUNC | O_WRONLY, sbp->st_mode)) < 0) { - warn("%s", to); + warn("%s", tn); + free(fn); + free(tn); (void)close(from_fd); return (1); } if (!blen && !(bp = malloc(blen = sbp->st_blksize))) { warn(NULL); + free(fn); + free(tn); return (1); } while ((nread = read(from_fd, bp, blen)) > 0) if (write(to_fd, bp, nread) != nread) { - warn("%s", to); + warn("%s", tn); goto err; } if (nread < 0) { - warn("%s", from); + warn("%s", fn); err: if (unlink(to)) - warn("%s: remove", to); + warn("%s: remove", tn); (void)close(from_fd); (void)close(to_fd); + free(fn); + free(tn); return (1); } (void)close(from_fd); @@ -299,30 +339,36 @@ #else if (futimes(to_fd, tval)) #endif - warn("%s: set times", to); + warn("%s: set times", tn); if (fchown(to_fd, sbp->st_uid, sbp->st_gid)) { if (errno != EPERM) - warn("%s: set owner/group", to); + warn("%s: set owner/group", tn); sbp->st_mode &= ~(S_ISUID | S_ISGID); } if (fchmod(to_fd, sbp->st_mode)) - warn("%s: set mode", to); + warn("%s: set mode", tn); if (fchflags(to_fd, sbp->st_flags) && (errno != EOPNOTSUPP)) - warn("%s: set flags (was: 0%07o)", to, sbp->st_flags); + warn("%s: set flags (was: 0%07o)", tn, sbp->st_flags); if (close(to_fd)) { - warn("%s", to); + warn("%s", tn); + free(fn); + free(tn); return (1); } if (unlink(from)) { - warn("%s: remove", from); + warn("%s: remove", fn); + free(fn); + free(tn); return (1); } if (vflg) - printf("%s -> %s\n", from, to); + printf("%s -> %s\n", fn, tn); + free(fn); + free(tn); return (0); } @@ -378,4 +424,26 @@ getprogname()); exit(1); /* NOTREACHED */ +} + +char * +printescaped(const char *src) +{ + size_t len; + char *retval; + + len = strlen(src); + if (len != 0 && SIZE_T_MAX/len <= 4) + errx(EXIT_FAILURE, "%s: name too long", src); + + retval = (char *)malloc(4*len+1); + if (retval != NULL) { + if (stdout_ok) + (void)strvis(retval, src, VIS_NL | VIS_CSTYLE); + else + (void)strcpy(retval, src); + return retval; + } else + errx(EXIT_FAILURE, "out of memory!"); + /* NOTREACHED */ } Index: pwd/pwd.c =================================================================== RCS file: /cvsroot/src/bin/pwd/pwd.c,v retrieving revision 1.14 diff -b -u -r1.14 pwd.c --- pwd/pwd.c 16 Sep 2001 22:11:56 -0000 1.14 +++ pwd/pwd.c 26 Jul 2003 18:11:14 -0000 @@ -47,8 +47,9 @@ #endif #endif /* not lint */ -#include +#include #include +#include #include #include @@ -56,16 +57,21 @@ #include #include #include +#include + +int stdout_ok; /* stdout connected to a terminal */ static char *getcwd_logical(char *, size_t); static void usage(void); int main(int, char *[]); +char *printescaped(const char *); int main(int argc, char *argv[]) { int ch, lFlag; const char *p; + char *pn; setprogname(argv[0]); lFlag = 0; @@ -95,7 +101,11 @@ if (p == NULL) err(EXIT_FAILURE, NULL); - (void)printf("%s\n", p); + stdout_ok = isatty(STDOUT_FILENO); + + pn = printescaped(p); + (void)printf("%s\n", pn); + free(pn); exit(EXIT_SUCCESS); /* NOTREACHED */ @@ -146,4 +156,26 @@ (void)fprintf(stderr, "usage: %s [-LP]\n", getprogname()); exit(EXIT_FAILURE); /* NOTREACHED */ +} + +char * +printescaped(const char *src) +{ + size_t len; + char *retval; + + len = strlen(src); + if (len != 0 && SIZE_T_MAX/len <= 4) + errx(EXIT_FAILURE, "%s: name too long", src); + + retval = (char *)malloc(4*len+1); + if (retval != NULL) { + if (stdout_ok) + (void)strvis(retval, src, VIS_NL | VIS_CSTYLE); + else + (void)strcpy(retval, src); + return retval; + } else + errx(EXIT_FAILURE, "out of memory!"); + /* NOTREACHED */ } Index: rm/rm.c =================================================================== RCS file: /cvsroot/src/bin/rm/rm.c,v retrieving revision 1.34 diff -b -u -r1.34 rm.c --- rm/rm.c 1 Mar 2003 07:57:33 -0000 1.34 +++ rm/rm.c 26 Jul 2003 18:11:14 -0000 @@ -47,25 +47,28 @@ #endif #endif /* not lint */ -#include +#include #include +#include -#include #include #include #include #include #include +#include #include #include #include #include #include +#include -int dflag, eval, fflag, iflag, Pflag, stdin_ok, vflag, Wflag; +int dflag, eval, fflag, iflag, Pflag, stdin_ok, stdout_ok, vflag, Wflag; int check(char *, char *, struct stat *); void checkdot(char **); +char *printescaped(const char *); void rm_file(char **); void rm_overwrite(char *, struct stat *); void rm_tree(char **); @@ -136,6 +139,7 @@ if (*argv) { stdin_ok = isatty(STDIN_FILENO); + stdout_ok = isatty(STDOUT_FILENO); if (rflag) rm_tree(argv); @@ -153,6 +157,7 @@ FTS *fts; FTSENT *p; int flags, needstat, rval; + char *fn; /* * Remove a file hierarchy. If forcing removal (-f), or interactive @@ -175,16 +180,19 @@ (int (*)(const FTSENT **, const FTSENT **))NULL))) err(1, NULL); while ((p = fts_read(fts)) != NULL) { + switch (p->fts_info) { case FTS_DNR: if (!fflag || p->fts_errno != ENOENT) { - warnx("%s: %s", - p->fts_path, strerror(p->fts_errno)); + fn = printescaped(p->fts_path); + warnx("%s: %s", fn, strerror(p->fts_errno)); + free(fn); eval = 1; } continue; case FTS_ERR: - errx(1, "%s: %s", p->fts_path, strerror(p->fts_errno)); + errx(EXIT_FAILURE, "%s: %s", printescaped(p->fts_path), + strerror(p->fts_errno)); /* NOTREACHED */ case FTS_NS: /* @@ -194,8 +202,9 @@ if (fflag && NONEXISTENT(p->fts_errno)) continue; if (needstat) { - warnx("%s: %s", - p->fts_path, strerror(p->fts_errno)); + fn = printescaped(p->fts_path); + warnx("%s: %s", fn, strerror(p->fts_errno)); + free(fn); eval = 1; continue; } @@ -248,10 +257,15 @@ break; } if (rval != 0) { - warn("%s", p->fts_path); + fn = printescaped(p->fts_path); + warn("%s", fn); + free(fn); eval = 1; - } else if (vflag) - (void)printf("%s\n", p->fts_path); + } else if (vflag) { + fn = printescaped(p->fts_path); + (void)printf("%s\n", fn); + free(fn); + } } if (errno) err(1, "fts_read"); @@ -262,7 +276,7 @@ { struct stat sb; int rval; - char *f; + char *f, *fn; /* * Remove a file. POSIX 1003.2 states that, by default, attempting @@ -275,19 +289,25 @@ sb.st_mode = S_IFWHT|S_IWUSR|S_IRUSR; } else { if (!fflag || !NONEXISTENT(errno)) { - warn("%s", f); + fn = printescaped(f); + warn("%s", fn); + free(fn); eval = 1; } continue; } } else if (Wflag) { - warnx("%s: %s", f, strerror(EEXIST)); + fn = printescaped(f); + warnx("%s: %s", fn, strerror(EEXIST)); + free(fn); eval = 1; continue; } if (S_ISDIR(sb.st_mode) && !dflag) { - warnx("%s: is a directory", f); + fn = printescaped(f); + warnx("%s: is a directory", fn); + free(fn); eval = 1; continue; } @@ -303,11 +323,16 @@ rval = unlink(f); } if (rval && (!fflag || !NONEXISTENT(errno))) { - warn("%s", f); + fn = printescaped(f); + warn("%s", fn); + free(fn); eval = 1; } - if (vflag && rval == 0) - (void)printf("%s\n", f); + if (vflag && rval == 0) { + fn = printescaped(f); + (void)printf("%s\n", fn); + free(fn); + } } } @@ -329,6 +354,7 @@ off_t len; int fd, wlen; char buf[8 * 1024]; + char *fn; fd = -1; if (sbp == NULL) { @@ -360,7 +386,9 @@ return; err: eval = 1; - warn("%s", file); + fn = printescaped(file); + warn("%s", fn); + free(fn); } int @@ -368,11 +396,14 @@ { int ch, first; char modep[15]; + char *fn; /* Check -i first. */ - if (iflag) - (void)fprintf(stderr, "remove %s? ", path); - else { + if (iflag) { + fn = printescaped(path); + (void)fprintf(stderr, "remove '%s'? ", fn); + free(fn); + } else { /* * If it's not a symbolic link and it's unwritable and we're * talking to a terminal, ask. Symbolic links are excluded @@ -383,10 +414,12 @@ !(access(name, W_OK) && (errno != ETXTBSY))) return (1); strmode(sp->st_mode, modep); - (void)fprintf(stderr, "override %s%s%s/%s for %s? ", + fn = printescaped(path); + (void)fprintf(stderr, "override %s%s%s/%s for '%s'? ", modep + 1, modep[9] == ' ' ? "" : " ", user_from_uid(sp->st_uid, 0), - group_from_gid(sp->st_gid, 0), path); + group_from_gid(sp->st_gid, 0), fn); + free(fn); } (void)fflush(stderr); @@ -434,6 +467,28 @@ } else ++t; } +} + +char * +printescaped(const char *src) +{ + size_t len; + char *retval; + + len = strlen(src); + if (len != 0 && SIZE_T_MAX/len <= 4) + errx(EXIT_FAILURE, "%s: name too long", src); + + retval = (char *)malloc(4*len+1); + if (retval != NULL) { + if (stdout_ok) + (void)strvis(retval, src, VIS_NL | VIS_CSTYLE); + else + (void)strcpy(retval, src); + return retval; + } else + errx(EXIT_FAILURE, "out of memory!"); + /* NOTREACHED */ } void Index: rmdir/rmdir.c =================================================================== RCS file: /cvsroot/src/bin/rmdir/rmdir.c,v retrieving revision 1.17 diff -b -u -r1.17 rmdir.c --- rmdir/rmdir.c 16 Sep 2001 21:21:14 -0000 1.17 +++ rmdir/rmdir.c 26 Jul 2003 18:11:14 -0000 @@ -47,6 +47,8 @@ #endif #endif /* not lint */ +#include + #include #include #include @@ -54,10 +56,14 @@ #include #include #include +#include + +int stdout_ok; /* stdout connected to a terminal */ int rm_path(char *); void usage(void); int main(int, char *[]); +char *printescaped(const char *); int main(int argc, char *argv[]) @@ -83,6 +89,8 @@ if (argc == 0) usage(); + stdout_ok = isatty(STDIN_FILENO); + for (errors = 0; *argv; argv++) { char *p; @@ -93,7 +101,10 @@ *++p = '\0'; if (rmdir(*argv) < 0) { - warn("%s", *argv); + char *dn; + dn = printescaped(*argv); + warn("%s", dn); + free(dn); errors = 1; } else if (pflag) errors |= rm_path(*argv); @@ -115,7 +126,10 @@ *++p = '\0'; if (rmdir(path) < 0) { - warn("%s", path); + char *pn; + pn = printescaped(path); + warn("%s", pn); + free(pn); return (1); } } @@ -129,4 +143,26 @@ (void)fprintf(stderr, "usage: %s [-p] directory ...\n", getprogname()); exit(1); /* NOTREACHED */ +} + +char * +printescaped(const char *src) +{ + size_t len; + char *retval; + + len = strlen(src); + if (len != 0 && SIZE_T_MAX/len <= 4) + errx(EXIT_FAILURE, "%s: name too long", src); + + retval = (char *)malloc(4*len+1); + if (retval != NULL) { + if (stdout_ok) + (void)strvis(retval, src, VIS_NL | VIS_CSTYLE); + else + (void)strcpy(retval, src); + return retval; + } else + errx(EXIT_FAILURE, "out of memory!"); + /* NOTREACHED */ }