On Tue, Sep 19, 2017 at 03:53:59PM +0200, Steffen Nurpmeso wrote:
Larry McVoy <lm(a)mcvoy.com> wrote:
|On Mon, Sep 18, 2017 at 08:52:08PM -0400, Random832 wrote:
|> On Thu, Sep 14, 2017, at 15:37, Steve Johnson wrote:
|>> I wrote a paper on error messages at one point.?? I had examples from
|>> bad to best.?? In a nutshell (worst to best):
|>>
|>> * <program aborts, leaving the world in an unknown state>
|>> * "internal error",?? "beta table overflow",
"operation failed"
|>> * "Writing the output file failed"
|>> * "File xxx could not be opened for writing."
|>> * "File xxx could not be opened for writing: check the file location
|>> and permissions"
|>>
|>> * "Writing the output file xxx caused an error.?? See <link> for
|>> possible reasons and corrections"
|>>
|>> Most git messages fall between 2 and 3.?? But there are occasional 4's
|>> and 5's.
|>
|> Just out of curiosity, where does perror(filename), quite possibly the
|> *most* common error message on Unix as a whole, fall on your scale? It
|> says which of the file location or permissions (or whatever else) it is,
|> but not whether it was attempting to open it for reading or writing.
|
|So in the BitKeeper source, perror is redifined to my_perror which is
|this:
|
|void
|my_perror(char *file, int line, char *msg)
|{
| char *p = 0;
| int save = errno;
|
| if (p = getenv("_BK_VERSION")) {
| if (strneq(p, "bk-", 3)) p += 3;
| fprintf(stderr, "%s:%d (%s): ", file, line, p);
|} else {
| fprintf(stderr, "%s:%d: ", file, line);
|}
| if (p = strerror(errno)) {
| fprintf(stderr, "%s: %s\n", msg, p);
|} else {
| fprintf(stderr, "%s: errno=%d\n", msg, errno);
|}
| errno = save;
|}
|
|libc should do that.
That really made me wonder why "save" is not used, errno may
eventually change along the way. Ok ok, but.. well.
Huh? save is set with errno and then errno is restored to save. The
point of save is to do the library calls (which do syscalls which
could in theory change errno) and leave it the same as it was on
the way in.