============================== Shutdown 2.0 ===============================
===========================================================================
Ein  Paket, das das Neustarten und Ausschalten des Rechners sicherer macht.
© Copyright 1992 by Olaf Barthel, alle Rechte vorbehalten.
   Es   wird   keinerlei   Gewährleistungspflicht   für   die  vollständige
Funktionsfähigkeit   der   in   diesem   Dokument   beschriebenen  Software
übernommen.  Jegliche Nutzung geschieht auf eigene Gefahr.

================================ WICHTIG! =================================
===========================================================================
Aufgrund   notwendiger  Veränderungen  ist  die  neue  Bibliothek  und  die
beiliegende      Unterstützungssoftware      inkompatibel     mit     alten
`Shutdown'-Versionen.    Vor   der   Neuinstallation   bitte   alle   alten
`Shutdown'-Bestandteile aus dem System enfernen!

=============================== Motivation ================================
===========================================================================
Eine  der  wohl nützlichsten Funktionen im `Finder' des Apple Macintosh ist
der  Menüpunkt  `Ausschalten',  mit  dem  das Betriebssystem dazu veranlaßt
wird,  alle  noch  ausstehenden  Datenpuffer  zurückzuschreiben,  Disketten
auszuwerfen  und  auf  den  teureren  Macintosh  II-Modellen sogar wirklich
Rechner und Monitor ausschaltet.  Auf diese Weise sinkt die Chance, daß der
Benutzer   durch  Tolpatschigkeit  den  Disketten-  oder  Festplatteninhalt
zerstört,   weil   der  Rechner  noch  während  Dateien  bearbeitet  wurden
ausgeschaltet  wurde  (daß  man sich trotzdem auf dem Macintosh ohne großen
Aufwand  und  mit Bravour den Festplatteninhalt zertrümmern kann, steht auf
einem anderen Blatt).
   Das  beiliegende  Programmpaket,  bestehend  aus  einer Bibliothek, zwei
Programmen und einem ARexx-Skript, ermöglicht es dem Anwender, in ähnlicher
Manier  auf  eine  relativ  sichere  Weise den Rechner neu zu starten, bzw.
auszuschalten.

==================== Bestandteile des Shutdown-Paketes ====================
===========================================================================
             Die folgenden Dateien gehören zum Shutdown-Paket:

Shutdown.dok...................	Die Dokumentation

shutdown.library............... Die     alle     Funktionen    beinhaltende
                                Bibliothek.
shutdown_lib.fd................	Funktionsdefinitionen der Bibliothek.
shutdownbase.h.................	Header-Datei für `C' Programmierer

ShutdownSetup.................. Das Programm, das die Bibliothek öffnet und
                                die notwendigen Initialisierungen vornimmt,
                                um  das Öffnen und Schließen von Dateien zu
                                überwachen.
Shutdown....................... Ein  Beispielprogramm, das die Funktion der
                                Bibliothek demonstriert.
Shutdown.c..................... Der  in  `C'  geschriebene  Quellcode   des
                                Programmes.
Shutdown.rexx.................. Ein     ARexx-Beispielskript,    das    die
                                Ansteuerung  der  Bibliothek  von ARexx aus
                                demonstriert.

