/* ** Look for cached information for this news server ** We store the information in a URL Tree so that we can have multiple ** servers stored simultanously */ PRIVATE HTNewsCache * HTNewsCache_find (HTRequest * request, const char * url) { HTUTree * tree = NULL; if (request && url) { char * newshost = NULL; HTNewsCache * element = NULL; if (!strncasecomp(url, "news:", 5)) { HTUserProfile * up = HTRequest_userProfile(request); StrAllocCopy(newshost, HTUserProfile_news(up)); } else if (!strncasecomp(url, "nntp:", 5)) { newshost = HTParse(url, "", PARSE_HOST); } /* If we have a news server then continue to find a URL tree */ if (newshost) { char * colon = strchr(newshost, ':'); int port = NEWS_PORT; if (colon ) { *(colon++) = '\0'; /* Chop off port number */ port = atoi(colon); } tree = HTUTree_find(NEWS_TREE, newshost, port); HT_FREE(newshost); if (!tree) { HTTRACE(PROT_TRACE, "News Cache.. No information for `%s\'\n" _ url); return NULL; } /* Find a cache element (if any) */ element = (HTNewsCache *) HTUTree_findNode(tree, "", "/"); return element; } } return NULL; }
int HTUTree_find_tcl (ClientData clientData, Tcl_Interp *interp, int argc, char **argv) { if (argc == 4) { const char * root = argv[1]; const char * host = argv[2]; int port; if ( root && host && (Tcl_GetInt(interp, argv[3], &port) == TCL_OK)) { char *keyname; HTUTree *utree = HTUTree_find(root, host, port); Tcl_HashEntry *entryPtr =CreateNewEntry(&HTableUTree, "UTree", &keyname); Tcl_SetHashValue(entryPtr, utree); Tcl_AppendResult(interp, keyname, NULL); return TCL_OK; } Tcl_AppendResult(interp, bad_vars, NULL); return TCL_ERROR; } Tcl_AppendResult(interp, err_string, NULL); return TCL_ERROR; }
/* ** Find AA Element ** --------------- ** Seaches the set of authentication information bases for a match ** In order to find an anode we do the following: ** ** 1) Find the right auth base ** 2) See if there is a realm match ** 3) See if there is a template match for URL ** ** Return the node found else NULL which means that we don't have any ** authentication information to hook on to this request or response */ PRIVATE HTAAElement * HTAA_findElement (BOOL proxy_access, const char * realm, const char * url) { HTUTree * tree; if (!url) { HTTRACE(AUTH_TRACE, "Auth Engine. Bad argument\n"); return NULL; } HTTRACE(AUTH_TRACE, "Auth Engine. Looking up `%s'\n" _ url); /* Find an existing URL Tree for this URL (if any) */ { char * host = HTParse(url, "", PARSE_HOST); char * colon = strchr(host, ':'); int port = DEFAULT_PORT; if (colon ) { *(colon++) = '\0'; /* Chop off port number */ port = atoi(colon); } tree = HTUTree_find(proxy_access ? AA_PROXY_TREE : AA_TREE, host,port); HT_FREE(host); if (!tree) { HTTRACE(AUTH_TRACE, "Auth Engine. No information\n"); return NULL; } } /* Find a matching AA element (if any) */ { char * path = HTParse(url, "", PARSE_PATH | PARSE_PUNCTUATION); HTAAElement *element = (HTAAElement*)HTUTree_findNode(tree,realm,path); HT_FREE(path); return element; } return NULL; }