home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
High Voltage Shareware
/
high1.zip
/
high1
/
DIR10
/
DBBS_13.ZIP
/
DBBSCOM1.SLT
< prev
next >
Wrap
Text File
|
1989-03-28
|
49KB
|
1,380 lines
// █████▓▓▓▓▓▒▒▒▒▒░░░░░ DBBS VERSION 1.3 BY DENNIS SEATON ░░░░░▒▒▒▒▒▓▓▓▓▓█████
str password[16], //caller's password
host_downloads[64], // where users may download from
host_uploads[64], // where uploaded files go
fp[30], // path of all files
stuff[78]; // stuff!
int direct_connect = 0;
str current_caller[31], // storage of current caller's name
conn300[] = "CONNECT^M", // modem result messages for bauds
conn1200[] = "CONNECT 1200",
conn2400[] = "CONNECT 2400",
conn9600[] = "CONNECT 9600",
conn19200[] = "CONNECT 19200";
int finished_caller, // set to TRUE when must return to top
local_mode, // set to TRUE when local test mode
access_level, // access level of current caller
we_care_about_carrier = 1, // TRUE if should watch Carrier signal
already_connected = 0,
exit_requested = 0, // set to TRUE if Sysop has pressed Esc
connection_lost = 0, // set to TRUE when carrier lost
kill_user = 0, // set to TRUE when user must be purged
min_user_name = 2; // Minimum length of a user name
int old_scr_chk_key, // storage for some system variables
old_cisb_auto, // which we have to modify and put
old_zmod_auto, // back to what they were when done
old_sound;
str old_down_dir[64],
old_up_dir[64];
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
main() {
clear_scr();
int c;
if (read_host_config_file () == -1) {
prints("┌──────────────────────────────────────────────────────┐");
prints("│ Unable to read DBBS.CNF... │");
prints("│ Running DCONFIG, the Host Mode configuration script. │");
prints("└──────────────────────────────────────────────────────┘^M^J");
call("DCONFIG");
if (read_host_config_file() == -1) {
clear_scr();
prints("┌──────────────────────────────────────────────┐");
prints("│ Still unable to read DBBS.CNF. Aborting DBBS │");
prints("└──────────────────────────────────────────────┘^M^J");
return -1;
}
}
if (!check_directories()) {
clear_scr();
prints("┌─────────────────────────────────────────────────────────────────────────┐");
prints("│ Either the upload or download directory as defined in the DBBS.CNF file │");
prints("│ doesn't exist. Either create the missing directory with the DOS 'MKDIR' │");
prints("│ command, or run the DCONFIG script to redefine what directories to use. │");
prints("└─────────────────────────────────────────────────────────────────────────┘");
prints("");
prints("┌───────────────┐");
prints("│ Aborting DBBS │");
prints("└───────────────┘");
prints("");
return -1;
}
old_scr_chk_key = _scr_chk_key;
_scr_chk_key = 0;
old_cisb_auto = _cisb_auto;
_cisb_auto = 0;
old_zmod_auto = _zmod_auto;
_zmod_auto = 0;
old_sound = _sound_on;
_sound_on = 0;
old_down_dir = _down_dir;
_down_dir = host_uploads; // these are reversed because we are now the Host
old_up_dir = _up_dir;
_up_dir = host_downloads; // these are reversed because we are now the Host
clear_scr();
usagelog("DBBS.LOG");
if (direct_connect)
we_care_about_carrier = 0;
else
we_care_about_carrier = 1;
if (!direct_connect && carrier())
already_connected = 1;
if (!direct_connect && !already_connected) {
prints("Initializing modem");
cputs_tr(_auto_ans_str);
}
while (1) {
finished_caller = kill_user = 0;
if (direct_connect)
we_care_about_carrier = 0;
else
we_care_about_carrier = 1;
if (!direct_connect) {
clear_scr();
prints("┌────────────┬───────────────────────────────┐");
prints("│ DBBS 1.3 │ Waiting For Someone To Call │");
prints("└────────────┴───────────────────────────────┘");
prints("┌────────────────────────────────────────────┐");
prints("│ Press F1 for local test, F9 to exit, │");
prints("│ Press F2 for sysop dos utilities menu. │");
prints("└────────────────────────────────────────────┘");
do {
if (carrier()) {
local_mode = 0;
break;
}
c = inkey();
if (c) {
if (c == 0x4300) { // F9 exit
exit_requested = 1;
break;
}
else if (c == 0x3b00) { // F1 local test mode
prints("Local test mode entered");
local_mode = 1;
we_care_about_carrier = 0;
}
else if (c == 0x3c00) { // F2 dos stuff
ustamp("Sysop used DOS functions while offline.",1,1);
dosfunction();
}
}
}
while (toupper(c) != 0x3b00);
}
if (!exit_requested) {
host_send("^LDBBS Version 1.3 - By Dennis Seaton^G^M^J");
prints("┌────────────────────────────────────────────────────────────┐");
prints("│ SYSOP: Press F10 for SYSOP help menu (User can not see it) │");
prints("└────────────────────────────────────────────────────────────┘");
_sound_on=1;
tone(500, 9);
tone(900, 9);
tone(500, 9);
tone(900, 9);
tone(500, 9);
tone(900, 9);
tone(500, 9);
do_one_caller();
if ((connection_lost || kill_user) && we_care_about_carrier && carrier())
hangup(); // make sure nobody sneaks in
}
already_connected = 0;
if (exit_requested) {
if (!carrier() && !direct_connect)
cputs_tr(_mdm_init_str);
_scr_chk_key = old_scr_chk_key;
_cisb_auto = old_cisb_auto;
_zmod_auto = old_zmod_auto;
_sound_on = old_sound;
_down_dir = old_down_dir;
_up_dir = old_up_dir;
prints("^M^JHost mode script finished.");
usagelog("DBBS.LOG");
return 1;
}
}
}
//////////////////////////////////////////////////////////////////////////////
do_one_caller() {
str strn[80], fname[64], temporary[1];
int option, status, c, i, i2;
access_level = 1;
if (already_connected)
prints("Already Connected!");
else if (we_care_about_carrier) {
if (!determine_baud())
; // do something else here if this is a problem
}
delay(10);
type_file("FIRST.MSG");
flushbuf();
while (1) {
host_send("Please Enter Your Name -=> ");
host_input_strn(current_caller, 30, 0);
host_send("^M^J");
if (finished_caller)
return;
if (strlen(current_caller) >= min_user_name) {
host_send ("^"");
host_send (current_caller);
host_send ("^", correct? (Y/N) -=> ");
host_input_strn (temporary, 30, 0);
host_send ("^M^J");
if (strcmpi (temporary, "y") == 0)
break;
}
else
host_send ("^M^JVery Funny...^G^M^J^M^J");
}
if (access_level = ask_for_pass(3)) {
ustamp("Logon by ", 1, 0);
ustamp(current_caller, 0, 1);
}
else {
host_send("^G^M^JGoodbye!^G^M^J");
if (we_care_about_carrier) {
delay(10);
hangup();
}
ustamp("Failed logon attempt by ", 1, 0);
ustamp(current_caller, 0, 1);
return;
}
type_file("BULLETIN.MSG");
host_send("-=> Hit Enter <=-");
host_input_strn(stuff,1,0);
while (1) {
if (finished_caller)
return;
if (access_level <= 1) {
type_file("NEWMENU.MSG"); // New user Menu
printsc(" ────» User: ");
printsc(current_caller);
printsc(" Access Level: New User ");
printsc(" «─────^M^J");
host_send(" -=> ");
}
else {
type_file("MENU.MSG"); // Normal Menu
printsc(" ────» User: ");
printsc(current_caller);
printsc(" Access Level: ");
printc(access_level+48);
printsc(" «─────^M^J");
host_send(" -=> ");
}
host_input_strn(strn, 1, 0);
option = toupper(subchr(strn, 0));
host_send("^M^J");
if (option == 'R') { // Files directory
if (access_level >= 2) {
host_send("^L");
host_send("┌───────────────────────┐^M^J");
host_send("│ Raw Files Directory │^M^J");
host_send("└───────────────────────┘^M^J^M^J");
host_send("Enter filespec or Return for *.* -=> ");
host_input_strn(fname, 64, 0);
host_send("^M^J");
if (just_filename(fname)) {
strn = host_downloads;
strcat(strn, fname);
}
else
strn = fname;
}
else {
strn = host_downloads;
strcat(strn, "*.*");
}
ustamp("User used RAW directory listing.",1,1);
if (local_mode)
show_directory(strn, 0, we_care_about_carrier);
else
show_directory(strn, 1, we_care_about_carrier);
host_input_strn(stuff,1,0);
}
else if (option == 'T') { // Type a file
host_send("^L");
host_send("┌───────────────┐^M^J");
host_send("│ Type a File │^M^J");
host_send("└───────────────┘^M^J^M^J");
host_send("Enter File To Display -=> ");
host_input_strn(strn, 64, 0);
host_send("^M^J");
if (access_level == 1) { // if access 1, name and ext only
host_send("^M^J^G* Your Access Level Is Too Low *^G^M^J");
ustamp("Level 1 User Attempted To TYPE a File.",1,1);
strn = stuff;
}
else {
fname = strn;
}
if (just_filename(fname)) {
strn = host_downloads;
strcat(strn, fname);
fname = strn;
}
if (!filefind(fname, 0, strn)) {
host_send("^GUnable to find ");
host_send(fname);
continue;
}
type_file(fname);
host_send("^M^J-=> Hit Enter <=-");
host_input_strn(stuff,1,0);
}
else if (option == 'L') { // Goodbye (Hang-up)
type_file("LAST.MSG");
ustamp("User logged off.", 1, 1);
if (we_care_about_carrier) {
delay(10);
hangup();
}
return;
}
else if (option == 'M') { // Sysop Message
host_send("^L");
host_send("┌────────────────────┐^M^J");
host_send("│ Message To Sysop │ ( 10 lines )^M^J");
host_send("└────────────────────┘^M^J");
host_send("( Hit enter on the 10th line to save )^M^J^M^J");
ustamp("",0,1);
ustamp("**** Message To Sysop **** ",0,1);
host_send("^M^J 1> ");
host_input_strn(stuff,78,0);
ustamp(stuff,0,1);
host_send("^M^J 2> ");
host_input_strn(stuff,78,0);
ustamp(stuff,0,1);
host_send("^M^J 3> ");
host_input_strn(stuff,78,0);
ustamp(stuff,0,1);
host_send("^M^J 4> ");
host_input_strn(stuff,78,0);
ustamp(stuff,0,1);
host_send("^M^J 5> ");
host_input_strn(stuff,78,0);
ustamp(stuff,0,1);
host_send("^M^J 6> ");
host_input_strn(stuff,78,0);
ustamp(stuff,0,1);
host_send("^M^J 7> ");
host_input_strn(stuff,78,0);
ustamp(stuff,0,1);
host_send("^M^J 8> ");
host_input_strn(stuff,78,0);
ustamp(stuff,0,1);
host_send("^M^J 9> ");
host_input_strn(stuff,78,0);
ustamp(stuff,0,1);
host_send("^M^J10> ");
host_input_strn(stuff,78,0);
ustamp(stuff,0,1);
ustamp(" **** End Of Message **** ",0,1);
ustamp("",0,1);
}
else if (option == 'Y') { // Chat mode
host_send("^L");
host_send("┌────────────────┐^M^J");
host_send("│ Paging Sysop │^M^J");
host_send("└────────────────┘^M^J^M^J");
printsc("─────» User: ");
printsc(current_caller);
printsc(" Access Level: ");
printc(access_level+48);
printsc(" «─────");
c = 0;
_sound_on = 1;
for (i = 4; i && !c; --i) {
if (we_care_about_carrier && !carrier()) {
prints("^M^JConnection has been lost, call terminated.^M^J");
connection_lost = 1;
finished_caller = 1;
break;
}
cputc('^G');
tone(475, 10);
tone(925, 10);
tone(475, 10);
tone(925, 10);
tone(475, 10);
tone(925, 10);
for (i2 = 30; i2 && (c = inkey()) == 0; --i2)
delay(1);
}
_sound_on = 0;
if (finished_caller)
continue;
if (c != ' ' || !c) {
host_send("^LSorry The Sysop Is Unavaliable!^M^J^M^J");
host_send("Leave Him A Short Message (5 Lines)^M^J");
ustamp("",0,1);
ustamp("**** Message To Sysop *** ",0,1);
host_send("^M^J1>");
host_input_strn(stuff,78,0);
ustamp(stuff,0,1);
host_send("^M^J2>");
host_input_strn(stuff,78,0);
ustamp(stuff,0,1);
host_send("^M^J3>");
host_input_strn(stuff,78,0);
ustamp(stuff,0,1);
host_send("^M^J4>");
host_input_strn(stuff,78,0);
ustamp(stuff,0,1);
host_send("^M^J^G5>");
host_input_strn(stuff,78,0);
ustamp(stuff,0,1);
ustamp(" **** End of Message **** ",0,1);
ustamp("",0,1);
continue;
}
host_send("^L");
host_send("┌─────────────┐^M^J");
host_send("│ Chat Mode │^M^J");
host_send("└─────────────┘^M^J^M^J");
ustamp("User chated with sysop.",1,1);
chatmode(1);
}
else if (option == 'F') // Files List
{
if (access_level >= 2) {
ustamp("User viewed the FILES",1,1);
type_file ("FILES.MSG");
host_send("-=> Hit Enter <=-");
host_input_strn(stuff,1,0);
}
else {
host_send("^M^J^G* Your Access Level Is Too Low *^G^M^J");
ustamp("Level 1 User Attempted To View FILES LIST.",1,1);
}
}
else if (option == 'B')
{
ustamp("User read BULLETINS",1,1);
type_file ("BULLETIN.MSG");
host_send("-=> Hit Enter <=-");
host_input_strn(stuff,1,0);
}
else if (option == 'V')
{
host_send("^L");
ustamp("User looked at VERSION information",1,1);
host_send("┌───────────────────────────────────────┐^M^J");
host_send("│ DBBS Version 1.3 By Dennis Seaton │^M^J");
host_send("│ │^M^J");
host_send("│ Released -=> March 27th 1988 │^M^J");
host_send("│ │^M^J");
host_send("│ Telix Support BBS -=> 416-284-0682 │^M^J");
host_send("└───────────────────────────────────────┘^M^J");
host_send("^M^J^M^J-=> Hit Enter <=-");
host_input_strn(stuff,1,0);
}
else if (option == 'O')
{
if (access_level >= 2) {
ustamp("User read the BBS list",1,1);
type_file("BBSNUM.MSG");
host_send("-=> Hit Enter <=-");
host_input_strn(stuff,1,0);
}
else {
host_send("^G* Your Access Level Is Too Low *^G^M^J");
ustamp("Level 1 User Attempted To View BBS LIST",1,1);
}
}
else if (option == 'C')
{
if (access_level == 3) {
host_send("^L");
host_send("┌───────────────┐^M^J");
host_send("│ Dos Command │^M^J");
host_send("└───────────────┘^M^J");
host_send("^M^J");
host_send("Enter Command -=> ");
host_input_strn(stuff, 78, 0);
ustamp("Level 3 user used DOS COMMAND",1,1);
dos(stuff,1);
}
else {
host_send("^G* Your Access Level Is Too Low *^G^M^J");
ustamp("User attempted to use DOS COMMAND",1,1);
}
}
else if (option == 'G')
{
if (access_level == 3) {
ustamp("Level 3 user viewed DBBS.LOG",1,1);
type_file("DBBS.LOG");
host_send("-=> Hit Enter <=-");
host_input_strn(stuff,1,0);
}
else {
host_send("^G* Your Access Level Is Too Low *^G^M^J");
ustamp("User Attempted To View DBBS.LOG",1,1);
}
}
else if (option == 'N')
{
ustamp("User read the NEW USER information",1,1);
type_file("NEWUSER.MSG");
host_send("-=> Hit Enter <=-");
host_input_strn(stuff,1,0);
}
else if (option == 'A') {
if (access_level >= 2) {
dos("DBBS.BAT", 0);
ustamp("User ran DBBS.BAT.",1,1);
}
else {
host_send("^M^J^G* Your Access Level Is Too Low *^G^M^J");
ustamp("Level 1 User Attempted To Run DBBS.BAT",1,1);
}
}
else if (option == 'E')
{
ustamp("User viewed the EXTRA INFORMATION file.",1,1);
type_file ("EXTRA.MSG");
host_send("-=> Hit Enter <=-");
host_input_strn(stuff,1,0);
}
else if (option == 'U') { // User upload
if (! (option = host_get_prot()))
continue;
status = 1;
if (option == 'T' || option == 'M' || option == 'S' ||
option == 'Y' || option == 'Z' || option == 'E') {
send_transfer_msg();
status = receive(option, "");
}
else {
host_send("Upload what file -> ");
host_input_strn(strn, 48, 0);
host_send("^M^J");
if (!strn)
continue;
if (access_level == 1) // if access 1, name and ext only
fnstrip(strn, 3, fname);
else
fname = strn;
if (just_filename(fname)) {
strn = host_uploads;
strcat(strn, fname);
fname = strn;
}
if (filefind(fname, 23, strn))
host_send("Thanks, but I've got that file already!^G^M^J");
else {
send_transfer_msg();
status = receive(option, fname);
}
}
if (status == -2) // Carrier lost
connection_lost = finished_caller = 1;
else if (status == -1)
host_send("^G-=> One or more files not received! <=-^M^J");
}
else if (option == 'S') { // Remote shell
if (get_port() != 1 && get_port() != 2) {
host_send("Remote Shell not supported on this comm port due to DOS limits!^M^J");
continue;
}
if (access_level == 3) { // Need access level 3 to shell
host_send("^L");
host_send("┌─────────────┐^M^J");
host_send("│ Dos Shell │^M^J");
host_send("└─────────────┘^M^J^M^J");
host_send(" - Do NOT hang up while in shell^M^J");
host_send(" - Most programs can NOT be ran through modem^M^J");
host_send(" - Type EXIT to return to DBBS ^M^J");
host_send(" ────^M^J");
if (get_baud() == 300)
delay(10);
strn = "GATE1"; // THE GATEWAY DRIVER IS NEEDED CHANGE GATE1 TO STRN
setchr("GATE1", 3, get_port() + '0'); // AND TAKE OUT QUOTES ON THIS LINE
// TO MAKE IT WORK WITH OUT GATEWAY. THIS IS
if (!local_mode) // SET UP FOR COM1 RIGHT NOW. * DBBS 1.1 *
if (redirect_dos("GATE1") == -1) // redirect DOS input and output
continue;
ustamp("Level 3 user jumped to shell.",1,1);
dos("", 0); // actually call the shell
if (!local_mode)
redirect_dos(""); // very important to put things back to norm
ustamp("User returned from dos shell.",1,1);
}
else {
host_send ("^G^G * Your Access Level Is Too Low *^M^J");
}
}
else if (option == 'K') { // Remote Shut down Host Mode
if (access_level == 3) {
host_send("┌──────────────────────────────────────┐^M^J");
host_send("│ User Shutting down DBBS. Goodbye! │^M^J");
host_send("└──────────────────────────────────────┘^M^J");
if (we_care_about_carrier)
hangup();
ustamp("Level 3 user shut down DBBS.", 1, 1);
finished_caller = 1;
exit_requested = 1;
}
else {
host_send ("^G^G * Your Access Level Is Too Low *^M^J");
}
}
else if (option == 'D') { // User download
if (access_level >= 2) {
if (! (option = host_get_prot()))
continue;
host_send("Download what file -=> ");
host_input_strn(strn, 48, 0);
host_send("^M^J");
if (!strn)
continue;
fname = strn;
if (just_filename(fname)) {
strn = host_downloads;
strcat(strn, fname);
fname = strn;
}
if (!filefind(fname, 0, strn)) {
host_send("^G* I dont have that file! *^M^J");
continue;
}
status = 1;
send_transfer_msg();
status = send(option, fname);
if (status == -2) // Carrier lost
connection_lost = finished_caller = 1;
else if (status == -1)
host_send("^G-=> One or more files NOT received! <=-^M^J");
}
else {
host_send("^M^J^G* Your Access Level Is Too Low *^G^M^J");
ustamp("Level 1 User Attempted To Download",1,1);
}
}
}
}
//////////////////////////////////////////////////////////////////////////////
host_get_prot() {
str prot[1];
host_send("^L");
host_send(" ┌─────────────────┐^M^J");
host_send(" │ File Transfer │^M^J");
host_send(" └─────────────────┘^M^J^M^J");
host_send("┌───────────────────────────────────┐^M^J");
host_send("│ [Z]modem [S]ealink │^M^J");
host_send("│ [X]modem [1]k-Xmodem │^M^J");
host_send("│ [G]-1k-Xmodem [Y]modem │^M^J");
host_send("└───────────────────────────────────┘^M^J");
host_send("^M^J Which protocol -=> ");
host_input_strn(prot, 1, 0);
host_send("^M^J");
if (strposi("MSX1GYEZ", prot, 0) == -1) // if illegal prot
prot = ""; // return 0
return (toupper(subchr(prot, 0)));
}
//////////////////////////////////////////////////////////////////////////////
send_transfer_msg() {
host_send("^L");
host_send("┌──────────────────────────────────────────────────────────────┐^M^J");
host_send("│ -=> Ready to transfer file(s)... Slam on Ctrl-X to abort <=- │^M^J");
host_send("└──────────────────────────────────────────────────────────────┘^M^J");
}
//////////////////////////////////////////////////////////////////////////////
// Determine the baud rate once a Carrier Detect Signal has been detected
// Since no characters were read, the 'CONNECT' string should still be
// in the receive buffer.
determine_baud() {
int t3, t12, t24, t96, t192;
int tmark, stat;
int new_baud = 0;
printsc("Determining baud... ");
track_free(0); // clear all existing tracks
t3 = track(conn300, 0); // check for connect strings
t12 = track(conn1200, 0);
t24 = track(conn2400, 0);
t96 = track(conn9600, 0);
t192 = track(conn19200, 0);
tmark = timer_start(30); // wait up to 3 seconds for string
while (!time_up(tmark)) {
if (!carrier()) {
track_free(0); // clear all existing tracks
return 0;
}
if (cinp_cnt())
track_addchr(cgetc());
stat = track_hit(0);
if (stat == 0)
continue;
if (stat == t3)
new_baud = 300;
else if (stat == t24)
new_baud = 2400;
else if (stat == t96)
new_baud = 9600;
else if (stat == t192)
new_baud = 19200;
else
new_baud = 1200;
break; // have baud rate, get out
}
if (!new_baud) { // time-up without CONNECT string
prints("Unknown!");
track_free(0); // clear all existing tracks
return 0;
}
printn(new_baud);
prints("");
set_cparams(new_baud, get_parity(), get_datab(), get_stopb());
track_free(0); // clear all existing tracks
return 1; // indicate success
}
//////////////////////////////////////////////////////////////////////////////
type_file(str fname) {
int f, control_z_loc;
str buf[100];
int ichar, lines_sent = 0;
if (not (f = fopen(fname, "r")))
return -1;
host_send("^M^J");
while (1) {
if (we_care_about_carrier) {
if (!carrier()) {
connection_lost = 1;
finished_caller = 1;
fclose(f);
return 0;
}
}
if (fgets(buf, 80, f) == -1) {
fclose(f);
return 1;
}
if ((control_z_loc = strpos (buf, "^Z", 0)) >= 0) {
if (control_z_loc == 0) {
fclose (f);
return 1;
}
else {
setchr (buf, control_z_loc, 0);
}
}
host_send(buf);
host_send("^M^J");
++lines_sent;
if (lines_sent >= 22222) { // This is just a pain in the butt,
lines_sent = 0; // who needs it!?
host_send("-=> Hit Enter <=-");
host_input(0);
if (finished_caller) { // if user inactivity
fclose(f);
return 0;
}
host_send("^H ^H^H ^H^H ^H^H ^H^H ^H^H ^H^H ^H");
}
while (cinp_cnt()) {
ichar = cgetc();
if (ichar == '^C' || ichar == '^K') {
host_send("^M^J");
fclose(f);
return 1;
}
}
}
}
//////////////////////////////////////////////////////////////////////////////
host_send(str outstr) {
printsc(outstr);
if (!local_mode)
cputs(outstr);
}
//////////////////////////////////////////////////////////////////////////////
host_send_c(int chr) {
printc(chr);
if (!local_mode)
cputc(chr);
}
//////////////////////////////////////////////////////////////////////////////
host_input_strn(str buf, int maximum, int echo_asterisk) {
//Rev 11/25/88 by Jon Fleming to echo a string of asterisks if
// "echo_asterisk" is non-zero, echo the input string if "echo_asterisk"
// is zero.
int i = 0, key;
while (1) {
key = host_input(echo_asterisk);
if (!key) { // timeout or user disconnect
setchr(buf, 0, 0); // set string to empty
return 0; // indicate there is a problem
}
if (key == '^M')
break;
if (key == 127 || key == 8) {
if (i) {
--i;
host_send_c(key);
}
continue;
}
if (i < maximum) {
setchr(buf, i, key);
i = i + 1;
}
else
i = i + 1;
}
if (i > maximum)
i = maximum;
setchr(buf, i, '^0');
if (subchr(buf, 0))
return 1;
else
return 0;
}
//////////////////////////////////////////////////////////////////////////////
host_input(int echo_asterisk) {
// Rev 11/25 88 by Jon Fleming to echo asterisk if "echo_asterisk" is
// non-zero, to echo the input character if "echo_asterisk" is zero.
// Rev 15/03 89 by Dennis Seaton to ditch the echo asterisk *DBBS 1.3*
int c, t;
t = timer_start(3000); // 4 minutes inactivity allowed
while (1) {
if (time_up(t) && !direct_connect) {
host_send("^L^M^J^M^J^G^G^GInactivity period too long! Goodbye!^M^J");
if (we_care_about_carrier)
hangup();
ustamp("User inactivity, hung up.",1,1);
finished_caller = 1;
kill_user = 1;
return 0;
}
if (we_care_about_carrier)
if (!carrier()) {
prints("^M^JConnection has been lost, call terminated.^M^J");
connection_lost = 1;
finished_caller = 1;
return 0;
}
// ****** DBBS 1.3 SYSOP UTILITIES ******
if ((c = inkey()) != 0) {
if (c == 0x4300) { // *F9 key* sysop wants to exit
host_send("^M^J* Sysop Terminating DBBS *^M^J");
ustamp("Sysop Terminated DBBS",1,1);
finished_caller = 1;
exit_requested = 1;
return 0;
}
else if (c == 0x3b00) { // *F1 key* Terminate Loser
host_send("^GSystem Lock Out! ^G GET LOST! ^M^J^M^J^M^J^G");
prints("^M^J* Jerk terminated! *");
ustamp("Bad User terminated!", 1, 1);
if (we_care_about_carrier)
hangup();
finished_caller = 1;
kill_user = 1;
return 0;
}
else if (c == 0x3c00) { // *F2 key* Dos Functions
host_send("^M^J");
host_send("┌───────────────┐^M^J");
host_send("│ Please Wait │^M^J");
host_send("└───────────────┘^M^J");
dosfunction();
host_send("^G");
return 0;
}
else if (c == 0x3d00) { // *F3 key* New user level
host_send("^M^J");
host_send("┌───────────────────────────────┐^M^J");
host_send("│ You are now at new user level │^M^J");
host_send("└───────────────────────────────┘^M^J");
host_send("^M^J");
access_level = 1;
ustamp("Sysop put user at level 1",1,1);
return 0;
}
else if (c == 0x3e00) { // *F4 key* Normal User Level
host_send("^M^J");
host_send("┌──────────────────────────────────┐^M^J");
host_send("│ You are now at normal user level │^M^J");
host_send("└──────────────────────────────────┘^M^J");
host_send("^M^J");
access_level = 2;
ustamp("Sysop put user at level 2",1,1);
return 0;
}
else if (c == 0x3f00) { // *F5 key* Sysop user level
host_send("^M^J");
host_send("┌─────────────────────────────────┐^M^J");
host_send("│ You are now at sysop user level │^M^J");
host_send("└─────────────────────────────────┘^M^J");
host_send("^M^J");
access_level = 3;
ustamp("Sysop put user at level 3",1,1);
return 0;
}
else if (c == 0x4000) { // *F6 key* Force Chat
host_send("^M^J");
ustamp("Sysop entered chat",1,1);
host_send("^L");
host_send("┌─────────────────────────┐^M^J");
host_send("│ Sysop now entering chat │^M^J");
host_send("└─────────────────────────┘^M^J^M^J");
t = timer_start(999999); // Neccessary or USER INACTIVITY kills user
chatmode(1);
t = timer_start(3000); // Return to normal
return 0;
}
else if (c == 0x4100) { // *F8 key* Use Telix.Fon Directory
host_send("^M^J");
host_send("┌───────────────┐^M^J");
host_send("│ Please Wait │^M^J");
host_send("└───────────────┘^M^J");
loadfon();
dial();
host_send("^G");
ustamp("Sysop used dialing directory",1,1);
return 0;
}
else if (c == 0x4200) { // *F8 key* Take User to Dos
if (get_baud() == 300)
delay(10);
setchr("GATE1", 3, get_port() + '0');
if (!local_mode) // SET UP FOR COM1 RIGHT NOW. * DBBS 1.1 *
if (redirect_dos("GATE1") == -1)
continue;
ustamp("User forced to shell with sysop.",1,1);
host_send("^L");
host_send("┌─────────────────────────────┐^M^J");
host_send("│ Sysop bringing you to dos │^M^J");
host_send("└─────────────────────────────┘^M^J");
dos("", 0);
if (!local_mode)
redirect_dos("");
ustamp("User returned from dos shell.",1,1);
return 0;
}
else if (c == 0x4400) { // *F10* Sysop Help Menu
clear_scr();
prints("╒══════════════════════════════════════╕");
prints("╞════════════╡ Sysop Menu ╞════════════╡");
prints("╞══════════════════════════════════════╡");
prints("│═══» KEY «══════» FUNCTION «══════════│");
prints("│ F1 ── Hang Up On User │");
prints("│ F2 ── Dos Functions │");
prints("│ F3 ── Make User Level 1 │");
prints("│ F4 ── Make User Level 2 │");
prints("│ F5 ── Make User Level 3 │");
prints("│ F6 ── Force Chat │");
prints("│ F7 ── Access Telix.fon │");
prints("│ F8 ── Jump To Dos With User │");
prints("│ F9 ── Exit To Telix │");
prints("│ F10 ── Display This Menu │");
prints("└──────────────────────────────────────┘");
}
else if (c <= 255) {
if (c != 8 && c != 127) {
if ( (echo_asterisk) && (c != 13) ) {
host_send_c(c);
}
else {
host_send_c(c);
}
}
return c;
}
}
if (!local_mode)
if (cinp_cnt()) {
c = cgetc();
if (c != 8 && c != 127) {
if ( (echo_asterisk) && (c != 13) ) {
host_send_c (c);
}
else {
host_send_c(c);
}
}
return c;
}
}
}
//////////////////////////////////////////////////////////////////////////////
// This routine maintains an ASCII file in the Telix files directory called
// PASSWORD.TLX. The format for each line is:
// name;password;access_level (optional comment)
// Changed by Dennis seaton, DBBS 1.3
ask_for_pass(int maxtries) {
str password_file[64], line_from_file[80], password_from_file[16],
name_from_file[31], temporary[16], typed_password[16];
int password_file_handle, field_length, field_start,
found_password = 0, access_from_file, counter = 0,
file_ends_in_control_z = 0, line_number = 0;
// Build password file name
password_file = _telix_dir;
strcat (password_file, "DBBSPASS.TLX");
// Try to open password file
if (password_file_handle = fopen (password_file, "r")) {
// Read next line from file.
while (fgets (line_from_file, 64, password_file_handle) != -1) {
// Check for ^Z termination
if (line_from_file == "^Z") {
file_ends_in_control_z = 1;
break;
}
line_number = line_number + 1;
// If line is long enough . . .
if (strlen (line_from_file) >= min_user_name+4) {
// Get length of name
if ( (field_length = strchr (line_from_file, 0, ';')) > 0) {
// Get name
substr (line_from_file, 0, field_length, name_from_file);
// If name matches . . . .
if (strcmpi (name_from_file, current_caller) == 0) {
// Get password
field_start = field_length + 1;
if ( (field_length = strchr (line_from_file, field_start, ';') - field_start) > 0) {
substr (line_from_file, field_start, field_length, password_from_file);
// Get access level
field_start = field_start + field_length + 1;
substr (line_from_file, field_start, 1, temporary);
access_from_file = stoi (temporary);
// Set flag that we got an old user
found_password = 1;
break;
}
else {
password_file_error (line_number, line_from_file, "no second semicolon");
ustamp("** Password file error! **",0,1);
}
}
}
else {
password_file_error (line_number, line_from_file, "no first semicolon");
ustamp("** Password file error! **",0,1);
}
}
else {
password_file_error (line_number, line_from_file, "line too short");
ustamp("** Password file error! **",0,1);
}
}
fclose (password_file_handle);
}
if (found_password) {
// Password is on file; ask for it
host_send ("Password -=> ");
for (counter = 1; counter <= maxtries; counter = counter + 1) {
host_input_strn (typed_password, 16, 1);
// If a match
if (strcmpi (typed_password, password_from_file) == 0) {
host_send ("^M^J");
return (access_from_file);
}
if (counter <maxtries) {
host_send ("^M^J^GWRONG PASSWORD! Try again.^M^J");
host_send ("Password -> ");
}
else {
host_send ("^L^M^J^G^GTOO MANY ATTEMPTS! ACCESS DENIED!^M^J^G^G");
}
}
}
// Password is not on file
else {
// Offer chance to register
host_send ("^L^M^J Hello ^"");
host_send (current_caller);
host_send ("^" , You are not found in the user file.^J^M^J^M");
host_send ("Would you like to register -=> ");
host_input_strn (temporary, 1, 0);
host_send ("^M^J");
// If user doesn't want to register
if (not ((temporary == "Y") || (temporary == "y"))) {
return (0);
}
// If user wants to register
// DBBS V1.3 QUESTIONAIRE CREATED
host_send("^L");
host_send("┌─────────────────────────────┐^M^J");
host_send("│ Registration Questionaire │^M^J");
host_send("└─────────────────────────────┘^M^J");
ustamp("",0,1);
ustamp("**** New User Answers to Registration Questionaire ****",0,1);
host_send("1. Enter your full REAL name ^M^J-=> ");
host_input_strn(stuff, 45, 1);
ustamp("1. Full Name -=> ");
ustamp(stuff,0,1);
host_send("^M^J^M^J2. Voice Phone Number ^M^J-=> ");
host_input_strn(stuff, 14, 1);
ustamp("2. Voice Phone Number -=> ");
ustamp(stuff,0,1);
host_send("^M^J^M^J3. Data Phone Number ^M^J-=> ");
host_input_strn(stuff, 14, 1);
ustamp("3. Data Phone Number -=> ");
ustamp(stuff,0,1);
host_send("^M^J^M^J4. Home Adress ^M^J-=> ");
host_input_strn(stuff, 50, 1);
ustamp("4. Home Adress -=> ");
ustamp(stuff,0,1);
host_send("^M^J^M^J5. Age ^M^J-=> ");
host_input_strn(stuff, 2, 1);
ustamp("5. Age -=> ");
ustamp(stuff,0,1);
host_send("^M^J^M^J6. Comment To Sysop (1 Line) ^M^J-=> ");
host_input_strn(stuff, 77, 1);
ustamp("6. Comment -=> ");
ustamp(stuff,0,1);
host_send ("^M^J^M^J7. Pick a password (16 characters max)^M^J-=> ");
host_input_strn (password_from_file, 16, 1);
ustamp("7. Password -=> ");
ustamp(password_from_file,0,1);
ustamp("",0,1);
ustamp("**** End Of New User Questionaire ****",0,1);
ustamp("",0,1);
host_send("^M^JRemeber your password! -=> ");
host_send(password_from_file);
host_send("^M^J^M^JThank you for answering the questions, if everything^M^J");
host_send("is correct, you will be validated soon.");
host_send("^M^J^M^JHit Enter To Continue -=> ");
host_input_strn(temporary,1,0);
// Build new line for password file
line_from_file = current_caller;
strcat (line_from_file, ";");
strcat (line_from_file, password_from_file);
strcat (line_from_file, ";1 ───» NEW USER «─── ");
date (curtime(), temporary);
strcat (line_from_file, temporary);
password_file_handle = fopen (password_file, "a+");
if (file_ends_in_control_z) {
fseek (password_file_handle, -1, 2);
}
fwrite (line_from_file, strlen (line_from_file), password_file_handle);
fwrite ("^M^J", 2, password_file_handle);
fclose (password_file_handle);
host_send ("^M^J");
return (1);
}
}
//////////////////////////////////////////////////////////////////////////////
password_file_error (int line_number, str line, str error_specifier) {
str line_number_string[4];
itos (line_number, line_number_string);
prints ("");
printsc ("* Sysop: Bad line ");
printsc (line_number_string);
prints (" in password file:");
printsc (" ^"");
printsc (line);
prints ("^"");
prints (error_specifier);
prints (" *^M^J");
return (1);
}
//////////////////////////////////////////////////////////////////////////////
// Rev 11/25/88 by **Jon Fleming** to not read the lines from the old host mode
// configuration file that are no longer applcable.
read_host_config_file() {
str config_file_name[80], buffer [32];
int config_file_handle;
config_file_name = _telix_dir;
strcat(config_file_name, "DBBS.CNF");
if (not (config_file_handle = fopen(config_file_name, "r"))) {
printsc("Can't open ");
prints(config_file_name);
return -1;
}
if (fgets(host_downloads, 80, config_file_handle) == -1) {
fclose(config_file_handle);
return -1;
}
if (fgets(host_uploads, 80, config_file_handle) == -1) {
fclose(config_file_handle);
return -1;
}
if (fgets(buffer, 80, config_file_handle) == -1) {
fclose(config_file_handle);
return -1;
}
direct_connect = (toupper(subchr(buffer, 0)) == 'D');
fclose(config_file_handle);
return 1;
}
//////////////////////////////////////////////////////////////////////////////
check_directories() {
str s[80];
int i, a;
// first remove trailing slashes
s = host_uploads;
i = strlen(s);
if (i > 0)
if (subchr(s, i - 1) == '\' || subchr(s, i - 1) == '/')
setchr(s, i - 1, 0);
if (s && !(strlen(s) == 2 && subchr(s, 1) == ':')) {
a = fileattr(s);
if (a == -1 || !(a & 16))
return 0; // not a directory or doesn't exist
}
s = host_downloads;
i = strlen(s);
if (i > 0)
if (subchr(s, i - 1) == '\' || subchr(s, i - 1) == '/')
setchr(s, i - 1, 0);
if (s && !(strlen(s) == 2 && subchr(s, 1) == ':')) {
a = fileattr(s);
if (a == -1 || !(a & 16))
return 0; // not a directory or doesn't exist
}
return 1;
}
//////////////////////////////////////////////////////////////////////////////
// returns TRUE if passed filespec is just a filename. Also handles the
// forward slash as a path separator.
just_filename(str filespec) {
int slash, space;
if (strpos(filespec, ":", 0) != -1)
return 0;
if (strpos(filespec, "\", 0) != -1)
return 0;
if ((slash = strpos(filespec, "/")) == -1)
return 1;
space = strpos(filespec, " ");
if (space == -1)
return 0;
if (space < slash)
return 1;
return 0;
}
// End of DBBS...