X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=util%2Fres.c;h=89ee5c6011d199ca1dc65b197033c17c209876ef;hb=cd3f39bbae63668b8806ed205132da166e73102f;hp=57c1d093994364909534cc1c6110c2bc069620c3;hpb=f6999bc6543f9799eae0b595e2d7c7e3806cf119;p=idzebra-moved-to-github.git diff --git a/util/res.c b/util/res.c index 57c1d09..89ee5c6 100644 --- a/util/res.c +++ b/util/res.c @@ -1,5 +1,5 @@ -/* $Id: res.c,v 1.32 2002-09-09 09:35:48 adam Exp $ - Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002 +/* $Id: res.c,v 1.37 2004-07-26 13:59:25 adam Exp $ + Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002,2003,2004 Index Data Aps This file is part of the Zebra server. @@ -20,7 +20,6 @@ Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - #include #include #include @@ -45,6 +44,7 @@ struct res_struct { char *name; int init; Res def_res; + Res over_res; }; static struct res_entry *add_entry (Res r) @@ -64,6 +64,75 @@ static struct res_entry *add_entry (Res r) return resp; } +static char *xstrdup_env(const char *src) +{ + int i = 0; + int j = 0; + char *dst; + int env_strlen = 0; + + while (src[i]) + { + if (src[i] == '$' && src[i+1] == '{') + { + char envname[128]; + char *env_val; + int k = 0; + i = i + 2; + while (k < 127 && src[i] && !strchr(":}\n\r\f", src[i])) + envname[k++] = src[i++]; + envname[k] = '\0'; + + env_val = getenv(envname); + if (env_val) + env_strlen += 1 + strlen(env_val); + else + env_strlen++; + while (src[i] && !strchr("}\n\r\f", src[i])) + i++; + if (src[i] == '}') + i++; + } + else + i++; + } + dst = xmalloc(1 + env_strlen + i); + i = 0; + while (src[i]) + { + if (src[i] == '$' && src[i+1] == '{') + { + char envname[128]; + char *env_val; + int k = 0; + i = i + 2; + while(k < 127 && src[i] && !strchr(":}\n\r\f", src[i])) + envname[k++] = src[i++]; + envname[k] = '\0'; + env_val = getenv(envname); + if (env_val) + { + strcpy(dst+j, env_val); + j += strlen(env_val); + } + else if (src[i] == ':' && src[i+1] == '-') + { + i = i + 2; + while (src[i] && !strchr("}\n\r\f", src[i])) + dst[j++] = src[i++]; + } + while (src[i] && !strchr("}\n\r\f", src[i])) + i++; + if (src[i] == '}') + i++; + } + else + dst[j++] = src[i++]; + } + dst[j] = '\0'; + return dst; +} + static void reread (Res r) { struct res_entry *resp; @@ -76,7 +145,8 @@ static void reread (Res r) assert (r); r->init = 1; - val_buf = (char*) xmalloc (val_max); + if (!r->name) + return; fr = fopen (r->name, "r"); if (!fr) @@ -84,6 +154,7 @@ static void reread (Res r) logf (LOG_WARN|LOG_ERRNO, "Cannot open `%s'", r->name); return ; } + val_buf = (char*) xmalloc (val_max); while (1) { line = fgets (fr_buf, sizeof(fr_buf)-1, fr); @@ -134,9 +205,8 @@ static void reread (Res r) (val_buf[val_size-1] == ' ' || val_buf[val_size-1] == '\t')) val_size--; - val_buf[val_size++] = '\0'; - resp->value = (char*) xmalloc (val_size); - strcpy (resp->value, val_buf); + val_buf[val_size] = '\0'; + resp->value = xstrdup_env(val_buf); logf (LOG_DEBUG, "(name=%s,value=%s)", resp->name, resp->value); break; @@ -146,8 +216,8 @@ static void reread (Res r) line = fgets (fr_buf, sizeof(fr_buf)-1, fr); if (!line) { - resp->value = (char*) xmalloc (val_size); - strcpy (resp->value, val_buf); + val_buf[val_size] = '\0'; + resp->value = xstrdup_env(val_buf); break; } no = 0; @@ -172,23 +242,31 @@ static void reread (Res r) fclose (fr); } -Res res_open (const char *name, Res def_res) +Res res_open (const char *name, Res def_res, Res over_res) { Res r; + + if (name) + { #ifdef WIN32 - if (access (name, 4)) + if (access (name, 4)) #else - if (access (name, R_OK)) + if (access (name, R_OK)) #endif - { - logf (LOG_WARN|LOG_ERRNO, "Cannot open `%s'", name); - return 0; + { + logf (LOG_WARN|LOG_ERRNO, "Cannot open `%s'", name); + return 0; + } } r = (Res) xmalloc (sizeof(*r)); r->init = 0; r->first = r->last = NULL; - r->name = xstrdup (name); + if (name) + r->name = xstrdup (name); + else + r->name=0; r->def_res = def_res; + r->over_res = over_res; return r; } @@ -213,12 +291,40 @@ void res_close (Res r) xfree (r); } -char *res_get (Res r, const char *name) +const char *res_get_prefix (Res r, const char *name, const char *prefix, + const char *def) +{ + const char *v = 0;; + if (prefix) + { + char rname[128]; + + if (strlen(name) + strlen(prefix) >= (sizeof(rname)-2)) + return 0; + strcpy(rname, prefix); + strcat(rname, "."); + strcat(rname, name); + v = res_get(r, rname); + } + if (!v) + v = res_get(r, name); + if (!v) + v = def; + return v; +} + +const char *res_get (Res r, const char *name) { struct res_entry *re; + const char *v; if (!r) return 0; + + v = res_get(r->over_res, name); + if (v) + return v; + if (!r->init) reread (r); for (re = r->first; re; re=re->next) @@ -228,9 +334,9 @@ char *res_get (Res r, const char *name) return res_get (r->def_res, name); } -char *res_get_def (Res r, const char *name, char *def) +const char *res_get_def (Res r, const char *name, const char *def) { - char *t; + const char *t; if (!(t = res_get (r, name))) { @@ -252,7 +358,7 @@ int res_get_match (Res r, const char *name, const char *value, const char *s) return 0; } -void res_put (Res r, const char *name, const char *value) +void res_set (Res r, const char *name, const char *value) { struct res_entry *re; assert (r); @@ -263,12 +369,12 @@ void res_put (Res r, const char *name, const char *value) if (re->value && !yaz_matchstr (re->name, name)) { xfree (re->value); - re->value = xstrdup (value); + re->value = xstrdup_env (value); return; } re = add_entry (r); re->name = xstrdup (name); - re->value = xstrdup (value); + re->value = xstrdup_env (value); } int res_trav (Res r, const char *prefix, void *p, @@ -305,6 +411,8 @@ int res_write (Res r) assert (r); if (!r->init) reread (r); + if (!r->name) + return 0; /* ok, this was not from a file */ fr = fopen (r->name, "w"); if (!fr) { @@ -347,5 +455,3 @@ int res_write (Res r) return 0; } - -