loaders.c
资源名称:ijb20.zip [点击查看]
上传用户:qunlip
上传日期:2007-01-04
资源大小:203k
文件大小:24k
源码类别:
代理服务器
开发平台:
Visual C++
- char *loaders_rcs = "$Id: loaders.c,v 1.24 1998/10/22 15:30:38 ACJC Exp $";
- /* Written and copyright 1997 Anonymous Coders and Junkbusters Corporation.
- * Distributed under the GNU General Public License; see the README file.
- * This code comes with NO WARRANTY. http://www.junkbusters.com/ht/en/gpl.html
- */
- #include <stdio.h>
- #include <stdlib.h>
- #include <sys/types.h>
- #include <string.h>
- #include <malloc.h>
- #include <errno.h>
- #include <sys/stat.h>
- #include <ctype.h>
- #ifndef _WIN32
- #include <unistd.h>
- #endif
- #ifdef REGEX
- #include <gnu_regex.h>
- #endif
- #include "jcc.h"
- /* sweep() is basically a mark and sweep garbage collector.
- * it is run (by the parent thread) every once in a while to reclaim memory.
- *
- * it uses a mark and sweep strategy:
- * 1) mark all files as inactive
- *
- * 2) check with each client:
- * if it is active, mark its files as active
- * if it is inactive, free its resources
- *
- * 3) free the resources of all of the files that
- * are still marked as inactive (and are obsolete).
- *
- * N.B. files that are not obsolete don't have an unloader defined.
- */
- void
- sweep()
- {
- struct file_list *fl, *nfl;
- struct client_state *csp, *ncsp;
- /* clear all of the file's active flags */
- for(fl = files->next; fl ; fl = fl->next) {
- fl->active = 0;
- }
- for(csp = clients; csp && (ncsp = csp->next) ; csp = csp->next) {
- if(ncsp->active) {
- /* mark this client's files as active */
- if(ncsp->alist) ncsp->alist->active = 1;
- if(ncsp->blist) ncsp->blist->active = 1;
- if(ncsp->clist) ncsp->clist->active = 1;
- if(ncsp->tlist) ncsp->tlist->active = 1;
- } else {
- /* this client one is not active,
- * release its resources
- */
- csp->next = ncsp->next;
- freez(ncsp->ip_addr_str);
- freez(ncsp->referrer);
- freez(ncsp->x_forwarded);
- freez(ncsp->ip_addr_str);
- freez(ncsp->iob->buf);
- free_http_request(ncsp->http);
- destroy_list(ncsp->headers);
- destroy_list(ncsp->cookie_list);
- freez(ncsp);
- }
- }
- for(fl = files; fl && (nfl = fl->next) ; fl = fl->next) {
- if(nfl->active == 0) {
- if(nfl->unloader) {
- fl->next = nfl->next;
- (nfl->unloader)(nfl->f);
- freez(nfl->proxy_args);
- freez(nfl);
- }
- }
- }
- }
- void
- unload_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
- }
- void
- unload_blockfile(struct block_spec *b)
- {
- if(b == NULL) return;
- unload_blockfile(b->next);
- unload_url(b->url);
- freez(b);
- }
- void
- unload_cookiefile(struct cookie_spec *b)
- {
- if(b == NULL) return;
- unload_cookiefile(b->next);
- unload_url(b->url);
- freez(b);
- }
- void
- unload_trustfile(struct block_spec *b)
- {
- if(b == NULL) return;
- unload_trustfile(b->next);
- unload_url(b->url);
- freez(b);
- }
- void
- unload_forwardfile(struct forward_spec *b)
- {
- if(b == NULL) return;
- unload_forwardfile(b->next);
- unload_url(b->url);
- freez(b->gw->gateway_host);
- freez(b->gw->forward_host);
- freez(b);
- }
- static struct file_list *current_blockfile;
- static struct file_list *current_cookiefile;
- static struct file_list *current_trustfile;
- static struct file_list *current_forwardfile;
- int
- load_blockfile(struct client_state *csp)
- {
- FILE *fp;
- struct block_spec *b, *bl;
- char buf[BUFSIZ], *p, *q;
- int port, reject;
- struct file_list *fs;
- static struct stat prev[1], curr[1];
- struct url_spec url[1];
- if(stat(blockfile, curr) < 0) {
- goto load_blockfile_error;
- }
- if(current_blockfile && (prev->st_mtime == curr->st_mtime)) {
- csp->blist = current_blockfile;
- return(0);
- }
- fs = (struct file_list *) zalloc(sizeof(*fs));
- bl = (struct block_spec *) zalloc(sizeof(*bl));
- if((fs == NULL) || (bl == NULL)) {
- goto load_blockfile_error;
- }
- fs->f = bl;
- fs->next = files->next;
- files->next = fs;
- if(csp) {
- csp->blist = fs;
- }
- *prev = *curr;
- if((fp = fopen(blockfile, "r")) == NULL) {
- goto load_blockfile_error;
- }
- p = url_encode(html_code_map, blockfile);
- sprintf(buf, "<h2>The file `%s' contains the following patterns</h2>n", p);
- freez(p);
- fs->proxy_args = strsav(fs->proxy_args, buf);
- fs->proxy_args = strsav(fs->proxy_args, "<pre>");
- while(fgets(buf, sizeof(buf), fp)) {
- if((p = url_encode(html_code_map, buf))) {
- fs->proxy_args = strsav(fs->proxy_args, p);
- }
- freez(p);
- fs->proxy_args = strsav(fs->proxy_args, "<br>");
- if((p = strpbrk(buf, "rn")) != NULL) {
- *p = ' ';
- }
- /* comments */
- if((p = strchr(buf, '#'))) *p = ' ';
- /* elide white-space */
- for(p = q = buf; *q ; q++) {
- if(!isspace(*q)) *p++ = *q;
- }
- *p = ' ';
- reject = 1;
- if(*buf == '~') {
- reject = 0;
- p = buf;
- q = p+1;
- while ((*p++ = *q++)) {
- /* nop */
- }
- }
- /* skip blank lines */
- if(*buf == ' ') continue;
- /* allocate a new node */
- if(((b = zalloc(sizeof(*b))) == NULL)
- #ifdef REGEX
- || ((b->url->preg = zalloc(sizeof(*b->url->preg))) == NULL)
- #endif
- ) {
- fclose(fp);
- goto load_blockfile_error;
- }
- /* add it to the list */
- b->next = bl->next;
- bl->next = b;
- /* save a copy of the orignal specification */
- if((b->url->spec = strdup(buf)) == NULL) {
- fclose(fp);
- goto load_blockfile_error;
- }
- b->reject = reject;
- if((p = strchr(buf, '/'))) {
- b->url->path = strdup(p);
- b->url->pathlen = strlen(b->url->path);
- *p = ' ';
- } else {
- b->url->path = NULL;
- b->url->pathlen = 0;
- }
- #ifdef REGEX
- if(b->url->path) {
- int errcode;
- char rebuf[BUFSIZ];
- sprintf(rebuf, "^(%s)", b->url->path);
- errcode = regcomp(b->url->preg, rebuf,
- (REG_EXTENDED|REG_NOSUB|REG_ICASE));
- if(errcode) {
- size_t errlen =
- regerror(errcode,
- b->url->preg, buf, sizeof(buf));
- buf[errlen] = ' ';
- fprintf(logfp,
- "%s: error compiling %s: %sn",
- prog, b->url->spec, buf);
- fclose(fp);
- goto load_blockfile_error;
- }
- } else {
- freez(b->url->preg);
- }
- #endif
- if((p = strchr(buf, ':')) == NULL) {
- port = 0;
- } else {
- *p++ = ' ';
- port = atoi(p);
- }
- b->url->port = port;
- if((b->url->domain = strdup(buf)) == NULL) {
- fclose(fp);
- goto load_blockfile_error;
- }
- /* split domain into components */
- *url = dsplit(b->url->domain);
- b->url->dbuf = url->dbuf;
- b->url->dcnt = url->dcnt;
- b->url->dvec = url->dvec;
- }
- fs->proxy_args = strsav(fs->proxy_args, "</pre>");
- fclose(fp);
- /* the old one is now obsolete */
- if(current_blockfile) {
- current_blockfile->unloader = unload_blockfile;
- }
- current_blockfile = fs;
- return(0);
- load_blockfile_error:
- fprintf(logfp, "%s: can't load blockfile '%s': ",
- prog, blockfile);
- fperror(logfp, "");
- return(-1);
- }
- int
- load_cookiefile(struct client_state *csp)
- {
- FILE *fp;
- struct cookie_spec *b, *bl;
- char buf[BUFSIZ], *p, *q;
- char *tmp_vec[BUFSIZ];
- int port, user_cookie, server_cookie;
- static struct stat prev[1], curr[1];
- static struct file_list *fs;
- struct url_spec url[1];
- if(stat(cookiefile, curr) < 0) {
- goto load_cookie_error;
- }
- if(current_cookiefile && (prev->st_mtime == curr->st_mtime)) {
- csp->clist = current_cookiefile;
- return(0);
- }
- fs = (struct file_list *) zalloc(sizeof(*fs));
- bl = (struct cookie_spec *) zalloc(sizeof(*bl));
- if((fs == NULL) || (bl == NULL)) {
- goto load_cookie_error;
- }
- fs->f = bl;
- fs->next = files->next;
- files->next = fs;
- if(csp) {
- csp->clist = fs;
- }
- *prev = *curr;
- if((fp = fopen(cookiefile, "r")) == NULL) {
- goto load_cookie_error;
- }
- p = url_encode(html_code_map, cookiefile);
- sprintf(buf, "<h2>The file `%s' contains the following patterns</h2>n", p);
- freez(p);
- fs->proxy_args = strsav(fs->proxy_args, buf);
- fs->proxy_args = strsav(fs->proxy_args, "<pre>");
- while(fgets(buf, sizeof(buf), fp)) {
- if((p = url_encode(html_code_map, buf))) {
- fs->proxy_args = strsav(fs->proxy_args, p);
- }
- freez(p);
- fs->proxy_args = strsav(fs->proxy_args, "<br>");
- if((p = strpbrk(buf, "rn")) != NULL) {
- *p = ' ';
- }
- /* comments */
- if((p = strchr(buf, '#'))) *p = ' ';
- /* elide white-space */
- for(p = q = buf; *q ; q++) {
- if(!isspace(*q)) *p++ = *q;
- }
- *p = ' ';
- p = buf;
- switch((int)*p) {
- case '>':
- server_cookie = 0;
- user_cookie = 1;
- p++;
- break;
- case '<':
- server_cookie = 1;
- user_cookie = 0;
- p++;
- break;
- case '~':
- server_cookie = 0;
- user_cookie = 0;
- p++;
- break;
- default:
- server_cookie = 1;
- user_cookie = 1;
- break;
- }
- /* elide any of the "special" chars from the
- * front of the pattern
- */
- q = buf;
- if(p > q) while ((*q++ = *p++)) {
- /* nop */
- }
- /* skip blank lines */
- if(*buf == ' ') continue;
- /* allocate a new node */
- if(((b = zalloc(sizeof(*b))) == NULL)
- #ifdef REGEX
- || ((b->url->preg = zalloc(sizeof(*b->url->preg))) == NULL)
- #endif
- ) {
- fclose(fp);
- goto load_cookie_error;
- }
- /* add it to the list */
- b->next = bl->next;
- bl->next = b;
- /* save a copy of the orignal specification */
- if((b->url->spec = strdup(buf)) == NULL) {
- fclose(fp);
- goto load_cookie_error;
- }
- b->send_user_cookie = user_cookie;
- b->accept_server_cookie = server_cookie;
- if((p = strchr(buf, '/'))) {
- b->url->path = strdup(p);
- b->url->pathlen = strlen(b->url->path);
- *p = ' ';
- } else {
- b->url->path = NULL;
- b->url->pathlen = 0;
- }
- #ifdef REGEX
- if(b->url->path) {
- int errcode;
- char rebuf[BUFSIZ];
- sprintf(rebuf, "^(%s)", b->url->path);
- errcode = regcomp(b->url->preg, rebuf,
- (REG_EXTENDED|REG_NOSUB|REG_ICASE));
- if(errcode) {
- size_t errlen =
- regerror(errcode,
- b->url->preg, buf, sizeof(buf));
- buf[errlen] = ' ';
- fprintf(logfp,
- "%s: error compiling %s: %sn",
- prog, b->url->spec, buf);
- fclose(fp);
- goto load_cookie_error;
- }
- } else {
- freez(b->url->preg);
- }
- #endif
- if((p = strchr(buf, ':')) == NULL) {
- port = 0;
- } else {
- *p++ = ' ';
- port = atoi(p);
- }
- b->url->port = port;
- if((b->url->domain = strdup(buf)) == NULL) {
- fclose(fp);
- goto load_cookie_error;
- }
- /* split domain into components */
- *url = dsplit(b->url->domain, tmp_vec);
- b->url->dbuf = url->dbuf;
- b->url->dcnt = url->dcnt;
- b->url->dvec = url->dvec;
- }
- fs->proxy_args = strsav(fs->proxy_args, "</pre>");
- fclose(fp);
- /* the old one is now obsolete */
- if(current_cookiefile) {
- current_cookiefile->unloader = unload_cookiefile;
- }
- current_cookiefile = fs;
- return(0);
- load_cookie_error:
- fprintf(logfp, "%s: can't load cookiefile '%s': ",
- prog, cookiefile);
- fperror(logfp, "");
- return(-1);
- }
- int
- load_trustfile(struct client_state *csp)
- {
- FILE *fp;
- struct block_spec *b, *bl;
- struct url_spec **tl;
- char buf[BUFSIZ], *p, *q;
- int port, reject, trusted;
- struct file_list *fs;
- static struct stat prev[1], curr[1];
- struct url_spec url[1];
- if(stat(trustfile, curr) < 0) {
- goto load_trustfile_error;
- }
- if(current_trustfile && (prev->st_mtime == curr->st_mtime)) {
- csp->tlist = current_trustfile;
- return(0);
- }
- fs = (struct file_list *) zalloc(sizeof(*fs));
- bl = (struct block_spec *) zalloc(sizeof(*bl));
- if((fs == NULL) || (bl == NULL)) {
- goto load_trustfile_error;
- }
- fs->f = bl;
- fs->next = files->next;
- files->next = fs;
- if(csp) {
- csp->tlist = fs;
- }
- *prev = *curr;
- if((fp = fopen(trustfile, "r")) == NULL) {
- goto load_trustfile_error;
- }
- p = url_encode(html_code_map, trustfile);
- sprintf(buf, "<h2>The file `%s' contains the following patterns</h2>n", p);
- freez(p);
- fs->proxy_args = strsav(fs->proxy_args, buf);
- fs->proxy_args = strsav(fs->proxy_args, "<pre>");
- tl = trust_list;
- while(fgets(buf, sizeof(buf), fp)) {
- if((p = url_encode(html_code_map, buf))) {
- fs->proxy_args = strsav(fs->proxy_args, p);
- }
- freez(p);
- fs->proxy_args = strsav(fs->proxy_args, "<br>");
- if((p = strpbrk(buf, "rn")) != NULL) {
- *p = ' ';
- }
- /* comments */
- if((p = strchr(buf, '#'))) *p = ' ';
- /* elide white-space */
- for(p = q = buf; *q ; q++) {
- if(!isspace(*q)) *p++ = *q;
- }
- *p = ' ';
- trusted = 0;
- reject = 1;
- if(*buf == '+') {
- trusted = 1;
- *buf = '~';
- }
- if(*buf == '~') {
- reject = 0;
- p = buf;
- q = p+1;
- while ((*p++ = *q++)) {
- /* nop */
- }
- }
- /* skip blank lines */
- if(*buf == ' ') continue;
- /* allocate a new node */
- if(((b = zalloc(sizeof(*b))) == NULL)
- #ifdef REGEX
- || ((b->url->preg = zalloc(sizeof(*b->url->preg))) == NULL)
- #endif
- ) {
- fclose(fp);
- goto load_trustfile_error;
- }
- /* add it to the list */
- b->next = bl->next;
- bl->next = b;
- /* save a copy of the orignal specification */
- if((b->url->spec = strdup(buf)) == NULL) {
- fclose(fp);
- goto load_trustfile_error;
- }
- b->reject = reject;
- if((p = strchr(buf, '/'))) {
- b->url->path = strdup(p);
- b->url->pathlen = strlen(b->url->path);
- *p = ' ';
- } else {
- b->url->path = NULL;
- b->url->pathlen = 0;
- }
- #ifdef REGEX
- if(b->url->path) {
- int errcode;
- char rebuf[BUFSIZ];
- sprintf(rebuf, "^(%s)", b->url->path);
- errcode = regcomp(b->url->preg, rebuf,
- (REG_EXTENDED|REG_NOSUB|REG_ICASE));
- if(errcode) {
- size_t errlen =
- regerror(errcode,
- b->url->preg, buf, sizeof(buf));
- buf[errlen] = ' ';
- fprintf(logfp,
- "%s: error compiling %s: %sn",
- prog, b->url->spec, buf);
- fclose(fp);
- goto load_trustfile_error;
- }
- } else {
- freez(b->url->preg);
- }
- #endif
- if((p = strchr(buf, ':')) == NULL) {
- port = 0;
- } else {
- *p++ = ' ';
- port = atoi(p);
- }
- b->url->port = port;
- if((b->url->domain = strdup(buf)) == NULL) {
- fclose(fp);
- goto load_trustfile_error;
- }
- /* split domain into components */
- *url = dsplit(b->url->domain);
- b->url->dbuf = url->dbuf;
- b->url->dcnt = url->dcnt;
- b->url->dvec = url->dvec;
- /* save a pointer to URL's spec
- * in the list of trusted URL's, too
- */
- if(trusted) *tl++ = b->url;
- }
- fs->proxy_args = strsav(fs->proxy_args, "</pre>");
- *tl = NULL;
- fclose(fp);
- /* the old one is now obsolete */
- if(current_trustfile) {
- current_trustfile->unloader = unload_trustfile;
- }
- current_trustfile = fs;
- return(0);
- load_trustfile_error:
- fprintf(logfp, "%s: can't load trustfile '%s': ",
- prog, trustfile);
- fperror(logfp, "");
- return(-1);
- }
- int
- load_forwardfile(struct client_state *csp)
- {
- FILE *fp;
- struct forward_spec *b, *bl;
- char buf[BUFSIZ], *p, *q, *tmp;
- char *vec[4];
- int port, n, reject;
- struct file_list *fs;
- struct gateway *gw;
- static struct stat prev[1], curr[1];
- struct url_spec url[1];
- if(stat(forwardfile, curr) < 0) {
- goto load_forwardfile_error;
- }
- if(current_forwardfile && (prev->st_mtime == curr->st_mtime)) {
- csp->flist = current_forwardfile;
- return(0);
- }
- fs = (struct file_list *) zalloc(sizeof(*fs));
- bl = (struct forward_spec *) zalloc(sizeof(*bl));
- if((fs == NULL) || (bl == NULL)) {
- goto load_forwardfile_error;
- }
- memset(fs, ' ', sizeof(*fs));
- memset(bl, ' ', sizeof(*bl));
- fs->f = bl;
- fs->next = files->next;
- files->next = fs;
- if(csp) {
- csp->flist = fs;
- }
- *prev = *curr;
- if((fp = fopen(forwardfile, "r")) == NULL) {
- goto load_forwardfile_error;
- }
- p = url_encode(html_code_map, forwardfile);
- sprintf(buf, "<h2>The file `%s' contains the following patterns</h2>n", p);
- freez(p);
- fs->proxy_args = strsav(fs->proxy_args, buf);
- tmp = NULL;
- fs->proxy_args = strsav(fs->proxy_args, "<pre>");
- while(fgets(buf, sizeof(buf), fp)) {
- freez(tmp);
- if((p = url_encode(html_code_map, buf))) {
- fs->proxy_args = strsav(fs->proxy_args, p);
- }
- freez(p);
- fs->proxy_args = strsav(fs->proxy_args, "<br>");
- if((p = strpbrk(buf, "rn")) != NULL) {
- *p = ' ';
- }
- /* comments */
- if((p = strchr(buf, '#'))) *p = ' ';
- /* skip blank lines */
- if(*buf == ' ') continue;
- tmp = strdup(buf);
- n = ssplit(tmp, " t", vec, SZ(vec), 1, 1);
- if(n != 4) {
- fprintf(stderr, "error in forwardfile: %sn", buf);
- continue;
- }
- strcpy(buf, vec[0]);
- reject = 1;
- if(*buf == '~') {
- reject = 0;
- p = buf;
- q = p+1;
- while ((*p++ = *q++)) {
- /* nop */
- }
- }
- /* skip blank lines */
- if(*buf == ' ') continue;
- /* allocate a new node */
- if(((b = zalloc(sizeof(*b))) == NULL)
- #ifdef REGEX
- || ((b->url->preg = zalloc(sizeof(*b->url->preg))) == NULL)
- #endif
- ) {
- fclose(fp);
- goto load_forwardfile_error;
- }
- /* add it to the list */
- b->next = bl->next;
- bl->next = b;
- /* save a copy of the orignal specification */
- if((b->url->spec = strdup(buf)) == NULL) {
- fclose(fp);
- goto load_forwardfile_error;
- }
- b->reject = reject;
- if((p = strchr(buf, '/'))) {
- b->url->path = strdup(p);
- b->url->pathlen = strlen(b->url->path);
- *p = ' ';
- } else {
- b->url->path = NULL;
- b->url->pathlen = 0;
- }
- #ifdef REGEX
- if(b->url->path) {
- int errcode;
- char rebuf[BUFSIZ];
- sprintf(rebuf, "^(%s)", b->url->path);
- errcode = regcomp(b->url->preg, rebuf,
- (REG_EXTENDED|REG_NOSUB|REG_ICASE));
- if(errcode) {
- size_t errlen =
- regerror(errcode,
- b->url->preg, buf, sizeof(buf));
- buf[errlen] = ' ';
- fprintf(logfp,
- "%s: error compiling %s: %sn",
- prog, b->url->spec, buf);
- fclose(fp);
- goto load_forwardfile_error;
- }
- } else {
- freez(b->url->preg);
- }
- #endif
- if((p = strchr(buf, ':')) == NULL) {
- port = 0;
- } else {
- *p++ = ' ';
- port = atoi(p);
- }
- b->url->port = port;
- if((b->url->domain = strdup(buf)) == NULL) {
- fclose(fp);
- goto load_forwardfile_error;
- }
- /* split domain into components */
- *url = dsplit(b->url->domain);
- b->url->dbuf = url->dbuf;
- b->url->dcnt = url->dcnt;
- b->url->dvec = url->dvec;
- /* now parse the gateway specs */
- p = vec[2];
- for(gw = gateways; gw->name; gw++) {
- if(strcmp(gw->name, p) == 0) {
- break;
- }
- }
- if(gw->name == NULL) {
- goto load_forwardfile_error;
- }
- /* save this as the gateway type */
- *b->gw = *gw;
- /* now parse the gateway host[:port] spec */
- p = vec[3];
- if(strcmp(p, ".") != 0) {
- b->gw->gateway_host = strdup(p);
- if((p = strchr(b->gw->gateway_host, ':'))) {
- *p++ = ' ';
- b->gw->gateway_port = atoi(p);
- }
- if(b->gw->gateway_port <= 0) {
- goto load_forwardfile_error;
- }
- }
- /* now parse the forwarding spec */
- p = vec[1];
- if(strcmp(p, ".") != 0) {
- b->gw->forward_host = strdup(p);
- if((p = strchr(b->gw->forward_host, ':'))) {
- *p++ = ' ';
- b->gw->forward_port = atoi(p);
- }
- if(b->gw->forward_port <= 0) {
- b->gw->forward_port = 8000;
- }
- }
- }
- fs->proxy_args = strsav(fs->proxy_args, "</pre>");
- freez(tmp);
- fclose(fp);
- /* the old one is now obsolete */
- if(current_forwardfile) {
- current_forwardfile->unloader = unload_forwardfile;
- }
- current_forwardfile = fs;
- return(0);
- load_forwardfile_error:
- fprintf(logfp, "%s: can't load forwardfile '%s': ",
- prog, forwardfile);
- fperror(logfp, "");
- return(-1);
- }
- #define JUNKBUSTERS "http://www.junkbusters.com"
- #define OPT "href="" JUNKBUSTERS "/ht/en/ijb" VERSION_MAJOR "man.html#"
- /* strsav() takes a pointer to a string stored in a dynamically allocated
- * buffer and a pointer to a string and returns a pointer to a new dynamically
- * allocated space that contains the concatenation of the two input strings
- * the previous space is free()'d by realloc().
- */
- char *
- strsav(char *old, char *text_to_append)
- {
- int old_len, new_len;
- char *p;
- if(( text_to_append == NULL)
- || (*text_to_append == ' ')) {
- return(old);
- }
- if(old) {
- old_len = strlen(old);
- } else {
- old_len = 0;
- }
- new_len = old_len + strlen(text_to_append) + 1;
- if(old) {
- if((p = realloc(old, new_len)) == NULL) {
- fprintf(logfp, "%s: realloc(%d) bytes for proxy_args failed!n", prog, new_len);
- exit(1);
- }
- } else {
- if((p = malloc(new_len)) == NULL) {
- fprintf(logfp, "%s: malloc(%d) bytes for proxy_args failed!n", prog, new_len);
- exit(1);
- }
- }
- strcpy(p + old_len, text_to_append);
- return(p);
- }
- void
- savearg(char *c, char *o)
- {
- char buf[BUFSIZ];
- static int one_shot = 1;
- if(one_shot) {
- one_shot = 0;
- proxy_args->invocation = strsav(proxy_args->invocation,
- "<br>n"
- "and the following options were set "
- "in the configuration file"
- "<br><br>n"
- );
- }
- *buf = ' ';
- if(c && *c) {
- if((c = url_encode(html_code_map, c))) {
- sprintf(buf, "<a " OPT "%s">%s</a> ", c, c);
- }
- freez(c);
- }
- if(o && *o) {
- if((o = url_encode(html_code_map, o))) {
- if(strncmpic(o, "http://", 7) == 0) {
- strcat(buf, "<a href="");
- strcat(buf, o);
- strcat(buf, "">");
- strcat(buf, o);
- strcat(buf, "</a>");
- } else {
- strcat(buf, o);
- }
- }
- freez(o);
- }
- strcat(buf, "<br>n");
- proxy_args->invocation = strsav(proxy_args->invocation, buf);
- }
- void
- init_proxy_args(int argc, char *argv[])
- {
- struct gateway *g;
- int i;
- proxy_args->header = strsav(proxy_args->header,
- "HTTP/1.0 200 OKn"
- "Server: IJ/" VERSION "n"
- "Content-type: text/htmlnn"
- "<html>"
- "<head>"
- "<title>Internet Junkbuster Proxy Status</title>"
- "</head>n"
- "<body bgcolor="#f8f8f0" link="#000078" alink="#ff0022" vlink="#787878">n"
- "<center>n"
- "<h1>" BANNER "n"
- "<a href="" JUNKBUSTERS "/ht/en/ijb" VERSION_MAJOR "faq.html#show">Proxy Status</a>n"
- "</h1></center>n"
- "<h2>You are using the " BANNER " <sup><small><small>TM</small></small></sup></h2>n"
- "Version: IJ/" VERSION "n"
- "<p>n"
- );
- proxy_args->header = strsav(proxy_args->header,
- "<h2>The program was invoked as follows</h2>n");
- for(i=0; i < argc; i++) {
- proxy_args->header = strsav(proxy_args->header, argv[i]);
- proxy_args->header = strsav(proxy_args->header, " ");
- }
- proxy_args->header = strsav(proxy_args->header, "<br>n");
- proxy_args->gateways = strsav(proxy_args->gateways,
- "<h2>It supports the following gateway protocols:</h2>n");
- for(g = gateways; g->name; g++) {
- proxy_args->gateways = strsav(proxy_args->gateways, g->name);
- proxy_args->gateways = strsav(proxy_args->gateways, " ");
- }
- proxy_args->gateways = strsav(proxy_args->gateways, "<br>n");
- }
- void
- end_proxy_args()
- {
- char buf[BUFSIZ];
- char *b = NULL;
- extern char *acl_rcs, *bind_rcs, *conn_rcs, *encode_rcs,
- *jcc_rcs, *loaders_rcs, *parsers_rcs, *filters_rcs,
- *socks4_rcs, *ssplit_rcs, *gnu_regex_rcs, *win32_rcs;
- b = strsav(b, "<h2>Source versions:</h2>n");
- b = strsav(b, "<pre>");
- sprintf(buf, "%sn", jcc_rcs ); b = strsav(b, buf);
- sprintf(buf, "%sn", parsers_rcs ); b = strsav(b, buf);
- sprintf(buf, "%sn", filters_rcs ); b = strsav(b, buf);
- sprintf(buf, "%sn", loaders_rcs ); b = strsav(b, buf);
- sprintf(buf, "%sn", conn_rcs ); b = strsav(b, buf);
- sprintf(buf, "%sn", bind_rcs ); b = strsav(b, buf);
- sprintf(buf, "%sn", encode_rcs ); b = strsav(b, buf);
- sprintf(buf, "%sn", socks4_rcs ); b = strsav(b, buf);
- sprintf(buf, "%sn", ssplit_rcs ); b = strsav(b, buf);
- sprintf(buf, "%sn", acl_rcs ); b = strsav(b, buf);
- sprintf(buf, "%sn", gnu_regex_rcs ); b = strsav(b, buf);
- sprintf(buf, "%sn", win32_rcs ); b = strsav(b, buf);
- b = strsav(b, "</pre>");
- #ifdef REGEX
- b = strsav(b, "<p>This " BANNER " supports POSIX regular expressions in the path specs.n");
- #endif
- b = strsav(b,
- "<small><small><p>n"
- "Code and documentation of the " BANNER " Proxy"
- "<sup><small>TM</small></sup>n"
- "<a href="" JUNKBUSTERS "/ht/en/legal.html#copy">n" "Copyright</a>© 1997 Junkbusters Corporationn"
- "<a href="" JUNKBUSTERS "/ht/en/legal.html#marks"><sup><small>TM</small></sup></a><br>n"
- "Copying and distribution permitted under the"
- "<a href="" JUNKBUSTERS "/ht/en/gpl.html">n"
- "<small>GNU</small></a> "
- "General Public License.n"
- "</small>"
- "<address><kbd>webmaster@junkbusters.com</kbd></address>"
- "</small>"
- "</body></html>n"
- );
- proxy_args->trailer = b;
- }
- void
- add_loader(int (*loader)())
- {
- int i;
- for(i=0; i < NLOADERS; i++) {
- if(loaders[i] == NULL) {
- loaders[i] = loader;
- break;
- }
- }
- }
- int
- run_loader(struct client_state *csp)
- {
- int ret = 0;
- int i;
- for(i=0; i < NLOADERS; i++) {
- if(loaders[i] == NULL) break;
- ret |= (loaders[i])(csp);
- }
- return(ret);
- }
- /* the way calloc() ought to be -acjc */
- void *
- zalloc(int size)
- {
- void *ret;
- if((ret = malloc(size))) {
- memset(ret, ' ', size);
- }
- return(ret);
- }