simul_efun.c-Dateireferenz

#include "/secure/config.h"
#include "/secure/wizlevels.h"
#include "/sys/snooping.h"
#include "/sys/language.h"
#include "/sys/thing/properties.h"
#include "/sys/wizlist.h"
#include "/sys/erq.h"
#include "/sys/lpctypes.h"
#include "/sys/daemon.h"
#include "/sys/player/base.h"
#include "/sys/thing/description.h"
#include "/sys/container.h"
#include "/sys/defines.h"
#include "/sys/telnet.h"
#include "/sys/objectinfo.h"
#include "/sys/files.h"
#include "/sys/strings.h"
#include "/sys/debug_info.h"
#include "/sys/time.h"
#include "/sys/notify_fail.h"
#include "/sys/tls.h"
Include-Abhängigkeitsdiagramm für simul_efun.c:

gehe zum Quellcode dieser Datei

Makrodefinitionen

#define SNOOPLOGFILE   "SNOOP"
#define ASNOOPLOGFILE   "ARCH/SNOOP"
#define IP_VALID_CACHE   86400
#define IP_RETRY   28800
#define TO   efun::this_object()
#define TI   efun::this_interactive()
#define TP   efun::this_player()
#define PO   efun::previous_object(0)
#define LEVEL(x)   query_wiz_level(x)
#define NAME(x)   capitalize(getuid(x))
#define DEBUG(x)
#define TAGE   ({"Son","Mon","Die","Mit","Don","Fre","Sam"})
#define MONATE
#define MAXLEN   50000

Funktionen

string dtime (int wann)
varargs int log_file (string file, string txt, int size_to_break)
int query_wiz_level (mixed player)
mixed * remove_alist (mixed key, mixed *alist)
nomask varargs int snoop (object me, object you)
nomask object query_snoop (object who)
varargs string country (mixed ip, string num)
int query_wiz_grp (mixed wiz)
public varargs object deep_present (mixed what, object ob)
nomask int secure_level ()
nomask string secure_euid ()
public nomask int process_call ()
nomask mixed __create_player_dummy (string name)
varargs string replace_personal (string str, mixed *obs, int caps)
 __EFUN_DEFINED__(copy_file)
varargs string extract (string str, int from, int to)
varargs mixed * slice_array (mixed *array, int from, int to)
int member_array (mixed item, mixed arraystring)
nomask void destruct (mixed ob)
string NotifyDestruct (object caller)
public nomask void remove_interactive (object ob)
void ___updmaster ()
string query_ip_number (object ob)
string query_ip_name (mixed ob)
static object find_snooped (object who)
static private string Lcut (string str)
string * old_explode (string str, string del)
int file_time (string path)
mixed * exclude_alist (int i, mixed *alist)
varargs string strftime (mixed fmt, int clock, int localized)
nomask int shutdown (string reason)
 __EFUN_DEFINED__(strftime)
int lowerchar (int char)
string upperstring (string s)
string lowerstring (string s)
string version ()
private string stretch (string s, int width)
private varargs string block_string (string s, int width, int flags)
public varargs string break_string (string s, int w, mixed indent, int flags)
mapping m_delete (mapping m, mixed key)
int m_width (mapping m)
int last_reboot_time ()
int first_boot_time ()
int exist_days ()
string uptime ()
void dangling_lfun_closure ()
nomask void set_this_player (object pl)
public void update_actions ()
static void move_inv (object ob)
private nomask string _process_string (string str, object po)
nomask string process_string (mixed str)
mixed save_object (mixed name)
int restore_object (string name)
int set_object_heart_beat (object ob, int flag)
mixed * wizlist_info ()
varargs void wizlist (string name, int sortkey)
static int _cost_sort (mixed *a, mixed *b)
void StopCallOut (int arg)
protected object _call_out_obj (mixed call_out)
protected void _same_object (object ob, mapping m)
protected void _same_path (object key, object *obs, mapping m)
protected int _too_many (mixed key, mapping m, int i)
protected void _destroy (string key, object *obs, string text, int uid)
protected void _same_uid (string key, object *obs, mapping m, closure cf)
nomask varargs void call_out (varargs mixed *args)
mixed call_out_info ()
mixed query_closure_object (closure c)
varargs void move_object (mixed what, mixed where)
private int living_or_interactive (object o)
static int _shout_filter (object ob, string pat)
varargs void shout (string s, mixed where)
void start_simul_efun ()
void __clear_ip_map ()
protected void reset ()
void cindent (string name)
mixed * query_comm_stat ()
void set_next_reset (int time)
int absolute_hb_count ()
void __set_environment (object ob, mixed target)
void _dump_wizlist (string file, int sortby)
mapping dump_ip_mapping ()
nomask void swap (object obj)
nomask varargs void garbage_collection (string str)
varargs void notify_fail (mixed nf, int prio)
void _notify_fail (string str)
private object _shadow (object ob, int flag)
public object shadow (object ob, int flag)
private void _unshadow ()
public void unshadow ()
string time2string (string format, int time)
nomask varargs int query_ip_port (object pl)
nomask mixed debug_info (int flag, varargs int *args)
varargs void input_to (mixed fun, int onoff, varargs mixed *args)
nomask int set_light (int i)
public string iso2ascii (string str)
public varargs string CountUp (string *s, string sep, string lastsep)
nomask varargs int query_next_reset (object ob)
nomask int copy_file (string source, string dest)
varargs mixed * slice_array (mixed array, int from, int to)
int broken_count_bits (string s)
int count_bits (string s)
mixed * exclude_array (mixed *arr, int from, int to)

Variablen

mixed dtime_cache = ({-1,""})
int process_flag
static int CallOutStopped = 0
static int CallOutCount
static int CountMessages = 0
static string LastMessage
string count_table

Makro-Dokumentation

#define ASNOOPLOGFILE   "ARCH/SNOOP"

Definiert in Zeile 21 der Datei simul_efun.c.

#define DEBUG ( x   ) 
Wert:
if (find_player("zesstra")) \
  tell_object(find_player("zesstra"),x)

Definiert in Zeile 60 der Datei simul_efun.c.

#define IP_RETRY   28800

Definiert in Zeile 51 der Datei simul_efun.c.

#define IP_VALID_CACHE   86400

Definiert in Zeile 50 der Datei simul_efun.c.

#define LEVEL ( x   )     query_wiz_level(x)

Definiert in Zeile 57 der Datei simul_efun.c.

#define MAXLEN   50000

Definiert in Zeile 1884 der Datei simul_efun.c.

#define MONATE
Wert:
({"Jan","Feb","Mar","Apr","Mai","Jun","Jul","Aug",\
                 "Sep","Okt","Nov","Dez"})

Definiert in Zeile 486 der Datei simul_efun.c.

#define NAME ( x   )     capitalize(getuid(x))

Definiert in Zeile 58 der Datei simul_efun.c.

#define PO   efun::previous_object(0)

Definiert in Zeile 56 der Datei simul_efun.c.

#define SNOOPLOGFILE   "SNOOP"

Definiert in Zeile 20 der Datei simul_efun.c.

#define TAGE   ({"Son","Mon","Die","Mit","Don","Fre","Sam"})

Definiert in Zeile 485 der Datei simul_efun.c.

#define TI   efun::this_interactive()

Definiert in Zeile 54 der Datei simul_efun.c.

#define TO   efun::this_object()

Definiert in Zeile 53 der Datei simul_efun.c.

#define TP   efun::this_player()

Definiert in Zeile 55 der Datei simul_efun.c.


Dokumentation der Funktionen

void ___updmaster (  ) 

Definiert in Zeile 166 der Datei simul_efun.c.

Benutzt ARCH_SECURITY, destruct(), file(), GETDIR_NAMES, GETDIR_PATH, GETDIR_UNSORTED, ob() und process_call().

