tmi2_fluffos_v2/
tmi2_fluffos_v2/bin/
tmi2_fluffos_v2/etc/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/ChangeLog.old/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/Win32/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/compat/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/compat/simuls/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/include/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/testsuite/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/testsuite/clone/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/testsuite/command/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/testsuite/data/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/testsuite/etc/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/testsuite/include/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/testsuite/inherit/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/testsuite/inherit/master/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/testsuite/log/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/testsuite/single/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/testsuite/single/tests/compiler/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/testsuite/single/tests/efuns/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/testsuite/single/tests/operators/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/testsuite/u/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/tmp/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/windows/
tmi2_fluffos_v2/lib/
tmi2_fluffos_v2/lib/adm/
tmi2_fluffos_v2/lib/adm/daemons/languages/
tmi2_fluffos_v2/lib/adm/daemons/network/I3/
tmi2_fluffos_v2/lib/adm/daemons/virtual/
tmi2_fluffos_v2/lib/adm/daemons/virtual/template/
tmi2_fluffos_v2/lib/adm/news/
tmi2_fluffos_v2/lib/adm/obj/
tmi2_fluffos_v2/lib/adm/obj/master/
tmi2_fluffos_v2/lib/adm/priv/
tmi2_fluffos_v2/lib/adm/shell/
tmi2_fluffos_v2/lib/adm/tmp/
tmi2_fluffos_v2/lib/cmds/
tmi2_fluffos_v2/lib/d/
tmi2_fluffos_v2/lib/d/Conf/
tmi2_fluffos_v2/lib/d/Conf/adm/
tmi2_fluffos_v2/lib/d/Conf/boards/
tmi2_fluffos_v2/lib/d/Conf/cmds/
tmi2_fluffos_v2/lib/d/Conf/data/
tmi2_fluffos_v2/lib/d/Conf/logs/
tmi2_fluffos_v2/lib/d/Conf/obj/
tmi2_fluffos_v2/lib/d/Conf/text/help/
tmi2_fluffos_v2/lib/d/Fooland/adm/
tmi2_fluffos_v2/lib/d/Fooland/data/
tmi2_fluffos_v2/lib/d/Fooland/data/attic/
tmi2_fluffos_v2/lib/d/Fooland/items/
tmi2_fluffos_v2/lib/d/TMI/
tmi2_fluffos_v2/lib/d/TMI/adm/
tmi2_fluffos_v2/lib/d/TMI/boards/
tmi2_fluffos_v2/lib/d/TMI/data/
tmi2_fluffos_v2/lib/d/TMI/rooms/
tmi2_fluffos_v2/lib/d/grid/
tmi2_fluffos_v2/lib/d/grid/adm/
tmi2_fluffos_v2/lib/d/grid/data/
tmi2_fluffos_v2/lib/d/std/
tmi2_fluffos_v2/lib/d/std/adm/
tmi2_fluffos_v2/lib/data/adm/
tmi2_fluffos_v2/lib/data/adm/daemons/
tmi2_fluffos_v2/lib/data/adm/daemons/doc_d/
tmi2_fluffos_v2/lib/data/adm/daemons/emoted/
tmi2_fluffos_v2/lib/data/adm/daemons/network/http/
tmi2_fluffos_v2/lib/data/adm/daemons/network/services/mail_q/
tmi2_fluffos_v2/lib/data/adm/daemons/network/smtp/
tmi2_fluffos_v2/lib/data/adm/daemons/news/archives/
tmi2_fluffos_v2/lib/data/attic/connection/
tmi2_fluffos_v2/lib/data/attic/user/
tmi2_fluffos_v2/lib/data/std/connection/b/
tmi2_fluffos_v2/lib/data/std/connection/l/
tmi2_fluffos_v2/lib/data/std/user/a/
tmi2_fluffos_v2/lib/data/std/user/b/
tmi2_fluffos_v2/lib/data/std/user/d/
tmi2_fluffos_v2/lib/data/std/user/f/
tmi2_fluffos_v2/lib/data/std/user/l/
tmi2_fluffos_v2/lib/data/std/user/x/
tmi2_fluffos_v2/lib/data/u/d/dm/working/doc_d/
tmi2_fluffos_v2/lib/data/u/l/leto/doc_d/
tmi2_fluffos_v2/lib/data/u/l/leto/smtp/
tmi2_fluffos_v2/lib/doc/
tmi2_fluffos_v2/lib/doc/driverdoc/applies/
tmi2_fluffos_v2/lib/doc/driverdoc/applies/interactive/
tmi2_fluffos_v2/lib/doc/driverdoc/concepts/
tmi2_fluffos_v2/lib/doc/driverdoc/driver/
tmi2_fluffos_v2/lib/doc/driverdoc/efuns/arrays/
tmi2_fluffos_v2/lib/doc/driverdoc/efuns/buffers/
tmi2_fluffos_v2/lib/doc/driverdoc/efuns/compile/
tmi2_fluffos_v2/lib/doc/driverdoc/efuns/ed/
tmi2_fluffos_v2/lib/doc/driverdoc/efuns/filesystem/
tmi2_fluffos_v2/lib/doc/driverdoc/efuns/floats/
tmi2_fluffos_v2/lib/doc/driverdoc/efuns/functions/
tmi2_fluffos_v2/lib/doc/driverdoc/efuns/general/
tmi2_fluffos_v2/lib/doc/driverdoc/efuns/mappings/
tmi2_fluffos_v2/lib/doc/driverdoc/efuns/numbers/
tmi2_fluffos_v2/lib/doc/driverdoc/efuns/parsing/
tmi2_fluffos_v2/lib/doc/driverdoc/lpc/constructs/
tmi2_fluffos_v2/lib/doc/driverdoc/lpc/preprocessor/
tmi2_fluffos_v2/lib/doc/driverdoc/lpc/types/
tmi2_fluffos_v2/lib/doc/driverdoc/platforms/
tmi2_fluffos_v2/lib/doc/mudlib/
tmi2_fluffos_v2/lib/ftp/
tmi2_fluffos_v2/lib/include/driver/
tmi2_fluffos_v2/lib/log/
tmi2_fluffos_v2/lib/log/driver/
tmi2_fluffos_v2/lib/obj/net/
tmi2_fluffos_v2/lib/obj/shells/
tmi2_fluffos_v2/lib/obj/tools/
tmi2_fluffos_v2/lib/std/adt/
tmi2_fluffos_v2/lib/std/board/
tmi2_fluffos_v2/lib/std/body/
tmi2_fluffos_v2/lib/std/fun/
tmi2_fluffos_v2/lib/std/living/
tmi2_fluffos_v2/lib/std/object/
tmi2_fluffos_v2/lib/std/shop/
tmi2_fluffos_v2/lib/std/socket/
tmi2_fluffos_v2/lib/std/user/
tmi2_fluffos_v2/lib/std/virtual/
tmi2_fluffos_v2/lib/student/
tmi2_fluffos_v2/lib/student/kalypso/
tmi2_fluffos_v2/lib/student/kalypso/armor/
tmi2_fluffos_v2/lib/student/kalypso/rooms/
tmi2_fluffos_v2/lib/student/kalypso/weapons/
tmi2_fluffos_v2/lib/u/l/leto/
tmi2_fluffos_v2/lib/u/l/leto/cmds/
tmi2_fluffos_v2/lib/www/errors/
tmi2_fluffos_v2/lib/www/gateways/
tmi2_fluffos_v2/lib/www/images/
tmi2_fluffos_v2/old/
tmi2_fluffos_v2/win32/
//      File    :  /cmds/file/_rm.c
//      Creator :  Watcher@TMI  (02/20/93)
//      Improved:  Watcher@TMI  (03/28/93)  Substituted get_dir() call
//                  for the wildcard() call so that 'dot' files can be
//                  processed as well. Thanks to Zak for the fix.
//                 Watcher@TMI  (04/11/93)  Added multiple line rms.
//                  (ie: rm a1 a2)
//                 Robocoder@TMI (06/23/93) to use file lock daemon
// 93-08-12 Artagel@tmi-2 Fixed bug re: deleting files in non-existant dirs.
//
//      This is the wizard remove file command.  It also responds to
//      wildcard inputs and recursive deletion flags.
 

