Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 26 May 2013 19:55:03 +0200
From:      Stefan Ehmann <shoesoft@gmx.net>
To:        freebsd-ports@freebsd.org
Subject:   Re: Proper way to access executable's "environment"?
Message-ID:  <51A24C77.6000108@gmx.net>
In-Reply-To: <20130526172015.GA1334@albert.catwhisker.org>
References:  <20130526172015.GA1334@albert.catwhisker.org>

next in thread | previous in thread | raw e-mail | index | archive | help
On 05/26/2013 19:20, David Wolfskill wrote:
> A while back, I volunteered to maintain x11-wm/piewm, as it had been
> assigned to "ports" and I'm one of the very few folks I know who uses
> it.
...
> So I hacked twm.c, per:
>
> --- twm.c	1998-06-12 13:28:07.000000000 -0700
> +++ twm.c	2013-05-10 21:02:32.000000000 -0700
> @@ -93,6 +93,7 @@
>   #endif
>
>   #include <stdio.h>
> +#include <stdlib.h>
>   #include <signal.h>
>   #include <fcntl.h>
>   #include "twm.h"
> @@ -177,6 +178,8 @@
>
>   unsigned long black, white;
>
> +extern char **environ;
> +
>   /***********************************************************************
>    *
>    *  Procedure:
> @@ -186,7 +189,7 @@
>    */
>
>   int
> -main(int argc, char **argv, char **environ)
> +main(int argc, char **argv)
>   {
>       Window root, parent, *children;
>       unsigned int nchildren;
>
>
> rebuilt piewm, et voilą:  no crash.  :-)
>
> I thought this was encouraging, and sent a note to Russ Nelson at
> crynwr.com -- the upstream site.  That was on 10 May; I've had no
> response.
>
> I subsequently rebuild piewm with the patch applied for my usual
> FreeBSD/i386 environment, and it's (also) been trouble-free.  (That
> said, I don't actually do anything with the environment for piewm.
> Indeed, in nearly all respects, I could use tvtwm without any difference
> -- and those that would show up are too arcane to describe here.)
>
> So I have a couple of questions related to the above:
> * Is the patch correct?  I don't do much with C, and even less with C
>    code that accesses the environment.  (When I write code, it's normally
>    scripts, mostly in /bin/sh.)  getenv(3) mentioned the "#include
>    <stdlib.h>", so I did that based on theat man page.  I didn't see
>    anything about declaring environ as an "extern char **", but wasn't
>    keen on making more changes than necessary to the code.  (Mind, I
>    fully support making "necessary" -- or even "strongly advised" --
>    changes.)

Should be fine. See environ(7) or
http://pubs.opengroup.org/onlinepubs/9699919799/functions/environ.html:

"In addition, the following variable, which must be declared by the user 
if it is to be used directly: extern char **environ; "

Including <stdlib.h> is not necessary to access the environ variable.

-- 
Stefan



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