[prev in list] [next in list] [prev in thread] [next in thread] 

List:       proftpd-committers
Subject:    [ProFTPD-committers] CVS: proftpd/modules mod_ls.c,1.179,1.180
From:       "TJ Saunders" <castaglia () users ! sourceforge ! net>
Date:       2010-09-28 16:49:26
Message-ID: E1P0dMs-0006Y6-GQ () sfp-cvsdas-2 ! v30 ! ch3 ! sourceforge ! com
[Download RAW message or body]

Update of /cvsroot/proftp/proftpd/modules
In directory sfp-cvsdas-2.v30.ch3.sourceforge.com:/tmp/cvs-serv25109/modules

Modified Files:
	mod_ls.c 
Log Message:

Bug#3506 - Support ListOption for returning 226 response code when listing
nonexistent file, instead of 450.


Index: mod_ls.c
===================================================================
RCS file: /cvsroot/proftp/proftpd/modules/mod_ls.c,v
retrieving revision 1.179
retrieving revision 1.180
diff -u -r1.179 -r1.180
--- mod_ls.c	20 Jul 2010 16:23:28 -0000	1.179
+++ mod_ls.c	28 Sep 2010 16:49:24 -0000	1.180
@@ -54,6 +54,9 @@
 #endif
 #define LS_SENDLINE_FL_FLUSH	0x0001
 
+static unsigned long list_flags = 0;
+#define LS_FL_NO_ERROR_IF_ABSENT	0x0001
+
 static unsigned char list_strict_opts = FALSE;
 static char *list_options = NULL;
 static unsigned char list_show_symlinks = TRUE, list_times_gmt = TRUE;
@@ -1674,8 +1677,17 @@
 
       pr_fs_clear_cache();
       if (pr_fsio_stat(target, &st) < 0) {
+        int xerrno = errno;
+
+        if (xerrno == ENOENT &&
+            (list_flags & LS_FL_NO_ERROR_IF_ABSENT)) {
+          return 0;
+        }
+
         pr_response_add_err(R_450, "%s: %s",
-          pr_fs_encode_path(cmd->tmp_pool, target), strerror(errno));
+          pr_fs_encode_path(cmd->tmp_pool, target), strerror(xerrno));
+
+        errno = xerrno;
         return -1;
       }
     }
@@ -2161,6 +2173,8 @@
 
     list_nfiles.max = *((unsigned int *) c->argv[3]);
     list_ndirs.max = *((unsigned int *) c->argv[4]);
+
+    list_flags = *((unsigned long *) c->argv[5]);
   }
 
   fakeuser = get_param_ptr(CURRENT_CONF, "DirFakeUser", FALSE);
@@ -2311,6 +2325,8 @@
 
     list_nfiles.max = *((unsigned int *) c->argv[3]);
     list_ndirs.max = *((unsigned int *) c->argv[4]);
+
+    list_flags = *((unsigned long *) c->argv[5]);
   }
 
   fakeuser = get_param_ptr(CURRENT_CONF, "DirFakeUser", FALSE);
@@ -2399,6 +2415,8 @@
 
     list_nfiles.max = *((unsigned int *) c->argv[3]);
     list_ndirs.max = *((unsigned int *) c->argv[4]);
+
+    list_flags = *((unsigned long *) c->argv[5]);
   }
 
   /* Clear the listing option flags. */
@@ -2559,11 +2577,31 @@
           g.gl_pathv[1] = NULL;
 
         } else {
+          if (list_flags & LS_FL_NO_ERROR_IF_ABSENT) {
+            if (pr_data_open(NULL, "file list", PR_NETIO_IO_WR, 0) < 0)
+              return PR_ERROR(cmd);
+            session.sf_flags |= SF_ASCII_OVERRIDE;
+            pr_response_add(R_226, _("Transfer complete"));
+            ls_done(cmd);
+
+            return PR_HANDLED(cmd);
+          }
+
           pr_response_add_err(R_450, _("No files found"));
           return PR_ERROR(cmd);
         }
 
       } else {
+        if (list_flags & LS_FL_NO_ERROR_IF_ABSENT) {
+          if (pr_data_open(NULL, "file list", PR_NETIO_IO_WR, 0) < 0)
+            return PR_ERROR(cmd);
+          session.sf_flags |= SF_ASCII_OVERRIDE;
+          pr_response_add(R_226, _("Transfer complete"));
+          ls_done(cmd);
+
+          return PR_HANDLED(cmd);
+        }
+
         pr_response_add_err(R_450, _("No files found"));
         return PR_ERROR(cmd);
       }
