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/xtra/_path.c
//      Creator :   The Folks at Portals, of course
//
//      The command is used to set your command path
//      Updated for protected path checks and path portion
//      removal by Watcher (01/93)
// 93-08-29 : Robocoder added directory existance checking
*/

#include <uid.h>
#include <mudlib.h>

inherit DAEMON ;

#define PROTECT ({ "/cmds/std", "/cmds/wiz" })

int cmd_path(string str) {
    object act_ob;
    string *path, *curpath;
    int i, s, m, add_path, rem_path;

    act_ob = previous_object();
    seteuid(ROOT_UID);

    if (!str) {
        str = (string)act_ob->query("PATH");
        if (!str) {
            notify_fail("No path set.\n");
            return 0;
        }
        notify_fail("Current path: "+str+"\n");
        return 0;
    }

    if (sscanf(str, "-add %s", str) || sscanf(str, "%s add", str)
          || sscanf(str, "%s ADD", str))
        add_path = 1;

    else if (sscanf(str, "-rem %s", str) || sscanf(str, "-remove %s", str)
          || sscanf(str, "%s rem", str) || sscanf(str, "%s remove", str)
          || sscanf(str, "%s REM", str) || sscanf(str, "%s REMOVE", str))
        rem_path = 1;

    // else set path

    curpath = explode((string)act_ob->query("PATH"), ":");
    path = explode(str, ":");

    // consistency checks
    if (add_path || rem_path) {
        s = sizeof(curpath);
        for (i = 0; i < s; i++) {
            if (file_size(curpath[i]) != -2) {
                write("The "+curpath[i]+" directory no longer exists.\n");
                curpath -= ({ curpath[i] });
                i--; s--;
            }
        }
    } else {
        s = sizeof(PROTECT);
        for (i = 0; i < s; i++) {
            if (member_array(PROTECT[i], path) == -1) {
                write("Path set aborted: You cannot exclude " + PROTECT[i] +
                      "from your path.\n");
                return 1;
            }
        }
    }

    s = sizeof(path);
    for (i = 0; i < s; i++) {
        path[i] = resolv_path("cwd", path[i]);
        if (file_size(path[i]) != -2) {
            if (!rem_path)
                write("The "+path[i]+" directory does not exist.\n");
            path -= ({ path[i] });
            i--; s--;
        } else if (add_path && member_array(path[i], curpath) != -1) {
            write("The "+path[i]+" directory is already in your path.\n");
            path -= ({ path[i] });
            i--; s--;
        } else if (rem_path) {
            if (member_array(path[i], curpath)==-1) {
                write("The "+path[i]+" directory does not exist in your path.\n");
                path -= ({ path[i] });
                i--; s--;
            } else if ((m = member_array(path[i], PROTECT))==-1) {
                // it does, so remove that path portion from user's path
                curpath -= ({ path[i] });
            } else {
                // tried to remove a protected directory
                write("Path change aborted: You cannot exclude " + PROTECT[m] +
                      " from your path.\n");
                return 1;
            }
        }
    }

    // save any changes from consistency checking
    if (add_path || rem_path)
        act_ob->set("PATH", implode(curpath, ":"));
    else
        act_ob->set("PATH", implode(path, ":"));

    if (add_path && sizeof(path))
        act_ob->add("PATH", ":" + implode(path, ":"));

    write("Path now set to:\n   "+act_ob->query("PATH")+"\n");
    return 1;
}

int help() {
    write(
        "Usage:\t\tpath\n\t\tpath <new path>\n\t\tpath -add <directory>\n" +
        "\t\tpath -remove <specific path portion>\n\n" +
        "When no argument is given, this will print your current search\n" +
        "path for commands.  When the -add flag is used, it will add the\n" +
        "directory specified to your path.  When the -rem or -remove flag\n" +
        "is used, it will remove that specified segment from your path.\n" +
        "When you wish to set your entire path, the new path is given in\n" +
        "the form dirA:dirB:dirC, for example:\n" +
        "\tpath /cmds/std:/cmds/xtra:/u/b/buddha/bin\n" +
        "will set your path to those three directories.\n" +
        "\nSee also: rehash\n"
    );
    return 1;
}