/*--------------------------------------------------------------------------*/ /* */ /* ------------ Bit-Bucket Software */ /* \ 10001101 / Writers and Distributors of */ /* \ 011110 / No-Cost Software. */ /* \ 1011 / */ /* ------ */ /* */ /* Copyright (C) 1987, 1988, 1989 by Robert Hartman and Vincent Perriello */ /* */ /* */ /* This module was written by Vince Perriello */ /* */ /* */ /* */ /* This file contains a sample YooHoo sender and receiver module. You may */ /* use it in any program, provided you give credit to Bit-Bucket Software */ /* in any informational screens or literature pertaining to your program */ /* that contains other such information (such as your own copyrights). */ /* */ /* */ /*--------------------------------------------------------------------------*/ #include #include #include #include #include #define WAZOO_SECTION #define MATRIX_SECTION #define isBITBRAIN 0x1b #include "com.h" #include "xfer.h" #include "zmodem.h" #include "keybd.h" #include "sbuf.h" #include "sched.h" #include "externs.h" #include "prototyp.h" static int Send_Hello_Packet (int); static int Recv_Hello_Packet (void); /*--------------------------------------------------------------------------*/ /* YOOHOO SENDER (used when I am the CALLING system) */ /*--------------------------------------------------------------------------*/ int YooHoo_Sender (void) { char *sptr; if (un_attended && fullscreen) { sb_move (filewin, 2, 2); sb_puts (filewin, "YooHoo"); sb_show (); } else { set_xy ("YooHoo "); } if (!Send_Hello_Packet (1)) sptr = "No Send"; else { if (TIMED_READ (30) == YOOHOO) return Recv_Hello_Packet (); status_line ("!No YOOHOO/2U2"); sptr = IDUNNO_msg; } message (sptr); return (0); } /*--------------------------------------------------------------------------*/ /* YOOHOO RECEIVER (Used when I am the CALLED system) */ /*--------------------------------------------------------------------------*/ int YooHoo_Receiver (void) { int i; int c; if (un_attended && fullscreen) { sb_move (filewin, 2, 2); sb_puts (filewin, "YooHoo"); sb_show (); } else { set_xy ("YooHoo "); } if (!(i = Recv_Hello_Packet())) return (0); for (i = 0; (CARRIER) && (i < 10); i++) { if ((c = TIMED_READ (10)) == ENQ) return Send_Hello_Packet (0) ? 1 : (b_init (), 0); if (c > 0) { message (NULL); cprintf ("[%x] ", c); CLEAR_INBOUND (); } SENDBYTE (YOOHOO); } hup = 1; message (FUBAR_msg); b_init (); return (0); } /* YooHoo Receiver */ /*--------------------------------------------------------------------------*/ /* SEND HELLO PACKET */ /*--------------------------------------------------------------------------*/ static int Send_Hello_Packet (Sender) int Sender; { int i; struct _Hello Hello; byte *sptr; long response_timer; word crc; word num_errs = 0; /*--------------------------------------------------------------------*/ /* Setup HELLO structure */ /*--------------------------------------------------------------------*/ memset ((char *) &Hello, 0, sizeof (struct _Hello)); Hello.signal = 'o'; Hello.hello_version = 1; Hello.product = isBITBRAIN; Hello.product_maj = BINK_MAJVERSION; Hello.product_min = BINK_MINVERSION; strncpy (Hello.my_name, system_name, 58); Hello.my_name[58] = '\0'; strncpy (Hello.sysop, sysop, 19); Hello.sysop[19] = '\0'; Hello.my_zone = alias[assumed].Zone; if ((pvtnet >= 0) && (Sender) && ((called_zone == alias[assumed].Zone) || (called_zone == 0)) && (called_net == boss_net) && (called_node == boss_node)) { Hello.my_net = boss_net; Hello.my_node = boss_node; Hello.my_point = alias[assumed].Node; } else { Hello.my_net = alias[assumed].Net; Hello.my_node = alias[assumed].Node; } Hello.capabilities = (no_zapzed) ? 0 : ZED_ZAPPER; Hello.capabilities |= Y_DIETIFNA; #ifdef JANUS if (janus_baud >= cur_baud) Hello.capabilities |= DOES_IANUS; #endif if (n_getpassword (remote_zone, remote_net, remote_node)) { strncpy (Hello.my_password, remote_password, 8); } if ((matrix_mask & TAKE_REQ) && ((!Sender) || (on_our_nickel))) Hello.capabilities |= WZ_FREQ; /*--------------------------------------------------------------------*/ /* Disable handshaking and ^C/^K handling */ /*--------------------------------------------------------------------*/ XON_DISABLE (); /*--------------------------------------------------------------------*/ /* Send the packet. */ /* Load outbound buffer quickly, and get modem busy sending. */ /*--------------------------------------------------------------------*/ xmit_packet: SENDBYTE (0x1f); sptr = (char *) (&Hello); SENDCHARS (sptr, 128, 1); /*--------------------------------------------------------------------*/ /* Calculate CRC while modem is sending its buffer */ /*--------------------------------------------------------------------*/ for (crc = i = 0; i < 128; i++) { crc = xcrc (crc, (byte) sptr[i]); } CLEAR_INBOUND (); SENDBYTE ((unsigned char) (crc >> 8)); SENDBYTE ((unsigned char) (crc & 0xff)); response_timer = timerset (4000); while (!timeup(response_timer) && CARRIER) { if (!CHAR_AVAIL ()) { if (got_ESC ()) { DTR_OFF (); sptr = KBD_msg; goto no_response; } time_release (); continue; } switch (i = TIMED_READ (0)) { case ACK: return (1); case '?': message ("drats"); case ENQ: if (++num_errs == 10) { sptr = FUBAR_msg; goto no_response; } goto xmit_packet; default: if (i > 0) /* Could just be line noise */ { /* cprintf ("[%x] ", i);*/ } break; } } if (!CARRIER) sptr = CARRIER_msg; else sptr = TIME_msg; no_response: message (sptr); return (0); } /* Send Hello */ /*--------------------------------------------------------------------------*/ /* RECEIVE HELLO PACKET */ /*--------------------------------------------------------------------------*/ static int Recv_Hello_Packet (void) { int i; int c; struct _Hello Hello; byte *sptr; byte num_errs = 0; word crc; word lsb; word msb; long master_timeout, hello_timeout; char junkbuff[128]; hup = 0; sptr = NULL; /*--------------------------------------------------------------------*/ /* Clean up any mess that may be around */ /*--------------------------------------------------------------------*/ CLEAR_OUTBOUND (); CLEAR_INBOUND (); XON_DISABLE (); /*--------------------------------------------------------------------*/ /* Get the Hello structure */ /*--------------------------------------------------------------------*/ /* big_pause (1); */ /* Wait for quiet. */ if (un_attended && fullscreen) { sb_move (filewin, 2, 2); sb_puts (filewin, "YooHoo/2U2"); sb_show (); } else { set_xy ("YooHoo/2U2 "); } SENDBYTE (ENQ); /* Let the other system know * we heard YooHoo. */ master_timeout = timerset (12000); /* No more than 2 mins! */ watch_for_header: while (1) { if (sptr) { message (sptr); sptr = NULL; } if ((c = TIMED_READ (20)) == 0x1f) break; if (got_ESC ()) { sptr = KBD_msg; goto receive_failed; } if (!CARRIER) { sptr = CARRIER_msg; goto receive_failed; } if (timeup(master_timeout)) goto timeout; if (c >= 0) /* noise? */ { hello_timeout = timerset (1000); /* Look for up to 10 secs */ while (((c = PEEKBYTE ()) >= 0) && (c != 0x1f) && (CARRIER)) { if (timeup(hello_timeout)) break; MODEM_IN (); /* Eat non-YooHoo chars */ } if (c != 0x1f) /* If we didn't get YooHoo */ { CLEAR_INBOUND (); /* Throw out what we have */ SENDBYTE (ENQ); /* Start over with ENQ */ } } } /* while */ /*receive_packet:*/ sptr = (char *) (&Hello); hello_timeout = timerset (3000); for (i = 0, crc = 0; i < 128; i++) { while (PEEKBYTE () < 0) { if (timeup (master_timeout) || timeup (hello_timeout)) goto timeout; if (got_ESC ()) { sptr = KBD_msg; goto receive_failed; } if (!CARRIER) { sptr = CARRIER_msg; goto receive_failed; } time_release (); } c = TIMED_READ (0); sptr[i] = (char) c; crc = xcrc (crc, (byte) c); } if (!CARRIER) { sptr = CARRIER_msg; goto receive_failed; } if (((msb = TIMED_READ (10)) < 0) || ((lsb = TIMED_READ (10)) < 0)) { sptr = SHRT_msg; goto hello_error; } if (((msb << 8) | lsb) == crc) goto process_hello; sptr = CRC_msg; hello_error: if (timeup(master_timeout)) goto timeout; if ((num_errs++) > 10) { sptr = FUBAR_msg; goto receive_failed; } CLEAR_INBOUND (); SENDBYTE ('?'); goto watch_for_header; process_hello: Hello.my_name[42] = '\0'; Hello.sysop[19] = '\0'; remote_zone = Hello.my_zone; remote_net = Hello.my_net; remote_node = Hello.my_node; remote_point = Hello.my_point; remote_capabilities = (Hello.capabilities) | Y_DIETIFNA; if (nodefind (remote_zone, remote_net, remote_node, 0) && !remote_zone) remote_zone = found_zone; sprintf (junkbuff, "*%s (%u:%u/%u.%u)", Hello.my_name, remote_zone, remote_net, remote_node, remote_point); status_line (junkbuff); if ((pvtnet >= 0) && ((remote_zone == alias[assumed].Zone) || (remote_zone == 0)) && (remote_net == boss_net) && (remote_node == boss_node) && (remote_point > 0)) { remote_net = pvtnet; remote_node = Hello.my_point; remote_point = 0; } switch (Hello.product) { case isBITBRAIN: case isFIDO: case isSPARK: case isSEA: case isHENK: case isTABBIE: case isWOLF: case isQMM: case isFD: case isTERUS: case isCYGNUS: case isGSPOINT: case isBGMAIL: case isCROSSBOW: case isDBRIDGE: case isDAISY: case isTHEBOX: status_line ("*Remote uses %s Version %d.%02d", prodcode[Hello.product], Hello.product_maj, Hello.product_min); break; case isOPUS: status_line ("*Remote Uses Opus Version %d.%02d", Hello.product_maj, (Hello.product_min == 48) ? 0 : Hello.product_min); break; default: status_line ("*Remote Uses Program '%02x' Version %d.%02d", Hello.product, Hello.product_maj, Hello.product_min); break; } if (Hello.sysop[0]) status_line (":Sysop: %s", Hello.sysop); if (remote_point > 0) { remote_point = 0; remote_node = -1; } if (n_getpassword (remote_zone, remote_net, remote_node)) { if (n_password (Hello.my_password, remote_password)) { DTR_OFF (); /* He'll never get it right */ timer (2); /* Wait two secs */ sptr = NULL; /* Already logged something */ goto receive_failed; } } CLEAR_INBOUND (); SENDBYTE (ACK); SENDBYTE (YOOHOO); return (1); timeout: sptr = TIME_msg; receive_failed: hup = 1; message (sptr); b_init (); return (0); } /* Recv Hello */ /* END OF FILE: yoohoo.c */