initial commit

master
Marcus Hanisch DLM274 4 years ago
commit 6e56114b94

@ -0,0 +1,86 @@
Allgemeine Lizenz für Amateurfunk Software (ALAS)
Copyright (C) 1994 NORD><LINK e.V.
Hinter dem Berge 5
D-38108 Braunschweig
Dieses Dokument darf beliebig vervielfältigt oder verteilt werden,
solange es nicht verändert wird. Für Anregungen, wie es zu verbessern ist,
bin ich dankbar. (DF2AU @ DB0FC.#NDS.DEU.EU)
1. Vorwort
Diese Lizenz entstand aus der General Public Licence der Free Software
Foundation (GPL). Ich habe versucht, den Sinn zu erhalten und mehr Klarheit
hineinzubringen. Einige Passagen sind vollständig entfallen. Es ist aber
jedem Nutzer freigestellt, an Stelle dieser Lizenz die GPL Bedingungen
anzuwenden.
Der Sinn dieser Lizenz ist es, den Autor und den Anwender der Software zu
schützen. Es sind daher einige Einschränkungen erforderlich und es entstehen
auch einige Pflichten für den, der die mit dieser Lizenz verbundene Software
weitergibt oder verändert.
Dies wird dadurch erreicht, dass die Software durch Copyright geschützt
wird und der Nutzer durch diese Lizenz die Möglichkeit einer nahezu
unbeschränkten Nutzung erhält.
2. Geltungsbereich
Diese Lizenz gilt für jedes Programm oder Teil eines Programmpaketes, das
eine Copyright Notiz ausgibt, die sich auf diese Lizenz bezieht. Im folgenden
bedeutet "Programm" entweder das Programm oder einen Teil davon.
"Du" bist der Lizenznehmer.
3. Deine Rechte:
Du darfst das Programm nutzen oder kopieren oder verteilen oder verändern,
solange Du damit keine kommerziellen Absichten verbindest.
4. Deine Pflichten:
4.1. Du darfst den Copyright Vermerk und den Hinweis auf diese Lizenz nicht
verändern und er muss bei jedem Start des Programms eindeutig für den
Benutzer sichtbar sein.
4.2. Du musst jedem Dritten, dem Du eine Kopie des Programms gibst, die
gleichen Rechte einräumen, die auch Dir gegeben wurden. Du musst ihm
auch die gleichen Pflichten auferlegen.
4.3. Du darfst für die Weitergabe kein Geld verlangen ausser den
Kosten für das Medium und Porto.
4.4. Du darfst das Programm nur komplett weitergeben, so wie Du es bekommen
hast.
4.5. Wenn Du das Programm veränderst oder Teile davon für eigene Arbeiten
verwendest - wörtlich oder verändert - so gelten die folgenden Punkte für
das daraus entstehende neue Programm:
4.5.1. Du musst deutlich sichtbar angeben:
- Deinen Namen und Deine Adresse und
- die Tatsache, dass Du das Programm geändert hast oder Teile des
Programms verwendet hast.
4.5.2. Du musst das Programm entweder mit dem kompletten Quelltext
weitergeben oder jedem auf Verlangen eine Kopie des Quelltextes gegen eine
Gebühr von maximal der Kosten des Mediums und der Portokosten aushändigen.
4.5.3. Du darfst keine Beschränkungen aussprechen, die über diese Lizenz
hinausgehen.
5. Sonstiges
Du erhälst das Programm ohne jede Garantie für Funktion, Fehlerfreiheit oder
Anwendbarkeit für eine bestimmte Sache. Du verzichtest auf jede
Schadensersatzforderung, gleich aus welchem Grunde.
Mit der Nutzung des Programms erkennst Du diese Lizenzbedingungen
vorbehaltlos an.
Vers. 1.0, 13-OCT-92
Adressen aktualisiert am 20.10.2003
Ende ALAS

@ -0,0 +1,97 @@
Installationshinweise zu TNN 1.79 :
===================================
Diese Anleitung richtet sich in erster Linie an Linux-User, fuer DOS kann
ein geringfuegig anderes Vorgehen notwendig werden. Als Basisverzeichnis
dient hier in der Regel "c:\tnn".
Leider ist noch keine endgueltige Dokumentation verfuegbar, vieles ist aber
im Vergleich zur Version 1.78 gleich geblieben, Unterschiede und neue Features,
bzw. Kommandos, koennen im history-Verzeichnis nachgelesen werden, ansonsten
stellt die alte Dokumentation der Version 1.78 einen guten Leitfaden dar.
Unter GCC 3.x meldet der Compiler beim Uebersetzen des Convers einige Warnings,
diese koennen ignoriert werden.
Neuinstallation :
-----------------
1.) Archiv auspacken (z.B. in /usr/local/src/tnn) und in das Verzeichnis wechseln
Optional: Im Verzeichnis "include" die Datei "all.h" ansehen und ggf. Optionen
aktivieren oder unerwuenschte Optionen deaktivieren (auskommentieren).
2.) "make baseinstall" ausfuehren
TNN kompiliert nun und wird anschliessend in das Verzeichnis "/usr/local/tnn"
installiert. Je nach Betriebssystem werden Beispieldateien fuer die
Konfiguration hinzugefuegt. Ein normales "make" erzeugt lediglich die
ausfuehrbaren Dateien von TNN und der extrenen Programme, es findet KEINE
Installation statt !
3.) "cd /usr/local/tnn"
3.) Die Konfigurationsdateien tnn.ini, tnn179.{tnb,pas} und ax25ip.cfg
ansehen und ggf. anpassen (bei DOS nicht alle benoetigt)
4.) Dateizugriffsrechte ueberpruefen. TNN sollte root gehoeren, das Verzeichnis
in dem sich TNN befindet, sollte auch NUR fuer root zugaenglich sein !
Laeuft TNN nicht als root, so koennen einige Linuxfeatures nicht benutzt
werden !!!
5.) TNN starten ("./tnn")
6.) Am Passwortprompt mit dem Konsolenpasswort aus der Datei tnn.pas einloggen
(Standard: "Geheim")
7.) "<ESC> c <Enter>" verbindet mit der ersten Konsole
Jetzt ggf. noch im laufenden Betrieb Einstellungen vornehmen (IP, Baken,
Links, Convers etc.).
Optional:
A.) Mit dem Kommando "sp" an der TNN-Konsole die aktuelle Konfiguration
speichern wenn alle Einstellungen gemacht sind
B.) Die neue Datei "parms.tnb" sichten, ist alles korrekt, so kann diese in
"tnn179.tnb" umbenannt werden. Achtung: "parms.tnb" selber wird beim
Systemstart NICHT ausgewertet !!!
In der Datei "startup.log" befinden sich die Reaktionen auf die Verarbeitung
der einzelnen Befehle der tnn179.tnb. Hier kann im Fehlerfall ueberprueft
werden, welche Befehle nicht akzeptiert wurden.
Update von TNN Version 1.78/1.79pre? :
--------------------------------------
1.) Archiv auspacken
Optional: Optionen in "all.h" ueberpruefen und ggf. anpassen
2.) "make" oder "make install" ausfuehren. Bei letzterem wird die Verzeichnis-
struktur mit angelegt und NUR das "tnn"-Executeable kopiert.
3.) "tnn"-Executable ins TNN-Verzeichnis kopieren
4.) Optional: externe Programm in die entsprechenden Verzeichnisse kopieren
Alte Konfigurationsdateien (tnn178.tnb etc.) werden automatisch geupdated.
Auf Schreibberechtigungen des Users achten, der TNN dann startet, kann TNN die
neuen Dateien nicht erzeugen, so wird mit STANDARDEINSTELLUNGEN (!) gestartet.
Zur Sicherheit koennen die alten Dateien auch vor dem ersten Start von Hand
in die neuen Namen kopiert werden (tnn178.tnb -> tnn179.tnb etc.). Als weitere
Alternative bietet sich das "upd"-Utility an, welches nach dem Uebersetzen
ebenfalls im "bin"-Verzeichnis zu finden ist.
Update einer TNN-Version 1.77 oder aelter :
-------------------------------------------
Hier ist leider Handarbeit angesagt. Es sollte das Neuinstallations-Verfahren
durchgefuehrt werden, danach von Hand die Einstellungen (vor allem die PAR-
Sektion) uebertragen und die Bedeutung der Parameter pruefen. Alternativ kann
auch versucht werden, die alten .tnb-Dateien in die neue, laufende TNN mit dem
"run"-Kommando einzulesen ("run tnn177.tnb"), und anschliessend mittels "sp"
eine parms.tnb-Datei zur weiteren Anpassung erzeugt werden.
Noch Probleme und Fragen ? Hier kann geholfen werden :
------------------------------------------------------
* Im DL-Convers auf Kanal 170.
* Auf www.nordlink.org im "Forum", Rubrik "TNN".

