From: wessels <> Date: Tue, 20 Aug 1996 04:44:48 +0000 (+0000) Subject: 1.0.7 -> 1.0.8 merge X-Git-Tag: SQUID_3_0_PRE1~5958 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=6e40f263175e8c3ed5f6197a3673dc6dee84e189;p=thirdparty%2Fsquid.git 1.0.7 -> 1.0.8 merge --- diff --git a/src/Makefile.in b/src/Makefile.in index 6e9a847b38..db08b87bf7 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -1,7 +1,7 @@ # # Makefile for the Squid Object Cache server # -# $Id: Makefile.in,v 1.34 1996/08/15 02:57:15 wessels Exp $ +# $Id: Makefile.in,v 1.35 1996/08/19 22:44:48 wessels Exp $ # # Uncomment and customize the following to suit your needs: # @@ -76,7 +76,7 @@ all: squid.conf $(PROGS) $(UTILS) $(CGIPROGS) squid: $(OBJS) $(CC) -o $@ $(LDFLAGS) $(OBJS) $(CRYPT_LIB) $(LIBS) $(AIO_LIBS) -cache_cf.o: cache_cf.c +cache_cf.o: cache_cf.c Makefile $(CC) -c $< $(CFLAGS) $(DEFAULTS) client: client.o @@ -91,7 +91,7 @@ cachemgr.cgi: cachemgr.o ftpget: ftpget.o $(CC) -o $@ $(LDFLAGS) ftpget.o $(LIBS) -squid.conf: squid.conf.pre +squid.conf: squid.conf.pre Makefile sed "\ s%@DEFAULT_CONFIG_FILE@%$(DEFAULT_CONFIG_FILE)%g;\ s%@DEFAULT_FTPGET@%$(DEFAULT_FTPGET)%g;\ @@ -99,7 +99,7 @@ squid.conf: squid.conf.pre s%@DEFAULT_CACHE_LOG@%$(DEFAULT_CACHE_LOG)%g;\ s%@DEFAULT_ACCESS_LOG@%$(DEFAULT_ACCESS_LOG)%g;\ s%@DEFAULT_STORE_LOG@%$(DEFAULT_STORE_LOG)%g;\ - s%@DEFAULT_SWAP_DIR@%$(DEFAULT_SWAP_DIR)%g" <$? >$@ + s%@DEFAULT_SWAP_DIR@%$(DEFAULT_SWAP_DIR)%g" < squid.conf.pre >$@ install-mkdirs: -@if test ! -d $(prefix); then \ diff --git a/src/acl.cc b/src/acl.cc index 75ed127027..1adb718a3c 100644 --- a/src/acl.cc +++ b/src/acl.cc @@ -1,5 +1,5 @@ /* - * $Id: acl.cc,v 1.26 1996/07/23 04:59:33 wessels Exp $ + * $Id: acl.cc,v 1.27 1996/08/19 22:44:48 wessels Exp $ * * DEBUG: section 28 Access Control * AUTHOR: Duane Wessels @@ -75,6 +75,10 @@ static squid_acl aclType(s) if (!strcmp(s, "time")) return ACL_TIME; if (!strcmp(s, "pattern")) + return ACL_URLPATH_REGEX; + if (!strcmp(s, "urlpath_regex")) + return ACL_URLPATH_REGEX; + if (!strcmp(s, "url_regex")) return ACL_URL_REGEX; if (!strcmp(s, "port")) return ACL_URL_PORT; @@ -435,6 +439,7 @@ void aclParseAclLine() A->data = (void *) aclParseTimeSpec(); break; case ACL_URL_REGEX: + case ACL_URLPATH_REGEX: A->data = (void *) aclParseRegexList(); break; case ACL_URL_PORT: @@ -717,9 +722,12 @@ int aclMatchAcl(acl, checklist) case ACL_TIME: return aclMatchTime(acl->data, squid_curtime); /* NOTREACHED */ - case ACL_URL_REGEX: + case ACL_URLPATH_REGEX: return aclMatchRegex(acl->data, r->urlpath); /* NOTREACHED */ + case ACL_URL_REGEX: + return aclMatchRegex(acl->data, urlCanonical(r, NULL)); + /* NOTREACHED */ case ACL_URL_PORT: return aclMatchInteger(acl->data, r->port); /* NOTREACHED */ @@ -830,6 +838,7 @@ void aclDestroyAcls() aclDestroyTimeList(a->data); break; case ACL_URL_REGEX: + case ACL_URLPATH_REGEX: aclDestroyRegexList(a->data); break; case ACL_URL_PORT: diff --git a/src/cache_cf.cc b/src/cache_cf.cc index 6bf1c88a0c..15fb22ceab 100644 --- a/src/cache_cf.cc +++ b/src/cache_cf.cc @@ -1,5 +1,5 @@ /* - * $Id: cache_cf.cc,v 1.67 1996/07/27 07:07:41 wessels Exp $ + * $Id: cache_cf.cc,v 1.68 1996/08/19 22:44:50 wessels Exp $ * * DEBUG: section 3 Configuration File Parsing * AUTHOR: Harvest Derived @@ -154,6 +154,7 @@ struct SquidConfig Config; #define DefaultEffectiveUser (char *)NULL /* default NONE */ #define DefaultEffectiveGroup (char *)NULL /* default NONE */ #define DefaultAppendDomain (char *)NULL /* default NONE */ +#define DefaultErrHtmlText (char *)NULL /* default NONE */ #define DefaultDebugOptions "ALL,1" /* All sections at level 1 */ #define DefaultAccelHost (char *)NULL /* default NONE */ @@ -845,7 +846,6 @@ static void parseLocalDomainLine() } } - static void parseInsideFirewallLine() { char *token; @@ -978,6 +978,12 @@ static void parseIntegerValue(iptr) *iptr = i; } +static void parseErrHtmlLine() +{ + char *token; + if ((token = strtok(NULL, ""))) + Config.errHtmlText = xstrdup(token); +} int parseConfigFile(file_name) char *file_name; @@ -1235,6 +1241,9 @@ int parseConfigFile(file_name) else if (!strcmp(token, "ssl_proxy")) parseSslProxyLine(); + else if (!strcmp(token, "err_html_text")) + parseErrHtmlLine(); + else { debug(3, 0, "parseConfigFile: line %d unrecognized: '%s'\n", config_lineno, @@ -1311,7 +1320,6 @@ u_short setIcpPortNum(port) return (Config.Port.icp = port); } - static char *safe_xstrdup(p) char *p; { @@ -1340,6 +1348,7 @@ static void configFreeMemory() safe_free(Config.ftpUser); safe_free(Config.Announce.host); safe_free(Config.Announce.file); + safe_free(Config.errHtmlText); wordlistDestroy(&Config.cache_dirs); wordlistDestroy(&Config.hierarchy_stoplist); wordlistDestroy(&Config.local_domain_list); @@ -1393,6 +1402,7 @@ static void configSetFactoryDefaults() Config.effectiveUser = safe_xstrdup(DefaultEffectiveUser); Config.effectiveGroup = safe_xstrdup(DefaultEffectiveGroup); Config.appendDomain = safe_xstrdup(DefaultAppendDomain); + Config.errHtmlText = safe_xstrdup(DefaultErrHtmlText); Config.Port.http = DefaultHttpPortNum; Config.Port.icp = DefaultIcpPortNum; diff --git a/src/debug.cc b/src/debug.cc index dd5b7cee4c..5a073bf52b 100644 --- a/src/debug.cc +++ b/src/debug.cc @@ -1,5 +1,5 @@ /* - * $Id: debug.cc,v 1.20 1996/07/25 07:10:30 wessels Exp $ + * $Id: debug.cc,v 1.21 1996/08/19 22:44:51 wessels Exp $ * * DEBUG: section 0 Debug Routines * AUTHOR: Harvest Derived @@ -108,7 +108,6 @@ char *_db_file = __FILE__; int _db_line = 0; -int syslog_enable = 0; FILE *debug_log = NULL; static char *debug_log_file = NULL; static time_t last_squid_curtime = 0; @@ -165,7 +164,7 @@ void _db_print(va_alist) #if HAVE_SYSLOG /* level 0 go to syslog */ - if ((level == 0) && syslog_enable) { + if ((level == 0) && opt_syslog_enable) { tmpbuf[0] = '\0'; vsprintf(tmpbuf, f, args); syslog(LOG_ERR, tmpbuf); @@ -246,7 +245,7 @@ void _db_init(logfile, options) debugOpenLog(logfile); #if HAVE_SYSLOG && defined(LOG_LOCAL4) - if (syslog_enable) + if (opt_syslog_enable) openlog(appname, LOG_PID | LOG_NDELAY | LOG_CONS, LOG_LOCAL4); #endif /* HAVE_SYSLOG */ diff --git a/src/dnsserver.cc b/src/dnsserver.cc index 50345bc49f..026b202049 100644 --- a/src/dnsserver.cc +++ b/src/dnsserver.cc @@ -1,6 +1,6 @@ /* - * $Id: dnsserver.cc,v 1.11 1996/07/25 07:10:32 wessels Exp $ + * $Id: dnsserver.cc,v 1.12 1996/08/19 22:44:51 wessels Exp $ * * DEBUG: section 0 DNS Resolver * AUTHOR: Harvest Derived @@ -228,7 +228,8 @@ int main(argc, argv) /* point stdout to fd */ dup2(fd, 1); dup2(fd, 0); - close(fd); + if (fd > 1) + close(fd); } while (1) { int retry_count = 0; diff --git a/src/errorpage.cc b/src/errorpage.cc index c16f7f0a42..6695174eca 100644 --- a/src/errorpage.cc +++ b/src/errorpage.cc @@ -1,6 +1,6 @@ /* - * $Id: errorpage.cc,v 1.28 1996/07/25 07:10:32 wessels Exp $ + * $Id: errorpage.cc,v 1.29 1996/08/19 22:44:52 wessels Exp $ * * DEBUG: section 4 Error Generation * AUTHOR: Duane Wessels @@ -55,7 +55,9 @@ The following error was encountered:\n\
\n\
     %s\n\
 
