Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 29 Aug 2013 15:57:15 GMT
From:      dpl@FreeBSD.org
To:        svn-soc-all@FreeBSD.org
Subject:   socsvn commit: r256694 - soc2013/dpl/head/lib/libzcap/zlibworker
Message-ID:  <201308291557.r7TFvFOd045271@socsvn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: dpl
Date: Thu Aug 29 15:57:15 2013
New Revision: 256694
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=256694

Log:
  Made zlibworker.c a little more more style(9)ish.
  Now we have to use the correct data structures, and not those in zlib.h if we want this to work.
  

Added:
  soc2013/dpl/head/lib/libzcap/zlibworker/commands.h
Modified:
  soc2013/dpl/head/lib/libzcap/zlibworker/commands.c
  soc2013/dpl/head/lib/libzcap/zlibworker/zlibworker.c

Modified: soc2013/dpl/head/lib/libzcap/zlibworker/commands.c
==============================================================================
--- soc2013/dpl/head/lib/libzcap/zlibworker/commands.c	Thu Aug 29 15:06:01 2013	(r256693)
+++ soc2013/dpl/head/lib/libzcap/zlibworker/commands.c	Thu Aug 29 15:57:15 2013	(r256694)
@@ -1,12 +1,14 @@
-#include "../commands.h"
-/* We need the internal_state structs */
-#include "../deflate.h"
-#include <zlib.h>
+#include <err.h>
 #include <nv.h>
-
 #include <stdlib.h>
 #include <string.h>
-#include <err.h>
+#include <zlib.h>
+
+#include "commands.h"
+/* XXX */
+/* We need to keep all the recieved structs in an array, to store them safely */
+struct gzFile_s **gzContainer = malloc(5 * sizseof(struct gzFile_s**));
+z_stream **streamContainer = malloc(5 * sizseof(struct gzFile_s**));
 
 nvlist_t * args;
 extern int zero;
@@ -15,6 +17,10 @@
 size_t gzsize = sizeof(struct gzFile_s);
 size_t zstreamsize = sizeof(z_stream);
 
+/*
+ * All the functions in this file implement its related
+ * zlib functions.
+ */
 
 /* Basic functions */
 void
@@ -27,16 +33,16 @@
 	if ((stream = malloc(zstreamsize)) == NULL)
 		err(1, "deflateInit: Can't allocate memory");
 
-	zstrmtemp = (z_streamp)nvlist_take_binary(args, "strm", &zstreamsize);
+	zstrmtemp = (z_streamp)nvlist_get_binary(args, "strm", &zstreamsize);
 	memcpy(stream, zstrmtemp , zstreamsize);
 	ret = deflateInit2_(stream,
-	 		nvlist_take_number(args, "level"),
-	 		nvlist_take_number(args, "method"),
-	 		nvlist_take_number(args, "windowBits"),
-	 		nvlist_take_number(args, "memLevel"),
-	 		nvlist_take_number(args, "strategy"),
-	 		nvlist_take_string(args, "version"),
-	 		nvlist_take_number(args, "stream_size")
+	 		nvlist_get_number(args, "level"),
+	 		nvlist_get_number(args, "method"),
+	 		nvlist_get_number(args, "windowBits"),
+	 		nvlist_get_number(args, "memLevel"),
+	 		nvlist_get_number(args, "strategy"),
+	 		nvlist_get_string(args, "version"),
+	 		nvlist_get_number(args, "stream_size")
 	 );
 
 	nvlist_add_number(result, "result", ret);
@@ -57,14 +63,16 @@
 	z_streamp zstrmtemp;
 
 	/* We save the z_stream into memory. */
-	zstrmtemp = (z_streamp)nvlist_take_binary(args, "strm", &zstreamsize);
+	zstrmtemp = (z_streamp)nvlist_get_binary(args, "strm", &zstreamsize);
 	fprintf(stderr, "zlibworker: zcapcmd_deflateEnd: zstrmtemp: %p\n", zstrmtemp);
 	ret = deflateEnd(zstrmtemp);
 	fprintf(stderr, "zlibworker: zcapcmd_deflateEnd: ret: %lu\n", ret);
 
 	nvlist_add_number(result, "result", ret );
 	nvlist_add_binary(result, "newstrm", zstrmtemp, zstreamsize);
-	free(zstrmtemp->state->strm);
+	/* XXX */
+	/* The first element of state is a pointer that points back to the strm */
+	free(*(zstrmtemp->state);
 }
 
 void
