final_realms_fluffos_v1/
final_realms_fluffos_v1/bin/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/ChangeLog.old/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/Win32/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/compat/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/compat/simuls/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/include/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/testsuite/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/testsuite/clone/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/testsuite/command/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/testsuite/data/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/testsuite/etc/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/testsuite/include/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/testsuite/inherit/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/testsuite/inherit/master/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/testsuite/log/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/testsuite/single/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/testsuite/single/tests/compiler/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/testsuite/single/tests/efuns/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/testsuite/single/tests/operators/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/testsuite/u/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/tmp/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/windows/
final_realms_fluffos_v1/lib/baseobs/guilds/
final_realms_fluffos_v1/lib/baseobs/misc/
final_realms_fluffos_v1/lib/baseobs/races/shadows/
final_realms_fluffos_v1/lib/cmds/god/
final_realms_fluffos_v1/lib/cmds/handlers/
final_realms_fluffos_v1/lib/cmds/handlers/cmds/
final_realms_fluffos_v1/lib/d/heaven/
final_realms_fluffos_v1/lib/d/heaven/heaven/ave/
final_realms_fluffos_v1/lib/d/mudlib/
final_realms_fluffos_v1/lib/d/newbie/
final_realms_fluffos_v1/lib/d/newbie/docs/
final_realms_fluffos_v1/lib/d/newbie/drow/armour/
final_realms_fluffos_v1/lib/d/newbie/drow/items/
final_realms_fluffos_v1/lib/d/newbie/drow/mobs/
final_realms_fluffos_v1/lib/d/newbie/drow/oldmobs/
final_realms_fluffos_v1/lib/d/newbie/drow/weapons/
final_realms_fluffos_v1/lib/d/newbie/duergar/weapons/
final_realms_fluffos_v1/lib/d/newbie/dwarf/weapons/
final_realms_fluffos_v1/lib/d/newbie/elf/cafe/
final_realms_fluffos_v1/lib/d/newbie/elf/chars/equip/
final_realms_fluffos_v1/lib/d/newbie/elf/items/armours/
final_realms_fluffos_v1/lib/d/newbie/elf/items/obj/
final_realms_fluffos_v1/lib/d/newbie/elf/items/weapons/
final_realms_fluffos_v1/lib/d/newbie/elf/quick_fix/
final_realms_fluffos_v1/lib/d/newbie/gnome/armour/
final_realms_fluffos_v1/lib/d/newbie/gnome/buildings/
final_realms_fluffos_v1/lib/d/newbie/gnome/items/
final_realms_fluffos_v1/lib/d/newbie/gnome/npcs/clones/
final_realms_fluffos_v1/lib/d/newbie/gnome/rooms/northrooms/
final_realms_fluffos_v1/lib/d/newbie/gnome/weapons/
final_realms_fluffos_v1/lib/d/newbie/goblin/armour/
final_realms_fluffos_v1/lib/d/newbie/goblin/items/
final_realms_fluffos_v1/lib/d/newbie/grads/log/
final_realms_fluffos_v1/lib/d/newbie/grads/npcs/
final_realms_fluffos_v1/lib/d/newbie/grads/rooms/
final_realms_fluffos_v1/lib/d/newbie/grads/rooms/cave1/
final_realms_fluffos_v1/lib/d/newbie/grads/temp/
final_realms_fluffos_v1/lib/d/newbie/guests/weapons/
final_realms_fluffos_v1/lib/d/newbie/half-elf/items/
final_realms_fluffos_v1/lib/d/newbie/half-elf/newroomss/
final_realms_fluffos_v1/lib/d/newbie/half-elf/rooms/
final_realms_fluffos_v1/lib/d/newbie/half-elf/rooms/castle/
final_realms_fluffos_v1/lib/d/newbie/half-elf/rooms/drows/
final_realms_fluffos_v1/lib/d/newbie/half-elf/rooms/savannah/
final_realms_fluffos_v1/lib/d/newbie/half-elf/rooms/secret/
final_realms_fluffos_v1/lib/d/newbie/half-elf/rooms/town/
final_realms_fluffos_v1/lib/d/newbie/halfling/
final_realms_fluffos_v1/lib/d/newbie/halfling/misc/
final_realms_fluffos_v1/lib/d/newbie/halfling/rooms/cave/
final_realms_fluffos_v1/lib/d/newbie/human/
final_realms_fluffos_v1/lib/d/newbie/human/armour/
final_realms_fluffos_v1/lib/d/newbie/human/monsters/
final_realms_fluffos_v1/lib/d/newbie/human/obj/
final_realms_fluffos_v1/lib/d/newbie/human/weapons/
final_realms_fluffos_v1/lib/d/newbie/lizard/armour/
final_realms_fluffos_v1/lib/d/newbie/lizard/items/
final_realms_fluffos_v1/lib/d/newbie/lizard/underwater/
final_realms_fluffos_v1/lib/d/newbie/lizard/weapons/
final_realms_fluffos_v1/lib/d/newbie/logs/
final_realms_fluffos_v1/lib/d/newbie/new_halfelf/
final_realms_fluffos_v1/lib/d/newbie/new_halfelf/npcs/
final_realms_fluffos_v1/lib/d/newbie/newdrow/npcs/
final_realms_fluffos_v1/lib/d/newbie/newdrow/rooms/
final_realms_fluffos_v1/lib/d/newbie/newelf/
final_realms_fluffos_v1/lib/d/newbie/newelf/chars/
final_realms_fluffos_v1/lib/d/newbie/newelf/npcs/
final_realms_fluffos_v1/lib/d/newbie/newelf/npcs/recopied/
final_realms_fluffos_v1/lib/d/newbie/newelf/obj/
final_realms_fluffos_v1/lib/d/newbie/newelf/quest_docs./
final_realms_fluffos_v1/lib/d/newbie/newken/
final_realms_fluffos_v1/lib/d/newbie/newken/chars/
final_realms_fluffos_v1/lib/d/newbie/newken/misc/
final_realms_fluffos_v1/lib/d/newbie/newken/npcs/
final_realms_fluffos_v1/lib/d/newbie/newken/obj/
final_realms_fluffos_v1/lib/d/newbie/newliz/
final_realms_fluffos_v1/lib/d/newbie/newliz/cave/
final_realms_fluffos_v1/lib/d/newbie/newliz/npcs/
final_realms_fluffos_v1/lib/d/newbie/orc/items/misc/
final_realms_fluffos_v1/lib/d/newbie/orc/items/weapons/
final_realms_fluffos_v1/lib/d/newbie/orc/tower/
final_realms_fluffos_v1/lib/d/vehicle/
final_realms_fluffos_v1/lib/doc/
final_realms_fluffos_v1/lib/doc/driver/
final_realms_fluffos_v1/lib/doc/driver/concepts/
final_realms_fluffos_v1/lib/doc/driver/driver/
final_realms_fluffos_v1/lib/doc/driver/efuns/arrays/
final_realms_fluffos_v1/lib/doc/driver/efuns/bitstrings/
final_realms_fluffos_v1/lib/doc/driver/efuns/communication/
final_realms_fluffos_v1/lib/doc/driver/efuns/core/
final_realms_fluffos_v1/lib/doc/driver/efuns/debugging/
final_realms_fluffos_v1/lib/doc/driver/efuns/filesystem/
final_realms_fluffos_v1/lib/doc/driver/efuns/interactive/
final_realms_fluffos_v1/lib/doc/driver/efuns/mappings/
final_realms_fluffos_v1/lib/doc/driver/efuns/objects/
final_realms_fluffos_v1/lib/doc/driver/efuns/security/
final_realms_fluffos_v1/lib/doc/driver/efuns/strings/
final_realms_fluffos_v1/lib/doc/driver/efuns/system/
final_realms_fluffos_v1/lib/doc/driver/efuns/types/
final_realms_fluffos_v1/lib/doc/driver/lpc/constructs/
final_realms_fluffos_v1/lib/doc/driver/lpc/types/
final_realms_fluffos_v1/lib/doc/driver/platforms/
final_realms_fluffos_v1/lib/doc/lpc/
final_realms_fluffos_v1/lib/doc/mail/
final_realms_fluffos_v1/lib/doc/man/
final_realms_fluffos_v1/lib/doc/man/html/
final_realms_fluffos_v1/lib/doc/man/html/applies/
final_realms_fluffos_v1/lib/doc/man/html/applies/parsing/
final_realms_fluffos_v1/lib/doc/man/html/driver/
final_realms_fluffos_v1/lib/doc/man/html/efuns/
final_realms_fluffos_v1/lib/doc/man/html/efuns/arrays/
final_realms_fluffos_v1/lib/doc/man/html/efuns/buffers/
final_realms_fluffos_v1/lib/doc/man/html/efuns/compile/
final_realms_fluffos_v1/lib/doc/man/html/efuns/floats/
final_realms_fluffos_v1/lib/doc/man/html/efuns/functions/
final_realms_fluffos_v1/lib/doc/man/html/efuns/general/
final_realms_fluffos_v1/lib/doc/man/html/efuns/numbers/
final_realms_fluffos_v1/lib/doc/man/html/efuns/parsing/
final_realms_fluffos_v1/lib/doc/man/local/
final_realms_fluffos_v1/lib/doc/man/local/applies/
final_realms_fluffos_v1/lib/doc/man/local/applies/interactive/
final_realms_fluffos_v1/lib/doc/man/local/applies/master/
final_realms_fluffos_v1/lib/doc/man/local/concepts/
final_realms_fluffos_v1/lib/doc/man/local/defines/
final_realms_fluffos_v1/lib/doc/man/local/driver/
final_realms_fluffos_v1/lib/doc/man/local/efuns/
final_realms_fluffos_v1/lib/doc/man/local/efuns/arrays/
final_realms_fluffos_v1/lib/doc/man/local/efuns/buffers/
final_realms_fluffos_v1/lib/doc/man/local/efuns/calls/
final_realms_fluffos_v1/lib/doc/man/local/efuns/compile/
final_realms_fluffos_v1/lib/doc/man/local/efuns/filesystem/
final_realms_fluffos_v1/lib/doc/man/local/efuns/floats/
final_realms_fluffos_v1/lib/doc/man/local/efuns/functions/
final_realms_fluffos_v1/lib/doc/man/local/efuns/general/
final_realms_fluffos_v1/lib/doc/man/local/efuns/interactive/
final_realms_fluffos_v1/lib/doc/man/local/efuns/internals/
final_realms_fluffos_v1/lib/doc/man/local/efuns/mappings/
final_realms_fluffos_v1/lib/doc/man/local/efuns/mudlib/
final_realms_fluffos_v1/lib/doc/man/local/efuns/numbers/
final_realms_fluffos_v1/lib/doc/man/local/efuns/objects/
final_realms_fluffos_v1/lib/doc/man/local/efuns/parsing/
final_realms_fluffos_v1/lib/doc/man/local/efuns/sockets/
final_realms_fluffos_v1/lib/doc/man/local/efuns/strings/
final_realms_fluffos_v1/lib/doc/man/local/efuns/system/
final_realms_fluffos_v1/lib/doc/man/local/historical/
final_realms_fluffos_v1/lib/doc/man/local/lfun/QC/
final_realms_fluffos_v1/lib/doc/man/local/lfun/events/
final_realms_fluffos_v1/lib/doc/man/local/lfun/monster/
final_realms_fluffos_v1/lib/doc/man/local/lfun/properties/
final_realms_fluffos_v1/lib/doc/man/local/lpc/
final_realms_fluffos_v1/lib/doc/man/local/lpc/constructs/
final_realms_fluffos_v1/lib/doc/man/local/lpc/types/
final_realms_fluffos_v1/lib/doc/man/local/standards/
final_realms_fluffos_v1/lib/doc/man/local/tutorials/
final_realms_fluffos_v1/lib/doc/man/local/tutorials/basic/
final_realms_fluffos_v1/lib/doc/man/local/tutorials/intermediate/
final_realms_fluffos_v1/lib/doc/man/mudos/applies/
final_realms_fluffos_v1/lib/doc/man/mudos/applies/interactive/
final_realms_fluffos_v1/lib/doc/man/mudos/applies/parsing/
final_realms_fluffos_v1/lib/doc/man/mudos/concepts/
final_realms_fluffos_v1/lib/doc/man/mudos/driver/
final_realms_fluffos_v1/lib/doc/man/mudos/efuns/arrays/
final_realms_fluffos_v1/lib/doc/man/mudos/efuns/buffers/
final_realms_fluffos_v1/lib/doc/man/mudos/efuns/calls/
final_realms_fluffos_v1/lib/doc/man/mudos/efuns/compile/
final_realms_fluffos_v1/lib/doc/man/mudos/efuns/filesystem/
final_realms_fluffos_v1/lib/doc/man/mudos/efuns/floats/
final_realms_fluffos_v1/lib/doc/man/mudos/efuns/functions/
final_realms_fluffos_v1/lib/doc/man/mudos/efuns/general/
final_realms_fluffos_v1/lib/doc/man/mudos/efuns/mappings/
final_realms_fluffos_v1/lib/doc/man/mudos/efuns/mixed/
final_realms_fluffos_v1/lib/doc/man/mudos/efuns/mudlib/
final_realms_fluffos_v1/lib/doc/man/mudos/efuns/numbers/
final_realms_fluffos_v1/lib/doc/man/mudos/efuns/parsing/
final_realms_fluffos_v1/lib/doc/man/mudos/lpc/constructs/
final_realms_fluffos_v1/lib/doc/man/mudos/lpc/types/
final_realms_fluffos_v1/lib/doc/races/
final_realms_fluffos_v1/lib/doc/races/old_race/
final_realms_fluffos_v1/lib/global/virtual/
final_realms_fluffos_v1/lib/global/wiz_backup/
final_realms_fluffos_v1/lib/net/config/
final_realms_fluffos_v1/lib/net/daemon/chars/
final_realms_fluffos_v1/lib/net/inherit/
final_realms_fluffos_v1/lib/net/intermud3/
final_realms_fluffos_v1/lib/net/intermud3/cmds/
final_realms_fluffos_v1/lib/net/intermud3/save/
final_realms_fluffos_v1/lib/net/intermud3/services/
final_realms_fluffos_v1/lib/net/obj/
final_realms_fluffos_v1/lib/net/old/
final_realms_fluffos_v1/lib/net/old/intermud/
final_realms_fluffos_v1/lib/net/old/intermud/adm/
final_realms_fluffos_v1/lib/net/old/intermud/services/
final_realms_fluffos_v1/lib/net/old/intermud/udp/
final_realms_fluffos_v1/lib/net/virtual/
final_realms_fluffos_v1/lib/obj/b_day/
final_realms_fluffos_v1/lib/obj/chars/
final_realms_fluffos_v1/lib/obj/handlers/lists/
final_realms_fluffos_v1/lib/obj/handlers/useless/
final_realms_fluffos_v1/lib/obj/monsters/
final_realms_fluffos_v1/lib/obj/roomgen/
final_realms_fluffos_v1/lib/obj/soul/
final_realms_fluffos_v1/lib/obj/vegetation/
final_realms_fluffos_v1/lib/obj/weapons/oldsys/
final_realms_fluffos_v1/lib/open/
final_realms_fluffos_v1/lib/players/g/
final_realms_fluffos_v1/lib/releasefiles/d/heaven/
final_realms_fluffos_v1/lib/releasefiles/d/mudlib/
final_realms_fluffos_v1/lib/releasefiles/d/newbie/
final_realms_fluffos_v1/lib/releasefiles/doc/
final_realms_fluffos_v1/lib/releasefiles/players/g/
final_realms_fluffos_v1/lib/releasefiles/save/
final_realms_fluffos_v1/lib/releasefiles/save/environ/
final_realms_fluffos_v1/lib/releasefiles/save/roomgen/
final_realms_fluffos_v1/lib/releasefiles/secure/
final_realms_fluffos_v1/lib/releasefiles/w/
final_realms_fluffos_v1/lib/releasefiles/w/god/
final_realms_fluffos_v1/lib/room/
final_realms_fluffos_v1/lib/save/
final_realms_fluffos_v1/lib/save/environ/
final_realms_fluffos_v1/lib/save/roomgen/
final_realms_fluffos_v1/lib/scripts/
final_realms_fluffos_v1/lib/secure/crerem/
final_realms_fluffos_v1/lib/secure/dom/
final_realms_fluffos_v1/lib/secure/log/
final_realms_fluffos_v1/lib/secure/misc/
final_realms_fluffos_v1/lib/std/adnd/
final_realms_fluffos_v1/lib/std/commands/shadows/
final_realms_fluffos_v1/lib/std/creator/
final_realms_fluffos_v1/lib/std/curses/
final_realms_fluffos_v1/lib/std/curses/old_sys/
final_realms_fluffos_v1/lib/std/curses/shadows/
final_realms_fluffos_v1/lib/std/dom/
final_realms_fluffos_v1/lib/std/effects/
final_realms_fluffos_v1/lib/std/effects/healing/
final_realms_fluffos_v1/lib/std/effects/other/
final_realms_fluffos_v1/lib/std/effects/poisons/
final_realms_fluffos_v1/lib/std/environ/
final_realms_fluffos_v1/lib/std/guilds/
final_realms_fluffos_v1/lib/std/guilds/priests/samples/
final_realms_fluffos_v1/lib/std/guilds/wizards/
final_realms_fluffos_v1/lib/std/living/baldy/
final_realms_fluffos_v1/lib/std/living/divstuff/
final_realms_fluffos_v1/lib/std/paran/
final_realms_fluffos_v1/lib/std/poisons/
final_realms_fluffos_v1/lib/std/poisons/shadows/
final_realms_fluffos_v1/lib/std/poisons/weapons/
final_realms_fluffos_v1/lib/std/race_groups/
final_realms_fluffos_v1/lib/std/room/
final_realms_fluffos_v1/lib/std/room/old/
final_realms_fluffos_v1/lib/std/rooms/
final_realms_fluffos_v1/lib/std/shadows/
final_realms_fluffos_v1/lib/std/shadows/test_shad/
final_realms_fluffos_v1/lib/std/socket/
final_realms_fluffos_v1/lib/std/spells/
final_realms_fluffos_v1/lib/std/vaults/
final_realms_fluffos_v1/lib/tmp/
final_realms_fluffos_v1/lib/w/
final_realms_fluffos_v1/lib/w/god/
final_realms_fluffos_v1/old/
final_realms_fluffos_v1/win32/
//      /adm/daemon/postal_d.c
//      from the Nightmare Mudlib
//      the postal daemon... handles all mail sending and receiving
    // "radix",
