socsvn commit: r255630 - in soc2013/dpl/head/lib/libzcap: . zlibworker

dpl at FreeBSD.org dpl at FreeBSD.org
Wed Aug 7 08:28:58 UTC 2013


Author: dpl
Date: Wed Aug  7 08:28:57 2013
New Revision: 255630
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=255630

Log:
  Added some commands. Right now, we sill have to finish with the gz comands, deflate()/inflate().
  Also the we'll have to work on the advanced functions of the library.
  

Modified:
  soc2013/dpl/head/lib/libzcap/adler32.c
  soc2013/dpl/head/lib/libzcap/commands.c
  soc2013/dpl/head/lib/libzcap/commands.h
  soc2013/dpl/head/lib/libzcap/crc32.c
  soc2013/dpl/head/lib/libzcap/gzlib.c
  soc2013/dpl/head/lib/libzcap/zlibworker/comands.c
  soc2013/dpl/head/lib/libzcap/zlibworker/zlibworker.c

Modified: soc2013/dpl/head/lib/libzcap/adler32.c
==============================================================================
--- soc2013/dpl/head/lib/libzcap/adler32.c	Wed Aug  7 07:44:13 2013	(r255629)
+++ soc2013/dpl/head/lib/libzcap/adler32.c	Wed Aug  7 08:28:57 2013	(r255630)
@@ -68,10 +68,10 @@
     const Bytef *buf;
     uInt len;
 {
-	/* Send packets of 1MB size at most. */
-	if ((sizeof(*buf)*len) > (1024*1024)) {
- 		while( (len -= (1024*1024)) > 0) {
- 			buf += (1024*1024)/sizeof(*buf);
+	/* Send packets of 100kb size at most. */
+	if ((sizeof(*buf)*len) > (100*1024)) {
+ 		while( (len -= (100*1024)) > 0) {
+ 			buf += (100*1024)/sizeof(*buf);
 			adler = zcapcmd_adler32(adler, buf, len);
 		}
 	} else {

Modified: soc2013/dpl/head/lib/libzcap/commands.c
==============================================================================
--- soc2013/dpl/head/lib/libzcap/commands.c	Wed Aug  7 07:44:13 2013	(r255629)
+++ soc2013/dpl/head/lib/libzcap/commands.c	Wed Aug  7 08:28:57 2013	(r255630)
@@ -40,10 +40,8 @@
 extern nvlist_t *sendCommand(nvlist_t *);
 
 uLong
-zcapcmd_compressBound( adler1, adler2, len2 )
-	uLong adler1;
-	uLong adler2;
-	z_off_t len2;
+zcapcmd_compressBound(sourceLen)
+	uLong sourceLen;
 {
 	nvlist_t *nvl, *args, *result;
 	uLong ret;
@@ -57,9 +55,128 @@
 		return (NULL);
 	}
 	nvlist_add_number(nvl, "command", ZCAPCMD_COMPRESSBOUND);
-	nvlist_add_number(args, "adler2", adler2);
-	nvlist_add_number(args, "adler2", adler2);
-	nvlist_add_number(args, "len2", len2);
+	nvlist_add_number(args, "sourceLen", sourceLen);
+	nvlist_add_nvlist(nvl, "args", args);
+
+	result = sendCommand(nvl);
+
+	int ret = nvlist_take_number(result, "result");
+	nvlist_destroy(result);
+	return(ret);
+}
+
+gzFile
+zcapcmd_gzopen(path, fd, mode)
+    const char *path;
+    int fd;
+    const char *mode;
+{
+	nvlist_t *nvl, *args, *result;
+	
+	if (pid == 0)
+		startChild();
+
+	if( (args = nvlist_create(0)) == NULL ||
+		(nvl = nvlist_create(0)) == NULL ) {
+		perror("nvlist_create");
+		return (NULL);
+	}
+	nvlist_add_number(nvl, "command", ZCAPCMD_GZOPEN);
+	nvlist_add_string(args, "path", path);
+	nvlist_move_descriptor(args, "fd", fd);
+	nvlist_add_string(args, "mode", mode);
+	nvlist_add_nvlist(nvl, "args", args);
+
+	result = sendCommand(nvl);
+
+	void *mem = malloc(sizeof(gzFile_s));
+	memcpy(mem,
+			nvlist_take_binary(result, "result", sizeof(gzFile_s)),
+			sizeof(gzFile_s));
+	nvlist_destroy(result);
+	return(mem);
+}
+
+int
+zcapcmd_gzbuffer(file, size)
+    gzFile file;
+    unsigned size;
+{
+	nvlist_t *nvl, *args, *result;
+	
+	if (pid == 0)
+		startChild();
+
+	if( (args = nvlist_create(0)) == NULL ||
+		(nvl = nvlist_create(0)) == NULL ) {
+		perror("nvlist_create");
+		return (NULL);
+	}
+	nvlist_add_number(nvl, "command", ZCAPCMD_GZBUFFER);
+	nvlist_add_binary(args, "file", file, sizeof(gzFile_s));
+	nvlist_add_number(args, "size", size);
+	nvlist_add_nvlist(nvl, "args", args);
+
+	result = sendCommand(nvl);
+
+	int ret = nvlist_take_number(result, "result");
+	nvlist_destroy(result);
+	return(ret);
+}
+
+int
+zcapcmd_gzsetparams(file, level, strategy)
+    gzFile file;
+    int level;
+    int strategy;
+{
+	nvlist_t *nvl, *args, *result;
+	
+	if (pid == 0)
+		startChild();
+
+	if( (args = nvlist_create(0)) == NULL ||
+		(nvl = nvlist_create(0)) == NULL ) {
+		perror("nvlist_create");
+		return (NULL);
+	}
+	nvlist_add_number(nvl, "command", ZCAPCMD_GZSETPARAMS);
+	nvlist_add_binary(args, "file", file, sizeof(gzFile_s));
+	nvlist_add_number(args, "level", level);
+	nvlist_add_number(args, "strategy", strategy);
+	nvlist_add_nvlist(nvl, "args", args);
+
+	result = sendCommand(nvl);
+
+	int ret = nvlist_take_number(result, "result");
+	nvlist_destroy(result);
+	return(ret);
+}
+
+/* XXX
+zcapcmd_gzread(file, s);
+zcapcmd_gzwrite(file, s);
+zcapcmd_gzprintf(file, s);
+*/
+
+int
+zcapcmd_gzputs(file, s)
+    gzFile file;
+    const char *s;
+{
+	nvlist_t *nvl, *args, *result;
+	
+	if (pid == 0)
+		startChild();
+
+	if( (args = nvlist_create(0)) == NULL ||
+		(nvl = nvlist_create(0)) == NULL ) {
+		perror("nvlist_create");
+		return (NULL);
+	}
+	nvlist_add_number(nvl, "command", ZCAPCMD_GZPUTS);
+	nvlist_add_binary(args, "file", file, sizeof(gzFile_s));
+	nvlist_add_string(args, "s", s);
 	nvlist_add_nvlist(nvl, "args", args);
 
 	result = sendCommand(nvl);
@@ -69,6 +186,61 @@
 	return(ret);
 }
 
+/* XXX */
+char *
+zcapcmd_gzgets(file, s)
+    gzFile file;
+    const char *s;
+{
+	nvlist_t *nvl, *args, *result;
+	
+	if (pid == 0)
+		startChild();
+
+	if( (args = nvlist_create(0)) == NULL ||
+		(nvl = nvlist_create(0)) == NULL ) {
+		perror("nvlist_create");
+		return (NULL);
+	}
+	nvlist_add_number(nvl, "command", ZCAPCMD_GZGETS);
+	nvlist_add_binary(args, "file", file, sizeof(gzFile_s));
+	nvlist_add_string(args, "s", s);
+	nvlist_add_nvlist(nvl, "args", args);
+
+	result = sendCommand(nvl);
+
+	char *ret = nvlist_take_string(result, "result");
+	nvlist_destroy(result);
+	return(ret);
+}
+
+int
+zcapcmd_gzputc(file, c)
+    gzFile file;
+    int c;
+{
+	nvlist_t *nvl, *args, *result;
+	
+	if (pid == 0)
+		startChild();
+
+	if( (args = nvlist_create(0)) == NULL ||
+		(nvl = nvlist_create(0)) == NULL ) {
+		perror("nvlist_create");
+		return (NULL);
+	}
+	nvlist_add_number(nvl, "command", ZCAPCMD_GZPUTC);
+	nvlist_add_binary(args, "file", file, sizeof(gzFile_s));
+	nvlist_add_number(args, "c", c);
+	nvlist_add_nvlist(nvl, "args", args);
+
+	result = sendCommand(nvl);
+
+	int ret = nvlist_take_number(result, "result");
+	nvlist_destroy(result);
+	return(ret);
+}
+
 uLong
 zcapcmd_adler32(adler, buf, len)
 	uLong adler;

Modified: soc2013/dpl/head/lib/libzcap/commands.h
==============================================================================
--- soc2013/dpl/head/lib/libzcap/commands.h	Wed Aug  7 07:44:13 2013	(r255629)
+++ soc2013/dpl/head/lib/libzcap/commands.h	Wed Aug  7 08:28:57 2013	(r255630)
@@ -46,7 +46,7 @@
 #define ZCAPCMD_COMPRESSBOUND		30
 
 /* gzip file access functions */
-#define ZCAPCMD_GZ_OPEN				32
+#define ZCAPCMD_GZOPEN				32
 #define ZCAPCMD_GZBUFFER				34
 #define ZCAPCMD_GZSETPARAMS			35
 #define ZCAPCMD_GZREAD				36

Modified: soc2013/dpl/head/lib/libzcap/crc32.c
==============================================================================
--- soc2013/dpl/head/lib/libzcap/crc32.c	Wed Aug  7 07:44:13 2013	(r255629)
+++ soc2013/dpl/head/lib/libzcap/crc32.c	Wed Aug  7 08:28:57 2013	(r255630)
@@ -209,10 +209,10 @@
 {
     if (buf == Z_NULL) return 0UL;
 
-	/* Send packets of 1MB size at most. */
-	if ((sizeof(*buf)*len) > (1024*1024)) {
- 		while( (len -= (1024*1024)) > 0) {
- 			buf += (1024*1024)/sizeof(*buf);
+	/* Send packets of 100kb size at most. */
+	if ((sizeof(*buf)*len) > (100*1024)) {
+ 		while( (len -= (100*1024)) > 0) {
+ 			buf += (100*1024)/sizeof(*buf);
 			crc = zcapcmd_crc32(crc, buf, len);
 		}
 	} else {

Modified: soc2013/dpl/head/lib/libzcap/gzlib.c
==============================================================================
--- soc2013/dpl/head/lib/libzcap/gzlib.c	Wed Aug  7 07:44:13 2013	(r255629)
+++ soc2013/dpl/head/lib/libzcap/gzlib.c	Wed Aug  7 08:28:57 2013	(r255630)
@@ -275,7 +275,46 @@
     const char *path;
     const char *mode;
 {
-    return gz_open(path, -1, mode);
+	int oflag = 0;
+	for( int i = 0; i < strlen(mode); ++i){
+		switch (mode[i]){
+#ifndef NO_GZCOMPRESS
+			case('w'):
+				oflag |= O_WRONLY|O_CREAT|O_TRUNC;
+				break;
+			case('a'):
+				oflag |= O_WRONLY|O_CREAT|O_APPEND;
+				break;
+#endif
+			case('r'):
+				oflag |= O_RDONLY;
+				break;
+#ifdef O_CLOEXEC
+			case('e'):
+				oflag |= O_CLOEXEC;
+				break;
+#endif
+#ifdef O_EXCL
+			case('x'):
+				oflag |= O_EXCL;
+				break;
+#endif
+			case('+'):
+				/* Not accepted by gzopen */
+				oflag |= O_RDONLY;
+				break;
+			default:
+				;
+		}
+	}
+#ifdef O_LARGEFILE
+	oflag |= O_LARGEFILE;
+#endif
+#ifdef O_BINARY
+	oflag |= O_BINARY;
+#endif
+
+    return gzdopen(open(path, oflag), mode);
 }
 
 /* -- see zlib.h -- */
@@ -287,6 +326,7 @@
 }
 
 /* -- see zlib.h -- */
+extern gzFile zcapcmd_gz_open(const char *path, int fd, const char *mode);
 gzFile ZEXPORT gzdopen(fd, mode)
     int fd;
     const char *mode;
@@ -301,7 +341,7 @@
 #else
     sprintf(path, "<fd:%d>", fd);   /* for debugging */
 #endif
-    gz = gz_open(path, fd, mode);
+    gz = zcapcmd_gz_open(path, fd, mode);
     free(path);
     return gz;
 }
@@ -317,28 +357,12 @@
 #endif
 
 /* -- see zlib.h -- */
+extern gzFile zcapcmd_gz_open(gzFile file, unsigned size);
 int ZEXPORT gzbuffer(file, size)
     gzFile file;
     unsigned size;
 {
-    gz_statep state;
-
-    /* get internal structure and check integrity */
-    if (file == NULL)
-        return -1;
-    state = (gz_statep)file;
-    if (state->mode != GZ_READ && state->mode != GZ_WRITE)
-        return -1;
-
-    /* make sure we haven't already allocated memory */
-    if (state->size != 0)
-        return -1;
-
-    /* check and set requested size */
-    if (size < 2)
-        size = 2;               /* need two bytes to check magic header */
-    state->want = size;
-    return 0;
+	return zcapcmd_gzbuffer(file, size);
 }
 
 /* -- see zlib.h -- */

Modified: soc2013/dpl/head/lib/libzcap/zlibworker/comands.c
==============================================================================
--- soc2013/dpl/head/lib/libzcap/zlibworker/comands.c	Wed Aug  7 07:44:13 2013	(r255629)
+++ soc2013/dpl/head/lib/libzcap/zlibworker/comands.c	Wed Aug  7 08:28:57 2013	(r255630)
@@ -7,77 +7,125 @@
 void
 zcapcmd_compressBound(nvlist_t * nvl, nvlist_t * result)
 {
-	uLong ret = 0;
+	uLong ret = -1;
+
 	if ((args = nvlist_take_nvlist(nvl, "args")) == NULL)
-		ret = -1;
+		 ret = compressBound(
+		 		nvlist_take_number(args, "sourceLen")
+		 	);
+	nvlist_add_number(result, "result", ret );
+}
 
-	uLong sourceLen = nvlist_take_number(args, "sourceLen");
+void
+zcapcmd_gzopen(nvlist_t * nvl, nvlist_t * result)
+{
+	void *ret = NULL;
 
-	if (ret != -1 )
-		 ret = compressBound(sourceLen);
-	nvlist_add_number(result, "result", ret );
+	if ((args = nvlist_take_nvlist(nvl, "args")) != NULL)
+		ret = gzdopen(
+				nvlist_take_string(args, "path"),
+				nvlist_take_descriptor(args, "fd"),
+				nvlist_take_string(args, "mode")
+			);
+
+	nvlist_add_binary(result, "result", *ret, sizeof(gzFile_s));
 }
 
 void
-zcapcmd_adler32(nvlist_t * nvl, nvlist_t * result)
+zcapcmd_gzbuffer(nvlist_t * nvl, nvlist_t * result)
 {
-	uLong ret = 0;
-	if ((args = nvlist_take_nvlist(nvl, "args")) == NULL)
-		ret = -1;
+	int ret = -1;
 
-	uLong adler1 = nvlist_take_number(args, "adler");
-	size_t len = nvlist_take_number(args, "len");
-	Bytef buf = nvlist_take_binary(args, "buf", &len);
+	if ((args = nvlist_take_nvlist(nvl, "args")) != NULL)
+		ret = gzbuffer(
+				nvlist_take_binary(args, "file", sizeof(gzFile_s)),
+				nvlist_take_number(args, "size")
+			);
 
-	if (ret != -1)
-		ret = adler32_combine(adler, &buf, len2);
-	nvlist_add_number(result, "result", ret );
+	nvlist_add_number(result, "result", ret);
 }
 
 void
-zcapcmd_adler32_combine(nvlist_t * nvl, nvlist_t * result)
+zcapcmd_gzsetparams(nvlist_t * nvl, nvlist_t * result)
 {
-	uLong ret = 0;
-	if ((args = nvlist_take_nvlist(nvl, "args")) == NULL)
-		ret = -1;
+	int ret = -1;
+
+	if ((args = nvlist_take_nvlist(nvl, "args")) != NULL)
+		ret = gzsetparams(
+				nvlist_take_binary(args, "file", sizeof(gzFile_s)),
+				nvlist_take_number(args, "level"),
+				nvlist_take_number(args, "strategy")
+			);
+
+	nvlist_add_number(result, "result", ret);
+}
+
+void
+zcapcmd_gzputs(nvlist_t * nvl, nvlist_t * result)
+{
+	int ret = -1;
+
+	if ((args = nvlist_take_nvlist(nvl, "args")) != NULL)
+		ret = gzputs(
+				nvlist_take_binary(args, "file", sizeof(gzFile_s)),
+				nvlist_take_string(args, "s")
+			);
 
-	uLong adler1 = nvlist_take_number(args, "adler1");
-	uLong adler2 = nvlist_take_number(args, "adler2");
-	uLong len2 = nvlist_take_number(args, "len2");
+	nvlist_add_number(result, "result", ret);
+}
 
-	if (ret != -1)
-		ret = adler32_combine(adler1, adler2, len2);
+void
+zcapcmd_adler32(nvlist_t * nvl, nvlist_t * result)
+{
+	uLong ret = -1;
+
+	if ((args = nvlist_take_nvlist(nvl, "args")) != NULL)
+		ret = adler32_combine(
+				nvlist_take_number(args, "adler"),
+				nvlist_take_number(args, "len"),
+				nvlist_take_binary(args, "buf", &len)
+			);
 	nvlist_add_number(result, "result", ret );
 }
 
 void
-zcapcmd_crc32(nvlist_t * nvl, nvlist_t * result)
+zcapcmd_adler32_combine(nvlist_t * nvl, nvlist_t * result)
 {
-	uLong ret = 0;
-	if ((args = nvlist_take_nvlist(nvl, "args")) == NULL)
-		ret = -1;
+	uLong ret = -1;
 
-	uLong adler1 = nvlist_take_number(args, "adler");
-	size_t len = nvlist_take_number(args, "len");
-	Bytef buf = nvlist_take_binary(args, "buf", &len);
+	if ((args = nvlist_take_nvlist(nvl, "args")) != NULL)
+		ret = adler32_combine(
+			nvlist_take_number(args, "adler1"),
+			nvlist_take_number(args, "adler2"),
+			nvlist_take_number(args, "len2")
+		);
+	nvlist_add_number(result, "result", ret );
+}
 
-	if (ret != -1)
-		ret = adler32_combine(adler, &buf, len2);
+void
+zcapcmd_crc32(nvlist_t * nvl, nvlist_t * result)
+{
+	uLong ret = -1;
+	
+	if ((args = nvlist_take_nvlist(nvl, "args")) != NULL)
+		ret = adler32_combine(
+			nvlist_take_number(args, "adler"),
+			nvlist_take_number(args, "len"),
+			nvlist_take_binary(args, "buf", &len)
+		);
 	nvlist_add_number(result, "result", ret );
 }
 
 void
 zcapcmd_crc32_combine(nvlist_t * nvl, nvlist_t * result)
 {
-	uLong ret = 0;
-	if ((args = nvlist_take_nvlist(nvl, "args")) == NULL)
-		ret = -1;
-
-	uLong adler1 = nvlist_take_number(args, "crc1");
-	uLong adler2 = nvlist_take_number(args, "crc2");
-	uLong len2 = nvlist_take_number(args, "len2");
+	uLong ret = -1;
 
-	if (ret != -1 )
-		 ret = crc32_combine(adler1, adler2, len2);
+	if ((args = nvlist_take_nvlist(nvl, "args")) != NULL)
+		 ret = crc32_combine(
+		 	nvlist_take_number(args, "crc1"),
+		 	nvlist_take_number(args, "crc2"),
+		 	nvlist_take_number(args, "len2")
+		);
 	nvlist_add_number(result, "result", ret );
 }
\ No newline at end of file

Modified: soc2013/dpl/head/lib/libzcap/zlibworker/zlibworker.c
==============================================================================
--- soc2013/dpl/head/lib/libzcap/zlibworker/zlibworker.c	Wed Aug  7 07:44:13 2013	(r255629)
+++ soc2013/dpl/head/lib/libzcap/zlibworker/zlibworker.c	Wed Aug  7 08:28:57 2013	(r255630)
@@ -5,15 +5,17 @@
 #include <stdio.h>
 #include "../commands.h"
 
-extern void zcapcmd_compressBound(nvlist_t * args, nvlist_t * result);
-extern void zcapcmd_adler32_combine(nvlist_t * args, nvlist_t * result);
-extern void zcapcmd_crc32_combine(nvlist_t * args, nvlist_t * result);
+extern void zcapcmd_compressBound(nvlist_t * nvl, nvlist_t * result);
+extern void zcapcmd_adler32_combine(nvlist_t * nvl, nvlist_t * result);
+extern void zcapcmd_crc32_combine(nvlist_t * nvl, nvlist_t * result);
+extern void zcapcmd_gzopen(nvlist_t * nvl, nvlist_t * result);
 
 int
 main()
 {
 	nvlist_t *nvl, *args, *result;
 
+	/* Sandbox the process */
 	cap_enter();
 
 	if ((result = nvlist_create(0)) == NULL)
@@ -29,7 +31,76 @@
 		// Get args, and call the real lib.
 		switch( nvlist_take_number(nvl, "command") ){
 			case (ZCAPCMD_COMPRESSBOUND):
-				zcapcmd_adler32_combine(nvl, result);
+				zcapcmd_compressBound(nvl, result);
+				break;
+			case (ZCAPCMD_GZOPEN):
+				zcapcmd_gzopen(nvl, result);
+				break;
+			case (ZCAPCMD_GZBUFFER):
+				zcapcmd_gzbuffer(nvl, result);
+				break;
+			case (ZCAPCMD_GZSETPARAMS):
+				zcapcmd_gzsetparams(nvl, result);
+				break;
+			case (ZCAPCMD_GZREAD):
+				zcapcmd_gzread(nvl, result);
+				break;
+			case (ZCAPCMD_GZWRITE):
+				zcapcmd_gzwrite(nvl, result);
+				break;
+			case (ZCAPCMD_GZPRINTF):
+				zcapcmd_gzprintf(nvl, result);
+				break;
+			case (ZCAPCMD_GZPUTS):
+				zcapcmd_gzputs(nvl, result);
+				break;
+			case (ZCAPCMD_GZGETS):
+				zcapcmd_gzgets(nvl, result);
+				break;
+			case (ZCAPCMD_GZPUTC):
+				zcapcmd_gzputc(nvl, result);
+				break;
+			case (ZCAPCMD_GZGETC):
+				zcapcmd_gzgetc(nvl, result);
+				break;
+			case (ZCAPCMD_GZUNGET):
+				zcapcmd_gzunget(nvl, result);
+				break;
+			case (ZCAPCMD_GZFLUSH):
+				zcapcmd_gzflush(nvl, result);
+				break;
+			case (ZCAPCMD_GZSEEK):
+				zcapcmd_gzseek(nvl, result);
+				break;
+			case (ZCAPCMD_GZREWIND):
+				zcapcmd_gzrewind(nvl, result);
+				break;
+			case (ZCAPCMD_GZTELL):
+				zcapcmd_gztell(nvl, result);
+				break;
+			case (ZCAPCMD_GZOFFSET):
+				zcapcmd_gzoffset(nvl, result);
+				break;
+			case (ZCAPCMD_GZEOF):
+				zcapcmd_gzeof(nvl, result);
+				break;
+			case (ZCAPCMD_GZDIRECT):
+				zcapcmd_gzdirect(nvl, result);
+				break;
+			case (ZCAPCMD_GZBUFFER):
+				zcapcmd_gzbuffer(nvl, result);
+				break;
+			case (ZCAPCMD_GZCLOSE_R):
+				zcapcmd_gzclose_r(nvl, result);
+				break;
+			case (ZCAPCMD_GZCLOSE_W):
+				zcapcmd_gzclose_w(nvl, result);
+				break;
+			case (ZCAPCMD_GZERROR):
+				zcapcmd_gzerror(nvl, result);
+				break;
+			case (ZCAPCMD_GZCLEARERR):
+				zcapcmd_gzclearerr(nvl, result);
 				break;
 			case (ZCAPCMD_ADLER32):
 				zcapcmd_adler32(nvl, result);


More information about the svn-soc-all mailing list