\n\ -


\n\ +

\n\ +%s\n\ +


\n\
\n\ Generated by %s/%s@%s\n\
\n\ @@ -152,13 +154,16 @@ void squid_error_entry(entry, type, msg) } sprintf(tbuf, SQUID_ERROR_MSG_P3, ErrorData[index].lng, + Config.errHtmlText, appname, version_string, getMyHostname()); strcat(tmp_error_buf, tbuf); - entry->mem_obj->abort_code = type; - if (entry->mem_obj->reply->code == 0) - entry->mem_obj->reply->code = 400; + if (entry->mem_obj) { + entry->mem_obj->abort_code = type; + if (entry->mem_obj->reply->code == 0) + entry->mem_obj->reply->code = 400; + } storeAbort(entry, tmp_error_buf); } @@ -190,6 +195,7 @@ char *squid_error_url(url, method, type, address, code, msg) } sprintf(tbuf, SQUID_ERROR_MSG_P3, ErrorData[index].lng, + Config.errHtmlText, appname, version_string, getMyHostname()); @@ -205,6 +211,8 @@ char *squid_error_url(url, method, type, address, code, msg)
\n\
 %s\n\
 
\n\ +

\n\ +%s\n\


\n\
\n\ Generated by %s/%s@%s\n\ @@ -224,6 +232,7 @@ char *squid_error_request(request, type, address, code) sprintf(tmp_error_buf, "HTTP/1.0 %d Cache Detected Error\r\nContent-type: text/html\r\n\r\n", code); sprintf(tbuf, SQUID_REQUEST_ERROR_MSG, request, + Config.errHtmlText, appname, version_string, getMyHostname()); @@ -249,6 +258,8 @@ Sorry, you are not currently allowed to request\n\ From this cache. Please check with the\n\ cache administrator\n\ if you believe this is incorrect.\n\ +

