diff options
Diffstat (limited to 'src/variable.c')
-rw-r--r-- | src/variable.c | 45 |
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)); |