Index: benchmark/io/http/filecache.cfa
===================================================================
--- benchmark/io/http/filecache.cfa	(revision c82af9fe745af40e64fe4a7be44d204791a6c5ab)
+++ benchmark/io/http/filecache.cfa	(revision 0d52c6ffb1ed8fff967ba036ec3d02f09e17dcb5)
@@ -56,4 +56,17 @@
 }
 
+static inline [unsigned size, char unit] human_size( size_t size ) {
+	int idx = 0;
+	static char units [] = { ' ', 'K', 'M', 'G', 'T' };
+	while( size >= 1024 ) {
+		idx++;
+		size /= 1024;
+		if(idx >= 5) {
+			abort("File too large to print\n");
+		}
+	}
+
+	return [size, units[idx]];
+}
 
 struct {
@@ -101,4 +114,9 @@
 void fill_cache( const char * path ) {
 	int ret;
+	ret = chdir(path);
+	if(ret < 0) {
+		abort( "chdir error: (%d) %s\n", (int)errno, strerror(errno) );
+	}
+
 	size_t fcount = 0;
 	size_t fsize = 16;
@@ -118,12 +136,14 @@
 		raw[idx].file = strdup(fpath+2);
 		raw[idx].size = sb->st_size;
-		raw[idx].fd = open( fpath, options.open_flags );
-		if(raw[idx].fd < 0) {
-			abort( "open file error: (%d) %s\n", (int)errno, strerror(errno) );
+		if( !options.file_cache_list ) {
+			raw[idx].fd = open( fpath, options.open_flags );
+			if(raw[idx].fd < 0) {
+				abort( "open file error: (%d) %s\n", (int)errno, strerror(errno) );
+			}
 		}
 		return 0;
 	}
 
-	ret = ftw(path, walk, 10);
+	ret = ftw(".", walk, 10);
 	if(ret < 0) {
 		abort( "ftw error: (%d) %s\n", (int)errno, strerror(errno) );
@@ -132,4 +152,16 @@
 	if(fcount == 0) {
 		abort("No file found in path %s\n", path);
+	}
+
+	if(options.file_cache_list) {
+		printf("Listing files and exiting\n");
+		for(i; fcount) {
+			int s; char u;
+			[s, u] = human_size(raw[i].size);
+			printf("%4d%c - %s\n", s, u, raw[i].file);
+			free(raw[i].file);
+		}
+		free(raw);
+		exit(0);
 	}
 
Index: benchmark/io/http/main.cfa
===================================================================
--- benchmark/io/http/main.cfa	(revision c82af9fe745af40e64fe4a7be44d204791a6c5ab)
+++ benchmark/io/http/main.cfa	(revision 0d52c6ffb1ed8fff967ba036ec3d02f09e17dcb5)
@@ -24,10 +24,11 @@
 //=============================================================================================
 Options options @= {
-	0,
-	42u,
-	0,
-	false,
-	false,
-	0
+	0,     //   open_flags;
+	42u,   // 	hash_seed;
+	0,     //   file_cache_size;
+	false, // 	file_cache_list;
+	false, // 	procstats;
+	false, // 	viewhalts;
+	0      // 	the_cluster;
 };
 
@@ -70,10 +71,21 @@
 		{'t', "threads", "Number of worker threads to use", nworkers},
 		{'b', "accept-backlog", "Maximum number of pending accepts", backlog},
-		{'B', "channel-size", "Maximum number of accepted connection pending", chan_size}
+		{'B', "channel-size", "Maximum number of accepted connection pending", chan_size},
+		{'S', "seed", "seed to use for hashing", options.hash_seed },
+		{'C', "cache-size", "Size of the cache to use, if set to small, will uses closes power of 2", options.file_cache_size },
+		{'l', "list-files", "List the files in the specified path and exit", options.file_cache_list, parse_settrue }
+
 	};
 	int opt_cnt = sizeof(opt) / sizeof(cfa_option);
 
 	char **left;
-      parse_args( argc, argv, opt, opt_cnt, "[OPTIONS] [PATH]  -- cforall http server", left );
+      parse_args( argc, argv, opt, opt_cnt, "[OPTIONS]... [PATH]\ncforall http server", left );
+	if( left[0] != 0p ) {
+		path = left[0];
+		left++;
+	}
+	if( left[0] != 0p ) {
+		abort("Too many trailing arguments!\n");
+	}
 
 
Index: benchmark/io/http/options.hfa
===================================================================
--- benchmark/io/http/options.hfa	(revision c82af9fe745af40e64fe4a7be44d204791a6c5ab)
+++ benchmark/io/http/options.hfa	(revision 0d52c6ffb1ed8fff967ba036ec3d02f09e17dcb5)
@@ -8,5 +8,6 @@
 	int open_flags;
 	uint32_t hash_seed;
-      size_t file_cache_size;
+	size_t file_cache_size;
+	bool file_cache_list;
 	bool procstats;
 	bool viewhalts;
Index: benchmark/io/http/parseargs.cfa
===================================================================
--- benchmark/io/http/parseargs.cfa	(revision c82af9fe745af40e64fe4a7be44d204791a6c5ab)
+++ benchmark/io/http/parseargs.cfa	(revision 0d52c6ffb1ed8fff967ba036ec3d02f09e17dcb5)
@@ -12,5 +12,7 @@
 
 	extern int fprintf ( FILE * stream, const char * format, ... );
-	extern long long int strtoll (const char* str, char** endptr, int base);
+
+	extern          long long int strtoll (const char* str, char** endptr, int base);
+	extern unsigned long long int strtoull(const char* str, char** endptr, int base);
 }
 
@@ -94,5 +96,5 @@
 
 	USAGE:
-	fprintf(out, "%s\n", usage);
+	fprintf(out, "Usage:\n  %s %s\n", argv[0], usage);
 
 	for(i; opt_count) {
@@ -132,4 +134,24 @@
 }
 
+bool parse(const char * arg, unsigned & value) {
+	char * end;
+	unsigned long long int r = strtoull(arg, &end, 10);
+	if(*end != '\0') return false;
+#warning not checking max
+
+	value = r;
+	return true;
+}
+
+bool parse(const char * arg, size_t & value) {
+	char * end;
+	unsigned long long int r = strtoull(arg, &end, 10);
+	if(*end != '\0') return false;
+#warning not checking max
+
+	value = r;
+	return true;
+}
+
 bool parse(const char * arg, int & value) {
 	char * end;
Index: benchmark/io/http/parseargs.hfa
===================================================================
--- benchmark/io/http/parseargs.hfa	(revision c82af9fe745af40e64fe4a7be44d204791a6c5ab)
+++ benchmark/io/http/parseargs.hfa	(revision 0d52c6ffb1ed8fff967ba036ec3d02f09e17dcb5)
@@ -38,3 +38,5 @@
 
 bool parse(const char *, const char * & );
+bool parse(const char *, unsigned & );
+bool parse(const char *, size_t & );
 bool parse(const char *, int & );
