Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 01 May 2001 23:09:48 -0700
From:      Dima Dorfman <dima@unixfreak.org>
To:        Bruce Evans <bde@zeta.org.au>
Cc:        audit@FreeBSD.ORG
Subject:   Re: {get,set}progname functions 
Message-ID:  <20010502060949.23EFC3E28@bazooka.unixfreak.org>
In-Reply-To: <Pine.BSF.4.21.0105021449040.40807-100000@besplex.bde.org>; from bde@zeta.org.au on "Wed, 2 May 2001 15:10:45 %2B1000 (EST)"

next in thread | previous in thread | raw e-mail | index | archive | help
Bruce Evans <bde@zeta.org.au> 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 <stdlib.h>
+.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




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20010502060949.23EFC3E28>