MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 1 | SYNOPSIS |
Zesstra | d59c389 | 2019-11-28 20:53:39 +0100 | [diff] [blame^] | 2 | object previous_object() |
| 3 | object previous_object(int i) |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 4 | |
| 5 | BESCHREIBUNG |
| 6 | Liefert einen Pointer auf das letzte Objekt, das einen Aufruf (mittels |
| 7 | call_other(), funcall() etc.) auf das aktuelle Objekt this_object() |
| 8 | gemacht hat. Wenn dieses aufrufende Objekt inzwischen zerstoert wurde, |
| 9 | liefert previous_object() 0. |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 10 | |
| 11 | Wird das Argument <i> angegeben, so verfolgt previous_object() den |
| 12 | Aufruf <i> Stufen zurueck. Zum Beispiel liefert previous_object(1) das |
| 13 | aufrufende Objekt des aufrufenden Objekts. Fuer <i> muss gelten: |
| 14 | 0 <= i < call_stack_depth(). Ein Wert <i> < 0 liefert das erste |
| 15 | aufrufende Object zurueck. |
| 16 | |
| 17 | Es gibt einen wichtigen Spezialfall: in Funktionen, die vom Gamedriver |
| 18 | auf Grund eines externen Ereignises aufgerufen wurden (zum Beispiel |
Zesstra | d59c389 | 2019-11-28 20:53:39 +0100 | [diff] [blame^] | 19 | Kommandos, die mit add_action() definiert wurden), liefert |
| 20 | previous_object() den Wert von this_object(), previous_object(0) |
| 21 | hingegen 0. |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 22 | |
Zesstra | d59c389 | 2019-11-28 20:53:39 +0100 | [diff] [blame^] | 23 | BEISPIELE |
| 24 | int sicherheitscheck() { |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 25 | object prev; |
Zesstra | d59c389 | 2019-11-28 20:53:39 +0100 | [diff] [blame^] | 26 | if (!(prev=previous_object())); |
| 27 | else if (getuid(prev) != getuid(this_object())); |
| 28 | else if (geteuid(prev) != geteuid(this_object())); |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 29 | else return 1; |
| 30 | return 0; |
| 31 | } |
Zesstra | d59c389 | 2019-11-28 20:53:39 +0100 | [diff] [blame^] | 32 | void sensible_funktion() { |
| 33 | if (!sicherheitscheck()) |
| 34 | return; |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 35 | ... |
| 36 | } |
| 37 | |
| 38 | Diese Funktion zeigt, wie man ueberpruefen kann, ob der letzte Aufruf |
| 39 | einer Funktion im aktuellen Objekt sicher war, oder ob die |
| 40 | Verarbeitung abgebrochen werden sollte. |
| 41 | |
| 42 | FEHLER |
| 43 | Werte von <i> < 0 werden wie <i> == 0 behandelt - dies ist historisch. |
| 44 | |
| 45 | SIEHE AUCH |
Zesstra | d59c389 | 2019-11-28 20:53:39 +0100 | [diff] [blame^] | 46 | call_other(E), this_object(E), this_player(E), caller_stack(E), |
| 47 | caller_stack_depth(E), extern_call(E) |