Sophie

Sophie

distrib > Mandriva > 2010.1 > x86_64 > media > contrib-release-src > by-pkgid > 489b8619768ea88e0ce199f78331034d > files > 10

links-2.2-7mdv2010.1.src.rpm

--- links-2.1pre31/configure.in.gzip	2007-12-09 16:36:20.000000000 +0800
+++ links-2.1pre31/configure.in	2007-12-09 16:36:47.000000000 +0800
@@ -231,6 +231,10 @@
 AC_CHECK_FUNC(herror, AC_DEFINE(HAVE_HERROR))
 AC_CHECK_FUNC(cfmakeraw, AC_DEFINE(HAVE_CFMAKERAW))
 
+# GZIP patch
+AC_CHECK_LIB(z,gzread)
+###
+
 AC_HAVE_FUNCS(cygwin_conv_to_full_win32_path)
 
 AC_MSG_CHECKING([for requested debug level])
--- links-2.1pre31/file.c.gzip	2007-12-09 16:36:57.000000000 +0800
+++ links-2.1pre31/file.c	2007-12-09 16:37:13.000000000 +0800
@@ -365,22 +365,85 @@
 		add_to_str(&file, &fl, "</pre></body></html>\n");
 		head = stracpy("\r\nContent-Type: text/html\r\n");
 	} else {
-		mem_free(name);
-		/* + !stt.st_size is there because of bug in Linux. Read returns
-		   -EACCES when reading 0 bytes to invalid address */
-		if (stt.st_size > MAXINT) {
+
+/* GZIP patch */
+#ifdef HAVE_LIBZ
+		if (!casecmp(name + (strlen(name) - 3), ".gz", 3)) {
+			unsigned char *tmp;
+			int pos, len, tlen;
+			gzFile filegz;
+
+			filegz = gzdopen (h, "rb");
+
+			if (!filegz) {
+				mem_free(name);
+				close(h);
+				setcstate(c, S_CANT_READ);
+				abort_connection(c);
+				return;
+			}
+			
+			mem_free(name);
+			file = mem_alloc(BUFSIZ);
+			
+			if (!file) {
+				close(h);
+				setcstate(c, S_OUT_OF_MEM);
+				abort_connection(c);
+				return;
+			}
+
+			pos  = 0;
+			tlen = 0;
+			while (1) {
+				len = gzread(filegz, file + pos, BUFSIZ); 
+				
+				if (len < 0) {
+					close(h);
+					setcstate(c, S_CANT_READ);
+					abort_connection(c);
+					mem_free(file);
+					return;
+				}
+
+				if (!len) break;
+				
+				tlen += len;
+				pos  += BUFSIZ;
+				tmp = mem_realloc(file, pos + BUFSIZ);
+				
+				if (!tmp) {
+					close(h);
+					setcstate(c, S_OUT_OF_MEM);
+					abort_connection(c);
+					mem_free(file);
+					return;
+				}
+				
+				file = tmp;
+			}
 			close(h);
-			setcstate(c, S_LARGE_FILE); abort_connection(c);
-			return;
-		}
-		file = mem_alloc(stt.st_size + !stt.st_size);
-		if ((r = read(h, file, stt.st_size)) != stt.st_size) {
-			mem_free(file); close(h);
-			setcstate(c, r == -1 ? -errno : S_FILE_ERROR);
-			abort_connection(c); return;
+			fl = tlen;
+		} else {
+#endif /* end GZIP PATCH */
+
+			mem_free(name);
+			/* + !stt.st_size is there because of bug in Linux. Read returns
+			   -EACCES when reading 0 bytes to invalid address */
+			if (stt.st_size > MAXINT) {
+				close(h);
+				setcstate(c, S_OUT_OF_MEM); abort_connection(c);
+				return;
+			}
+			file = mem_alloc(stt.st_size + !stt.st_size);
+			if ((r = read(h, file, stt.st_size)) != stt.st_size) {
+				mem_free(file); close(h);
+				setcstate(c, r == -1 ? -errno : S_FILE_ERROR);
+				abort_connection(c); return;
+			}
+			close(h);
+			fl = stt.st_size;
 		}
-		close(h);
-		fl = stt.st_size;
 		head = stracpy("");
 	}
 	if (get_cache_entry(c->url, &e)) {
--- links-2.1pre31/links.h.gzip	2007-12-09 16:34:22.000000000 +0800
+++ links-2.1pre31/links.h	2007-12-09 16:34:42.000000000 +0800
@@ -159,6 +159,10 @@
 #endif /* #if defined(G) */
 
 #include <termios.h>
+/* GZIP patch */
+#ifdef HAVE_LIBZ
+#include <zlib.h>
+#endif /* end GZIP patch */
 
 #ifdef HAVE_LONG_LONG
 #define longlong long long
--- links-2.1pre31/types.c.gzip	2007-12-09 16:34:48.000000000 +0800
+++ links-2.1pre31/types.c	2007-12-09 16:36:10.000000000 +0800
@@ -820,6 +820,16 @@
 			ext = NULL;
 		}
 	if (ext) while (ext[extl] && ext[extl] != '.' && !dir_sep(ext[extl]) && !end_of_dir(url, ext[extl])) extl++;
+
+/* GZIP patch */
+#ifdef HAVE_LIBZ
+	if (extl == 2 && ! casecmp(ext, "gz", 2)) {
+	    if (!casecmp(url + (strlen(url) - 7), ".htm", 4) ||
+		!casecmp(url + (strlen(url) - 8), ".html", 5))
+		return stracpy("text/html");
+	}
+#endif /* end GZIP patch */
+
 	if ((extl == 3 && !casecmp(ext, "htm", 3)) ||
 	    (extl == 4 && !casecmp(ext, "html", 4))) return stracpy("text/html");
 	foreach(e, extensions) {