These were some miscellaneous fixes I have accumulated over time.
Some might even be redundant.
I'll comment them as we go along.
********************************************************
First, some checks for EAGAIN signal interruptions.
********************************************************
diff -u -b -r squid-1.2.beta24/src/aiops.c squid-BuGless/src/aiops.c
--- squid-1.2.beta24/src/aiops.c	Tue Aug 18 21:13:57 1998
+++ squid-BuGless/src/aiops.c	Mon Aug 24 12:54:31 1998
@@ -584,7 +584,9 @@
 aio_do_read(aio_request_t * requestp)
 {
     lseek(requestp->fd, requestp->offset, requestp->whence);
-    requestp->ret = read(requestp->fd, requestp->tmpbufp, requestp->buflen);
+    while((requestp->ret =
+	read(requestp->fd, requestp->tmpbufp, requestp->buflen)) < 0 &&
+	errno == EAGAIN);
     requestp->err = errno;
 }
 
@@ -622,7 +624,9 @@
 static void
 aio_do_write(aio_request_t * requestp)
 {
-    requestp->ret = write(requestp->fd, requestp->tmpbufp, requestp->buflen);
+    while((requestp->ret =
+	write(requestp->fd, requestp->tmpbufp, requestp->buflen)) < 0 &&
+	errno == EAGAIN);
     requestp->err = errno;
 }
 
@@ -651,7 +655,10 @@
 static void
 aio_do_close(aio_request_t * requestp)
 {
-    requestp->ret = close(requestp->fd);
+    if((requestp->ret = close(requestp->fd))<0) {
+	debug(43, 0) ("aio_do_close: FD %d, errno %d\n", requestp->fd, errno);
+	close(requestp->fd);
+    }
     requestp->err = errno;
 }
 
diff -u -b -r squid-1.2.beta24/src/async_io.c squid-BuGless/src/async_io.c
--- squid-1.2.beta24/src/async_io.c	Tue Aug 18 23:15:43 1998
+++ squid-BuGless/src/async_io.c	Sat Aug 22 03:32:19 1998
@@ -127,8 +127,7 @@
         aioInit();
     aioCancel(fd, NULL);
     if (free_list == NULL) {
-	close(fd);
-	return;
+	goto force_close;
     }
     ctrlp = free_list;
     ctrlp->fd = fd;
@@ -137,7 +136,9 @@
     ctrlp->done_handler_data = NULL;
     ctrlp->operation = _AIO_CLOSE;
     if (aio_close(fd, &(ctrlp->result)) < 0) {
-	close(fd);		/* Can't create thread - do a normal close */
+force_close:
+	if(close(fd))		/* Can't create thread - do a normal close */
+	    debug(0,0) ("aioClose: FD %d, errno %d\n", fd, errno), close(fd);
         return;
     }
     free_list = free_list->next;
diff -u -b -r squid-1.2.beta24/src/comm.c squid-BuGless/src/comm.c
--- squid-1.2.beta24/src/comm.c	Wed Aug 19 00:42:17 1998
+++ squid-BuGless/src/comm.c	Sun Aug 23 23:32:11 1998
@@ -573,7 +573,8 @@
      * michael@metal.iinet.net.au sez close() on
      * network sockets never blocks.
      */
-    close(fd);
+    if(close(fd))
+	debug(50, 0) ("comm_close: FD %d, %s\n", fd, xstrerror()), close(fd);
 #elif USE_ASYNC_IO
     if (doaioclose)
         aioClose(fd);
********************************************************
Allow for small swaps; and fix a bug with the refresh
options
********************************************************
diff -u -b -r squid-1.2.beta24/src/cache_cf.c squid-BuGless/src/cache_cf.c
--- squid-1.2.beta24/src/cache_cf.c	Fri Aug 21 18:58:11 1998
+++ squid-BuGless/src/cache_cf.c	Mon Aug 24 04:02:19 1998
@@ -219,7 +219,7 @@
     /* calculate Config.Swap.maxSize */
     storeDirConfigure();
     if (Config.Swap.maxSize < (Config.Mem.maxSize >> 10))
