[Libguestfs] [PATCH 2/5] macosx: Add definition of program_name for gnulib
Richard W.M. Jones
rjones at redhat.com
Wed Feb 11 13:46:46 UTC 2015
On Mon, Feb 09, 2015 at 02:55:58PM +0000, Margaret Lewicka wrote:
> On 9 February 2015 at 13:10, Daniel P. Berrange <berrange at redhat.com> wrote:
> > On Mon, Feb 09, 2015 at 11:06:16AM +0000, Margaret Lewicka wrote:
> >> gnulib's error.c requires program_name to be externally defined
> >> for !_LIBC systems. This defines program_name for Darwin only.
> >> ---
> >> configure.ac | 3 +++
> >> src/Makefile.am | 6 ++++++
> >> src/program_name.c | 4 ++++
> >> 3 files changed, 13 insertions(+)
> >> create mode 100644 src/program_name.c
> >
> > src/guestfs-internal-frontend.h has a #define to replace use
> > of 'program_name' with something that is defined, so this
> > should not be required unless the header includes are not
> > right somewhere.
>
> It is required, because gnulib itself explicitly defines an extern
> char *program_name. See gnulib/lib/error.c:118
What actually happens in gnulib's error.c is:
#ifdef _LIBC
/* In the GNU C library, there is a predefined variable for this. */
# define program_name program_invocation_name
#endif
which on glibc causes all uses of `program_name' in the error.c source
to refer to refer to a string that glibc defines called
`program_invocation_name':
extern char *program_invocation_name; /* defined in glibc, same as argv[0]*/
On non-glibc, error.c says:
/* The calling program should define program_name and set it to the
name of the executing program. */
extern char *program_name;
This indicates to me that we shouldn't define `program_name' as a symbol
in libguestfs. Instead every libguestfs-using program should define
it. For example, virt-df (df/main.c) would have:
#if /* this is Mac OS X */
char *program_name = "virt-df";
#endif
That sucks a lot.
I think the alternative is that you find a similar symbol defined by
Mac OS X that gives you the value of argv[0], and then send a patch to
gnulib which does:
#if /* this is Mac OS X */
#define program_name whatever_mac_os_x_defines_as_program_name
#endif
My reading is that something like this might work, untested of course:
#if /* this is Mac OS X */
#define program_name (((char **)*_NSGetArgv())[0])
#endif
Rich.
--
Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones
Read my programming and virtualization blog: http://rwmj.wordpress.com
virt-top is 'top' for virtual machines. Tiny program with many
powerful monitoring features, net stats, disk stats, logging, etc.
http://people.redhat.com/~rjones/virt-top
More information about the Libguestfs
mailing list