access_rights()

FUNKTION:
    int access_rights(string euid, string file);

DEFINIERT IN:
    access_rights.c (muss man selber schreiben)

PARAMETER:
    euid
        Die euid desjenigen, der auf das Verzeichnis schreiben will
    file
        Name der Datei, auf die zugegriffen werden soll

BESCHREIBUNG:
    access_rights() wird immer dann aufgerufen, wenn jemand, der nicht
    sowieso schon schreibberechtigt ist, in die Datei/das Verzeichnis file
    schreiben oder loeschen will.

    Anhand von euid kann man dann entscheiden, ob der Schreibzugriff erlaubt
    wird oder nicht.

RUECKGABEWERT:
    0, wenn der Zugriff verweigert wird,
    1, wenn der Zugriff erlaubt wird.

BEISPIELE:
    /* /d/inseln/wargon/access_rights.c */

    int access_rights(string euid, string file)
    {
      string dir, rest;

      // Catweazle darf auf alles zugreifen (*argl* ;^)
      if (euid == "catweazle")
        return 1;

      // Rechte auf einzelne Verzeichnisse ermitteln:
      if (sscanf(file, "%s/%s", dir, rest) != 2)
        rest = file;

      // Jof und Boing duerfen an Tarko Reub rumpfuschen:
      if (dir == "tarko" && (euid == "jof" || euid == "boing"))
        return 1;

      // Anthea darf die Karten von Aurora und der Piratenhoehle bearbeiten:
      if (dir == "MAPS" && 
          member( ({"Aurora", "Piratenhoehle" }), rest) >= 0 && 
          euid == "anthea")
        return 1;

      // alle anderen duerfen nicht!
      return 0;
    }

BEMERKUNGEN:
    file ist immer relativ zu dem Verzeichnis, in dem das access_rights.c
    liegt! Will also jemand auf /d/inseln/wargon/tarko/macros.h schreiben,
    wird file "tarko/macros.h" uebergeben.

    In Verzeichnissen von Magiern mit einem Level >= ELDER_LVL wird das
    access_rights.c NICHT ausgewertet (da damit andere Magier zB. an
    Erzmagierrechte gelangen koennten).

    Es wird immer nur EIN access_rights.c ausgewertet, naemlich das in der
    tiefsten Verzeichnisebene.

    Man kann sowohl in seinen Regionsverzeichnissen als auch in seinen
    Homeverzeichnissen access_rights.c-Dateien anlegen.

    GANZ WICHTIG!!!
    Fuer die Dateien, die evtl. von anderen angelegt werden, ist man immer
    noch selbst verantwortlich! Wenn jemand also ein Gebiet bei Dir an-
    schliesst, muss es erst von den verantwortlichen Regionsmagiern abgesegnet
    sein!
