Index: filed.1 ================================================================== --- filed.1 +++ filed.1 @@ -13,10 +13,12 @@ .IR port ] .RB [{ \-t | \-\-threads } .IR count ] .RB [{ \-c | \-\-cache } .IR entries ] +.RB [{ \-l | \-\-log } +.IR file ] .RB [{ \-u | \-\-user } .IR user ] .RB [{ \-r | \-\-root } .IR directory ] @@ -58,10 +60,20 @@ to allocate. Each cache entry holds file information as well as an open file descriptor to the file, so resource limits (i.e., ulimit) should be considered. This should be a prime number for ideal use with the lookup method. +.TP +.B -l (or --log) +Specifies a filename to open for writing log entries. Log +entries are made for various stages in transfering files. +The log file is opened before switching users (see "-u") +and root directories (see "-r"). The log file is never +closed so log rotation without stopping the daemon is will +not work. The value of "-" indicates that standard output +should be used for logging. + .TP .B -u (or --user) Specifies the user to switch user IDs to before servicing requests. The default is not change user IDs. Index: filed.c ================================================================== --- filed.c +++ filed.c @@ -846,10 +846,11 @@ fprintf(output, " -d, --daemon\n"); fprintf(output, " -b
, --bind
\n"); fprintf(output, " -p , --port \n"); fprintf(output, " -t , --threads \n"); fprintf(output, " -c , --cache \n"); + fprintf(output, " -l , --log \n"); fprintf(output, " -u , --user \n"); fprintf(output, " -r , --root \n"); if (long_help) { fprintf(output, "\n"); @@ -876,10 +877,18 @@ 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, " -l (or --log) specifies a filename to open for writing log entries. Log\n"); + fprintf(output, " entries are made for various stages in transfering files.\n"); + fprintf(output, " The log file is opened before switching users (see \"-u\")\n"); + fprintf(output, " and root directories (see \"-r\"). The log file is never\n"); + fprintf(output, " closed so log rotation without stopping the daemon is will\n"); + fprintf(output, " not work. The value of \"-\" indicates that standard output\n"); + fprintf(output, " should be used for logging. The default is \"%s\".\n", LOG_FILE); + 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"); @@ -993,11 +1002,11 @@ return(0); } /* Run process */ int main(int argc, char **argv) { - struct option options[9]; + struct option options[10]; const char *bind_addr = BIND_ADDR, *newroot = NULL, *log_file = LOG_FILE; uid_t user = 0; int port = PORT, thread_count = THREAD_COUNT; int cache_size = CACHE_SIZE; int init_ret, chroot_ret, setuid_ret, lookup_ret, chdir_ret; @@ -1012,12 +1021,13 @@ filed_getopt_long_setopt(&options[3], "bind", required_argument, 'b'); filed_getopt_long_setopt(&options[4], "user", required_argument, 'u'); filed_getopt_long_setopt(&options[5], "root", required_argument, 'r'); filed_getopt_long_setopt(&options[6], "help", no_argument, 'h'); filed_getopt_long_setopt(&options[7], "daemon", no_argument, 'd'); - filed_getopt_long_setopt(&options[8], NULL, 0, 0); - while ((ch = getopt_long(argc, argv, "p:t:c:b:u:r:hd", options, NULL)) != -1) { + filed_getopt_long_setopt(&options[8], "log", required_argument, 'l'); + filed_getopt_long_setopt(&options[9], NULL, 0, 0); + while ((ch = getopt_long(argc, argv, "p:t:c:b:u:r:l:hd", options, NULL)) != -1) { switch(ch) { case 'p': port = atoi(optarg); break; case 't': @@ -1039,10 +1049,13 @@ } break; case 'r': newroot = strdup(optarg); break; + case 'l': + log_file = strdup(optarg); + break; case 'd': daemon_enabled = 1; break; case '?': case ':':