aboutsummaryrefslogtreecommitdiff
path: root/src/variable.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/variable.c')
-rw-r--r--src/variable.c45
1 files changed, 45 insertions, 0 deletions
diff --git a/src/variable.c b/src/variable.c
index c8ab8e6..6403c1a 100644
--- a/src/variable.c
+++ b/src/variable.c
@@ -311,12 +311,57 @@ symtab_free(struct symtab *st)
static struct symtab **symtabv;
static size_t symtabc;
static pthread_mutex_t symtab_mtx = PTHREAD_MUTEX_INITIALIZER;
+static struct symtab *global_symtab;
+static pthread_mutex_t global_mtx = PTHREAD_MUTEX_INITIALIZER;
+
+VCL_VOID
+vmod_global_set(VARIABLE_CTX ctx, VCL_STRING name, VCL_STRING value)
+{
+ struct variable *var;
+ int inst;
+
+ AZ(pthread_mutex_lock(&global_mtx));
+ if (!global_symtab)
+ global_symtab = symtab_create();
+ if (!value)
+ symtab_remove(global_symtab, name);
+ else {
+ inst = 1;
+ var = symtab_lookup_or_install(global_symtab, name, &inst);
+ if (!inst && var->type == variable_string)
+ free(var->v.s);
+ var->type = variable_string;
+ var->v.s = strdup(value);
+ AN(var->v.s);
+ }
+ AZ(pthread_mutex_unlock(&global_mtx));
+}
+
+VCL_STRING
+vmod_global_get(VARIABLE_CTX ctx, VCL_STRING name)
+{
+ char *s;
+ struct variable *var;
+
+ AZ(pthread_mutex_lock(&global_mtx));
+ if (!global_symtab)
+ global_symtab = symtab_create();
+ var = symtab_lookup_or_install(global_symtab, name, NULL);
+ if (var && var->type == variable_string) {
+ s = WS_Copy(ctx->ws, var->v.s, -1);
+ AN(s);
+ } else
+ s = NULL;
+ AZ(pthread_mutex_unlock(&global_mtx));
+ return s;
+}
+
static struct symtab *
get_symtab(VARIABLE_CTX ctx)
{
struct symtab *st;
int fd = ctx->req->sp->fd;
AZ(pthread_mutex_lock(&symtab_mtx));

Return to:

Send suggestions and report system problems to the System administrator.