#include <config.h>
#include <mudlib.h>
#include <daemons.h>
#include <flock.h>
#include <uid.h>

inherit DAEMON ;

#define SYNTAX  "Syntax: rm [-r] [file pattern] [..] [..]\n"
 
static int remove_file(string file, int flag);

int cmd_rm(string str) {
   mixed *files, *path, *multi;
   string dir;
   int flag, loop;
 
   notify_fail( SYNTAX );
   if(!str || str == "")  return 0;
 
   seteuid(getuid(this_object()));
 
   if(sscanf(str, "-r %s", str) == 1)  flag = 1;
 
 
   //   Check for multiple file deletion request
 
   multi = explode(str, " ");

   if(multi && sizeof(multi) > 1) {

        for(loop=0; loop<sizeof(multi); loop++)
          cmd_rm( multi[loop] );

   return 1; }
 
 
   //  Check to see if the request is bad ("..*")

   if(str == "..*") {
   write("Rm: Illegal file pattern.\n");
   return 1; }
 
   str = resolv_path("cwd", str);
 
   //   Check the caller's write permissions in target directory
 
   path = explode(str, "/");
   
   dir = "/" + implode( path[0..sizeof(path)-2], "/" ) + "/";
   if(dir == "//")  dir = "";

   if((int)master()->valid_write(dir, previous_object(), "rm") == 0) {
   write("Rm: Permission denied in " + 
               (dir == "" ? "root directory" : dir) + ".\n");
   return 1; }
 
   //   Check for wildcards present in rm request
 
   files = get_dir(str);
 
   if(files) {
      files -= ({ "." });  files -= ({ ".." });
   }
 
   if(!files || !sizeof(files)) {
   write("Rm: No such pattern : " + str + "\n");
   return 1; }
 
   if(dir == "")  dir = "/";
 
   //   If only one selection match ...
 
   if(sizeof(files) == 1) 
        return remove_file(dir + files[0], flag);
 
   //   Otherwise loop through all the wildcard selections
 
   for(loop=0; loop<sizeof(files); loop++) 
        remove_file(dir + files[loop], flag);
 
return 1; }
 
