X-Git-Url: http://git.archive.openwrt.org/?p=project%2Fuclient.git;a=blobdiff_plain;f=uclient.c;h=71da9359b491a4053aea9ecfaa03a82df76bcc29;hp=4125dc238c42cac8056675c3e2eb248f4d090f8b;hb=25e44fc1e666fb333b3c53bcda90e44b0b74bf19;hpb=5f2e60972941c1ca1a6fa572b39e18cbc58137d9 diff --git a/uclient.c b/uclient.c index 4125dc2..71da935 100644 --- a/uclient.c +++ b/uclient.c @@ -3,7 +3,8 @@ #include "uclient-utils.h" #include "uclient-backend.h" -static struct uclient_url *uclient_get_url(const char *url_str) +struct uclient_url __hidden * +uclient_get_url(const char *url_str, const char *auth_str) { static const struct uclient_backend *backends[] = { &uclient_backend_http, @@ -13,7 +14,7 @@ static struct uclient_url *uclient_get_url(const char *url_str) const char * const *prefix = NULL; struct uclient_url *url; const char *location; - char *host_buf, *uri_buf, *next; + char *host_buf, *uri_buf, *auth_buf, *next; int i, host_len; for (i = 0; i < ARRAY_SIZE(backends); i++) { @@ -48,10 +49,12 @@ static struct uclient_url *uclient_get_url(const char *url_str) url = calloc_a(sizeof(*url), &host_buf, host_len + 1, - &uri_buf, strlen(location) + 1); + &uri_buf, strlen(location) + 1, + &auth_buf, auth_str ? strlen(auth_str) + 1 : 0); url->backend = backend; url->location = strcpy(uri_buf, location); + url->prefix = prefix - backend->prefix; url->host = strncpy(host_buf, url_str, host_len); @@ -66,6 +69,9 @@ static struct uclient_url *uclient_get_url(const char *url_str) url->auth = host_buf; } + if (!url->auth && auth_str) + url->auth = strcpy(auth_buf, auth_str); + /* Literal IPv6 address */ if (*url->host == '[') { url->host++; @@ -94,7 +100,7 @@ struct uclient *uclient_new(const char *url_str, const struct uclient_cb *cb) struct uclient *cl; struct uclient_url *url; - url = uclient_get_url(url_str); + url = uclient_get_url(url_str, NULL); if (!url) return NULL; @@ -115,7 +121,7 @@ int uclient_connect_url(struct uclient *cl, const char *url_str) const struct uclient_backend *backend = cl->backend; if (url_str) { - url = uclient_get_url(url_str); + url = uclient_get_url(url_str, NULL); if (!url) return -1; @@ -172,8 +178,8 @@ static void __uclient_backend_change_state(struct uloop_timeout *timeout) { struct uclient *cl = container_of(timeout, struct uclient, timeout); - if (cl->error && cl->cb->error) - cl->cb->error(cl); + if (cl->error_code && cl->cb->error) + cl->cb->error(cl, cl->error_code); else if (cl->eof && cl->cb->data_eof) cl->cb->data_eof(cl); } @@ -184,18 +190,18 @@ static void uclient_backend_change_state(struct uclient *cl) uloop_timeout_set(&cl->timeout, 1); } -void uclient_backend_set_error(struct uclient *cl) +void __hidden uclient_backend_set_error(struct uclient *cl, int code) { - if (cl->error) + if (cl->error_code) return; - cl->error = true; + cl->error_code = code; uclient_backend_change_state(cl); } void __hidden uclient_backend_set_eof(struct uclient *cl) { - if (cl->eof || cl->error) + if (cl->eof || cl->error_code) return; cl->eof = true; @@ -204,7 +210,7 @@ void __hidden uclient_backend_set_eof(struct uclient *cl) void __hidden uclient_backend_reset_state(struct uclient *cl) { - cl->error = false; cl->eof = false; + cl->error_code = 0; uloop_timeout_cancel(&cl->timeout); }