00167 {
00168     object ob;
00169 
00170     //sollte nicht jeder duerfen.
00171     if (process_call() || !ARCH_SECURITY)
00172       raise_error("Illegal use of ___updmaster()!");
00173 
00174     write("Removing old master ... ");
00175     foreach(string file: 
00176         get_dir("/secure/master/*.c",GETDIR_NAMES|GETDIR_UNSORTED|GETDIR_PATH)) {
00177       if (ob = find_object(file))
00178        efun::destruct(ob);
00179     }
00180     efun::destruct(efun::find_object("/secure/master"));
00181     write("done.\nLoading again ... ");
00182     load_object("/secure/master");
00183 
00184     write("done.\n");
00185 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

void __clear_ip_map (  ) 

Definiert in Zeile 1367 der Datei simul_efun.c.

01368 {
01369 }

nomask mixed __create_player_dummy ( string  name  ) 

Definiert in Zeile 1732 der Datei simul_efun.c.

01733 {
01734   string err;
01735   object ob;
01736   mixed m;
01737   //hat nen Scherzkeks die Blueprint bewegt?
01738   if ((ob=find_object("/secure/login")) && environment(ob))
01739       catch(destruct(ob);publish);
01740   err = catch(ob = clone_object("secure/login");publish);
01741   if (err)
01742   {
01743     write("Fehler beim Laden von /secure/login.c\n"+err+"\n");
01744     return 0;
01745   }
01746   if (objectp(m=(mixed)ob->new_logon(name))) netdead[name]=m;
01747   return m;
01748 }

void __set_environment ( object  ob,
mixed  target 
)

Definiert in Zeile 1431 der Datei simul_efun.c.

01432 {
01433   string path;
01434   object obj;
01435 
01436   if (!objectp(ob))
01437     return;
01438   if (!IS_ARCH(geteuid(previous_object())) || !ARCH_SECURITY )
01439     return;
01440   if (objectp(target))
01441   {
01442     efun::set_environment(ob,target);
01443     return;
01444   }
01445   path=(string)MASTER->_get_path(target,this_interactive());
01446   if (stringp(path) && file_size(path+".c")>=0 &&
01447       !catch(load_object(path);publish) )
01448   {
01449     obj=find_object(path);
01450     efun::set_environment(ob,obj);
01451     return;
01452   }
01453 }

protected object _call_out_obj ( mixed  call_out  ) 

Definiert in Zeile 1036 der Datei simul_efun.c.

01036                                                  {
01037     return pointerp(call_out) ? call_out[0] : 0;
01038 }

static int _cost_sort ( mixed *  a,
mixed *  b 
) [static]

Definiert in Zeile 1011 der Datei simul_efun.c.

01012 {
01013   return a[WL_TOTAL_COST]<b[WL_TOTAL_COST];
01014 }

protected void _destroy ( string  key,
object *  obs,
string  text,
int  uid 
)

Definiert in Zeile 1071 der Datei simul_efun.c.

01071                                                                          {
01072     if (!pointerp(obs)) return;
01073     // Array mit unique Eintraege erzeugen.
01074     obs = m_indices( mkmapping(obs) );
01075     // Fehlermeldung auf der Ebene ausgeben, im catch() mit publish, damit es
01076     // auf der Ebene direkt scrollt, der backtrace verfuegbar ist (im
01077     // gegensatz zur Loesung mittels Callout), die Ausfuehrung aber weiter
01078     // laeuft.
01079     catch( efun::raise_error(           
01080          sprintf( text,                   
01081            uid ? (string)"/secure/master"->creator_file(key) : key,                   
01082            sizeof(obs), object_name(obs[<1]) ) );publish);
01083     // Und weg mit dem Kram...
01084     filter( obs, #'efun::destruct/*'*/ );
01085 }

void _dump_wizlist ( string  file,
int  sortby 
)

Definiert in Zeile 1455 der Datei simul_efun.c.

01455                                             {
01456   int i;
01457   mixed *a;
01458 
01459   if (!LORD_SECURITY)
01460     return;
01461   if (!master()->valid_write(file,geteuid(previous_object()),"write_file"))
01462   {
01463     write("NO WRITE PERMISSION\n");
01464     return;
01465   }
01466   a = wizlist_info();
01467   a = sort_array(a, lambda( ({'a,'b}),
01468                         ({#'<,
01469                           ({#'[,'a,sortby}),
01470                           ({#'[,'b,sortby})
01471                          })));
01472   rm(file);
01473   for (i=sizeof(a)-1;i>=0;i--)
01474     write_file(file,sprintf("%-11s: eval=%-8d cmds=%-6d HBs=%-5d array=%-5d mapping=%-7d\n",
01475       a[i][WL_NAME],a[i][WL_TOTAL_COST],a[i][WL_COMMANDS],a[i][WL_HEART_BEATS],
01476       a[i][WL_ARRAY_TOTAL],a[i][WL_CALL_OUT]));
01477 }

void _notify_fail ( string  str  ) 

Definiert in Zeile 1591 der Datei simul_efun.c.

Benutzt notify_fail().

01592 {
01593   //query_notify_fail() benutzen, um das Objekt
01594   //des letzten notify_fail() zu ermitteln
01595   object o;
01596   if ((o=query_notify_fail(1)) && o!=previous_object())
01597     return;
01598   //noch kein notify_fail() fuer dieses Kommando gesetzt, auf gehts.
01599   set_this_object(previous_object());
01600   efun::notify_fail(str);
01601   return;
01602 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

private nomask string _process_string ( string  str,
object  po 
)

Definiert in Zeile 782 der Datei simul_efun.c.

Benutzt process_string().

00782                                                             {
00783               set_this_object(po);
00784               return(efun::process_string(str));
00785 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

protected void _same_object ( object  ob,
mapping  m 
)

Definiert in Zeile 1040 der Datei simul_efun.c.

01040                                                     {
01041   // ist nicht so bloed, wie es aussieht, s. nachfolgede Verwendung von m
01042   if ( m[ob] )
01043     m[ob] += ({ ob });
01044   else
01045     m[ob] = ({ ob }); 
01046 }

protected void _same_path ( object  key,
object *  obs,
mapping  m 
)

Definiert in Zeile 1051 der Datei simul_efun.c.

01051                                                                 {
01052   string path;
01053   if (!objectp(key) || !pointerp(obs)) return;
01054 
01055   path = load_name(key);
01056 
01057   if ( m[path] )
01058     m[path] += obs;
01059   else
01060     m[path] = obs;
01061 }

protected void _same_uid ( string  key,
object *  obs,
mapping  m,
closure  cf 
)

Definiert in Zeile 1089 der Datei simul_efun.c.

01089                                                                            {
01090   string uid;
01091 
01092   if ( !pointerp(obs) || !sizeof(obs) )
01093     return;
01094 
01095   uid = funcall( cf, key );
01096 
01097   if ( m[uid] )
01098     m[uid] += obs; // obs ist nen Array
01099   else
01100     m[uid] = obs;
01101 }

private object _shadow ( object  ob,
int  flag 
)

Definiert in Zeile 1605 der Datei simul_efun.c.

Benutzt shadow().

01606 {
01607   set_this_object(previous_object(1));
01608   return efun::shadow(ob, flag);
01609 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

static int _shout_filter ( object  ob,
string  pat 
) [static]

Definiert in Zeile 1317 der Datei simul_efun.c.

01318 {
01319     string *ignore;
01320 
01321     if ( !environment(ob) )
01322        return 0;
01323 
01324     // shout may be ignored
01325     if ( member(ob->QueryProp(P_IGNORE)||({}),"shout")!=-1)
01326            return 0;
01327 
01328     return sizeof( regexp( ({ object_name( environment(ob) ) }), pat ) );
01329 }

protected int _too_many ( mixed  key,
mapping  m,
int  i 
)

Definiert in Zeile 1064 der Datei simul_efun.c.

01064                                                        {
01065     return sizeof(m[key]) >= i;
01066 }

private void _unshadow (  ) 

Definiert in Zeile 1619 der Datei simul_efun.c.

01619                          {
01620   set_this_object(previous_object(1));
01621   efun::unshadow();
01622 }

int absolute_hb_count (  ) 

Definiert in Zeile 1426 der Datei simul_efun.c.

private varargs string block_string ( string  s,
int  width,
int  flags 
)

Definiert in Zeile 619 der Datei simul_efun.c.

Benutzt BS_LEAVE_MY_LFS und BS_NO_PARINDENT.

00619                                                                     {
00620   if (!(flags & BS_NO_PARINDENT)) {
00621     if (flags & BS_LEAVE_MY_LFS)
00622       s = " "+regreplace(s,"\n","\n ",1);
00623     else s=" "+s;
00624  }
00625 
00626   s = sprintf( "%-*=s", width, s);
00627 
00628   string *tmp=explode(s, "\n");
00629   return implode( map( tmp[0..<2], #'stretch/*'*/, width ), "\n" ) 
00630     + "\n" + tmp[<1];
00631 }

public varargs string break_string ( string  s,
int  w,
mixed  indent,
int  flags 
)

Definiert in Zeile 633 der Datei simul_efun.c.

Benutzt block_string(), BS_BLOCK, BS_INDENT_ONCE, BS_LEAVE_MY_LFS, BS_NO_PARINDENT, BS_PREPEND_INDENT und BS_SINGLE_SPACE.

00634 {
00635     if ( !s || s == "" ) return "";
00636 
00637     if ( !w ) w=78;
00638 
00639     if( intp(indent) )
00640        indent = indent ? " "*indent : "";
00641 
00642     int indentlen=stringp(indent) ? strlen(indent) : 0;
00643 
00644     if (indentlen>w) {
00645       set_this_object(previous_object());
00646       raise_error(sprintf("break_string: indent longer %d than width %d\n",
00647                   indentlen,w));
00648       // w=((indentlen/w)+1)*w;
00649     }
00650 
00651     if (!(flags & BS_LEAVE_MY_LFS)) 
00652       s=regreplace( s, "\n", " ", 1 );
00653 
00654     if ( flags & BS_SINGLE_SPACE )
00655        s = regreplace( s, "(^|\n| )  *", "\\1", 1 );
00656  
00657     string prefix="";
00658     if (indentlen && flags & BS_PREPEND_INDENT) {
00659       if (indentlen+strlen(s) > w || 
00660          (flags & BS_LEAVE_MY_LFS) && strstr(s,"\n")>-1) {
00661        prefix=indent+"\n";
00662        indent=(flags & BS_NO_PARINDENT) ? "" : " ";
00663        indentlen=strlen(indent);
00664       }
00665     }
00666 
00667     if ( flags & BS_BLOCK ) {
00668       /*
00669            s = implode( map( explode( s, "\n" ),
00670                                #'block_string, w, indentlen, flags),
00671                       "" );
00672       */
00673       s = block_string( s , w - indentlen, flags );
00674     }
00675     else {
00676       s = sprintf("%-1.*=s",w-indentlen,s);
00677     }
00678     if ( s[<1] != '\n' ) s += "\n";
00679 
00680     if ( !indentlen ) return prefix + s;
00681     
00682     string indent2 = ( flags & BS_INDENT_ONCE ) ? (" "*indentlen) :indent;
00683       
00684     return prefix + indent + 
00685       regreplace( s[0..<2], "\n", "\n"+indent2, 1 ) + "\n";
00686       /*
00687        string *buf;
00688 
00689        buf = explode( s, "\n" );
00690        return prefix + indent + implode( buf[0..<2], "\n"+indent2 ) + buf[<1] + "\n";
00691       */
00692 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

int broken_count_bits ( string  s  ) 

Definiert in Zeile 2112 der Datei simul_efun.c.

Benutzt i.

02112                                   {
02113     int i, res;
02114     if( !stringp(s) || !(i=strlen(s)) ) return 0;
02115     for( ; i-->0; ) {
02116         // We are counting 6 bits at a time using a precompiled table.
02117         res += count_table[(s[i]-' ')&63]-'0';
02118     }
02119     return res;
02120 }

nomask varargs void call_out ( varargs mixed *  args  ) 

Definiert in Zeile 1159 der Datei simul_efun.c.

Benutzt _destroy(), _same_object(), _too_many(), call_out(), call_out_info(), debug_info(), DID_ST_CALLOUTS, DID_STATUS, DINFO_DATA, m_delete(), master, pathmap und ROOTID.

01160 {
01161     mixed tmp, *call_outs;
01162 
01163     // Bei >600 Callouts alle Objekte killen, die mehr als 30 Callouts laufen
01164     // haben.
01165     if ( efun::debug_info(DINFO_DATA,DID_STATUS,DID_ST_CALLOUTS) > 600 
01166         && geteuid(previous_object()) != ROOTID ) {
01167        // Objekte aller Callouts ermitteln
01168        call_outs = map( efun::call_out_info(), #'_call_out_obj );
01169        mapping objectmap = ([]);
01170        filter( call_outs, #'_same_object, &objectmap );
01171        // Master nicht grillen...
01172        efun::m_delete( objectmap, master(1) );
01173        // alle Objekte raussuchen, die zuviele haben...
01174        mapping res = filter_indices( objectmap, #'_too_many, objectmap, 29 );
01175        // und ueber alle Keys gehen, an _destroy() werden Key und Array mit
01176        // Objekten uebergeben (in diesem Fall sind Keys und Array mit
01177        // Objekten jeweils das gleiche Objekt).
01178        if ( sizeof(res) )       
01179            walk_mapping(res, #'_destroy, "CALL_OUT overflow by single "             
01180               "object [%O]. Destructed %d objects. [%s]\n", 0 );
01181 
01182        // Bei (auch nach dem ersten Aufraeumen noch) >800 Callouts alle
01183        // Objekte killen, die mehr als 50 Callouts laufen haben - und
01184        // diesmal zaehlen Clones nicht eigenstaendig! D.h. es werden alle
01185        // Clones einer BP gekillt, die Callouts laufen haben, falls alle
01186        // diese Objekte _zusammen_ mehr als 50 Callouts haben!
01187        if ( efun::debug_info(DINFO_DATA,DID_STATUS,DID_ST_CALLOUTS) > 800 ) {
01188            // zerstoerte Objekte von der letzten Aktion sind in objectmap nicht
01189            // mehr drin, da sie dort als Keys verwendet wurden.
01190            mapping pathmap=([]);
01191            // alle Objekt einer BP in res sortieren, BP-Name als Key, Arrays
01192            // von Objekten als Werte.
01193            walk_mapping( objectmap, #'_same_path, &pathmap);
01194            // alle BPs (und ihre Objekte) raussuchen, die zuviele haben...
01195            res = filter_indices( pathmap, #'_too_many/*'*/, pathmap, 50 );
01196            // und ueber alle Keys gehen, an _destroy() werden die Clones
01197            // uebergeben, die Callouts haben.
01198            if ( sizeof(res) )
01199               walk_mapping( res, #'_destroy/*'*/, "CALL_OUT overflow by file "
01200                            "'%s'. Destructed %d objects. [%s]\n", 0 );
01201 
01202            // Wenn beide Aufraeumarbeiten nichts gebracht haben und immer
01203            // noch >1000 Callouts laufen, werden diesmal alle Callouts
01204            // einer UID zusammengezaehlt.
01205            // Alle Objekte einer UID, die es in Summe aller ihrer Objekt mit
01206            // Callouts auf mehr als 100 Callouts bringt, werden geroestet.
01207            if (efun::debug_info(DINFO_DATA,DID_STATUS,DID_ST_CALLOUTS)>1000){
01208               // das nach BP-Namen vorgefilterte Mapping jetzt nach UIDs
01209               // zusammensortieren. Zerstoerte Clones filter _same_uid()
01210               // raus.
01211               mapping uidmap=([]);
01212               walk_mapping( pathmap, #'_same_uid, &uidmap,
01213                            symbol_function( "creator_file",
01214                                           "/secure/master" ) );
01215               // In res nun UIDs als Keys und Arrays von Objekten als Werte.
01216               // Die rausfiltern, die mehr als 100 Objekte (non-unique, d.h.
01217               // 100 Callouts!) haben.
01218               res = filter_indices( uidmap, #'_too_many, uidmap, 100 );
01219               // und erneut ueber die Keys laufen und jeweils die Arrays mit
01220               // den Objekten zur Zerstoerung an _destroy()...
01221               if ( sizeof(res) )
01222                   walk_mapping( res, #'_destroy, "CALL_OUT overflow by "
01223                               "UID '%s'. Destructed %d objects. [%s]\n",
01224                               1 );
01225            }
01226        }
01227     }
01228 
01229     // Falls das aufrufende Objekt zerstoert wurde beim Aufraeumen
01230     if ( !previous_object() )
01231        return;
01232 
01233     set_this_object( previous_object() );
01234     apply( #'efun::call_out, args );
01235     return;
01236 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

mixed call_out_info (  ) 

Definiert in Zeile 1240 der Datei simul_efun.c.

Benutzt ARCH_LVL, BACKBONEID, call_out_info(), creator_file(), master und query_wiz_level().

01240                       {
01241   
01242   object po = previous_object();
01243   mixed coi = efun::call_out_info();
01244 
01245   // ungefilterten Output nur fuer bestimmte Objekte, Objekte in /std oder
01246   // /obj haben die BackboneID.
01247   if (query_wiz_level(getuid(po)) >= ARCH_LVL
01248        || (string)master()->creator_file(load_name(po)) == BACKBONEID ) {
01249       return coi;
01250   }
01251   else {
01252       return filter(coi, function mixed (mixed arr) {
01253               if (pointerp(arr) && arr[0]==po)
01254                  return 1;
01255               else return 0; });
01256   }
01257 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

void cindent ( string  name  ) 

Definiert in Zeile 1405 der Datei simul_efun.c.

01406 {
01407   set_this_object(previous_object());
01408   raise_error("Sorry, no CINDENT available.\n");
01409 }

nomask int copy_file ( string  source,
string  dest 
)

Definiert in Zeile 1885 der Datei simul_efun.c.

Benutzt master und MAXLEN.

01886 {
01887 
01888   int ptr;
01889   string bytes;
01890 
01891   set_this_object(previous_object());
01892   if (!strlen(source)||!strlen(dest)||source==dest||(file_size(source)==-1)||
01893       (!call_other(master(),"valid_read",source,
01894                    getuid(this_interactive()||
01895                  previous_object()),"read_file",previous_object()))||
01896       (!call_other(master(),"valid_read",source,
01897                    getuid(this_interactive()||
01898                  previous_object()),"write_file",previous_object())))
01899     return 1;
01900   switch (file_size(dest))
01901   {
01902   case -1:
01903     break;
01904   case -2:
01905     if (dest[<1]!='/') dest+="/";
01906     dest+=efun::explode(source,"/")[<1];
01907     if (file_size(dest)==-2) return 1;
01908     if (file_size(dest)!=-1) break;
01909   default:
01910     if (!rm(dest)) return 1;
01911     break;
01912   }
01913   do
01914   {
01915     bytes = read_bytes(source, ptr, MAXLEN); ptr += MAXLEN;
01916     if (!bytes) bytes="";
01917     write_file(dest, bytes);
01918   }
01919   while(strlen(bytes) == MAXLEN);
01920   return 0;
01921 }

int count_bits ( string  s  ) 

Definiert in Zeile 2123 der Datei simul_efun.c.

Benutzt broken_count_bits().

02123                            {
02124     return(broken_count_bits(s));
02125 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

varargs string country ( mixed  ip,
string  num 
)

Definiert in Zeile 206 der Datei simul_efun.c.

Benutzt country().

00206                                              {
00207   mixed ret;
00208 
00209   if(ret = (string)"/p/daemon/iplookup"->country(num || ip)) {
00210     return ret;
00211   } else return "???";
00212 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

public varargs string CountUp ( string *  s,
string  sep,
string  lastsep 
)

Definiert in Zeile 1848 der Datei simul_efun.c.

01849 {
01850     string ret;
01851 
01852     if ( !pointerp(s) )
01853        return "";
01854     
01855     if (!sep) sep = ", ";
01856     if (!lastsep) lastsep = " und ";
01857 
01858     switch (sizeof(s))  {
01859        case 0: ret=""; break;
01860        case 1: ret=s[0]; break;
01861        default:
01862               ret = implode(s[0..<2], sep);
01863               ret += lastsep + s[<1];
01864     }
01865     return ret;
01866 }

void dangling_lfun_closure (  ) 

Definiert in Zeile 741 der Datei simul_efun.c.

00741                              {
00742   raise_error("dangling lfun closure\n");
00743 }

nomask mixed debug_info ( int  flag,
varargs int *  args 
)

Definiert in Zeile 1717 der Datei simul_efun.c.

01717                                                       {
01718 
01719 //  if ( (flag == 2) &&
01720 //       (!this_player() || !IS_ARCH(this_player()) || process_call()) ) return;
01721 
01722   set_this_object(previous_object());
01723   return(apply(#'efun::debug_info,flag, args));
01724 }

public varargs object deep_present ( mixed  what,
object  ob 
)

Definiert in Zeile 1479 der Datei simul_efun.c.

Benutzt cnt.

01479                                                           {
01480 
01481   if(!objectp(ob))
01482     ob=previous_object();
01483   // Wenn ein Objekt gesucht wird: Alle Envs dieses Objekts ermitteln und
01484   // schauen, ob in diesen ob vorkommt. Dann ist what in ob enthalten.
01485   if(objectp(what)) {
01486     object *envs=all_environment(what);
01487     // wenn ob kein Environment hat, ist es offensichtlich nicht in what
01488     // enthalten.
01489     if (!pointerp(envs)) return 0;
01490     if (member(envs, ob) != -1) return what;
01491   }
01492   // sonst wirds teurer, ueber alle Objekte im (deep) Inv laufen und per id()
01493   // testen. Dabei muss aber die gewuenschte Nr. ("flasche 3") abgeschnitten
01494   // werden und selber gezaehlt werden, welche das entsprechende Objekt ist.
01495   else if (stringp(what)) {
01496       int cnt;
01497       string newwhat;
01498       if(sscanf(what,"%s %d",newwhat,cnt)!=2)
01499        cnt=1;
01500       else
01501        what=newwhat;
01502       foreach(object invob: deep_inventory(ob)) {
01503        if (invob->id(what) && !--cnt)
01504            return invob;
01505       }
01506   }
01507   else {
01508     set_this_object(previous_object());
01509     raise_error(sprintf("Wrong argument 1 to deep_present(). "
01510          "Expected \"object\" or \"string\", got %.50O.\n",
01511          what));
01512   }
01513   return 0;
01514 }

nomask void destruct ( mixed  ob  ) 

Definiert in Zeile 100 der Datei simul_efun.c.

Benutzt ARCH_SECURITY, destruct(), dtime(), IS_ARCH, log_file und process_call().

00101 {
00102   string fname;
00103   object tmp;
00104 
00105   if ( !objectp(ob) && !objectp(ob = find_object(ob)) )
00106       return;
00107 
00108   //bestimmte Objekte duerfen nicht so ohne weiteres zerstoert werden.
00109   fname = object_name(ob);
00110   if( member(({ "/secure/master", "/secure/simul_efun", "/obj/shut",
00111        "/secure/shut", "/room/void", "/room/netztot", "/secure/errord",
00112        "/secure/spare_simul_efun", "/secure/explorationmaster", }), 
00113        fname ) >= 0 ) {
00114     if( previous_object()!=ob && !ARCH_SECURITY || process_call() ) {
00115       write("You have no permission to destruct the specified object!\n");
00116       return;
00117     }
00118   }
00119   
00120   // Nicht-EMs sollen keine EMs zerstoeren koennen, woraufhin auch evtl.
00121   // EM-Tools rumliegen koennten.
00122   if ( query_once_interactive(ob) && IS_ARCH(ob) && previous_object()!=ob &&
00123       (process_call() || !ARCH_SECURITY) )
00124     return;
00125 
00126   // Das Zerstoeren von Spielern wird ggf. geloggt.
00127   if ( query_once_interactive(ob) && previous_object() != ob
00128        && previous_object()
00129        && object_name(previous_object())[0..7] != "/secure/" )
00130       log_file( "PLAYERDEST",
00131               sprintf( "%s: %O VERNICHTET von PO %O, TI %O, TP %O\n",
00132                       dtime(time()), ob, previous_object(),
00133                       this_interactive(), this_player() ) );
00134 
00135   set_this_object(previous_object());
00136   efun::destruct(ob);
00137 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

string dtime ( int  wann  ) 

Definiert in Zeile 488 der Datei simul_efun.c.

Benutzt dtime_cache, MONATE, TAGE, TM_HOUR, TM_MDAY, TM_MIN, TM_MON, TM_SEC, TM_WDAY und TM_YEAR.

00488                        {
00489   
00490   if (wann == dtime_cache[0])
00491     return(dtime_cache[1]);
00492 
00493   int *lt = localtime(wann);
00494   return sprintf("%s, %2d. %s %d, %02d:%02d:%02d",
00495       TAGE[lt[TM_WDAY]], lt[TM_MDAY], MONATE[lt[TM_MON]], 
00496       lt[TM_YEAR],lt[TM_HOUR], lt[TM_MIN], lt[TM_SEC]);
00497 }

mapping dump_ip_mapping (  ) 

Definiert in Zeile 1516 der Datei simul_efun.c.

01517 {
01518   return 0;
01519 }

mixed* exclude_alist ( int  i,
mixed *  alist 
)

Definiert in Zeile 471 der Datei simul_efun.c.

00472 {
00473   int j;
00474   if (!pointerp(alist) || !sizeof(alist) || i<0)
00475     return alist;
00476   if (!pointerp(alist[0]))
00477     return alist[0..i-1]+alist[i+1..];
00478   alist=alist[0..]; /* Create PHYSICAL copy of alist */
00479   for (j=sizeof(alist)-1;j>=0;j--)
00480     alist[j]=alist[j][0..i-1]+alist[j][i+1..];
00481   return alist; /* order_alist is NOT necessary - see /doc/LPC/alist */
00482 }

mixed* exclude_array ( mixed *  arr,
int  from,
int  to 
)

Definiert in Zeile 2130 der Datei simul_efun.c.

02131 {
02132   if (to<from)
02133     to = from;
02134   return arr[0..from-1]+arr[to+1..];
02135 }

int exist_days (  ) 

Definiert in Zeile 717 der Datei simul_efun.c.

Benutzt first_boot_time().

00718 {
00719   return (((time()-first_boot_time())/8640)+5)/10;
00720 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

varargs string extract ( string  str,
int  from,
int  to 
)

Definiert in Zeile 2036 der Datei simul_efun.c.

Benutzt abs.

02036                                                      {
02037 
02038   if(!stringp(str)) {
02039     set_this_object(previous_object());
02040     raise_error(sprintf("Bad argument 1 to extract(): %O",str));
02041   }
02042   if (intp(from) && intp(to)) {
02043     if (from>=0 && to>=0)
02044       return(str[from .. to]);
02045     else if (from>=0 && to<0)
02046       return(str[from .. <abs(to)]);
02047     else if (from<0 && to>=0)
02048       return(str[<abs(from) .. to]);
02049     else
02050       return(str[<abs(from) .. <abs(to)]);
02051   }
02052   else if (intp(from)) {
02053     if (from>=0)
02054       return(str[from .. ]);
02055     else
02056       return(str[<abs(from) .. ]);
02057   }
02058   else {
02059     return(str);
02060   }
02061 }

int file_time ( string  path  ) 

Definiert in Zeile 419 der Datei simul_efun.c.

Benutzt GETDIR_DATES.

00419                            {
00420   mixed *v;
00421 
00422   set_this_object(previous_object());
00423   if (sizeof(v=get_dir(path,GETDIR_DATES))) return v[0];
00424   return(0); //sonst
00425 }

static object find_snooped ( object  who  )  [static]

Definiert in Zeile 216 der Datei simul_efun.c.

Benutzt i und query_snoop().

Wird benutzt von snoop().

00217 {
00218   object *u;
00219   int i;
00220 
00221   for (i=sizeof(u=users())-1;i>=0;i--)
00222     if (who==efun::query_snoop(u[i]))
00223       return u[i];
00224   return 0;
00225 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

Hier ist ein Graph der zeigt, wo diese Funktion aufgerufen wird:

int first_boot_time (  ) 

Definiert in Zeile 712 der Datei simul_efun.c.

00713 {
00714   return 701517600;
00715 }

nomask varargs void garbage_collection ( string  str  ) 

Definiert in Zeile 1527 der Datei simul_efun.c.

Benutzt ARCH_SECURITY, garbage_collection() und IS_ARCH.

01528 {
01529   if(previous_object()==0 || !IS_ARCH(geteuid(previous_object())) 
01530       || !ARCH_SECURITY)
01531   {
01532     write("Call GC now and the mud will crash in 5-6 hours. DONT DO IT!\n");
01533     return;
01534   }
01535   else if (stringp(str))
01536   {
01537     return efun::garbage_collection(str);
01538   }
01539   else 
01540     return efun::garbage_collection();
01541 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

varargs void input_to ( mixed  fun,
int  onoff,
varargs mixed *  args 
)

Definiert in Zeile 1786 der Datei simul_efun.c.

Benutzt EOR und IAC.

01787 {
01788     mixed *arr;
01789     mapping TN;
01790     int i;
01791 
01792     if ( !this_player() || !previous_object() )
01793        return;
01794 
01795     arr = ({ fun, onoff }) + args;
01796 
01797     for ( i = sizeof(arr) - 1; i > 1; i-- )
01798        if ( pointerp(arr[i]) )
01799            arr[i] = quote(arr[i]);
01800 
01801     TN = (mapping) this_player()->query_telnet_neg();
01802 
01803     if ( mappingp(TN) && mappingp(TN["received"]) &&
01804         (TN["received"][TELOPT_EOR,1] == DO) )
01805        funcall( bind_lambda( #'efun::binary_message/*'*/, this_player() ),
01806                ({ IAC, EOR }) );
01807 
01808     funcall( bind_lambda( unbound_lambda( ({}),
01809                                      ({ #'efun::input_to/*'*/ }) + arr ),
01810                        previous_object() ) );
01811 }

public string iso2ascii ( string  str  ) 

Definiert in Zeile 1830 der Datei simul_efun.c.

01831 {
01832     if ( !stringp(str) || !strlen(str) )
01833        return "";
01834 
01835     str = regreplace( str, "ä", "ae", 1 );
01836     str = regreplace( str, "ö", "oe", 1 );
01837     str = regreplace( str, "ü", "ue", 1 );
01838     str = regreplace( str, "Ä", "Ae", 1 );
01839     str = regreplace( str, "Ö", "Oe", 1 );
01840     str = regreplace( str, "Ü", "Ue", 1 );
01841     str = regreplace( str, "ß", "ss", 1 );
01842     str = regreplace( str, "[^ -~]", "?", 1 );
01843 
01844     return str;
01845 }

int last_reboot_time (  ) 

Definiert in Zeile 707 der Datei simul_efun.c.

00708 {
00709   return __BOOT_TIME__;
00710 }

static private string Lcut ( string  str  )  [static]

Definiert in Zeile 227 der Datei simul_efun.c.

Wird benutzt von snoop().

00227                                        {
00228   return str[5..11]+str[18..];
00229 }

Hier ist ein Graph der zeigt, wo diese Funktion aufgerufen wird:

private int living_or_interactive ( object  o  ) 

Definiert in Zeile 1312 der Datei simul_efun.c.

01313 {
01314   return (living(o) || query_once_interactive(o));
01315 }

varargs int log_file ( string  file,
string  txt,
int  size_to_break 
)

Definiert in Zeile 428 der Datei simul_efun.c.

Benutzt MAX_LOG_SIZE und PO.

00428                                                                  {
00429   mixed *st;
00430 
00431   file="/log/"+file;
00432   file=implode((efun::explode(file,"/")-({".."})),"/");
00433 //  tell_object(find_player("jof"),sprintf("LOG FILE: %O -> %O\n",previous_object(),file));
00434   if (!funcall(bind_lambda(#'efun::call_other,PO),"secure/master",//')
00435               "valid_write",file,geteuid(PO),"log_file",PO))
00436       return 0;
00437   if ( size_to_break >= 0 & (
00438       sizeof(st = get_dir(file,2) ) && st[0] >= (size_to_break|MAX_LOG_SIZE)))
00439       catch(rename(file, file + ".old");publish); /* No panic if failure */
00440   return(write_file(file,txt));
00441 }

int lowerchar ( int  char  ) 

Definiert in Zeile 555 der Datei simul_efun.c.

00555                         {
00556   if (char<'A' || char>'Z') return char;
00557   return char+32;
00558 }

string lowerstring ( string  s  ) 

Definiert in Zeile 576 der Datei simul_efun.c.

00577 {
00578   if (!stringp(s)) return 0;
00579   return lower_case(s);
00580 }

mapping m_delete ( mapping  m,
mixed  key 
)

Definiert in Zeile 696 der Datei simul_efun.c.

Benutzt m_delete().

00696                                        {
00697   return efun::m_delete(copy(m), key);
00698 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

int m_width ( mapping  m  ) 

Definiert in Zeile 701 der Datei simul_efun.c.

00701                        {
00702   return(widthof(m));
00703 }

int member_array ( mixed  item,
mixed  arraystring 
)

Definiert in Zeile 2094 der Datei simul_efun.c.

02094                                                 {
02095 
02096   if (pointerp(arraystring)) {
02097     return(efun::member(arraystring,item));
02098   }
02099   else if (stringp(arraystring)) {
02100     return(efun::member(arraystring,to_int(item)));
02101   }
02102   else {
02103     set_this_object(previous_object());
02104     raise_error(sprintf("Bad argument 1 to member_array(): %O",arraystring));
02105   }
02106 }

static void move_inv ( object  ob  )  [static]

Definiert in Zeile 767 der Datei simul_efun.c.

00768 {
00769   if (living(ob)) ob->move(previous_object(),1);
00770 }

varargs void move_object ( mixed  what,
mixed  where 
)

Definiert in Zeile 1268 der Datei simul_efun.c.

Benutzt destruct(), log_file, NETDEAD_ROOM und set_object_heart_beat().

01269 {
01270   object po,tmp;
01271 
01272   po=previous_object();
01273   if (!where)
01274   {
01275     where=what;
01276     what=po;
01277   }
01278   if (((stringp(where) && where==NETDEAD_ROOM ) ||
01279        (objectp(where) && where==find_object(NETDEAD_ROOM))) &&
01280        objectp(what) && object_name(what)!="/obj/sperrer")
01281   {
01282     if (!query_once_interactive(what))
01283     {
01284       what->remove();
01285       if (what) destruct(what);
01286       return;
01287     }
01288     if (living(what) || interactive(what))
01289     {
01290       log_file("NDEAD2",sprintf("TRYED TO MOVE TO NETDEAD: %O\n",what));
01291       return;
01292     }
01293     set_object_heart_beat(what,0);
01294   }
01295   tmp=what;
01296   while (tmp=environment(tmp))
01297       // Ja. Man ruft die _set_xxx()-Funktionen eigentlich nicht direkt auf.
01298       // Aber das Lichtsystem ist schon *so* rechenintensiv und gerade der
01299       // P_LAST_CONTENT_CHANGE-Cache wird *so* oft benoetigt, dass es mir
01300       // da um jedes bisschen Rechenzeit geht.
01301       // Der Zweck heiligt ja bekanntlich die Mittel. ;-)
01302       //
01303       // Tiamak
01304     tmp->_set_last_content_change();
01305   (void)funcall(bind_lambda(#'efun::move_object,po),what,where);
01306   if (tmp=what)
01307     while (tmp=environment(tmp))
01308       tmp->_set_last_content_change();
01309 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

varargs void notify_fail ( mixed  nf,
int  prio 
)

Definiert in Zeile 1543 der Datei simul_efun.c.

Benutzt NF_NL_LIVING, NF_NL_NONE, NF_NL_OWN, NF_NL_ROOM, NF_NL_THING, notify_fail() und PL.

01543                                              {
01544   object po,oldo;
01545   int oldprio;
01546   
01547   if (!PL || !objectp(po=previous_object())) return;
01548   if (!stringp(nf) && !closurep(nf)) {
01549       set_this_object(po);
01550       raise_error(sprintf(
01551          "Only strings and closures allowed for notify_fail! "
01552          "Argument was: %.50O...\n",nf));
01553   }
01554 
01555   // falls ein Objekt bereits nen notify_fail() setzte, Prioritaeten abschaetzen
01556   // und vergleichen.
01557   if (objectp(oldo=query_notify_fail(1)) && po!=oldo) {
01558     if (!prio) {       
01559       //Prioritaet dieses notify_fail() 'abschaetzen'
01560       if (po==PL) // Spieler-interne (soul-cmds)
01561         prio=NF_NL_OWN;
01562       else if (living(po))
01563         prio=NF_NL_LIVING;
01564       else if ((int)po->IsRoom())
01565         prio=NF_NL_ROOM;
01566       else
01567         prio=NF_NL_THING;
01568     }
01569     //Prioritaet des alten Setzers abschaetzen
01570     if (oldo==PL)
01571       oldprio=NF_NL_OWN;
01572     else if (living(oldo))
01573       oldprio=NF_NL_LIVING;
01574     else if ((int)oldo->IsRoom())
01575       oldprio=NF_NL_ROOM;
01576     else
01577       oldprio=NF_NL_THING;
01578   }
01579   else // wenn es noch kein Notify_fail gibt:
01580     oldprio=NF_NL_NONE;
01581 
01582   //vergleichen und ggf. setzen
01583   if (prio >= oldprio) { 
01584     set_this_object(po);
01585     efun::notify_fail(nf);
01586   }
01587 
01588   return;
01589 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

string NotifyDestruct ( object  caller  ) 

Definiert in Zeile 141 der Datei simul_efun.c.

Benutzt ARCH_SECURITY und process_call().

00141                                      {
00142     if( (caller!=this_object() && !ARCH_SECURITY) || process_call() ) {
00143       return "Du darfst das simul_efun Objekt nicht zerstoeren!\n";
00144     }
00145 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

string* old_explode ( string  str,
string  del 
)

Definiert in Zeile 392 der Datei simul_efun.c.

00392                                             {
00393   int s, t;
00394   string *strs;
00395 
00396   if (!stringp(str)) {
00397       set_this_object(previous_object());
00398       raise_error(sprintf(
00399          "Invalid argument 1 to old_explode()! Expected <string>, got: "
00400          "%.30O\n",str));
00401   }
00402   if (!stringp(del)) {
00403       set_this_object(previous_object());
00404       raise_error(sprintf(
00405          "Invalid argument 2 to old_explode()! Expected <string>, got: "
00406          "%.30O\n",del));
00407   }
00408   if(del == "")
00409     return ({str});
00410   strs=efun::explode(str, del);
00411   t=sizeof(strs)-1;
00412   while(s<=t && strs[s++] == "");s--;
00413   while(t>=0 && strs[t--] == "");t++;
00414   if(s<=t)
00415     return strs[s..t];
00416   return ({});
00417 }

public nomask int process_call (  ) 

Definiert in Zeile 775 der Datei simul_efun.c.

Benutzt process_flag.

00776 {
00777   if (process_flag>0)
00778     return process_flag;
00779   else return(0);
00780 }

nomask string process_string ( mixed  str  ) 

Definiert in Zeile 787 der Datei simul_efun.c.

Benutzt err, flag und process_flag.

00788 {
00789   string tmp, err;
00790   int flag; 
00791 
00792   if ( closurep(str) ) {
00793       set_this_object( previous_object() );
00794       return funcall(str);
00795   }
00796   else if (str==0)
00797       return((string)str);
00798   else if ( !stringp(str) ) {
00799       return to_string(str);
00800   }
00801 
00802   if ( !(flag = process_flag > time() - 60))                     
00803       process_flag=time();
00804 
00805   err = catch(tmp = funcall(#'_process_string,str,previous_object()); publish);
00806 
00807   if ( !flag )
00808     process_flag=0;
00809 
00810   if (err) {
00811     // Verarbeitung abbrechen
00812     set_this_object(previous_object());
00813     raise_error(err);
00814   }
00815   return tmp;
00816 }

mixed query_closure_object ( closure  c  ) 

Definiert in Zeile 1260 der Datei simul_efun.c.

Benutzt CLOSURE_IS_UNBOUND_LAMBDA.

01260                                       {
01261   return
01262     CLOSURE_IS_UNBOUND_LAMBDA(get_type_info(c, 1)) ?
01263       0 :
01264   (to_object(c) || -1);
01265 }

mixed* query_comm_stat (  ) 

Definiert in Zeile 1414 der Datei simul_efun.c.

01415 {
01416   return ({0,0});
01417 }

string query_ip_name ( mixed  ob  ) 

Definiert in Zeile 199 der Datei simul_efun.c.

Benutzt query_ip_number().

00200 {
00201   if ( !ob || objectp(ob) )
00202       ob=query_ip_number(ob);
00203   return (string)"/p/daemon/iplookup"->host(ob);
00204 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

string query_ip_number ( object  ob  ) 

Definiert in Zeile 188 der Datei simul_efun.c.

Benutzt query_ip_number().

00189 {
00190   ob= ob || this_player();
00191   if (!objectp(ob) || !interactive(ob)) return 0;
00192   if(ob->query_realip() && (string)ob->query_realip()!="")
00193   {
00194     return (string)ob->query_realip();
00195   }
00196   return efun::query_ip_number(ob);
00197 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

nomask varargs int query_ip_port ( object  pl  ) 

Definiert in Zeile 1711 der Datei simul_efun.c.

01712 {
01713   return 23;
01714 }

nomask varargs int query_next_reset ( object  ob  ) 

Definiert in Zeile 1868 der Datei simul_efun.c.

Benutzt OIB_NEXT_RESET und OINFO_BASIC.

01868                                                {
01869 
01870     // Typpruefung: etwas anderes als Objekte oder 0 sollen Fehler sein.
01871     if (ob && !objectp(ob))
01872       raise_error(sprintf("Bad arg 1 to query_next_reset(): got %.20O, "
01873            "expected object.\n",ob));
01874 
01875     // Defaultobjekt PO, wenn 0 uebergeben.
01876     if ( !objectp(ob) )
01877       ob = previous_object();
01878 
01879     return object_info(ob,OINFO_BASIC)[OIB_NEXT_RESET];
01880 }

nomask object query_snoop ( object  who  ) 

Definiert in Zeile 381 der Datei simul_efun.c.

Benutzt IS_ARCH, query_snoop() und query_wiz_grp().

00381                                       {
00382   object snooper;
00383 
00384   snooper=efun::query_snoop(who);
00385   if (!snooper) return 0;
00386   if (query_wiz_grp(snooper)>query_wiz_grp(getuid(previous_object())) &&
00387       IS_ARCH(snooper)) return 0;
00388   return snooper;
00389 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

int query_wiz_grp ( mixed  wiz  ) 

Definiert in Zeile 920 der Datei simul_efun.c.

00921 {
00922   int lev;
00923 
00924   lev=query_wiz_level(wiz);
00925   if (lev<SEER_LVL) return 0;
00926   if (lev>=GOD_LVL) return lev;
00927   if (lev>=ARCH_LVL) return ARCH_GRP;
00928   if (lev>=ELDER_LVL) return ELDER_GRP;
00929   if (lev>=LORD_LVL) return LORD_GRP;
00930   if (lev>=SPECIAL_LVL) return SPECIAL_GRP;
00931   if (lev>=DOMAINMEMBER_LVL) return DOMAINMEMBER_GRP;
00932   if (lev>=WIZARD_LVL) return WIZARD_GRP;
00933   if (lev>=LEARNER_LVL) return LEARNER_GRP;
00934   return SEER_GRP;
00935 }

int query_wiz_level ( mixed  player  ) 

Definiert in Zeile 444 der Datei simul_efun.c.

Benutzt DOMAINDIR, get_wiz_level(), GUILDID, PROJECTDIR und WIZLVLS.

00444                                   {
00445   return (int)"/secure/master"->query_wiz_level(player);
00446 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

mixed* remove_alist ( mixed  key,
mixed *  alist 
)

Definiert in Zeile 449 der Datei simul_efun.c.

Benutzt i und p.

00450 {
00451   int i,j;
00452 
00453   if (!pointerp(alist) || !sizeof(alist))
00454     return alist;
00455   if (!pointerp(alist[0]))
00456   {
00457     if ((i=assoc(key,alist))<0)
00458       return alist;
00459     return alist[0..i-1]+alist[i+1..];
00460   }
00461   i = assoc(key,alist[0]);
00462   if ((i=assoc(key,alist[0]))<0)
00463     return alist;
00464   alist=alist[0..];
00465   for (j=sizeof(alist)-1;j>=0;j--)
00466     alist[j]=alist[j][0..i-1]+alist[j][i+1..];
00467   return alist;
00468 }

public nomask void remove_interactive ( object  ob  ) 

Definiert in Zeile 147 der Datei simul_efun.c.

Benutzt dtime(), log_file und remove_interactive().

00148 {
00149     if ( objectp(ob) && previous_object()
00150         && object_name(previous_object())[0..7] != "/secure/"
00151         && ((previous_object() != ob
00152              && (ob != this_player() || ob != this_interactive()))
00153             || (previous_object() == ob
00154                && (this_player() && this_player() != ob
00155                    || this_interactive() && this_interactive() != ob)) ) )
00156 
00157        log_file( "PLAYERDEST",
00158                 sprintf( "%s: %O ausgeloggt von PO %O, TI %O, TP %O\n",
00159                         dtime(time()), ob, previous_object(),
00160                         this_interactive(), this_player() ) );
00161 
00162     efun::remove_interactive(ob);
00163 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

varargs string replace_personal ( string  str,
mixed *  obs,
int  caps 
)

__EFUN_DEFINED__(copy_file)

Definiert in Zeile 1926 der Datei simul_efun.c.

Benutzt FEMALE, i, MALE, NEUTER, PLURAL, SINGULAR, WEM, WEN, WER und WESSEN.

01926                                                                   {
01927   int i;
01928   string *parts;
01929 
01930   parts = regexplode(str, "@WE[A-SU]*[0-9]");
01931   i = sizeof(parts);
01932 
01933   if (i>1) {
01934     int j, t;
01935     closure *name_cls;
01936 
01937     t = j = sizeof(obs);
01938 
01939     name_cls  =  allocate(j);
01940     while (j--)
01941       if (objectp(obs[j]))
01942         name_cls[j] = symbol_function("name", obs[j]);
01943       else if (stringp(obs[j]))
01944         name_cls[j] = obs[j];
01945 
01946     while ((i-= 2)>0) {
01947       int ob_nr;
01948       // zu ersetzendes Token in Fall und Objektindex aufspalten
01949       ob_nr = parts[i][<1]-'1';
01950       if (ob_nr<0 || ob_nr>=t) {
01951         set_this_object(previous_object());
01952         raise_error(sprintf("replace_personal: using wrong object index %d\n",
01953                     ob_nr));
01954         return implode(parts, "");
01955       }
01956 
01957       // casus kann man schon hier entscheiden
01958       int casus;
01959       string part = parts[i];
01960       switch (part[3]) {
01961         case 'R': casus = WER;    break;
01962         case 'S': casus = WESSEN; break;
01963         case 'M': casus = WEM;    break;
01964         case 'N': casus = WEN;    break;
01965         default:  continue; // passt schon jetzt nicht in das Hauptmuster
01966       }
01967 
01968       // und jetzt die einzelnen Keywords ohne fuehrendes "@WE", beendende Id
01969       mixed tmp;
01970       switch (part[3..<2]) {
01971         case "R": case "SSEN": case "M": case "N":               // Name
01972           parts[i] = funcall(name_cls[ob_nr], casus, 1);  break;
01973         case "RU": case "SSENU": case "MU": case "NU":           // unbestimmt
01974           parts[i] = funcall(name_cls[ob_nr], casus);     break;
01975         case "RQP": case "SSENQP": case "MQP": case "NQP":       // Pronoun
01976           if (objectp(tmp = obs[ob_nr]))
01977             parts[i] = (string)tmp->QueryPronoun(casus);
01978           break;
01979         case "RQA": case "SSENQA": case "MQA": case "NQA":       // Article
01980           if (objectp(tmp = obs[ob_nr]))
01981             tmp = (string)tmp->QueryArticle(casus, 1, 1);
01982           if (stringp(tmp) && !(tmp[<1]^' ')) 
01983             tmp = tmp[0..<2];                // Extra-Space wieder loeschen
01984           break;
01985         case "RQPPMS": case "SSENQPPMS": case "MQPPMS": case "NQPPMS":
01986           if (objectp(tmp = obs[ob_nr]))
01987             parts[i] = (string)tmp->QueryPossPronoun(MALE, casus, SINGULAR);
01988           break;
01989         case "RQPPFS": case "SSENQPPFS": case "MQPPFS": case "NQPPFS":
01990           if (objectp(tmp = obs[ob_nr]))
01991             parts[i] = (string)tmp->QueryPossPronoun(FEMALE, casus, SINGULAR);
01992           break;
01993         case "RQPPNS": case "SSENQPPNS": case "MQPPNS": case "NQPPNS":
01994           if (objectp(tmp = obs[ob_nr]))
01995             parts[i] = (string)tmp->QueryPossPronoun(NEUTER, casus, SINGULAR);
01996           break;
01997         case "RQPPMP": case "SSENQPPMP": case "MQPPMP": case "NQPPMP":
01998           if (objectp(tmp = obs[ob_nr]))
01999             parts[i] = (string)tmp->QueryPossPronoun(MALE, casus, PLURAL);
02000           break;
02001         case "RQPPFP": case "SSENQPPFP": case "MQPPFP": case "NQPPFP":
02002           if (objectp(tmp = obs[ob_nr]))
02003             parts[i] = (string)tmp->QueryPossPronoun(FEMALE, casus, PLURAL);
02004           break;
02005         case "RQPPNP": case "SSENQPPNP": case "MQPPNP": case "NQPPNP":
02006           if (objectp(tmp = obs[ob_nr]))
02007             parts[i] = (string)tmp->QueryPossPronoun(NEUTER, casus, PLURAL);
02008           break;
02009         default:
02010           continue;
02011       }
02012       
02013       // wenn tmp ein String war, weisen wir es hier pauschal zu
02014       if (stringp(tmp))
02015         parts[i] = tmp;
02016 
02017       // auf Wunsch wird nach Satzenden gross geschrieben
02018       if (caps)
02019         switch (parts[i-1][<2..]) {
02020           case ". ":  case "! ":  case "? ":
02021           case ".":   case "!":   case "?":
02022           case ".\n": case "!\n": case "?\n":
02023           case "\" ": case "\"\n":
02024             parts[i] = capitalize(parts[i]);
02025             break;
02026         }
02027     }
02028     return implode(parts, "");
02029   }
02030   return str;
02031 }

protected void reset ( void   ) 

Definiert in Zeile 1371 der Datei simul_efun.c.

Benutzt CleanLivingData() und set_next_reset().

01371                        {
01372   set_next_reset(7200);
01373   CleanLivingData();
01374 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

int restore_object ( string  name  ) 

Definiert in Zeile 870 der Datei simul_efun.c.

00871 {
00872   int result;
00873   mixed index;
00874   mixed save;
00875   mapping properties;
00876   int i;
00877   closure cl;
00878 
00879   // get actual property settings (by create())
00880   properties = (mapping)previous_object()->QueryProperties();
00881 
00882 //  DEBUG(sprintf("RESTORE %O\n",name));
00883   // restore object
00884   result=funcall(bind_lambda(#'efun::restore_object, previous_object()), name);
00885   //'))
00886   //_get_save_data liefert tatsaechlich mixed zurueck, wenn das auch immer ein 
00887   //mapping sein sollte.
00888   save = (mixed)previous_object()->_get_save_data();
00889   if(mappingp(save))
00890   {
00891     index = m_indices(save);
00892     for(i = sizeof(index)-1; i>=0; i--)
00893     {
00894       properties[index[i]] = save[index[i]];
00895       properties[index[i], F_MODE] = save[index[i], F_MODE]
00896                             &~(SETCACHED|QUERYCACHED);
00897     }
00898   }
00899   else properties = ([]);
00900 
00901   // restore properties
00902   (void)funcall(
00903               bind_lambda(
00904                          unbound_lambda(({'arg}), //'})
00905                                       ({#'call_other,({#'this_object}),
00906                                       "SetProperties",'arg})),//')
00907                          previous_object()),properties);
00908   previous_object()->_set_save_data(0);
00909   return result;
00910 }

mixed save_object ( mixed  name  ) 

Definiert in Zeile 820 der Datei simul_efun.c.

00821 {
00822   mapping properties;
00823   mapping save;
00824   mixed index, res;
00825   int i;
00826 
00827   // nur Strings und 0 zulassen
00828   if ((!stringp(name) || !strlen(name)) && 
00829       (!intp(name) || name!=0)) {
00830       set_this_object(previous_object());
00831       raise_error(sprintf(
00832          "Only non-empty strings and 0 may be used as filename in "
00833          "sefun::save_object()! Argument was %O\n",name));
00834   }
00835   save = m_allocate(0, 2);
00836   properties = (mapping)previous_object()->QueryProperties();
00837 
00838   if(mappingp(properties))
00839   {
00840     // delete all entries in mapping properties without SAVE flag!
00841     index = m_indices(properties);
00842     for(i = sizeof(index)-1; i>=0;i--)
00843     {
00844       if(properties[index[i], F_MODE] & SAVE)
00845       {
00846        save[index[i]] = properties[index[i]];
00847        save[index[i], F_MODE] =
00848        properties[index[i], F_MODE] &
00849                     (~(SETMNOTFOUND|QUERYMNOTFOUND|QUERYCACHED|SETCACHED));
00850       }
00851     }
00852   }
00853   else save = ([]);
00854 
00855   // save object!
00856   previous_object()->_set_save_data(save);
00857   // format: wie definiert in config.h
00858   if (stringp(name))
00859     res = funcall(bind_lambda(#'efun::save_object, previous_object()), name,
00860        __LIB__SAVE_FORMAT_VERSION__);
00861   else
00862     res = funcall(bind_lambda(#'efun::save_object, previous_object()),
00863        __LIB__SAVE_FORMAT_VERSION__);
00864   previous_object()->_set_save_data(0);
00865 
00866   return res;
00867 }

nomask string secure_euid (  ) 

Definiert in Zeile 1768 der Datei simul_efun.c.

01769 {
01770   string euid;
01771 
01772   if (!this_interactive()) // Es muss einen interactive geben
01773      return 0;
01774   euid=geteuid(this_interactive());
01775   // ueber alle Caller iterieren. Wenn eines davon eine andere euid hat als
01776   // der Interactive und diese nicht die ROOTID ist, wird 0 zurueckgeben.
01777   // Ebenso, falls ein Selbstzerstoerer irgendwo in der Kette ist.
01778   foreach(object caller: caller_stack()) {
01779       if (!objectp(caller) ||
01780        (geteuid(caller)!=euid && geteuid(caller)!=ROOTID))
01781          return 0;
01782   }
01783   return euid; // 'sichere' euid zurueckgeben
01784 }

nomask int secure_level (  ) 

Definiert in Zeile 1750 der Datei simul_efun.c.

01751 {
01752   int *level;
01753   //kette der Caller durchlaufen, den niedrigsten Level in der Kette
01754   //zurueckgeben. Zerstoerte Objekte (Selbstzerstoerer) fuehren zur Rueckgabe
01755   //von 0.
01756   //caller_stack(1) fuegt dem Rueckgabearray this_interactive() hinzu bzw. 0,
01757   //wenn es keinen Interactive gibt. Die 0 fuehrt dann wie bei zerstoerten
01758   //Objekten zur Rueckgabe von 0, was gewuenscht ist, da es hier einen
01759   //INteractive geben muss.
01760   level=map(caller_stack(1),function int (object caller)
01761       {if (objectp(caller))
01762        return(query_wiz_level(geteuid(caller)));
01763        return(0); // kein Objekt da, 0.
01764       } );
01765   return(min(level)); //den kleinsten Wert im Array zurueckgeben (ggf. 0)
01766 }

nomask int set_light ( int  i  ) 

Definiert in Zeile 1813 der Datei simul_efun.c.

Benutzt inv(), light(), ob(), P_INT_LIGHT und P_LIGHT.

01815          : das Lichtlevel innerhalb des Objekts
01816 {
01817     object ob, *inv;
01818     int lall, light, dark, tmp;
01819 
01820     if (!(ob=previous_object())) return 0; // ohne das gehts nicht.
01821 
01822     // aus kompatibilitaetsgruenden kann man auch den Lichtlevel noch setzen
01823     if (i!=0) ob->SetProp(P_LIGHT, ob->QueryProp(P_LIGHT)+i);
01824 
01825     // Lichtberechnung findet eigentlich in der Mudlib statt.
01826     return (int)ob->QueryProp(P_INT_LIGHT);
01827 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

void set_next_reset ( int  time  ) 

Definiert in Zeile 1421 der Datei simul_efun.c.

01422 {    }

int set_object_heart_beat ( object  ob,
int  flag 
)

Definiert in Zeile 913 der Datei simul_efun.c.

00914 {
00915   if (objectp(ob))
00916     return funcall(bind_lambda(#'efun::set_heart_beat,ob),flag);
00917 }

nomask void set_this_player ( object  pl  ) 

Definiert in Zeile 753 der Datei simul_efun.c.

00753                                        {
00754   raise_error("Available only for root\n");
00755 }

public object shadow ( object  ob,
int  flag 
)

Definiert in Zeile 1611 der Datei simul_efun.c.

01612 {
01613   object res = funcall(#'_shadow,ob, flag);
01614   if (flag)
01615     "/secure/shadowmaster"->RegisterShadow(previous_object());
01616   return res;
01617 }

varargs void shout ( string  s,
mixed  where 
)

Definiert in Zeile 1331 der Datei simul_efun.c.

01331                                            {
01332     object *u;
01333     string *pfade;
01334 
01335     if ( !sizeof( u = users() - ({ this_player(), 0 }) ) )
01336        return;
01337 
01338     if ( !where )
01339        pfade = ({ "/" });
01340     else if ( intp(where) )
01341        pfade =
01342            ({ implode( efun::explode( object_name( environment(this_player()) ),
01343                                    "/" )[0..2], "/" ) + "/" });
01344     else if ( stringp(where) )
01345        pfade = ({ where });
01346     else
01347        pfade = where;
01348 
01349     filter( filter( u, "_shout_filter", ME, implode( pfade, "|" ) ),
01350                 #'tell_object/*'*/, to_string(s) );
01351 }

nomask int shutdown ( string  reason  ) 

__EFUN_DEFINED__(strftime)

Definiert in Zeile 514 der Datei simul_efun.c.

Benutzt ARCH_SECURITY, ctime(), dtime(), log_file, name, output, ROOTID und shutdown().

00515 {
00516   string name;
00517   string obname;
00518   string output;
00519 
00520   if (!reason)
00521     return 0;
00522   if ( !ARCH_SECURITY && getuid(previous_object())!=ROOTID &&
00523           object_name(previous_object())!="/obj/shut" )
00524   {
00525     write("You have no permission to shut down the gamedriver!\n");
00526     return 0;
00527   }
00528   if ((this_interactive())&&(name=getuid(this_interactive())))
00529   {
00530     name=capitalize(name);
00531     filter(users(),#'tell_object,//'
00532                capitalize(name)+" faehrt das Spiel herunter!\n");
00533   }
00534   else
00535     name="ANONYMOUS";
00536   if (previous_object()) obname=capitalize(getuid(previous_object()));
00537   output=name;
00538   if (obname && name!=obname) output=output+" ("+obname+")";
00539   if (previous_object()&&object_name(previous_object())=="/obj/shut"){
00540     output+=" faehrt das Spiel via Armageddon herunter.\n";
00541     output=dtime(time())+": "+output;
00542     log_file("GAME_LOG",output+"\n",-1);
00543     efun::shutdown();
00544     return 1;
00545   }
00546   output=ctime(time())+": "+output+" faehrt das Spiel herunter.\n";
00547   output+="    Grund: "+reason;
00548   log_file("GAME_LOG",output+"\n",-1);
00549   efun::shutdown();
00550   return 1;
00551 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

varargs mixed* slice_array ( mixed  array,
int  from,
int  to 
)

Definiert in Zeile 2065 der Datei simul_efun.c.

Benutzt abs.

02065                                                           {
02066 
02067   if(!pointerp(array)) {
02068     set_this_object(previous_object());
02069     raise_error(sprintf("Bad argument 1 to slice_array(): %O",array));
02070   }
02071   if (intp(from) && intp(to)) {
02072     if (from>=0 && to>=0)
02073       return(array[from .. to]);
02074     else if (from>=0 && to<0)
02075       return(array[from .. <abs(to)]);
02076     else if (from<0 && to>=0)
02077       return(array[<abs(from) .. to]);
02078     else
02079       return(array[<abs(from) .. <abs(to)]);
02080   }
02081   else if (intp(from)) {
02082     if (from>=0)
02083       return(array[from .. ]);
02084     else
02085       return(array[<abs(from) .. ]);
02086   }
02087   else {
02088     return(array);
02089   }
02090 }

varargs mixed* slice_array ( mixed *  array,
int  from,
int  to 
)
nomask varargs int snoop ( object  me,
object  you 
)

Definiert in Zeile 231 der Datei simul_efun.c.

Benutzt ASNOOPLOGFILE, CHMASTER, dtime(), find_snooped(), IS_ARCH, IS_DEPUTY, Lcut(), log_file, NAME, P_SNOOPFLAGS, PO, query_snoop(), query_wiz_grp(), SF_LOCKED, snoop(), SNOOPLOGFILE, WEM, WEN und WER.

00232 {
00233     int ret;
00234     object snooper0, snooper, snooper2, snooper3;
00235 
00236     if( !objectp(me) || me == you || !PO )
00237        return 0;
00238 
00239     snooper0 = find_snooped(me);
00240 
00241      if(you){
00242         if ( PO != me && query_wiz_grp(me) >= query_wiz_grp(geteuid(PO)) )
00243             return 0;
00244 
00245         if ( query_wiz_grp(me) <= query_wiz_grp(you) &&
00246              !(you->QueryAllowSnoop(me)) )
00247             if ( !IS_DEPUTY(me) || IS_ARCH(you) )
00248                return 0;
00249 
00250         if ( (snooper = efun::query_snoop(you)) &&
00251              query_wiz_grp(snooper) >= query_wiz_grp(me) ){
00252             if ( (int)snooper->QueryProp(P_SNOOPFLAGS) & SF_LOCKED )
00253                return 0;
00254 
00255             tell_object( snooper, sprintf( "%s snooped jetzt %s.\n",
00256                                        me->name(WER), you->name(WER) ) );
00257 
00258             snooper2 = me;
00259 
00260             while ( snooper3 = query_snoop(snooper2) ){
00261                tell_object( snooper,
00262                            sprintf( "%s wird seinerseits von %s gesnooped.\n"
00263                                    ,snooper2->name(WER),
00264                                    snooper3->name(WEM) ) );
00265                snooper2 = snooper3;
00266             }
00267 
00268             efun::snoop( snooper, snooper2 );
00269 
00270             if ( efun::query_snoop(snooper2) != snooper )
00271                tell_object( snooper, sprintf( "Du kannst %s nicht snoopen.\n",
00272                                           snooper2->name(WEN) ) );
00273             else{
00274                tell_object( snooper, sprintf( "Du snoopst jetzt %s.\n",
00275                                           snooper2->name(WEN) ) );
00276                if ( !IS_DEPUTY(snooper) ){
00277                    log_file( SNOOPLOGFILE, sprintf("%s: %O %O %O\n",
00278                                                dtime(time()),
00279                                                snooper,
00280                                                snooper2,
00281                                                environment(snooper2) ),
00282                             100000 );
00283                    if (snooper0)
00284                       CHMASTER->send( "Snoop", snooper,
00285                                     sprintf( "%s *OFF* %s (%O)",
00286                                             capitalize(getuid(snooper)),
00287                                             capitalize(getuid(snooper0)),
00288                                             environment(snooper0) ) );
00289 
00290                    CHMASTER->send( "Snoop", snooper,
00291                                  sprintf("%s -> %s (%O)",
00292                                         capitalize(getuid(snooper)),
00293                                         capitalize(getuid(snooper2)),
00294                                         environment(snooper2)));
00295                }
00296                else{
00297                    log_file( ASNOOPLOGFILE, sprintf( "%s: %O %O %O\n",
00298                                                  dtime(time()),
00299                                                  snooper,
00300                                                  snooper2,
00301                                                  environment(snooper2) )
00302                             ,100000 );
00303                }
00304             }
00305         }
00306         else
00307             if (snooper)
00308                if ( !me->QueryProp(P_SNOOPFLAGS) & SF_LOCKED ){
00309                    printf( "%s wird bereits von %s gesnooped. Benutze das "
00310                           "\"f\"-Flag, wenn du dennoch snoopen willst.\n",
00311                           you->name(WER), snooper->name(WEM) );
00312                    return 0;
00313                }
00314 
00315         ret = efun::snoop( me, you );
00316 
00317         if ( !IS_DEPUTY(me) && efun::query_snoop(you) == me){
00318             log_file( SNOOPLOGFILE, sprintf( "%s: %O %O %O\n",
00319                                          Lcut(dtime(time())),
00320                                          me, you, environment(you) ),
00321                      100000 );
00322 
00323             if (snooper0)
00324                CHMASTER->send( "Snoop", me,
00325                              sprintf( "%s *OFF* %s (%O).",
00326                                      capitalize(getuid(me)),
00327                                      capitalize(getuid(snooper0)),
00328                                      environment(snooper0) ) );
00329 
00330             CHMASTER->send( "Snoop", me, sprintf( "%s -> %s (%O).",
00331                                              capitalize(getuid(me)),
00332                                              capitalize(getuid(you)),
00333                                              environment(you) ) );
00334         }
00335         else{
00336             if ( efun::query_snoop(you) == me ){
00337                log_file( ASNOOPLOGFILE, sprintf( "%s: %O %O %O\n",
00338                                              Lcut(dtime(time())),
00339                                              me, you, environment(you) ),
00340                         100000 );
00341             }
00342         }
00343 
00344         if ( ret && query_wiz_grp(me) <= query_wiz_grp(you) &&
00345              !IS_DEPUTY(me) )
00346             tell_object( you, "*** " + NAME(me) + " snoopt Dich!\n" );
00347 
00348         return ret;
00349      }
00350      else {
00351         if ( (me == PO ||
00352               query_wiz_grp(geteuid(PO)) > query_wiz_grp(me) ||
00353               (query_wiz_grp(geteuid(PO)) == query_wiz_grp(me) &&
00354               query_snoop(PO) == me)) && snooper0 ){
00355             if ( !IS_DEPUTY(me) ){
00356                log_file( SNOOPLOGFILE, sprintf( "%s: %O %O %O *OFF*\n",
00357                                             Lcut(dtime(time())), me,
00358                                             snooper0,
00359                                             environment(snooper0) ),
00360                         100000 );
00361 
00362                 CHMASTER->send( "Snoop", me,
00363                               sprintf( "%s *OFF* %s (%O).",
00364                                       capitalize(getuid(me)),
00365                                       capitalize(getuid(snooper0)),
00366                                       environment(snooper0) ) );
00367             }
00368             else{
00369                log_file( ASNOOPLOGFILE, sprintf( "%s: %O %O %O *OFF*\n",
00370                                              Lcut(dtime(time())), me,
00371                                              snooper0,
00372                                              environment(snooper0) ),
00373                         100000 );
00374             }
00375 
00376             return efun::snoop(me);
00377         }
00378      }
00379 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

void start_simul_efun (  ) 

Definiert in Zeile 1355 der Datei simul_efun.c.

Benutzt BACKBONE_WIZINFO_SIZE, info, InitLivingData() und set_next_reset().

01355                         {
01356   mixed *info;
01357 
01358   // Falls noch nicht getan, extra_wizinfo initialisieren
01359   if ( !pointerp(info = get_extra_wizinfo(0)) )
01360     set_extra_wizinfo(0, info = allocate(BACKBONE_WIZINFO_SIZE));
01361 
01362   InitLivingData(info);
01363 
01364   set_next_reset(10); // direkt mal aufraeumen
01365 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

void StopCallOut ( int  arg  ) 

Definiert in Zeile 1022 der Datei simul_efun.c.

01023 {
01024   if (arg && extern_call() && object_name(previous_object())!="/secure/master")
01025     return 0;
01026   if (arg && !CallOutStopped)
01027     write_file("/log/call_out_stop",sprintf("__CALLED %s (%d)\n__(CUT HERE)__\n",
01028                                        ctime(time()),arg));
01029   CallOutStopped=arg;
01030 }

private string stretch ( string  s,
int  width 
)

Definiert in Zeile 591 der Datei simul_efun.c.

Benutzt len und TRIM_LEFT.

00591                                             {
00592   int len=strlen(s);
00593   if (len==width) return s;
00594 
00595   // reine Leerzeilen, direkt zurueckgeben
00596   string trimmed=trim(s,TRIM_LEFT," ");
00597   if (trimmed=="") return s; 
00598   int start_spaces = len - strlen(trimmed);
00599 
00600   string* words = explode(trimmed, " ");
00601   // der letzte kriegt keine Spaces
00602   int word_count=sizeof(words) - 1;
00603   // wenn Zeile nur aus einem Wort, wird das Wort zurueckgegeben
00604   if (!word_count)
00605     return " "*start_spaces + words[0];
00606 
00607   int space_count = width - len;
00608 
00609   int space_per_word=(word_count+space_count) / word_count;
00610   // Anz.Woerter mit Zusatz-Space
00611   int rest=(word_count+space_count) % word_count; 
00612   // Rest-Spaces Verteilen
00613   foreach (int pos : rest) words[pos]+=" ";
00614   return (" "*start_spaces) + implode( words, " "*space_per_word );
00615 }

varargs string strftime ( mixed  fmt,
int  clock,
int  localized 
)

Definiert in Zeile 503 der Datei simul_efun.c.

Benutzt dtime().

00503                                                              {
00504   if (intp(clock) && clock >= 0)
00505     return dtime(clock);
00506   else if (intp(fmt) && fmt >= 0)
00507     return dtime(fmt);
00508   
00509   return dtime(time());
00510 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

nomask void swap ( object  obj  ) 

Definiert in Zeile 1521 der Datei simul_efun.c.

01522 {
01523   write("Your are not allowed to swap objects by hand!\n");
01524   return;
01525 }

string time2string ( string  format,
int  time 
)

Definiert in Zeile 1630 der Datei simul_efun.c.

Benutzt i.

01631 {
01632   int days,hours,mins,secs,i,ch,max,abbr,dummy;
01633   string *parts, fmt;
01634 
01635   secs = time;
01636   mins = (time/60);
01637   hours = (time/3600);
01638   days = (time/86400);
01639   abbr = 0;
01640 
01641   parts = regexplode( format, "\(%\(-|\)[0-9]*[dhmsxDHMSX]\)|\(%%\)" );
01642 
01643   max = 0;
01644   for( i=1; i<sizeof(parts); i+=2 )
01645   {
01646     ch = parts[i][<1];
01647     switch( parts[i][<1] )
01648     {
01649     case 'x': case 'X':
01650        abbr = sscanf( parts[i], "%%%d", dummy ) && dummy==0;
01651        // NO break !
01652     case 'd': case 'D':
01653        max |= 7;
01654        break;
01655     case 'h': case 'H':
01656        max |= 3;
01657        break;
01658     case 'm': case 'M':
01659        max |= 1;
01660        break;
01661     }
01662   }
01663   if( max & 4 ) hours %= 24;
01664   if( max & 2 ) mins %= 60;
01665   if( max ) secs %= 60;
01666 
01667   for( i=1; i<sizeof(parts); i+=2 )
01668   {
01669     fmt = parts[i][0..<2];
01670     ch = parts[i][<1];
01671     if( ch=='x' )
01672     {
01673       if( days>0 ) ch='d';
01674       else if( hours>0 ) ch='h'; else ch = (mins>0) ? 'm' : 's';
01675     } else if( ch=='X' )
01676     {
01677       if( days>0 ) ch='D';
01678       else if( hours>0 ) ch='H'; else ch = (mins>0) ? 'M' : 'S';
01679     }
01680     switch( ch )
01681     {
01682       case 'd': parts[i] = sprintf( fmt+"d", days ); break;
01683       case 'h': parts[i] = sprintf( fmt+"d", hours ); break;
01684       case 'm': parts[i] = sprintf( fmt+"d", mins ); break;
01685       case 's': parts[i] = sprintf( fmt+"d", secs ); break;
01686       case 'D':
01687        if(abbr) parts[i] = "d"; else
01688        parts[i] = sprintf( fmt+"s", (days==1) ? "Tag" : "Tage" );
01689        break;
01690       case 'H':
01691        if(abbr) parts[i] = "h"; else
01692        parts[i] = sprintf( fmt+"s", (hours==1) ? "Stunde" : "Stunden" );
01693        break;
01694       case 'M':
01695        if(abbr) parts[i] = "m"; else
01696        parts[i] = sprintf( fmt+"s", (mins==1) ? "Minute" : "Minuten" );
01697        break;
01698       case 'S':
01699        if(abbr) parts[i] = "s"; else
01700        parts[i] = sprintf( fmt+"s", (secs==1) ? "Sekunde" : "Sekunden" );
01701        break;
01702       case '%':
01703        parts[i] = "%";
01704        break;
01705       }
01706     }
01707     return implode( parts, "" );
01708 }

public void unshadow (  ) 

Definiert in Zeile 1624 der Datei simul_efun.c.

01624                        {
01625   funcall(#'_unshadow);
01626   "/secure/shadowmaster"->UnregisterShadow(previous_object());
01627 }

public void update_actions (  ) 

Definiert in Zeile 758 der Datei simul_efun.c.

00759 {
00760   int objs;
00761 
00762   if (environment(previous_object()))
00763     previous_object()->move(environment(previous_object()),1);
00764   filter(all_inventory(previous_object()),"move_inv",previous_object());
00765 }

string upperstring ( string  s  ) 

Definiert in Zeile 562 der Datei simul_efun.c.

Benutzt i.

00563 {
00564 #if __EFUN_DEFINED__(upper_case)
00565   return(upper_case(s));
00566 #else
00567   int i;
00568   if (!stringp(s)) return 0;
00569   for (i=strlen(s)-1;i>=0;i--) s[i]=((s[i]<'a'||s[i]>'z')?s[i]:s[i]-32);
00570   return s;
00571 #endif
00572 }

string uptime (  ) 

Definiert in Zeile 723 der Datei simul_efun.c.

00724 {
00725   int t;
00726   int tmp;
00727   string s;
00728 
00729   t=time()-__BOOT_TIME__;
00730   s="";
00731   if (t>=86400)
00732     s+=sprintf("%d Tag%s, ",tmp=t/86400,(tmp==1?"":"e"));
00733   if (t>=3600)
00734     s+=sprintf("%d Stunde%s, ",tmp=(t=t%86400)/3600,(tmp==1?"":"n"));
00735   if (t>60)
00736     s+=sprintf("%d Minute%s und ",tmp=(t=t%3600)/60,(tmp==1?"":"n"));
00737   return s+sprintf("%d Sekunde%s",t=t%60,(t==1?"":"n"));
00738 }

string version (  ) 

Definiert in Zeile 584 der Datei simul_efun.c.

00585 {
00586   return __VERSION__;
00587 }

varargs void wizlist ( string  name,
int  sortkey 
)

Definiert in Zeile 945 der Datei simul_efun.c.

00945                                                 {
00946   int i, pos, total_cmd;
00947   int *cmds;
00948   mixed *a;
00949   mixed *b;
00950 
00951   if (!name) {
00952     if (this_player())
00953                      name = getuid(this_player());
00954     if (!name)
00955       return;
00956   }
00957 
00958   // Schluessel darf nur in einem gueltigen Bereich sein
00959   if (sortkey<=WL_NAME||sortkey>WL_EXTRA) sortkey=WL_COMMANDS;
00960 
00961   a = transpose_array(wizlist_info());
00962 
00963   // Sortieren der Liste nach dem sortierschluessel
00964   if (sortkey==0)
00965   {
00966     a = order_alist(a);
00967   } else {
00968     cmds = a[sortkey];
00969     a[sortkey] = a[0];
00970     a[0] = cmds;
00971     a = order_alist(a);
00972     cmds = a[0];
00973     a[0] = a[sortkey];
00974     a[sortkey] = cmds;
00975   }
00976 
00977   // cmds wurde missbraucht - wieder zuruecksetzen
00978   cmds = a[WL_COMMANDS];
00979 
00980   if ((pos = member(a[WL_NAME], name)) < 0 && name != "ALL")
00981     return;
00982   b = allocate(sizeof(cmds));
00983   for (i = sizeof(cmds); i;) {
00984     b[<i] = i;
00985     total_cmd += cmds[--i];
00986   }
00987   a = transpose_array(a + ({b}) );
00988   if (name != "ALL") {
00989     if (pos + 18 < sizeof(cmds)) {
00990       a = a[pos-2..pos+2]+a[<15..];
00991     } else if (pos < sizeof(cmds) - 13) {
00992       a = a[pos-2..];
00993     } else {
00994       a = a[<15..];
00995     }
00996   }
00997   write("\nWizard top score list\n\n");
00998   if (total_cmd == 0)
00999     total_cmd = 1;
01000   for (i = sizeof(a); i; ) {
01001     b = a[<i--];
01002     printf("%-20s %6d %2d%% %6s [%6dk,%6d] %6d %d\n",
01003           b[WL_NAME], b[WL_COMMANDS], b[WL_COMMANDS] * 100 / total_cmd,
01004      "("+(string)b[<1]+")", b[WL_TOTAL_COST] / 1000,
01005           b[WL_HEART_BEATS], b[WL_EXTRA], b[WL_ARRAY_TOTAL]
01006           );
01007   }
01008   printf("\nTotal         %7d         (%d)\n\n", total_cmd, sizeof(cmds));
01009 }

mixed* wizlist_info (  ) 

Definiert in Zeile 937 der Datei simul_efun.c.

00938 {
00939   if (ARCH_SECURITY || !extern_call())
00940             return efun::wizlist_info();
00941   return 0;
00942 }


Variablen-Dokumentation

int CallOutCount [static]

Definiert in Zeile 1018 der Datei simul_efun.c.

int CallOutStopped = 0 [static]

Definiert in Zeile 1017 der Datei simul_efun.c.

string count_table
Initialisierung:
    "0112122312232334122323342334344512232334233434452334344534454556"

Definiert in Zeile 2110 der Datei simul_efun.c.

int CountMessages = 0 [static]

Definiert in Zeile 1019 der Datei simul_efun.c.

mixed dtime_cache = ({-1,""})

Definiert in Zeile 97 der Datei simul_efun.c.

string LastMessage [static]

Definiert in Zeile 1020 der Datei simul_efun.c.

Definiert in Zeile 773 der Datei simul_efun.c.

Erzeugt am Thu Jun 3 14:41:58 2010 für MorgenGrauen Mudlib von  doxygen 1.6.3