@@ -77,12 +85,12 @@
 	if ((stream = malloc(zstreamsize)) == NULL)
 		err(1, "deflateInit: Can't allocate memory");
 
-	zstrmtemp = (z_streamp)nvlist_take_binary(args, "strm", &zstreamsize);
+	zstrmtemp = (z_streamp)nvlist_get_binary(args, "strm", &zstreamsize);
 	memcpy(stream, zstrmtemp , zstreamsize);
 	ret = inflateInit2_(stream,
-	 		nvlist_take_number(args, "windowBits"),
-	 		nvlist_take_string(args, "version"),
-	 		nvlist_take_number(args, "stream_size")
+	 		nvlist_get_number(args, "windowBits"),
+	 		nvlist_get_string(args, "version"),
+	 		nvlist_get_number(args, "stream_size")
 	 );
 
 	nvlist_add_number(result, "result", ret);
@@ -102,7 +110,7 @@
 	/*uLong ret = -1;
 
 	ret = inflateEnd(
-	 		nvlist_take_number(args, "sourceLen")
+	 		nvlist_get_number(args, "sourceLen")
 	 	);
 	nvlist_add_number(result, "result", ret ); */
 }
@@ -221,15 +229,9 @@
 zcapcmd_compressBound(nvlist_t *args, nvlist_t *result)
 {
 	uLong ret = -1;
-	uLong number = 0;
-
-	if ( nvlist_exists(args, "sourceLen") ) {
-		number = nvlist_take_number(args, "sourceLen");
-		ret = compressBound(number);
-	} else
-		err(1, "compressBound: sourceLen doesn't exist");
+	ret = compressBound(nvlist_get_number(args, "sourceLen"));
 
-	nvlist_add_number(result, "result", ret );
+	nvlist_add_number(result, "result", ret);
 }
 
 /* gzip file functions */
@@ -239,8 +241,8 @@
 	void *ret = NULL;
 
 	ret = gzdopen(
-		nvlist_take_descriptor(args, "fd"),
-		nvlist_take_string(args, "mode")
+		nvlist_get_descriptor(args, "fd"),
+		nvlist_get_string(args, "mode")
 	);
 
 	nvlist_add_binary(result, "result", ret, gzsize);
@@ -252,8 +254,8 @@
 	int ret = -1;
 
 	ret = gzbuffer(
-		nvlist_take_binary(args, "file", &gzsize),
-		nvlist_take_number(args, "size")
+		(gzFile)nvlist_get_binary(args, "file", &gzsize),
+		nvlist_get_number(args, "size")
 	);
 
 	nvlist_add_number(result, "result", ret);
@@ -265,9 +267,9 @@
 	int ret = -1;
 
 	ret = gzsetparams(
-		nvlist_take_binary(args, "file", &gzsize),
-		nvlist_take_number(args, "level"),
-		nvlist_take_number(args, "strategy")
+		(gzFile)nvlist_get_binary(args, "file", &gzsize),
+		nvlist_get_number(args, "level"),
+		nvlist_get_number(args, "strategy")
 	);
 
 	nvlist_add_number(result, "result", ret);
@@ -279,9 +281,9 @@
 	int ret = -1;
 	int len = 0;
 
-	len = nvlist_take_number(args, "len");
+	len = nvlist_get_number(args, "len");
 	ret = gzread(
-		nvlist_take_binary(args, "file", &gzsize),
+		(gzFile)nvlist_get_binary(args, "file", &gzsize),
 		data,
 		len
 	);
@@ -302,7 +304,8 @@
 	memcpy(data, nvlist_take_binary(args, "data", &len), len);
 	ret = gzwrite(
 		nvlist_take_binary(args, "file", &gzsize),
-		data, len);
+		data, len
+		);
 
 	nvlist_add_number(result, "result", ret);
 	zero = 1;
@@ -405,7 +408,7 @@
 	gzFile file = NULL;
 
 	file = nvlist_take_binary(args, "file", &gzsize);
