[musl] Re: Tweaking the program name for <err.h> functions

Rich Felker dalias at libc.org
Sat Mar 9 15:02:58 UTC 2024


On Fri, Mar 08, 2024 at 01:52:28AM +0100, Alejandro Colomar wrote:
> [TO += musl]
> 
> Hi!
> 
> On Fri, Mar 08, 2024 at 01:30:51AM +0100, Guillem Jover wrote:
> > That is not portable because the BSDs do not support that variable.
> > But all BSDs for which I've got a checkout (FreeBSD, NetBSD, OpenBSD,
> > DragonflyBSD) support changing it via setprogname(), but that's not
> > available in glibc (libbsd provides it though).
> > 
> > libbsd and cosmopolitan libc support setting it via setprogname() or
> > program_invocation_short_name.
> > 
> > musl libc supports setting it via program_invocation_short_name.
> > 
> > uclibc might support __progname and/or program_invocation_short_name
> > depending on how it has been configured, but it does not support
> > setting the err(3) program name via those.
> 
> Hmmm.
> 
> 	$ cat err.c 
> 	#define _GNU_SOURCE
> 	#include <bsd/stdlib.h>
> 	#include <err.h>
> 	#include <errno.h>
> 	#include <error.h>
> 
> 
> 	int
> 	main(void)
> 	{
> 		program_invocation_name = "foo";
> 		program_invocation_short_name = "bar";
> 		setprogname("baz");
> 
> 		error(0, errno, "fmt string");
> 		err(1, "fmt2");
> 	}
> 	$ cc -Wall -Wextra err.c -lbsd
> 	$ ./a.out 
> 	foo: fmt string
> 	baz: fmt2: Success
> 
> This would already be portable enough for what I want, except that
> libbsd isn't very welcome in some OSes as a core library.  I guess I'll
> need libc support.
> 
> > 
> > > Maybe it would be interesting to get the BSDs to support these pointers?
> > 
> > They already have a way to control the program name though. (And
> > it seems to me that using functions instead of global variables is
> > superior. :)
> 
> Indeed.  I didn't know about such function.  I'll reformulate my
> original suggestion to this other one:
> 
> How about adding setprogname(3) (and getprogname(3)) to GNU and musl
> libc?

I really don't think they meet the criteria for inclusion. They don't
have historical cross platform precedent, they're not something we've
hit existing applications failing to build for lack of, they don't let
you do anything you couldn't already do, and the semantics would be
unclear (do they just configure the legacy err.h functions? set
__progname/program_invocation_short_name? modify argv[0]?)

The entire err.h function set in musl is 67 lines that compile down to
less than 500 bytes of machine code. If there's not a portable way to
configure them the way you want, and you refuse to run a configure
script of some sort to determine if the setprogname function some
systems need exists, the simpler solution, rather than trying to get
new contracts into libc and wait for them to be widely available, is
to copy-and-paste those 67 lines and customize them as needed in your
program, no?

Rich


More information about the libbsd mailing list