[GRASS-user] Calling GRASS scripts from GRASS C modules

Glynn Clements glynn at gclements.plus.com
Wed Mar 23 00:14:36 EDT 2011


Markus Neteler wrote:

> > 7.0 has G_popen_{read,write}, which do most of the work for you, but
> > these haven't been back-ported to 6.x yet.
> 
> I have compared the two lib/gis/popen.c files. Is backport as "easy" as
> adding the GRASS 7 functions in 6 to also keep the old G_popen() and
> G_pclose() for backward compatibility?

Yes.

But the existing G_popen() and G_pclose() functions should either be
removed or replaced with:

	FILE *G_popen(const char *cmd, const char *mode)
	{
	    return popen(cmd, mode);
	}
	
	int G_pclose(FILE *ptr)
	{
	    return pclose(ptr);
	}

There's no reason to (attempt to) provide our own implementations of
these functions, particularly when the Windows version is completely
broken.

Note that G_popen() has already been removed from 6.5, with the code
changed to use popen() instead. This still suffers from the usual
issues with trying to reliably construct a shell command, but it
avoids the G_popen()-specific bugs.

In 7.0, all references to popen() have been removed, and the only use
of system() is in D_close_driver(), to execute a shell command
specified by the GRASS_NOTIFY environment variable.

-- 
Glynn Clements <glynn at gclements.plus.com>


More information about the grass-user mailing list