================= Installation und Arbeitsvoraussetzungen =================
===========================================================================
Das Shutdown-Paket benötigt zum korrekten Funktionieren Kickstart 2.04 oder
eine Nachfolgeversion.  Läuft das Programmsystem auf einem Rechner, der die
Verwendung  von  sogenannten  `Keyboard-Resethandlern' unterstützt, so wird
versucht, daraus Vorteil zu ziehen.

    Um das Paket zu installieren, sind folgende Schritte durchzuführen:

1. Die  Datei `shutdown.library' muß ins Verzeichnis `Libs:' kopiert werden
   (aus der Shell heraus:  `Copy shutdown.library Libs:').

2. Die  Datei `ShutdownSetup'  muß ins Verzeichnis `C:' kopiert werden (aus
   der Shell heraus: `Copy ShutdownSetup C:').

3. Gleich  an  den  Anfang  der  Datei  `S:Startup-Sequence' muß der Befehl
   `ShutdownSetup'   gestellt   werden   (aus   der   Shell   heraus:   `Ed
   S:Startup-Sequence', in  die  erste Zeile `ShutdownSetup' tippen und die
   Datei wieder abspeichern).

                Hiermit ist die Installation abgeschlossen.

============================= Funktionsweise ==============================
===========================================================================
Wird das Programmsystem mit dem Aufruf `ShutdownSetup' aktiviert, so werden
alle  nachfolgend  durchgeführten  Dateizugriffe  vermerkt und insbesondere
darauf  geachtet,  ob  schreibend  auf Dateien zugegriffen wurde (zu diesem
Zweck  wird  eine  Handvoll  Systemfunktionen umgelenkt, falls also diverse
Virenerkennungsfunktionen  zu  meckern  beginnen,  sollte  man  sich  nicht
wundern).
   Zusätzlich  haben  Anwenderprogramme  die Möglichkeit, sich als Klienten
eintragen  zu  lassen,  um  dem  Anwender  vor dem Ausschalten des Rechners
mitzuteilen, daß sie noch arbeiten und der Rechner noch nicht ausgeschaltet
werden sollte.

   Wird  dem  Programmsystem  mitgeteilt,  daß der Anwender den Rechner neu
starten   oder   ausschalten   möchte,   so  werden  zunächst  einmal  alle
Dateizugriffe  blockiert.   Danach  werden  alle als Klienten registrierten
Anwenderprogramme  befragt, ob sie ihre Arbeit beendet haben.  Anschließend
wird  nachgeprüft,  ob  noch  Dateien  geöffnet  sind,  auf  die schreibend
zugegriffen wurde.

   Wurden  Klienten  gefunden, die ihre Arbeit noch nicht beendet haben, so
wird  der Anwender auf die Namen der Programme aufmerksam gemacht, die noch
aktiv  sind.  Wurden noch geöffnete Dateien ermittelt, so werden ihre Namen
in einer Liste angezeigt.

   Stehen dem Neustart bzw.  Ausschalten des Rechners keinerlei Hindernisse
im  Wege,  so  wird  dem  Anwender  signalisiert,  daß er den Rechner jetzt
ausschalten  könnte.  Wird im Augenblick des Aufrufs noch auf eine Diskette
oder Festplatte zugegriffen, so wird solange gewartet, bis die noch aktiven
Laufwerke zur Ruhe gekommen sind.

   Zusätzlich  besteht über zwei Knöpfe die Möglichkeit, den Rechner neu zu
starten und sofort zur Workbench zurückzukehren, als sei nichts passiert.

                                WARNUNG!!!

   Das  Programmsystem  ist nicht 100%-ig dazu in der Lage, Schreibzugriffe
auf  Festplatte  und  Diskette zu ermitteln und zu sperren.  Sollte nachdem
der   Ausschalt-Bildschirm   geöffnet   wurde,   noch   Festplatten-   oder
Diskettenaktivität zu beobachten sein, sollte man lieber noch etwas warten,
bis  der  Rechner  vollständig  zur  Ruhe  gekommen ist!  WER DURCH BLINDES
VERTRAUEN IN DIE FÄHIGKEITEN DIESES PROGRAMMPAKETES DATEN ZERSTÖRT, DER IST
SELBER SCHULD -- MAN BENUTZE BITTE SEINEN GESUNDEN MENSCHENVERSTAND, DIESES
PROGRAMMSYSTEM  GIBT NUR RATSCHLÄGE UND ÄUßERT VERMUTUNGEN, GIBT ABER KEINE
100%-IGE SICHERHEIT!

============================== ShutdownSetup ==============================
===========================================================================
Dieses  Programm dient zum Initialisieren und Entfernen der Dateiverfolgung
und  Geräteüberwachung,  die  das  Herzstück  des `Shutdown'-Programmpakets
bilden.    Zusätzlich   wird   über  das  Commodities-Toolkit  ein  Routine
installiert,  die  beim  Drücken  einer  bestimmten  Tastenkombination  den
Rechner  neu  startet,  gerade so, als hätte man die Tasten Control + Amiga
links  +  Amiga  rechts  gedrückt.   `ShutdownSetup' kann nur von der Shell
gestartet werden und unterstützt drei Aufrufparameter:

   CX_POPKEY........... Die Tastenkombination, die gedrückt werden muß,  um
                        den Rechner neu zu starten. Standardmäßig ist  hier
                        `lamiga ramiga tab' vorgegeben.

   CX_PRIORITY......... Die Priorität,  unter  der  die  Tastenabfrage  ins
                        System eingebunden werden soll.

   NoCX................ Wird  dieser  Parameter  angegeben,  so  wird   die
                        Tastenkombination  zum   neustarten   des  Rechners
                        nicht aktiviert.

Es  ist  in  jedem Fall vorzuziehen, den Amiga über die von `ShutdownSetup'
zur  Verfügung  gestellte  Tastenkombination  anstatt  über Control + Amiga
links   +   Amiga  rechts  neu  zu  starten,  da  die  von  `ShutdownSetup'
installierte  Routine  mehr Zeit zur Überwachung und zum sicheren Schließen
von  Dateien zur Verfügung hat, als die Neustartroutine des Betriebssystems
hat.

   Ein  zweiter Aufruf von `ShutdownSetup' entfernt die Dateiverfolgung und
Geräteüberwachung.   Die  Routine,  die auf den Druck der Tastenkombination
zum  neustarten  des  Rechners wartet, läßt sich sowohl über die Shell (per
`Break  <Prozessnummer>', <Prozessnummer> ist die Zahl, die neben dem Namen
`« Neustart »' ausgegeben wird, wenn der `Status' Befehl benutzt wird), als
auch mit Hilfe des Programmes `Exchange' beenden.

======================= Programmiererdokumentation ========================
===========================================================================
Herzstück des Programmsystems ist die shutdown.library, die drei Funktionen
enthält, die im folgenden beschrieben werden.

                                     *

Erfolg = Shutdown(Modus)
  D0                D0

   Diese  Funktion  öffnet  den Ausschaltbildschirm, fragt die Klienten ab,
zeigt  das  Ergebnis  an  und führt den Neustart durch.  Wurde vom Anwender
kein  Neustart  durchgeführt,  so  liefert  die  Funktion einen Erfolgswert
zurück:

   FALSE - Das Öffnen des Ausschaltbildschirms ist fehlgeschlagen.
   TRUE  - Der   Ausschaltbildschirm   wurde  korrekt  geöffnet,  aber  der
           Anwender  hat  sich  dazu entschlossen, den Rechner nicht neu zu
           starten.

   In  Version  2.0  wurde  für die Shutdown()-Funktion ein Aufrufparameter
eingeführt:

   Modus - Ein  Wert, der angibt, ob das System sofort neu gestartet werden
           soll,  oder  ob der Anwender noch eine Chance erhalten soll, zur
           Workbench zurückzukehren, oder den Rechner auszuschalten:

           - SHUTDOWN_NORMAL

             Normales Verhalten, der  Benutzer  wird  auf  noch  arbeitende
             Programme und offene Dateien aufmerksam gemacht und erhält die
             Möglichkeit, anstatt den Rechner neu zu  starten,  wieder  zur
             Workbench zurückzukehren.

           - SHUTDOWN_FAST

             Der Rechner wird nachdem alle offenen Dateien `geflusht' und
             alle Laufwerke zur Ruhe  gekommen  sind,  ohne  Einfluß  des
             Anwenders neu  gestartet.  Diese  Funktionsaufruf  wird  vom
             Programm   `ShutdownSetup'   genutzt,  dessen   Commodities-
             Interface auf Tastendruck den Rechner neu startet.

                                     *

Info = AddShutdownInfo(Test,Ende,Name,Flags)
 D0                     A0   A1   A2   D0

   Diese  Funktion  erzeugt und vermerkt eine Struktur, in der maximal zwei
Funktionen  eingetragen werden, die vor dem Öffnen des Ausschaltbildschirms
und vor der Durchführung des Neustarts aufgerufen werden.

Info -  Im Erfolgsfall Zeiger auf eine Struktur vom Typ ShutdownInfo (siehe
        Datei `shutdownbase.h'), andernfalls Null.
           Der  Speicherinhalt  der  zurückgelieferten  Struktur  darf  mit
        Ausnahme   des   sn_UserData-Eintrages,  den  das  sich  anmeldende
        Programm  für  seine  eigenen  Zwecke  nutzen darf, nicht verändert
        werden!

Test -  Adresse   der  Routine,  die  aufgerufen  werden  soll,  bevor  der
        Ausschaltbildschirm  geöffnet wird.  Liefert diese Routine den Wert
        FALSE,  so  wird  davon  ausgegangen,  daß  das Programm, das diese
        Routine  enthält, seine Arbeit noch nicht beendet hat.  Die Routine
        wird mit folgenden Parametern aufgerufen:

        Ergebnis = Test(Info,Flags)
           D0            A0   D0

        Info -  Dieselbe    Adresse,    die    schon    beim   Aufruf   der
                AddShutdownInfo() Funktion zurückgeliefert wurde.

        Flags - Gegenwärtig noch Null.

Ende -  Adresse  der Routine, die aufgerufen werden soll, bevor der Rechner
        neu   gestartet  werden  soll.   Die  Routine  wird  mit  folgenden
        Parametern aufgerufen:

        Ende(Info,Flags)
              A0   D0

        Info -  Dieselbe    Adresse,    die    schon    beim   Aufruf   der
                AddShutdownInfo() Funktion zurückgeliefert wurde.

        Flags - Der  hier  übergebene  Wert  gibt  Auskunft  darüber, unter
                welchen  Umständen  die  Routine aufgerufen wurde.  Ist das
                Bit  SNB_RESET  gesetzt,  so  wurde die Routine aufgerufen,
                nachdem  die berühmte Dreitastenkombination gedrückt wurde,
                um  den  Rechner  neu  zu  starten.  In diesem Fall hat die
                aufgerufene Routine nicht sehr viel Zeit, um ihre Arbeit zu
                verrichten  und  zurückzukehren,  da  der Tastaturprozessor
                innerhalb von maximal zehn Sekunden selbsttätig den Rechner
                neu startet -- egal ob die Routine bereits fertig ist, oder
                nicht!

Name -  Der  Name, unter dem das sich anmeldende Programme in der Liste der
        noch aktiven Programme aufgeführt werden soll.

Flags - Gegenwärtig solle hier der Wert Null übergeben werden.

                                     *

Erfolg = RemShutdownInfo(Info)
  D0                      A0

   Diese  Funktion  entfernt  eine  mit  der  Funktion  `AddShutdownInfo()'
erzeugte  Struktur  aus  der  Liste  der  vor  dem  Neustarten des Rechners
abzufragenden Programme.

Erfolg - Erfolgswert, der  angibt,  ob die Struktur korrekt entfernt werden
         konnte.

============== Verwendung der shutdown.library von ARexx aus ==============
===========================================================================
Die  Bibliothek  stellt  eine  einzige Funktion zur Verfügung, die nach dem
Einbinden der Bibliothek folgendermaßen anzusprechen ist:

                           Ergebnis = shutdown(Parameter)

Diese  Funktion  verhält  sich  exakt  so  wie  auch die schon beschriebene
Shutdown()-Funktion  der  Bibliothek.   Konnte  die  Funktion nicht korrekt
ausgeführt  werden,  so  kehrt sie mit Fehlerwert 10 (= Fehlschlag) zurück.
   Es   ist   außerdem   möglich,   daß   sie  als  Ergebniswert  `aborted'
zurückliefert, wenn der Anwender den Rechner nicht neu starten wollte.  Als
Anwendungsbeispiel  ist  dem  Programmpaket  die  Datei `ShutdownTest.rexx'
beigefügt.
   Als  Parameter  kann der Wert `immediately' übergeben werden.  In diesem
Fall  wird  der Rechner ohne Einflußmöglichkeit des Anwenders neu gestartet
(ähnlich  als  hätte man die Libraryfunktion `Shutdown()' mit dem Parameter
`SHUTDOWN_FAST' aufgerufen).

====================== Anschrift & Bitte des Autors =======================
===========================================================================
Die  Veröffentlichung  dieses  Paketes ist zunächst einmal nur ein Test, ob
Anwender mit  einer `Ausschaltfunktion' überhaupt etwas anfangen können und
ob Programmierer sie unterstützen wollen.  Außerdem möchte ich erfahren, ob
noch Verbesserungen am Leistungsumfang des Paketes notwendig sind.  Bis zur
internationalen    Veröffentlichung    ist   jedermann   freigestellt   das
Programmpaket zu nutzen, soweit es nicht kommerziellen Zwecken dient.  Wenn
jemand  am Verkauf oder der Vermarktung meiner Produkte Geld verdient, dann
bin ich das, und niemand anders!

   Fehlermeldungen und Vorschläge sind an folgende Adressen zu richten:

                              Postanschrift:

                               Olaf Barthel
                             Brabeckstraße 35
                            D-3000 Hannover 71

                        Elektronische Postdienste:

                        Z-Netz: O.BARTHEL@A-Link-H
                        Usenet: o.barthel@a-link-h.comlink.de
                                cbmvax.commodore.com!cbmehq!sourcery!olsen

========================= Entwicklungsgeschichte ==========================
===========================================================================
V2.0    Kleinere interne Veränderungen, `ShutdownSetup' erweitert.

V1.8    Auch Lese- und Schreibzugriffe auf Device-Ebene werden jetzt erfaßt
        und verfolgt.

V1.7    Internationalisierung des Systems, Dateiverfolgung verbessert.

V1.2    Kleinere Veränderungen in der Umlenkung von Systemroutinen.

V1.1    Erste Verbreitung im deutschsprachigen Raum.
