X-Git-Url: http://git.archive.openwrt.org/?p=project%2Fuclient.git;a=blobdiff_plain;f=uclient.c;h=2ac052d8bbf5529063b1f3da4da4852d33a56f55;hp=4c85e800cd30de398c15ed2104fc20b24b4e4495;hb=438ebb9ce2bfd5cf3ab940667029c27346dc5160;hpb=8bbe2130890db78856bb5731fa3e16a71d549bfe diff --git a/uclient.c b/uclient.c index 4c85e80..2ac052d 100644 --- a/uclient.c +++ b/uclient.c @@ -1,3 +1,20 @@ +/* + * 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" @@ -95,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; @@ -115,27 +132,30 @@ struct uclient *uclient_new(const char *url_str, const struct uclient_cb *cb) return cl; } -int uclient_connect_url(struct uclient *cl, const char *url_str) +int uclient_set_url(struct uclient *cl, const char *url_str, const char *auth_str) { - struct uclient_url *url = cl->url; const struct uclient_backend *backend = cl->backend; + struct uclient_url *url = cl->url; + + url = uclient_get_url(url_str, auth_str); + if (!url) + return -1; - if (url_str) { - url = uclient_get_url(url_str, NULL); - if (!url) - return -1; + if (url->backend != cl->backend) + return -1; - if (url->backend != cl->backend) - return -1; + free(cl->url); + cl->url = url; - free(cl->url); - cl->url = url; + if (backend->update_url) + backend->update_url(cl); - if (backend->update_url) - backend->update_url(cl); - } + return 0; +} - return backend->connect(cl); +int uclient_connect(struct uclient *cl) +{ + return cl->backend->connect(cl); } void uclient_free(struct uclient *cl) @@ -178,8 +198,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); } @@ -190,18 +210,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; @@ -210,7 +230,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); }