home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
1st Canadian Shareware Disc
/
1st_Canadian_Shareware_Disc_1991.ISO
/
comms
/
dbbs_12
/
dbbs1.slt
< prev
next >
Wrap
Text File
|
1989-02-21
|
38KB
|
1,148 lines
//////////////////////////////////////////////////////////////////////////////
//
// D B B S . S L T
//
// Copyright (C) 1988 PTel and Colin Sampaleanu
//
// This is a Host Mode for Telix, written as a script file.
// To configure Host Mode parameters such as passwords, run the 'HCONFIG'
// script. That script is run automatically if the Host Mode ocnfiguration
// file 'HOST.CNF' is missing.
//
// This script will only work with Hayes compatible modems, but may be
// modified for operation with othe rmodems.
//
//////////////////////////////////////////////////////////////////////////////
// Revised by Jon Fleming to use individual
// passwords, let anyone with level 3 access get at the shell or shut
// down host mode, and not display the shell option on the menu to those
// who don't have the access level to use it.
// * DBBS VERSION 1.1 *
// Revised By Dennis Seaton, made about 1000 little changes such as:
// Real menus!, Messages To sysop, Sysop can see what the user
// is doing in dos, More files can be displayed, just made it
// look 60% better by doing little things.
//
// * DBBS VERSION 1.2 *
// I was Pissed off at some people for stealing my ideas, So Im
// stealin some of theirs! Now with: User Status, Sysop functions,
// Batch Files, More Security, and again, tons of little changes.
//
// Parameters which can be configured
str password[16], //caller's password
host_downloads[64], // where users may download from
host_uploads[64]; // where uploaded files go
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() {
int c;
clear_scr();
if (read_host_config_file() == -1) {
prints("Unable to read HOST2.CNF...");
prints("Running DCONFIG, the Host Mode configuration script.^M^J");
call("DCONFIG");
if (read_host_config_file() == -1) {
prints("Still unable to read HOST2.CNF. Aborting Host Mode.^M^J");
return -1;
}
}
if (!check_directories()) {
prints("Either the upload or download directory as defined in the HOST2.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("Aborting Host Mode.");
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
usagelog("B: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) {
prints("^M^J* DBBS 1.2 * Waiting for someone to call...");
prints("Press Esc to exit, or 'L' for local test.^M^J");
do {
if (carrier()) {
local_mode = 0;
break;
}
c = inkey();
if (c) {
if (c == 27) {
exit_requested = 1;
break;
}
else if (c == 'l' || c == 'L') { // local test mode
prints("Local test mode entered");
local_mode = 1;
we_care_about_carrier = 0;
}
}
}
while (toupper(c) != 'L');
}
if (!exit_requested) {
host_send("^LDBBS Version 1.2 - By Dennis Seaton^G^M^J^M^J");
prints("* Sysop: Press Esc to exit, END to terminate user, Home for Dos Functions *");
_sound_on=1;
tone(500, 10);
tone(900, 10);
tone(500, 10);
tone(900, 10);
tone(500, 10);
tone(900, 10);
tone(500, 10);
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("B:DBBS.LOG");
return 1;
}
}
}
//////////////////////////////////////////////////////////////////////////////
do_one_caller() {
str strn[80], fname[64], temporary[1];
str stuff[78];
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("B:FIRST.MSG");
flushbuf();
while (1) {
host_send("Please Enter Your Alias -> ");
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("B:BULLETIN.MSG");
host_send("- More -");
host_input_strn(stuff,1,0);
while (1) {
if (finished_caller)
return;
printsc("^M^J-> User: ");
printsc(current_caller);
printsc(" Access Level: ");
printc(access_level+48);
printsc(" <-");
if (access_level <= 1) {
type_file("B:NEWMENU.MSG"); // New user Menu
host_send(" -> ");
}
else {
type_file("B:MENU.MSG"); // Normal Menu
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("^LRaw 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, "*.*");
}
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("^LType File^M^J");
host_send("=========^M^J^M^J");
host_send("Type what file -> ");
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- More -");
host_input_strn(stuff,1,0);
}
else if (option == 'L') { // Goodbye (Hang-up)
type_file("B:LAST.MSG");
ustamp("User logged off.", 1, 1);
if (we_care_about_carrier) {
delay(10);
hangup();
}
return;
}
else if (option == 'Y') { // Chat mode
host_send("^LChat Mode^M^J");
host_send("=========^M^J^M^J");
printsc("-> User: ");
printsc(current_caller);
printsc(" Access Level: ");
printc(access_level+48);
printsc(" <-");
host_send("^M^JPaging Sysop, You may leave a message if he is not in.^M^J");
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("But Leave Him A Short Message (5 Lines)^M^J");
ustamp("^G ** 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);
continue;
}
host_send("^M^JHi, how can I help you?^M^J^M^J");
chatmode(1);
}
else if (option == 'F') // Files List
{
if (access_level >= 2) {
type_file ("B:FILES.BBS");
host_send("- More -");
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')
{
type_file ("B:BULLETIN.MSG");
host_send("- More -");
host_input_strn(stuff,1,0);
}
else if (option == 'I')
{
if (access_level >= 2) {
type_file("B:BBSNUM.LST");
host_send("- More -");
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 == '*')
{
if (access_level == 3) {
type_file("B:DBBS.LOG");
host_send("- More -");
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')
{
type_file("B:NEWUSER.IFO");
host_send("- More -");
host_input_strn(stuff,1,0);
}
else if (option == 'A') {
if (access_level >= 2) {
dos("B: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')
{
type_file ("B:EXTRA.IFO");
host_send("- More -");
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 == 'D') { // User download
if (access_level >= 2) {
if (! (option = host_get_prot()))
continue;
host_send("^M^JAnother download leech eh?^M^J");
host_send("Download what file(s) -> ");
host_input_strn(strn, 48, 0);
host_send("^M^J");
if (!strn)
continue;
if (access_level == 1) // if level 1, keep only name & ext
fnstrip(strn, 3, fname);
else
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);
}
}
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("^LDos Shell^M^J");
host_send("=========^M^J^M^J");
host_send(" - Please, do not delete anything!^M^J");
host_send(" - Type EXIT to return to DBBS ^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.
if (redirect_dos("GATE1") == -1) // redirect DOS input and output
continue;
dos("", 0); // actually call the shell
if (!local_mode)
redirect_dos(""); // very important to put things back to norm
}
else {
host_send ("^G^G * Your Access Level Is Too Low *^M^J");
}
}
else if (option == '^Z') { // Shut down Host Mode
if (access_level == 3) {
host_send("Shutting down DBBS. Goodbye!^M^J");
if (we_care_about_carrier)
hangup();
ustamp("User shut down Host Mode.", 1, 1);
finished_caller = 1;
exit_requested = 1;
}
else {
host_send ("^G^G * Your Access Level Is Too Low *^M^J");
}
}
}
}
//////////////////////////////////////////////////////////////////////////////
host_get_prot() {
str prot[1];
host_send("^L File Transfer^M^J");
host_send(" =============^M^J^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 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("-> Ready to transfer file(s)... Slam on Ctrl-X to abort <-^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("Failed!");
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) {
lines_sent = 0;
host_send("- More -");
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.
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();
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;
}
if ((c = inkey()) != 0) {
if (c == 27) { // ESC key, sysop wants to exit
host_send("^M^J* Sysop Terminating DBBS *^M^J");
finished_caller = 1;
exit_requested = 1;
return 0;
}
else if (c == 0x4f00) { // END key, temrinate user
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 == 0x4700) {
host_send("^M^J^M^J* Please Wait, Sysop is using DOS functions *");
ustamp("Sysop used DOS functions.",1,1);
dosfunction();
host_send("^M^J^M^J* Thanks for waiting *^M^J^M^J");
return 0;
}
else if (c <= 255) {
if (c != 8 && c != 127) {
if ( (echo_asterisk) && (c != 13) ) {
host_send_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 ('*');
}
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)
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, "PASSWORD.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");
}
}
}
else {
password_file_error (line_number, line_from_file, "no first semicolon");
}
}
else {
password_file_error (line_number, line_from_file, "line too short");
}
}
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^G WRONG 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
host_send("^LRegistration Questionaire^M^J");
host_send("=========================^M^J^M^J");
host_send ("Pick a password (16 characters maximum) -> ");
host_input_strn (password_from_file, 16, 1);
host_send ("^M^JRe-Enter Your Password To Verify -> ");
for (counter = 1; counter <= maxtries; counter = counter + 1) {
host_input_strn (typed_password, 16, 1);
// If all is ok
if (strcmpi (typed_password, password_from_file) == 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);
}
if (counter < maxtries){
host_send ("^M^J^GWrong! Try again -> ");
}
else {
host_send ("^M^J^GMaximum amount of tries exceeded!^G^M^J");
}
}
}
return (0);
}
//////////////////////////////////////////////////////////////////////////////
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, "HOST2.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...