skylib_mudos_v1/
skylib_mudos_v1/bin/
skylib_mudos_v1/bin/db/
skylib_mudos_v1/mudlib/banish/a/
skylib_mudos_v1/mudlib/banish/b/
skylib_mudos_v1/mudlib/banish/c/
skylib_mudos_v1/mudlib/banish/d/
skylib_mudos_v1/mudlib/banish/e/
skylib_mudos_v1/mudlib/banish/f/
skylib_mudos_v1/mudlib/banish/g/
skylib_mudos_v1/mudlib/banish/h/
skylib_mudos_v1/mudlib/banish/j/
skylib_mudos_v1/mudlib/banish/l/
skylib_mudos_v1/mudlib/banish/m/
skylib_mudos_v1/mudlib/banish/n/
skylib_mudos_v1/mudlib/banish/o/
skylib_mudos_v1/mudlib/banish/p/
skylib_mudos_v1/mudlib/banish/r/
skylib_mudos_v1/mudlib/banish/s/
skylib_mudos_v1/mudlib/banish/t/
skylib_mudos_v1/mudlib/banish/u/
skylib_mudos_v1/mudlib/banish/w/
skylib_mudos_v1/mudlib/cmds/
skylib_mudos_v1/mudlib/cmds/admin/
skylib_mudos_v1/mudlib/cmds/guild-race/
skylib_mudos_v1/mudlib/cmds/guild-race/crafts/
skylib_mudos_v1/mudlib/cmds/guild-race/magic/
skylib_mudos_v1/mudlib/cmds/guild-race/other/
skylib_mudos_v1/mudlib/cmds/living/broken/
skylib_mudos_v1/mudlib/cmds/player/group_cmds/
skylib_mudos_v1/mudlib/d/admin/
skylib_mudos_v1/mudlib/d/admin/room/
skylib_mudos_v1/mudlib/d/admin/room/we_care/
skylib_mudos_v1/mudlib/d/admin/save/
skylib_mudos_v1/mudlib/d/admin/text/
skylib_mudos_v1/mudlib/d/learning/TinyTown/buildings/
skylib_mudos_v1/mudlib/d/learning/TinyTown/map/
skylib_mudos_v1/mudlib/d/learning/TinyTown/roads/
skylib_mudos_v1/mudlib/d/learning/chars/
skylib_mudos_v1/mudlib/d/learning/functions/
skylib_mudos_v1/mudlib/d/learning/handlers/
skylib_mudos_v1/mudlib/d/learning/help_topics/
skylib_mudos_v1/mudlib/d/learning/help_topics/npcs/
skylib_mudos_v1/mudlib/d/learning/help_topics/objects/
skylib_mudos_v1/mudlib/d/learning/help_topics/rcs_demo/
skylib_mudos_v1/mudlib/d/learning/help_topics/rcs_demo/RCS/
skylib_mudos_v1/mudlib/d/learning/help_topics/rooms/
skylib_mudos_v1/mudlib/d/learning/help_topics/rooms/crowd/
skylib_mudos_v1/mudlib/d/learning/help_topics/rooms/situations/
skylib_mudos_v1/mudlib/d/learning/save/
skylib_mudos_v1/mudlib/d/learning/school/
skylib_mudos_v1/mudlib/d/learning/school/add_sc/
skylib_mudos_v1/mudlib/d/learning/school/characters/
skylib_mudos_v1/mudlib/d/learning/school/general/
skylib_mudos_v1/mudlib/d/learning/school/getting-started/
skylib_mudos_v1/mudlib/d/learning/school/getting-started/basic_commands/
skylib_mudos_v1/mudlib/d/learning/school/getting-started/edtutor/
skylib_mudos_v1/mudlib/d/learning/school/getting-started/unix_tutor/
skylib_mudos_v1/mudlib/d/learning/school/items/
skylib_mudos_v1/mudlib/d/learning/school/npc_school/
skylib_mudos_v1/mudlib/d/learning/school/room_school/
skylib_mudos_v1/mudlib/d/learning/school/room_school/room_basic/
skylib_mudos_v1/mudlib/d/learning/school/room_school/situations/
skylib_mudos_v1/mudlib/d/learning/school/room_school/terrain_tutor/
skylib_mudos_v1/mudlib/d/learning/text/
skylib_mudos_v1/mudlib/d/liaison/
skylib_mudos_v1/mudlib/d/mudlib/
skylib_mudos_v1/mudlib/d/mudlib/changes/
skylib_mudos_v1/mudlib/d/playtesters/
skylib_mudos_v1/mudlib/d/playtesters/effects/
skylib_mudos_v1/mudlib/d/playtesters/handlers/
skylib_mudos_v1/mudlib/d/playtesters/items/
skylib_mudos_v1/mudlib/d/sage/
skylib_mudos_v1/mudlib/doc/
skylib_mudos_v1/mudlib/doc/creator/
skylib_mudos_v1/mudlib/doc/driver/
skylib_mudos_v1/mudlib/doc/driver/efuns/arrays/
skylib_mudos_v1/mudlib/doc/driver/efuns/buffers/
skylib_mudos_v1/mudlib/doc/driver/efuns/compile/
skylib_mudos_v1/mudlib/doc/driver/efuns/filesystem/
skylib_mudos_v1/mudlib/doc/driver/efuns/floats/
skylib_mudos_v1/mudlib/doc/driver/efuns/functions/
skylib_mudos_v1/mudlib/doc/driver/efuns/general/
skylib_mudos_v1/mudlib/doc/driver/efuns/mappings/
skylib_mudos_v1/mudlib/doc/driver/efuns/mixed/
skylib_mudos_v1/mudlib/doc/driver/efuns/mudlib/
skylib_mudos_v1/mudlib/doc/driver/efuns/numbers/
skylib_mudos_v1/mudlib/doc/driver/efuns/parsing/
skylib_mudos_v1/mudlib/doc/known_command/
skylib_mudos_v1/mudlib/doc/login/
skylib_mudos_v1/mudlib/doc/lpc/basic_manual/
skylib_mudos_v1/mudlib/doc/lpc/intermediate/
skylib_mudos_v1/mudlib/doc/new/add_command/
skylib_mudos_v1/mudlib/doc/new/events/
skylib_mudos_v1/mudlib/doc/new/handlers/
skylib_mudos_v1/mudlib/doc/new/living/race/
skylib_mudos_v1/mudlib/doc/new/living/spells/
skylib_mudos_v1/mudlib/doc/new/object/
skylib_mudos_v1/mudlib/doc/new/player/
skylib_mudos_v1/mudlib/doc/new/room/guild/
skylib_mudos_v1/mudlib/doc/new/room/outside/
skylib_mudos_v1/mudlib/doc/new/room/storeroom/
skylib_mudos_v1/mudlib/doc/object/
skylib_mudos_v1/mudlib/doc/playtesters/
skylib_mudos_v1/mudlib/doc/policy/
skylib_mudos_v1/mudlib/doc/weapons/
skylib_mudos_v1/mudlib/global/
skylib_mudos_v1/mudlib/global/creator/
skylib_mudos_v1/mudlib/global/handlers/
skylib_mudos_v1/mudlib/global/virtual/setup_compiler/
skylib_mudos_v1/mudlib/include/cmds/
skylib_mudos_v1/mudlib/include/effects/
skylib_mudos_v1/mudlib/include/npc/
skylib_mudos_v1/mudlib/include/room/
skylib_mudos_v1/mudlib/include/shops/
skylib_mudos_v1/mudlib/net/daemon/
skylib_mudos_v1/mudlib/net/daemon/chars/
skylib_mudos_v1/mudlib/net/inherit/
skylib_mudos_v1/mudlib/net/obj/
skylib_mudos_v1/mudlib/obj/amulets/
skylib_mudos_v1/mudlib/obj/b_day/
skylib_mudos_v1/mudlib/obj/clothes/
skylib_mudos_v1/mudlib/obj/dwarmours/plate/
skylib_mudos_v1/mudlib/obj/dwclothes/transport/horse/
skylib_mudos_v1/mudlib/obj/dwscabbards/
skylib_mudos_v1/mudlib/obj/dwweapons/axes/
skylib_mudos_v1/mudlib/obj/dwweapons/chains/
skylib_mudos_v1/mudlib/obj/faith/symbols/
skylib_mudos_v1/mudlib/obj/fungi/
skylib_mudos_v1/mudlib/obj/gatherables/
skylib_mudos_v1/mudlib/obj/instruments/
skylib_mudos_v1/mudlib/obj/magic/
skylib_mudos_v1/mudlib/obj/media/
skylib_mudos_v1/mudlib/obj/misc/player_shop/
skylib_mudos_v1/mudlib/obj/monster/godmother/
skylib_mudos_v1/mudlib/obj/monster/transport/
skylib_mudos_v1/mudlib/obj/rings/
skylib_mudos_v1/mudlib/obj/spells/
skylib_mudos_v1/mudlib/obj/stationery/
skylib_mudos_v1/mudlib/obj/stationery/envelopes/
skylib_mudos_v1/mudlib/obj/stationery/papers/
skylib_mudos_v1/mudlib/obj/toys/
skylib_mudos_v1/mudlib/obj/vessels/
skylib_mudos_v1/mudlib/obj/weapons/swords/
skylib_mudos_v1/mudlib/save/autodoc/
skylib_mudos_v1/mudlib/save/leaflets/
skylib_mudos_v1/mudlib/save/mail/
skylib_mudos_v1/mudlib/save/new_soul/data/
skylib_mudos_v1/mudlib/save/parcels/
skylib_mudos_v1/mudlib/save/playerinfo/
skylib_mudos_v1/mudlib/save/players/d/
skylib_mudos_v1/mudlib/save/random_names/
skylib_mudos_v1/mudlib/save/random_names/data/
skylib_mudos_v1/mudlib/save/terrains/
skylib_mudos_v1/mudlib/save/terrains/tutorial_desert/
skylib_mudos_v1/mudlib/save/terrains/tutorial_grassy_field/
skylib_mudos_v1/mudlib/save/terrains/tutorial_mountain/
skylib_mudos_v1/mudlib/save/todo_lists/
skylib_mudos_v1/mudlib/secure/
skylib_mudos_v1/mudlib/secure/cmds/admin/
skylib_mudos_v1/mudlib/secure/cmds/lord/
skylib_mudos_v1/mudlib/secure/config/
skylib_mudos_v1/mudlib/secure/handlers/autodoc/
skylib_mudos_v1/mudlib/secure/handlers/intermud/
skylib_mudos_v1/mudlib/secure/include/global/
skylib_mudos_v1/mudlib/secure/save/
skylib_mudos_v1/mudlib/secure/save/handlers/
skylib_mudos_v1/mudlib/secure/std/classes/
skylib_mudos_v1/mudlib/secure/std/modules/
skylib_mudos_v1/mudlib/std/commands/
skylib_mudos_v1/mudlib/std/commands/shadows/
skylib_mudos_v1/mudlib/std/creator/
skylib_mudos_v1/mudlib/std/dom/
skylib_mudos_v1/mudlib/std/effects/
skylib_mudos_v1/mudlib/std/effects/external/
skylib_mudos_v1/mudlib/std/effects/fighting/
skylib_mudos_v1/mudlib/std/effects/priest/
skylib_mudos_v1/mudlib/std/effects/room/
skylib_mudos_v1/mudlib/std/environ/
skylib_mudos_v1/mudlib/std/guilds/
skylib_mudos_v1/mudlib/std/guilds/old/
skylib_mudos_v1/mudlib/std/languages/
skylib_mudos_v1/mudlib/std/languages/BACKUPS/
skylib_mudos_v1/mudlib/std/liquids/
skylib_mudos_v1/mudlib/std/npc/
skylib_mudos_v1/mudlib/std/npc/goals/
skylib_mudos_v1/mudlib/std/npc/goals/basic/
skylib_mudos_v1/mudlib/std/npc/goals/misc/
skylib_mudos_v1/mudlib/std/npc/plans/
skylib_mudos_v1/mudlib/std/npc/plans/basic/
skylib_mudos_v1/mudlib/std/npc/types/
skylib_mudos_v1/mudlib/std/npc/types/helper/
skylib_mudos_v1/mudlib/std/npcs/
skylib_mudos_v1/mudlib/std/outsides/
skylib_mudos_v1/mudlib/std/races/shadows/
skylib_mudos_v1/mudlib/std/room/basic/topography/
skylib_mudos_v1/mudlib/std/room/controller/
skylib_mudos_v1/mudlib/std/room/inherit/topography/
skylib_mudos_v1/mudlib/std/room/topography/area/
skylib_mudos_v1/mudlib/std/room/topography/iroom/
skylib_mudos_v1/mudlib/std/room/topography/milestone/
skylib_mudos_v1/mudlib/std/shadows/curses/
skylib_mudos_v1/mudlib/std/shadows/disease/
skylib_mudos_v1/mudlib/std/shadows/fighting/
skylib_mudos_v1/mudlib/std/shadows/healing/
skylib_mudos_v1/mudlib/std/shadows/magic/
skylib_mudos_v1/mudlib/std/shadows/poison/
skylib_mudos_v1/mudlib/std/shadows/rituals/
skylib_mudos_v1/mudlib/std/shadows/room/
skylib_mudos_v1/mudlib/std/shops/controllers/
skylib_mudos_v1/mudlib/std/shops/objs/
skylib_mudos_v1/mudlib/std/shops/player_shop/
skylib_mudos_v1/mudlib/std/socket/
skylib_mudos_v1/mudlib/std/soul/
skylib_mudos_v1/mudlib/std/soul/d/
skylib_mudos_v1/mudlib/std/soul/e/
skylib_mudos_v1/mudlib/std/soul/i/
skylib_mudos_v1/mudlib/std/soul/j/
skylib_mudos_v1/mudlib/std/soul/k/
skylib_mudos_v1/mudlib/std/soul/l/
skylib_mudos_v1/mudlib/std/soul/n/
skylib_mudos_v1/mudlib/std/soul/o/
skylib_mudos_v1/mudlib/std/soul/q/
skylib_mudos_v1/mudlib/std/soul/u/
skylib_mudos_v1/mudlib/std/soul/v/
skylib_mudos_v1/mudlib/std/soul/y/
skylib_mudos_v1/mudlib/std/soul/z/
skylib_mudos_v1/mudlib/std/stationery/
skylib_mudos_v1/mudlib/w/
skylib_mudos_v1/mudlib/w/default/
skylib_mudos_v1/mudlib/w/default/armour/
skylib_mudos_v1/mudlib/w/default/clothes/
skylib_mudos_v1/mudlib/w/default/item/
skylib_mudos_v1/mudlib/w/default/npc/
skylib_mudos_v1/mudlib/w/default/room/
skylib_mudos_v1/mudlib/w/default/weapon/
skylib_mudos_v1/mudlib/www/
skylib_mudos_v1/mudlib/www/download/
skylib_mudos_v1/mudlib/www/java/
skylib_mudos_v1/mudlib/www/secure/
skylib_mudos_v1/mudlib/www/secure/lpc/advanced/
skylib_mudos_v1/mudlib/www/secure/lpc/intermediate/
skylib_mudos_v1/v22.2b14-DSv10/
skylib_mudos_v1/v22.2b14-DSv10/ChangeLog.old/
skylib_mudos_v1/v22.2b14-DSv10/Win32/
skylib_mudos_v1/v22.2b14-DSv10/compat/
skylib_mudos_v1/v22.2b14-DSv10/compat/simuls/
skylib_mudos_v1/v22.2b14-DSv10/include/
skylib_mudos_v1/v22.2b14-DSv10/mudlib/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/clone/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/command/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/data/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/etc/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/include/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/inherit/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/inherit/master/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/log/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/single/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/single/tests/compiler/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/single/tests/efuns/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/single/tests/operators/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/u/
skylib_mudos_v1/v22.2b14-DSv10/tmp/
skylib_mudos_v1/v22.2b14-DSv10/windows/
/* Remote Editor
 * Shaydz 1/3/02
 * Small bits of code, and idea from Descartes of Borg RCP
 */

