-/*********************************************************************
- *
- * Function : create_url_spec
- *
- * Description : Creates a "url_spec" structure from a string.
- * When finished, free with unload_url().
- *
- * Parameters :
- * 1 : url = Target url_spec to be filled in. Must be
- * zeroed out before the call (e.g. using zalloc).
- * 2 : buf = Source pattern, null terminated. NOTE: The
- * contents of this buffer are destroyed by this
- * function. If this function succeeds, the
- * buffer is copied to url->spec. If this
- * function fails, the contents of the buffer
- * are lost forever.
- *
- * Returns : 0 => Ok, everything else is an error.
- *
- *********************************************************************/
-int create_url_spec(struct url_spec * url, char * buf)
-{
- char *p;
- struct url_spec tmp_url[1];
-
- /* paranoia - should never happen. */
- if ((url == NULL) || (buf == NULL))
- {
- return 1;
- }
-
- /* save a copy of the orignal specification */
- if ((url->spec = strdup(buf)) == NULL)
- {
- return 1;
- }
-
- if ((p = strchr(buf, '/')))
- {
- if (NULL == (url->path = strdup(p)))
- {
- freez(url->spec);
- return 1;
- }
- url->pathlen = strlen(url->path);
- *p = '\0';
- }
- else
- {
- url->path = NULL;
- url->pathlen = 0;
- }
-#ifdef REGEX
- if (url->path)
- {
- int errcode;
- char rebuf[BUFSIZ];
-
- if (NULL == (url->preg = zalloc(sizeof(*url->preg))))
- {
- freez(url->spec);
- freez(url->path);
- return 1;
- }
-
- sprintf(rebuf, "^(%s)", url->path);
-
- errcode = regcomp(url->preg, rebuf,
- (REG_EXTENDED|REG_NOSUB|REG_ICASE));
- if (errcode)
- {
- size_t errlen =
- regerror(errcode,
- url->preg, buf, sizeof(buf));
-
- buf[errlen] = '\0';
-
- log_error(LOG_LEVEL_ERROR, "error compiling %s: %s",
- url->spec, buf);
-
- freez(url->spec);
- freez(url->path);
- freez(url->preg);
-
- return 1;
- }
- }
-#endif
- if ((p = strchr(buf, ':')) == NULL)
- {
- url->port = 0;
- }
- else
- {
- *p++ = '\0';
- url->port = atoi(p);
- }
-
- if ((url->domain = strdup(buf)) == NULL)
- {
- freez(url->spec);
- freez(url->path);
-#ifdef REGEX
- freez(url->preg);
-#endif /* def REGEX */
- return 1;
- }
-
- /* split domain into components */
-
- *tmp_url = dsplit(url->domain);
- url->dbuf = tmp_url->dbuf;
- url->dcnt = tmp_url->dcnt;
- url->dvec = tmp_url->dvec;
- url->unanchored = tmp_url->unanchored;
-
- return 0; /* OK */
-}
-
-
-/*********************************************************************
- *
- * Function : free_url
- *
- * Description : Called from the "unloaders". Freez the url
- * structure elements.
- *
- * Parameters :
- * 1 : url = pointer to a url_spec structure.
- *
- * Returns : N/A
- *
- *********************************************************************/
-void free_url(struct url_spec *url)
-{
- if (url == NULL) return;
-
- freez(url->spec);
- freez(url->domain);
- freez(url->dbuf);
- freez(url->dvec);
- freez(url->path);
-#ifdef REGEX
- if (url->preg)
- {
- regfree(url->preg);
- freez(url->preg);
- }
-#endif
-
-}
-
-
-#ifdef ACL_FILES
-/*********************************************************************
- *
- * Function : unload_aclfile
- *
- * Description : Unloads an aclfile.
- *
- * Parameters :
- * 1 : f = the data structure associated with the aclfile.
- *
- * Returns : N/A
- *
- *********************************************************************/
-static void unload_aclfile(void *f)
-{
- struct access_control_list *b = (struct access_control_list *)f;
- if (b == NULL) return;
-
- unload_aclfile(b->next);
-
- freez(b);
-
-}
-#endif /* def ACL_FILES */
-
-
-#ifdef TRUST_FILES
-/*********************************************************************
- *
- * Function : unload_trustfile
- *
- * Description : Unloads a trustfile.
- *
- * Parameters :
- * 1 : f = the data structure associated with the trustfile.
- *
- * Returns : N/A
- *
- *********************************************************************/
-static void unload_trustfile(void *f)
-{
- struct block_spec *b = (struct block_spec *)f;
- if (b == NULL) return;
-
- unload_trustfile(b->next);
-
- free_url(b->url);
-
- freez(b);
-
-}
-#endif /* def TRUST_FILES */
-
-
-/*********************************************************************
- *
- * Function : unload_forwardfile
- *
- * Description : Unloads a forwardfile.
- *
- * Parameters :
- * 1 : f = the data structure associated with the forwardfile.
- *
- * Returns : N/A
- *
- *********************************************************************/
-static void unload_forwardfile(void *f)
-{
- struct forward_spec *b = (struct forward_spec *)f;
- if (b == NULL) return;
-
- unload_forwardfile(b->next);
-
- free_url(b->url);
-
- freez(b->gw->gateway_host);
- freez(b->gw->forward_host);
-
- freez(b);
-
-}
-
-
-#ifdef PCRS
-/*********************************************************************
- *
- * Function : unload_re_filterfile
- *
- * Description : Unload the re_filter list.
- *
- * Parameters :
- * 1 : f = the data structure associated with the filterfile.
- *
- * Returns : N/A
- *
- *********************************************************************/
-static void unload_re_filterfile(void *f)
-{
- pcrs_job *joblist;
- struct re_filterfile_spec *b = (struct re_filterfile_spec *)f;
-
- if (b == NULL) return;
-
- destroy_list(b->patterns);
-
- joblist = b->joblist;
- while ( NULL != (joblist = pcrs_free_job(joblist)) ) {}
-
- freez(b);
-
-}
-#endif /* def PCRS */
-
-