@ -0,0 +1,10 @@
# TheNetNode-CB
TheNetNode from Nordlink>&lt;, CB-Version (TNN 1.79cb53)
Version Info:
TheNetNode (Linux) (CB), Version 1.79cb53 (May 8 2019)
Copyright by NORD><LINK, free for non-commercial usage.
See www.nordlink.org for further information.
This version compiled for 16 Ports, 400 L2-Links and 200 Circuits.
*** CB-Version by DAA531, http://dig531.dyndns.org. ***

@ -0,0 +1,86 @@
Allgemeine Lizenz für Amateurfunk Software (ALAS)
Copyright (C) 1994 NORD><LINK e.V.
Hinter dem Berge 5
D-38108 Braunschweig
Dieses Dokument darf beliebig vervielfältigt oder verteilt werden,
solange es nicht verändert wird. Für Anregungen, wie es zu verbessern ist,
bin ich dankbar. (DF2AU @ DB0FC.#NDS.DEU.EU)
1. Vorwort
Diese Lizenz entstand aus der General Public Licence der Free Software
Foundation (GPL). Ich habe versucht, den Sinn zu erhalten und mehr Klarheit
hineinzubringen. Einige Passagen sind vollständig entfallen. Es ist aber
jedem Nutzer freigestellt, an Stelle dieser Lizenz die GPL Bedingungen
anzuwenden.
Der Sinn dieser Lizenz ist es, den Autor und den Anwender der Software zu
schützen. Es sind daher einige Einschränkungen erforderlich und es entstehen
auch einige Pflichten für den, der die mit dieser Lizenz verbundene Software
weitergibt oder verändert.
Dies wird dadurch erreicht, dass die Software durch Copyright geschützt
wird und der Nutzer durch diese Lizenz die Möglichkeit einer nahezu
unbeschränkten Nutzung erhält.
2. Geltungsbereich
Diese Lizenz gilt für jedes Programm oder Teil eines Programmpaketes, das
eine Copyright Notiz ausgibt, die sich auf diese Lizenz bezieht. Im folgenden
bedeutet "Programm" entweder das Programm oder einen Teil davon.
"Du" bist der Lizenznehmer.
3. Deine Rechte:
Du darfst das Programm nutzen oder kopieren oder verteilen oder verändern,
solange Du damit keine kommerziellen Absichten verbindest.
4. Deine Pflichten:
4.1. Du darfst den Copyright Vermerk und den Hinweis auf diese Lizenz nicht
verändern und er muss bei jedem Start des Programms eindeutig für den
Benutzer sichtbar sein.
4.2. Du musst jedem Dritten, dem Du eine Kopie des Programms gibst, die
gleichen Rechte einräumen, die auch Dir gegeben wurden. Du musst ihm
auch die gleichen Pflichten auferlegen.
4.3. Du darfst für die Weitergabe kein Geld verlangen ausser den
Kosten für das Medium und Porto.
4.4. Du darfst das Programm nur komplett weitergeben, so wie Du es bekommen
hast.
4.5. Wenn Du das Programm veränderst oder Teile davon für eigene Arbeiten
verwendest - wörtlich oder verändert - so gelten die folgenden Punkte für
das daraus entstehende neue Programm:
4.5.1. Du musst deutlich sichtbar angeben:
- Deinen Namen und Deine Adresse und
- die Tatsache, dass Du das Programm geändert hast oder Teile des
Programms verwendet hast.
4.5.2. Du musst das Programm entweder mit dem kompletten Quelltext
weitergeben oder jedem auf Verlangen eine Kopie des Quelltextes gegen eine
Gebühr von maximal der Kosten des Mediums und der Portokosten aushändigen.
4.5.3. Du darfst keine Beschränkungen aussprechen, die über diese Lizenz
hinausgehen.
5. Sonstiges
Du erhälst das Programm ohne jede Garantie für Funktion, Fehlerfreiheit oder
Anwendbarkeit für eine bestimmte Sache. Du verzichtest auf jede
Schadensersatzforderung, gleich aus welchem Grunde.
Mit der Nutzung des Programms erkennst Du diese Lizenzbedingungen
vorbehaltlos an.
Vers. 1.0, 13-OCT-92
Adressen aktualisiert am 20.10.2003
Ende ALAS

@ -0,0 +1,157 @@
########################################################################
# #
# ***** ***** #
# ***** ***** #
# ***** ***** #
# ***** ***** #
# *************** *************** #
# ***************** ***************** #
# *************** *************** #
# ***** ***** TheNetNode #
# ***** ***** Portable #
# ***** ***** Network #
# ***** ***** Software #
# #
# File contrib/makefile (maintained by: DF6LN) #
# #
# Copyright (C) 1998 - 2004 NORD><LINK e.V. Braunschweig #
# #
# This program is free software; you can redistribute it and/or modify #
# it under the terms of the NORD><LINK ALAS (Allgemeine Lizenz fuer #
# Amateurfunk Software) as published by Hans Georg Giese (DF2AU) #
# on 13/Oct/1992; either version 1, or (at your option) any later #
# version. #
# #
# This program is distributed WITHOUT ANY WARRANTY only for further #
# development and learning purposes. See the ALAS (Allgemeine Lizenz #
# fuer Amateurfunk Software). #
# #
# You should have received a copy of the NORD><LINK ALAS (Allgemeine #
# Lizenz fuer Amateurfunk Software) along with this program; if not, #
# write to NORD><LINK e.V., Hinter dem Berge 5, D-38108 Braunschweig #
# #
# Dieses Programm ist PUBLIC DOMAIN, mit den Einschraenkungen durch #
# die ALAS (Allgemeine Lizenz fuer Amateurfunk Software), entweder #
# Version 1, veroeffentlicht von Hans Georg Giese (DF2AU), #
# am 13.Oct.1992, oder (wenn gewuenscht) jede spaetere Version. #
# #
# Dieses Programm wird unter Haftungsausschluss vertrieben, aus- #
# schliesslich fuer Weiterentwicklungs- und Lehrzwecke. Naeheres #
# koennen Sie der ALAS (Allgemeine Lizenz fuer Amateurfunk Software) #
# entnehmen. #
# #
# Sollte dieser Software keine ALAS (Allgemeine Lizenz fuer Amateur- #
# funk Software) beigelegen haben, wenden Sie sich bitte an #
# NORD><LINK e.V., Hinter dem Berge 5, D-38108 Braunschweig #
# #
########################################################################
#
# Geruest fuer ein makefile in contrib/programmname mit dem das Programm
# "prg" uebersetzt werden soll, das im TNN-Unterverzeichnis userexe laufen
# soll.
#
# Das Programm soll grundsaetzlich in das Verzeichnis $(BIN) uebersetzt
# werden. Die in den anderen Makefiles verwendeten Targets duerfen nicht
# noch einmal verwendet werden. Daher werden fuer "clean", "dist", etc.
# jeweils zusaetzliche abhaengige Targets definiert, unter denen dann die
# tatsaechliche Ausfuehrung stattfindet. Folgende Targets sollten
# beruecksichtigt werden:
#
# prg - (ist durch den Programmnamen zu ersetzen) uebersetzen des
# Programms in das Verzeichnis $(BIN). Evtl. zusaetzlich
# generierte Dateien sollten im Verzeichnis des Programms
# bleiben (contrib/programmname). Das Programm kann fuer LINUX
# und / oder GO32 uebersetzt werden, oder auch fuer GO32 unter
# DOS.
#
# all - hier wird prg zusaetzlich eingetragen, so dass es bei einem
# Befehl "make" ohne zusaetzliche Parameter mit uebersetzt
# wird.
#
# clean - loeschen des compilierten Programms in $(BIN) und aller
# anderen mit den normalen Libraries neu generierbaren Files.
# Wenn spezielle Libraries benoetigt werden (z.b. von p2c),
# sind besondere Massnahmen zu ueberlegen, damit nicht etwas
# falsches geloescht wird (s. contrib/onlhelp/makefile).
#
# bigdist - (nur bei Linux) kopieren der fuer das Uebersetzen des
# Programms benoetigten Dateien in das Verzeichnis
# $(DISTDIR)/contrib/programmname - dazu gehoeren die *.c und
# *.h Dateien sowie das Makefile und evtl. weitere Dateien wie
# z.B. Hilfetexte.
#
# install - (nur fuer Linux) kopieren des fertigen Programms sowie der
# ggf. benoetigten weiteren Dateien (Hilfe etc.) in die
# passenden Verzeichnisse $(TNNDIR), $(TNNUSEREXE),
# $(TNNSYSEXE), usw. - abhaengig von der gewuenschten Funktion
#
# go32 - (nur fuer Linux) wenn das Programm in einer GO32-Version
# unter Linux uebersetzt werden kann, sollte es hier auch mit
# eingetragen werden, damit es bei einem Befehl "make go32"
# mit uebersetzt wird.
#
PRGNAM := contrib/programmname
PRGFILES := $(PRGNAM)/prg.c $(PRGNAM)/makefile
# Phony Targets eintragen, die fuer LINUX und DOS gueltig sind
.PHONY: prg prgclean
# Lokale Erweiterung eintragen fuer "all" und "clean"
all: prg
clean: prgclean
# das wird bei "make prg" tatsaechlich uebersetzt:
prg: $(BIN)/prg
# nun wirds Systemabhaengig - erstmal Linux
ifeq ($(SYSTEM), LINUX)
# Phony Targets eintragen, die nur fuer LINUX gueltig sind
.PHONY: prgdist prginstall prggo32
# Lokale Erweiterung fuer "dist" eintragen
bigdist: prgdist
# Lokale Erweiterung fuer "install" eintragen
install: prginstall
# Lokale Erweiterung fuer "go32" eintragen
go32: prggo32
# das wird bei "make prggo32" tatsaechlich uebersetzt:
prggo32: $(BIN)/prggo32
# hier wird tatsaechlich uebersetzt
$(BIN)/prg: $(PRGFILES) $(CLEANER)
$(CLEANER) $(PRG)/prg.c
$(CC) $(CFLAGS_LIN) $(PRG)/prg.c -o $@
sync
echo $@ done.
$(BIN)/prggo32: $(PRGFILES) $(CLEANER)
$(CLEANER) $(PRG)/prg.c
$(CC_GO32) $(CFLAGS_GO32) $(PRG)/prg.c -o $@
chmod 644 $@
sync
echo $@ done.
prgclean:
rm -f $(BIN)/prg $(BIN)/prggo32{,.exe} $(PRG)/*~
prgdist:
cp --parents $(PRGFILES) $(DISTDIR)
prginstall:
install -m 0700 $(BIN)/prg $(TNNUSEREXE)/prg
else
#
# Hier (fast) das gleiche fuer Dose
#
$(BIN)/prg: $(PRGFILES) $(CLEANER)
$(CLEANER) $(PRG)/prg.c
$(CC) $(CFLAGS_GO32) $(PRG)/prg.c -o $@
echo $@ done.
prgclean:
erase $(subst /,\\,$(BIN))\prg
erase $(subst /,\\,$(BIN))\prg.exe
erase $(subst /,\\,$(PRG))\*.bak
endif

@ -0,0 +1,126 @@
########################################################################
# #
# ***** ***** #
# ***** ***** #
# ***** ***** #
# ***** ***** #
# *************** *************** #
# ***************** ***************** #
# *************** *************** #
# ***** ***** TheNetNode #
# ***** ***** Portable #
# ***** ***** Network #
# ***** ***** Software #
# #
# File makefile (maintained by: DG8BR) #
# #
# Copyright (C) 1998 - 2004 NORD><LINK e.V. Braunschweig #
# #
# This program is free software; you can redistribute it and/or modify #
# it under the terms of the NORD><LINK ALAS (Allgemeine Lizenz fuer #
# Amateurfunk Software) as published by Hans Georg Giese (DF2AU) #
# on 13/Oct/1992; either version 1, or (at your option) any later #
# version. #
# #
# This program is distributed WITHOUT ANY WARRANTY only for further #
# development and learning purposes. See the ALAS (Allgemeine Lizenz #
# fuer Amateurfunk Software). #
# #
# You should have received a copy of the NORD><LINK ALAS (Allgemeine #
# Lizenz fuer Amateurfunk Software) along with this program; if not, #
# write to NORD><LINK e.V., Hinter dem Berge 5, D-38108 Braunschweig #
# #
# Dieses Programm ist PUBLIC DOMAIN, mit den Einschraenkungen durch #
# die ALAS (Allgemeine Lizenz fuer Amateurfunk Software), entweder #
# Version 1, veroeffentlicht von Hans Georg Giese (DF2AU), #
# am 13.Oct.1992, oder (wenn gewuenscht) jede spaetere Version. #
# #
# Dieses Programm wird unter Haftungsausschluss vertrieben, aus- #
# schliesslich fuer Weiterentwicklungs- und Lehrzwecke. Naeheres #
# koennen Sie der ALAS (Allgemeine Lizenz fuer Amateurfunk Software) #
# entnehmen. #
# #
# Sollte dieser Software keine ALAS (Allgemeine Lizenz fuer Amateur- #
# funk Software) beigelegen haben, wenden Sie sich bitte an #
# NORD><LINK e.V., Hinter dem Berge 5, D-38108 Braunschweig #
# #
########################################################################
#
# Makefile fuer MSG und MSY
#
MSGMSY := contrib/msgmsy
MSGFILES := $(MSGMSY)/{ms[gy]{_lin.c,.his,.inf},msg.{usr,sys},makefile}
.PHONY: msg msy msgclean
all: msg msy
clean: msgclean
msg: $(BIN)/msg
msy: $(BIN)/msy
ifeq ($(SYSTEM), LINUX)
.PHONY: msgdist msginstall msggo32 msygo32
bigdist: msgdist
install: msginstall
go32: msggo32 msygo32
msggo32: $(BIN)/msggo32
msygo32: $(BIN)/msygo32
$(BIN)/msg: $(MSGMSY)/msg_lin.c $(MSGMSY)/makefile $(CLEANER)
$(CLEANER) $(MSGMSY)/msg_lin.c
$(CC) $(CFLAGS_LIN) $(LDFLAGS_LIN) -o $@ $(MSGMSY)/msg_lin.c
echo $@ done.
$(BIN)/msy: $(MSGMSY)/msy_lin.c $(MSGMSY)/makefile $(CLEANER)
$(CLEANER) $(MSGMSY)/msy_lin.c
$(CC) $(CFLAGS_LIN) $(LDFLAGS_LIN) -o $@ $(MSGMSY)/msy_lin.c
echo $@ done.
$(BIN)/msggo32: $(MSGMSY)/msg_lin.c $(MSGMSY)/makefile $(CLEANER)
$(CLEANER) $(MSGMSY)/msg_lin.c
$(CC) $(CFLAGS_GO32) -o $@ $(MSGMSY)/msg_lin.c
chmod 644 $@
echo $@ done.
$(BIN)/msygo32: $(MSGMSY)/msy_lin.c $(MSGMSY)/makefile $(CLEANER)
$(CLEANER) $(MSGMSY)/msy_lin.c
$(CC) $(CFLAGS_GO32) -o $@ $(MSGMSY)/msy_lin.c
chmod 644 $@
echo $@ done.
msgclean:
rm -f $(BIN)/ms[gy] $(BIN)/ms[gy]go32{,.exe} $(MSGMSY)/*~
msgdist:
cp --parents $(MSGFILES) $(DISTDIR)
msginstall:
echo $@
install -m 0700 $(BIN)/msg $(TNNUSEREXE)msg
install -m 0700 $(BIN)/msy $(TNNSYSEXE)msy
cp $(MSGMSY)/msg.{usr,sys} $(TNNMSG)
else
#
# Nun kommt Dose
#
$(BIN)/msg: $(MSGMSY)/msg_lin.c $(MSGMSY)/makefile $(CLEANER)
$(CLEANER) $(MSGMSY)/msg_lin.c
$(CC) $(CFLAGS_GO32) -o $@ $(MSGMSY)/msg_lin.c
echo $@ done.
$(BIN)/msy: $(MSGMSY)/msy_lin.c $(MSGMSY)/makefile $(CLEANER)
$(CLEANER) $(MSGMSY)/msy_lin.c
$(CC) $(CFLAGS_GO32) -o $@ $(MSGMSY)/msy_lin.c
echo $@ done.
msgclean:
erase $(subst /,\\,$(BIN))\msg
erase $(subst /,\\,$(BIN))\msy
erase $(subst /,\\,$(BIN))\msg.exe
erase $(subst /,\\,$(BIN))\msy.exe
erase $(subst /,\\,$(MSGMSY))\*.bak
endif

@ -0,0 +1,15 @@
Version gleich Datum
====================
16.01.1999
- Verteilversion
03.06.1999
- Wegen libc6(glibc2) ein "#include <errno.h>" eingebaut.
und main von "void" nach "int" umgestellt.
20.06.99
- Durch einen Fehler in der Speicherroutine konnte es unter Linux in einer
bestimmten Situation zu einem 'Segmentation fault' kommen.
Wurde abgefangen.

@ -0,0 +1,23 @@
Hallo Sysop's,
das Paket sollte folgende Dateien beinhalten.
- msg_lin.c das Programm. MUSS als msg.exe. TNN verlangt .exe!!!!
- msg.usr die Hilfedatei
- msg.mak das Makefile
- msg.his Histo
Nach dem Kompilieren solltet Ihr eine msg.exe haben.
Bitte msg.exe in's Verzeichnis "userexe" kopieren.
Die Hilfe-Datei msg.usr bitte ins Verzeichnis "msg".
Das Verzeichnis "msg" sollte unter tnn stehen. Aber das wisst Ihr sicher.
Es wird kein Environmenteintrag benoetigt.
Das Programm erkennt wo es ist. Zwingend ist nur vorgeschrieben,
das die Hilfedatei im Verzeichniss "msg" steht!!!
Da werden auch die call.msg geschrieben.
Fehler bitte unbedingt melden!!
Bis denne Bernd DG8BR

@ -0,0 +1,62 @@
Uebersicht zur MSY-Hilfe : 3.02
-------------------------
(MSY) C count lifetime -1
(MSY) D dir
(MSY) E erase
(MSY) G group
(MSY) L list
(MSY) S send
(MSY) V version
Detaillierte Hilfe zu MSY :
---------------------------
(MSY) C
Lifetime aller MSG's wird um 1 verringert. Dieses kann per Hand
geschehen oder sinnvollerweise mit z. B. folgendem TNB-File.
######01.TNB
============
; ;Diese File startet taeglich um 1:00 Uhr.
MSY C ;Lifetime der .MSG-File um einen Tag herrabsetzen
; ;und bei Lifetime = 0 entfernen.
(MSY) D Listet die Header aller MSG's auf.
(MSY) D -#x o. +#x
MSG's, deren LT (-) kleiner o. (+) groesser x-Tage ist.
(MSY) D -*x o. +*x
MSG's, die (-) juenger o. (+) aelter als x-Tage sind.
(MSY) D FROM
zeigt MSG-Liste sortiert nach Absender-Calls an.
Die Sortierung kann auch nach :
BYTE, DATE, TIME, LT, RETURN vorgenommen werden.
(MSY) E ALL <call>
Loescht alle MSG's von oder an <call>.
(MSY) E 3 <call>
Loescht die dritte Nachricht an <call>. Varianten sind 1-4, 2- oder -3.
(MSY) G <gruppe> +/- <call>
Fuegt/loescht <call> ein/aus <gruppe>. Zugelassen sind in einer Gruppe
maximal 50 Call's.
(MSY) L
Zeigt alle MSG-Files.
(MSY) S <call> <#x> <text>
Schreibt <text> an <call> mit Lifetime x. Hier ist eine Lifetime von
maximal 99 Tagen moeglich.
(MSY) V
Ausgabe von der Versionsnummer und dem Datum.

@ -0,0 +1,78 @@
Uebersicht zur MSG-Hilfe : 3.04
-------------------------
(MS)G S <ZIELCALL/GRUPPE> <#lifetime> <text> sendet MSG
(MS)G R <call> <nummer> liest MSG
(MS)G L listet MSGs
(MS)G E loescht MSGs
(MS)G G <gruppe> listet Gruppen
(MS)G V zeigt Version
Detaillierte Hilfe zu MSG :
---------------------------
(MS)G S <ZIELCALL/GRUPPE> #<lifetime> <text>
Zum Erstellen einer Digimail (MSG) :
Der Message-Befehl ermoeglicht es, einem Benutzer des Knotens eine kurze
(!) Nachricht in den CTEXT zu schreiben. Beim naechsten Connect wird
diese Zeile dann bei Ihm im CTEXT erscheinen. Statt des Zielcalls kann
auch eine Zielgruppe angegeben werden. Diese ist eine Art Verteiler-
liste. Jedes Mitglied der Zielgruppe bekommt eine Kopie der Nachricht.
Die Lifetime kann, muss aber nicht, angegeben werden. Sie kann von #1 =
einem Tag bis #30 = dreissig Tage angegeben werden. Wird keine Lifetime
angegeben, so wird sie auf default = 7 Tage gesetzt. Das taegliche
Herabsetzen der Lifetime geschieht im Digi. Ist die Lifetime abgelaufen
und der Adressat ist nicht der Absender, bekommt der Absender seine MSG
mit einer Default-Lifetime von 7 Tagen zurueck. Nach dieser Zeit wird
die MSG endgueltig geloescht.
Abhaengig davon, ob das System mit einer Festplatte oder einer RAMDISK
arbeitet, kann die Nachricht bei Absturz oder Reset verloren gehen.
Beispiel: MSG S DL9GYA #10 Roland, bitte connecte mich, wenn Du zurueck
bist!
MSG S SYSOP Link nach ..... defekt?!
Letzteres wuerde die Nachricht an die OM's der Gruppe SYSOP weiter-
leiten.
Die Definition einer neuen Gruppe geschieht nur durch die Sysops. Bitte
danach fragen.
(MS)G R
Liest die eigenen MSG's aus.
(MS)G R <call>
Liest die an <call> gerichteten MSG's aus.
(MS)G R <call> 1 oder 1-3
Zusaetzlich kann noch eine Numerierung mit angegeben werden. Also
lesen der MSG 1 oder MSG 1-3.
(MS)G L
Listet die eigenen Header auf.
(MS)G E
Dieser Befehl loescht alle eigenen Digimail-Nachrichten.
(MS)G E 1-2
Dieser Befehl loescht Nr. 1-2 der eigenen Digimail-Nachrichten. Es muss
mindestens eine Zahl angegeben werden.
(MS)G E 1- <call>
Dieser Befehl loescht alle eigenen Digimail-Nachrichten die an <call>
geschickt wurden.
(MS)G G
zeigt alle vorhandenen Verteiler-Gruppen mit Call's an.
(MS)G G <gruppe>
zeigt nur die Call's in der <gruppe> an
Neue Gruppen koennen nur vom Sysop angelegt werden!
(MS)G V
Gibt Versionsnummer und -Datum aus.

@ -0,0 +1,950 @@
/************************************************************************/
/* */
/* ***** ***** */
/* ***** ***** */
/* ***** ***** */
/* ***** ***** */
/* *************** *************** */
/* ***************** ***************** */
/* *************** *************** */
/* ***** ***** TheNetNode */
/* ***** ***** Portable */
/* ***** ***** Network */
/* ***** ***** Software */
/* */
/* File msg_lin.c (maintained by: DG8BR) */
/* */
/* */
/* Copyright (C) 1998 - 2008 NORD><LINK e.V. Braunschweig */
/* */
/* This program is free software; you can redistribute it and/or modify */
/* it under the terms of the NORD><LINK ALAS (Allgemeine Lizenz fuer */
/* Amateurfunk Software) as published by Hans Georg Giese (DF2AU) */
/* on 13/Oct/1992; either version 1, or (at your option) any later */
/* version. */
/* */
/* This program is distributed WITHOUT ANY WARRANTY only for further */
/* development and learning purposes. See the ALAS (Allgemeine Lizenz */
/* fuer Amateurfunk Software). */
/* */
/* You should have received a copy of the NORD><LINK ALAS (Allgemeine */
/* Lizenz fuer Amateurfunk Software) along with this program; if not, */
/* write to NORD><LINK e.V., Hinter dem Berge 5, D-38108 Braunschweig */
/* */
/* Dieses Programm ist PUBLIC DOMAIN, mit den Einschraenkungen durch */
/* die ALAS (Allgemeine Lizenz fuer Amateurfunk Software), entweder */
/* Version 1, veroeffentlicht von Hans Georg Giese (DF2AU), */
/* am 13.Oct.1992, oder (wenn gewuenscht) jede spaetere Version. */
/* */
/* Dieses Programm wird unter Haftungsausschluss vertrieben, aus- */
/* schliesslich fuer Weiterentwicklungs- und Lehrzwecke. Naeheres */
/* koennen Sie der ALAS (Allgemeine Lizenz fuer Amateurfunk Software) */
/* entnehmen. */
/* */
/* Sollte dieser Software keine ALAS (Allgemeine Lizenz fuer Amateur- */
/* funk Software) beigelegen haben, wenden Sie sich bitte an */
/* NORD><LINK e.V., Hinter dem Berge 5, D-38108 Braunschweig */
/* */
/************************************************************************/
/*****************************************************************************
Dies ist ein Remake von MSG.PAS.
Erstellt wurde die Originalversion von DG3AAH und DF7BZ in Pascal.
Ihnen ist die Entstehung des Programmpaares MSG und MSY zuverdanken.
Da ich einige Sachen aus DF6LN's Linuxpacket fuer TNN entnommen habe,
moechte und muss ich diese Ausgabe unter ALAS stellen.
Dieses Programm ist in der Bedienung und in der Ausgabe weitestgehend
kompatibel zum Original-MSG.
Viele Gruesse Bernd DG8BR
*****************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <ctype.h>
#ifdef __MSDOS__
#include <dir.h>
#endif
#ifdef __GO32__
#include <unistd.h>
#endif
#ifdef __linux__
#include <errno.h>
#include <unistd.h>
#include <fnmatch.h>
#include <dirent.h>
#include <sys/stat.h>
#endif
#ifdef WIN32
#ifdef _MSC_VER
/* Wird nur im VC benoetig. */
#include <direct.h>
#endif /* MSC_VER */
#include <sys/stat.h>
#include "sys/dirent32.h"
#include "sys/fnmatch.h"
#endif /* WIN32 */
/* Definitionen */
#define MaxZeilen 200
#define MaxLT 30
#define FALSE 0
#define TRUE (!FALSE)
#define DefaultLT " 7"
#ifdef __MSDOS__
#define Seperator '\\'
#define xfindfirst findfirst
#define xfindnext findnext
#endif
#ifdef WIN32
#define MAXPATH 255
#define NAME_MAX 260
#define findfirst _findfirst
#define findnext _findnext
#define Seperator '\\'
#endif /* WIN32 */
#ifdef __linux__
#define Seperator '/'
#define MAXPATH 128 /* ist unter TC3.1 auf 80 festgelegt */
#define stricmp strcasecmp
#endif
/* Globale Variablen */
int Status; /* True, wenn procedure erfolgreich */
int Gruppe; /* True, wenn Call==Gruppe */
char Usercall[10]; /* Aufrufender des MSG-pgms */
char msgpath[MAXPATH];
char ZeitZone[5];
#ifndef WIN32
struct ffblk ffblk;
#endif /* WIN32 */
/* Prototypen */
void ListMsg (int,int,char**);
void GroupMsg ( int, char** );
void SendMsg ( int, char** );
void HelpMsg ( void );
void VerMsg ( void );
int Suche_Datei ( char* );
void Stop (char* );
int Calltest ( char* );
int speichern ( char*, char*, char* ); /* Unterfunktion von SendMsg */
/* Alles unter dem nachfolgenden ifdef __linux__ wurde aus dem TNN-Packet */
/* fuer LinuX von der NORD><LINK - Gruppe bzw. aus dem DJGPP GNU-Paket fuer */
/* DOS von D.J. Delorie entnommen. */
#if defined(__linux__) || defined(WIN32)
#ifndef WIN32
int xfindfirst (const char*, struct ffblk *, int);
int xfindnext (struct ffblk *);
void setfiletime (struct ffblk * );
#endif /* WIN32 */
char* strlwr (char*);
char* strupr (char*);
struct ffblk
{
char ff_path[MAXPATH];
char ff_find[NAME_MAX];
char ff_name[NAME_MAX];
unsigned ff_fdate;
unsigned ff_ftime;
};
#ifdef WIN32
struct ffblk ffblk;
int xfindfirst (const char*, struct ffblk *, int);
int xfindnext (struct ffblk *);
void setfiletime (struct ffblk * );
#endif /* WIN32 */
struct ftime
{
unsigned ft_tsec : 5;
unsigned ft_min : 6;
unsigned ft_hour : 5;
unsigned ft_day : 5;
unsigned ft_month : 4;
unsigned ft_year : 7;
};
/************************************************************************/
/* */
/* Als Ersatz fuer die Funktionen "findfirst" und "findnext" (bei DOS) */
/* werden die Funktionen "xfindfirst" und "xfindnext" verwendet. Hier */
/* wird nur der fuer TNN benoetigte Teil in die Struktur ffblk einge- */
/* tragen. Der zuletzt gefundene Filename muss in ffblk->ff_name erhal- */
/* ten bleiben, weil dieser beim Aufruf von "xfindnext" gesucht wird. */
/* */
/************************************************************************/
int xfindfirst(const char *pathname, struct ffblk *ffblk, int attrib)
{
char *fnpoi;
DIR *dp;
struct dirent *dirp;
int retval;
strcpy(ffblk->ff_path, pathname); /* Filename incl. Pfad */
#ifdef WIN32
fnpoi = strrchr(ffblk->ff_path, Seperator); /* Pfad angegeben? */
#else
fnpoi = strrchr(ffblk->ff_path, '/'); /* Pfad angegeben? */
#endif /* WIN32 */
if (fnpoi == NULL) /* - nein .. */
{
strcpy(ffblk->ff_find, ffblk->ff_path); /* Filename kopieren */
strcpy(ffblk->ff_path, msgpath); /* default: msgpath */
}
else /* mit Pfad */
{
if (fnpoi == ffblk->ff_path+strlen(ffblk->ff_path)) /* ohne Name */
return(-1); /* Unsinn */
strcpy(ffblk->ff_find, ++fnpoi); /* nur Filename */
*fnpoi = '\0'; /* Filename im Pfad loeschen */
}
if ((dp = opendir(ffblk->ff_path)) == NULL) /* Directory vorhanden? */
return(-1);
retval = -1; /* default: nix gefunden */
while ((dirp = readdir(dp)) != NULL) /* Eintrag vorhanden? */
{
if ((fnmatch(ffblk->ff_find, dirp->d_name,
FNM_PATHNAME|FNM_PERIOD) != 0))
continue;
strcpy(ffblk->ff_name, dirp->d_name);
setfiletime(ffblk);
retval = 0;
break;
}
closedir(dp);
return(retval);
}
/****************************************************************************/
/* */
/* Erst den zuletzt gefundenen Eintrag suchen (steht in ffblk->ff_name) */
/* und den darauffolgenden passenden Eintrag zurueckmelden. */
/* */
/****************************************************************************/
int xfindnext(struct ffblk *ffblk)
{
DIR *dp;
struct dirent *dirp;
int retval;
if ((dp = opendir(ffblk->ff_path)) == NULL)
return -1;
retval = -1; /* default: nix gefunden */
while ((dirp = readdir(dp)) != NULL)
{
if ((fnmatch(ffblk->ff_name, dirp->d_name,
FNM_PATHNAME|FNM_PERIOD) != 0))
continue;
retval = 1;
break;
}
if (retval == 1)
{
retval = -1; /* default: nix gefunden */
while ((dirp = readdir(dp)) != NULL)
{
if ((fnmatch(ffblk->ff_find, dirp->d_name,
FNM_PATHNAME|FNM_PERIOD) != 0))
continue;
strcpy(ffblk->ff_name, dirp->d_name);
setfiletime(ffblk);
retval = 0;
break;
}
}
closedir(dp);
return(retval);
}
/****************************************************************************/
/* */
/* Bei xfindfirst und xfindnext Datum und Uhrzeit im Fileblock setzen */
/* */
/****************************************************************************/
void setfiletime(struct ffblk *ffblk)
{
struct stat filestat;
struct tm *filetime;
char fn[MAXPATH];
sprintf(fn, "%s%s", ffblk->ff_path, ffblk->ff_name);
stat(fn, &filestat);
filetime = gmtime(&filestat.st_mtime);
ffblk->ff_ftime = ((filetime->tm_sec / 2) & 0x1f)
+ ((filetime->tm_min & 0x3f) << 5)
+ ((filetime->tm_hour & 0x1f) << 11);
ffblk->ff_fdate = (filetime->tm_mday & 0x1f)
+ ((filetime->tm_mon & 0x0f) << 5)
+ (((filetime->tm_year - 80) & 0x7f) << 9);
}
/* Copyright (C) 1995 DJ Delorie, see COPYING.DJ for details */
char* strlwr(char *_s)
{
char *rv = _s;
while (*_s)
{
*_s = tolower(*_s);
_s++;
}
return rv;
}
/*
String in Grossbuchstaben umwandeln - aus DJGPP GNU-Paket fuer DOS
von D.J. Delorie
*/
char *strupr(char *s)
{
char *p = s;
while (*s)
{
if ((*s >= 'a') && (*s <= 'z'))
*s += 'A'-'a';
s++;
}
return p;
}
#endif /* Linux-Teil */
/*============================================================================
VerMsg.c
============================================================================*/
#define MsgVersion "3.04"
#define MsgDatum "14.05.1997 von DF7BZ & DG3AAH"
#define MsgLinux "(20.06.99) nach 'C' portiert von DG8BR"
#ifdef WIN32
#define MsgWin32 "(17.01.04) Modifiziert fuer Win32 von DAA531 Oliver Kern."
#endif
void VerMsg ( void )
{
#ifdef WIN32
printf("\nMSG-Programm %s von %s \n%s\n%s\n",MsgVersion, MsgDatum,MsgLinux,MsgWin32);
#else
printf("\nMSG-Programm %s von %s \n%s\n",MsgVersion, MsgDatum,MsgLinux);
#endif
Status = TRUE;
}
/*============================================================================
SendMsg.c
============================================================================*/
/* Parameterreihenfolge ist:
Programmname Befehl Empfaenger (Lifetime) Nachricht Absender */
/* 1 2 3 4 5 6
0 1 2 3 4 5 */
void SendMsg ( int argc, char *argv[] )
{
int a;
char LT[3] = DefaultLT; /* LifeTime im Header einer MSG */
char buffer[80]; /* Nachrichtentext */
char dname[MAXPATH];
char name[9]; /* Gruppen oder Empfeangername */
FILE *fp; /* Empfaenger-Dateizeiger */
a = 2; /* Empfangscall */
sscanf (argv[a], "%s", &(*name)); /* Empfaenger feststellen */
if ( Calltest(name) == FALSE)
Stop("Fehler im Empfaengerrufzeichen.");
a++; /* Lifetime oder Nachricht */
if(argv[a][0] == '#') /* Lifetime vorhanden? */
{
strcpy (LT,&(argv[a][1])); /* Lifetime */
if (( atoi(LT) < 1 ) || (atoi(LT) > MaxLT))
{
printf("ACHTUNG ! Lifetime muss zwischen 1 und %d sein!\n\n",MaxLT);
strcpy(LT,DefaultLT);
}
a++; /* Nur wenn lifetime da war */
}
buffer[0] = ' '; /* Nachricht einruecken. Sieht doch besser aus */
buffer[1] = '\0';
for(;a < argc-1; a++) /* die komplette Nachricht einlesen */
{
sprintf (buffer+(char)strlen(buffer),"%s ", argv[a]);
}
if(buffer[1] == '\0') /* wenn nix dann mecker */
Stop("Nachricht fehlt !");
buffer[strlen(buffer)-1] = '\n'; /* return einfuegen */
a = 0; /* wird noch benoetigt */
/*--------------------------------------------------------------------------*/
if ( Gruppe == TRUE ) /* wird in Calltest geprueft */
{
sprintf(dname,"%s%s.mbr",msgpath,name);
/* Gruppendatei oeffnen */
if((fp = fopen(dname,"rt")) == NULL)
{
sprintf(dname,"Fehler #S1 Konnte die Datei %s nicht oeffnen.",name);
Stop(dname);
}
while(!feof(fp))
{
*name = '\0';
fscanf(fp,"%s",&(*name));
if(name[0] != '\0') /* fscanf findet trotz feof was */
{
strlwr(name);
speichern(LT,name,buffer);
a = TRUE;
}
}
fclose(fp);
}
else
a = speichern(LT,name,buffer); /* Speichern ohne Gruppe */
if (a == TRUE)
{
printf("\nInhalt der Nachricht :\n"); /* das bekommen alle */
printf("----------------------\n");
printf("%s",buffer);
}
Status = TRUE;
}
/*--------------------------------------------------------------------------*/
int speichern (char *LT,char *name,char *buffer)
{
int a = 0; /* Nachrichtenzaehler */
int b = 0; /* Umspeicherzaehler */
int ist = 0; /* Flag fuer eingefuegte Nachricht. */
char dname[MAXPATH];
char MsgZeit[40];
char Nachricht[MaxZeilen][80];
char Zbuffer[80]; /* Zwischenbuffer beim umspeichern */
char Datum[9];
FILE *fp;
time_t t;
struct tm *ts;
char *Tage[] = { "Sun", "Mon", "Thu", "Wed", "Thu", "Fri", "Sat" };
time(&t);
ts = localtime(&t);
sprintf(Datum,"%02d.%02d.%02d",ts->tm_mday,ts->tm_mon +1,ts->tm_year%100);
sprintf(MsgZeit,"Time: %s, %s / %02d:%02dZ",Tage[ts->tm_wday],
Datum,
ts->tm_hour,
ts->tm_min);
sprintf(dname,"%s%s.msg",msgpath,name);
strupr(name); /* nun wird name nur noch GROSS gebraucht */
if ((fp = fopen(dname,"rt")) == NULL) /* Datei vorhanden? */
{
if((fp = fopen(dname,"wt")) == NULL) /* Nein, schreibend oeffnen */
{
printf("Fehler beim Oeffnen von %s !\n",dname);
return(FALSE);
}
fprintf(fp,"\nMessage from %-6s - %s Lifetime %2s\n%s",
Usercall,MsgZeit,LT,buffer);
fclose(fp);
}
else /* Datei ist da. Alles einlesen und aktuelle Nachricht einschieben */
{
fgets(Nachricht[a], 79,fp);
while(!feof(fp))
{
if(strstr(Nachricht[a],"Message from ")) /* Kopfzeile von MSG */
{
if( strstr(Nachricht[a],Usercall)) /* hat er schon eine von call? */
{ /* und auch von heute ? */
if(strstr(Nachricht[a],Datum) && !strstr(Nachricht[a],"RETURN"))
{ /* LT aus Datei nehmen */
if(Gruppe == FALSE) /* Bei Gruppe die LT ueberschreiben */
strncpy(LT,strstr(Nachricht[a],"Lifetime ")+9,2);
else /* sonst LT uebernehmen */
{
strncpy (strstr(Nachricht[a],"Lifetime ")+9,LT,2);
}
fgets(Nachricht[++a],79,fp); /* 1 String kommt auf jeden Fall */
do
{
if(fgets(Zbuffer,79,fp)) /* kommt noch mehr */
{
if(strstr(Zbuffer,"Message from "))
break; /* Nee. War nur eine Zeile */
strcpy(Nachricht[++a],Zbuffer); /* sonst kopieren */
}
else /* sicherheitshalber leer machen */
*Zbuffer = '\0';
}
while(!feof(fp));
strcpy(Nachricht[++a],buffer); /* aktuelle Nachricht einfuegen */
if(Zbuffer[0] != '\x0') /* die geholte Zeile auch einfuegen */
strcpy(Nachricht[++a],Zbuffer);
ist = TRUE; /* habe eingefuegt */
}
}
}
a++;
fgets(Nachricht[a], 79,fp);
}
fclose(fp);
if ( a >= MaxZeilen )
{
printf("%s hat zuviele Nachrichten ! Nichts gespeichert!\n",name);
return(FALSE); /* Speichertext wird nicht ausgegeben */
}
unlink(dname);
if ((fp = fopen(dname,"wt")) == NULL)
Stop("Fehler #S2 Problem beim Zurueckschreiben der Datei!");
while (b < a)
{
fprintf(fp,"%s",Nachricht[b++]);
}
if(ist == FALSE) /* habe nicht eingefuegt, also anhaengen */
fprintf(fp,"Message from %-6s - %s Lifetime %2s\n%s",
Usercall,MsgZeit,LT,buffer);
fclose(fp);
}
printf("MSG wurde fuer %-6s mit einer Lifetime von %s Tag(en)"
" gespeichert.\n",name,LT);
return(TRUE); /* war alles richtig */
}
/*============================================================================
ListMsg.c
============================================================================*/
/* Parameterreihenfolge ist: Programmname Befehl von-bis Rufzeichen Usercall
Argument(argv) 0 1 2 3 4
Argument(argc) 1 2 3 4 5
Argument 2 (von-bis) und 3 (Rufzeichen) sind optional.
Wenn 2 nicht angegeben, dann alles ausgeben.
Wenn 3 angegeben, beim Loeschen pruefen ob Usercall der Absender war ?
Ansonsten ist es egal was fuer ein Call angegeben wurde!
*/
void ListMsg (int Befehl,int argc,char *argv[])
{
int von = 1; /* Nur Nachricht von * ausgeben. 1 = default */
int bis = 99; /* Nur Nachricht bis * ausgeben. 99 = default */
int Nr = 0; /* Nummer der Nachricht. Von 1 bis MaxZeilen */
int a;
int aus; /* es wurde was ausgegeben, also nicht speichern */
int seine = 0; /* user's eigene MSG */
int Ruecknr; /* wieviel Zeilen noch zurueckgeschreiben */
char trenner = '\0'; /* wird nur fuer sscanf benoetigt */
char AnzNr[3] = "00"; /* Das wird ausgegeben. */
char dname[MAXPATH]; /* Pfad und Dateiname */
char name[7]; /* Dateiname */
char Nachricht[MaxZeilen][80];
FILE *fp;
*name = '\0'; /* erstmal den Namen weg */
/*----------------------------------------------------------------------------
von-bis und eventuell das call pruefen.
----------------------------------------------------------------------------*/
if (argc == 4 || argc == 5) /* Nummer und/oder Call */
{
for ( a = 2; a < argc-1; a++)
{
if((isdigit(argv[a][0])) != FALSE)
Nr = sscanf(argv[a],"%02d%c%02d",&von, &trenner, &bis);
if (Nr == 1) /* wenn nur eine Zahl eingegeben wurde. */
bis = von;
if((argv[a][0] == '-') == TRUE)
Nr = sscanf (argv[a],"%c%02d",&trenner, &bis);
if (Nr == 0) /* Argument ein Call */
sscanf(argv[a],"%s",&(*name));
Nr = 0; /* name nach von-bis wird nicht gefunden, wenn Nr gesetzt */
}
if( von > bis ) /* Ev. sollte man das einfach verbessern */
Stop("Ende liegt vor Anfang!");
}
if(*name == FALSE) /* wenn kein Call angegeben wurde */
{
strcpy(name,Usercall); /* Sind seine MSG's */
}
else
{
if (Calltest(name) == FALSE) /* Gucken ob der User richtig schreiben */
Stop("Das angegebene Rufzeichen ist ungueltig !"); /* Sonst Mecker */
}
/*--------------------------------------------------------------------------*/
strlwr(name);
sprintf(dname,"%s%s.msg",msgpath,name);
strupr(name);
Nr = 0;
if ((fp = fopen(dname,"rt")) == NULL)
{
printf("Keine MSG fuer %s gefunden.\n",name);
exit(0);
}
printf("\n%s :\n",name); /* Empfaenger der Nachricht ausgeben */
while(!feof(fp)) /* erstmal alles lesen */
{
if((fgets(Nachricht[Nr],79,fp)) != NULL)
{
if (Nachricht[Nr][0] == 0x0A) /* LF-Return, */
continue; /* naechste Zeile einlesen. */
Nr++;
}
if ( Nr > MaxZeilen ) /* Sollte nie vorkommen !! */
{
fclose(fp);
sprintf(dname,"Fehler #L1 %s ist zu gross! ",ffblk.ff_name);
Stop(dname);
}
}
fclose(fp);
/*----------------------------------------------------------------------------
Die gewuenschten Nachrichten ausgeben und wenn geloescht werden soll, die
entsprechenden Zeilen markieren.
----------------------------------------------------------------------------*/
aus = 0;
Ruecknr = Nr;
for (a = 0; a < Nr; a++)
{
if(strstr(Nachricht[a],"Message from ")) /* Kopfzeile von MSG */
{
if ( AnzNr[1] == '9' ) /* wenn 9 dann auf 0 setzen und das */
{ /* vorherige Byte auf 1 */
AnzNr[0]++;
AnzNr[1] = '0';
}
else
AnzNr[1]++; /* wenn nicht, dann nur erhoehen */
aus++; /* zaehlt die nachrichtennummern */
if(( aus >= von) && ( aus <= bis) == TRUE)
{
if (Befehl == 'e') /* feststellen ob es seine oder ob von ihm */
{
if(!stricmp(name,Usercall) || strstr(Nachricht[a],Usercall))
{
printf("MSG %s: %s",AnzNr,Nachricht[a]);
*Nachricht[a] = '\0'; /* Loeschen markieren */
Ruecknr--;
seine = TRUE; /* fuer den Nachrichteninhalt */
}
else
seine = FALSE;
}
if(Befehl == 'r' || Befehl == 'l')
printf("MSG %s: %s",AnzNr,Nachricht[a]);
}
}
else /* ist kein Nachrichtenkopf */
{
if(( aus >= von) && ( aus <= bis) == TRUE) /* aber gueltige Nummer */
{
if( Befehl == 'e' && seine == TRUE)
{
printf("%s",Nachricht[a]);
*Nachricht[a] = '\0';
Ruecknr--;
}
if(Befehl == 'r')
printf("%s",Nachricht[a]);
}
}
}
/*----------------------------------------------------------------------------
Und nun wird geloescht.
----------------------------------------------------------------------------*/
if(Befehl == 'e')
{
if(Ruecknr == 0) /* ist nix mehr zum zurueckschreiben */
unlink(dname);
else
{
unlink(dname);
if ((fp = fopen(dname,"wt")) == NULL)
{
Stop("Fehler #L2 Fehler beim Zurueckschreiben der Datei!");
}
for (a = 0; a < Nr; a++)
{
if(*Nachricht[a] != '\0')
fprintf(fp,"%s",Nachricht[a]);
}
fclose(fp);
}
if(Ruecknr < Nr) /* wenn ja, dann wurde was geloescht. */
printf("\nDiese MSG('s) wurde(n) soeben geloescht!\n");
else
printf("\nEs wurde nichts geloescht!\n");
}
Status = TRUE;
}
/*============================================================================
HelpMsg.c
============================================================================*/
void HelpMsg ( void )
{
char filename[MAXPATH];
FILE *fp;
sprintf(filename,"%smsg.usr",msgpath);
if (( fp = fopen(filename,"rt")) == NULL)
{
Stop("Fehler #H1 Konnte Hilfedatei nicht oeffnen.");
}
while (!feof(fp))
{
if((fgets(filename,79,fp)) != NULL)
printf("%s",filename);
}
fclose (fp);
Status = TRUE;
}
/*============================================================================
GroupMsg.c
============================================================================*/
/* Parameterreihenfolge ist: Programmname Befehl Gruppe Usercall
Argument(argv) 0 1 2 3
Argument(argc) 1 2 3 4
Wobei Gruppe optional ist. Wenn keine Gruppe angegeben wurde, dann alle
Gruppen auflisten.
*/
void GroupMsg ( int argc, char *argv[] )
{
int a;
int gefunden;
char dname[MAXPATH];
FILE *fp;
if(argc == 3)
sprintf(dname,"%s*.mbr",msgpath);
if(argc == 4)
sprintf(dname,"%s%s.mbr",msgpath,strlwr(argv[2]));
if(argc > 4)
Stop("Zuviele Parameter !");
gefunden = xfindfirst( dname, &ffblk, 0);
if (gefunden != FALSE) /* wenn nicht gefunden, dann meckern */
Stop("Gruppe nicht gefunden...");
printf("\n");
while (!gefunden)
{
sprintf(dname,"%s%s",msgpath,ffblk.ff_name);
if (( fp = fopen(dname,"rt")) == NULL)
Stop("Fehler #G1 Konnte Datei nicht oeffnen.");
strcpy(dname,ffblk.ff_name);
dname[strlen(dname)-4] = '\0'; /* Standard IMMER .EXT */
printf("%s :\n",strupr(dname));
for(a = strlen(dname)+2;a > 0;a--) /* Laenge des Gruppennamens */
{
printf("-"); /* unterstreichen */
}
printf("\n"); /* und dann ..... return !!! */
do /* Datei ausgeben */
{
fgets(dname,79,fp);
printf("%s",dname);
*dname = '\0';
}
while (!feof(fp));
printf("\n");
fclose (fp);
gefunden = xfindnext(&ffblk);