//      Added retire_user and age_mail : Radix - March 6, 1997

#include <post.h>

mapping *box_info;
mapping my_groups;
static mapping mud_groups;
static string file;

string *expand_list(string *who);
string *expand_group(string grp);
void add_post(string *local, mapping borg);
void notify_online(string *who, string from, string sub);
int get_post_number(string id);
void remove_post(string, string);
void retire_user(string);
void age_mail(string);

void create() {
    seteuid("Root");
    box_info = ({});
    my_groups = ([]);

    mud_groups = ([ 
      "gods" : 
      ({ "baldrick",
         "benedick",
         "asmodean"
      }),
      "mudlib" :
      ({ "baldrick",
        "benedick",
        "asmodean"
      }),
      "thanes" : 
    ({
         "baldrick",
         "benedick",
         "asmodean",
      }),
      "bugs" : 
      ({ "baldrick",
    "benedick",
       "asmodean",
      }),
   ]);
//  catch(mud_groups["patrons"] = "/d/aprior/master"->query_patrons());
// the above commented out by Randor cause there's no /d/aprior here
// so far - 19-mar-98

}

int valid_access(string func) {
    if(geteuid(previous_object()) == "Root") return 1;
    if(member_array(base_name(previous_object()), TRUSTED_MAILERS) != -1)
    return 1;
    log_file("illegal", "attempt to access postal daemon function "+func+" by "+
      (this_player() ? this_player()->query_name() : getuid(previous_object()))+
      " from file "+file_name(previous_object())+"\n");
    log_file("illegal", ctime(time())+"\n");
    return 0;
}

