/************************************************************************/ /* */ /* ***** ***** */ /* ***** ***** */ /* ***** ***** */ /* ***** ***** */ /* *************** *************** */ /* ***************** ***************** */ /* *************** *************** */ /* ***** ***** TheNetNode */ /* ***** ***** Portable */ /* ***** ***** Network */ /* ***** ***** Software */ /* */ /* File msg_lin.c (maintained by: DG8BR) */ /* */ /* */ /* Copyright (C) 1998 - 2008 NORD> #include #include #include #include #ifdef __MSDOS__ #include #endif #ifdef __GO32__ #include #endif #ifdef __linux__ #include #include #include #include #include #endif #ifdef WIN32 #ifdef _MSC_VER /* Wird nur im VC benoetig. */ #include #endif /* MSC_VER */ #include #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>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); } Status= TRUE; } /*============================================================================ MSG_LIN.C ============================================================================*/ /*--------------------------------------------------------------------------*/ void Stop(char *S) { if (strchr(S, '#')) /* Systemfehler */ { printf("\n%s\n", S); printf("Bitte Beschreibung des Fehlers an Sysop schicken !\n"); } else { if (strchr(S, '!')) /* Bedienungsfehler */ { printf("\n%s\n", S); printf("Bitte Hilfe anfordern mit 'MSG H'.\n"); } else { printf("\n%s\n", S); /* nur ne dumme Bemerkung */ } } exit(0); } /*--------------------------------------------------------------------------*/ int Calltest( char *Call ) { int falschesZ, Zahl, i, a; char dname[MAXPATH]; Zahl = 0; falschesZ = 0; /* falsches Zeichen */ if(!Gruppe) { if (strchr(Call, '-') > (char *)NULL) *(char *) (strchr(Call, '-')) = '\0'; } a = strlen(Call); for (i = 0; i < a; i++) /* AeAe pruefen ob Zeichen in Call Ok AeAe */ { Call[i] = tolower(Call[i]); /* fuer die Ascii-Ausgabe */ /* Ae alle Zeichen die in der ASCII-Tabelle ueber Z, zwischen 9 und A sowie unter 0 liegen, machen Call ungueltig ! Ae */ if (isdigit(Call[i])) Zahl++; if (Call[i] > 'z') falschesZ++; if (Call[i] < 'a' && Call[i] > '9') falschesZ++; if (Call[i] < '0') falschesZ++; } sprintf(dname,"%s%s.mbr",msgpath,Call); /* auch auf Gruppe testen, erspart*/ if ((xfindfirst (dname, &ffblk,0)) == 0) /* einwenig Arbeit */ Gruppe = TRUE; if (!Gruppe && (strlen(Call) < 4 || strlen(Call) > 6 || Zahl < 1 || Zahl > 2 || falschesZ > 0)) return(TRUE); return(TRUE); } /*--------------------------------------------------------------------------*/ int main ( int argc, char *argv[] ) { char hilfstring[MAXPATH]; char Call[11]; char Befehl = '\0'; /* Befehl ist argv[1] */ char *fnpoi; Status = FALSE; /* ist immer FALSE, muss von der Funktion gesetzt werden */ *msgpath = '\0'; if (getcwd(msgpath,MAXPATH)== NULL) /* Wo sind wir denn? */ { printf("\nKonnte Pfad nicht ermmitteln!\n"); exit(0); } if(*(fnpoi = msgpath + strlen(msgpath)) != Seperator) /* / oder \\ dran ? */ *fnpoi++ = Seperator; strcat(fnpoi, "msg"); /* Hier sollten immer MSG`s unter TNN sein !!! */ *(fnpoi+3) = Seperator; /* msgpath ist nun festgelegt */ sprintf ( hilfstring,"%smsg.usr",msgpath); /* Hilfedatei da ?? */ if (xfindfirst( hilfstring, &ffblk, 0) != FALSE) Stop ( "\nFehler #M1 Fehler im MSGPATH ! Hilfe-Datei nicht gefunden !" ); if (argc < 3) Stop("\nEs wurde kein Befehl angegeben !"); if ( strlen(argv[1]) > 1 ) Stop( "\nDer Befehl wird nur mit dem Anfangsbuchstaben angegeben !"); else Befehl = tolower( argv[1][0] ); strcpy(Call, argv[argc - 1]); /* Absender ermitteln */ if(Calltest(Call) == FALSE) /* und pruefen ob es ein call ist */ Stop("\nFehler in Deinem Rufzeichen !?"); else strcpy ( Usercall, Call); strupr(Usercall); printf("\nDigimail fuer TheNetNode!\n"); switch (Befehl) { case 'e': case 'l': case 'r': ListMsg(Befehl,argc,argv); break; case 's': if ( argc < 4 ) Stop("Zuwenig Parameter!\n"); else SendMsg(argc,argv); break; case 'g': GroupMsg(argc,argv); break; case 'h': HelpMsg(); break; case 'v': VerMsg(); break; default: sprintf(hilfstring, "Befehl %c ungueltig !", Befehl); Stop(hilfstring); break; } if (!Status) { sprintf(hilfstring, "#Fehler bei Ausfuehrung des '%c'-Befehls !",Befehl); Stop(hilfstring); } return(0); }