@@ -2618,8 +2656,23 @@
     struct stat st;
 
     if (!ls_perms_full(cmd->tmp_pool, cmd, target, &hidden)) {
+      int xerrno = errno;
+
+      if (xerrno == ENOENT &&
+          (list_flags & LS_FL_NO_ERROR_IF_ABSENT)) {
+        if (pr_data_open(NULL, "file list", PR_NETIO_IO_WR, 0) < 0)
+          return PR_ERROR(cmd);
+        session.sf_flags |= SF_ASCII_OVERRIDE;
+        pr_response_add(R_226, _("Transfer complete"));
+        ls_done(cmd);
+
+        return PR_HANDLED(cmd);
+      }
+
       pr_response_add_err(R_450, "%s: %s", *cmd->arg ? cmd->arg :
-        pr_fs_encode_path(cmd->tmp_pool, session.vwd), strerror(errno));
+        pr_fs_encode_path(cmd->tmp_pool, session.vwd), strerror(xerrno));
+
+      errno = xerrno;
       return PR_ERROR(cmd);
     }
 
@@ -2631,7 +2684,19 @@
         unsigned char *ignore_hidden = get_param_ptr(c->subset,
           "IgnoreHidden", FALSE);
 
-        if (ignore_hidden && *ignore_hidden == TRUE) {
+        if (ignore_hidden &&
+            *ignore_hidden == TRUE) {
+
+          if (list_flags & LS_FL_NO_ERROR_IF_ABSENT) {
+            if (pr_data_open(NULL, "file list", PR_NETIO_IO_WR, 0) < 0)
+              return PR_ERROR(cmd);
+            session.sf_flags |= SF_ASCII_OVERRIDE;
+            pr_response_add(R_226, _("Transfer complete"));
+            ls_done(cmd);
+
+            return PR_HANDLED(cmd);
+          }
+
           pr_response_add_err(R_450, "%s: %s",
             pr_fs_encode_path(cmd->tmp_pool, target), strerror(ENOENT));
 
@@ -2649,7 +2714,22 @@
      */
     pr_fs_clear_cache();
     if (pr_fsio_stat(target, &st) < 0) {
-      pr_response_add_err(R_450, "%s: %s", cmd->arg, strerror(errno));
+      int xerrno = errno;
+
+      if (xerrno == ENOENT &&
+          (list_flags & LS_FL_NO_ERROR_IF_ABSENT)) {
+        if (pr_data_open(NULL, "file list", PR_NETIO_IO_WR, 0) < 0)
+          return PR_ERROR(cmd);
+        session.sf_flags |= SF_ASCII_OVERRIDE;
+        pr_response_add(R_226, _("Transfer complete"));
+        ls_done(cmd);
+
+        return PR_HANDLED(cmd);
+      }
+
+      pr_response_add_err(R_450, "%s: %s", cmd->arg, strerror(xerrno));
+
+      errno = xerrno;
       return PR_ERROR(cmd);
     }
 
@@ -2767,6 +2847,7 @@
 
 MODRET set_listoptions(cmd_rec *cmd) {
   config_rec *c = NULL;
+  unsigned long flags = 0;
 
   if (cmd->argc-1 < 1)
     CONF_ERROR(cmd, "wrong number of parameters");
@@ -2774,7 +2855,7 @@
   CHECK_CONF(cmd, CONF_ROOT|CONF_VIRTUAL|CONF_GLOBAL|CONF_ANON|
     CONF_DIR|CONF_DYNDIR);
 
-  c = add_config_param(cmd->argv[0], 5, NULL, NULL, NULL, NULL, NULL);
+  c = add_config_param(cmd->argv[0], 6, NULL, NULL, NULL, NULL, NULL, NULL);
   c->flags |= CF_MERGEDOWN;
   
   c->argv[0] = pstrdup(c->pool, cmd->argv[1]);
@@ -2795,6 +2876,10 @@
   c->argv[4] = pcalloc(c->pool, sizeof(unsigned int));
   *((unsigned int *) c->argv[4]) = 0;
 
+  /* The default flags */
+  c->argv[5] = pcalloc(c->pool, sizeof(unsigned long));
+  *((unsigned int *) c->argv[5]) = 0;
+ 
   /* Check for, and handle, optional arguments. */
   if (cmd->argc-1 >= 2) {
     register unsigned int i = 0;
@@ -2834,6 +2919,9 @@
 
           *((unsigned int *) c->argv[4]) = maxdirs;
 
+      } else if (strcasecmp(cmd->argv[i], "NoErrorIfAbsent") == 0) {
+          flags |= LS_FL_NO_ERROR_IF_ABSENT;
+
       } else {
         CONF_ERROR(cmd, pstrcat(cmd->tmp_pool, ": unknown keyword: '",
           cmd->argv[i], "'", NULL));
@@ -2841,6 +2929,8 @@
     }
   }
 
+  *((unsigned long *) c->argv[5]) = flags;
+
   return PR_HANDLED(cmd);
 }
 


------------------------------------------------------------------------------
Start uncovering the many advantages of virtual appliances
and start using them to simplify application deployment and
accelerate your shift to cloud computing.
http://p.sf.net/sfu/novell-sfdev2dev
_______________________________________________
ProFTPD Committers Mailing List
proftpd-committers@proftpd.org
https://lists.sourceforge.net/lists/listinfo/proftp-committers
[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic