2005-09-20 21:26:39 +08:00
|
|
|
/** \file env.h
|
|
|
|
Prototypes for functions for setting and getting environment variables.
|
|
|
|
*/
|
|
|
|
|
2005-10-04 23:11:39 +08:00
|
|
|
#ifndef FISH_ENV_H
|
|
|
|
#define FISH_ENV_H
|
|
|
|
|
|
|
|
#include <wchar.h>
|
|
|
|
|
|
|
|
#include "util.h"
|
|
|
|
|
2005-09-20 21:26:39 +08:00
|
|
|
/**
|
|
|
|
Flag for local (to the current block) variable
|
|
|
|
*/
|
|
|
|
#define ENV_LOCAL 1
|
|
|
|
|
|
|
|
/**
|
|
|
|
Flag for exported (to commands) variable
|
|
|
|
*/
|
|
|
|
#define ENV_EXPORT 2
|
|
|
|
|
|
|
|
/**
|
|
|
|
Flag for unexported variable
|
|
|
|
*/
|
|
|
|
#define ENV_UNEXPORT 16
|
|
|
|
|
|
|
|
/**
|
|
|
|
Flag for global variable
|
|
|
|
*/
|
|
|
|
#define ENV_GLOBAL 4
|
|
|
|
|
|
|
|
/**
|
|
|
|
Flag for variable update request from the user. All variable
|
|
|
|
changes that are made directly by the user, such as those from the
|
|
|
|
'set' builtin must have this flag set.
|
|
|
|
*/
|
|
|
|
#define ENV_USER 8
|
|
|
|
|
|
|
|
/**
|
|
|
|
Flag for universal variable
|
|
|
|
*/
|
|
|
|
#define ENV_UNIVERSAL 32
|
|
|
|
|
2006-04-10 23:36:26 +08:00
|
|
|
/**
|
|
|
|
Error code for trying to alter read-only variable
|
|
|
|
*/
|
2006-06-09 07:52:12 +08:00
|
|
|
enum{
|
|
|
|
ENV_PERM = 1,
|
|
|
|
ENV_INVALID
|
|
|
|
}
|
|
|
|
;
|
|
|
|
|
2006-04-10 23:36:26 +08:00
|
|
|
|
2005-09-20 21:26:39 +08:00
|
|
|
/**
|
|
|
|
Initialize environment variable data
|
|
|
|
*/
|
|
|
|
void env_init();
|
|
|
|
|
|
|
|
/**
|
|
|
|
Destroy environment variable data
|
|
|
|
*/
|
|
|
|
void env_destroy();
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
Set the value of the environment variable whose name matches key to val.
|
|
|
|
|
|
|
|
Memory policy: All keys and values are copied, the parameters can and should be freed by the caller afterwards
|
|
|
|
|
|
|
|
\param key The key
|
|
|
|
\param val The value
|
|
|
|
\param mode The type of the variable. Can be any combination of ENV_GLOBAL, ENV_LOCAL, ENV_EXPORT and ENV_USER. If mode is zero, the current variable space is searched and the current mode is used. If no current variable with the same name is found, ENV_LOCAL is assumed.
|
|
|
|
|
2006-04-10 23:36:26 +08:00
|
|
|
\returns 0 on suicess or an error code on failiure.
|
|
|
|
|
|
|
|
The current error codes are:
|
|
|
|
|
|
|
|
* ENV_PERM, can only be returned when setting as a user, e.g. ENV_USER is set. This means that the user tried to change a read-only variable.
|
2006-06-09 07:52:12 +08:00
|
|
|
* ENV_INVALID, the variable name or mode was invalid
|
2005-09-20 21:26:39 +08:00
|
|
|
*/
|
|
|
|
|
2006-04-10 23:36:26 +08:00
|
|
|
int env_set( const wchar_t *key,
|
2006-10-19 23:19:47 +08:00
|
|
|
const wchar_t *val,
|
|
|
|
int mode );
|
2005-09-20 21:26:39 +08:00
|
|
|
|
|
|
|
|
|
|
|
/**
|
2005-10-14 19:40:33 +08:00
|
|
|
Return the value of the variable with the specified name. Returns 0
|
|
|
|
if the key does not exist. The returned string should not be
|
|
|
|
modified or freed. The returned string is only guaranteed to be
|
|
|
|
valid until the next call to env_get(), env_set(), env_push() or
|
|
|
|
env_pop() takes place.
|
2005-09-20 21:26:39 +08:00
|
|
|
*/
|
|
|
|
wchar_t *env_get( const wchar_t *key );
|
|
|
|
|
2005-09-26 22:47:03 +08:00
|
|
|
/**
|
2006-10-26 18:22:53 +08:00
|
|
|
Returns 1 if the specified key exists. This can't be reliably done
|
2005-09-26 22:47:03 +08:00
|
|
|
using env_get, since env_get returns null for 0-element arrays
|
2006-06-05 04:14:51 +08:00
|
|
|
|
|
|
|
\param key The name of the variable to remove
|
|
|
|
\param mode the scope to search in. All scopes are searched if unset
|
2005-09-26 22:47:03 +08:00
|
|
|
*/
|
2006-06-05 04:14:51 +08:00
|
|
|
int env_exist( const wchar_t *key, int mode );
|
2005-09-26 22:47:03 +08:00
|
|
|
|
2005-09-20 21:26:39 +08:00
|
|
|
/**
|
|
|
|
Remove environemnt variable
|
|
|
|
|
|
|
|
\param key The name of the variable to remove
|
2006-06-05 04:14:51 +08:00
|
|
|
\param mode should be ENV_USER if this is a remove request from the user, 0 otherwise. If this is a user request, read-only variables can not be removed. The mode may also specify the scope of the variable that should be erased.
|
|
|
|
|
|
|
|
\return zero if the variable existed, and non-zero if the variable did not exist
|
2005-09-20 21:26:39 +08:00
|
|
|
*/
|
2006-06-05 04:14:51 +08:00
|
|
|
int env_remove( const wchar_t *key, int mode );
|
2005-09-20 21:26:39 +08:00
|
|
|
|
|
|
|
/**
|
|
|
|
Push the variable stack. Used for implementing local variables for functions and for-loops.
|
|
|
|
*/
|
|
|
|
void env_push( int new_scope );
|
|
|
|
|
|
|
|
/**
|
|
|
|
Pop the variable stack. Used for implementing local variables for functions and for-loops.
|
|
|
|
*/
|
|
|
|
void env_pop();
|
|
|
|
|
|
|
|
/**
|
|
|
|
Returns an array containing all exported variables in a format suitable for execv.
|
|
|
|
*/
|
2005-09-23 04:16:52 +08:00
|
|
|
char **env_export_arr( int recalc );
|
2005-09-20 21:26:39 +08:00
|
|
|
|
|
|
|
/**
|
|
|
|
Insert all variable names into l. These are not copies of the strings and should not be freed after use.
|
|
|
|
*/
|
|
|
|
void env_get_names( array_list_t *l, int flags );
|
2005-10-04 23:11:39 +08:00
|
|
|
|
2008-01-17 06:07:38 +08:00
|
|
|
/**
|
|
|
|
Update the PWD variable
|
|
|
|
directory
|
|
|
|
*/
|
|
|
|
int env_set_pwd();
|
|
|
|
|
|
|
|
|
2005-10-04 23:11:39 +08:00
|
|
|
#endif
|