/************************************************************************/ /* */ /* ***** ***** */ /* ***** ***** */ /* ***** ***** */ /* ***** ***** */ /* *************** *************** */ /* ***************** ***************** */ /* *************** *************** */ /* ***** ***** TheNetNode */ /* ***** ***** Portable */ /* ***** ***** Network */ /* ***** ***** Software */ /* */ /* File src/pacsat.c (maintained by: ???) */ /* */ /* This file is part of "TheNetNode" - Software Package */ /* */ /* Copyright (C) 1998 - 2008 NORD>pacsat #define pacver "Version 1.15" #if !defined(__LINUX__) && !defined(__WIN32__) /************************************************************************/ /* */ /* Platz auf dem angegebenen Laufwerk ermitteln */ /* */ /************************************************************************/ LONG getdiskfree(char *drive) { struct dfree free; getdfree(toupper(*drive) - 'A' + 1, &free); if (free.df_sclus == (unsigned)-1) return(0L); return((LONG) free.df_avail * (LONG) free.df_bsec * (LONG) free.df_sclus); } #endif /************************************************************************/ /* */ /* Temporaerdatei fuer den aktuellen User oeffnen */ /* */ /************************************************************************/ static void open_tempfile(void) { pacuser->tempfp = NULL; /* einen Temporaerdateinamen im TEXTPATH erstellen */ pacuser->tempfile = tempnam(textpath, "ps"); if (pacuser->tempfile == NULL) return; if (getdiskfree(textpath) > 2000000L) /* Datei oeffnen */ pacuser->tempfp = xfopen(pacuser->tempfile, "wb"); /* Versagt das oeffnen ist tempfp = NULL, das wird bei den */ /* Schreib-Routinen abgefangen. */ } /************************************************************************/ /* */ /* eine Zeile an den Pacsat-User schicken */ /* */ /************************************************************************/ static void send_user(const char *s) { MBHEAD *mbp; mbp = getmbp(); putstr(s, mbp); seteom(mbp); } /************************************************************************/ /* */ /* Die empfangene Zeile in die Temporaerdatei speichern */ /* */ /************************************************************************/ static void store_line(void) { if (pacuser->tempfp) { fputs(clilin, pacuser->tempfp); fputc('\r', pacuser->tempfp); fputc('\12', pacuser->tempfp); } } /************************************************************************/ /* */ /* eine Box moechte eine Nachricht speichern. */ /* */ /************************************************************************/ static void pacsat_send(void) { open_tempfile(); /* in eine Temporaer-Datei speichern */ if (pacuser->tempfp != NULL) /* wenn Datei geoeffnet werden konnte*/ { send_user("OK\r"); /* Bestaetigung fuer den User/die Box*/ store_line(); /* Zeile speichern (S DB7KG @ ...) */ } else send_user("Disk full\r"); /* Abbrechen, kein File */ } /************************************************************************/ /* */ /* Filespeicherung beenden, File in das Filesystem uebertragen */ /* */ /************************************************************************/ static void stop_send(void) { if (pacuser->tempfp) { fclose(pacuser->tempfp); /* Temporaerdatei schliessen */ pacuser->tempfp = NULL; new_file(pacuser->tempfile); xremove(pacuser->tempfile); /* Temporaerdatei loeschen */ free(pacuser->tempfile); pacuser->tempfile = NULL; } send_user(">\r"); /* S&F Prompt */ } /************************************************************************/ /* */ /* Box moechte PACSAT verlassen */ /* */ /************************************************************************/ static void pacsat_exit(void) { MBHEAD *mbp; dealoc((MBHEAD *) pacuser); pacuser = NULL; mbp = putals("Reconnected to "); putid(myid, mbp); putchr('\r', mbp); prompt(mbp); seteom(mbp); } /************************************************************************/ /* */ /* Routine zur Nachrichtenspeicherung */ /* */ /************************************************************************/ static void store(void) { store_line(); /* Zeile speichern */ if (strchr(clilin, 0x1A)) stop_send(); /* ein CTRL-Z gefunden ? */ } #if 0 /************************************************************************/ /* */ /* Anzeigen/einlesen des PACSAT-BOX Rufzeichens */ /* */ /************************************************************************/ void boxcall(void) { char call[L2IDLEN]; MBHEAD *mbp; clipoi++; clicnt--; if (clicnt > 2 && getcal(&clicnt, &clipoi, FALSE, call) == TRUE) cpyid(pacsatid, call); mbp = getmbp(); #ifdef SPEECH putstr(speech_message(291), mbp); #else putstr("PACSAT BOX-Call is now ", mbp); #endif putid(pacsatid, mbp); putstr("\r", mbp); seteom(mbp); } #endif /************************************************************************/ /* */ /* Analyse eines eingegeben Befehls */ /* */ /************************************************************************/ static void pacsat_command_switch(void) { FILE *fp; static char file[MAXPATH], s[20] ,*cp; time_t t; /* muss er Passwort senden und hat nicht ? */ if (*clipoi == '[') { if (pacuser->check_pwd) { cp = strchr((char *)clipoi, ']') + 2; callss2str(s, calofs(UPLINK, userpo->uid)); sprintf(file, "%s%s.PWD", pacsatpath, s); if ((fp = xfopen(file, "rt")) != NULL) { pacuser->row++; while (pacuser->row--) if (!fgets(file, MAXPATH-1, fp)) break; fclose(fp); file[pacuser->col+4] = NUL; pacuser->check_pwd = strcmp(file+pacuser->col, cp); } } if (!pacuser->check_pwd) send_user(">\r"); return; } if (pacuser->check_pwd && (*clipoi != '[')) { if (syspro_flag == TRUE) { strcpy(file, confpath); strcat(file, "SYSOP.PRO"); if ((fp = xfopen(file,"at")) != NULL) { #ifdef SPEECH fprintf(fp, speech_message(285), ctime(&t), calofs(UPLINK, userpo->uid)); #else fprintf(fp, "%24.24s %6.6s: rejected (mailbox)\n", ctime(&t), calofs(UPLINK, userpo->uid)); #endif fclose(fp); } } pacsat_exit(); /* und das wars ... */ return; } switch (toupper(*clipoi)) /* sonst Befehl auswerten */ { case 'S' : pacsat_send(); break; case 'F' : pacsat_exit(); /* F> beendet */ break; } } /************************************************************************/ /* */ /* Dataswitch L7 (CCP) -> PACSAT */ /* */ /************************************************************************/ void l7_to_pacsat(void) { *clipoi = NUL; clipoi = clilin; if (pacuser->tempfp != NULL) store(); /* bei Datenspeicherung */ else pacsat_command_switch(); } /************************************************************************/ /* */ /* In die PACSAT S&F Box einloggen */ /* */ /************************************************************************/ void ccpbox(void) { MBHEAD *mbp; char pwdfile[MAXPATH], s[20]; struct tm *tim; WORD mon; if (cmpid(pacsatid, nullid)) { invmsg(); return; } pacuser = (PACSATBLK *)allocb(ALLOC_PACSATBLK); pacuser->tempfp = NULL; pacuser->tempfile = NULL; /* wenn ein Passwort-File vorhanden ist, dann muss der User sich auch privilegieren */ pacuser->login = sys_time; callss2str(s, calofs(UPLINK, userpo->uid)); sprintf(pwdfile, "%s%s.PWD", pacsatpath, s); pacuser->check_pwd = !xaccess(pwdfile, 0); send_user("Internal link setup ...\r"); mbp = putals(conmsg); putid(pacsatid, mbp); putstr("\r", mbp); seteom(mbp); /* Begruessung oder S&F-SID senden */ strcpy(pwdfile, "[THEBOX-1.8-$]"); if (pacuser->check_pwd) { tim = localtime(&pacuser->login); mon = tim->tm_mon + 1; sprintf(s," %02d%02d%02d%02d%02d",tim->tm_year,mon,tim->tm_mday, tim->tm_hour,tim->tm_min); strcat(pwdfile, s); pacuser->row = (tim->tm_min + tim->tm_year) % 60; pacuser->col = tim->tm_hour; } strcat(pwdfile, "\r"); send_user(pwdfile); send_user(">\r"); return; } PARAM pacsatpartab[] = { /* Parameter Tabelle */ {&pacsat_timer,0,10000, "Timer"}, {&pacsat_frames,0,20, "Frames"}, {&pacsat_free,0,10000, "Diskfree"} }; /************************************************************************/ /* */ /* Pacsat-Server konfigurieren (nur durch Sysop) */ /* */ /************************************************************************/ void ccppacsat(void) { MBHEAD *mbp = NULL; int ch; WORD port; if (issyso() && skipsp(&clicnt, &clipoi)) { ch = *clipoi; nextspace(&clicnt, &clipoi); skipsp(&clicnt, &clipoi); switch (toupper(ch)) { case 'R' : filesystem_init(); /* Reload */ #ifdef SPEECH putmsg(speech_message(292)); #else putmsg("Filesystem reloaded\r"); #endif return; case 'C' : ccp_call(pacsatid); if (!pacsatid[0]) cpyid(pacsatid, nullid); return; case 'P' : ccp_par("BROADCAST-Parms:\r", pacsatpartab, sizeof(pacsatpartab)/sizeof(PARAM)); return; case '-' : case '+' : if (getport(&clicnt, &clipoi, &port)) pacsat_enabled[port] = (ch == '+'); } } mbp = getmbp(); #ifdef SPEECH putstr(speech_message(288), mbp); #else putstr("Server call: ", mbp); #endif putid(pacsatid, mbp); #ifdef SPEECH putstr(speech_message(289), mbp); #else putstr("\rMessage pool: ", mbp); #endif if (last_fid < first_fid) #ifdef SPEECH putstr(speech_message(290), mbp); #else putstr("Empty\r", mbp); #endif else #ifdef SPEECH putprintf(mbp,speech_message(286), first_fid, last_fid, last_fid - first_fid + 1); #else putprintf(mbp,"%lX-%lX (%lu Messages)\r", first_fid, last_fid, last_fid - first_fid + 1); #endif for (port = 0; port < L2PNUM; port++) if (pacsat_enabled[port]) #ifdef SPEECH putprintf(mbp, speech_message(287), port, portpar[port].name); #else putprintf(mbp, "BROADCAST enabled on port %u (%s).\r", port, portpar[port].name); #endif prompt(mbp); seteom(mbp); } #endif /* PACSAT */ /* End of src/pacsat.c */