2007-04-05 Marcus Brinkmann <marcus@g10code.de>
authorMarcus Brinkmann <mb@g10code.com>
Thu, 5 Apr 2007 16:22:14 +0000 (16:22 +0000)
committerMarcus Brinkmann <mb@g10code.com>
Thu, 5 Apr 2007 16:22:14 +0000 (16:22 +0000)
* src/ftp_session.c (do_retr, open_connection, send_readme):
Add dummy block between jump label and pthread_cleanup_pop() macro.

* oftpd.startup (ARGS): Add $OPTIONS.
* src/oftpd.h (debug_flags): Declare global variable.
(DEBUG_NONE, DEBUG_XFER, DEBUG_CMDS): New macros.
* src/oftpd.c (debug_flags): New global variable.
(main): Support new -d option.
* src/ftp_session.c (ftp_session_run): Only log if DEBUG_CMDS flag
is set.
(reply): Likewise.
(do_retr): Log xfer in WU-FTPD format.

ChangeLog
oftpd.startup
src/ftp_session.c
src/oftpd.c
src/oftpd.h

index adab564..1032064 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,18 @@
+2007-04-05  Marcus Brinkmann  <marcus@g10code.de>
+
+       * src/ftp_session.c (do_retr, open_connection, send_readme): 
+       Add dummy block between jump label and pthread_cleanup_pop() macro.
+
+       * oftpd.startup (ARGS): Add $OPTIONS.
+       * src/oftpd.h (debug_flags): Declare global variable.
+       (DEBUG_NONE, DEBUG_XFER, DEBUG_CMDS): New macros.
+       * src/oftpd.c (debug_flags): New global variable.
+       (main): Support new -d option.
+       * src/ftp_session.c (ftp_session_run): Only log if DEBUG_CMDS flag
+       is set.
+       (reply): Likewise.
+       (do_retr): Log xfer in WU-FTPD format.
+
 2007-03-26  Werner Koch  <wk@g10code.com>
 
        * src/telnet_session.c (do_telnet_session_print): Add argument S0
index 88abb9f..6d4f6d4 100644 (file)
@@ -45,6 +45,8 @@ if [ -n "$MAXCON" ]; then
        ARGS="-m $MAXCON $ARGS"
 fi
 
+ARGS="$OPTIONS $ARGS"
+
 PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
 DAEMON=/usr/sbin/oftpd
 NAME=oftpd
index 69b2b62..96be6e7 100644 (file)
@@ -268,7 +268,8 @@ void ftp_session_run(ftp_session_t *f, watched_t *watched)
            goto next_command;
        }
 
-        syslog(LOG_DEBUG, "%s %s", f->client_addr_str, buf);
+       if (debug_flags & DEBUG_CMDS)
+         syslog(LOG_DEBUG, "%s %s", f->client_addr_str, buf);
 
        /* parse the line */
        if (!ftp_command_parse(buf, &cmd)) {
@@ -377,7 +378,8 @@ static void reply(ftp_session_t *f, int code, const char *fmt, ...)
     va_end(ap);
 
     /* log our reply */
-    syslog(LOG_DEBUG, "%s %s", f->client_addr_str, buf);
+    if (debug_flags & DEBUG_CMDS)
+      syslog(LOG_DEBUG, "%s %s", f->client_addr_str, buf);
 
     /* send the output to the other side */
     telnet_session_println(f->telnet_session, buf);
@@ -1286,6 +1288,7 @@ static void do_retr(ftp_session_t *f, const ftp_command_t *cmd)
     }
 
     /* note the transfer */
+#if 0
     syslog(LOG_INFO, 
       "%s retrieved \"%s\", %ld bytes in %ld.%06ld seconds", 
       f->client_addr_str, 
@@ -1293,8 +1296,51 @@ static void do_retr(ftp_session_t *f, const ftp_command_t *cmd)
       file_size,
       (long int) transfer_time.tv_sec,
       (long int) transfer_time.tv_usec);
+#else
+    if (debug_flags & DEBUG_XFER)
+    {
+      char curtime[26];
+      /* For now, always true.  */
+      int complete = 1;
+      char *logline;
+      char *hostp;
+      int host_len;
+
+      if (ctime_r (&start_timestamp.tv_sec, curtime) != NULL)
+       /* The result of ctime_r() is newline-terminated.  */
+       curtime[24] = '\0';
+      else
+       strcpy (logline, "(ctime failed)");
+
+      /* Determine the host part of the client address string.  */
+      hostp = strchr (f->client_addr_str, ' ');
+      if (hostp == NULL)
+       host_len = 0;
+      else
+       host_len = hostp - f->client_addr_str;
+
+      /* Timestamp, time (rounded up, so that it is never zero),
+        remote host, file size, filename, transfer type, special
+        action flag, direction, access mode, username, service name,
+        authentication method, authenticated user ID, completion
+        status.  */
+      if (asprintf (&logline,
+                   "xfer %s %li %.*s %li %s %c _ o a anonymous ftp 0 * %c",
+                   curtime, transfer_time.tv_sec + 1,
+                   host_len, host_len ? f->client_addr_str : "ERROR",
+                   file_size, full_path, 
+                   f->data_type == TYPE_ASCII ? 'a' : 'b', 
+                   complete ? 'c' : 'i') < 0)
+       syslog (LOG_ERR, "asprintf() failed");
+      else
+       {
+         syslog (LOG_INFO, "%s", logline);
+         free (logline);
+       }
+    }
+#endif
 
-exit_retr:
+ exit_retr: {}
     /* Close socket_fd.  */
     pthread_cleanup_pop (1);
     /* Close file_fd.  */
@@ -1382,7 +1428,7 @@ static int open_connection(ftp_session_t *f)
 #endif
     }
 
- leave_oc:
+ leave_oc: {}
     /* Do not close SOCKET_FD here.  */
     pthread_cleanup_pop (0);
     pthread_setcancelstate (state, NULL);
@@ -1825,7 +1871,7 @@ static void send_readme(const ftp_session_t *f, int code)
     }
 
     /* cleanup and exit */
-exit_send_readme:
+ exit_send_readme: {}
     pthread_cleanup_pop (1);
 
     daemon_assert(invariant(f));
index 19887d3..0bded14 100644 (file)
@@ -28,6 +28,9 @@ static const char *exe_name = "oftpd";
 int pasv_port_low = 1024;
 int pasv_port_high = MAX_PORT;
 
+/* The debug flags.  */
+int debug_flags;
+
 static void daemonize();
 static void print_usage(const char *error);
 
@@ -170,6 +173,10 @@ int main(int argc, char *argv[])
             } else if (strcmp(argv[i], "-N") == 0 
                        || strcmp(argv[i], "--nodetach") == 0) {
                 detach = 0;
+            } else if (strcmp(argv[i], "-d") == 0
+                       || strcmp(argv[i], "--debug") == 0) { 
+               /* We just add another flag for each -d option.  */
+               debug_flags = (debug_flags << 1) | 1;
             } else if (strcmp(argv[i], "-l") == 0
                        || strcmp(argv[i], "--local") == 0) {
                 if (++i >= argc) {
index 2facb6d..aee0c94 100644 (file)
 /* README file name (sent automatically as a response to users) */
 #define README_FILE_NAME "README"
 
+/* The debug flags control the amount of logging.  */
+extern int debug_flags;
+#define DEBUG_NONE     0
+#define DEBUG_XFER     (1 << 0)
+#define DEBUG_CMDS     (1 << 1)
+
 #endif /* OFTPD_H */