void update_post_box(string who) {
    if(file == DIR_POSTAL+"/"+who) return;
    if(file && file != "") {
    if(!sizeof(box_info) && !sizeof(my_groups)) rm(file+".o");
    else save_object(file);
    }
    box_info = ({});
    my_groups = ([]);
    file =  DIR_POSTAL+"/" +who;
    restore_object(file);
}

// Radix : March 5, 1997
void retire_user(string who)
{
    mapping m;
    if(!who) return;
    who = lower_case(who);
//  if(this_player() && !this_player()->query_lord() &&
//    this_player()->query_name() != who)
         ///return;
    update_post_box(who);
    if(find_player(who))
    tell_object(find_player(who),"Removing your mail.\n");
    foreach(m in box_info)
    remove_post(who, m["id"]);
    return;
}

string *post_mail(mapping borg) {
    string *local, *remote;

    if(!valid_access("post mail")) return ({});
    if(!borg["from"]) return ({});
    update_post_box(borg["from"]);
    local = uniq_array(expand_list(borg["to"])+expand_list(borg["cc"]));
    if(!sizeof(local -= (remote=filter_array(local, "remote_mail",this_object(), borg))))
    return remote;
    add_post(local, borg);
    notify_online(local, borg["from"], borg["subject"]);
    return local+remote;
}

