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	:  /adm/daemons/studentd.c
//	Creator	:  Watcher@TMI-2  (5/22/93)
//
//	This daemons controls the access to the student directories
//	and the individual student's access time length.

#include <uid.h>
#include <daemons.h>
#include <mudlib.h>
#include <config.h>
 
inherit SERVER;
 
#define ERROR_LOG	"STUDENT_ERROR"
#define SAVE_FILE	(STUDENT_DIR + "STUDENTS")
 
void load_students();
 
mapping students = ([]);
mapping sponsors = ([]) ;

void create() {


	seteuid(getuid(this_object()));
	load_students();

}
 
//  This function performs the retrieval of the student information
//  data from the SAVE_FILE when the create() function is called.
 
void load_students() {
   string err;
 
   err = catch( restore_object(SAVE_FILE) );

   if(err)  log_file(ERROR_LOG, "[" + extract(ctime(time()),4,15) +
		     "]  Error in load_students()\n  " + err + "\n");

}
 
 
//  This function performs the saving of the present student 
//  information data into the predefined SAVE_FILE.
 
void save_students() {
   string err;

   err = catch( save_object(SAVE_FILE) );

   if(err)  log_file(ERROR_LOG, "[" + extract(ctime(time()),4,15) +
		     "]  Error in save_students()\n  " + err + "\n");

}
 
 
//  This function will return the time the user first was made a
//  student in integer time ... it returns 0 if the user is not
//  a recognized student by the daemon.
 
int query_student(string name) {  return students[name];  }


// This one returns the name of the student's sponsor.
 
int query_sponsor (string name) {  return sponsors[name] ; }
 
//  This function adds a user to the student mapping along with the
//  time they were given student priviledges. It is only accessible
//  by ROOT or Admin status calls.

varargs
int add_student( string name, string sponsoring_person ) {

   if(!adminp(geteuid(previous_object())) &&
      geteuid(previous_object()) != ROOT_UID)   return 0;
 
   //	If no name is given, or the name is already in the student
   //	mapping, return 0 to the calling object.
 
   if(!name || students[name])  return 0;
 
   //	Add the user to the student mapping with the present time.
 
   students[name] = time();
   sponsors[name] = sponsoring_person ? sponsoring_person : this_player()->query("name") ;

   //	Save the student mapping for future use.
 
   save_students();
 
return 1; }
 
 
//  This function removes a user from the student mapping, if that
//  name is already present.  Only accessible by ROOT or Admin calls.
 
int remove_student(string name) {
 
   if(!adminp(geteuid(previous_object())) &&
      geteuid(previous_object()) != ROOT_UID)  return 0;
 
   // 	If no name is given, or the name is not in the student
   //	mapping, then return 0 to the calling object.
 
   if(!name || !students[name])  return 0;

   //	Remove the user from the student mapping.

   map_delete(students, name);
   map_delete(sponsors, name) ;
 
   //	Save the student mapping for future use.

   save_students();

return 1; }
 
 
//  This function allows the modification of a student's beginning
//  time so that they may be extended in their duration.

int modify_student(string name, int when) {

   if(!adminp(geteuid(previous_object())) &&
      geteuid(previous_object()) != ROOT_UID)  return 0;
 
   //  	If no name or time given, or no such user ... return 0;
 
   if(!name || !when || !students[name])  return 0;
 
   //	Modify the user's time setting.
 
   students[name] = when;

   //	Save the students mapping for future use.

   save_students();

return 1; }
 
 
//  This function returns the amount of time a user has left in
//  their student period. It will return -1, if the user is not a 
//  recognized student.
//  It returns a negative value if the student is over time. Note that
//  you can't tell a response of -1 meaning the person is not a student
//  from a -1 meaning the person is 1 second over time. Since the latter
//  is obviously a rare event, -1 can always be treated as meaning the
//  person is not a student.

 
int query_time_left(string name) {
   int left;

   //	If no name, or the name is not a student ... return -1

   if(!name || !students[name])  return -1;

   left = students[name] + STUDENT_TIME_PERIOD - time();

return left; }
 
 
//  This function is the simple student mapping dump. If the requester
//  isn't ROOT_UID, then give them a copy ... just in case. :)

mapping query_student_list() {

   if(geteuid(previous_object()) != ROOT_UID)
	return copy(students);

return students; }

// This function returns the list of sponsors.

mapping query_sponsor_list() {

   if(geteuid(previous_object()) != ROOT_UID)
       return copy(sponsors) ;

return sponsors ;
}

 
 
//  This function will return an array of all students who have
//  used up their student time.
 
string *query_overdue() {
   string *who;

   who = keys(students);

   who = filter_array(who, "filter_overdue", this_object());

return who; }
 
static int filter_overdue(string name) {
   return (students[name] + STUDENT_TIME_PERIOD > time());  
}