\n\ +%s\n\


\n\
\n\ Generated by %s/%s@%s\n\ @@ -257,6 +268,7 @@ Generated by %s/%s@%s\n\ code, url, Config.adminEmail, + Config.errHtmlText, appname, version_string, getMyHostname()); @@ -273,6 +285,8 @@ Sorry, you have to authorize yourself to request\n\ from this cache. Please check with the\n\ cache administrator\n\ if you believe this is incorrect.\n\ +

\n\ +%s\n\


\n\
\n\ Generated by %s/%s@%s\n\ @@ -282,6 +296,7 @@ Generated by %s/%s@%s\n\ request->host, request->urlpath, Config.adminEmail, + Config.errHtmlText, appname, version_string, getMyHostname()); diff --git a/src/ipcache.cc b/src/ipcache.cc index a79455413c..037b7627eb 100644 --- a/src/ipcache.cc +++ b/src/ipcache.cc @@ -1,5 +1,5 @@ /* - * $Id: ipcache.cc,v 1.38 1996/07/25 07:10:37 wessels Exp $ + * $Id: ipcache.cc,v 1.39 1996/08/19 22:44:53 wessels Exp $ * * DEBUG: section 14 IP Cache * AUTHOR: Harvest Derived @@ -362,8 +362,8 @@ static int ipcache_purgelru() /* sort LRU candidate list */ qsort((char *) LRU_list, LRU_list_count, - sizeof(i), - (int (*)(const void *, const void *)) ipcache_compareLastRef); + sizeof(ipcache_entry *), + (QS) ipcache_compareLastRef); for (k = 0; LRU_list[k] && (meta_data.ipcache_count > ipcache_low) && k < LRU_list_count; ++k) { diff --git a/src/main.cc b/src/main.cc index fb7f662eff..643d55f6c3 100644 --- a/src/main.cc +++ b/src/main.cc @@ -1,5 +1,5 @@ /* - * $Id: main.cc,v 1.59 1996/08/14 22:57:11 wessels Exp $ + * $Id: main.cc,v 1.60 1996/08/19 22:44:54 wessels Exp $ * * DEBUG: section 1 Startup and Main Loop * AUTHOR: Harvest Derived @@ -117,6 +117,7 @@ int catch_signals = 1; int opt_dns_tests = 1; int opt_foreground_rebuild = 0; int opt_zap_disk_store = 0; +int opt_syslog_enable = 0; /* disabled by default */ int vhost_mode = 0; int unbuffered_logs = 1; /* debug and hierarhcy unbuffered by default */ int shutdown_pending = 0; /* set by SIGTERM handler (shut_down()) */ @@ -147,7 +148,7 @@ Usage: %s [-hsvzCDFRUVY] [-f config-file] [-[au] port]\n\ %s\n\ -h Print help message.\n\ -s Enable logging to syslog.\n\ - -u port Specify UDP port number (default: %d), disable with 0.\n\ + -u port Specify ICP port number (default: %d), disable with 0.\n\ -v Print version.\n\ -z Zap disk storage -- deletes all objects in disk cache.\n\ -C Do not catch fatal signals.\n\ @@ -213,7 +214,7 @@ static void mainParseOptions(argc, argv) fatal("Need to add -DMALLOC_DBG when compiling to use -m option"); #endif case 's': - syslog_enable = 0; + opt_syslog_enable = 1; break; case 'u': icpPortNumOverride = atoi(optarg); @@ -265,6 +266,10 @@ void shut_down(sig) debug(21, 1, "Waiting %d seconds for active connections to finish\n", Config.lifetimeShutdown); shutdown_pending = 1; +#if SA_RESETHAND == 0 + signal(SIGTERM, SIG_DFL); + signal(SIGINT, SIG_DFL); +#endif } void serverConnectionsOpen() @@ -524,9 +529,6 @@ int main(argc, argv) fd_note(1, "STDOUT"); fd_note(2, "STDERR"); - /* enable syslog by default */ - syslog_enable = 0; - /* preinit for debug module */ debug_log = stderr; hash_init(0); diff --git a/src/squid.h b/src/squid.h index 8970801f06..9532c34a33 100644 --- a/src/squid.h +++ b/src/squid.h @@ -1,6 +1,6 @@ /* - * $Id: squid.h,v 1.36 1996/08/14 22:57:13 wessels Exp $ + * $Id: squid.h,v 1.37 1996/08/19 22:44:56 wessels Exp $ * * AUTHOR: Duane Wessels * @@ -170,15 +170,12 @@ #ifndef SA_NODEFER #define SA_NODEFER 0 #endif - #ifndef SA_RESETHAND -#ifdef SA_ONESHOT -#define SA_RESETHAND SA_ONESHOT -#else #define SA_RESETHAND 0 -#define HAVE_SIGACTION 0 -#endif /* SA_ONESHOT */ -#endif /* SA_RESETHAND */ +#endif +#if SA_RESETHAND == 0 && defined(SA_ONESHOT) +#define SA_RESETHAND SA_ONESHOT +#endif typedef struct sentry StoreEntry; typedef struct mem_hdr *mem_ptr; @@ -214,6 +211,7 @@ typedef unsigned long u_num32; #include "ansihelp.h" typedef void (*SIH) _PARAMS((int, void *)); /* swap in */ +typedef int (*QS) _PARAMS((const void *, const void *)); #include "cache_cf.h" #include "comm.h" @@ -269,6 +267,7 @@ extern int opt_reload_hit_only; /* main.c */ extern int opt_dns_tests; /* main.c */ extern int opt_foreground_rebuild; /* main.c */ extern int opt_zap_disk_store; /* main.c */ +extern int opt_syslog_enable; /* main.c */ extern int vhost_mode; /* main.c */ extern char version_string[]; /* main.c */ extern char appname[]; /* main.c */ diff --git a/src/store.cc b/src/store.cc index 31f8541237..9181176a5d 100644 --- a/src/store.cc +++ b/src/store.cc @@ -1,5 +1,5 @@ /* - * $Id: store.cc,v 1.82 1996/08/17 05:10:28 wessels Exp $ + * $Id: store.cc,v 1.83 1996/08/19 22:45:31 wessels Exp $ * * DEBUG: section 20 Storeage Manager * AUTHOR: Harvest Derived @@ -212,7 +212,9 @@ static int storeCheckPurgeMem _PARAMS((StoreEntry * e)); static void storeSwapLog _PARAMS((StoreEntry *)); static int storeHashDelete _PARAMS((StoreEntry *)); static char *storeDescribeStatus _PARAMS((StoreEntry *)); - +static int compareLastRef _PARAMS((StoreEntry ** e1, StoreEntry ** e2)); +static int compareSize _PARAMS((StoreEntry ** e1, StoreEntry ** e2)); +static int storeClientListSearch _PARAMS((MemObject *, int fd)); /* Now, this table is inaccessible to outsider. They have to use a method * to access a value in internal storage data structure. */ @@ -280,10 +282,8 @@ static void destroy_MemObject(mem) destroy_MemObjectData(mem); safe_free(mem->pending); if (mem->client_list) { - for (i = 0; i < mem->client_list_size; ++i) { - if (mem->client_list[i]) - safe_free(mem->client_list[i]); - } + for (i = 0; i < mem->client_list_size; i++) + safe_free(mem->client_list[i]); safe_free(mem->client_list); } safe_free(mem->mime_hdr); @@ -509,14 +509,14 @@ int storeLockObject(e, handler, data) if (e->mem_status != NOT_IN_MEMORY) /* ok, its either IN_MEMORY or SWAPPING_IN */ - debug(20,5,"storeLockObject: OK: mem_status is %s\n", memStatusStr[e->mem_status]); + debug(20, 5, "storeLockObject: OK: mem_status is %s\n", memStatusStr[e->mem_status]); else if (e->swap_status == SWAP_OK) /* ok, its NOT_IN_MEMORY, but its swapped out */ - debug(20,5,"storeLockObject: OK: swap_status is %s\n", swapStatusStr[e->swap_status]); + debug(20, 5, "storeLockObject: OK: swap_status is %s\n", swapStatusStr[e->swap_status]); else if (e->store_status == STORE_PENDING) /* ok, we're reading it in right now */ - debug(20,5,"storeLockObject: OK: store_status is %s\n", storeStatusStr[e->store_status]); - else + debug(20, 5, "storeLockObject: OK: store_status is %s\n", storeStatusStr[e->store_status]); + else fatal_dump(storeDescribeStatus(e)); e->lastref = squid_curtime; @@ -689,7 +689,7 @@ void storeSetPrivateKey(e) fatal_dump("Private key already exists."); } if (e->key) - storeHashDelete(e); + storeHashDelete((hash_link *) e); if (e->key && !BIT_TEST(e->flag, KEY_URL)) safe_free(e->key); e->key = xstrdup(newkey); @@ -721,7 +721,7 @@ void storeSetPublicKey(e) newkey = storeGeneratePublicKey(e->url, e->method); } if (e->key) - storeHashDelete(e); + storeHashDelete((hash_link *) e); if (e->key && !BIT_TEST(e->flag, KEY_URL)) safe_free(e->key); if (e->method == METHOD_GET) { @@ -794,11 +794,10 @@ StoreEntry *storeCreateEntry(url, req_hdr, flags, method) /* allocate client list */ mem->client_list_size = MIN_CLIENT; - mem->client_list = (ClientStatusEntry **) + mem->client_list = xcalloc(mem->client_list_size, sizeof(ClientStatusEntry *)); /* storeLog(STORE_LOG_CREATE, e); */ return e; - } /* Add a new object to the cache with empty memory copy and pointer to disk @@ -898,7 +897,6 @@ int storeRegister(e, fd, handler, data) debug(20, 9, "storeRegister: grew pending list to %d for slot %d.\n", mem->pending_list_size, i); - } mem->pending[i] = pe; return 0; @@ -913,29 +911,24 @@ int storeUnregister(e, fd) { int i; int freed = 0; - + MemObject *mem = e->mem_obj; debug(20, 9, "storeUnregister: called for FD %d '%s'\n", fd, e->key); - /* look for entry in client_list */ - if (e->mem_obj->client_list) { - for (i = 0; i < e->mem_obj->client_list_size; ++i) { - if (e->mem_obj->client_list[i] && (e->mem_obj->client_list[i]->fd == fd)) { - /* reset fd to zero as a mark for empty slot */ - safe_free(e->mem_obj->client_list[i]); - e->mem_obj->client_list[i] = NULL; - } - } + if ((i = storeClientListSearch(mem, fd)) > -1) { + safe_free(mem->client_list[i]); + mem->client_list[i] = NULL; } /* walk the entire list looking for matched fd */ - for (i = 0; i < (int) e->mem_obj->pending_list_size; i++) { - if (e->mem_obj->pending[i] && (e->mem_obj->pending[i]->fd == fd)) { - /* found the match fd */ - safe_free(e->mem_obj->pending[i]); - e->mem_obj->pending[i] = NULL; - freed++; - } + for (i = 0; i < (int) mem->pending_list_size; i++) { + if (mem->pending[i] == NULL) + continue; + if (mem->pending[i]->fd != fd) + continue; + /* found the match fd */ + safe_free(mem->pending[i]); + mem->pending[i] = NULL; + freed++; } - debug(20, 9, "storeUnregister: returning %d\n", freed); return freed; } @@ -1130,6 +1123,9 @@ int storeSwapInHandle(fd_notused, buf, len, flag, e, offset_notused) MemObject *mem = e->mem_obj; debug(20, 2, "storeSwapInHandle: '%s'\n", e->key); + if (mem == NULL) /* XXX remove later */ + fatal_dump(NULL); + if ((flag < 0) && (flag != DISK_EOF)) { debug(20, 0, "storeSwapInHandle: SwapIn failure (err code = %d).\n", flag); put_free_8k_page(mem->e_swap_buf); @@ -1148,6 +1144,9 @@ int storeSwapInHandle(fd_notused, buf, len, flag, e, offset_notused) debug(20, 5, "storeSwapInHandle: e->e_current_len = %d\n", mem->e_current_len); debug(20, 5, "storeSwapInHandle: e->object_len = %d\n", e->object_len); + if (len < 0) /* XXX remove later */ + fatal_dump(NULL); + /* always call these, even if len == 0 */ mem->swap_offset += len; storeAppend(e, buf, len); @@ -1198,14 +1197,13 @@ static int storeSwapInStart(e, swapin_complete_handler, swapin_complete_data) MemObject *mem = NULL; /* sanity check! */ - if ((e->swap_status != SWAP_OK) || (e->swap_file_number < 0)) { - debug(20, 0, "storeSwapInStart: ? \n", - e->swap_file_number, e->url); - if (e->mem_obj) - e->mem_obj->swapin_fd = -1; - return -1; - } - /* create additional structure for object in memory */ + if (e->swap_status != SWAP_OK) + fatal_dump("storeSwapInStart: bad swap_status"); + if (e->swap_file_number < 0) + fatal_dump("storeSwapInStart: bad swap_file_number"); + if (e->mem_obj) + fatal_dump("storeSwapInStart: mem_obj already present"); + e->mem_obj = mem = new_MemObject(); path = storeSwapFullPath(e->swap_file_number, NULL); @@ -1218,7 +1216,6 @@ static int storeSwapInStart(e, swapin_complete_handler, swapin_complete_data) mem->swapin_fd = (short) fd; debug(20, 5, "storeSwapInStart: initialized swap file '%s' for \n", path, e->url); - storeSetMemStatus(e, SWAPPING_IN); mem->data = new_MemObjectData(); mem->swap_offset = 0; @@ -1347,8 +1344,8 @@ static int storeSwapOutStart(e) StoreEntry *e; { int fd; - LOCAL_ARRAY(char, swapfilename, MAX_FILE_NAME_LEN); int x; + LOCAL_ARRAY(char, swapfilename, MAX_FILE_NAME_LEN); MemObject *mem = e->mem_obj; /* Suggest a new swap file number */ swapfileno = (swapfileno + 1) % (MAX_SWAP_FILE); @@ -1596,7 +1593,7 @@ void storeStartRebuildFromDisk() } data = xcalloc(1, sizeof(*data)); - for (i = 0; i < ncache_dirs; ++i) + for (i = 0; i < ncache_dirs; i++) debug(20, 1, "Rebuilding storage from disk image in %s\n", swappath(i)); data->start = getCurrentTime(); @@ -1694,7 +1691,6 @@ void storeComplete(e) StoreEntry *e; { debug(20, 3, "storeComplete: '%s'\n", e->key); - e->object_len = e->mem_obj->e_current_len; InvokeHandlers(e); e->lastref = squid_curtime; @@ -1721,6 +1717,9 @@ int storeAbort(e, msg) LOCAL_ARRAY(char, abort_msg, 2000); MemObject *mem = e->mem_obj; + if (mem == NULL) /* XXX remove later */ + fatal_dump("storeAbort: null mem"); + debug(20, 6, "storeAbort: '%s'\n", e->key); e->expires = squid_curtime + Config.negativeTtl; e->store_status = STORE_ABORTED; @@ -1905,7 +1904,6 @@ int storeGetMemSpace(size, check_vm_number) int compareLastRef(); int compareSize(); - if (!check_vm_number && ((store_mem_size + size) < store_mem_high)) return 0; @@ -1957,13 +1955,16 @@ int storeGetMemSpace(size, check_vm_number) debug(20, 5, "storeGetMemSpace: Can't purge size: %7d bytes\n", locked_bytes); debug(20, 5, "storeGetMemSpace: Sorting LRU_list: %7d items\n", LRU_list->index); #endif - qsort((char *) LRU_list->collection, LRU_list->index, sizeof(e), (int (*)(const void *, const void *)) compareLastRef); + qsort((char *) LRU_list->collection, + LRU_list->index, + sizeof(StoreEntry *), + (QS) compareLastRef); /* Kick LRU out until we have enough memory space */ if (check_vm_number) { /* look for vm slot */ - for (i = 0; (i < LRU_list->index) && (meta_data.hot_vm > store_hotobj_low); ++i) { + for (i = 0; (i < LRU_list->index) && (meta_data.hot_vm > store_hotobj_low); i++) { if ((LRU = (StoreEntry *) LRU_list->collection[i])) if ((LRU->store_status != STORE_PENDING) && (LRU->swap_status == NO_SWAP)) { n_released++; @@ -1975,7 +1976,7 @@ int storeGetMemSpace(size, check_vm_number) } } else { /* look for space */ - for (i = 0; (i < LRU_list->index) && ((store_mem_size + size) > store_mem_low); ++i) { + for (i = 0; (i < LRU_list->index) && ((store_mem_size + size) > store_mem_low); i++) { if ((LRU = (StoreEntry *) LRU_list->collection[i])) if ((LRU->store_status != STORE_PENDING) && (LRU->swap_status == NO_SWAP)) { n_released++; @@ -2033,8 +2034,11 @@ int storeGetMemSpace(size, check_vm_number) } /* sort the stuff by size */ - qsort((char *) pending_entry_list->collection, pending_entry_list->index, sizeof(e), (int (*)(const void *, const void *)) compareSize); - for (i = 0; (i < pending_entry_list->index) && (i < entry_to_delete_behind); ++i) + qsort((char *) pending_entry_list->collection, + pending_entry_list->index, + sizeof(StoreEntry *), + (QS) compareSize); + for (i = 0; (i < pending_entry_list->index) && (i < entry_to_delete_behind); i++) if (pending_entry_list->collection[i]) { n_deleted_behind++; storeStartDeleteBehind(pending_entry_list->collection[i]); @@ -2048,34 +2052,27 @@ int storeGetMemSpace(size, check_vm_number) return 0; } -int compareSize(e1, e2) +static int compareSize(e1, e2) StoreEntry **e1, **e2; { - if (!e1 || !e2) { - debug(20, 1, "compareSize: Called with at least one null argument, shouldn't happen.\n"); - return 0; - } + if (!e1 || !e2) + fatal_dump(NULL); if ((*e1)->mem_obj->e_current_len > (*e2)->mem_obj->e_current_len) return (1); - if ((*e1)->mem_obj->e_current_len < (*e2)->mem_obj->e_current_len) return (-1); - return (0); } -int compareLastRef(e1, e2) +static int compareLastRef(e1, e2) StoreEntry **e1, **e2; { if (!e1 || !e2) fatal_dump(NULL); - if ((*e1)->lastref > (*e2)->lastref) return (1); - if ((*e1)->lastref < (*e2)->lastref) return (-1); - return (0); } @@ -2085,7 +2082,6 @@ int compareLastRef(e1, e2) unsigned int storeGetBucketNum() { static unsigned int bucket = 0; - if (bucket >= STORE_BUCKETS) bucket = 0; return (bucket++); @@ -2134,7 +2130,7 @@ int storeGetSwapSpace(size) LRU_list = create_dynamic_array(LRU_cur_size, LRU_cur_size); /* remove expired objects until recover enough space or no expired objects */ - for (i = 0; i < STORE_BUCKETS; ++i) { + for (i = 0; i < STORE_BUCKETS; i++) { int expired_in_one_bucket = 0; link_ptr = hash_get_bucket(store_table, storeGetBucketNum()); @@ -2179,7 +2175,10 @@ int storeGetSwapSpace(size) expired); return 0; } - qsort((char *) LRU_list->collection, LRU_list->index, sizeof(e), (int (*)(const void *, const void *)) compareLastRef); + qsort((char *) LRU_list->collection, + LRU_list->index, + sizeof(StoreEntry *), + (QS) compareLastRef); /* keep the first n LRU objects only */ cut_dynamic_array(LRU_list, SWAP_LRU_REMOVE_COUNT); @@ -2216,7 +2215,7 @@ int storeGetSwapSpace(size) /* Although all expired objects removed, still didn't recover enough */ /* space. Kick LRU out until we have enough swap space */ - for (i = 0; i < LRU_list->index; ++i) { + for (i = 0; i < LRU_list->index; i++) { if (store_swap_size + kb_size <= store_swap_low) { fReduceSwap = 0; break; @@ -2400,16 +2399,16 @@ int storeClientWaiting(e) StoreEntry *e; { int i; - - if (e->mem_obj->client_list) { - for (i = 0; i < e->mem_obj->client_list_size; ++i) { - if (e->mem_obj->client_list[i]) + MemObject *mem = e->mem_obj; + if (mem->client_list) { + for (i = 0; i < mem->client_list_size; i++) { + if (mem->client_list[i]) return 1; } } - if (e->mem_obj->pending) { - for (i = 0; i < (int) e->mem_obj->pending_list_size; ++i) { - if (e->mem_obj->pending[i]) + if (mem->pending) { + for (i = 0; i < (int) mem->pending_list_size; i++) { + if (mem->pending[i]) return 1; } } @@ -2417,18 +2416,19 @@ int storeClientWaiting(e) } /* return index to matched clientstatus in client_list, -1 on NOT_FOUND */ -int storeClientListSearch(e, fd) - StoreEntry *e; +static int storeClientListSearch(mem, fd) + MemObject *mem; int fd; { int i; - - if (!e->mem_obj->client_list) - return -1; - for (i = 0; i < e->mem_obj->client_list_size; ++i) { - if (e->mem_obj->client_list[i] && - (fd == e->mem_obj->client_list[i]->fd)) + if (mem->client_list) { + for (i = 0; i < mem->client_list_size; i++) { + if (mem->client_list[i] == NULL) + continue; + if (mem->client_list[i]->fd != fd) + continue; return i; + } } return -1; } @@ -2440,26 +2440,34 @@ void storeClientListAdd(e, fd, last_offset) int last_offset; { int i; + MemObject *mem = e->mem_obj; + ClientStatusEntry **oldlist = NULL; + int oldsize; /* look for empty slot */ - - if (e->mem_obj->client_list) { - for (i = 0; (i < e->mem_obj->client_list_size) - && (e->mem_obj->client_list[i] != NULL); ++i); - - if (i == e->mem_obj->client_list_size) { - /* have to expand client_list */ - e->mem_obj->client_list_size += MIN_CLIENT; - e->mem_obj->client_list = xrealloc(e->mem_obj->client_list, e->mem_obj->client_list_size * sizeof(ClientStatusEntry *)); - } - } else { - e->mem_obj->client_list_size += MIN_CLIENT; - e->mem_obj->client_list = xcalloc(e->mem_obj->client_list_size, sizeof(ClientStatusEntry *)); - i = 0; + if (mem->client_list == NULL) { + mem->client_list_size = MIN_CLIENT; + mem->client_list = + xcalloc(mem->client_list_size, sizeof(ClientStatusEntry *)); } - - e->mem_obj->client_list[i] = xcalloc(1, sizeof(ClientStatusEntry)); - e->mem_obj->client_list[i]->fd = fd; - e->mem_obj->client_list[i]->last_offset = last_offset; + for (i = 0; i < mem->client_list_size; i++) { + if (mem->client_list[i] == NULL) + break; + } + if (i == mem->client_list_size) { + debug(20, 3, "storeClientListAdd: FD %d Growing client_list for '%s'\n", + fd, e->url); + oldlist = mem->client_list; + oldsize = mem->client_list_size; + mem->client_list_size <<= 1; + mem->client_list = + xcalloc(mem->client_list_size, sizeof(ClientStatusEntry *)); + for (i = 0; i < oldsize; i++) + mem->client_list[i] = oldlist[i]; + safe_free(oldlist); + } + mem->client_list[i] = xcalloc(1, sizeof(ClientStatusEntry)); + mem->client_list[i]->fd = fd; + mem->client_list[i]->last_offset = last_offset; } /* same to storeCopy but also register client fd and last requested offset @@ -2475,32 +2483,32 @@ int storeClientCopy(e, stateoffset, maxSize, buf, size, fd) int next_offset; int client_list_index; int available_to_write = e->mem_obj->e_current_len - stateoffset; + MemObject *mem = e->mem_obj; - if (stateoffset < e->mem_obj->e_lowest_offset) { + if (stateoffset < mem->e_lowest_offset) { /* this should not happen. Logic race !!! */ debug(20, 1, "storeClientCopy: Client Request a chunk of data in area lower than the lowest_offset\n"); debug(20, 1, " fd : %d\n", fd); - debug(20, 1, " Current Lowest offset : %d\n", e->mem_obj->e_lowest_offset); + debug(20, 1, " Current Lowest offset : %d\n", mem->e_lowest_offset); debug(20, 1, " Requested offset : %d\n", stateoffset); /* can't really do anything here. Client may hang until lifetime runout. */ return 0; } - *size = (available_to_write >= maxSize) ? - maxSize : available_to_write; + *size = (available_to_write >= maxSize) ? maxSize : available_to_write; debug(20, 6, "storeCopy: avail_to_write=%d, store_offset=%d\n", *size, stateoffset); /* update the lowest requested offset */ next_offset = (stateoffset + *size); - if ((client_list_index = storeClientListSearch(e, fd)) >= 0) { - e->mem_obj->client_list[client_list_index]->last_offset = next_offset; + if ((client_list_index = storeClientListSearch(mem, fd)) >= 0) { + mem->client_list[client_list_index]->last_offset = next_offset; } else { storeClientListAdd(e, fd, next_offset); } if (*size > 0) - (void) e->mem_obj->data->mem_copy(e->mem_obj->data, stateoffset, buf, *size); + (void) mem->data->mem_copy(mem->data, stateoffset, buf, *size); /* see if we can get rid of some data if we are in "delete behind" mode . */ if (e->flag & DELETE_BEHIND) { @@ -2580,7 +2588,7 @@ static int storeVerifySwapDirs(clean) int directory_created = 0; char *cmdbuf = NULL; - for (inx = 0; inx < ncache_dirs; ++inx) { + for (inx = 0; inx < ncache_dirs; inx++) { path = swappath(inx); debug(20, 9, "storeVerifySwapDirs: Creating swap space in %s\n", path); if (stat(path, &sb) < 0) { diff --git a/src/tools.cc b/src/tools.cc index 4773e811f1..239e5e8ec8 100644 --- a/src/tools.cc +++ b/src/tools.cc @@ -1,6 +1,6 @@ /* - * $Id: tools.cc,v 1.46 1996/07/25 07:10:44 wessels Exp $ + * $Id: tools.cc,v 1.47 1996/08/19 22:44:57 wessels Exp $ * * DEBUG: section 21 Misc Functions * AUTHOR: Harvest Derived @@ -130,31 +130,21 @@ static char *dead_msg() void mail_warranty() { FILE *fp = NULL; - LOCAL_ARRAY(char, filename, 256); - LOCAL_ARRAY(char, command, 256); - - sprintf(filename, "/tmp/mailin%d", (int) getpid()); - fp = fopen(filename, "w"); - if (fp != NULL) { - fprintf(fp, "From: %s\n", appname); - fprintf(fp, "To: %s\n", Config.adminEmail); - fprintf(fp, "Subject: %s\n", dead_msg()); - fclose(fp); - sprintf(command, "mail %s < %s", Config.adminEmail, filename); - system(command); /* XXX should avoid system(3) */ - unlink(filename); - } -} - -void print_warranty() -{ - if (Config.adminEmail) - mail_warranty(); - else - puts(dead_msg()); + char *filename; + static char command[256]; + if ((filename = tempnam(NULL, appname)) == NULL) + return; + if ((fp = fopen(filename, "w")) == NULL) + return; + fprintf(fp, "From: %s\n", appname); + fprintf(fp, "To: %s\n", getAdminEmail()); + fprintf(fp, "Subject: %s\n", dead_msg()); + fclose(fp); + sprintf(command, "mail %s < %s", getAdminEmail(), filename); + system(command); /* XXX should avoid system(3) */ + unlink(filename); } - static void dumpMallocStats(f) FILE *f; { @@ -233,17 +223,23 @@ void death(sig) if (sig == SIGSEGV) fprintf(debug_log, "FATAL: Received Segment Violation...dying.\n"); else if (sig == SIGBUS) - fprintf(debug_log, "FATAL: Received bus error...dying.\n"); + fprintf(debug_log, "FATAL: Received Bus Error...dying.\n"); else fprintf(debug_log, "FATAL: Received signal %d...dying.\n", sig); -#if !HAVE_SIGACTION +#if SA_RESETHAND == 0 signal(SIGSEGV, SIG_DFL); signal(SIGBUS, SIG_DFL); signal(sig, SIG_DFL); #endif storeWriteCleanLog(); PrintRusage(NULL, debug_log); - print_warranty(); + if (squid_curtime - SQUID_RELEASE_TIME < 864000) { + /* skip if more than 10 days old */ + if (getAdminEmail()) + mail_warranty(); + else + puts(dead_msg()); + } abort(); } @@ -303,7 +299,7 @@ void fatal_common(message) char *message; { #if HAVE_SYSLOG - if (syslog_enable) + if (opt_syslog_enable) syslog(LOG_ALERT, message); #endif fprintf(debug_log, "FATAL: %s\n", message);