int remote_mail(string who, mapping borg) {
    string pl, mud;

    if(sscanf(who, "%s@%s", pl, mud) != 2) return 0;
    MAIL_S->remote_mail(pl, mud, borg);
    return 1;
}

string *expand_list(string *who) {
    string *full;
    string a,b;
    int i;

    full = ({});
    if(!(i=sizeof(who))) return ({});
    while(i--) {
    if(!who[i] || who[i] == "" || !stringp(who[i])) continue;
    if(sscanf((who[i]=lower_case(who[i])), "%s@%s", a, b) == 2)
        full += ({ who[i] });
    else if(user_exists(who[i])) full += ({ who[i] });
    else if(mud_groups[who[i]] ||
      my_groups[who[i]])
        full += expand_group(who[i]);
    else write("No such user or group: "+capitalize(who[i])+".\n");
    }
    return full;
}

string *expand_group(string grp) {
    string *ret, *g;
    string a, b;
    int i;

    if(mud_groups[grp]) g = mud_groups[grp];
    else if(my_groups[grp]) g = my_groups[grp];
    else return ({});
    i = sizeof(g);
    ret = ({});
    while(i--) {
    if(sscanf(g[i], "%s@%s", a, b) ==2) ret += ({ g[i] });
    else if(user_exists(g[i])) ret += ({ g[i] });
    else write("No such user: "+capitalize(g[i])+".\n");
    }
    return ret;
}

