|
62 | 62 |
|
63 | 63 | static pthread_mutex_t dupes_mutex = PTHREAD_MUTEX_INITIALIZER; |
64 | 64 |
|
65 | | -char *urls[2] = { "https://cdn.download.clearlinux.org/debuginfo/", |
66 | | - "https://cdn-alt.download.clearlinux.org/debuginfo/" }; |
| 65 | +char *urls_default[] = { "https://cdn.download.clearlinux.org/debuginfo/", |
| 66 | + "https://cdn-alt.download.clearlinux.org/debuginfo/" }; |
| 67 | +int urls_size = 2; |
67 | 68 | int urlcounter = 1; |
| 69 | +char **urls = urls_default; |
68 | 70 |
|
69 | 71 | static NcHashmap *hash = NULL; |
70 | 72 |
|
@@ -97,6 +99,40 @@ static int avoid_dupes(const char *url) |
97 | 99 | return retval; |
98 | 100 | } |
99 | 101 |
|
| 102 | +/* |
| 103 | + * Read URLs from environment variable, space separated |
| 104 | + */ |
| 105 | +int configure_urls(void) |
| 106 | +{ |
| 107 | + const char *env_var = getenv("CLR_DEBUGINFO_URLS"); |
| 108 | + const char *token = env_var; |
| 109 | + int count = 0; |
| 110 | + char **urls_new = NULL; |
| 111 | + if (env_var) while (1) { |
| 112 | + int token_len = strcspn(token, " \t\n"); |
| 113 | + if (token_len) { |
| 114 | + count++; |
| 115 | + urls_new = realloc(urls_new, count * sizeof(char*)); |
| 116 | + if (!urls_new) { perror("realloc()"); exit(EXIT_FAILURE); } |
| 117 | + |
| 118 | + char *url = calloc(token_len+1, sizeof(char)); |
| 119 | + if (!url) { perror("calloc()"); exit(EXIT_FAILURE); } |
| 120 | + |
| 121 | + urls_new[count-1] = strncpy(url, token, token_len); |
| 122 | + token += token_len; |
| 123 | + } |
| 124 | + if (*token == '\0') break; |
| 125 | + token++; |
| 126 | + } |
| 127 | + if (count) { |
| 128 | + // Abandon defaults |
| 129 | + urls = urls_new; |
| 130 | + urls_size = count; |
| 131 | + urlcounter = 0; |
| 132 | + } |
| 133 | + return count; |
| 134 | +} |
| 135 | + |
100 | 136 | #ifdef HAVE_ATOMIC_SUPPORT |
101 | 137 |
|
102 | 138 | static atomic_int current_connection_count = 0; |
@@ -365,7 +401,7 @@ static void *server_thread(void *arg) |
365 | 401 | goto thread_end; |
366 | 402 | } |
367 | 403 | url = NULL; |
368 | | - if (asprintf(&url, "%s%s%s.tar", urls[urlcounter % 2], prefix, path) < 0) { |
| 404 | + if (asprintf(&url, "%s%s%s.tar", urls[urlcounter % urls_size], prefix, path) < 0) { |
369 | 405 | goto thread_end; |
370 | 406 | } |
371 | 407 |
|
@@ -416,6 +452,15 @@ int main(__nc_unused__ int argc, __nc_unused__ char **argv) |
416 | 452 | struct passwd *passwdentry; |
417 | 453 | const char *required_paths[] = { "/var/cache/debuginfo/lib", "/var/cache/debuginfo/src" }; |
418 | 454 |
|
| 455 | + if (configure_urls()) { |
| 456 | + fprintf(stderr, "Using urls from environment\n"); |
| 457 | + } else { |
| 458 | + fprintf(stderr, "Using compiled default urls\n"); |
| 459 | + } |
| 460 | + for (int i=0; i<urls_size; i++) { |
| 461 | + fprintf(stderr, "url: %s\n", urls[i]); |
| 462 | + } |
| 463 | + |
419 | 464 | umask(0); |
420 | 465 | passwdentry = getpwnam("dbginfo"); |
421 | 466 | if (passwdentry) { |
|
0 commit comments