/******************************************************************** * Kill message overlay for metal Version 1.20a * * File: MEKILL.C * * Copyright (c) 1984 Tim Gary * Delphi Data Systems * All Rights Reserved. * ******************************************************************** * * 1.20a 11/04/84 Version change. * 1.10e 11/03/84 Fixed for new put/get counters routine. * 1.10e 11/02/84 Msg number=parent in dead msgs deleted. * 1.10e 10/31/84 Unkill added. * 1.10b 10/02/84 Novice users bug when 'r;100;102;300' and wants * to kill a message addressed to them. * 1.10a 9/01/84 Created from MS.C, for overlay version of metal. * ********************************************************************/ #include "xpm.h" #include "hmh.h" #include "hmconfg.h" #include "ctype.h" ovmain(func,parm) int func; unsigned parm; { switch (func) { case KILL: return kill(parm); case UNKILL: return unkill(parm); default: send("\nUnknown Overlay function called for.\n"); return ERROR; } } /********************************************************* * kill(delete) a message.... first ask for confirmation * *********************************************************/ kill(mn) register unsigned mn; { char msearch(); char temp[51],tpass,killok[3],sender[FNAMELEN+LNAMELEN+2]; register unsigned msgnum; register int a; msg_record *mptr; /* for summary/message file stuff */ int n,lns; int sreq=0; int flag=FALSE; #ifdef MULTI_USER mu_update(); /* if multi user, check for new messages */ #endif if (!msgcount) { send("\nNo messages.\n"); return; } if (!mn){ sprintf(buffer,"\nKill which msg (%u-%u)? ",fmsg,lmsg); ask(buffer,temp,50,UP); msgnum=atoi(temp); if (!(sreq=msearch(temp)) && !msgnum) return; } else msgnum=mn; if ( (a=getindex(msgnum))==ERROR && msgnum && !sreq) { send("[Message NOT found]"); return; } if (a==ERROR) a=0; /* fix for loop, and search request */ *killok='Y'; /* simulte always Yes to confirm.... for later */ do { /* massive do loop */ messages=open(MESSAGES,F_RW | F_UNLOCK); setarec(messages,msg[a].seek); /* absolute seek to that pos */ if ((lns=msgheader(messages,msgnum,3))==ERROR) break; if (!sreq && lns==0) { send("\n[Message not addressed to you]"); break; /* say what happened, and leave */ } else if (lns!=0 && user.parm.expert==POFF) { send("\nConfirm (y/n)? "); if (mn) { *killok=toupper(getd()); if (*killok=='Y') send("[yes]\n"); else send("[no]"); } else ask("",killok,2,UP); } /* printf("\nlns=%d, msg[a].number=%u, a=%d, mn=%u, msgnum=%u, sreq=%d\n",lns, msg[a].number,a,mn,msgnum,sreq); */ if (lns && msg[a].number) { if (*killok=='Y') { sprintf(temp,"\n[Deleting message #%u]",msg[a].number); if (send(temp)==ERROR || breakkey()) { printf("\n[*** Aborted ***]\n"); break; /* exit and close file */ } mptr=bufloc(messages); mptr->parent=mptr->reply=0; if (mptr->status==PRIVMSG) privmsgs--; mptr->status=DEADMSG; setrrec(messages,-1); /* backup */ write(messages,0); /* close(messages); */ /* now to fix summary file */ summary=open(SUMMARY,F_RW | F_UNLOCK); sprintf(bufloc(summary),"%5u",--msgcount); write(summary,1); mptr=bufloc(summary); do n=read(summary,1); while (n==128 && mptr->number!=msg[a].number); setrrec(summary,-1); /* seek relative to current */ mptr->parent=mptr->reply=0; mptr->status=DEADMSG; /* will be used later */ write(summary,0); /* to kill message */ close(summary); /* following two compares are for special reply handling... they will be slower * than killing msgs without replys since up to two added disk operations * are needed for killing of a reply */ if (msg[a].parent!=0) /* this is a reply msg ? */ { /* yep */ msg[(n=getindex(msg[a].parent))].reply=msg[a].reply; /* move this msg reply to parent reply... */ updatemsg(n); /* rewrite parent message... */ } if (msg[a].reply!=0) /* is there reply to this message ?? */ { /* uh huh */ msg[(n=getindex(msg[a].reply))].parent=msg[a].parent; /* move this msg parent to reply parent... */ updatemsg(n); /* rewrite parent msg */ } flag=TRUE; msg[a].parent=msg[a].reply=0; } /* successfull *temp=='Y' */ } /* if lns.. */ if (!sreq || mn) break; /* stop here if no search request */ messages=close(messages); /* close this each time through */ } while (++aparent=mptr->reply=0; mptr->status=newstat; setrrec(messages,-1); /* backup */ write(messages,0); /* close(messages); */ /* now to fix summary file */ summary=open(SUMMARY,F_RW | F_UNLOCK); sprintf(bufloc(summary),"%5u",++msgcount); write(summary,1); mptr=bufloc(summary); do n=read(summary,1); while (n==128 && mptr->number!=msg[a].number); setrrec(summary,-1); /* seek relative to current */ mptr->parent=mptr->reply=0; mptr->status=newstat; /* will be used later */ write(summary,0); /* to kill message */ close(summary); flag=TRUE; msg[a].parent=msg[a].reply=0; } /* successfull *unkillok=='Y' */ } /* if lns.. */ if (!sreq || mn) break; /* stop here if no search request */ messages=close(messages); } while (++a