cc: [email protected]
Subject: Re: [ast-developers] exporting environment variables in plugins
--------
> I'm developing a built-in for ksh93 that will read a header line from
> stdin, parse it, export some environment variables which will be used in
> parsing the remaining lines of input - which results in more environment
> variables being exported for use inside a loop.
>
> e.g. cat somefile | while my_builtin ; do
> somethingWithEnvironmentVariables; done
>
> And my code looks like:
>
> int b_my_builtin(int argc, char *argv, void *context) {
> char * line;
>
> if ((line = sfgetr(sfstdin,'\n',SF_STRING)) == NULL) {
> return 1;
> }
>
> if ( /* line is the header line */ ) {
>
> /*
> * parse header here, export header variables
> */
>
> if ((line = sfgetr(sfstdin,'\n',SF_STRING)) == NULL) {
> return 1;
> }
> }
>
> /*
> * parse non-header line using header environment variables
> * export parsed data to environment variables for use inside a shell
> loop
> */
>
> return 0;
> }
>
> My question is, how should I best use memory in exporting environment
> variables using nv_putval(name,value,flags)? Is it safe to use a pointer
> to line (from sfgetr) for value (in nv_putval), or should I use malloc
> or strdup to create new strings to pass in for value? For the latter
> case, can I assume that these will be freed by the shell internals at
> some point - e.g. during the next loop iteration when I go to nv_putval
> again? Or should I free via an existing value pointer (from nv_getval)
> before overwriting, either explicitly or via nv_unset? Incoming data
> could potentially be large, and the shell long-running, so I'd like to
> prevent leaking memory.
>
> (Also, the built-in will be statically linked-into the shell binary, in
> case that makes a difference.)
>
> Thanks in advance,
> Carl
>
>
>
If flags does not contain NV_NOFREE, then it is safe to use a pointer
since the shell will make a private copy and free it when another
assignment is given.
The variable will not be exported unless it is already exported or if
flag contains NV_EXPORT. Otherwise, it will be a local variable.
> _______________________________________________
> ast-developers mailing list
> [email protected]
> https://mailman.research.att.com/mailman/listinfo/ast-developers
>
David Korn
[email protected]
_______________________________________________
ast-developers mailing list
[email protected]
https://mailman.research.att.com/mailman/listinfo/ast-developers