/*--------------------------------------------------------------------------*/ /* */ /* */ /* ------------ Bit-Bucket Software, Co. */ /* \ 10001101 / Writers and Distributors of */ /* \ 011110 / Freely Available Software. */ /* \ 1011 / */ /* ------ */ /* */ /* (C) Copyright 1987-96, Bit Bucket Software Co. */ /* */ /* This module has significant work from Vince Perriello, Bob Hartman, */ /* Holger Schurig, Michael Buenter and Doug Boone */ /* BinkleyTerm Outbound Area Manipulation */ /* */ /* */ /* 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" extern char *mail_status_chars (unsigned int); /* local prototypes */ static int mail_change (BINK_SAVEP, int); static int mail_delreq (BINK_SAVEP, int); static int mail_stop (BINK_SAVEP, int); static int mail_addr (BINK_SAVEP, int); static void LOCALFUNC zoom_window (REGIONP, MAILP, MAILP); static void LOCALFUNC append_pkt (REGIONP, unsigned int, char *, char *); static int LOCALFUNC mail_addsend (ADDRP, char *, char *); static int LOCALFUNC mail_addrequest (ADDRP, char *, char *, char *); static int LOCALFUNC kill_node (char *); static void LOCALFUNC call_tries (ADDRP baddr, int *calls, int *badcalls); /* local variables */ static int curl; static MAILP cur, oldp, oldcur; #define ZHELPSIZE 9 int Do_Zoom (BINK_SAVEP rp, int x) { REGIONP zoomwin; MAILP p; long t_idle; int i, c; int changed = 0; short z; x = 1; /* is there a window */ if (rp == NULL) return (0); zoomwin = rp->region; /* draw a box */ sb_fill (zoomwin, ' ', colors.hold); sb_box (zoomwin, boxtype, colors.hold); /* give it a title */ sb_move (zoomwin, 0, 1); sb_puts (zoomwin, MSG_TXT (M_ZOOM_TITLE)); /* clear the inside of zoomed outbound */ zoomwin->sr0++; zoomwin->sr1--; zoomwin->sc0++; zoomwin->sc1--; sb_fillc (zoomwin, ' '); zoomwin->sr0--; zoomwin->sr1++; zoomwin->sc0--; zoomwin->sc1++; /* Put the help text at the bottom of the window */ c = (int) (zoomwin->sr1 - 1); i = M_ZOOM_HELP; for (z = zoomwin->sr1 - ZHELPSIZE + 1; z < (short) c; i++, z++) { sb_move (zoomwin, z, 1); sb_puts (zoomwin, MSG_TXT (i)); } /* is there a rescan flag? */ if (forcerescancheck ()) { sb_move (zoomwin, 1, 2); sb_puts (zoomwin, MSG_TXT (M_ZOOM_WAIT)); sb_show (); xmit_reset (0); } /* is there something in the outbound? */ if (mail_top == NULL) { sb_move (zoomwin, 10, 10); sb_puts (zoomwin, MSG_TXT (M_NOTHING_IN_OUTBOUND)); sb_show (); wait_for_key (120); return (x); } p = cur = mail_top; oldp = oldcur = NULL; curl = 2; zoom_window (zoomwin, p, cur); t_idle = timerset (6000); while (!timeup (t_idle) && (PEEKBYTE () == (short) 0xffff)) { if (KEYPRESS ()) { t_idle = timerset (3000); c = (int) KbRemap (FOSSIL_CHAR ()); switch ((unsigned) c) { case F_PEND_PGUP: for (i = 2; i < (zoomwin->sr1 - ZHELPSIZE); i++) { if (p->prev != NULL) p = p->prev; if (cur->prev != NULL) cur = cur->prev; } break; case F_PEND_PGDN: for (i = 2; i < (zoomwin->sr1 - ZHELPSIZE); i++) { if (p->next != NULL) p = p->next; if (cur->next != NULL) cur = cur->next; } break; case F_PEND_UPAR: if (curl > 2) { cur = cur->prev; } else { if (p->prev != NULL) p = cur = p->prev; } break; case F_PEND_DNAR: if (curl < (zoomwin->sr1 - 1 - ZHELPSIZE)) { if (cur->next != NULL) cur = cur->next; } else { if (p->next != NULL) p = p->next; if (cur->next != NULL) cur = cur->next; } break; case F_PEND_HOME: p = cur = mail_top; break; case F_PEND_END: while (p->next != NULL) { p = p->next; } cur = p; for (i = 2; i < (zoomwin->sr1 - 1 - ZHELPSIZE); i++) { if (p->prev != NULL) p = p->prev; } break; case F_ZOOM_ADDRESS: /* readdress */ changed = sb_popup (10, 5, 4, 70, mail_addr, 0); break; case F_UN_CALLRIGHTNOW: case F_ZOOM_CRASH: /* crash */ changed = sb_popup (10, 5, 4, 70, mail_change, (int) 'C'); break; case F_ZOOM_DIRECT:/* direct */ changed = sb_popup (10, 5, 4, 70, mail_change, (int) 'D'); break; case F_UN_GETFILE: changed = sb_popup (10, 5, 7, 70, Do_Get, 0); break; case F_ZOOM_GET: /* get files */ changed = sb_popup (10, 5, 7, 70, Do_Get, 1); break; case F_ZOOM_HOLD: /* hold */ changed = sb_popup (10, 5, 4, 70, mail_change, (int) 'H'); break; case F_ZOOM_KILLTRIES: /* reset dial tries */ changed = sb_popup (10, 5, 4, 70, mail_stop, 0); break; case F_ZOOM_NORMAL:/* normal */ changed = sb_popup (10, 5, 4, 70, mail_change, (int) 'N'); break; case F_UN_POLLPKT: changed = sb_popup (10, 5, 4, 70, Do_Poll_Packet, 0); break; case F_ZOOM_POLL: /* poll */ changed = sb_popup (10, 5, 5, 70, Do_Poll_Packet, 1); break; case F_ZOOM_KILLREQ: /* delete request */ changed = sb_popup (10, 5, 4, 70, mail_delreq, 0); break; case F_UN_SENDFILE: changed = sb_popup (10, 5, 6, 70, Do_Send, 0); break; case F_ZOOM_SEND: /* send files */ changed = sb_popup (10, 5, 6, 70, Do_Send, 1); break; case F_ZOOM_STOPMAIL: /* stop mail */ changed = sb_popup (10, 5, 4, 70, mail_stop, 1); break; case F_ZOOM_KILLNODE: case F_UN_KILLNODESMAIL: changed = !sb_popup (10, 5, 4, 70, Do_Kill, 1); break; default: /* Space, ESCape or Return terminates */ c &= 0x00ff; if ((c == 0x20) || (c == 0x1b) || (c == 0x0d)) return (x); break; } if (changed != 0) { sb_move (zoomwin, (short) curl, 1); sb_wa (zoomwin, colors.hold, 78); sb_move (zoomwin, 1, 2); sb_puts (zoomwin, MSG_TXT (M_ZOOM_WAIT)); sb_show (); xmit_reset (0); t_idle = timerset (6000); x = 1; /* is there something in the outbound ? */ if (mail_top == NULL) { sb_move (zoomwin, 10, 10); sb_puts (zoomwin, MSG_TXT (M_NOTHING_IN_OUTBOUND)); sb_show (); wait_for_key (120); return (x); } else { oldp = oldcur = NULL; p = cur = mail_top; curl = 2; changed = 0; } } if ((oldp != p) || (oldcur != cur)) zoom_window (zoomwin, p, cur); } time_release (); } return (x); } static void LOCALFUNC zoom_window (REGIONP zoomwin, MAILP p, MAILP cur) { int i; int calls, badcalls; int zsize = (zoomwin->sr1) - ZHELPSIZE; char out_str[50]; if (oldp == p) { oldcur = cur; sb_move (zoomwin, (short) curl, 1); sb_wa (zoomwin, colors.hold, 78); i = 2; while ((i < zsize) && (p != cur)) { i++; p = p->next; } sb_move (zoomwin, (short) i, 1); sb_wa (zoomwin, colors.calling, 78); curl = i; sb_show (); return; } /* save old status */ oldp = p; oldcur = cur; /* give it a header */ sb_move (zoomwin, 1, 1); sb_puts (zoomwin, MSG_TXT (M_ZOOM_HEADER)); sb_move (zoomwin, (short) curl, 1); sb_wa (zoomwin, colors.hold, 78); for (i = 2; i < zsize; i++) { long age; if (p == NULL) break; sb_move (zoomwin, (short) i, 1); if (p == cur) { sb_wa (zoomwin, colors.calling, 78); curl = i; } sprintf (out_str, " %-35s", Full_Addr_Str (&(p->mail_addr))); sb_puts (zoomwin, out_str); sb_move (zoomwin, (short) i, 36); call_tries (&(p->mail_addr), &calls, &badcalls); age = (time (NULL) - p->oldest) / 86400L; sprintf (out_str, "%3u %9lu %3lu %5d %5d %6s ", p->numfiles, p->mailsize, age, calls, badcalls, mail_status_chars (p->mailtypes)); sb_puts (zoomwin, out_str); p = p->next; } /* clear the rest of the zoomed outbound */ if (i <= zsize) { zoomwin->sr0 += i; zoomwin->sr1 -= ZHELPSIZE; zoomwin->sc0++; zoomwin->sc1--; sb_fillc (zoomwin, ' '); zoomwin->sr0 -= i; zoomwin->sr1 += ZHELPSIZE; zoomwin->sc0--; zoomwin->sc1++; } sb_show (); } static int mail_change (BINK_SAVEP p, int x) { REGIONP r; char iname[80], oname[80], tname[80]; /* junk[80] */ char *HoldName, *result, *temp_buffer; struct FILEINFO fileinfo; int ihandle, ohandle; int check; int written = 1; int buff_size; int change = 0; if (p == NULL) return (change); r = p->region; sb_fill (r, ' ', colors.popup); sb_box (r, boxtype, colors.popup); switch ((char) x) { case 'C': { strcpy (oname, "Crash"); break; } case 'D': { strcpy (oname, "Direct"); break; } case 'H': { strcpy (oname, "Hold"); break; } case 'N': { strcpy (oname, "Normal"); x = (int) 'F'; break; } } sprintf (junk, MSG_TXT (M_ZOOM_CHANGE), Full_Addr_Str (&(cur->mail_addr)), oname); sb_move (r, 0, 1); sb_puts (r, junk); sb_move (r, 1, 2); sb_puts (r, MSG_TXT (M_ARE_YOU_SURE)); (void) sb_input_chars (r, 1, 22, junk, 1); /* If user says 'no', get out */ if (junk[0] != (char) toupper (MSG_TXT (M_YES)[0])) return (change); if (flag_file (TEST_AND_SET, &(cur->mail_addr), 0)) { sb_move (r, 2, 2); sb_puts (r, MSG_TXT (M_NODE_BUSY)); wait_for_key (60); return (0); } /* first append/rename ?LO */ HoldName = HoldAreaNameMunge (&(cur->mail_addr)); (void) sprintf (tname, "%s%s.?LO", HoldName, Hex_Addr_Str (&(cur->mail_addr))); (void) sprintf (oname, "%s%s.%cLO", HoldName, Hex_Addr_Str (&(cur->mail_addr)), (char) x); if (!dfind (&fileinfo, tname, 0)) { do { buff_size = (int) fileinfo.size; strcpy (iname, fileinfo.name); result = strchr (iname, '.'); result++; if (*result != (char) x) { if (cur->mail_addr.Point != 0) { (void) sprintf (iname, "%s%04x%04x.PNT\\%s", HoldName, cur->mail_addr.Net, cur->mail_addr.Node, fileinfo.name); } else { (void) sprintf (iname, "%s%s", HoldName, fileinfo.name); } if (rename (iname, oname) != 0) { temp_buffer = (char *) malloc (buff_size + 1); ihandle = open (iname, O_RDONLY | O_BINARY); ohandle = open (oname, O_APPEND | O_BINARY | O_WRONLY); sb_move (r, 2, 2); sprintf (junk, MSG_TXT (M_ZOOM_APPEND), MSG_TXT (M_ZOOM_MAIL_ATT)); sb_puts (r, junk); do { check = read (ihandle, temp_buffer, buff_size); if (check) written = write (ohandle, temp_buffer, check); } while (check > 0); close (ihandle); close (ohandle); if (written > 0) unlink (iname); free (temp_buffer); } else { sb_move (r, 2, 2); sprintf (junk, MSG_TXT (M_ZOOM_RENAME), MSG_TXT (M_ZOOM_MAIL_ATT)); sb_puts (r, junk); } change = 1; } } while (!dfind (&fileinfo, NULL, 1)); (void) (dfind (&fileinfo, NULL, 2)); } /* now rename ?UT */ if ((char) x == 'F') x = (int) 'O'; (void) sprintf (tname, "%s%s.?UT", HoldName, Hex_Addr_Str (&(cur->mail_addr))); (void) sprintf (oname, "%s%s.%cUT", HoldName, Hex_Addr_Str (&(cur->mail_addr)), (char) x); if (!dfind (&fileinfo, tname, 0)) { do { buff_size = (int) fileinfo.size; strcpy (iname, fileinfo.name); result = strchr (iname, '.'); result++; if (*result != (char) x) { if (cur->mail_addr.Point != 0) { (void) sprintf (iname, "%s%04x%04x.PNT\\%s", HoldName, cur->mail_addr.Net, cur->mail_addr.Node, fileinfo.name); } else { (void) sprintf (iname, "%s%s", HoldName, fileinfo.name); } if ((rename (iname, oname)) != 0) { if (buff_size > 60) append_pkt (r, buff_size, iname, oname); } /* do append if rename failed */ else { sb_move (r, 2, 2); sprintf (junk, MSG_TXT (M_ZOOM_RENAME), MSG_TXT (M_ZOOM_MAIL_PKT)); sb_puts (r, junk); } change = 1; } } while (!dfind (&fileinfo, NULL, 1)); (void) (dfind (&fileinfo, NULL, 2)); } /* end of ?UT handling */ (void) flag_file (CLEAR_FLAG, &(cur->mail_addr), 0); wait_for_key (60); return (change); } static void LOCALFUNC append_pkt (REGIONP r, unsigned int size, char *iname, char *oname) { int ihandle, ohandle; struct tm *dt; time_t now; struct _pkthdr *header; char *copy; unsigned int buff_size, go; sb_move (r, 2, 2); sprintf (junk, MSG_TXT (M_ZOOM_APPEND), MSG_TXT (M_ZOOM_MAIL_PKT)); sb_puts (r, junk); header = (struct _pkthdr *) malloc (sizeof (struct _pkthdr) + 1); ohandle = open (oname, O_BINARY | O_RDWR); ihandle = open (iname, O_BINARY | O_RDONLY); go = read (ohandle, header, sizeof (struct _pkthdr)); lseek (ohandle, 0L, SEEK_SET); /* Update the packet header to reflect that its been messed with */ time (&now); dt = localtime (&now); header->year = dt->tm_year + 1900; header->month = dt->tm_mon + 1; header->day = dt->tm_mday; header->hour = dt->tm_hour; header->minute = dt->tm_min; header->second = dt->tm_sec; header->product = PRDCT_CODE; go = write (ohandle, header, sizeof (struct _pkthdr)); free (header); lseek (ohandle, -2L, SEEK_END); lseek (ihandle, ((long) sizeof (struct _pkthdr)), SEEK_SET); size -= sizeof (struct _pkthdr); buff_size = size; if ((copy = (char *) malloc (buff_size)) == NULL) { do { buff_size = (buff_size / 10) * 9; copy = (char *) malloc (buff_size); } while (copy == NULL); } do { go = read (ihandle, copy, buff_size); go = write (ohandle, copy, go); size -= buff_size; if (buff_size > size) buff_size = size; } while (size > 0); free (copy); close (ihandle); close (ohandle); if (go > 0) unlink (iname); else { sb_move (r, 2, 2); sprintf (junk, MSG_TXT (M_ZOOM_ERRAPP), MSG_TXT (M_ZOOM_MAIL_PKT)); sb_puts (r, junk); } return; } static int mail_stop (BINK_SAVEP p, int x) { REGIONP r; int change = 0; char stop[80]; char *HoldName; char sure[2]; FILE *fp; struct FILEINFO fileinfo; if (p == NULL) return (change); r = p->region; sb_fill (r, ' ', colors.popup); sb_box (r, boxtype, colors.popup); if (x) sprintf (stop, MSG_TXT (M_ZOOM_STOP), Full_Addr_Str (&(cur->mail_addr))); else sprintf (stop, MSG_TXT (M_ZOOM_DELETE), Full_Addr_Str (&(cur->mail_addr))); sb_move (r, 0, 1); sb_puts (r, stop); sb_move (r, 1, 2); sb_puts (r, MSG_TXT (M_ARE_YOU_SURE)); (void) sb_input_chars (r, 1, 22, sure, 1); /* If user says 'no', get out */ if (sure[0] != (char) toupper (MSG_TXT (M_YES)[0])) return (change); if (flag_file (TEST_AND_SET, &(cur->mail_addr), 0)) { sb_move (r, 2, 2); sb_puts (r, MSG_TXT (M_NODE_BUSY)); wait_for_key (60); return (0); } HoldName = HoldAreaNameMunge (&(cur->mail_addr)); (void) sprintf (stop, "%s%s.$$?", HoldName, Hex_Addr_Str (&(cur->mail_addr))); if (!dfind (&fileinfo, stop, 0)) { do { if (cur->mail_addr.Point != 0) { (void) sprintf (stop, "%s%04x%04x.PNT\\%s", HoldName, cur->mail_addr.Net, cur->mail_addr.Node, fileinfo.name); } else { (void) sprintf (stop, "%s%s", HoldName, fileinfo.name); } unlink (stop); } while (!dfind (&fileinfo, NULL, 1)); (void) (dfind (&fileinfo, NULL, 2)); sb_move (r, 2, 2); sb_puts (r, MSG_TXT (M_ZOOM_DELCOUNT)); change = 1; } if (x) { (void) sprintf (stop, "%s%s.$$9", HoldName, Hex_Addr_Str (&(cur->mail_addr))); sb_move (r, 2, 2); sb_puts (r, MSG_TXT (M_ZOOM_NOSEND)); fp = share_fopen (stop, append_ascii, DENY_WRITE); if (fp == (FILE *) NULL) { sb_move (r, 2, 2); sb_puts (r, MSG_TXT (M_ZOOM_ERRNOSEND)); } else change = 1; fclose (fp); } (void) flag_file (CLEAR_FLAG, &(cur->mail_addr), 0); wait_for_key (60); return (change); } static int mail_delreq (BINK_SAVEP p, int x) { REGIONP r; int rhandle; char req[80]; char sure[2]; char *HoldName; if (p == NULL) return (0); r = p->region; x = 0; sb_fill (r, ' ', colors.popup); sb_box (r, boxtype, colors.popup); sprintf (junk, MSG_TXT (M_ZOOM_DELREQ), Full_Addr_Str (&(cur->mail_addr))); sb_move (r, 0, 1); sb_puts (r, junk); sb_move (r, 1, 2); sb_puts (r, MSG_TXT (M_ARE_YOU_SURE)); (void) sb_input_chars (r, 1, 22, sure, 1); /* If user says 'no', get out */ if (sure[0] != (char) toupper (MSG_TXT (M_YES)[0])) return (x); if (flag_file (TEST_AND_SET, &(cur->mail_addr), 0)) { sb_move (r, 2, 2); sb_puts (r, MSG_TXT (M_NODE_BUSY)); wait_for_key (60); return (0); } HoldName = HoldAreaNameMunge (&(cur->mail_addr)); (void) sprintf (req, "%s%s.REQ", HoldName, Hex_Addr_Str (&(cur->mail_addr))); if (dexists (req)) { rhandle = open (req, O_RDONLY | O_BINARY); close (rhandle); if (rhandle == 0) { sb_move (r, 2, 2); sb_puts (r, MSG_TXT (M_ZOOM_ERRREQ)); } else { unlink (req); sb_move (r, 2, 2); sb_puts (r, MSG_TXT (M_ZOOM_DEL_REQ)); x = 1; } wait_for_key (60); } (void) flag_file (CLEAR_FLAG, &(cur->mail_addr), 0); return (x); } static void LOCALFUNC append_fil (REGIONP r, unsigned int size, char *iname, char *oname, char *desc) { char *temp_buffer; char temp[50]; int ihandle, ohandle; int check; int written = 1; temp_buffer = (char *) malloc (size + 1); ihandle = open (iname, O_RDONLY | O_BINARY); ohandle = open (oname, O_APPEND | O_BINARY | O_WRONLY); (void) sprintf (temp, MSG_TXT (M_ZOOM_APPEND), desc); sb_move (r, 2, 2); sb_puts (r, temp); do { check = read (ihandle, temp_buffer, size); if (check) written = write (ohandle, temp_buffer, check); } while (check > 0); close (ihandle); close (ohandle); if (written > 0) unlink (iname); free (temp_buffer); } static int LOCALFUNC appren_mail (REGIONP r, ADDRP fromaddr, ADDRP toaddr, char *ftype, char *desc) { char iname[80], oname[80], tname[80]; char *HoldName; struct FILEINFO fileinfo; int buff_size; int change = 0; HoldName = HoldAreaNameMunge (fromaddr); (void) sprintf (tname, "%s%s.%s", HoldName, Hex_Addr_Str (fromaddr), ftype); if (!dfind (&fileinfo, tname, 0)) { do { buff_size = (int) fileinfo.size; HoldName = HoldAreaNameMunge (toaddr); (void) sprintf (oname, "%s%s.%s", HoldName, Hex_Addr_Str (toaddr), &(fileinfo.name[9])); HoldName = HoldAreaNameMunge (fromaddr); if (cur->mail_addr.Point != 0) { (void) sprintf (iname, "%s%04x%04x.PNT\\%s", HoldName, fromaddr->Net, fromaddr->Node, fileinfo.name); } else { (void) sprintf (iname, "%s%s", HoldName, fileinfo.name); } if (rename (iname, oname) != 0) { if (!strcmp (desc, "?UT")) /* mail packet */ { if (buff_size > 60) append_pkt (r, buff_size, iname, oname); } else /* other file */ { append_fil (r, buff_size, iname, oname, desc); } } else { sprintf (iname, MSG_TXT (M_ZOOM_RENAME), desc); sb_move (r, 2, 2); sb_puts (r, iname); } change = 1; } while (!dfind (&fileinfo, NULL, 1)); (void) (dfind (&fileinfo, NULL, 2)); } return (change); } static int mail_addr (BINK_SAVEP p, int x) { REGIONP r; char iname[80], sure[2]; ADDR addr; x = 0; if (p == NULL) return (0); r = p->region; sb_fill (r, ' ', colors.popup); sb_box (r, boxtype, colors.popup); sb_move (r, 0, 1); sb_puts (r, MSG_TXT (M_ZOOM_DESTINATION)); sb_move (r, 1, 2); sb_puts (r, MSG_TXT (M_ZOOM_NEWADDR)); if (!sb_input_chars (r, 1, 18, iname, 36)) { if (!find_address (iname, &addr)) { return (0); } if (nodefind (&addr, 0)) { sb_move (r, 1, 2); sprintf (iname, "Node: %-18.18s - %-20.20s", Full_Addr_Str (&addr), newnodedes.SystemName); sb_puts (r, iname); } sb_move (r, 2, 2); sb_puts (r, MSG_TXT (M_ARE_YOU_SURE)); (void) sb_input_chars (r, 2, 22, sure, 1); /* If user says 'no', get out */ if (sure[0] != (char) toupper (MSG_TXT (M_YES)[0])) return (x); if (flag_file (TEST_AND_SET, &(cur->mail_addr), 0)) { sb_move (r, 2, 2); sb_puts (r, MSG_TXT (M_NODE_BUSY)); wait_for_key (60); return (0); } if (flag_file (TEST_AND_SET, &addr, 0)) { (void) flag_file (CLEAR_FLAG, &(cur->mail_addr), 0); sb_move (r, 2, 2); sb_puts (r, MSG_TXT (M_NODE_BUSY)); wait_for_key (60); return (0); } /* first append/rename ?LO */ appren_mail (r, &(cur->mail_addr), &addr, "?LO", "mail attaches"); /* append/rename REQ */ appren_mail (r, &(cur->mail_addr), &addr, "REQ", "request files"); /* now rename ?UT */ appren_mail (r, &(cur->mail_addr), &addr, "?UT", "mail packets "); (void) flag_file (CLEAR_FLAG, &addr, 0); (void) flag_file (CLEAR_FLAG, &(cur->mail_addr), 0); wait_for_key (60); x = 1; } /* end of address input */ return (x); } int Do_Get (BINK_SAVEP p, int x) { REGIONP r; char node[51]; char file[51]; char password[9]; char flavor[2]; char more[2]; int busy = 0; int did_it = 0; short i; ADDR addr; if (p == NULL) return (0); r = p->region; if (x) { addr = cur->mail_addr; /* Busy the node if we can. */ if (flag_file (TEST_AND_SET, &addr, 0)) { sb_move (r, 2, 2); sb_puts (r, MSG_TXT (M_NODE_BUSY)); wait_for_key (60); return (-1); } busy = 1; } /* First fill it all with blanks */ sb_fill (r, ' ', colors.popup); /* Now draw the box */ sb_box (r, boxtype, colors.popup); sb_move (r, 0, 1); sb_puts (r, MSG_TXT (M_GET_FILE)); /* Now do the fields */ for (;;) { sb_move (r, 1, 2); sb_puts (r, MSG_TXT (M_ADDRESS_TO_GET_FROM)); /* Display address if zoomed, ask for it if not. */ if (x) { strncpy (node, Full_Addr_Str (&addr), 35); node[35] = '\0'; sb_move (r, 1, 23); sb_puts (r, node); } else { if (sb_input_chars (r, 1, 23, node, 36)) break; if (!find_address (node, &addr)) { if (!did_it) did_it = -1; break; } /* Busy the node if we can. */ if (flag_file (TEST_AND_SET, &addr, 0)) { sb_move (r, 2, 2); sb_puts (r, MSG_TXT (M_NODE_BUSY)); wait_for_key (60); if (!did_it) did_it = -1; break; } busy = 1; } /* Ask for the filename */ sb_move (r, 2, 2); sb_puts (r, MSG_TXT (M_FILE_TO_RECEIVE)); if (sb_input_chars (r, 2, 23, file, 12)) break; /* Get the password if any */ sb_move (r, 3, 2); sb_puts (r, MSG_TXT (M_PASSWORD_TO_USE)); (void) sb_input_chars (r, 3, 23, password, 8); /* Get the flavor or quit */ sb_move (r, 4, 2); sb_puts (r, MSG_TXT (M_GET_FLAVOR)); (void) sb_input_chars (r, 4, 41, flavor, 1); /* Get the file if we can */ if (flavor[0] != 'Q') { if (mail_addrequest (&addr, file, password, flavor) == 0) did_it = 1; else if (!did_it) did_it = -1; } /* Unbusy the node */ if (!x) { (void) flag_file (CLEAR_FLAG, &addr, 0); busy = 0; } /* Anything more to do? */ sb_move (r, 5, 2); sb_puts (r, MSG_TXT (M_GET_MORE)); (void) sb_input_chars (r, 5, 23, more, 1); if (more[0] != (char) toupper (MSG_TXT (M_YES)[0])) break; /* Yes, clear the box. */ for (i = 1; i <= 5; i++) { sb_move (r, i, 2); sb_puts (r, " "); } } /* If we busied something, get rid of it. */ if (busy) (void) flag_file (CLEAR_FLAG, &addr, 0); return (did_it); } static int LOCALFUNC mail_addrequest (ADDRP pAddr, char *file, char *password, char *flavor) { char *HoldName; char fname[100]; FILE *f; if (flavor[0] == '\0') flavor[0] = 'N'; if ((flavor[0] != 'C') && (flavor[0] != 'H') && (flavor[0] != 'N') && (flavor[0] != 'D')) return (-3); if (flavor[0] == 'N') flavor[0] = 'F'; flavor[1] = '\0'; HoldName = HoldAreaNameMunge (pAddr); /* Now see if we should send anything back to him */ (void) sprintf (fname, "%s%s.REQ", HoldName, Hex_Addr_Str (pAddr)); if ((f = fopen (fname, append_binary)) == NULL) return (-2); (void) fprintf (f, "%s", file); if (password[0] != '\0') { (void) fprintf (f, " !%s", password); } (void) fprintf (f, "\r\n"); (void) fclose (f); (void) mail_addsend (pAddr, "", flavor); return (0); } int Do_Poll_Packet (BINK_SAVEP p, int x) { REGIONP r; char node[51]; char more[2]; int busy = 0; int did_it = 0; ADDR addr; if (p == NULL) return (0); r = p->region; if (x) { addr = cur->mail_addr; /* Busy the node if we can. */ if (flag_file (TEST_AND_SET, &addr, 0)) { sb_move (r, 2, 2); sb_puts (r, MSG_TXT (M_NODE_BUSY)); wait_for_key (60); return (-1); } busy = 1; } /* First fill it all with blanks */ sb_fill (r, ' ', colors.popup); /* Now draw the box */ sb_box (r, boxtype, colors.popup); sb_move (r, 0, 1); sb_puts (r, MSG_TXT (M_ZOOM_POLL)); /* Now do the fields */ sb_move (r, 1, 2); sb_puts (r, MSG_TXT (M_POLL_WHOM)); /* Display address if zoomed, ask for it if not. */ if (x) { strncpy (node, Full_Addr_Str (&addr), 39); node[39] = '\0'; sb_move (r, 1, 14); sb_puts (r, node); } else { if (sb_input_chars (r, 1, 14, node, 40)) goto Done; if (!find_address (node, &addr)) { if (!did_it) did_it = -1; goto Done; } /* Busy the node if we can. */ if (flag_file (TEST_AND_SET, &addr, 0)) { sb_move (r, 2, 2); sb_puts (r, MSG_TXT (M_NODE_BUSY)); wait_for_key (60); if (!did_it) did_it = -1; goto Done; } busy = 1; } if (x) { sb_move (r, 2, 2); sb_puts (r, MSG_TXT (M_ARE_YOU_SURE)); if (sb_input_chars (r, 2, 22, more, 1)) goto Done; if (more[0] != (char) toupper (MSG_TXT (M_YES)[0])) goto Done; } if (mail_addsend (&addr, "", "C") == 0) did_it = 1; else if (!did_it) did_it = -1; Done: /* If we busied something, get rid of it. */ if (busy) (void) flag_file (CLEAR_FLAG, &addr, 0); return (did_it); } int Do_Send (BINK_SAVEP p, int x) { REGIONP r; char node[51]; char file[51]; char flavor[2]; char more[2]; int busy = 0; int did_it = 0; short i; ADDR addr; if (p == NULL) return (0); r = p->region; if (x) { addr = cur->mail_addr; /* Busy the node if we can. */ if (flag_file (TEST_AND_SET, &addr, 0)) { sb_move (r, 2, 2); sb_puts (r, MSG_TXT (M_NODE_BUSY)); wait_for_key (60); return (-1); } busy = 1; } /* First fill it all with blanks */ sb_fill (r, ' ', colors.popup); /* Now draw the box */ sb_box (r, boxtype, colors.popup); sb_move (r, 0, 1); sb_puts (r, MSG_TXT (M_SEND_FILE)); /* Now do the fields */ for (;;) { sb_move (r, 1, 2); sb_puts (r, MSG_TXT (M_ADDRESS_TO_SEND_TO)); /* Display address if zoomed, ask for it if not. */ if (x) { strncpy (node, Full_Addr_Str (&addr), 46); node[46] = '\0'; sb_move (r, 1, 22); sb_puts (r, node); } else { if (sb_input_chars (r, 1, 22, node, 47)) break; if (!find_address (node, &addr)) { if (!did_it) did_it = -1; break; } /* Busy the node if we can. */ if (flag_file (TEST_AND_SET, &addr, 0)) { sb_move (r, 2, 2); sb_puts (r, MSG_TXT (M_NODE_BUSY)); wait_for_key (60); if (!did_it) did_it = -1; break; } busy = 1; } /* Ask for the filename */ sb_move (r, 2, 2); sb_puts (r, MSG_TXT (M_FILE_TO_SEND)); if (sb_input_chars (r, 2, 22, file, 47)) break; /* Get the flavor or quit */ sb_move (r, 3, 2); sb_puts (r, MSG_TXT (M_SEND_FLAVOR)); (void) sb_input_chars (r, 3, 49, flavor, 1); /* Send the file if we can */ if (flavor[0] != 'Q') { if (mail_addsend (&addr, file, flavor) == 0) did_it = 1; else if (!did_it) did_it = -1; } /* Unbusy the node */ if (!x) { (void) flag_file (CLEAR_FLAG, &addr, 0); busy = 0; } /* Anything more to do? */ sb_move (r, 4, 2); sb_puts (r, MSG_TXT (M_SEND_MORE)); (void) sb_input_chars (r, 4, 20, more, 1); if (more[0] != (char) toupper (MSG_TXT (M_YES)[0])) break; /* Yes, clear the box. */ for (i = 1; i <= 4; i++) { sb_move (r, i, 2); sb_puts (r, " "); } } /* If we busied something, get rid of it. */ if (busy) (void) flag_file (CLEAR_FLAG, &addr, 0); return (did_it); } static int LOCALFUNC mail_addsend (ADDRP pAddr, char *file, char *flavor) { char *HoldName; char fname[100]; FILE *f; if (flavor[0] == '\0') flavor[0] = 'N'; if ((flavor[0] != 'C') && (flavor[0] != 'H') && (flavor[0] != 'N') && (flavor[0] != 'D')) return (-3); if (flavor[0] == 'N') flavor[0] = 'F'; flavor[1] = '\0'; HoldName = HoldAreaNameMunge (pAddr); (void) sprintf (fname, "%s%s.%sLO", HoldName, Hex_Addr_Str (pAddr), flavor); if ((f = fopen (fname, append_binary)) == NULL) { return (-2); } else { if (file[0] != '\0') (void) fprintf (f, "%s\r\n", file); (void) fclose (f); } return (0); } int Do_Kill (BINK_SAVEP p, int x) { REGIONP r; char node[51]; char sure[2]; if (p != NULL) { r = p->region; /* First fill it all with blanks */ sb_fill (r, ' ', colors.popup); /* Now draw the box */ sb_box (r, boxtype, colors.popup); sb_move (r, 0, 1); sb_puts (r, MSG_TXT (M_KILL_MAIL)); /* Now do the fields */ sb_move (r, 1, 2); sb_puts (r, MSG_TXT (M_ADDRESS_TO_KILL)); if (x) { strncpy (node, Full_Addr_Str (&cur->mail_addr), 50); node[50] = '\0'; sb_move (r, 1, 19); sb_puts (r, node); } else if (sb_input_chars (r, 1, 19, node, 50)) return 0; sb_move (r, 2, 2); sb_puts (r, MSG_TXT (M_KILL_ALL_MAIL)); sb_puts (r, MSG_TXT (M_ARE_YOU_SURE)); (void) sb_input_chars (r, 2, 38, sure, 1); if (sure[0] == (char) toupper (MSG_TXT (M_YES)[0])) x = kill_node (node); else x = 0; } else x = 0; /* Return value is never checked, just use x so lint and -W3 don't get mad */ return (x); } int Do_Poll (BINK_SAVEP p, int x) { char node[51]; REGIONP r; happy_compiler = x; /* Makes the compiler happy! */ if (p != NULL) { r = p->region; /* First fill it all with blanks */ sb_fill (r, ' ', colors.popup); /* Now draw the box */ sb_box (r, boxtype, colors.popup); sb_move (r, 0, 1); sb_puts (r, MSG_TXT (M_NODE_TO_POLL)); /* Now do the fields */ sb_move (r, 1, 2); sb_puts (r, MSG_TXT (M_POLL_WHOM)); if (!sb_input_chars (r, 1, 14, node, 40)) { return (find_address (node, &next_addr)); } } return (FALSE); } static int LOCALFUNC kill_node (char *node) { ADDR addr; char *HoldName; char *p; char fname[160]; struct FILEINFO fileinfo = {0}; int j; if (find_address (node, &addr)) { if (flag_file (TEST_AND_SET, &addr, 0)) { return (-1); } HoldName = HoldAreaNameMunge (&addr); (void) sprintf (fname, "%s%s.*", HoldName, Hex_Addr_Str (&addr)); j = 0; while (!dfind (&fileinfo, fname, j)) { j = 1; /* Don't delete the .bsy flags yet */ if ((p = strchr (fileinfo.name, '.')) != NULL) { if (strcmp (p, ".BSY") == 0) continue; } if (addr.Point != 0) { (void) sprintf (fname, "%s%04hx%04hx.PNT\\%s", HoldName, addr.Net, addr.Node, fileinfo.name); } else (void) sprintf (fname, "%s%s", HoldName, fileinfo.name); (void) unlink (fname); } if (j) (void) dfind (&fileinfo, NULL, 2); (void) flag_file (CLEAR_FLAG, &addr, 0); return (0); } /* else */ return (-1); } static void LOCALFUNC call_tries (ADDRP baddr, int *calls, int *badcalls) { int res; int i, j; struct FILEINFO bad_dta = {0}; char *HoldName; char fname[128]; HoldName = HoldAreaNameMunge (baddr); (void) sprintf (fname, "%s%s.$$?", HoldName, Hex_Addr_Str (baddr)); j = (int) strlen (fname) - 1; /* Point at ? */ res = -1; /* Initialize to fail */ i = 0; /* This says findfirst */ while (!dfind (&bad_dta, fname, i)) /* as long as we match */ { if (isdigit (bad_dta.name[11])) /* is there a digit? */ { fname[j] = bad_dta.name[11]; /* Yes, copy to fname */ res = fname[j] - '0'; /* Save it for testing */ break; /* Get out of while */ } else i = 1; /* Else use findnext */ } if (i) (void) dfind (&bad_dta, NULL, 2); /* Initialize the return values */ *calls = *badcalls = 0; /* Is it automatically ok (no .$$ file there) ? */ if (res == -1) return; /* We now have the number of bad calls (calls with carrier) */ *badcalls = res; /* Open the file and find out how many total calls were made */ i = open (fname, O_RDONLY | O_BINARY); if (i != -1) { res = 0; (void) read (i, (char *) &res, sizeof (int)); (void) close (i); } *calls = res; return; } #if 0 static char LOCALFUNC xlat_flavor (char flavor); static char LOCALFUNC xlat_flavor (char flavor) { char *real_flavor = "CHDN"; char *user_flavor; user_flavor = MSG_TXT (M_CHDN_FLAGS); for (;;) { if (!*real_flavor) break; if (*user_flavor == flavor) { return *real_flavor; } user_flavor++; real_flavor++; } return (0); } #endif