//  This function removes individual files, and directories if
//  the flag passed returns a true value.
 
static int remove_file(string file, int flag) {
   int try;
 
   //   Check callers permissions on specific file/dir removal
 
   if((int)master()->valid_write(file, previous_object(), "rm") == 0) {
   write("Rm: " + file + " : Permission denied.\n");
   return 1; }
 
   if(directory_exists(file)) {

        //  If no recursive directory deletion ...

        if(!flag) {
        write("Rm: " + file + " is a directory.\n");
        return 1; }

        seteuid(ROOT_UID);                      // Quickly set us to root
        
        try = CLEAN_D->clean_dir(file, 1);

        seteuid(geteuid(previous_object()));    // And set us back
 
        if(!try || !rmdir(file)) {
        write("Rm: " + file + "/ failed.\n");
        return 1; }
 
        write("Rm: " + file + " recursively removed.\n");
 
   return 1; }
 
   if (file_lock(file, F_LOCK))  {
       write(rm(file) ? "Rm: " + file + " removed.\n" :
                        "Rm: " + file + " remove failed.\n");
       file_lock(file, F_UNLOCK);
   } else
       write("Rm: File \"" + file + "\" busy; remove failed.\n");
 
return 1; }
 
string help() {
 
   return( SYNTAX + "\n" +
        "This command will erase any files with the specified file pattern\n"+
        "and the use of '*' as a wildcard is permitted. If the -r flag is\n" +
        "specified, then any subdirectories flagged will be recursively\n" +
        "deleted, otherwise subdirectories are ignored.  This command will\n" +
        "fail if you do not have the proper permission privileges to remove\n"+
        "the specified file pattern. Multiple file deletion is also possible\n"+
        "by separating the requests with spaces (ie: rm a1 b1).\n");
 
}