diff --git a/main/http.c b/main/http.c index 8def00163db229e25773c94ad75e90a4656cdc44..093ddf4d116f4564ed34b7227ee4b6f79472cf5f 100644 --- a/main/http.c +++ b/main/http.c @@ -131,7 +131,7 @@ struct http_uri_redirect { char target[0]; }; -static AST_LIST_HEAD_STATIC(uri_redirects, http_uri_redirect); +static AST_RWLIST_HEAD_STATIC(uri_redirects, http_uri_redirect); static char *ftype2mtype(const char *ftype, char *wkspace, int wkspacelen) { @@ -383,8 +383,8 @@ static struct ast_str *handle_uri(struct sockaddr_in *sin, char *uri, int *statu *cookies = NULL; ast_uri_decode(uri); - AST_LIST_LOCK(&uri_redirects); - AST_LIST_TRAVERSE(&uri_redirects, redirect, entry) { + AST_RWLIST_RDLOCK(&uri_redirects); + AST_RWLIST_TRAVERSE(&uri_redirects, redirect, entry) { if (!strcasecmp(uri, redirect->target)) { char buf[512]; snprintf(buf, sizeof(buf), "Location: %s\r\n", redirect->dest); @@ -395,7 +395,7 @@ static struct ast_str *handle_uri(struct sockaddr_in *sin, char *uri, int *statu break; } } - AST_LIST_UNLOCK(&uri_redirects); + AST_RWLIST_UNLOCK(&uri_redirects); if (redirect) goto cleanup; @@ -837,28 +837,28 @@ static void add_redirect(const char *value) strcpy(redirect->target, target); strcpy(redirect->dest, dest); - AST_LIST_LOCK(&uri_redirects); + AST_RWLIST_WRLOCK(&uri_redirects); target_len--; /* So we can compare directly with strlen() */ - if ( AST_LIST_EMPTY(&uri_redirects) - || strlen(AST_LIST_FIRST(&uri_redirects)->target) <= target_len ) { - AST_LIST_INSERT_HEAD(&uri_redirects, redirect, entry); - AST_LIST_UNLOCK(&uri_redirects); + if ( AST_RWLIST_EMPTY(&uri_redirects) + || strlen(AST_RWLIST_FIRST(&uri_redirects)->target) <= target_len ) { + AST_RWLIST_INSERT_HEAD(&uri_redirects, redirect, entry); + AST_RWLIST_UNLOCK(&uri_redirects); return; } - AST_LIST_TRAVERSE(&uri_redirects, cur, entry) { - if ( AST_LIST_NEXT(cur, entry) - && strlen(AST_LIST_NEXT(cur, entry)->target) <= target_len ) { - AST_LIST_INSERT_AFTER(&uri_redirects, cur, redirect, entry); - AST_LIST_UNLOCK(&uri_redirects); + AST_RWLIST_TRAVERSE(&uri_redirects, cur, entry) { + if ( AST_RWLIST_NEXT(cur, entry) + && strlen(AST_RWLIST_NEXT(cur, entry)->target) <= target_len ) { + AST_RWLIST_INSERT_AFTER(&uri_redirects, cur, redirect, entry); + AST_RWLIST_UNLOCK(&uri_redirects); return; } } - AST_LIST_INSERT_TAIL(&uri_redirects, redirect, entry); + AST_RWLIST_INSERT_TAIL(&uri_redirects, redirect, entry); - AST_LIST_UNLOCK(&uri_redirects); + AST_RWLIST_UNLOCK(&uri_redirects); } static int __ast_http_load(int reload) @@ -889,10 +889,10 @@ static int __ast_http_load(int reload) free(http_tls_cfg.cipher); http_tls_cfg.cipher = ast_strdup(""); - AST_LIST_LOCK(&uri_redirects); - while ((redirect = AST_LIST_REMOVE_HEAD(&uri_redirects, entry))) + AST_RWLIST_WRLOCK(&uri_redirects); + while ((redirect = AST_RWLIST_REMOVE_HEAD(&uri_redirects, entry))) free(redirect); - AST_LIST_UNLOCK(&uri_redirects); + AST_RWLIST_UNLOCK(&uri_redirects); cfg = ast_config_load("http.conf"); if (cfg) { @@ -989,12 +989,12 @@ static int handle_show_http(int fd, int argc, char *argv[]) AST_RWLIST_UNLOCK(&uris); ast_cli(fd, "\nEnabled Redirects:\n"); - AST_LIST_LOCK(&uri_redirects); - AST_LIST_TRAVERSE(&uri_redirects, redirect, entry) + AST_RWLIST_RDLOCK(&uri_redirects); + AST_RWLIST_TRAVERSE(&uri_redirects, redirect, entry) ast_cli(fd, " %s => %s\n", redirect->target, redirect->dest); - if (AST_LIST_EMPTY(&uri_redirects)) + if (AST_RWLIST_EMPTY(&uri_redirects)) ast_cli(fd, " None.\n"); - AST_LIST_UNLOCK(&uri_redirects); + AST_RWLIST_UNLOCK(&uri_redirects); return RESULT_SUCCESS; }