From owner-freebsd-audit Tue May 1 23: 9:57 2001 Delivered-To: freebsd-audit@freebsd.org Received: from bazooka.unixfreak.org (bazooka.unixfreak.org [63.198.170.138]) by hub.freebsd.org (Postfix) with ESMTP id 9138237B422 for ; Tue, 1 May 2001 23:09:49 -0700 (PDT) (envelope-from dima@unixfreak.org) Received: from spike.unixfreak.org (spike [63.198.170.139]) by bazooka.unixfreak.org (Postfix) with ESMTP id 23EFC3E28; Tue, 1 May 2001 23:09:49 -0700 (PDT) To: Bruce Evans Cc: audit@FreeBSD.ORG Subject: Re: {get,set}progname functions In-Reply-To: ; from bde@zeta.org.au on "Wed, 2 May 2001 15:10:45 +1000 (EST)" Date: Tue, 01 May 2001 23:09:48 -0700 From: Dima Dorfman Message-Id: <20010502060949.23EFC3E28@bazooka.unixfreak.org> Sender: owner-freebsd-audit@FreeBSD.ORG Precedence: bulk X-Loop: FreeBSD.ORG Bruce Evans writes: > On Tue, 1 May 2001, Dima Dorfman wrote: > > Attached is a patch to implement these in FreeBSD. Obviously, there's > > not much to implement since getprogname is a wrapper around a > > `return', and setprogname is a stub. > > I think setprogname() should not be a stub. setproctitle() can be > used to change the process's name, so why should setprogname() be > weaker? Perhaps setproctitle() should affect __progname (or at least > the result returned by getprogname()), and setprogname() shouldn't > exist. setproctitle() and setprogname() are supposed to change different things. setproctitle() sets the name of the program as it should show up in ps(1). Things like sendmail use it to show their status (e.g., "sendmail: accepting connections"). Conversely, setprogname() sets the program name as should be reported by err(3) and friends. I don't think the authors of sendmail have output like sendmail: accepting connections: some random error in mind when they write warn("some random error"); That said, you're right that setprogname() shouldn't be a stub. In the corrected path (below), it simply sets __progname. The fact that the pointer passed to it is kept for the duration of the program's life cycle is documented, so I think it's okay. > > --- include/stdlib.h 2001/04/23 09:32:06 1.20 > > +++ include/stdlib.h 2001/05/02 02:42:07 > > @@ -157,6 +157,7 @@ > > int daemon __P((int, int)); > > char *devname __P((int, int)); > > int getloadavg __P((double [], int)); > > +const char *getprogname __P((void)); > > KNF strictly requires a tab after the first word. This is not very useful, > but it is much easier for formatting programs to implement than putting > a tab after the type, since it only requires lexical analysis. > > I think this prototype should be formatted as: > > const char * > getprogname __P((void)); > > like all the other prototypes for all the other functions whose return > type (name) is longer than 7. All the rest of the prototypes aren't formatted quite like that. E.g.: unsigned short *seed48 __P((unsigned short[3])); The placement of the '*' differs. Personally, I think the way you suggest looks better, so that's the way I wrote it in the new patch. But which one's right? As mentioned before, a corrected patch is attached. Thanks, Dima Dorfman dima@unixfreak.org Index: include/stdlib.h =================================================================== RCS file: /st/src/FreeBSD/src/include/stdlib.h,v retrieving revision 1.20 diff -u -r1.20 stdlib.h --- include/stdlib.h 2001/04/23 09:32:06 1.20 +++ include/stdlib.h 2001/05/02 05:58:55 @@ -157,6 +157,8 @@ int daemon __P((int, int)); char *devname __P((int, int)); int getloadavg __P((double [], int)); +const char * + getprogname __P((void)); char *group_from_gid __P((unsigned long, int)); int heapsort __P((void *, size_t, size_t, @@ -172,6 +174,7 @@ long random __P((void)); void *reallocf __P((void *, size_t)); char *realpath __P((const char *, char resolved_path[])); +void setprogname __P((const char *)); char *setstate __P((char *)); void srandom __P((unsigned long)); void sranddev __P((void)); Index: lib/libc/gen/Makefile.inc =================================================================== RCS file: /st/src/FreeBSD/src/lib/libc/gen/Makefile.inc,v retrieving revision 1.77 diff -u -r1.77 Makefile.inc --- lib/libc/gen/Makefile.inc 2001/04/17 07:59:50 1.77 +++ lib/libc/gen/Makefile.inc 2001/05/02 05:58:55 @@ -13,7 +13,7 @@ getcap.c getcwd.c getdomainname.c getgrent.c getgrouplist.c \ gethostname.c getloadavg.c getlogin.c getmntinfo.c getnetgrent.c \ getobjformat.c getosreldate.c getpagesize.c \ - getpass.c getpwent.c getttyent.c \ + getpass.c getprogname.c getpwent.c getttyent.c \ getusershell.c getvfsbyname.c getvfsent.c glob.c \ initgroups.c isatty.c jrand48.c lcong48.c \ lockf.c lrand48.c mrand48.c msgctl.c \ @@ -22,7 +22,8 @@ pause.c popen.c psignal.c pw_scan.c pwcache.c raise.c readdir.c rewinddir.c \ posixshm.c \ scandir.c seed48.c seekdir.c semconfig.c semctl.c semget.c semop.c \ - setdomainname.c sethostname.c setjmperr.c setmode.c setproctitle.c \ + setdomainname.c sethostname.c setjmperr.c setmode.c setprogname.c \ + setproctitle.c \ shmat.c shmctl.c shmdt.c shmget.c siginterrupt.c siglist.c signal.c \ sigsetops.c sleep.c srand48.c stringlist.c strtofflags.c \ sysconf.c sysctl.c sysctlbyname.c sysctlnametomib.c \ @@ -43,7 +44,7 @@ getdiskbyname.3 getdomainname.3 getfsent.3 \ getgrent.3 getgrouplist.3 gethostname.3 getloadavg.3 \ getmntinfo.3 getnetgrent.3 getobjformat.3 \ - getpagesize.3 getpass.3 getpwent.3 \ + getpagesize.3 getpass.3 getprogname.3 getpwent.3 \ getttyent.3 getusershell.3 getvfsbyname.3 getvfsent.3 \ glob.3 initgroups.3 isinf.3 \ ldexp.3 lockf.3 modf.3 msgctl.3 msgget.3 msgrcv.3 msgsnd.3 \ @@ -82,6 +83,7 @@ MLINKS+=gethostname.3 sethostname.3 MLINKS+=getnetgrent.3 endnetgrent.3 getnetgrent.3 innetgr.3 \ getnetgrent.3 setnetgrent.3 +MLINKS+=getprogname.3 setprogname.3 MLINKS+=getpwent.3 endpwent.3 getpwent.3 getpwnam.3 getpwent.3 getpwuid.3 \ getpwent.3 setpassent.3 getpwent.3 setpwent.3 getpwent.3 setpwfile.3 MLINKS+=getttyent.3 endttyent.3 getttyent.3 getttynam.3 \ --- /dev/null Tue May 1 20:04:30 2001 +++ lib/libc/gen/getprogname.c Tue May 1 22:58:10 2001 @@ -0,0 +1,14 @@ +#ifndef lint +static const char rcsid[] = + "$FreeBSD$"; +#endif /* not lint */ + +extern const char * + __progname; + +const char * +getprogname(void) +{ + + return (__progname); +} --- /dev/null Tue May 1 20:04:30 2001 +++ lib/libc/gen/setprogname.c Tue May 1 22:58:16 2001 @@ -0,0 +1,14 @@ +#ifndef lint +static const char rcsid[] = + "$FreeBSD$"; +#endif /* not lint */ + +extern const char * + __progname; + +void +setprogname(const char *progname) +{ + + __progname = progname; +} --- /dev/null Tue May 1 20:04:30 2001 +++ lib/libc/gen/getprogname.3 Tue May 1 22:41:23 2001 @@ -0,0 +1,62 @@ +.\" +.\" $FreeBSD$ +.\" +.Dd May 1, 2001 +.Dt GETPROGNAME 3 +.Os +.Sh NAME +.Nm getprogname , +.Nm setprogname +.Nd get or set the program name +.Sh LIBRARY +.Lb libc +.Sh SYNOPSIS +.Fd #include +.Ft const char * +.Fn getprogname "void" +.Ft void +.Fn setprogname "const char *progname" +.Sh DESCRIPTION +The +.Fn getprogname +and +.Fn setprogname +functions manipulate the name of the current program. +They are used by error-reporting routines to produce +consistent output. +.Pp +The +.Fn getprogname +function returns the name of the program. +If the name has not been set yet, it will return +.Dv NULL . +.Pp +The +.Fn setprogname +function sets the name of the program. +Since a pointer to the given string is kept as the program name, +it should not be modified for the rest of the program's lifetime. +.Pp +In +.Fx , +the name of the program is set by the start-up code that is run before +.Fn main ; +thus, +running +.Fn setprogname +is not necessary. +Programs that desire maximum portability should still call it; +on another operating system, +these functions may be implemented in a portability library. +Calling +.Fn setprogname +allows the aforementioned library to learn the program name without +modifications to the start-up code. +.Sh SEE ALSO +.Xr err 3 , +.Xr setproctitle 3 +.Sh HISTORY +These functions first appeared in +.Nx 1.6 , +and made their way into +.Fx 5.0 . To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-audit" in the body of the message