@@ -23,11 +23,11 @@ /* Default values */ #define PORT 80 #define THREAD_COUNT 5 #define BIND_ADDR "::" -#define CACHE_SIZE 8193 +#define CACHE_SIZE 8209 /* Arguments for worker threads */ struct filed_worker_thread_args { int fd; }; @@ -678,16 +678,59 @@ return(0); } /* Display help */ -static void filed_print_help(FILE *output, const char *extra) { +static void filed_print_help(FILE *output, int long_help, const char *extra) { if (extra) { fprintf(output, "%s\n", extra); } fprintf(output, "Usage: filed []\n"); + fprintf(output, " Options:\n"); + fprintf(output, " -h, --help\n"); + fprintf(output, " -b
, --bind
\n"); + fprintf(output, " -p , --port \n"); + fprintf(output, " -t , --threads \n"); + fprintf(output, " -c , --cache \n"); + fprintf(output, " -u , --user \n"); + fprintf(output, " -r , --root \n"); + + if (long_help) { + fprintf(output, "\n"); + fprintf(output, " Usage:\n"); + fprintf(output, " -h (or --help) prints this usage information\n"); + fprintf(output, "\n"); + fprintf(output, " -b (or --bind) specifies the address to listen for incoming HTTP\n"); + fprintf(output, " requests on. The default value is \"%s\".\n", BIND_ADDR); + fprintf(output, "\n"); + fprintf(output, " -p (or --port) specifies the TCP port number to listen for incoming HTTP\n"); + fprintf(output, " requests on. The default is %u.\n", (unsigned int) PORT); + fprintf(output, "\n"); + fprintf(output, " -t (or --threads) specifies the number of worker threads to create. Each\n"); + fprintf(output, " worker thread can service one concurrent HTTP session.\n"); + fprintf(output, " Thus the number of threads created will determine how\n"); + fprintf(output, " many simultaneous transfers will be possible. The\n"); + fprintf(output, " default is %lu.\n", (unsigned long) THREAD_COUNT); + fprintf(output, "\n"); + fprintf(output, " -c (or --cache) specifies the number of file information cache entries\n"); + fprintf(output, " to allocate. Each cache entry holds file information as\n"); + fprintf(output, " well as an open file descriptor to the file, so resource\n"); + fprintf(output, " limits (i.e., ulimit) should be considered. This should\n"); + fprintf(output, " be a prime number for ideal use with the lookup method.\n"); + fprintf(output, " The default is %lu.\n", (unsigned long) CACHE_SIZE); + fprintf(output, "\n"); + fprintf(output, " -u (or --user) specifies the user to switch user IDs to before servicing\n"); + fprintf(output, " requests. The default is not change user IDs.\n"); + fprintf(output, "\n"); + fprintf(output, " -r (or --root) specifies the directory to act as the root directory for\n"); + fprintf(output, " the file server. If this option is specified, chroot(2)\n"); + fprintf(output, " is called. The default is not change root directories,\n"); + fprintf(output, " that is, the \"/\" directory is shared out. This will\n"); + fprintf(output, " likely be a security issue, so this option should always\n"); + fprintf(output, " be used.\n"); + } return; } /* Add a getopt option */ @@ -751,25 +794,25 @@ break; case 'u': setuid_enabled = 1; lookup_ret = filed_user_lookup(optarg, &user); if (lookup_ret != 0) { - filed_print_help(stderr, "Invalid username specified"); + filed_print_help(stderr, 0, "Invalid username specified"); return(1); } break; case 'r': newroot = strdup(optarg); break; case '?': case ':': - filed_print_help(stderr, NULL); + filed_print_help(stderr, 0, NULL); return(1); case 'h': - filed_print_help(stdout, NULL); + filed_print_help(stdout, 1, NULL); return(0); } }