void add_post(string *local, mapping borg) {
    string *tmp;
    int i, max;

    if(!valid_access("add post")) return;
    if(!(i=sizeof(local))) return;
    borg["id"] = (string)LETTER_D->create_message(borg["message"],local);
    borg["read"] = 0;
    map_delete(borg, "message");
    while(i--) {
    update_post_box(local[i]);
    box_info += ({ borg });
    }
}

void remove_post(string who, string id) {
    int x;

    if(!valid_access("remove post")) return;
    update_post_box(who = lower_case(who));
    if((x=get_post_number(id)) == -1) return;
    LETTER_D->delete_message(id, who);
    box_info = exclude_array(box_info, x);
}

static int get_post_number(string id) {
    int i;

    i = sizeof(box_info);
    while(i--) if(box_info[i]["id"] == id) return i;
    return -1;
}

mapping mail_status(string who) {
    int un, tot, i;

    update_post_box(who = lower_case(who));
    i = sizeof(box_info);
    while(i--) {
    tot++;
    if(!box_info[i]["read"]) un++;
    }
    return ([ "unread":un, "total":tot ]);
}

void notify_online(string *who, string from, string sub) {
    object ob, mail;
    string str;
    int i;

    i = sizeof(who);
    while(i--) {
    if(!(ob = find_player(who[i])) ||
      ((str=(string)ob->getenv("MAIL_MSG")) == "ignore"))
        continue;
    if(!str || str == "")
        str = "    New mail has arrived from $N\n    Subject: $S";
    str = replace_string(str, "$N", capitalize(from));
    str = replace_string(str, "$S", sub);
    //tell_object(ob,str);
    tell_object(ob,wrap(str,(int)ob->query_cols()) );
    //tell_object(ob, wrap(str, (int)ob->getenv("screen")));
    if(mail=present(POST_ID, ob)) mail->reset_post();
    }
}

