which(1) prints error messages on stdout, breaking shell scripts and
common usage patterns:
ldd `which foo`
ldd: foo:: No such file or directory
ldd: Command: No such file or directory
ldd: not: No such file or directory
ldd: found.: No such file or directory
X=$(which foo 2>/dev/null)
test -n "$X" || echo "foo not found"
This works contrary to the csh builtin it was modeled after and `which'
from coreutils.
The patch below fixes that. As a bonus, print "which: " in front of the
otherwise confusing error message.
While there, let err() do its job and print a standard error message for
strndup (replace with "malloc"|NULL if you like that better)
Index: which.c
===================================================================
RCS file: /vcs/cvs/openbsd/src/usr.bin/which/which.c,v
retrieving revision 1.15
diff -u -p -r1.15 which.c
--- which.c 27 Oct 2009 23:59:50 -0000 1.15
+++ which.c 27 May 2010 19:49:50 -0000
@@ -120,13 +120,13 @@ findprog(char *prog, char *path, int pro
(void)puts(prog);
return (1);
} else {
- (void)printf("%s: Command not found.\n", prog);
+ warnx("%s: Command not found.", prog);
return (0);
}
}
if ((path = strdup(path)) == NULL)
- errx(1, "Can't allocate memory.");
+ err(1, "strdup");
pathcpy = path;
proglen = strlen(prog);
@@ -159,7 +159,7 @@ findprog(char *prog, char *path, int pro
/* whereis(1) is silent on failure. */
if (!rval && progmode != PROG_WHEREIS)
- (void)printf("%s: Command not found.\n", prog);
+ warnx("%s: Command not found.", prog);
return (rval);
}