summaryrefslogtreecommitdiff
path: root/desktop/loginlist.c
diff options
context:
space:
mode:
authorJohn Mark Bell <jmb@netsurf-browser.org>2004-12-08 00:31:11 +0000
committerJohn Mark Bell <jmb@netsurf-browser.org>2004-12-08 00:31:11 +0000
commitd86553ef7e134f9b1e95ced30ff7476351cc94c3 (patch)
tree8702eb8ae3f2f052840175c8453470ad171acbf6 /desktop/loginlist.c
parente11c05d25701564b9d21b411057400a2ca3206b5 (diff)
downloadnetsurf-d86553ef7e134f9b1e95ced30ff7476351cc94c3.tar.gz
netsurf-d86553ef7e134f9b1e95ced30ff7476351cc94c3.tar.bz2
[project @ 2004-12-08 00:31:11 by jmb]
xfoo purge, reindent some sources. Loginlist is ugly, feel free to rewrite. svn path=/import/netsurf/; revision=1390
Diffstat (limited to 'desktop/loginlist.c')
-rw-r--r--desktop/loginlist.c291
1 files changed, 162 insertions, 129 deletions
diff --git a/desktop/loginlist.c b/desktop/loginlist.c
index 3161bbd11..3702953c6 100644
--- a/desktop/loginlist.c
+++ b/desktop/loginlist.c
@@ -28,154 +28,187 @@ static struct login *loginlist = &login;
/**
* Adds an item to the list of login details
*/
-void login_list_add(char *host, char* logindets) {
-
- struct login *nli = xcalloc(1, sizeof(*nli));
- char *temp;
- char *i;
- url_func_result res;
-
- res = url_host(host, &temp);
-
- assert(res == URL_FUNC_OK);
-
- /* Go back to the path base ie strip the document name
- * eg. http://www.blah.com/blah/test.htm becomes
- * http://www.blah.com/blah/
- * This does, however, mean that directories MUST have a '/' at the end
- */
- if (strlen(temp) < strlen(host)) {
-
- xfree(temp);
- temp = xstrdup(host);
- if (temp[strlen(temp)-1] != '/') {
- i = strrchr(temp, '/');
- temp[(i-temp)+1] = 0;
- }
- }
-
- nli->host = xstrdup(temp);
- nli->logindetails = xstrdup(logindets);
- nli->prev = loginlist->prev;
- nli->next = loginlist;
- loginlist->prev->next = nli;
- loginlist->prev = nli;
-
- LOG(("Adding %s", temp));
-#ifndef NDEBUG
- login_list_dump();
-#endif
- xfree(temp);
+void login_list_add(char *host, char* logindets)
+{
+ struct login *nli;
+ char *temp;
+ char *i;
+ url_func_result res;
+
+ nli = calloc(1, sizeof(*nli));
+ if (!nli) {
+ warn_user("NoMemory", 0);
+ return;
+ }
+
+ res = url_host(host, &temp);
+
+ if (res != URL_FUNC_OK) {
+ free(temp);
+ free(nli);
+ warn_user("NoMemory", 0);
+ return;
+ }
+
+ /* Go back to the path base ie strip the document name
+ * eg. http://www.blah.com/blah/test.htm becomes
+ * http://www.blah.com/blah/
+ * This does, however, mean that directories MUST have a '/' at the end
+ */
+ if (strlen(temp) < strlen(host)) {
+ free(temp);
+ temp = strdup(host);
+ if (!temp) {
+ free(nli);
+ warn_user("NoMemory", 0);
+ return;
+ }
+ if (temp[strlen(temp)-1] != '/') {
+ i = strrchr(temp, '/');
+ temp[(i-temp)+1] = 0;
+ }
+ }
+
+ nli->host = strdup(temp);
+ if (!nli->host) {
+ free(temp);
+ free(nli);
+ warn_user("NoMemory", 0);
+ return;
+ }
+ nli->logindetails = strdup(logindets);
+ if (!nli->logindetails) {
+ free(nli->host);
+ free(temp);
+ free(nli);
+ warn_user("NoMemory", 0);
+ return;
+ }
+ nli->prev = loginlist->prev;
+ nli->next = loginlist;
+ loginlist->prev->next = nli;
+ loginlist->prev = nli;
+
+ LOG(("Adding %s", temp));
+ #ifndef NDEBUG
+ login_list_dump();
+ #endif
+ free(temp);
}
/**
* Retrieves an element from the login list
*/
/** \todo Make the matching spec compliant (see RFC 2617) */
-struct login *login_list_get(char *url) {
-
- struct login *nli;
- char *temp, *host;
- char *i;
- int reached_scheme = 0;
- url_func_result res;
-
- if (url == NULL)
- return NULL;
-
- if ((strncasecmp(url, "http://", 7) != 0) &&
- (strncasecmp(url, "https://", 8) != 0))
- return NULL;
-
- res = url_host(url, &host);
- if (res != URL_FUNC_OK || strlen(host) == 0) return NULL;
-
- temp = xstrdup(url);
-
- /* Smallest thing to check for is the scheme + host name + trailing '/'
- * So make sure we've got that at least
- */
- if (strlen(host) > strlen(temp)) {
- xfree(temp);
- res = url_host(url, &temp);
- if (res != URL_FUNC_OK || strlen(temp) == 0) {
- xfree(host);
- return NULL;
- }
- }
- xfree(host);
-
- /* Work backwards through the path, directory at at time.
- * Finds the closest match.
- * eg. http://www.blah.com/moo/ matches the url
- * http://www.blah.com/moo/test/index.htm
- * This allows multiple realms (and login details) per host.
- * Only one set of login details per realm are allowed.
- */
- do {
-
- LOG(("%s, %d", temp, strlen(temp)));
-
- for (nli = loginlist->next; nli != loginlist &&
- (strcasecmp(nli->host, temp)!=0);
- nli = nli->next) ;
-
- if (nli != loginlist) {
- LOG(("Got %s", nli->host));
- xfree(temp);
- return nli;
- }
- else {
-
- if (temp[strlen(temp)-1] == '/') {
- temp[strlen(temp)-1] = 0;
- }
-
- i = strrchr(temp, '/');
-
- if (temp[(i-temp)-1] != '/') /* reached the scheme? */
- temp[(i-temp)+1] = 0;
- else {
- reached_scheme = 1;
- }
- }
- } while (reached_scheme == 0);
-
- xfree(temp);
- return NULL;
+struct login *login_list_get(char *url)
+{
+ struct login *nli;
+ char *temp, *host;
+ char *i;
+ int reached_scheme = 0;
+ url_func_result res;
+
+ if (url == NULL)
+ return NULL;
+
+ if ((strncasecmp(url, "http://", 7) != 0) &&
+ (strncasecmp(url, "https://", 8) != 0))
+ return NULL;
+
+ res = url_host(url, &host);
+ if (res != URL_FUNC_OK || strlen(host) == 0) return NULL;
+
+ temp = strdup(url);
+ if (!temp) {
+ warn_user("NoMemory", 0);
+ free(host);
+ return NULL;
+ }
+
+ /* Smallest thing to check for is the scheme + host name +
+ * trailing '/'
+ * So make sure we've got that at least
+ */
+ if (strlen(host) > strlen(temp)) {
+ free(temp);
+ res = url_host(url, &temp);
+ if (res != URL_FUNC_OK || strlen(temp) == 0) {
+ free(host);
+ return NULL;
+ }
+ }
+ free(host);
+
+ /* Work backwards through the path, directory at at time.
+ * Finds the closest match.
+ * eg. http://www.blah.com/moo/ matches the url
+ * http://www.blah.com/moo/test/index.htm
+ * This allows multiple realms (and login details) per host.
+ * Only one set of login details per realm are allowed.
+ */
+ do {
+ LOG(("%s, %d", temp, strlen(temp)));
+
+ for (nli = loginlist->next; nli != loginlist &&
+ (strcasecmp(nli->host, temp)!=0);
+ nli = nli->next)
+ /* do nothing */;
+
+ if (nli != loginlist) {
+ LOG(("Got %s", nli->host));
+ free(temp);
+ return nli;
+ }
+ else {
+ if (temp[strlen(temp)-1] == '/') {
+ temp[strlen(temp)-1] = 0;
+ }
+
+ i = strrchr(temp, '/');
+
+ if (temp[(i-temp)-1] != '/') /* reached the scheme? */
+ temp[(i-temp)+1] = 0;
+ else {
+ reached_scheme = 1;
+ }
+ }
+ } while (reached_scheme == 0);
+
+ free(temp);
+ return NULL;
}
/**
* Remove a realm's login details from the list
*/
-void login_list_remove(char *host) {
-
- struct login *nli = login_list_get(host);
-
- if (nli != NULL) {
- nli->prev->next = nli->next;
- nli->next->prev = nli->prev;
- xfree(nli->logindetails);
- xfree(nli->host);
- xfree(nli);
- }
-
- LOG(("Removing %s", host));
+void login_list_remove(char *host)
+{
+ struct login *nli = login_list_get(host);
+
+ if (nli != NULL) {
+ nli->prev->next = nli->next;
+ nli->next->prev = nli->prev;
+ free(nli->logindetails);
+ free(nli->host);
+ free(nli);
+ }
+
+ LOG(("Removing %s", host));
#ifndef NDEBUG
- login_list_dump();
+ login_list_dump();
#endif
}
/**
* Dumps the list of login details (base paths only)
*/
-void login_list_dump(void) {
-
- struct login *nli;
+void login_list_dump(void)
+{
+ struct login *nli;
- for (nli = loginlist->next; nli != loginlist; nli = nli->next) {
- LOG(("%s", nli->host));
- }
+ for (nli = loginlist->next; nli != loginlist; nli = nli->next) {
+ LOG(("%s", nli->host));
+ }
}
#endif