// // bix.slt // // A Telix SALT script for logging onto BIX through Tymnet. // // D. H. Rifkind 1 Dec 89 // // This was originally part of a much longer "blink" script // that logged on, captured all new messages and mail, and // logged off again...in case you're wondering about the // unnecessary complexity of things like errmsg() and // conn_wait(). // // Configuration parameters str dialing_entry[] = "1"; // Dialing directory entry for BIX str user_name[] = "your_name"; // Your BIX user name int max_dial_retries = 5; // Maximum times to redial (will hang // up and try again on excessive line // noise) int max_connect_retries = 25; // Maximum times to retry connecting to // BIX (if host busy) // // main // main() { int status; int logged_on = 0; status = log_on(); return status; } // // log_on // // Dials Tymnet, negotiates through and logs on to BIX. // Returns 1 on failure, 0 on success. // log_on() { int dial_retry, connect_retry; int log_in_1, log_in_2, enter_name; int line_noise_1, line_noise_2; int bad_news; int connect_wait, retry_pause; int got_log_in; for (dial_retry = 0; dial_retry < max_dial_retries; ++dial_retry) { if (!carrier()) { if (!dial(dialing_entry, 10, 1)) goto HANGUP_AND_RETRY; delay_scr(5); if (!carrier()) goto HANGUP_AND_RETRY; } _local_echo = 1; // Possibly got reset from directory track_free(0); log_in_1 = track("log in: ", 0); log_in_2 = track("user name: ", 0); bad_news = track("system maintenance", 0); enter_name = track("Name? ", 0); delay_scr(50); // Wait out Tymnet garbage cputc('a'); // Terminal identifier line_noise_1 = track("{", 0); // Or enter your favorite line noise line_noise_2 = track("~", 0); // characters here for (connect_retry = -1; connect_retry < max_connect_retries; ++connect_retry) { timer_free(0); connect_wait = timer_start(300); retry_pause = timer_start(50); for (got_log_in = 0;;) { terminal(); if (time_up(connect_wait) || !carrier()) goto HANGUP_AND_RETRY; if (track_hit(line_noise_1) || track_hit(line_noise_2)) goto HANGUP_AND_RETRY; if (track_hit(bad_news)) { waitfor("log in:", 30); return errmsg("BIX is closed"); } if (track_hit(log_in_1) || track_hit(log_in_2)) { got_log_in = 1; timer_restart(retry_pause, 50); } if (got_log_in) { if (connect_retry < 0 || time_up(retry_pause)) break; } if (track_hit(enter_name)) goto ENTER_USER_NAME; } cputc('^H'); // Turn off Tymnet echo xputs("bix^M"); } return errmsg("Can't get through to BIX"); ENTER_USER_NAME: xputs(user_name); xputc('^M'); if (!conn_wait("Password: ", 30)) goto HANGUP_AND_RETRY; if (strlen(_entry_pass) != 0) { printc('^M'); cputs(_entry_pass); cputc('^M'); } track_free(0); // No sense tracking that stuff now return 0; HANGUP_AND_RETRY: if (carrier()) { if (!hangup()) return 1; } } return errmsg("No response from Tymnet"); } // // errmsg // // Displays an error message on the screen. Returns 1 // so that it can be used like: // // return errmsg("Modem caught fire"); // errmsg(str msg) { printsc("^M^J*** "); prints(msg); return 1; } // // xputs // // Writes a string both to the screen and the serial port. // xputs(str s) { printsc(s); cputs(s); } // // xputc // // Writes a single character to the screen and serial port. // xputc(int c) { printc(c); cputc(c); } // // conn_wait // // Like waitfor(), but fails if the connection is lost. // conn_wait(str s, int t) { int track_s; int timer_t; int success = 0; // Cautious use of timer and track handles. track_s = track(s, 0); timer_t = timer_start(t * 10); do { terminal(); if (!carrier() || time_up(timer_t)) break; } while ((success = track_hit(track_s)) == 0); track_free(track_s); timer_free(timer_t); return success; } // End of bix.slt