Added public files

Roughly added all public files. Probably missed some, though.
diff --git a/std/shells/magier/fileedit.c b/std/shells/magier/fileedit.c
new file mode 100644
index 0000000..f4df0a5
--- /dev/null
+++ b/std/shells/magier/fileedit.c
@@ -0,0 +1,718 @@
+// MorgenGrauen MUDlib
+//
+//fileedit.c
+//
+// $Id: fileedit.c 9142 2015-02-04 22:17:29Z Zesstra $
+#pragma strict_types
+#pragma save_types
+//#pragma range_check
+#pragma no_clone
+#pragma pedantic
+
+#include <wizlevels.h>
+#include <input_to.h>
+
+#define NEED_PROTOTYPES
+#include <magier.h>
+#include <player.h>
+#include <files.h>
+
+//                        ###################
+//######################### INITIALISIERUNG #############################
+//                        ###################
+
+mixed _query_localcmds()
+{
+  return ({ ({"cp","_cp",0,WIZARD_LVL}),
+            ({"mv","_cp",0,WIZARD_LVL}),
+            ({"rm","_rm",0,WIZARD_LVL}),
+            ({"rmdir","_rmdir",0,WIZARD_LVL}),
+            ({"mkdir","_mkdir",0,WIZARD_LVL}),
+            ({"ed","_ed",0,WIZARD_LVL})});
+}
+
+//                               ######
+//################################ ED ###################################
+//                               ######
+
+
+//
+// _ed_file: Mehrere Files hintereinander editieren
+//
+
+private nosave string *_ed_cache;
+
+private void _ed_file()
+{
+  if (!sizeof(_ed_cache)) return;
+  printf("ed: Naechste Datei: %s\n",_ed_cache[0]);
+  ed(_ed_cache[0],"_ed_file");
+  _ed_cache=_ed_cache[1..];
+  return;
+}
+
+#if __VERSION__ < "3.2.9"
+private mixed _ed_size_filter(mixed *arg)
+{
+  if (arg[FILESIZE]>=-1) return arg[FULLNAME];
+  printf("%s ist ein Verzeichnis.\n",arg[FULLNAME]);
+  return 0;
+}
+#endif
+
+//
+// _more: Dateien anzeigen
+// cmdline: Kommandozeile
+//
+
+static int _ed(string cmdline)
+{
+  mixed *args,*args2;
+  int flags,i,arg_size;
+  cmdline=_unparsed_args();
+  args=parseargs(cmdline,&flags,"",1);
+  if (flags==-1||!(arg_size=sizeof(args)))
+    return USAGE("ed <datei> [<datei2>..]");
+  while(arg_size--)
+  {
+    if (sizeof(args2=file_list(args[arg_size..arg_size],MODE_ED,0,"/")))
+      args[arg_size..arg_size]=args2;
+    else
+      args[arg_size]=({ "" , -1, 0 , (string)
+              call_other(master(),"_get_path",args[arg_size],
+                  getuid())});
+  }
+#if __VERSION__ < "3.2.9"
+  args=map(args,#'_ed_size_filter)-({0});
+#else
+  args=map(args,(:
+          if ($1[FILESIZE]>=-1) return $1[FULLNAME];
+          printf("%s ist ein Verzeichnis.\n",$1[FULLNAME]);
+          return 0; :))-({0});
+#endif
+  if (flags==-1||!sizeof(args)) return USAGE("ed <datei> [<datei2>..]");
+  _ed_cache=args;
+  _ed_file();
+  return 1;
+}
+
+
+//                             ###########
+//############################## CP & MV ################################
+//                             ###########
+
+static void _cp_ask_copy(mixed *filedata,int dummy, int flags);
+static void _cp_ask_overwrite(mixed *filedata, int mode, int flags);
+static void _mv_ask_overwrite(mixed *filedata, int mode, int flags);
+
+static mixed cp_file(mixed filedata,int move,int flags, mixed *do_delete)
+{
+  string source,dest;
+  source=(string)filedata[FULLNAME];
+  dest=(string)filedata[DESTNAME];
+  if (source==dest) return ERROR(SAME_FILE,source,RET_FAIL);
+  if (!MAY_READ(source)) return ERROR(NO_READ,source,RET_JUMP);
+  if (!MAY_WRITE(dest)) return ERROR(NO_WRITE,dest,RET_JUMP);
+  if (filedata[FILESIZE]==-1) return ERROR(DOESNT_EXIST,source,RET_JUMP);
+  if (filedata[FILESIZE]==-2) // Quelle ist Verzeichnis
+  {
+    switch(file_size(dest))
+    {
+      case -1:
+        if (move)
+        {
+          if (rename(source,dest)) return ERROR(NO_CREATE_DIR,dest,RET_JUMP);
+          if (flags&CP_V) printf(FILE_MOVED,source);
+          return RET_JUMP;
+        }
+        if (!mkdir(dest)) return ERROR(NO_CREATE_DIR,dest,RET_JUMP);
+        if (flags&CP_V) printf(DIR_CREATED,dest);
+      case -2:
+        if (!move) return RET_OK;
+        if (filedata[SUBDIRSIZE]>0) return RET_DELETE;
+        if (!rmdir(source)) return ERROR(NO_DELETE,source,RET_FAIL);
+        if (flags&MV_V) printf("mv: %s: Quellverzeichnis wurde "
+                               "geloescht.\n",source);
+        return RET_OK;    
+      default:  return ERROR(NO_DIRS,dest,RET_JUMP);
+    }
+  }
+  switch(file_size(dest))
+  {
+    case -2: return ERROR(DEST_IS_DIR,dest,RET_FAIL);
+    default:
+      if (flags&CP_F)
+      {
+        if (!rm(dest)) return ERROR(DEST_NO_DELETE,dest,RET_FAIL);
+        if (flags&CP_V) printf(FILE_DELETED,dest);
+      }
+      else
+      {
+        if (move) return #'_mv_ask_overwrite;
+        else return #'_cp_ask_overwrite;
+      }
+    case -1:
+      if (move)
+      {
+        if (rename(source,dest)) return ERROR(NO_MOVE,source,RET_FAIL);
+        if (flags&CP_V) printf(FILE_MOVED,source);
+        return RET_OK;
+      }
+      if (copy_file(source,dest)) return ERROR(NO_COPY,source,RET_FAIL);
+      if (flags&CP_V) printf(FILE_COPIED,source);
+      return RET_OK;
+  }
+  return 0; // not-reached
+}
+
+static void _cp_ask_overwrite2(string input, mixed *filedata,
+                               int interactive,int flags,int move)
+{
+  if (!sizeof(input)) input=" ";
+  input=lower_case(input);
+  switch(input[0])
+  {
+    case 'q':
+      printf("%s abgebrochen!\n",move?"Bewegen":"Kopieren");
+      return;
+    case 'a':
+      flags|=CP_F;
+      if (!(flags&CP_I))
+      {
+        asynchron(filedata,#'cp_file,move,flags,0);
+        return;
+      }
+    case 'y':
+    case 'j':
+      if (!rm(filedata[0][DESTNAME]))
+        printf(DEST_NO_DELETE "Uebergehe Datei...\n",filedata[0][DESTNAME]);
+      else
+      {
+        if (flags&CP_V) printf(FILE_DELETED,filedata[0][DESTNAME]);
+        if (move)
+        {
+          if (rename(filedata[0][FULLNAME],filedata[0][DESTNAME]))
+            printf(NO_MOVE "Uebergehe Datei...\n",filedata[0][FULLNAME]);
+        }
+        else
+        {
+          if (copy_file(filedata[0][FULLNAME],filedata[0][DESTNAME]))
+            printf(NO_COPY "Uebergehe Datei...\n",filedata[0][FULLNAME]);
+        }
+      }
+    case 'n':
+      if (flags&CP_I)
+        _cp_ask_copy(filedata[1+filedata[0][SUBDIRSIZE]..],move,flags);
+      else
+        asynchron(filedata[1+filedata[0][SUBDIRSIZE]..],
+                                     #'cp_file,move,flags,0);
+      return;
+    default:
+      printf("Kommando nicht verstanden.\n");
+      _cp_ask_overwrite(filedata,interactive,flags);
+      return;
+  }
+
+}
+
+static void _cp_ask_overwrite(mixed *filedata, int interactive, int flags)
+{
+  printf("Die Datei '%s' existiert schon.\n",
+         filedata[0][DESTNAME]);
+  input_to("_cp_ask_overwrite2",INPUT_PROMPT,"Ueberschreiben? (j,n,a,q): ",
+      filedata,interactive,flags,0);
+  return;
+}
+
+static void _mv_ask_overwrite(mixed *filedata, int interactive, int flags)
+{
+  printf("Die Datei '%s' existiert schon.",
+         filedata[0][DESTNAME]);
+  input_to("_cp_ask_overwrite2",INPUT_PROMPT,"Ueberschreiben? (j,n,a,q): ",
+      filedata,interactive,flags,1);
+  return;
+}
+
+static void _cp_ask_copy2(string input,mixed *filedata,int mode,
+                           int flags,int move)
+{
+  if (!sizeof(input)) input=" ";
+  input=lower_case(input);
+  switch(input[0])
+  {
+    case 'y':
+    case 'j':
+      if (mode==1)
+      {
+        if (!(flags&CP_F))
+        {
+          if (move) _mv_ask_overwrite(filedata,1,flags);
+          else      _cp_ask_overwrite(filedata,1,flags);
+          return;
+        }
+        if (!rm(filedata[0][DESTNAME]))
+        {
+          printf(DEST_NO_DELETE "Uebergehe Datei...\n",
+                 filedata[0][DESTNAME]);
+          _cp_ask_copy(filedata[1..],move,flags);
+          return;
+        }
+        if (flags&CP_V) printf(FILE_DELETED,filedata[0][DESTNAME]);
+      }
+      if (mode<2)
+      {
+        if (move) rename(filedata[0][FULLNAME],filedata[0][DESTNAME]);
+        else copy_file(filedata[0][FULLNAME],filedata[0][DESTNAME]);
+        _cp_ask_copy(filedata[1..],move,flags);
+        return;
+      }
+      if (mode==2)
+      {
+        if (move)
+        {
+          if (rename(filedata[0][FULLNAME],filedata[0][DESTNAME]))
+            printf(NO_MOVE "Uebergehe Verzeichnis...\n",
+                   filedata[0][FULLNAME]);
+          _cp_ask_copy(filedata[1+filedata[0][SUBDIRSIZE]..],move,flags);
+          return;
+        }
+        if (mkdir(filedata[0][DESTNAME]))
+        {
+          _cp_ask_copy(filedata[1..],0,flags);
+          return;
+        }
+        printf(NO_CREATE_DIR "Uebergehe Verzeichnis...\n",
+               filedata[0][DESTNAME]);
+      }
+    case 'n':
+      _cp_ask_copy(filedata[(1+filedata[0][SUBDIRSIZE])..],0,flags);
+      return;
+    case 'q':
+      printf("Kopieren abgebrochen!\n");
+      return;
+    case 'a':
+      flags&=~CP_I;
+      asynchron(filedata,#'cp_file,move,flags,0);
+      return;
+    default:
+      printf("Kommando nicht verstanden.\n");
+      _cp_ask_copy(filedata,0,flags);
+      return;
+  }
+}
+
+static void _cp_ask_copy(mixed *filedata,int move, int flags)
+{
+  mixed data;
+  string dest,source;
+  int delete_subs,jump;
+
+  if(!sizeof(filedata))
+  {
+    printf("%s: abgeschlossen.\n",move?"mv":"cp");
+    return; 
+  }
+  dest=filedata[0][DESTNAME];
+  source=filedata[0][FULLNAME];
+  switch(0)   // break wirkt damit wie ein goto end_of_switch
+  {
+    default:
+    case 0: // Sinnlos, aber er compiliert sonst nicht :(
+      jump=filedata[0][SUBDIRSIZE];
+      if (source==dest)
+      {
+        printf(SAME_FILE,source);
+        break;
+      }
+      if (!MAY_READ(source))
+      {
+        printf(NO_READ,source);
+        break;
+      }
+      if (!MAY_WRITE(dest))
+      {
+        printf(NO_WRITE,dest);
+        jump=0;
+        break;
+      }
+      if (filedata[0][FILESIZE]==-1)
+      {
+        printf(DOESNT_EXIST,source);
+        break;
+      }
+      if (filedata[0][FILESIZE]==-2) // Quelle ist Verzeichnis
+      {
+        if (file_size(dest)>-1)
+        {
+          printf(NO_DIRS,dest);
+          break;
+        }
+        if (file_size(dest)==-2)
+        {
+          jump=0;
+          break;
+        }
+        printf("Verzeichnis '%s' %s?\n",source,
+               move?"bewegen":"kopieren");
+        input_to("_cp_ask_copy2",INPUT_PROMPT, "(j,n,a,q) ",
+            filedata,2,flags,move);
+        return;
+      }
+      if (file_size(dest)==-2)
+      {
+        printf(DEST_IS_DIR,dest);
+        break;
+      }
+      printf("'%s' %s?\n",source,move?"bewegen":"kopieren");
+      input_to("_cp_ask_copy2",INPUT_PROMPT, "(j,n,a,q) ",
+          filedata,(file_size(dest)!=-1),flags,move);
+      return;
+  }
+  _cp_ask_copy(filedata[1+jump..],move,flags);
+  return;
+}
+
+
+static int _cp(string cmdline)
+{
+  mixed *args;
+  int flags;
+  string mask;
+  string dest,*dest2;
+  cmdline=_unparsed_args();
+  args=parseargs(cmdline,&flags,CP_OPTS,0);
+  if (flags==-1||!sizeof(args))
+    return USAGE(query_verb()+" [-" CP_OPTS
+                 "] <datei/verz> [<datei2/verz2> ... ] <ziel> [<maske>]");
+  if (flags&CP_M)
+  {
+    mask=args[<1];
+    args=args[0..<2];
+  }
+  if (!dest=to_filename(args[<1]))
+     return USAGE(query_verb()+" [-" CP_OPTS
+          "] <datei/verz> [<datei2/verz2> ... ] <ziel> [<maske>]");
+  if (file_size(dest)==-1)
+  {
+    dest2=explode(dest,"/");
+    if (file_size(implode(dest2[0..<2],"/"))==-2)
+    {
+      if (dest2[<1]=="*")
+        dest=implode(dest2[0..<2],"/");
+      else
+        if (member(dest2[<1],'*')>-1||
+            member(dest2[<1],'?')>-1)
+         return notify_fail(
+          sprintf("%s: Keine * und ? im Zielnamen erlaubt.\n",query_verb())),0;
+    }
+    else
+      return notify_fail(
+        sprintf("%s: Der angegebene Zielpfad existiert nicht.\n",
+                query_verb())),0;
+  }
+  args=args[0..<2];
+  if (file_size(dest)!=-2&&sizeof(args)>1)
+    return notify_fail(
+        sprintf("%s: Bei mehreren Quellen muss das Ziel ein Verzeichnis "
+                "sein.\n",query_verb())),0;
+  if (!sizeof(args=map(args,#'to_filename)-({0})))
+    return USAGE(query_verb()+" [-" CP_OPTS
+          "] <datei/verz> [<datei2/verz2> ... ] <ziel> [<maske>]");
+  // DEBUG("DEST: " + dest + " : FLAGS: " + flags);
+  args=file_list(args,MODE_CP,(flags&CP_R),dest+"/",mask);
+  if (!sizeof(args))
+    return notify_fail(sprintf("%s: Keine passenden Dateien gefunden.\n",
+                               query_verb())),0;
+
+  if (sizeof(args)>1&&(args[0][FILESIZE]>=0)&&file_size(dest)!=-2)
+      return notify_fail(
+        sprintf("%s: Bei mehreren Quellen muss das Ziel ein Verzeichnis "
+                "sein.\n",query_verb())),0;
+  if (sizeof(args)==1&&file_size(dest)!=-2)
+    args[0][DESTNAME]=dest;
+  if (!(flags&CP_I))
+  {
+    asynchron(args,#'cp_file,(query_verb()=="mv"),flags,0);
+    return 1;
+  }
+  if (query_verb()=="cp")
+    _cp_ask_copy(args,0,flags);
+  else
+    _cp_ask_copy(args,1,flags);
+  return 1;
+}
+
+//                              #########
+//############################### RMDIR #################################
+//                              #########
+
+
+//
+// _rmdir: Verzeichnis loeschen
+// cmdline: Kommandozeilenargumente
+//
+
+
+#if __VERSION__ < "3.2.9"
+
+private int _dir_filter(mixed arg)
+{
+  return (arg[FILESIZE]==-2);
+}
+
+#endif
+
+static int _rmdir(string cmdline)
+{
+  string dest,tmp;
+  int flags;
+  mixed *args;
+  
+  cmdline=_unparsed_args();
+  args=parseargs(cmdline,&flags,RMDIR_OPTS,1);
+  if (flags==-1||!sizeof(args))
+    return USAGE("rmdir [-" RMDIR_OPTS "] <Verzeichnis>");
+  if (sizeof(args)>1)
+    return
+    notify_fail("Mit 'rmdir' kann nur jeweils EIN Verzeichnis geloescht "
+         "werden.\nDer Befehl 'rm' bietet erweiterte Moeglichkeiten.\n"),0;
+  dest=args[0];
+  if (dest!="/")
+  {
+    args=file_list(({dest}),MODE_RMDIR,0,"/");
+#if __VERSION__ < "3.2.9"
+    args=filter(args,#'_dir_filter);
+#else
+    args=filter(args,(: ($1[FILESIZE]==-2) :));
+#endif
+    if (!sizeof(args))
+      return notify_fail(
+        sprintf("rmdir: %s: Kein solches Verzeichnis gefunden.\n",dest)),0;
+    if (sizeof(args)>1)
+      return notify_fail(
+                sprintf("rmdir: %s: Maske ist nicht eindeutig.\n",dest)),0;
+    dest=args[0][FULLNAME];
+    if (!MAY_WRITE(dest)) return ERROR(NO_WRITE,dest,1);
+    if (!rmdir(dest))
+    {
+      if (sizeof((get_dir(dest+"/*")||({}))-({".",".."})))
+        printf("rmdir: %s: Verzeichnis ist nicht leer.\n",dest);
+    }
+    else
+    {
+      if (flags&&RMDIR_V) printf(FILE_DELETED,dest);
+    }
+    return 1;
+  }
+  return ERROR(NO_DELETE,dest,1);
+}
+
+//                              #########
+//############################### MKDIR #################################
+//                              #########
+
+
+//
+// _mkdir: Verzeichnis erstellen
+// cmdline: Kommandozeilenargumente
+//
+
+static int _mkdir(string cmdline)
+{
+  string dest,tmp;
+  int flags,i;
+  string *args;
+  
+  cmdline=_unparsed_args();
+  args=parseargs(cmdline,&flags,MKDIR_OPTS,1);
+  if (flags==-1) return 0;
+  if (!sizeof(args))
+    return USAGE("mkdir [-" MKDIR_OPTS "] <Verzeichnis>");
+  if (sizeof(args)>1)
+    return notify_fail("Mit 'mkdir' kann nur jeweils EIN Verzeichnis "
+                       "erstellt werden.\n"),0;
+  dest=args[0];
+  
+  if ((i=file_size(implode((args=explode(dest,"/"))[0..<2],"/")))==FSIZE_DIR)
+  {
+    if (!mkdir(dest)) return ERROR(NO_CREATE_DIR,dest,1);
+    if (flags&MKDIR_V) printf(DIR_CREATED,dest,1);
+    printf("mkdir: abgeschlossen.\n");
+    return 1;
+  }
+  
+  if (i==FSIZE_NOFILE)
+  {
+    if (flags&MKDIR_R)
+    {
+      if (mkdirp(dest) != 1)
+        return ERROR(NO_CREATE_DIR,dest,1);
+      if (flags&MKDIR_V)
+        printf(DIR_CREATED,implode(args[0..i],"/"));
+      printf("mkdir: abgeschlossen.\n");
+      return 1;
+    }
+    return ERROR(DOESNT_EXIST,implode(args[0..<2],"/"),1);
+  }
+  return ERROR(ALREADY_EXISTS,dest,1);
+}
+
+//                               ######
+//################################ RM ###################################
+//                               ######
+
+private void _rm_ask_delete(mixed *filedata, int flags);
+
+static void _rm_ask_delete2(string input,mixed *filedata,int flags)
+{
+  int i;
+  if (!sizeof(input)) input=" ";
+  input=lower_case(input);
+  switch(input[0])
+  {
+    case 'q':
+      printf("Loeschen abgebrochen!\n");
+      return;
+    case 'y':
+    case 'j':
+      if (filedata[0][FILESIZE]==-2)
+      {
+        if (i=filedata[0][SUBDIRSIZE]) // Dir-Eintrag nach hinten schieben
+        {
+          mixed temp;
+          int j;
+          temp=filedata[0];
+          temp[SUBDIRSIZE]=0;
+          for(j=0;j<i;j++) filedata[j]=filedata[j+1];
+          filedata[j]=temp;
+          _rm_ask_delete(filedata,flags);
+          return;
+        }
+        if (!rmdir(filedata[0][FULLNAME]))
+          printf(NO_DELETE,filedata[0][FULLNAME]);
+        else if (flags&RM_V) printf(FILE_DELETED,filedata[0][FULLNAME]);
+      }
+      else // Datei existiert
+      {
+        if (!rm(filedata[0][FULLNAME]))
+          printf(DEST_NO_DELETE "Uebergehe Datei...\n",
+                 filedata[0][FULLNAME]);
+        else if (flags&RM_V) printf(FILE_DELETED,filedata[0][FULLNAME]);
+        
+      }
+    case 'n':
+      _rm_ask_delete(filedata[1+filedata[0][SUBDIRSIZE]..],flags);
+      return;
+    default:
+      printf("Kommando nicht verstanden.\n");
+      _rm_ask_delete(filedata,flags);
+      return;
+  }
+  return;
+}
+
+private void _rm_ask_delete(mixed *filedata, int flags)
+{
+  int i;
+  mixed temp;
+  if (!sizeof(filedata))
+  {
+    printf("rm: abgeschlossen.\n");
+    return;
+  }
+  switch(filedata[0][FILESIZE])
+  {
+    case -1:
+      if (flags&RM_V) printf(DOESNT_EXIST,filedata[0][FULLNAME]);
+      _rm_ask_delete(filedata[1..],flags);
+      return;
+    case -2:
+      if (i=filedata[0][SUBDIRSIZE])
+        printf("Ins Verzeichnis '%s' hinabsteigen?\n",
+          filedata[0][FULLNAME]);
+      else
+        printf("Verzeichnis '%s' loeschen?\n",
+               filedata[0][FULLNAME]);
+      input_to("_rm_ask_delete2",INPUT_PROMPT, "(j,n,q) ",
+          filedata,flags);
+      return;
+    default:
+      printf("'%s' loeschen? (j,n,q)\n",
+         filedata[0][FULLNAME]);
+      input_to("_rm_ask_delete2",INPUT_PROMPT, "(j,n,q) ",
+          filedata,flags);
+      return;
+  }
+}
+
+
+private void rm_file(mixed filedata, mixed notused, int flags)
+{
+  string dest;
+  dest=filedata[FULLNAME];
+  if (!MAY_WRITE(dest))
+  {
+    printf(NO_WRITE,dest);
+    return;
+  }
+  switch(filedata[FILESIZE])
+  {
+    case -1:
+      if (flags&RM_V) printf(DOESNT_EXIST,dest);
+      return;
+    case -2:
+      if (!rmdir(dest)) printf(DEST_NO_DELETE,dest);
+      else
+      {
+        if (flags&RM_V) printf(FILE_DELETED,dest);
+      }
+      return;
+    default:
+      if (!rm(dest)) printf(DEST_NO_DELETE,dest);
+      else
+      {
+        if (flags&RM_V) printf(FILE_DELETED,dest);
+      }
+      return;
+  }
+}
+
+static int _rm(string cmdline)
+{
+  mixed *args,*args2;
+  int flags,i;
+  string mask;
+  
+  cmdline=_unparsed_args();
+  args=parseargs(cmdline,&flags,RM_OPTS,0);
+  if (flags==-1||!sizeof(args))
+    return USAGE("rm [-" RM_OPTS
+                 "] <datei/verz> [<datei2/verz2> ... ] [<maske>]");
+  if (flags&RM_M)
+  {
+    mask=args[<1];
+    args=args[0..<2];
+  }
+  args=map(args,#'to_filename)-({0});
+  args=file_list(args,MODE_RM,(flags&RM_R),"/",mask);
+  if (!(i=sizeof(args)))
+    return printf("Keine passende Datei gefunden.\n"),1;
+  if (!(flags&RM_I))
+  {
+    if (i>1) // Umdrehen
+    {
+      mixed temp;
+      i>>=1;
+      while(i)
+      {
+        temp=args[<(i--)];
+        args[<(i+1)]=args[i];
+        args[i]=temp;
+      }
+    }
+    asynchron(args,#'rm_file,args,flags,0);
+    return 1;
+  }
+  _rm_ask_delete(args,flags);
+  return 1;
+}