mapping add_group(string who, string group, string *in_group) {
    string a, b;
    int i;

    if(!valid_access("add group")) return ([]);
    update_post_box(who = lower_case(who));
    if(!my_groups) my_groups = ([]);
    if(!my_groups[group]) my_groups[group] = ({});
    i = sizeof(in_group);
    while(i--) {
    if(user_exists(in_group[i] = lower_case(in_group[i])))
        my_groups[group] += ({ in_group[i] });
    if(sscanf(in_group[i], "%s@%s", a, b) == 2)
        my_groups[group] += ({ in_group[i] });
    }
    return my_groups;
}

mapping remove_group(string who, string group, string *out_group) {
    int i;

    if(!valid_access("remove group")) return ([]);
    update_post_box(who = lower_case(who));
    if(!my_groups) return ([]);
    if(!my_groups[group]) return my_groups;
    i = sizeof(my_groups[group]);
    while(i--) my_groups[group] -= ({ my_groups[group][i] });
    if(!sizeof(my_groups)) map_delete(my_groups, group);
    return my_groups;
}

void mark_read(string who, string id) {
    int i;

    if(!valid_access("mark read")) return;
    update_post_box(who = lower_case(who));
    i = sizeof(box_info);
    while(i--) if(id == box_info[i]["id"]) box_info[i]["read"] = 1;
}

// Radix : March 7, 1997
void age_mail(string who)
{
    int low, high;
    mapping m;
    if(!valid_access("age mail")) return;
    update_post_box(who);
    foreach(m in box_info)
    if(m["date"] + AGED < time())
    {
    high = get_post_number(m["id"]);
    if(!low)
        low = high;
    remove_post(who, m["id"]);
    }
    if(low)
    {
    if(low == high)
        tell_object(find_player(who),"Aged letter #"+low+"\n");
    else
    if(low + 1 == high)
        tell_object(find_player(who),"Aged letters #"+low+" and "
          "#"+high+"\n");
    else
        tell_object(find_player(who),"Aged letters #"+low+" through"
          " #"+high+"\n");
    }
    return;
}

mapping query_mud_groups() { return mud_groups; }
int query_mailing_list(string which) {
    if(!which)  return 1;
    if(mud_groups[which])  return 1;

    return 0;
}

void flush_files() {
    if(!sizeof(box_info) && !sizeof(my_groups)) rm(file+".o");
    else save_object(file);
}

string read_sig(string who) {
    if(file_exists("/w/"+who+"/.sig")) return read_file("/w/"+who+"/.sig");
    else return "";
}

int valid_shadow() { return 1; }