#include <access.h>
#include <network.h>

#define PORT_RCP 7320;

inherit SERVER;

#include <remote.h>

private string Password;
private mapping Connections;
private string Directory, Home;
private int connected;

string eventWriteFile(int fd, string file, string str) {
    file = replace(file,"^M");
    file = replace(file,"\r");
    if (!master()->valid_write(file,Connections[fd]["username"] , "write_file"))
        return "50 Permission denied to write: " + file;
    if( file_size(file) > -1 && !rm(file) )
        return "50 Failed to write file: " + file;
    if( !write_file(file, str) ) return "50 Failed to write file: " + file;
    else {
        log_file("/secure/log/redit.log", "%s: %s uploaded %s\n",
             ctime(time()), Connections[fd]["username"],file);
        return "110 File " + file + " written.";
    }
} /* eventWriteFile() */

string eventReadFile(int fd, string file) {
    string tmp;

    if (!master()->valid_read(file,Connections[fd]["username"] , "read_file"))
        return "50 Permission denied to read: " + file;

    tmp = read_file(file);
    if( !(tmp = read_file(file)) ) return "";
    log_file("/secure/log/redit.log", "%s: %s downloaded %s\n",
             ctime(time()), Connections[fd]["username"],file);

    return tmp;

} /* eventReadFile() */

