Added public files
Roughly added all public files. Probably missed some, though.
diff --git a/p/daemon/uptime_master.c b/p/daemon/uptime_master.c
new file mode 100644
index 0000000..84a7124
--- /dev/null
+++ b/p/daemon/uptime_master.c
@@ -0,0 +1,110 @@
+#pragma strong_types, save_types
+#pragma no_clone, no_shadow
+
+#include "/p/daemon/ch.h"
+#include "/p/daemon/uptime_master.h"
+
+/// Prototypen ///
+
+void create();
+void reset();
+
+void SaveMaxUptime();
+mapping QuerMaxUptime();
+
+/// Globale Variablen ///
+static int next_save_uptime;
+static int max_uptime_reached;
+static int last_record_boot;
+
+/// Funktionen ///
+
+void create()
+{
+ seteuid(getuid(this_object()));
+ reset();
+}
+
+void reset()
+{
+ call_out("SaveMaxUptime",1);
+ set_next_reset(300);
+}
+
+// Ist eine Rekord-Uptime erreicht, wird diese hier gespeichert.
+void SaveMaxUptime()
+{
+ int max_shut, max_boot;
+
+ // Lohnt es, schon wieder zu pruefen?
+ if (time()>next_save_uptime)
+ {
+ // Initialisieren
+ if (next_save_uptime==0)
+ {
+ DEBUG("Masterinit");
+
+ // Zeit berechnen, ab der ein Rekord aufgestellt ist.
+ // Vorher braucht nixhts mehr geprueft werden
+ sscanf(read_file(MAX_UPTIME)||"0 0","%d %d",last_record_boot, max_shut);
+ next_save_uptime=last_reboot_time()+(max_shut-last_record_boot)+1;
+
+ } else {
+ DEBUG("Rekord neu speichern.");
+
+ // Neuen Rekord in Datei schreiben.
+ catch(rm(MAX_UPTIME);publish);
+ write_file(MAX_UPTIME, last_reboot_time()+" "+time());
+
+ // Jetzt checken, ob die Uptime grade geknackt wurde ...
+ // Wenn ja, dann eine Meldung an den Master
+ if(last_reboot_time()!=last_record_boot)
+ {
+ DEBUG("Rekordmeldung. MB:"+last_record_boot+" LU:"+last_reboot_time());
+
+ // Nur einmal pro Rekord Uptime melden ...
+ last_record_boot=last_reboot_time();
+
+ // Hurraaah :)
+ CHMASTER->join(RECORD_CHANNEL,this_object());
+ CHMASTER->send(RECORD_CHANNEL,this_object(),
+ "[<MasteR>:Lars] Wow, eine Rekord-Uptime.\n"
+ "[<MasteR>:Merlin] Das erlebt man auch nicht alle Tage ...\n"
+ "[<MasteR>:Der GameDriver] Dann wird es wohl Zeit fuer einen Reboot, oder?\n"
+ "[<MasteR>:Merlin] Faules Stueck, arbeite weiter!\n"
+ "[<MasteR>:Der GameDriver] Och menno!",
+ MSG_EMPTY);
+ CHMASTER->leave(RECORD_CHANNEL,this_object());
+ }
+ }
+ }
+}
+
+// Gibt Daten zur bisher maximalen Uptime zurueck: (299 Ticks)
+// 1.) Wann wurde gebootet
+// 2.) Wann endete die Uptime
+// 3.) Wann wird dieser Rekord gebrochen?
+// 4.) Dauer der Uptime als lesbarer String.
+mapping QueryMaxUptime()
+{
+ int t, tmp, max_boot, max_shut;
+ string s;
+
+ sscanf(read_file(MAX_UPTIME)||"0 0","%d %d",max_boot, max_shut);
+
+ t=max_shut-max_boot;
+
+ s="";
+ if (t>=86400)
+ s+=sprintf("%d Tag%s, ",tmp=t/86400,(tmp==1?"":"e"));
+ if (t>=3600)
+ s+=sprintf("%d Stunde%s, ",tmp=(t=t%86400)/3600,(tmp==1?"":"n"));
+ if (t>60)
+ s+=sprintf("%d Minute%s und ",tmp=(t=t%3600)/60,(tmp==1?"":"n"));
+ s+=sprintf("%d Sekunde%s",t=t%60,(t==1?"":"n"));
+
+ return (["beginn":max_boot,
+ "ende":max_shut,
+ "naechster rekord":last_reboot_time()+(max_shut-max_boot),
+ "rekord als string":s]);
+}