Only in wu-ftpd-2.6.1/src: #ftpd.c#
diff -r -c wu-ftpd-2.6.1-orig/src/access.c wu-ftpd-2.6.1/src/access.c
*** wu-ftpd-2.6.1-orig/src/access.c	Sat Jul  1 14:17:38 2000
--- wu-ftpd-2.6.1/src/access.c	Fri Sep 29 10:19:08 2000
***************
*** 85,90 ****
--- 85,91 ----
  extern mode_t defumask;
  char Shutdown[MAXPATHLEN];
  int keepalive = 0;
+ int netatalk = 0;
  #define MAXLINE	80
  static char incline[MAXLINE];
  int pidfd = -1;
***************
*** 1452,1457 ****
--- 1453,1464 ----
      if (getaclentry("keepalive", &entry) && ARG0 != NULL)
  	if (!strcasecmp(ARG0, "yes"))
  	    keepalive = 1;
+ 
+     entry = (struct aclmember *) NULL;
+     if (getaclentry("netatalk", &entry) && ARG0 != NULL)
+         if (!strcasecmp(ARG0, "yes"))
+             netatalk = 1;
+ 
      load_timeouts();
  }
  
diff -r -c wu-ftpd-2.6.1-orig/src/ftpd.c wu-ftpd-2.6.1/src/ftpd.c
*** wu-ftpd-2.6.1-orig/src/ftpd.c	Sat Jul  1 14:17:39 2000
--- wu-ftpd-2.6.1/src/ftpd.c	Fri Sep 29 10:34:40 2000
***************
*** 376,381 ****
--- 376,382 ----
  extern char authuser[];
  extern int authenticated;
  extern int keepalive;
+ extern int netatalk;
  
  /* File transfer logging */
  int xferlog = 0;
***************
*** 5509,5514 ****
--- 5510,5562 ----
      return;
  }
  
+ static int rmdir_recursive ( const char* pathname )
+ {
+    int result = -1;
+    DIR* dir = opendir(pathname);
+    if (dir != NULL) {
+      struct dirent* entry = readdir(dir);
+      result = 0;
+      while ((result == 0) && (entry != NULL)) {
+        if ((strcmp(entry->d_name, ".")!= 0)
+           && (strcmp(entry->d_name, "..") != 0)) {
+        char* fullpath =
+          calloc ((strlen(pathname) + strlen(entry->d_name) + 2), sizeof(char));
+        strcpy(fullpath, pathname);
+        strcat(fullpath, "/");
+        strcat(fullpath, entry->d_name);
+        result = unlink(fullpath);
+        }
+        if (result == 0) entry = readdir(dir);
+      }
+      if (result == 0)
+        result = closedir(dir);
+      else {
+        int e = errno;
+        closedir(dir);
+        errno = e;
+      }
+    } else if (errno == ENOENT) result = 0;
+    if (result == 0)
+      result = rmdir(pathname);
+    return(result);
+ }
+ 
+ static int netatalk_rmdir (const char* pathname)
+ {
+    int result = -1;
+    static const char AppleDouble [] = "/.AppleDouble";
+    char* dirname =
+      calloc((strlen(pathname) + strlen(AppleDouble) + 1), sizeof(char));
+    if (dirname != NULL) {
+      strcpy(dirname, pathname);
+      strcat(dirname, AppleDouble);
+      result = rmdir_recursive(dirname);
+      free(dirname);
+    }
+    return(result);
+ }
+ 
  void delete(char *name)
  {
      struct stat st;
***************
*** 5555,5560 ****
--- 5603,5611 ----
  	    return;
  	}
  
+ 	if (netatalk)
+ 	    netatalk_rmdir(name);
+ 
  	if (rmdir(name) < 0) {
  	    if (log_security)
  		if (anonymous)
***************
*** 5785,5790 ****
--- 5836,5844 ----
  		       pw->pw_name, remoteident, realname);
  	return;
      }
+ 
+     if (netatalk)
+ 	netatalk_rmdir(name);
  
      if (rmdir(name) < 0) {
  	if (errno == EBUSY)