string eventCommand(int fd, string cmd, string arg) {
    string *files;
    object ob;
    string tmp;

    switch(cmd) {
    case "ls":

        if( !arg || arg == "" ) arg = Directory;
        if (!master()->valid_read(arg,Connections[fd]["username"] , "get_dir"))
            return 0;
        switch(file_size(arg)) {
        case -2:
            if( arg[<1] != '/' ) arg += "/";
            files = ({ arg });
            files += map(get_dir(arg),
              (: (file_size($(arg) + $1) == -2) ? $1 + "/" : $1 :));
            return implode(files, " ");
        case -1:
            return 0;
        default:
            return arg;
        }
    case "mkdir":
        arg = Directory+arg;
        if (!master()->valid_write(arg,Connections[fd]["username"] , "mkdir"))
            return "50 Permission denied to mkdir: " + arg;
        if( file_size(arg) != -1 ) return 0;
        if( !mkdir(arg) ) return 0;
        else return "Directory created.";
    case "cd":
        arg = Directory+arg;
        if( !arg || arg == "" ) Directory = Home;
        else if( !((int)master()->valid_read(arg, Connections[fd]["username"], "cd")) )
            return 0;
        else Directory = arg;
        return Directory;
    case "rm":
        arg = Directory+arg;
        if (!master()->valid_write(arg,Connections[fd]["username"] , "rm"))
            return "50 Permission denied to rm " + arg;
        if( !rm(arg) ) return 0;
        else return arg + " deleted.";
    case "rmdir":
        arg = Directory+arg;
        if (!master()->valid_write(arg,Connections[fd]["username"] , "rmdir"))
            return "50 Permission denied to rmdir " + arg;
        if( !rmdir(arg) ) return 0;
        else return arg + " deleted.";
    case "mv":
        files = explode(arg, " ");
        if( sizeof(files) != 2 ) return 0;
        files[0] = Directory+files[0];
        files[1] = Directory+ files[1];
        if (!master()->valid_read(files[0],Connections[fd]["username"] , "read_file"))
            return 0;
        if (!master()->valid_write(files[1],Connections[fd]["username"] , "write_file"))
            return 0;
        if( !rename(files[0], files[1]) ) return 0;
        else return files[0] + " renamed to " + files[1] + ".";
    case "update":
        arg = Directory+ arg;
        if( arg[<2..] == ".c" ) arg = arg[0..<3];
        if( ob = find_object(arg) ) {
            if( !((int)ob->eventDestruct()) )
                return "Failed to destruct original object.";
        }
        tmp = catch(call_other(arg, "???"));
        if( tmp )
            return "Error in loading object: " + replace_string(tmp, "\n", "\t");
        else return arg + ": successfully loaded.";
    }
    return 0;
} /* eventCommand() */

