X-Git-Url: http://git.archive.openwrt.org/?p=project%2Fuclient.git;a=blobdiff_plain;f=uclient.c;h=2e3d3ae4e53e54f9acf91106ce4c6650f47bab18;hp=e7213a1002ecd7b1914104ad74d7fb294239338e;hb=4a3a8cb176aa932ed4bc88354fad76d91764c65f;hpb=f619ebe9d3343867bc8a8d5e98e6b81e645129e5 diff --git a/uclient.c b/uclient.c index e7213a1..2e3d3ae 100644 --- a/uclient.c +++ b/uclient.c @@ -1,9 +1,26 @@ +/* + * uclient - ustream based protocol client library + * + * Copyright (C) 2014 Felix Fietkau + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ #include #include "uclient.h" #include "uclient-utils.h" #include "uclient-backend.h" -struct uclient_url * __hidden +struct uclient_url __hidden * uclient_get_url(const char *url_str, const char *auth_str) { static const struct uclient_backend *backends[] = { @@ -54,6 +71,7 @@ uclient_get_url(const char *url_str, const char *auth_str) url->backend = backend; url->location = strcpy(uri_buf, location); + url->prefix = prefix - backend->prefix; url->host = strncpy(host_buf, url_str, host_len); @@ -94,12 +112,12 @@ free: return NULL; } -struct uclient *uclient_new(const char *url_str, const struct uclient_cb *cb) +struct uclient *uclient_new(const char *url_str, const char *auth_str, const struct uclient_cb *cb) { struct uclient *cl; struct uclient_url *url; - url = uclient_get_url(url_str, NULL); + url = uclient_get_url(url_str, auth_str); if (!url) return NULL; @@ -177,8 +195,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); } @@ -189,18 +207,18 @@ static void uclient_backend_change_state(struct uclient *cl) uloop_timeout_set(&cl->timeout, 1); } -void __hidden 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; @@ -209,7 +227,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); }