-	switch( nvlist_take_number(args, "command") ){
+	switch(nvlist_take_number(args, "command")) {
 		case (ZCAPCMD_GZGETC):
 			ret = gzgetc(file);
 			break;
@@ -478,7 +481,7 @@
 	uLong adler2 = nvlist_take_number(args, "adler2");
 	z_off_t len2 = nvlist_take_number(args, "len2");
 	ret = adler32_combine(adler1, adler2, len2);
-	fprintf("zlibworker: adler32_combine: %d\n", ret);
+	fprintf(stderr, "zlibworker: adler32_combine: %lu\n", ret);
 	nvlist_add_number(result, "result", ret );
 }
 

Added: soc2013/dpl/head/lib/libzcap/zlibworker/commands.h
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ soc2013/dpl/head/lib/libzcap/zlibworker/commands.h	Thu Aug 29 15:57:15 2013	(r256694)
@@ -0,0 +1,82 @@
+/* 
+	This is a list of all the capsizumized zlib interfaces.
+	Every one of the capsicumized functions will have a define.
+	This list is taken from zlib.h, in this same directory.
+
+	All this defines represent the commands passed to the real
+	zlib listening through a program, and it will recognize them.
+	Also, the defines have been checked for not being duplicates.
+
+	Since the only things that we can Capsicumize are: deflate()
+	and inflate(), we only have to care about sending those to 
+	commands (related to the basic functions, and utility functions.
+
+*/
+
+#define SOCKETFILENO					3
+
+#define ZCAPCMD_DEFLATEINIT			0
+#define ZCAPCMD_DEFLATE				1
+#define ZCAPCMD_DEFLATEEND			2
+#define ZCAPCMD_INFLATEINIT			3
+#define ZCAPCMD_INFLATE				4
+#define ZCAPCMD_INFLATEEND			5
+
+/* Advanced functions */
+#define ZCAPCMD_DEFLATESETDICTIONARY 	6
+#define ZCAPCMD_DEFLATECOPY 			7
+#define ZCAPCMD_DEFLATERESET 			8
+#define ZCAPCMD_DEFLATEPARAMS 		9
+#define ZCAPCMD_DEFLATETUNE 			10
+#define ZCAPCMD_DEFLATEBOUND 			11
+#define ZCAPCMD_DEFLATEPENDING 		12
+#define ZCAPCMD_DEFLATEPRIME 			13
+#define ZCAPCMD_DEFLATESETHEADER 		14
+#define ZCAPCMD_INFLATEINIT2 			15
+#define ZCAPCMD_INFLATESETDICTIONARY 	16
+#define ZCAPCMD_INFLATEGETDICTIONARY 	17
+#define ZCAPCMD_INFLATESYNC 			18
+#define ZCAPCMD_INFLATECOPY 			19
+#define ZCAPCMD_INFLATERESET 			20
+#define ZCAPCMD_INFLATERESET2 			21
+#define ZCAPCMD_INFLATEPRIME 			22
+#define ZCAPCMD_INFLATEMARK 			23
+#define ZCAPCMD_INFLATEGETHEADER 		24
+#define ZCAPCMD_INFLATEBACKINIT 		25
+#define ZCAPCMD_INFLATEBACK 			26
+#define ZCAPCMD_INFLATEBACKEND		27
+#define ZCAPCMD_ZLIBCOMPILEFLAGS		28
+
+/* utility functions */
+#define ZCAPCMD_COMPRESSBOUND		29
+
+/* gzip file access functions */
+#define ZCAPCMD_GZOPEN				30
+#define ZCAPCMD_GZBUFFER				31
+#define ZCAPCMD_GZSETPARAMS			32
+#define ZCAPCMD_GZREAD				33
+#define ZCAPCMD_GZWRITE				34
+#define ZCAPCMD_GZPRINTF				35
+#define ZCAPCMD_GZPUTS				36
+#define ZCAPCMD_GZGETS				46
+#define ZCAPCMD_GZPUTC				47
+#define ZCAPCMD_GZGETC				48
+#define ZCAPCMD_GZUNGETC				49
+#define ZCAPCMD_GZFLUSH				50
+#define ZCAPCMD_GZSEEK				51
+#define ZCAPCMD_GZREWIND				52
+#define ZCAPCMD_GZTELL				53
+#define ZCAPCMD_GZOFFSET				54
+#define ZCAPCMD_GZEOF				55
+#define ZCAPCMD_GZDIRECT				56
+#define ZCAPCMD_GZCLOSE				57
+#define ZCAPCMD_GZCLOSE_R			58
+#define ZCAPCMD_GZCLOSE_W			59
+#define ZCAPCMD_GZERROR				60
+#define ZCAPCMD_GZCLEARERR			61
+
+/* checksum functions */
+#define ZCAPCMD_ADLER32				62
+#define ZCAPCMD_ADLER32_COMBINE		63
+#define ZCAPCMD_CRC32				64
+#define ZCAPCMD_CRC32_COMBINE		65

Modified: soc2013/dpl/head/lib/libzcap/zlibworker/zlibworker.c
==============================================================================
--- soc2013/dpl/head/lib/libzcap/zlibworker/zlibworker.c	Thu Aug 29 15:06:01 2013	(r256693)
+++ soc2013/dpl/head/lib/libzcap/zlibworker/zlibworker.c	Thu Aug 29 15:57:15 2013	(r256694)
@@ -1,12 +1,16 @@
-#include <zlib.h>
-#include <nv.h>
 #include <sys/capability.h>
 
+#include <err.h>
+#include <nv.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
-#include <err.h>
-#include "../commands.h"
+#include <zlib.h>
+
+#include "commands.h"
+
+int main(int argc, char *argv[]);
+static void destroy(nvlist_t *nvl, nvlist_t *args, nvlist_t *results);
 
 /* Basic functions */
 extern void zcapcmd_deflateInit(nvlist_t *args, nvlist_t *result);
@@ -66,28 +70,47 @@
 extern void zcapcmd_crc32(nvlist_t *args, nvlist_t *result);
 extern void zcapcmd_crc32_combine(nvlist_t *args, nvlist_t *result);
 
-/* Points to a 5kb buffer */
+/* Points to a 5kb buffer to be used when passing data around. */
 void * data;
-/* Zero == 1 when we need to zero out data */
+/* Zero is set when we need to zero out data */
 int zero = 0;
 
+/* Deletes nvlists */
+static void
+destroy(nvlist_t *nvl, nvlist_t *args, nvlist_t *results)
+{
+	nvlist_destroy(nvl);
+	nvlist_destroy(args);
+	nvlist_destroy(results);
+}
+
+/* 
+ * This program recieves "commands"  from zcaplib. The commands are nothing
+ * more than a nvlist with an integer, and other nvlist, called "args".
+ * "args" contains the needed argument for the functions. If the library
+ * needs to pass data back and forth (like when using deflate(), or 
+ * inflate(), it does in 5Kb buffers. In most cases zlibworker keeps the 
+ * good version of a zlib used struct. The user only has its pointers
+ * (that, when used inside zlibworker make complete sense).
+ */
 int
 main(int argc, char *argv[])
 {
 	nvlist_t *nvl, *args, *result;
 
 	/* Sandbox the process */
-	cap_enter();
+	if (cap_enter() < 0)
+		err(1, "Couldn't enter capability mode");
 
 	if ((data = calloc(5*1024, 1)) == NULL)
 		err(1, "malloc\n");
 
-	while(1) {
+	for(;;) {
 		if ((result = nvlist_create(0)) == NULL)
 			err(1, "Can't create result.\n");
 
 		fprintf(stderr, "DEBUG: zlibworker waiting command\n");
-		if  ((nvl = nvlist_recv(3)) != NULL) {
+		if  ((nvl = nvlist_recv(SOCKETFILENO)) != NULL) {
 			if (!nvlist_exists(nvl, "command"))
 				err(1, "No command.\n");
 
@@ -103,7 +126,7 @@
 		fprintf(stderr, "DEBUG: zlibworker got command\n");
 		// Switch for "command"
 		// Get args, and call the real lib.
-		switch( nvlist_take_number(nvl, "command") ){
+		switch (nvlist_take_number(nvl, "command")){
 			/* Basic functions */
 			case (ZCAPCMD_DEFLATEINIT):
 				zcapcmd_deflateInit(args, result);
@@ -234,6 +257,7 @@
 			/* 
 			 * All this commands have gzFile as argument, 
 			 * and return an int (or void, in the last case).
+			 * Also, fallthrough.
 			 */
 			case (ZCAPCMD_GZGETC):
 			case (ZCAPCMD_GZREWIND):
@@ -269,14 +293,14 @@
 		}
 
 		fprintf(stderr, "DEBUG: zlibworker about to send result\n");
-		if( nvlist_send(3, result) != 0 )
+		if (nvlist_send(SOCKETFILENO, result) != 0)
 			err(1, "Couldn't send response\n");
 		fprintf(stderr, "DEBUG: zlibworker has sent result back\n");
-		nvlist_destroy(result);
-		nvlist_destroy(args);
-		nvlist_destroy(nvl);
-		if (zero) memset(data, 0, 5*1024);
+
+		destroy(nvl, args, result);
+		if (zero)
+			memset(data, 0, 5*1024);
 	}
 
-	return (0);
+	return(0);
 }
\ No newline at end of file



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201308291557.r7TFvFOd045271>