/*--------------------------------------------------------------------------*/ /* */ /* */ /* ------------ Bit-Bucket Software, Co. */ /* \ 10001101 / Writers and Distributors of */ /* \ 011110 / Freely Available Software. */ /* \ 1011 / */ /* ------ */ /* */ /* (C) Copyright 1987-96, Bit Bucket Software Co. */ /* */ /* This module was written by Tobias Burchhardt */ /* */ /* BinkleyTerm EMSI-Handshake Processor */ /* */ /* */ /* For complete details of the licensing restrictions, please refer */ /* to the License agreement, which is published in its entirety in */ /* the MAKEFILE and BT.C, and also contained in the file LICENSE.260. */ /* */ /* USE OF THIS FILE IS SUBJECT TO THE RESTRICTIONS CONTAINED IN THE */ /* BINKLEYTERM LICENSING AGREEMENT. IF YOU DO NOT FIND THE TEXT OF */ /* THIS AGREEMENT IN ANY OF THE AFOREMENTIONED FILES, OR IF YOU DO */ /* NOT HAVE THESE FILES, YOU SHOULD IMMEDIATELY CONTACT BIT BUCKET */ /* SOFTWARE CO. AT ONE OF THE ADDRESSES LISTED BELOW. IN NO EVENT */ /* SHOULD YOU PROCEED TO USE THIS FILE WITHOUT HAVING ACCEPTED THE */ /* TERMS OF THE BINKLEYTERM LICENSING AGREEMENT, OR SUCH OTHER */ /* AGREEMENT AS YOU ARE ABLE TO REACH WITH BIT BUCKET SOFTWARE, CO. */ /* */ /* */ /* You can contact Bit Bucket Software Co. at any one of the following */ /* addresses: */ /* */ /* Bit Bucket Software Co. FidoNet 1:104/501, 1:343/491 */ /* P.O. Box 460398 AlterNet 7:42/1491 */ /* Aurora, CO 80046 BBS-Net 86:2030/1 */ /* Internet f491.n343.z1.fidonet.org */ /* */ /* Please feel free to contact us at any time to share your comments about */ /* our software and/or licensing policies. */ /* */ /*--------------------------------------------------------------------------*/ /* Include this file before any other includes or defines! */ #include "includes.h" static int LOCALFUNC Send_EMSI_Packet (int); static int LOCALFUNC Recv_EMSI_Packet (int); static int LOCALFUNC get_emsi (char *); static char *LOCALFUNC b7strcat (char *, char *); static int LOCALFUNC recode_from_b7 (char *, int); static int LOCALFUNC match_aka (ADDRP); static char *LOCALFUNC get_bracket (char *); static char *LOCALFUNC cat_bracket (char *, char *); static int LOCALFUNC get_level (ADDRP addr, ADDRP myaka); static int LOCALFUNC Encode_EMSI_Header (char *, int); static int LOCALFUNC Decode_EMSI_Header (char *, int, int); static int highest_level, hl_aka; /* Used for passwording */ /*--------------------------------------------------------------------------*/ /* EMSI SENDER (used when I am the CALLING system) */ /*--------------------------------------------------------------------------*/ int EMSI_Sender (void) { char *sptr; highest_level = hl_aka = num_rakas = 0; sptr = NULL; if (un_attended && fullscreen) { sb_move (filewin, 2, 2); sb_puts (filewin, MSG_TXT (M_EMXMIT)); sb_show (); } else { set_xy (MSG_TXT (M_EMSEND)); } /*--------------------------------------------------------------------*/ /* Clean up any mess that may be around */ /*--------------------------------------------------------------------*/ CLEAR_INBOUND (); XON_DISABLE (); if (!Send_EMSI_Packet (1)) { sptr = MSG_TXT (M_HE_HUNG_UP); status_line (sptr); return (0); } if (un_attended && fullscreen) { sb_move (filewin, 2, 2); sb_puts (filewin, MSG_TXT (M_EMWAIT)); sb_show (); } else { set_xy (MSG_TXT (M_EMRECV)); } return Recv_EMSI_Packet (1); } /*--------------------------------------------------------------------------*/ /* EMSI RECEIVER (Used when I am the CALLED system) */ /*--------------------------------------------------------------------------*/ int EMSI_Receiver (void) { int i; highest_level = hl_aka = num_rakas = 0; if (un_attended && fullscreen) { sb_move (filewin, 2, 2); sb_puts (filewin, MSG_TXT (M_EMWAIT)); sb_show (); } else { set_xy (MSG_TXT (M_EMRECV)); } /*--------------------------------------------------------------------*/ /* Clean up any mess that may be around */ /*--------------------------------------------------------------------*/ CLEAR_OUTBOUND (); XON_DISABLE (); if (Recv_EMSI_Packet (0) == 0) return (0); if (un_attended && fullscreen) { sb_move (filewin, 2, 2); sb_puts (filewin, MSG_TXT (M_EMXMIT)); sb_show (); } else { set_xy (MSG_TXT (M_EMSEND)); } if ((i = Send_EMSI_Packet (0)) == 0) b_init (); return (i); } /* EMSI Receiver */ /*--------------------------------------------------------------------------*/ /* SEND EMSI PACKET */ /*--------------------------------------------------------------------------*/ static int LOCALFUNC Send_EMSI_Packet (int Sender) { int i; char *sptr; long T1, T2; word crc, len; word tries = 0; char *junkbuff, *uni; /* * Txbuf is (8192+16) in length * junkbuff wants to be 4096 * uni wants to be 256 * We reserve the last 1024+16 for lower level functions * * If you change this way of doing things, you have to change * Encode_EMSI_Header as well!!! */ junkbuff = (char *) Txbuf; uni = &junkbuff[4096]; /*--------------------------------------------------------------------*/ /* Setup EMSI structure */ /*--------------------------------------------------------------------*/ len = Encode_EMSI_Header (junkbuff, Sender); /*--------------------------------------------------------------------*/ /* Disable handshaking and ^C/^K handling */ /*--------------------------------------------------------------------*/ XON_DISABLE (); /*--------------------------------------------------------------------*/ /* Send the packet. */ /* Load outbound buffer quickly, and get modem busy sending. */ /*--------------------------------------------------------------------*/ tries = 0; T1 = timerset (6000); xmit_packet: sprintf (uni, "%s%04X", &(emsistr[EMSI_DAT][2]), len); crc = crc_block ((unsigned char *) uni, strlen (uni)); SENDCHARS ("**", 2, 1); SENDCHARS (uni, strlen (uni), 1); SENDCHARS (junkbuff, len, 1); /*--------------------------------------------------------------------*/ /* Calculate CRC while modem is sending its buffer */ /*--------------------------------------------------------------------*/ for (i = 0; i < (int) len; i++) crc = xcrc (crc, junkbuff[i]); CLEAR_INBOUND (); sprintf (uni, "%04X\r", crc); SENDCHARS (uni, strlen (uni), 1); if (tries++ > 6) { (void) sprintf (uni, "!%s", MSG_TXT (M_TIMEOUT)); sptr = uni; goto no_response; } /* wait_response: */ T2 = timerset (2000); while (!timeup (T1) && CARRIER) { if (timeup (T2)) goto xmit_packet; if (!CHAR_AVAIL ()) { if (got_ESC ()) { LOWER_DTR (); sptr = MSG_TXT (M_KBD_MSG); goto no_response; } time_release (); continue; } switch (i = TIMED_READ (0)) { case '*': strcpy (uni, "*"); if (!get_emsi (uni)) break; if (!stricmp (uni, emsistr[EMSI_REQ])) continue; if (!stricmp (uni, emsistr[EMSI_ACK])) return (1); goto xmit_packet; default: if (i <= 0) /* MB *//* Could just be line noise if > 0*/ time_release ();/*PLF Sun 12-01-1991 04:21:14 */ break; } } if (!CARRIER) sptr = MSG_TXT (M_NO_CARRIER); else { (void) sprintf (uni, "!%s", MSG_TXT (M_TIMEOUT)); sptr = uni; } no_response: status_line (sptr); return (0); } /* Send EMSI */ /*--------------------------------------------------------------------------*/ /* RECEIVE EMSI PACKET */ /*--------------------------------------------------------------------------*/ static int LOCALFUNC Recv_EMSI_Packet (int Sender) { int i; int c; int len; char *sptr; byte tries = 0; word crc, crc2; long T1, T2, T3; char *junkbuff, *uni, *help; /* * Txbuf is (8192+16) in length * junkbuff wants to be 4096 * uni wants to be 256 * help wants to be 256 * tmpstr wants to be 256 * We reserve the last 1024+16 for lower level functions * * If you change this way of doing things, you have to change * Decode_EMSI_Header as well!!! */ junkbuff = (char *) Txbuf; uni = &junkbuff[4096]; help = &uni[256]; /* tmpstr = &help[256]; */ /* strcpy (remote_sysop, "Sysop"); */ remote_password = NULL; /*--------------------------------------------------------------------*/ /* Get the EMSI structure */ /*--------------------------------------------------------------------*/ if (un_attended && fullscreen) { sb_move (filewin, 2, 2); sb_puts (filewin, MSG_TXT (M_EMWAIT)); sb_show (); } else { set_xy (MSG_TXT (M_EMRECV)); } remote_pickup = 2; /* Pickup for all akas */ T1 = timerset (2000); T2 = timerset (6000); sptr = NULL; request_it: if (tries++ > 6) goto timeout; if (!Sender) { sprintf (uni, "%s\r", emsistr[EMSI_REQ]); /* EMSI_REQ if he called me */ } else if (tries > 1) { sprintf (uni, "%s\r", emsistr[EMSI_NAK]); /* EMSI_NAK anytime after 1st*/ } else goto watch_for_header; SENDCHARS (uni, strlen (uni), 1); /* Kick the other guy. */ new_timer: T1 = timerset (2000); watch_for_header: while (!timeup (T2) && CARRIER) { if (sptr) { status_line (sptr); sptr = NULL; } if (timeup (T1)) goto request_it; if (!CHAR_AVAIL ()) { if (got_ESC ()) { LOWER_DTR (); sptr = MSG_TXT (M_KBD_MSG); goto receive_failed; } time_release (); continue; } switch (i = TIMED_READ (0)) { case '*': strcpy (uni, "*"); if (!get_emsi (uni)) break; if (!stricmp (uni, emsistr[EMSI_HBT])) goto new_timer; if (!stricmp (uni, emsistr[EMSI_DAT])) goto receive_packet; break; default: if (i <= 0) /* MB *//* Could just be line noise if > 0 */ time_release ();/*PLF Sun 12-01-1991 04:21:14 */ break; } } if (timeup (T2)) goto timeout; if (!CARRIER) { sptr = MSG_TXT (M_NO_CARRIER); goto receive_failed; } receive_packet: if (un_attended && fullscreen) { sb_move (filewin, 2, 2); sb_puts (filewin, MSG_TXT (M_EMRCPT)); sb_show (); } T3 = timerset (6000); if (((int) (uni[0] = (char) TIMED_READ (3)) < 0) || ((int) (uni[1] = (char) TIMED_READ (3)) < 0) || ((int) (uni[2] = (char) TIMED_READ (3)) < 0) || ((int) (uni[3] = (char) TIMED_READ (3)) < 0)) { sptr = MSG_TXT (M_EMSHORT); goto emsi_error; } if (!CARRIER) { sptr = MSG_TXT (M_NO_CARRIER); goto receive_failed; } uni[4] = '\0'; sscanf (uni, "%x", &len); sprintf (help, "%s%s", &(emsistr[EMSI_DAT][2]), uni); crc = crc_block ((unsigned char *) help, strlen (help)); sptr = junkbuff; memset (junkbuff, 0, 4096); for (i = 0; i < len; i++) { while (PEEKBYTE () < 0) { if (timeup (T2) || timeup (T3)) goto timeout; if (got_ESC ()) { sptr = MSG_TXT (M_KBD_MSG); goto receive_failed; } if (!CARRIER) { sptr = MSG_TXT (M_NO_CARRIER); goto receive_failed; } time_release (); } c = TIMED_READ (0); *sptr++ = (char) c; crc = xcrc (crc, (byte) c); } if (((int) (uni[0] = (char) TIMED_READ (3)) < 0) || ((int) (uni[1] = (char) TIMED_READ (3)) < 0) || ((int) (uni[2] = (char) TIMED_READ (3)) < 0) || ((int) (uni[3] = (char) TIMED_READ (3)) < 0)) { sptr = MSG_TXT (M_EMSHORT); goto emsi_error; } TIMED_READ (1); /* What am I throwing away here? */ if (!CARRIER) { sptr = MSG_TXT (M_NO_CARRIER); goto receive_failed; } uni[4] = '\0'; sscanf (uni, "%hx", &crc2); if (crc == crc2) goto process_packet; (void) sprintf (junkbuff, "!%s", MSG_TXT (M_CRC_MSG)); sptr = junkbuff; emsi_error: if (timeup (T2)) goto timeout; CLEAR_INBOUND (); goto request_it; process_packet: if (strnicmp (junkbuff, "{EMSI}", 6)) { sptr = MSG_TXT (M_EMSTART); goto emsi_error; } if (!Decode_EMSI_Header (junkbuff, len, Sender)) goto receive_failed; (void) n_getpassword (&remote_akas[hl_aka]); /* Updated 'assumed', 'CURRENT' to match remote */ CLEAR_INBOUND (); CLEAR_OUTBOUND (); sprintf (uni, "%s\r", emsistr[EMSI_ACK]); SENDCHARS (uni, strlen (uni), 1); /* Let the other system know */ SENDCHARS (uni, strlen (uni), 1); /* we got it ! */ T3 = timerset (1000); while (!OUT_EMPTY ()) /* Flush the buffer */ { if (timeup (T3)) goto timeout; if (!CARRIER) goto receive_failed; time_release (); } return (1); timeout: (void) sprintf (uni, "!%s", MSG_TXT (M_TIMEOUT)); sptr = uni; receive_failed: status_line (sptr); b_init (); return (0); } /* Recv EMSI */ static int LOCALFUNC get_emsi (char *s) { long T1; char *sptr, c; int i; T1 = timerset (500); sptr = s + 1; memset (sptr, 0, EMSI_LEN + 1); while (CARRIER) { while (PEEKBYTE () < 0) { if (timeup (T1)) goto timeout; if (got_ESC ()) { status_line (MSG_TXT (M_KBD_MSG)); goto receive_failed; } if (!CARRIER) { status_line (MSG_TXT (M_NO_CARRIER)); goto receive_failed; } time_release (); } c = (char) TIMED_READ (0); if (c == '\r') { status_line (">EMSI: '%s'", s); return (1); } *sptr++ = (char) c; for (i = 0; i < EMSI_MAX; i++) { if (!strnicmp (s, emsistr[i], strlen (emsistr[i]))) { status_line (">EMSI: '%s'", s); return (1); } else { if ((int) strlen (s) > EMSI_LEN) { status_line (">EMSI: '%s'", s); return (1); } } } } timeout: status_line ("!%s", MSG_TXT (M_TIMEOUT)); receive_failed: return (0); } static char *LOCALFUNC b7strcat (char *d, char *s) { int i; int j = strlen (s); char uni[4], *p, *c; p = &d[strlen (d)]; c = s; for (i = 0; i < j; c++, i++) { if (*c == '\\') { *p++ = '\\'; *p++ = '\\'; continue; } /*old if((*c>=0)&&(*c<=0x7F)) */ if (!(*c & 0x80)) { *p++ = *c; continue; } *p++ = '\\'; /* Do coding only for 8 bit chars */ sprintf (uni, "%02X", (unsigned) *c); *p++ = uni[0]; *p++ = uni[1]; continue; } *p++ = '\0'; return (d); } static LOCALFUNC recode_from_b7 (char *s, int len) { int i, j; char *d, uni[4]; unsigned c; d = s; for (j = i = 0; i < len; j++) { if (*s != '\\') { *d++ = *s++; i++; continue; } if (*++s == '\\') { *d++ = *s++; i += 2; continue; } uni[0] = *s++; uni[1] = *s++; uni[2] = '\0'; sscanf (uni, "%hx", &c); *d++ = (char) c; i += 3; } *d++ = '\0'; return (j); /* New length */ } static int LOCALFUNC get_level (ADDRP addr, ADDRP myaka) { int level = -1; if ((addr->Domain == myaka->Domain) || !addr->Domain || !myaka->Domain) level++; else return (level); if (addr->Zone == myaka->Zone) level++; else return (level); if (addr->Net == myaka->Net) level++; else return (level); if (addr->Node == myaka->Node) level++; return (level); } static int LOCALFUNC match_aka (ADDRP addr) { int level = -1; int i, j; assumed = 0; for (i = 0; i < num_addrs; i++) { j = get_level (addr, &alias[i]); if (j > level) { assumed = i; level = j; } } return (0); } /*--------------------------------------------------------------------------*/ /* Find end of EMSI field */ /*--------------------------------------------------------------------------*/ static char *LOCALFUNC get_bracket (char *p) { register char c; register char x = *(p - 1); /* Save starting character */ char *q = p; /* Convert starting bracket to expected ending bracket */ if (x == '{') x = '}'; else if (x == '[') x = ']'; while ((c = *p++) != '\0') { /* If this is an ending bracket */ if (c == '}' || c == ']') { /* And it's not escaped */ if (*p != c) { /* And it's the right one, get out. */ if (c == x) break; } else { /* If it is escaped, copy the end of the string over the esc */ strcpy (q, p); } } q = p; } return (q); } static char *LOCALFUNC cat_bracket (char *d, char *c) /* MB 93-11-27 */ { char x, *p, *q; q = p = (char *) &Txbuf[7168]; while ((x = *c++) != '\0') { if (*c && (x == '}' || x == ']')) *p++ = x; /* We have to escape } or ] by doing it twice */ *p++ = x; } *p++ = '\0'; return (b7strcat (d, q)); } static int LOCALFUNC Decode_EMSI_Header (char *junkbuff, int len, int Sender) { int i, akacnt = 0; int prodcodeT, logit = TRUE; int j, addonnr; long lmoh = 0; int cur = 0; char *tmpstr, *sptr, *p; char *uni, *help, *name, *loc, password[16]; ADDR addr[ALIAS_CNT], remote; static char *addons[] = {"{IDENT}", "{TRX#}", "{MOH#}", NULL}; uni = &junkbuff[4096]; /* Look at Recv_EMSI_Packet to see */ help = &uni[256]; /* why this is OK */ tmpstr = &help[256]; recode_from_b7 (junkbuff, len); sptr = &junkbuff[7]; memset (&remote_addr, 0, sizeof (remote_addr)); akacnt = i = 0; while (*sptr != '}') { while (*sptr == ' ') sptr++; /* Copy the address string into temp string. */ p = tmpstr; while (*sptr && *sptr != '}' && *sptr != ' ') *p++ = *sptr++; *p = '\0'; if (p == tmpstr) break; memset (&addr[i], 0, sizeof (ADDR)); status_line (">EMSI: parsing addr: '%s'", tmpstr); (void) find_address (tmpstr, &addr[i]); status_line (">EMSI: got addr: '%s'", Full_Addr_Str (&addr[i])); /* sscanf(sptr,"%u:%u/%u.%u",&addr[i].Zone,&addr[i].Net,&addr[i].Node,&addr[i].Point); */ if (Sender && (addr[i].Zone == called_addr.Zone) && (addr[i].Net == called_addr.Net) && (addr[i].Node == called_addr.Node) && (addr[i].Point == called_addr.Point)) remote_addr = addr[i]; if (i < (ALIAS_CNT - 1)) i++; } akacnt = i; if (!remote_addr.Zone || !remote_addr.Net) remote_addr = addr[0]; while (*sptr++ != '{') ; i = 0; while (*sptr != '}') password[i++] = *sptr++; password[i] = '\0'; sptr++; while (*sptr != '}') { i = 0; while ((*sptr != ',') && (*sptr != '}')) uni[i++] = *sptr++; uni[i] = '\0'; if (*sptr != '}') sptr++; if (!stricmp (uni, "NPU")) remote_pickup = 0; else if (!stricmp (uni, "PUP")) remote_pickup = 1; else if (!stricmp (uni, "PUA")) remote_pickup = 2; } sptr++; sptr++; remote_capabilities = WZ_FREQ; while (*sptr != '}') { i = 0; while ((*sptr != ',') && (*sptr != '}')) uni[i++] = *sptr++; uni[i] = '\0'; if (*sptr != '}') sptr++; if (!stricmp (uni, "JAN")) remote_capabilities |= DOES_IANUS; #ifdef HAVE_HYDRA else if (!stricmp (uni, "HYD")) remote_capabilities |= DOES_HYDRA; #endif /* HAVE_HYDRA */ else if (!stricmp (uni, "ZAP")) remote_capabilities |= ZED_ZAPPER; else if (!stricmp (uni, "ZMO")) remote_capabilities |= ZED_ZIPPER; else if (!stricmp (uni, "NRQ")) remote_capabilities &= ~WZ_FREQ; } sptr++; sptr++; sscanf (sptr, "%x", &prodcodeT); /* remote_mailer=prodcode; */ while (*sptr++ != '{') ; i = 0; while (*sptr != '}') uni[i++] = *sptr++; sptr++; sptr++; uni[i++] = ' '; while (*sptr != '}') uni[i++] = *sptr++; sptr++; sptr++; uni[i++] = '/'; while (*sptr != '}') uni[i++] = *sptr++; if (uni[--i] != '/') i++; uni[i] = '\0'; sptr++; for (;;) { if (*sptr != '{') break; for (addonnr = 0; addons[addonnr] != NULL; addonnr++) { if (!strnicmp (sptr, addons[addonnr], strlen (addons[addonnr]))) break; } if (!addons[addonnr]) /* no known addon */ addonnr = 0; else addonnr++; switch (addonnr) { case 1: /* {IDENT} system name */ sptr += 9; name = sptr; sptr = get_bracket (sptr); *sptr = '\0'; (void) sprintf (help, "*%s (%s)", name, Full_Addr_Str (&remote_addr)); status_line ("%s", help); if (akacnt > 1) { strcpy (help, ":Aka: "); for (j = i = 0; i < akacnt; i++) { if (!memcmp (&addr[i], &remote_addr, sizeof (ADDR))) continue; strcat (help, Full_Addr_Str (&addr[i])); strcat (help, " "); if (++j == 3) { status_line ("%s", help); strcpy (help, ": "); j = 0; } } if (j) status_line ("%s", help); } sptr += 2; status_line ("%s %s", MSG_TXT (M_REMOTE_USES), uni); loc = sptr; sptr = get_bracket (sptr); *sptr = '\0'; *uni = '\0'; if (loc[0]) sprintf (uni, " from %s", loc); sptr += 2; name = sptr; sptr = get_bracket (sptr); *sptr = '\0'; if (name[0]) { status_line (":SysOp: %s%s", name, uni); /* strcpy (remote_sysop,name); */ } sptr += 2; /* phone */ name = sptr; sptr = get_bracket (sptr); *sptr = '\0'; sptr += 2; sptr = get_bracket (sptr); /* baud */ *sptr = '\0'; sptr += 2; /* flags */ loc = sptr; sptr = get_bracket (sptr); *sptr = '\0'; if (loc[0] && name[0] && strcmp (name, "-Unpublished-")) { status_line (" Phone: %s", name); status_line (" Flags: %s", loc); } while (*sptr++ != '}') ; break; case 2: /* {TRX#} tranx */ sptr += 8; name = sptr; sptr = get_bracket (sptr); *sptr = '\0'; #ifdef ANSI_TIME_T status_line (":Tranx: %08lX / %s", etm - ANSI_TIME_T_DELTA, name); #else status_line (":Tranx: %08lX / %s", etm, name); #endif while (*sptr++ != '}') ; break; case 3: /* {MOH#} mail on hold */ sptr += 8; name = sptr; sptr = get_bracket (sptr); *sptr = '\0'; sscanf (name, "%lX", &lmoh); status_line (">Mail on Hold: %ldb", lmoh); while (*sptr++ != '}') ; break; default: /* any other addon */ name = ++sptr; while (*sptr != '}') sptr++; /* goto end of addon string */ *sptr++ = '\0'; loc = ++sptr; sptr = get_bracket (sptr); /* MB new */ *sptr++ = '\0'; status_line (">Unknown EMSI Addon: %s: {%s}", name, loc); break; } } remote = remote_addr; if (!remote_pickup) status_line (" Remote refused mail-pickup"); if (Sender) remote_addr = called_addr; CURRENT = DEFAULT; for (i = 0; i <= akacnt; i++) { status_line (">EMSI: checking addr: '%s'", Full_Addr_Str (&remote_addr)); if ((j = n_getpassword (&remote_addr)) > 0) { if (Sender && *remote_password && !*password && (prodcodeT == isDBRIDGE)) j = 0; /* work-around for a D'Bridge(tm)-Bug */ else j = n_password (password, remote_password, &logit); status_line (">EMSI: result of pw check: '%d'", j); if (j == 0) { if (highest_level < 2) { highest_level = 2; hl_aka = num_rakas; } } else { /* * Password doesn't match. * * Result of 1 means both of us had one. * * Result of 2 means we had one and the other side didn't. * * If we are the sender we will accept this mismatch, * but only on the first aka. * */ if ((!Sender) || (num_rakas != 0)) goto next_one; else status_line (MSG_TXT (M_PASSWORD_OVERRIDE)); if (highest_level < 1) { highest_level = 1; hl_aka = num_rakas; } } } else if (j < 0) { status_line (">EMSI: addr '%s' will be curmudgeoned", Full_Addr_Str (&remote_addr)); cur = 1; goto next_one; } status_line (">EMSI: checking addr '%s' for dupe", Full_Addr_Str (&remote_addr)); for (j = 0; j < num_rakas; j++) { if (get_level (&remote_addr, &(remote_akas[j])) == 3) goto next_one; } status_line (">EMSI: using addr: '%s'", Full_Addr_Str (&remote_addr)); remote_akas[num_rakas++] = remote_addr; next_one: remote_addr = addr[i]; } if (!num_rakas) { if (cur) sptr = MSG_TXT (M_NUISANCE_CALLER); else sptr = NULL; LOWER_DTR (); /* He'll never get it right */ timer (2); /* Wait two secs */ return (0); } remote_addr = remote; return (1); } static int LOCALFUNC Encode_EMSI_Header (char *junkbuff, int Sender) { int i, capabilities = 0; char *uni; uni = &junkbuff[4096]; /* See why this is OK in Send_EMSI_Packet */ strcpy (junkbuff, "{EMSI}"); b7strcat (junkbuff, "{"); match_aka (&remote_addr); /* Update 'assumed' */ status_line (">Used Aka: %s", Full_Addr_Str (&alias[assumed])); b7strcat (junkbuff, Full_Addr_Str (&alias[assumed])); for (i = 0; i < num_addrs; i++) { if (i != assumed) { b7strcat (junkbuff, " "); b7strcat (junkbuff, Full_Addr_Str (&alias[i])); } } b7strcat (junkbuff, "}{"); remote_password = NULL; if ((Sender && (n_getpassword (&remote_addr) > 0)) || (!Sender && (n_getpassword (&remote_akas[hl_aka]) > 0))) { if (remote_password) { (void) strncpy ((char *) uni, remote_password, 8); uni[8] = '\0'; b7strcat (junkbuff, uni); } } b7strcat (junkbuff, "}{8N1"); if (Sender) { if (!no_pickup) { if (pickup_all) b7strcat (junkbuff, ",PUA"); else b7strcat (junkbuff, ",PUP"); } else b7strcat (junkbuff, ",NPU"); } else { if (matrix_mask & NO_TRAFFIC) b7strcat (junkbuff, ",HAT"); if (!(matrix_mask & TAKE_REQ)) b7strcat (junkbuff, ",HRQ"); } b7strcat (junkbuff, "}{"); /* At least one ZModem protocol must be available for FSC-0056 ! */ if (!my_capabilities & ZED_ZIPPER) my_capabilities |= ZED_ZIPPER; /* * If we are the calling system, turn on all our capabilities. * If we are the called system, choose from the set that the * caller gave us, and only send the one we prefer. */ if (!Sender) { if (remote_capabilities & my_capabilities & DOES_IANUS) capabilities = DOES_IANUS; #ifdef HAVE_HYDRA else if (remote_capabilities & my_capabilities & DOES_HYDRA) capabilities = DOES_HYDRA; #endif /* HAVE_HYDRA */ else if (remote_capabilities & my_capabilities & ZED_ZAPPER) capabilities = ZED_ZAPPER; else if (remote_capabilities & my_capabilities & ZED_ZIPPER) capabilities = ZED_ZIPPER; } else capabilities = my_capabilities; #ifdef HAVE_HYDRA if (!capabilities & (DOES_IANUS | DOES_HYDRA | ZED_ZAPPER | ZED_ZIPPER)) #else if (!capabilities & (DOES_IANUS | ZED_ZAPPER | ZED_ZIPPER)) #endif /* HAVE_HYDRA */ b7strcat (junkbuff, "NCP,"); else if (Sender) { if (capabilities & DOES_IANUS) b7strcat (junkbuff, "JAN,"); #ifdef HAVE_HYDRA if (capabilities & DOES_HYDRA) b7strcat (junkbuff, "HYD,"); #endif /* HAVE_HYDRA */ if (capabilities & ZED_ZAPPER) b7strcat (junkbuff, "ZAP,"); if (capabilities & ZED_ZIPPER) b7strcat (junkbuff, "ZMO,"); } else { if (capabilities & DOES_IANUS) b7strcat (junkbuff, "JAN,"); #ifdef HAVE_HYDRA else if (capabilities & DOES_HYDRA) b7strcat (junkbuff, "HYD,"); #endif /* HAVE_HYDRA */ else if (capabilities & ZED_ZAPPER) b7strcat (junkbuff, "ZAP,"); else if (capabilities & ZED_ZIPPER) b7strcat (junkbuff, "ZMO,"); } if (!(matrix_mask & TAKE_REQ) || (Sender && !on_our_nickel)) { b7strcat (junkbuff, "NRQ,"); } else capabilities |= WZ_FREQ; b7strcat (junkbuff, "ARC,XMA"); b7strcat (junkbuff, ",FNC"); b7strcat (junkbuff, "}"); /* MB 93-11-27 */ sprintf (uni, "{%02X}", PRDCT_CODE); b7strcat (junkbuff, uni); sprintf (uni, "{%s}", PRDCT_PRTY); cat_bracket (junkbuff, uni); sprintf (uni, "{%d.%02d}", BINK_MAJVERSION, /* vvv */ BINK_MINVERSION); b7strcat (junkbuff, uni); sprintf (uni, "{%s}", ((serial == -1) ? MSG_TXT (M_UNREGISTERED) : "")); cat_bracket (junkbuff, uni); b7strcat (junkbuff, "{IDENT}{"); sprintf (uni, "[%s]", system_name); cat_bracket (junkbuff, uni); sprintf (uni, "[%s]", location); /* vvv */ cat_bracket (junkbuff, uni); sprintf (uni, "[%s]", sysop); cat_bracket (junkbuff, uni); sprintf (uni, "[%s]", myphone); cat_bracket (junkbuff, uni); sprintf (uni, "[%s]", mymaxbaud); cat_bracket (junkbuff, uni); sprintf (uni, "[%s]", myflags); cat_bracket (junkbuff, uni); /* MB 93-11-27 */ b7strcat (junkbuff, "}{TRX#}"); #ifdef ANSI_TIME_T sprintf (uni, "{[%08lX]}", etm - ANSI_TIME_T_DELTA); #else sprintf (uni, "{[%08lX]}", etm); #endif b7strcat (junkbuff, uni); return (strlen (junkbuff)); } /* END OF FILE: emsi.c */