summaryrefslogtreecommitdiffabout
Unidiff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--cgit.c10
-rw-r--r--cgit.h2
-rw-r--r--shared.c71
3 files changed, 78 insertions, 5 deletions
diff --git a/cgit.c b/cgit.c
index ab25b6a..fde0757 100644
--- a/cgit.c
+++ b/cgit.c
@@ -152,7 +152,7 @@ void config_cb(const char *name, const char *value)
152 else if (!strcmp(name, "cache-size")) 152 else if (!strcmp(name, "cache-size"))
153 ctx.cfg.cache_size = atoi(value); 153 ctx.cfg.cache_size = atoi(value);
154 else if (!strcmp(name, "cache-root")) 154 else if (!strcmp(name, "cache-root"))
155 ctx.cfg.cache_root = xstrdup(value); 155 ctx.cfg.cache_root = xstrdup(expand_macros(value));
156 else if (!strcmp(name, "cache-root-ttl")) 156 else if (!strcmp(name, "cache-root-ttl"))
157 ctx.cfg.cache_root_ttl = atoi(value); 157 ctx.cfg.cache_root_ttl = atoi(value);
158 else if (!strcmp(name, "cache-repo-ttl")) 158 else if (!strcmp(name, "cache-repo-ttl"))
@@ -183,9 +183,9 @@ void config_cb(const char *name, const char *value)
183 ctx.cfg.max_commit_count = atoi(value); 183 ctx.cfg.max_commit_count = atoi(value);
184 else if (!strcmp(name, "scan-path")) 184 else if (!strcmp(name, "scan-path"))
185 if (!ctx.cfg.nocache && ctx.cfg.cache_size) 185 if (!ctx.cfg.nocache && ctx.cfg.cache_size)
186 process_cached_repolist(value); 186 process_cached_repolist(expand_macros(value));
187 else 187 else
188 scan_tree(value, repo_config); 188 scan_tree(expand_macros(value), repo_config);
189 else if (!strcmp(name, "source-filter")) 189 else if (!strcmp(name, "source-filter"))
190 ctx.cfg.source_filter = new_filter(value, 1); 190 ctx.cfg.source_filter = new_filter(value, 1);
191 else if (!strcmp(name, "summary-log")) 191 else if (!strcmp(name, "summary-log"))
@@ -209,7 +209,7 @@ void config_cb(const char *name, const char *value)
209 else if (!prefixcmp(name, "mimetype.")) 209 else if (!prefixcmp(name, "mimetype."))
210 add_mimetype(name + 9, value); 210 add_mimetype(name + 9, value);
211 else if (!strcmp(name, "include")) 211 else if (!strcmp(name, "include"))
212 parse_configfile(value, config_cb); 212 parse_configfile(expand_macros(value), config_cb);
213} 213}
214 214
215static void querystring_cb(const char *name, const char *value) 215static void querystring_cb(const char *name, const char *value)
@@ -705,7 +705,7 @@ int main(int argc, const char **argv)
705 cgit_repolist.repos = NULL; 705 cgit_repolist.repos = NULL;
706 706
707 cgit_parse_args(argc, argv); 707 cgit_parse_args(argc, argv);
708 parse_configfile(ctx.env.cgit_config, config_cb); 708 parse_configfile(expand_macros(ctx.env.cgit_config), config_cb);
709 ctx.repo = NULL; 709 ctx.repo = NULL;
710 http_parse_querystring(ctx.qry.raw, querystring_cb); 710 http_parse_querystring(ctx.qry.raw, querystring_cb);
711 711
diff --git a/cgit.h b/cgit.h
index 2b28d63..2bf6ab0 100644
--- a/cgit.h
+++ b/cgit.h
@@ -302,4 +302,6 @@ extern int cgit_close_filter(struct cgit_filter *filter);
302 302
303extern int readfile(const char *path, char **buf, size_t *size); 303extern int readfile(const char *path, char **buf, size_t *size);
304 304
305extern char *expand_macros(const char *txt);
306
305#endif /* CGIT_H */ 307#endif /* CGIT_H */
diff --git a/shared.c b/shared.c
index 06f70bb..9f7d6a5 100644
--- a/shared.c
+++ b/shared.c
@@ -432,3 +432,74 @@ int readfile(const char *path, char **buf, size_t *size)
432 close(fd); 432 close(fd);
433 return (*size == st.st_size ? 0 : e); 433 return (*size == st.st_size ? 0 : e);
434} 434}
435
436int is_token_char(char c)
437{
438 return isalnum(c) || c == '_';
439}
440
441/* Replace name with getenv(name), return pointer to zero-terminating char
442 */
443char *expand_macro(char *name, int maxlength)
444{
445 char *value;
446 int len;
447
448 len = 0;
449 value = getenv(name);
450 if (value) {
451 len = strlen(value);
452 if (len > maxlength)
453 len = maxlength;
454 strncpy(name, value, len);
455 }
456 return name + len;
457}
458
459#define EXPBUFSIZE (1024 * 8)
460
461/* Replace all tokens prefixed by '$' in the specified text with the
462 * value of the named environment variable.
463 * NB: the return value is a static buffer, i.e. it must be strdup'd
464 * by the caller.
465 */
466char *expand_macros(const char *txt)
467{
468 static char result[EXPBUFSIZE];
469 char *p, *start;
470 int len;
471
472 p = result;
473 start = NULL;
474 while (p < result + EXPBUFSIZE - 1 && txt && *txt) {
475 *p = *txt;
476 if (start) {
477 if (!is_token_char(*txt)) {
478 if (p - start > 0) {
479 *p = '\0';
480 len = result + EXPBUFSIZE - start - 1;
481 p = expand_macro(start, len) - 1;
482 }
483 start = NULL;
484 txt--;
485 }
486 p++;
487 txt++;
488 continue;
489 }
490 if (*txt == '$') {
491 start = p;
492 txt++;
493 continue;
494 }
495 p++;
496 txt++;
497 }
498 *p = '\0';
499 if (start && p - start > 0) {
500 len = result + EXPBUFSIZE - start - 1;
501 p = expand_macro(start, len);
502 *p = '\0';
503 }
504 return result;
505}