void create() {
    server::create();
    Connections = ([]);
    connected = 0;
    call_out( (: Setup :), 1);
} /* create() */

void Setup() {
    seteuid(geteuid(TO));
    if( eventCreateSocket(7320) < 0 ) {
        if( this_object() ) dest_me();
        return;
    }
} /* Setup() */

void eventSocketClosed(int fd) {
    map_delete(Connections, fd);
    connected=0;
} /* eventSocketClosed() */

void eventRead(int fd, string str) {
    if( !str ) {
        eventWrite(fd, "50 Invalid command.\n", 1);
        if( Connections[fd] ){
            map_delete(Connections, fd);
            connected = 0;
        }
        return;
    }
    eventProcess(fd, str);
} /* eventRead() */

private void eventProcess(int fd, string str) {
    string tmp, cmd, arg, file, val;
    int x;

    if( Connections[fd] && Connections[fd]["in edit"] > 0 ) {
        int len;

        Connections[fd]["buffer"] += str;
        if( !(len = strlen(Connections[fd]["buffer"])) ) return;
        if( len == Connections[fd]["in edit"] ) {
            tmp =  eventWriteFile(fd, Connections[fd]["file"],
              Connections[fd]["buffer"]);
            eventWrite(fd, tmp + "\n");
            Connections[fd]["in edit"] = 0;
            Connections[fd]["file"] = "";
            Connections[fd]["buffer"] = "";
            return;
        }
        else if( len > Connections[fd]["in edit"] ) {
            string tmp1, tmp2;

            tmp1 =Connections[fd]["buffer"][0..(Connections[fd]["in edit"]-1)];
            tmp2 =Connections[fd]["buffer"][Connections[fd]["in edit"]..];
            Connections[fd]["buffer"] = "";
            eventProcess(fd, tmp1);
            eventProcess(fd, tmp2);
            return;
        }
        return;
    }
    if( !Connections[fd] ) Connections[fd] = ([ "buffer" : "" ]);
    if( (Connections[fd]["buffer"] += str) == "" ) return;
    if( (x = strsrch(Connections[fd]["buffer"], "\n")) == -1 ) return;
    str = Connections[fd]["buffer"][0..(x-1)];
    if( x != strlen(Connections[fd]["buffer"]) - 1 )
        Connections[fd]["buffer"] = Connections[fd]["buffer"][(x+1)..];
    else Connections[fd]["buffer"] = "";
    if( sscanf(str, "%s %s", cmd, arg) != 2) {
        cmd = replace_string(str, "\r", "");
        arg = "";
    }
    else arg = replace_string(arg, "\r", "");
    if( !Connections[fd]["username"] ) {
        string username, *user, password;

        if( cmd != "login" ) {
            eventWrite(fd, "50 Must login with user name and password.\n", 1);
            map_delete(Connections, fd);
            connected =0;
            return;
        }
        if( sscanf(arg, "%s %s", username, password) != 2 ) {
            eventWrite(fd, "50 Login failed.\n", 1);
            map_delete(Connections, fd);
            connected=0;
            return;
        }
        user = explode(username," ")-({"login"});
        username = implode(user,"");
        if( !creatorp(username) ) {
            eventWrite(fd, "50 Login failed.\n", 1);
            map_delete(Connections, fd);
            connected=0;
            return;
        }
        if (!LOGIN_OBJ->test_password(username, password)) {
            log_file("remote", "Failed attempt to login as " + username
              + "\n");
            eventWrite(fd, "50 Login failed.\n", 1);
            connected=0;
            map_delete(Connections, fd);
            return;
        }
        Directory = "/w/"+username+"/";
        Connections[fd]["username"] = username;
        connected =1;
        event(users(),"inform",CAP(username)+" connected to redit","ftp");
        eventWrite(fd, "60 Connection to " + mud_name() + ".\n");
    }
    else if( cmd == "100" ) {
        int sz;

        if( sscanf(arg, "%d %s", sz, Connections[fd]["file"]) != 2 )
            eventWrite(fd, "50 Bad file send command.\n");
        else {
            if( !sz ) eventWrite(fd, "110 No changes sent or written.\n");
            else Connections[fd]["in edit"] = sz;
        }
    }
    else switch( cmd ) {
    case "edit":
        file = eventReadFile(fd, arg);

        if(sizeof(file)){
            if( file[<1] != '\n' ) file += "\n";
            if(file[0..1] == "50"){
                eventWrite(fd, file);
                break;
            }
        }
        if(!strlen(file)){
            eventWrite(fd, "50 File doesn't seem to exist.");
            break;
        }
        tmp = sprintf( "%-14s", "100 " + strlen(file));
        eventWrite(fd, tmp[0..15]);
        eventWrite(fd, file);

        break;
    case "ls":
        val = eventCommand(fd, cmd, arg);
        if( val ) eventWrite(fd, "500 " + val + "\n");
        else eventWrite(fd, "50 " +cmd+ " " +arg+ ": Permission denied.\n");
        break;
    case "update":
        val = eventCommand(fd, cmd, arg);
        if( val ) eventWrite(fd, "510 " + val + "\n");
        else eventWrite(fd, "50 Update attempt went off into nowhere.\n");
        break;
    default:
        val = eventCommand(fd, cmd, arg);
        if( val ) eventWrite(fd, "400 " + val + "\n");
        else eventWrite(fd, "50 "+cmd+" "+arg+": Command not supported.\n");
        break;
    }
    eventProcess(fd, "");
} /* eventProcess() */

string stats(){
    return sprintf("%O",Connections);
} /* stats() */

void clean_up(){
    return ;
} /* clean_up() */