Hi Bruce,

> This isn't a library function, but a program that I needed to polish up a bit.
> Fiddling and tweaking can turn it into a library function without too much 
> trouble.
> The last file ("err-names.h") is a derived file that depends on the "mk" 
> script

Is the list of errno values meant to be extracted before a tarball is built, or
at build time?

If you want to create a distributable file, IMO Thien-Thi Nguyen's approach [1]
is good. The code would then look similar to lib/strerror-override.c, basically
like this:

  #ifdef ENOENT
  case ENOENT:
    return "ENOENT";
  #endif
  #ifdef ENOTDIR
  case ENOTDIR:
    return "ENOTDIR";
  #endif
  ...

If you want to create file at build time, then the mk-err-names.sh script needs
to be a /bin/sh script; you cannot assume that 'bash' is available. Also, what's
the point of using the numeric values of the error numbers? If you generate code
like

  case ENOENT:
    return "ENOENT";
  case ENOTDIR:
    return "ENOTDIR";
  ...

then the code is not only more robust but also requires fewer relocations when
put into a shared library. In

    [  1] = "EPERM",
    [  2] = "ENOENT",

the shared library needs to relocate, during loading, as many pointers as there
are references to strings. See Ulrich Drepper's writeup about how to code for
shared libraries ([2], section 2.4.3).

Bruno

[1] http://lists.gnu.org/archive/html/bug-gnulib/2011-06/msg00057.html
[2] http://www.akkadia.org/drepper/dsohowto.pdf
-- 
In memoriam Amatore Sciesa <http://it.wikipedia.org/wiki/Amatore_Sciesa>

Reply via email to