-	fatal("cache_swap is lower than cache_mem");
+	debug(3, 0) ("configDoConfigure: cache_swap is lower than cache_mem");
     if (Config.Announce.period > 0) {
         Config.onoff.announce = 1;
     } else if (Config.Announce.period < 1) {
@@ -1183,7 +1183,7 @@
 #if HTTP_VIOLATIONS
         if (!strcmp(token, "override-expire"))
             override_expire = 1;
-	else if (!strcmp(token, "override-expire"))
+	else if (!strcmp(token, "override-lastmod"))
             override_lastmod = 1;
         else if (!strcmp(token, "reload-into-ims")) {
             reload_into_ims = 1;
********************************************************
I kind of liked the clickable statistics in 1.1,
here they are again.
********************************************************
diff -u -b -r squid-1.2.beta24/src/cachemgr.c squid-BuGless/src/cachemgr.c
--- squid-1.2.beta24/src/cachemgr.c	Fri Aug 14 21:25:14 1998
+++ squid-BuGless/src/cachemgr.c	Sat Aug 22 03:50:12 1998
@@ -345,7 +345,7 @@
 {
     static const char *ttags[] =
     {"td", "th"};
-    static char html[4096];
+    static char html[4096*4];
     static int table_line_num = 0;
     static int next_is_header = 0;
     int is_header = 0;
@@ -359,7 +359,7 @@
         snprintf(html, sizeof(html), "%s%s",
             table_line_num ? "</table>\n<pre>" : "", buf);
         table_line_num = 0;
-	return html;
+	goto ret;
     }
     /* start html table */
     if (!table_line_num) {
@@ -392,6 +392,37 @@
     l += snprintf(html + l, sizeof(html) - l, "</tr>\n");
     next_is_header = is_header && strstr(buf, "\t\t");
     table_line_num++;
+ret:
+    {
+#define STRLEN(x)	(sizeof(x)-1)
+	char*pok, *found;
+	for(pok = html; pok = strstr(pok+4, "://"); )
+#define CHECKFOR(str)	(!memcmp(found=pok-STRLEN(str),str,STRLEN(str)))
+	    if(CHECKFOR("http")||CHECKFOR("ftp")||
+		CHECKFOR("gopher")||CHECKFOR("wais")) {
+		static const char prefix[]="<a href=\"", interfix[]="\">",
+		    postfix[]="</a>";
+		size_t len,restlen;
+		for(;;) {
+		    switch(*++pok) {
+			default:
+			    continue;
+			case ' ':case '\t':case '\n':case '\0':
+			    break;
+		    }
+		    break;
+		}
+		len=pok-found; restlen=strlen(pok)+1;
+		memmove(found+STRLEN(prefix)+len+STRLEN(interfix)+len+
+		    STRLEN(postfix),found+len,restlen);
+		memmove(found+STRLEN(prefix),found,len);
+		memcpy(found,prefix,STRLEN(prefix));
+		memcpy(pok = found+STRLEN(prefix)+len,
+		    interfix,STRLEN(interfix));
+		memcpy(pok += STRLEN(interfix),found+STRLEN(prefix),len);
+		memcpy(pok += len, postfix,STRLEN(postfix));
+	    }
+    }
     return html;
 }
diff -u -b -r squid-1.2.beta24/src/defines.h squid-BuGless/src/defines.h
--- squid-1.2.beta24/src/defines.h	Tue Aug 18 01:00:37 1998
+++ squid-BuGless/src/defines.h	Mon Aug 24 13:00:15 1998
@@ -87,7 +87,7 @@
 
 #define DNS_INBUF_SZ 4096
 
-#define FD_DESC_SZ		64
+#define FD_DESC_SZ		128
 
 #define FQDN_LOOKUP_IF_MISS	0x01
 #define FQDN_MAX_NAMES 5
 
********************************************************
An extension to allow the redirector to act differently
depending on the port the request was made on
(for junk-buster and non-junk-buster decisions).
********************************************************
diff -u -b -r squid-1.2.beta24/src/cf.data.pre squid-BuGless/src/cf.data.pre
--- squid-1.2.beta24/src/cf.data.pre	Fri Aug 21 06:03:45 1998
+++ squid-BuGless/src/cf.data.pre	Mon Aug 24 04:04:09 1998
@@ -61,6 +61,17 @@
 http_port 3128
 DOC_END
 
+NAME: bhttp_port ascii_port
+TYPE: ushort
+DEFAULT: none
+LOC: Config.Port.bhttp
+DOC_START
+	The port number where Squid uses the cuciwhirl junkfilter.
+	Note that you need another http_port directive to actually
+	bind the port.
+
+bhttp_port 3129
+DOC_END
 
 NAME: icp_port udp_port
 TYPE: ushort
diff -u -b -r squid-1.2.beta24/src/structs.h squid-BuGless/src/structs.h
--- squid-1.2.beta24/src/structs.h	Fri Aug 21 06:03:49 1998
+++ squid-BuGless/src/structs.h	Sat Aug 22 03:32:32 1998
@@ -242,6 +243,7 @@
     size_t maxRequestSize;
     struct {
         ushortlist *http;
+	ushort bhttp;
         u_short icp;
 #if USE_HTCP
         u_short htcp;
********************************************************
At one point, I've seen entry == NULL in this place
(around 1.2.b20), maybe this was due to a different bug.
********************************************************
diff -u -b -r squid-1.2.beta24/src/client_side.c squid-BuGless/src/client_side.c
--- squid-1.2.beta24/src/client_side.c	Fri Aug 21 08:52:32 1998
+++ squid-BuGless/src/client_side.c	Sat Aug 22 04:19:57 1998
@@ -1463,10 +1463,10 @@
     debug(33, 3) ("clientKeepaliveNextRequest: FD %d\n", conn->fd);
     conn->defer.until = 0;	/* Kick it to read a new request */
     httpRequestFree(http);
-    if ((http = conn->chr) != NULL) {
+    entry = http->entry;
+    if ((http = conn->chr) != NULL && entry) {
         debug(33, 1) ("clientKeepaliveNextRequest: FD %d Sending next\n",
             conn->fd);
-	entry = http->entry;
         if (0 == storeClientCopyPending(entry, http)) {
             if (entry->store_status == STORE_ABORTED)
                 debug(33, 0) ("clientKeepaliveNextRequest: entry->swap_status == STORE_ABORTED\n");
********************************************************
Fix bug when q == data
********************************************************
diff -u -b -r squid-1.2.beta24/src/disk.c squid-BuGless/src/disk.c
--- squid-1.2.beta24/src/disk.c	Fri Aug 21 11:15:22 1998
+++ squid-BuGless/src/disk.c	Mon Aug 24 02:38:25 1998
@@ -275,9 +275,9 @@
         errcode = EFAULT;
     }
 #endif
-    safe_free(data);
+
     if (q == NULL)		/* Someone aborted then write completed */
-	return;
+	goto ret;
 
     if (len == -2 && errcode == -2) {	/* Write cancelled - cleanup */
         do {
@@ -314,6 +314,8 @@
              * repeated write failures for the same FD because of
              * the queued data.
              */
+	    if (data == q)
+		data = 0;
             do {
                 fdd->write_q = q->next;
                 if (q->free_func)
@@ -335,6 +337,8 @@
             fdd->write_q = q->next;
             if (q->free_func)
                 (q->free_func) (q->buf);
+	    if (data == q)
+		data = 0;
             safe_free(q);
         }
     }
@@ -371,11 +375,13 @@
 #ifdef OPTIMISTIC_IO
             F->flags.calling_io_handler = 0;
 #endif
-	    return;
+	    goto ret;
         }
     }
     if (do_close)
         file_close(fd);
+ret:
+    safe_free(data);
 }
 
 
********************************************************
Misc optimisation
********************************************************
diff -u -b -r squid-1.2.beta24/src/filemap.c squid-BuGless/src/filemap.c
--- squid-1.2.beta24/src/filemap.c	Wed Jul 22 22:37:19 1998
+++ squid-BuGless/src/filemap.c	Thu Jul 23 17:54:28 1998
@@ -115,7 +115,8 @@
     for (count = 0; count < fm->nwords; count++) {
         if (fm->file_map[word] != ALL_ONES)
             break;
-	word = (word + 1) % fm->nwords;
+	if (++word == fm->nwords)
+	    word = 0;
     }
     for (bit = 0; bit < BITS_IN_A_LONG; bit++) {
         suggestion = ((unsigned long) word << LONG_BIT_SHIFT) | bit;
********************************************************
Self explanatory?
********************************************************
diff -u -b -r squid-1.2.beta24/src/forward.c squid-BuGless/src/forward.c
--- squid-1.2.beta24/src/forward.c	Wed Aug 19 08:05:52 1998
+++ squid-BuGless/src/forward.c	Sat Aug 22 04:37:41 1998
@@ -59,7 +59,9 @@
     assert(e->mem_obj);
     if (e->store_status == STORE_PENDING) {
         if (e->mem_obj->inmem_hi == 0) {
+#if 0	/* SRB bogus assertion? */
             assert(fwdState->fail.err_code);
+#endif
             err = errorCon(fwdState->fail.err_code, fwdState->fail.http_code);
             err->request = requestLink(fwdState->request);
             err->xerrno = fwdState->fail.xerrno;
********************************************************
Better to reexec, than to die, the binary
might have been fixed (recompiled) in the mean time.
********************************************************
diff -u -b -r squid-1.2.beta24/src/main.c squid-BuGless/src/main.c
--- squid-1.2.beta24/src/main.c	Tue Aug 18 00:04:59 1998
+++ squid-BuGless/src/main.c	Sat Aug 22 03:32:31 1998
@@ -669,8 +671,11 @@
             failcount++;
         else
             failcount = 0;
-	if (failcount == 5)
-	    exit(1);
+	if (failcount >= 5) {
+	    extern char**environ;
+	    sleep(1);
+	    execve(argv[0],argv,environ);
+	}
         if (WIFEXITED(status))
             if (WEXITSTATUS(status) == 0)
                 exit(0);
********************************************************
This was needed, probably due to a check in storeComplete()
********************************************************
diff -u -b -r squid-1.2.beta24/src/mime.c squid-BuGless/src/mime.c
--- squid-1.2.beta24/src/mime.c	Fri Aug 21 05:15:18 1998
+++ squid-BuGless/src/mime.c	Sat Aug 22 03:32:31 1998
@@ -413,9 +413,9 @@
         storeAppend(e, buf, n);
     file_close(fd);
     storeSetPublicKey(e);
+    EBIT_SET(e->Sflag, ENTRY_SPECIAL);
     storeComplete(e);
     storeTimestampsSet(e);
-    EBIT_SET(e->flag, ENTRY_SPECIAL);
     debug(25, 3) ("Loaded icon %s\n", url);
     storeUnlockObject(e);
     memFree(MEM_4K_BUF, buf);
********************************************************
Fix the redirector interface:
- EAGAIN handling
- When all redirectors die, keep on going
- Terminate all redirector requests with two newlines,
  this allows for a more efficient lex-engine to be
  used as a redirector.
- Support the bhttp port differentiation
********************************************************
diff -u -b -r squid-1.2.beta24/src/redirect.c squid-BuGless/src/redirect.c
--- squid-1.2.beta24/src/redirect.c	Sat Jul 25 02:16:29 1998
+++ squid-BuGless/src/redirect.c	Thu Jul 30 11:13:50 1998
@@ -100,6 +100,9 @@
     debug(29, 5) ("redirectHandleRead: %d bytes from Redirector #%d.\n",
         len, redirector->index + 1);
     if (len <= 0) {
+	if (len < 0 && errno == EAGAIN)
+	    len = 0;
+	else {
         if (len < 0)
             debug(50, 1) ("redirectHandleRead: FD %d read: %s\n", fd, xstrerror());
         debug(29, EBIT_TEST(redirector->flags, HELPER_CLOSING) ? 5 : 1)
@@ -110,10 +113,11 @@
         redirector->inbuf = NULL;
         comm_close(fd);
         if (--NRedirectorsOpen == 0 && !shutting_down)
-	    fatal_dump("All redirectors have exited!");
+	        debug(50, 0) ("All redirectors have exited!");
         return;
     }
-    if (len != 1)
+    }
+    if (len > 1)
         RedirectStats.rewrites[redirector->index]++;
     redirector->offset += len;
     redirector->inbuf[redirector->offset] = '\0';
@@ -141,7 +145,7 @@
              * be NULL */
             if (r->handler) {
                 r->handler(r->data,
-		    t == redirector->inbuf ? NULL : redirector->inbuf);
+		    *redirector->inbuf ? redirector->inbuf : NULL);
             }
             redirectStateFree(r);
             redirector->redirectState = NULL;
@@ -227,7 +231,7 @@
     if ((fqdn = fqdncache_gethostbyaddr(r->client_addr, 0)) == NULL)
         fqdn = dash_str;
     buf = memAllocate(MEM_8K_BUF);
-    snprintf(buf, 8192, "%s %s/%s %s %s\n",
+    snprintf(buf, 8192, "%s %s/%s %s %s\n\n",
         r->orig_url,
         inet_ntoa(r->client_addr),
         fqdn,
@@ -261,14 +265,17 @@
     if (!handler)
         fatal_dump("redirectStart: NULL handler");
     debug(29, 5) ("redirectStart: '%s'\n", http->uri);
-    if (Config.Program.redirect == NULL) {
+    if (!NRedirectorsOpen) {
         handler(data, NULL);
         return;
     }
     r = xcalloc(1, sizeof(redirectStateData));
     r->orig_url = xstrdup(http->uri);
     r->client_addr = conn->log_addr;
-    if (conn->ident.ident == NULL || *conn->ident.ident == '\0') {
+    /*srb*/
+    if (ntohs(conn->me.sin_port)==Config.Port.bhttp) {
+	r->client_ident = "B";
+    } else if (conn->ident.ident == NULL || *conn->ident.ident == '\0') {
         r->client_ident = dash_str;
     } else {
         r->client_ident = conn->ident.ident;
********************************************************
Missing argument; why I am the only one seeing this
problem?
********************************************************
diff -u -b -r squid-1.2.beta24/src/tools.c squid-BuGless/src/tools.c
--- squid-1.2.beta24/src/tools.c	Sat Jul 25 06:47:29 1998
+++ squid-BuGless/src/tools.c	Mon Aug 24 11:18:19 1998
@@ -49,7 +49,7 @@
 static void fatalvf(const char *fmt, va_list args);
 static void mail_warranty(void);
 #if USE_ASYNC_IO
-static void safeunlinkComplete(void *data, int retcode, int errcode);
+static void safeunlinkComplete(int fd, void *data, int retcode, int errcode);
 #endif
 #if MEM_GEN_TRACE
 extern void log_trace_done();
@@ -446,7 +446,7 @@
 
 #if USE_ASYNC_IO
 static void
-safeunlinkComplete(void *data, int retcode, int errcode)
+safeunlinkComplete(int fd, void *data, int retcode, int errcode)
 {
     char *s = data;
     if (retcode < 0) {
-- 
Sincerely,                                                          srb@cuci.nl
           Stephen R. van den Berg (AKA BuGless).
This signature third word omitted, yet is comprehensible.
Received on Tue Jul 29 2003 - 13:15:52 MDT
This archive was generated by hypermail pre-2.1.9 : Tue Dec 09 2003 - 16:11:52 MST