Annotation of sbbs/sbbs3/readmsgs.cpp, revision 1.1.1.2

1.1       root        1: /* readmsgs.cpp */
                      2: 
                      3: /* Synchronet public message reading function */
                      4: 
1.1.1.2 ! root        5: /* $Id: readmsgs.cpp,v 1.29 2004/10/27 21:16:59 rswindell Exp $ */
1.1       root        6: 
                      7: /****************************************************************************
                      8:  * @format.tab-size 4          (Plain Text/Source Code File Header)                    *
                      9:  * @format.use-tabs true       (see http://www.synchro.net/ptsc_hdr.html)              *
                     10:  *                                                                                                                                                     *
1.1.1.2 ! root       11:  * Copyright 2004 Rob Swindell - http://www.synchro.net/copyright.html         *
1.1       root       12:  *                                                                                                                                                     *
                     13:  * This program is free software; you can redistribute it and/or                       *
                     14:  * modify it under the terms of the GNU General Public License                         *
                     15:  * as published by the Free Software Foundation; either version 2                      *
                     16:  * of the License, or (at your option) any later version.                                      *
                     17:  * See the GNU General Public License for more details: gpl.txt or                     *
                     18:  * http://www.fsf.org/copyleft/gpl.html                                                                                *
                     19:  *                                                                                                                                                     *
                     20:  * Anonymous FTP access to the most recent released source is available at     *
                     21:  * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net     *
                     22:  *                                                                                                                                                     *
                     23:  * Anonymous CVS access to the development source and modification history     *
                     24:  * is available at cvs.synchro.net:/cvsroot/sbbs, example:                                     *
                     25:  * cvs -d :pserver:[email protected]:/cvsroot/sbbs login                       *
                     26:  *     (just hit return, no password is necessary)                                                     *
                     27:  * cvs -d :pserver:[email protected]:/cvsroot/sbbs checkout src                *
                     28:  *                                                                                                                                                     *
                     29:  * For Synchronet coding style and modification guidelines, see                                *
                     30:  * http://www.synchro.net/source.html                                                                          *
                     31:  *                                                                                                                                                     *
                     32:  * You are encouraged to submit any modifications (preferably in Unix diff     *
                     33:  * format) via e-mail to [email protected]                                                                      *
                     34:  *                                                                                                                                                     *
                     35:  * Note: If this box doesn't appear square, then you need to fix your tabs.    *
                     36:  ****************************************************************************/
                     37: 
                     38: #include "sbbs.h"
                     39: 
                     40: int sbbs_t::sub_op(uint subnum)
                     41: {
                     42:        return(SYSOP || (cfg.sub[subnum]->op_ar[0] && chk_ar(cfg.sub[subnum]->op_ar,&useron)));
                     43: }
                     44: 
                     45: 
                     46: void sbbs_t::listmsgs(int subnum, post_t HUGE16 *post, long i, long posts)
                     47: {
                     48:        char ch;
                     49:        smbmsg_t msg;
                     50: 
                     51: 
                     52:        bputs(text[MailOnSystemLstHdr]);
                     53:        msg.total_hfields=0;
                     54:        while(i<posts && !msgabort()) {
                     55:                if(msg.total_hfields)
                     56:                        smb_freemsgmem(&msg);
                     57:                msg.total_hfields=0;
                     58:                msg.idx.offset=post[i].offset;
                     59:                if(!loadmsg(&msg,post[i].number))
                     60:                        break;
                     61:                smb_unlockmsghdr(&smb,&msg);
                     62:                if(msg.hdr.attr&MSG_DELETE)
                     63:                        ch='-';
                     64:                else if((!stricmp(msg.to,useron.alias) || !stricmp(msg.to,useron.name))
                     65:                        && !(msg.hdr.attr&MSG_READ))
                     66:                        ch='!';
1.1.1.2 ! root       67:                else if(msg.hdr.number>subscan[subnum].ptr)
1.1       root       68:                        ch='*';
                     69:                else
                     70:                        ch=' ';
                     71:                bprintf(text[SubMsgLstFmt],(long)i+1
                     72:                        ,msg.hdr.attr&MSG_ANONYMOUS && !sub_op(subnum)
                     73:                        ? text[Anonymous] : msg.from
                     74:                        ,msg.to
                     75:                        ,ch
                     76:                        ,msg.subj);
                     77:                smb_freemsgmem(&msg);
                     78:                msg.total_hfields=0;
1.1.1.2 ! root       79:                i++; 
        !            80:        }
1.1       root       81: }
                     82: 
                     83: char *binstr(uchar *buf, ushort length)
                     84: {
1.1.1.2 ! root       85:        static char str[512];
1.1       root       86:        char tmp[128];
                     87:        int i;
                     88: 
                     89:        str[0]=0;
                     90:        for(i=0;i<length;i++)
1.1.1.2 ! root       91:                if(buf[i] && (buf[i]<' ' || buf[i]>=0x7f)
        !            92:                        && buf[i]!='\r' && buf[i]!='\n' && buf[i]!='\t')
1.1       root       93:                        break;
                     94:        if(i==length)           /* not binary */
                     95:                return((char*)buf);
                     96:        for(i=0;i<length;i++) {
                     97:                sprintf(tmp,"%02X ",buf[i]);
1.1.1.2 ! root       98:                strcat(str,tmp); 
        !            99:        }
1.1       root      100:        return(str);
                    101: }
                    102: 
                    103: 
                    104: void sbbs_t::msghdr(smbmsg_t* msg)
                    105: {
                    106:        int i;
                    107: 
1.1.1.2 ! root      108:        CRLF;
        !           109: 
        !           110:        /* variable fields */
1.1       root      111:        for(i=0;i<msg->total_hfields;i++)
1.1.1.2 ! root      112:                bprintf("%-16.16s %s\r\n"
        !           113:                        ,smb_hfieldtype(msg->hfield[i].type)
        !           114:                        ,binstr((uchar *)msg->hfield_dat[i],msg->hfield[i].length));
        !           115: 
        !           116:        /* fixed fields */
        !           117:        bprintf("%-16.16s %s %s\r\n","when_written"     
        !           118:                ,timestr((time_t *)&msg->hdr.when_written.time), smb_zonestr(msg->hdr.when_written.zone,NULL));
        !           119:        bprintf("%-16.16s %s %s\r\n","when_imported"    
        !           120:                ,timestr((time_t *)&msg->hdr.when_imported.time), smb_zonestr(msg->hdr.when_imported.zone,NULL));
        !           121:        bprintf("%-16.16s %04Xh\r\n","type"                             ,msg->hdr.type);
        !           122:        bprintf("%-16.16s %04Xh\r\n","version"                  ,msg->hdr.version);
        !           123:        bprintf("%-16.16s %04Xh\r\n","attr"                             ,msg->hdr.attr);
        !           124:        bprintf("%-16.16s %08lXh\r\n","auxattr"                 ,msg->hdr.auxattr);
        !           125:        bprintf("%-16.16s %08lXh\r\n","netattr"                 ,msg->hdr.netattr);
        !           126:        bprintf("%-16.16s %ld\r\n"       ,"number"                      ,msg->hdr.number);
        !           127:        bprintf("%-16.16s %06lXh\r\n","header offset"   ,msg->idx.offset);
        !           128:        bprintf("%-16.16s %u\r\n"        ,"header length"       ,msg->hdr.length);
        !           129: 
        !           130:        /* optional fixed fields */
        !           131:        if(msg->hdr.thread_back)
        !           132:                bprintf("%-16.16s %ld\r\n"      ,"thread_back"          ,msg->hdr.thread_back);
        !           133:        if(msg->hdr.thread_next)
        !           134:                bprintf("%-16.16s %ld\r\n"      ,"thread_next"          ,msg->hdr.thread_next);
        !           135:        if(msg->hdr.thread_first)
        !           136:                bprintf("%-16.16s %ld\r\n"      ,"thread_first"         ,msg->hdr.thread_first);
        !           137:        if(msg->hdr.delivery_attempts)
        !           138:                bprintf("%-16.16s %hu\r\n"      ,"delivery_attempts",msg->hdr.delivery_attempts);
        !           139:        if(msg->hdr.times_downloaded)
        !           140:                bprintf("%-16.16s %lu\r\n"      ,"times_downloaded"     ,msg->hdr.times_downloaded);
        !           141:        if(msg->hdr.last_downloaded)
        !           142:                bprintf("%-16.16s %s\r\n"       ,"last_downloaded"      ,timestr((time_t*)&msg->hdr.last_downloaded));
        !           143: 
        !           144:        /* convenience integers */
        !           145:        if(msg->expiration)
        !           146:                bprintf("%-16.16s %s\r\n"       ,"expiration"   
        !           147:                        ,timestr((time_t *)&msg->expiration));
        !           148:        if(msg->priority)
        !           149:                bprintf("%-16.16s %lu\r\n"      ,"priority"                     ,msg->priority);
        !           150:        if(msg->cost)
        !           151:                bprintf("%-16.16s %lu\r\n"      ,"cost"                         ,msg->cost);
        !           152: 
        !           153:        bprintf("%-16.16s %06lXh\r\n"   ,"data offset"          ,msg->hdr.offset);
        !           154:        for(i=0;i<msg->hdr.total_dfields;i++)
        !           155:                bprintf("data field[%u]    %s, offset %lu, length %lu\r\n"
        !           156:                                ,i
        !           157:                                ,smb_dfieldtype(msg->dfield[i].type)
        !           158:                                ,msg->dfield[i].offset
        !           159:                                ,msg->dfield[i].length);
1.1       root      160: }
                    161: 
                    162: /****************************************************************************/
                    163: /****************************************************************************/
                    164: post_t HUGE16 * sbbs_t::loadposts(long *posts, uint subnum, ulong ptr, long mode)
                    165: {
                    166:        char name[128];
                    167:        ushort aliascrc,namecrc,sysop;
                    168:        int i,skip;
                    169:        ulong l=0,total,alloc_len;
                    170:        smbmsg_t msg;
                    171:        idxrec_t idx;
                    172:        post_t HUGE16 *post;
                    173: 
                    174:        if(posts==NULL)
                    175:                return(NULL);
                    176: 
                    177:        (*posts)=0;
                    178: 
                    179:        if((i=smb_locksmbhdr(&smb))!=0) {                               /* Be sure noone deletes or */
                    180:                errormsg(WHERE,ERR_LOCK,smb.file,i);            /* adds while we're reading */
1.1.1.2 ! root      181:                return(NULL); 
        !           182:        }
1.1       root      183: 
                    184:        total=filelength(fileno(smb.sid_fp))/sizeof(idxrec_t); /* total msgs in sub */
                    185: 
                    186:        if(!total) {                    /* empty */
                    187:                smb_unlocksmbhdr(&smb);
1.1.1.2 ! root      188:                return(NULL); 
        !           189:        }
1.1       root      190: 
                    191:        strcpy(name,useron.name);
                    192:        strlwr(name);
1.1.1.2 ! root      193:        namecrc=crc16(name,0);
1.1       root      194:        strcpy(name,useron.alias);
                    195:        strlwr(name);
1.1.1.2 ! root      196:        aliascrc=crc16(name,0);
        !           197:        sysop=crc16("sysop",0);
1.1       root      198: 
                    199:        rewind(smb.sid_fp);
                    200: 
                    201:        alloc_len=sizeof(post_t)*total;
                    202:        #ifdef __OS2__
                    203:                while(alloc_len%4096)
                    204:                        alloc_len++;
                    205:        #endif
                    206:        if((post=(post_t HUGE16 *)LMALLOC(alloc_len))==NULL) {  /* alloc for max */
                    207:                smb_unlocksmbhdr(&smb);
                    208:                errormsg(WHERE,ERR_ALLOC,smb.file,sizeof(post_t *)*cfg.sub[subnum]->maxmsgs);
1.1.1.2 ! root      209:                return(NULL); 
        !           210:        }
1.1       root      211:        while(!feof(smb.sid_fp)) {
                    212:                skip=0;
1.1.1.2 ! root      213:                if(smb_fread(&smb, &idx,sizeof(idx),smb.sid_fp) != sizeof(idx))
1.1       root      214:                        break;
                    215: 
1.1.1.2 ! root      216:                if(idx.number==0)       /* invalid message number, ignore */
        !           217:                        continue;
        !           218: 
1.1       root      219:                if(idx.number<=ptr)
                    220:                        continue;
                    221: 
                    222:                if(idx.attr&MSG_READ && mode&LP_UNREAD) /* Skip read messages */
                    223:                        continue;
                    224: 
                    225:                if(idx.attr&MSG_DELETE) {               /* Pre-flagged */
                    226:                        if(mode&LP_REP)                         /* Don't include deleted msgs in REP pkt */
                    227:                                continue;
                    228:                        if(!(cfg.sys_misc&SM_SYSVDELM)) /* Noone can view deleted msgs */
                    229:                                continue;
                    230:                        if(!(cfg.sys_misc&SM_USRVDELM)  /* Users can't view deleted msgs */
                    231:                                && !sub_op(subnum))     /* not sub-op */
                    232:                                continue;
                    233:                        if(!sub_op(subnum)                      /* not sub-op */
                    234:                                && idx.from!=namecrc && idx.from!=aliascrc) /* not for you */
1.1.1.2 ! root      235:                                continue; 
        !           236:                }
1.1       root      237: 
                    238:                if(idx.attr&MSG_MODERATED && !(idx.attr&MSG_VALIDATED)
                    239:                        && (mode&LP_REP || !sub_op(subnum)))
                    240:                        break;
                    241: 
                    242:                if(idx.attr&MSG_PRIVATE && !(mode&LP_PRIVATE)
                    243:                        && !sub_op(subnum) && !(useron.rest&FLAG('Q'))) {
                    244:                        if(idx.to!=namecrc && idx.from!=namecrc
                    245:                                && idx.to!=aliascrc && idx.from!=aliascrc
                    246:                                && (useron.number!=1 || idx.to!=sysop))
                    247:                                continue;
                    248:                        if(!smb_lockmsghdr(&smb,&msg)) {
                    249:                                if(!smb_getmsghdr(&smb,&msg)) {
                    250:                                        if(stricmp(msg.to,useron.alias)
                    251:                                                && stricmp(msg.from,useron.alias)
                    252:                                                && stricmp(msg.to,useron.name)
                    253:                                                && stricmp(msg.from,useron.name)
                    254:                                                && (useron.number!=1 || stricmp(msg.to,"sysop")
                    255:                                                || msg.from_net.type))
                    256:                                                skip=1;
1.1.1.2 ! root      257:                                        smb_freemsgmem(&msg); 
        !           258:                                }
        !           259:                                smb_unlockmsghdr(&smb,&msg); 
        !           260:                        }
1.1       root      261:                        if(skip)
1.1.1.2 ! root      262:                                continue; 
        !           263:                }
1.1       root      264: 
                    265: 
                    266:                if(!(mode&LP_BYSELF) && (idx.from==namecrc || idx.from==aliascrc)) {
                    267:                        msg.idx=idx;
                    268:                        if(!smb_lockmsghdr(&smb,&msg)) {
                    269:                                if(!smb_getmsghdr(&smb,&msg)) {
                    270:                                        if(!stricmp(msg.from,useron.alias)
                    271:                                                || !stricmp(msg.from,useron.name))
                    272:                                                skip=1;
1.1.1.2 ! root      273:                                        smb_freemsgmem(&msg); 
        !           274:                                }
        !           275:                                smb_unlockmsghdr(&smb,&msg); 
        !           276:                        }
1.1       root      277:                        if(skip)
1.1.1.2 ! root      278:                                continue; 
        !           279:                }
1.1       root      280: 
                    281:                if(!(mode&LP_OTHERS)) {
                    282:                        if(idx.to!=namecrc && idx.to!=aliascrc
                    283:                                && (useron.number!=1 || idx.to!=sysop))
                    284:                                continue;
                    285:                        msg.idx=idx;
                    286:                        if(!smb_lockmsghdr(&smb,&msg)) {
                    287:                                if(!smb_getmsghdr(&smb,&msg)) {
                    288:                                        if(stricmp(msg.to,useron.alias) && stricmp(msg.to,useron.name)
                    289:                                                && (useron.number!=1 || stricmp(msg.to,"sysop")
                    290:                                                || msg.from_net.type))
                    291:                                                skip=1;
1.1.1.2 ! root      292:                                        smb_freemsgmem(&msg); 
        !           293:                                }
        !           294:                                smb_unlockmsghdr(&smb,&msg); 
        !           295:                        }
1.1       root      296:                        if(skip)
1.1.1.2 ! root      297:                                continue; 
        !           298:                }
1.1       root      299: 
1.1.1.2 ! root      300:                memcpy(&post[l],&idx,sizeof(idx));
        !           301:                l++; 
        !           302:        }
1.1       root      303:        smb_unlocksmbhdr(&smb);
1.1.1.2 ! root      304:        if(!l)
        !           305:                FREE_AND_NULL(post);
        !           306: 
1.1       root      307:        (*posts)=l;
                    308:        return(post);
                    309: }
                    310: 
1.1.1.2 ! root      311: static int get_start_msg(sbbs_t* sbbs, smb_t* smb)
        !           312: {
        !           313:        int i,j=smb->curmsg+1;
        !           314: 
        !           315:        if(j<smb->msgs)
        !           316:                j++;
        !           317:        else
        !           318:                j=1;
        !           319:        sbbs->bprintf(sbbs->text[StartWithN],j);
        !           320:        if((i=sbbs->getnum(smb->msgs))<0)
        !           321:                return(i);
        !           322:        if(i==0)
        !           323:                return(j-1);
        !           324:        return(i-1);
        !           325: }
1.1       root      326: 
                    327: /****************************************************************************/
                    328: /* Reads posts on subboard sub. 'mode' determines new-posts only, browse,   */
                    329: /* or continuous read.                                                      */
                    330: /* Returns 0 if normal completion, 1 if aborted.                            */
                    331: /* Called from function main_sec                                            */
                    332: /****************************************************************************/
                    333: int sbbs_t::scanposts(uint subnum, long mode, char *find)
                    334: {
1.1.1.2 ! root      335:        char    str[256],str2[256],do_find=true,mismatches=0
1.1       root      336:                        ,done=0,domsg=1,HUGE16 *buf,*p;
1.1.1.2 ! root      337:        char    find_buf[128];
        !           338:        char    tmp[128];
1.1       root      339:        int             i;
                    340:        uint    usub,ugrp,reads=0;
                    341:        uint    lp=0;
1.1.1.2 ! root      342:        long    org_mode=mode;
1.1       root      343:        ulong   msgs,last,l;
                    344:        post_t  HUGE16 *post;
                    345:        smbmsg_t        msg;
                    346: 
                    347:        cursubnum=subnum;       /* for ARS */
                    348:        if(!chk_ar(cfg.sub[subnum]->read_ar,&useron)) {
                    349:                bprintf("\1n\r\nYou can't read messages on %s %s\r\n"
                    350:                                ,cfg.grp[cfg.sub[subnum]->grp]->sname,cfg.sub[subnum]->sname);
1.1.1.2 ! root      351:                return(0)        !           352:        }
1.1       root      353:        msg.total_hfields=0;                            /* init to NULL, specify not-allocated */
                    354:        if(!(mode&SCAN_CONST))
                    355:                lncntr=0;
                    356:        if((msgs=getlastmsg(subnum,&last,0))==0) {
                    357:                if(mode&(SCAN_NEW|SCAN_TOYOU))
                    358:                        bprintf(text[NScanStatusFmt]
                    359:                                ,cfg.grp[cfg.sub[subnum]->grp]->sname,cfg.sub[subnum]->lname,0L,0L);
                    360:                else
                    361:                        bprintf(text[NoMsgsOnSub]
                    362:                                ,cfg.grp[cfg.sub[subnum]->grp]->sname,cfg.sub[subnum]->sname);
1.1.1.2 ! root      363:                return(0)        !           364:        }
        !           365:        if(mode&SCAN_NEW && subscan[subnum].ptr>=last && !(mode&SCAN_BACK)) {
        !           366:                if(subscan[subnum].ptr>last)
        !           367:                        subscan[subnum].ptr=subscan[subnum].last=last;
1.1       root      368:                bprintf(text[NScanStatusFmt]
                    369:                        ,cfg.grp[cfg.sub[subnum]->grp]->sname,cfg.sub[subnum]->lname,0L,msgs);
1.1.1.2 ! root      370:                return(0)        !           371:        }
1.1       root      372: 
                    373:        if((i=smb_stack(&smb,SMB_STACK_PUSH))!=0) {
                    374:                errormsg(WHERE,ERR_OPEN,cfg.sub[subnum]->code,i);
1.1.1.2 ! root      375:                return(0)        !           376:        }
1.1       root      377:        sprintf(smb.file,"%s%s",cfg.sub[subnum]->data_dir,cfg.sub[subnum]->code);
                    378:        smb.retry_time=cfg.smb_retry_time;
1.1.1.2 ! root      379:        smb.subnum=subnum;
1.1       root      380:        if((i=smb_open(&smb))!=0) {
                    381:                smb_stack(&smb,SMB_STACK_POP);
                    382:                errormsg(WHERE,ERR_OPEN,smb.file,i,smb.last_error);
1.1.1.2 ! root      383:                return(0)        !           384:        }
1.1       root      385: 
                    386:        if(!(mode&SCAN_TOYOU)
1.1.1.2 ! root      387:                && (!mode || mode&SCAN_FIND || !(subscan[subnum].cfg&SUB_CFG_YSCAN)))
1.1       root      388:                lp=LP_BYSELF|LP_OTHERS;
                    389:        if(mode&SCAN_TOYOU)
                    390:                lp|=LP_UNREAD;
1.1.1.2 ! root      391:        post=loadposts(&smb.msgs,subnum,0,lp);
1.1       root      392:        if(mode&SCAN_NEW) {               /* Scanning for new messages */
1.1.1.2 ! root      393:                for(smb.curmsg=0;smb.curmsg<smb.msgs;smb.curmsg++)
        !           394:                        if(subscan[subnum].ptr<post[smb.curmsg].number)
1.1       root      395:                                break;
                    396:                bprintf(text[NScanStatusFmt]
1.1.1.2 ! root      397:                        ,cfg.grp[cfg.sub[subnum]->grp]->sname,cfg.sub[subnum]->lname,smb.msgs-smb.curmsg,msgs);
        !           398:                if(!smb.msgs) {           /* no messages at all */
1.1       root      399:                        smb_close(&smb);
                    400:                        smb_stack(&smb,SMB_STACK_POP);
1.1.1.2 ! root      401:                        return(0)        !           402:                }
        !           403:                if(smb.curmsg==smb.msgs) {  /* no new messages */
1.1       root      404:                        if(!(mode&SCAN_BACK)) {
                    405:                                if(post)
                    406:                                        LFREE(post);
                    407:                                smb_close(&smb);
                    408:                                smb_stack(&smb,SMB_STACK_POP);
1.1.1.2 ! root      409:                                return(0)        !           410:                        }
        !           411:                        smb.curmsg=smb.msgs-1; 
        !           412:                } 
        !           413:        }
1.1       root      414:        else {
                    415:                if(mode&SCAN_TOYOU)
                    416:                        bprintf(text[NScanStatusFmt]
1.1.1.2 ! root      417:                           ,cfg.grp[cfg.sub[subnum]->grp]->sname,cfg.sub[subnum]->lname,smb.msgs,msgs);
        !           418:                if(!smb.msgs) {
1.1       root      419:                        if(!(mode&SCAN_TOYOU))
                    420:                                bprintf(text[NoMsgsOnSub]
                    421:                                        ,cfg.grp[cfg.sub[subnum]->grp]->sname,cfg.sub[subnum]->sname);
                    422:                        smb_close(&smb);
                    423:                        smb_stack(&smb,SMB_STACK_POP);
1.1.1.2 ! root      424:                        return(0)        !           425:                }
1.1       root      426:                if(mode&SCAN_FIND) {
                    427:                        bprintf(text[SearchSubFmt]
1.1.1.2 ! root      428:                                ,cfg.grp[cfg.sub[subnum]->grp]->sname,cfg.sub[subnum]->lname,smb.msgs);
1.1       root      429:                        domsg=1;
1.1.1.2 ! root      430:                        smb.curmsg=0; 
        !           431:                }
1.1       root      432:                else if(mode&SCAN_TOYOU)
1.1.1.2 ! root      433:                        smb.curmsg=0;
1.1       root      434:                else {
1.1.1.2 ! root      435:                        for(smb.curmsg=0;smb.curmsg<smb.msgs;smb.curmsg++)
        !           436:                                if(post[smb.curmsg].number>=subscan[subnum].last)
1.1       root      437:                                        break;
1.1.1.2 ! root      438:                        if(smb.curmsg==smb.msgs)
        !           439:                                smb.curmsg=smb.msgs-1;
1.1       root      440: 
1.1.1.2 ! root      441:                        domsg=1; 
        !           442:                } 
        !           443:        }
1.1       root      444: 
                    445:        if(useron.misc&RIP)
                    446:                menu("msgscan");
                    447: 
                    448:        if((i=smb_locksmbhdr(&smb))!=0) {
                    449:                smb_close(&smb);
                    450:                smb_stack(&smb,SMB_STACK_POP);
                    451:                errormsg(WHERE,ERR_LOCK,smb.file,i);
1.1.1.2 ! root      452:                return(0)        !           453:        }
1.1       root      454:        if((i=smb_getstatus(&smb))!=0) {
                    455:                smb_close(&smb);
                    456:                smb_stack(&smb,SMB_STACK_POP);
                    457:                errormsg(WHERE,ERR_READ,smb.file,i);
1.1.1.2 ! root      458:                return(0)        !           459:        }
1.1       root      460:        smb_unlocksmbhdr(&smb);
                    461:        last=smb.status.last_msg;
                    462: 
                    463:        action=NODE_RMSG;
                    464:        if(mode&SCAN_CONST) {   /* update action */
                    465:                getnodedat(cfg.node_num,&thisnode,1);
                    466:                thisnode.action=NODE_RMSG;
1.1.1.2 ! root      467:                putnodedat(cfg.node_num,&thisnode); 
        !           468:        }
1.1       root      469:        while(online && !done) {
                    470: 
                    471:                action=NODE_RMSG;
                    472: 
                    473:                if(mode&(SCAN_CONST|SCAN_FIND) && sys_status&SS_ABORT)
                    474:                        break;
                    475: 
                    476:                if(post==NULL)  /* Been unloaded */
1.1.1.2 ! root      477:                        post=loadposts(&smb.msgs,subnum,0,lp);   /* So re-load */
1.1       root      478: 
1.1.1.2 ! root      479:                if(!smb.msgs) {
1.1       root      480:                        done=1;
1.1.1.2 ! root      481:                        continue; 
        !           482:                }
1.1       root      483: 
1.1.1.2 ! root      484:                while(smb.curmsg>=smb.msgs) smb.curmsg--;
1.1       root      485: 
                    486:                for(ugrp=0;ugrp<usrgrps;ugrp++)
                    487:                        if(usrgrp[ugrp]==cfg.sub[subnum]->grp)
                    488:                                break;
                    489:                for(usub=0;usub<usrsubs[ugrp];usub++)
                    490:                        if(usrsub[ugrp][usub]==subnum)
                    491:                                break;
                    492:                usub++;
                    493:                ugrp++;
                    494: 
1.1.1.2 ! root      495:                msg.idx.offset=post[smb.curmsg].offset;
        !           496:                msg.idx.number=post[smb.curmsg].number;
        !           497:                msg.idx.to=post[smb.curmsg].to;
        !           498:                msg.idx.from=post[smb.curmsg].from;
        !           499:                msg.idx.subj=post[smb.curmsg].subj;
1.1       root      500: 
                    501:                if((i=smb_locksmbhdr(&smb))!=0) {
                    502:                        errormsg(WHERE,ERR_LOCK,smb.file,i);
1.1.1.2 ! root      503:                        break; 
        !           504:                }
1.1       root      505:                if((i=smb_getstatus(&smb))!=0) {
                    506:                        smb_unlocksmbhdr(&smb);
                    507:                        errormsg(WHERE,ERR_READ,smb.file,i);
1.1.1.2 ! root      508:                        break; 
        !           509:                }
1.1       root      510:                smb_unlocksmbhdr(&smb);
                    511: 
                    512:                if(smb.status.last_msg!=last) {         /* New messages */
                    513:                        last=smb.status.last_msg;
                    514:                        if(post) {
1.1.1.2 ! root      515:                                LFREE((void *)post); 
        !           516:                        }
        !           517:                        post=loadposts(&smb.msgs,subnum,0,lp);   /* So re-load */
        !           518:                        if(!smb.msgs)
1.1       root      519:                                break;
1.1.1.2 ! root      520:                        for(smb.curmsg=0;smb.curmsg<smb.msgs;smb.curmsg++)
        !           521:                                if(post[smb.curmsg].number==msg.idx.number)
1.1       root      522:                                        break;
1.1.1.2 ! root      523:                        if(smb.curmsg>(smb.msgs-1))
        !           524:                                smb.curmsg=(smb.msgs-1);
        !           525:                        continue; 
        !           526:                }
1.1       root      527: 
                    528:                if(msg.total_hfields)
                    529:                        smb_freemsgmem(&msg);
                    530:                msg.total_hfields=0;
                    531: 
1.1.1.2 ! root      532:                if(!loadmsg(&msg,post[smb.curmsg].number)) {
1.1       root      533:                        if(mismatches>5) {      /* We can't do this too many times in a row */
1.1.1.2 ! root      534:                                errormsg(WHERE,ERR_CHK,smb.file,post[smb.curmsg].number);
        !           535:                                break; 
        !           536:                        }
1.1       root      537:                        if(post)
                    538:                                LFREE(post);
1.1.1.2 ! root      539:                        post=loadposts(&smb.msgs,subnum,0,lp);
        !           540:                        if(!smb.msgs)
1.1       root      541:                                break;
1.1.1.2 ! root      542:                        if(smb.curmsg>(smb.msgs-1))
        !           543:                                smb.curmsg=(smb.msgs-1);
1.1       root      544:                        mismatches++;
1.1.1.2 ! root      545:                        continue; 
        !           546:                }
1.1       root      547:                smb_unlockmsghdr(&smb,&msg);
                    548: 
                    549:                mismatches=0;
                    550: 
1.1.1.2 ! root      551:                if(domsg && !(sys_status&SS_ABORT)) {
1.1       root      552: 
1.1.1.2 ! root      553:                        if(do_find && mode&SCAN_FIND) {                         /* Find text in messages */
        !           554:                                buf=smb_getmsgtxt(&smb,&msg,GETMSGTXT_ALL);
1.1       root      555:                                if(!buf) {
1.1.1.2 ! root      556:                                        if(smb.curmsg<smb.msgs-1) 
        !           557:                                                smb.curmsg++;
        !           558:                                        else if(org_mode&SCAN_FIND)  
        !           559:                                                done=1;
        !           560:                                        else if(smb.curmsg>=smb.msgs-1)
        !           561:                                                        domsg=0;
        !           562:                                        continue; 
        !           563:                                }
1.1       root      564:                                strupr((char *)buf);
                    565:                                if(!strstr((char *)buf,find) && !strstr(msg.subj,find)) {
                    566:                                        FREE(buf);
1.1.1.2 ! root      567:                                        if(smb.curmsg<smb.msgs-1) 
        !           568:                                                smb.curmsg++;
        !           569:                                        else if(org_mode&SCAN_FIND) 
        !           570:                                                        done=1;
        !           571:                                        else if(smb.curmsg>=smb.msgs-1)
        !           572:                                                        domsg=0;
        !           573:                                        continue; 
        !           574:                                }
        !           575:                                FREE(buf); 
        !           576:                        }
1.1       root      577: 
                    578:                        if(mode&SCAN_CONST)
1.1.1.2 ! root      579:                                bprintf(text[ZScanPostHdr],ugrp,usub,smb.curmsg+1,smb.msgs);
1.1       root      580: 
                    581:                        if(!reads && mode)
                    582:                                CRLF;
                    583: 
                    584:                        show_msg(&msg
                    585:                                ,msg.from_ext && !strcmp(msg.from_ext,"1") && !msg.from_net.type
                    586:                                        ? 0:P_NOATCODES);
                    587: 
                    588:                        reads++;        /* number of messages actually read during this sub-scan */
                    589: 
                    590:                        /* Message is to this user and hasn't been read, so flag as read */
                    591:                        if((!stricmp(msg.to,useron.name) || !stricmp(msg.to,useron.alias)
                    592:                                || (useron.number==1 && !stricmp(msg.to,"sysop")
                    593:                                && !msg.from_net.type))
                    594:                                && !(msg.hdr.attr&MSG_READ)) {
                    595:                                if(msg.total_hfields)
                    596:                                        smb_freemsgmem(&msg);
                    597:                                msg.total_hfields=0;
                    598:                                msg.idx.offset=0;
                    599:                                if(!smb_locksmbhdr(&smb)) {                       /* Lock the entire base */
                    600:                                        if(loadmsg(&msg,msg.idx.number)) {
                    601:                                                msg.hdr.attr|=MSG_READ;
                    602:                                                msg.idx.attr=msg.hdr.attr;
                    603:                                                if((i=smb_putmsg(&smb,&msg))!=0)
                    604:                                                        errormsg(WHERE,ERR_WRITE,smb.file,i);
1.1.1.2 ! root      605:                                                smb_unlockmsghdr(&smb,&msg); 
        !           606:                                        }
        !           607:                                        smb_unlocksmbhdr(&smb); 
        !           608:                                }
1.1       root      609:                                if(!msg.total_hfields) {                                /* unsuccessful reload */
                    610:                                        domsg=0;
1.1.1.2 ! root      611:                                        continue; 
        !           612:                                } 
        !           613:                        }
1.1       root      614: 
1.1.1.2 ! root      615:                        subscan[subnum].last=post[smb.curmsg].number;
1.1       root      616: 
1.1.1.2 ! root      617:                        if(subscan[subnum].ptr<post[smb.curmsg].number && !(mode&SCAN_TOYOU)) {
1.1       root      618:                                posts_read++;
1.1.1.2 ! root      619:                                subscan[subnum].ptr=post[smb.curmsg].number; 
        !           620:                        } 
        !           621:                }
1.1       root      622:                else domsg=1;
                    623:                if(mode&SCAN_CONST) {
1.1.1.2 ! root      624:                        if(smb.curmsg<smb.msgs-1) smb.curmsg++;
1.1       root      625:                                else done=1;
1.1.1.2 ! root      626:                        continue; 
        !           627:                }
1.1       root      628:                if(useron.misc&WIP)
                    629:                        menu("msgscan");
                    630:                ASYNC;
                    631:                bprintf(text[ReadingSub],ugrp,cfg.grp[cfg.sub[subnum]->grp]->sname
1.1.1.2 ! root      632:                        ,usub,cfg.sub[subnum]->sname,smb.curmsg+1,smb.msgs);
        !           633:                sprintf(str,"ABCDEFILMPQRTY?<>[]{}-+.,");
1.1       root      634:                if(sub_op(subnum))
                    635:                        strcat(str,"O");
1.1.1.2 ! root      636:                do_find=true;
        !           637:                l=getkeys(str,smb.msgs);
1.1       root      638:                if(l&0x80000000L) {
                    639:                        if((long)l==-1) { /* ctrl-c */
                    640:                                if(msg.total_hfields)
                    641:                                        smb_freemsgmem(&msg);
                    642:                                if(post)
                    643:                                        LFREE(post);
                    644:                                smb_close(&smb);
                    645:                                smb_stack(&smb,SMB_STACK_POP);
1.1.1.2 ! root      646:                                return(1)        !           647:                        }
        !           648:                        smb.curmsg=(l&~0x80000000L)-1;
        !           649:                        do_find=false;
        !           650:                        continue; 
        !           651:                }
1.1       root      652:                switch(l) {
                    653:                        case 'A':   
                    654:                        case 'R':   
                    655:                                if((char)l==(cfg.sys_misc&SM_RA_EMU ? 'A' : 'R')) { 
1.1.1.2 ! root      656:                                        do_find=false;  /* re-read last message */
1.1       root      657:                                        break;
                    658:                                }
                    659:                                /* Reply to last message */
                    660:                                domsg=0;
                    661:                                if(!chk_ar(cfg.sub[subnum]->post_ar,&useron)) {
                    662:                                        bputs(text[CantPostOnSub]);
1.1.1.2 ! root      663:                                        break; 
        !           664:                                }
1.1       root      665:                                quotemsg(&msg,0);
1.1.1.2 ! root      666:                                FREE_AND_NULL(post);
1.1       root      667:                                postmsg(subnum,&msg,WM_QUOTE);
                    668:                                if(mode&SCAN_TOYOU)
                    669:                                        domsg=1;
                    670:                                break;
                    671:                        case 'B':   /* Skip sub-board */
                    672:                                if(mode&SCAN_NEW && !noyes(text[RemoveFromNewScanQ]))
1.1.1.2 ! root      673:                                        subscan[subnum].cfg&=~SUB_CFG_NSCAN;
1.1       root      674:                                if(msg.total_hfields)
                    675:                                        smb_freemsgmem(&msg);
                    676:                                if(post)
                    677:                                        LFREE(post);
                    678:                                smb_close(&smb);
                    679:                                smb_stack(&smb,SMB_STACK_POP);
                    680:                                return(0);
                    681:                        case 'C':   /* Continuous */
                    682:                                mode|=SCAN_CONST;
1.1.1.2 ! root      683:                                if(smb.curmsg<smb.msgs-1) smb.curmsg++;
1.1       root      684:                                else done=1;
                    685:                                break;
                    686:                        case 'D':       /* Delete message on sub-board */
                    687:                                domsg=0;
                    688:                                if(!sub_op(subnum)) {
1.1.1.2 ! root      689:                                        if(!(cfg.sub[subnum]->misc&SUB_DEL)) {
        !           690:                                                bputs(text[CantDeletePosts]);
        !           691:                                                domsg=0;
        !           692:                                                break; 
        !           693:                                        }
        !           694:                                        if(cfg.sub[subnum]->misc&SUB_DELLAST && smb.curmsg!=(smb.msgs-1)) {
        !           695:                                                bputs("\1n\r\nCan only delete last message.\r\n");
        !           696:                                                domsg=0;
        !           697:                                                break;
        !           698:                                        }
1.1       root      699:                                        if(stricmp(cfg.sub[subnum]->misc&SUB_NAME
                    700:                                                ? useron.name : useron.alias, msg.from)
                    701:                                        && stricmp(cfg.sub[subnum]->misc&SUB_NAME
                    702:                                                ? useron.name : useron.alias, msg.to)) {
1.1.1.2 ! root      703:                                                bprintf(text[YouDidntPostMsgN],smb.curmsg+1);
        !           704:                                                break; 
        !           705:                                        } 
        !           706:                                }
1.1       root      707:                                if(msg.hdr.attr&MSG_PERMANENT) {
                    708:                                        bputs("\1n\r\nMessage is marked permanent.\r\n");
                    709:                                        domsg=0;
1.1.1.2 ! root      710:                                        break; 
        !           711:                                }
        !           712: 
        !           713:                                FREE_AND_NULL(post);
1.1       root      714: 
                    715:                                if(msg.total_hfields)
                    716:                                        smb_freemsgmem(&msg);
                    717:                                msg.total_hfields=0;
                    718:                                msg.idx.offset=0;
                    719:                                if(loadmsg(&msg,msg.idx.number)) {
                    720:                                        msg.idx.attr^=MSG_DELETE;
                    721:                                        msg.hdr.attr=msg.idx.attr;
                    722:                                        if((i=smb_putmsg(&smb,&msg))!=0)
                    723:                                                errormsg(WHERE,ERR_WRITE,smb.file,i);
                    724:                                        smb_unlockmsghdr(&smb,&msg);
                    725:                                        if(i==0 && msg.idx.attr&MSG_DELETE) {
1.1.1.2 ! root      726:                                                sprintf(str,"%s removed post from %s %s"
        !           727:                                                        ,useron.alias
1.1       root      728:                                                        ,cfg.grp[cfg.sub[subnum]->grp]->sname,cfg.sub[subnum]->lname);
                    729:                                                logline("P-",str);
                    730:                                                if(!stricmp(cfg.sub[subnum]->misc&SUB_NAME
                    731:                                                        ? useron.name : useron.alias, msg.from))
                    732:                                                        useron.posts=(ushort)adjustuserrec(&cfg,useron.number
1.1.1.2 ! root      733:                                                                ,U_POSTS,5,-1); 
        !           734:                                        } 
        !           735:                                }
1.1       root      736:                                domsg=1;
                    737:                                if((cfg.sys_misc&SM_SYSVDELM            // anyone can view delete msgs
                    738:                                        || (cfg.sys_misc&SM_USRVDELM    // sys/subops can view deleted msgs
                    739:                                        && sub_op(subnum)))
1.1.1.2 ! root      740:                                        && smb.curmsg<smb.msgs-1)
        !           741:                                        smb.curmsg++;
        !           742:                                if(smb.curmsg>=smb.msgs)
1.1       root      743:                                        done=1;
                    744:                                break;
1.1.1.2 ! root      745:                        case 'E':   /* edit last post */
        !           746:                                if(!sub_op(subnum)) {
        !           747:                                        if(!(cfg.sub[subnum]->misc&SUB_EDIT)) {
        !           748:                                                bputs("\1n\r\nCan't edit messages on this message base.\r\n");
        !           749:                                                // bputs(text[CantDeletePosts]);
        !           750:                                                domsg=0;
        !           751:                                                break; 
        !           752:                                        }
        !           753:                                        if(cfg.sub[subnum]->misc&SUB_EDITLAST && smb.curmsg!=(smb.msgs-1)) {
        !           754:                                                bputs("\1n\r\nCan only edit last message.\r\n");
        !           755:                                                domsg=0;
        !           756:                                                break;
        !           757:                                        }
        !           758:                                        if(stricmp(cfg.sub[subnum]->misc&SUB_NAME
        !           759:                                                ? useron.name : useron.alias, msg.from)) {
        !           760:                                                bprintf(text[YouDidntPostMsgN],smb.curmsg+1);
        !           761:                                                domsg=0;
        !           762:                                                break; 
        !           763:                                        } 
        !           764:                                }
        !           765:                                FREE_AND_NULL(post);
        !           766:                                editmsg(&msg,subnum);
        !           767:                                break;
1.1       root      768:                        case 'F':   /* find text in messages */
                    769:                                domsg=0;
1.1.1.2 ! root      770:                                mode&=~SCAN_FIND;       /* turn off find mode */
        !           771:                                if((i=get_start_msg(this,&smb))<0)
1.1       root      772:                                        break;
                    773:                                bputs(text[SearchStringPrompt]);
1.1.1.2 ! root      774:                                if(!getstr(find_buf,40,K_LINE|K_UPPER))
1.1       root      775:                                        break;
1.1.1.2 ! root      776:                                if(yesno(text[DisplaySubjectsOnlyQ]))
        !           777:                                        searchposts(subnum,post,(long)i,smb.msgs,find_buf);
        !           778:                                else {
        !           779:                                        smb.curmsg=i;
        !           780:                                        find=find_buf;
        !           781:                                        mode|=SCAN_FIND;
        !           782:                                        domsg=1;
        !           783:                                }
1.1       root      784:                                break;
                    785:                        case 'I':   /* Sub-board information */
                    786:                                domsg=0;
                    787:                                subinfo(subnum);
                    788:                                break;
                    789:                        case 'L':   /* List messages */
                    790:                                domsg=0;
1.1.1.2 ! root      791:                                if((i=get_start_msg(this,&smb))<0)
1.1       root      792:                                        break;
1.1.1.2 ! root      793:                                listmsgs(subnum,post,i,smb.msgs);
        !           794:                                sys_status&=~SS_ABORT;
1.1       root      795:                                break;
                    796:                        case 'M':   /* Reply to last post in mail */
                    797:                                domsg=0;
                    798:                                if(msg.hdr.attr&MSG_ANONYMOUS && !sub_op(subnum)) {
                    799:                                        bputs(text[CantReplyToAnonMsg]);
1.1.1.2 ! root      800:                                        break; 
        !           801:                                }
1.1       root      802:                                if(!sub_op(subnum) && msg.hdr.attr&MSG_PRIVATE
                    803:                                        && stricmp(msg.to,useron.name)
                    804:                                        && stricmp(msg.to,useron.alias))
                    805:                                        break;
                    806:                                sprintf(str2,text[Regarding]
                    807:                                        ,msg.subj
                    808:                                        ,timestr((time_t *)&msg.hdr.when_written.time));
1.1.1.2 ! root      809:                                if(msg.from_net.addr==NULL)
        !           810:                                        strcpy(str,msg.from);
        !           811:                                else if(msg.from_net.type==NET_FIDO)
        !           812:                                        sprintf(str,"%s@%s",msg.from
        !           813:                                                ,smb_faddrtoa((faddr_t *)msg.from_net.addr,tmp));
1.1       root      814:                                else if(msg.from_net.type==NET_INTERNET)
                    815:                                        strcpy(str,(char *)msg.from_net.addr);
                    816:                                else
1.1.1.2 ! root      817:                                        sprintf(str,"%s@%s",msg.from,(char *)msg.from_net.addr);
1.1       root      818:                                bputs(text[Email]);
                    819:                                if(!getstr(str,60,K_EDIT|K_AUTODEL))
                    820:                                        break;
1.1.1.2 ! root      821: 
        !           822:                                FREE_AND_NULL(post);
1.1       root      823:                                quotemsg(&msg,1);
1.1.1.2 ! root      824:                                if(msg.from_net.type==NET_INTERNET && strchr(str,'@'))
1.1       root      825:                                        inetmail(str,msg.subj,WM_QUOTE|WM_NETMAIL);
                    826:                                else {
                    827:                                        p=strrchr(str,'@');
                    828:                                        if(p)                                                           /* FidoNet or QWKnet */
                    829:                                                netmail(str,msg.subj,WM_QUOTE);
                    830:                                        else {
                    831:                                                i=atoi(str);
                    832:                                                if(!i) {
                    833:                                                        if(cfg.sub[subnum]->misc&SUB_NAME)
                    834:                                                                i=userdatdupe(0,U_NAME,LEN_NAME,str,0);
                    835:                                                        else
1.1.1.2 ! root      836:                                                                i=matchuser(&cfg,str,TRUE /* sysop_alias */); 
        !           837:                                                }
        !           838:                                                email(i,str2,msg.subj,WM_EMAIL|WM_QUOTE); 
        !           839:                                        } 
        !           840:                                }
1.1       root      841:                                break;
                    842:                        case 'P':   /* Post message on sub-board */
                    843:                                domsg=0;
                    844:                                if(!chk_ar(cfg.sub[subnum]->post_ar,&useron))
                    845:                                        bputs(text[CantPostOnSub]);
                    846:                                else {
1.1.1.2 ! root      847:                                        FREE_AND_NULL(post);
1.1       root      848:                                        postmsg(subnum,0,0);
1.1.1.2 ! root      849:                                }
1.1       root      850:                                break;
                    851:                        case 'Q':   /* Quit */
                    852:                                if(msg.total_hfields)
                    853:                                        smb_freemsgmem(&msg);
                    854:                                if(post)
                    855:                                        LFREE(post);
                    856:                                smb_close(&smb);
                    857:                                smb_stack(&smb,SMB_STACK_POP);
                    858:                                return(1);
                    859:                        case 'T':   /* List titles of next ten messages */
                    860:                                domsg=0;
1.1.1.2 ! root      861:                                if(!smb.msgs)
1.1       root      862:                                        break;
1.1.1.2 ! root      863:                                if(smb.curmsg>=smb.msgs-1) {
1.1       root      864:                                         done=1;
1.1.1.2 ! root      865:                                         break; 
        !           866:                                }
        !           867:                                i=smb.curmsg+11;
        !           868:                                if(i>smb.msgs)
        !           869:                                        i=smb.msgs;
        !           870:                                listmsgs(subnum,post,smb.curmsg+1,i);
        !           871:                                smb.curmsg=i-1;
        !           872:                                if(subscan[subnum].ptr<post[smb.curmsg].number)
        !           873:                                        subscan[subnum].ptr=post[smb.curmsg].number;
1.1       root      874:                                break;
                    875:                        case 'Y':   /* Your messages */
                    876:                                domsg=0;
1.1.1.2 ! root      877:                                showposts_toyou(post,0,smb.msgs);
1.1       root      878:                                break;
                    879:                        case '-':
1.1.1.2 ! root      880:                                if(smb.curmsg>0) smb.curmsg--;
        !           881:                                do_find=false;
1.1       root      882:                                break;
                    883:                        case 'O':   /* Operator commands */
                    884:                                while(online) {
                    885:                                        if(!(useron.misc&EXPERT))
                    886:                                                menu("sysmscan");
                    887:                                        bprintf("\r\n\1y\1hOperator: \1w");
                    888:                                        strcpy(str,"?CEHMPQUV");
                    889:                                        if(SYSOP)
                    890:                                                strcat(str,"S");
                    891:                                        switch(getkeys(str,0)) {
                    892:                                                case '?':
                    893:                                                        if(useron.misc&EXPERT)
                    894:                                                                menu("sysmscan");
                    895:                                                        continue;
                    896:                                                case 'P':   /* Purge user */
                    897:                                                        purgeuser(cfg.sub[subnum]->misc&SUB_NAME
                    898:                                                                ? userdatdupe(0,U_NAME,LEN_NAME,msg.from,0)
1.1.1.2 ! root      899:                                                                : matchuser(&cfg,msg.from,FALSE));
1.1       root      900:                                                        break;
                    901:                                                case 'C':   /* Change message attributes */
                    902:                                                        i=chmsgattr(msg.hdr.attr);
                    903:                                                        if(msg.hdr.attr==i)
                    904:                                                                break;
                    905:                                                        if(msg.total_hfields)
                    906:                                                                smb_freemsgmem(&msg);
                    907:                                                        msg.total_hfields=0;
                    908:                                                        msg.idx.offset=0;
                    909:                                                        if(loadmsg(&msg,msg.idx.number)) {
                    910:                                                                msg.hdr.attr=msg.idx.attr=i;
                    911:                                                                if((i=smb_putmsg(&smb,&msg))!=0)
                    912:                                                                        errormsg(WHERE,ERR_WRITE,smb.file,i);
1.1.1.2 ! root      913:                                                                smb_unlockmsghdr(&smb,&msg); 
        !           914:                                                        }
1.1       root      915:                                                        break;
                    916:                                                case 'E':   /* edit last post */
1.1.1.2 ! root      917:                                                        FREE_AND_NULL(post);
1.1       root      918:                                                        editmsg(&msg,subnum);
                    919:                                                        break;
                    920:                                                case 'H':   /* View message header */
                    921:                                                        msghdr(&msg);
                    922:                                                        domsg=0;
                    923:                                                        break;
                    924:                                                case 'M':   /* Move message */
                    925:                                                        domsg=0;
1.1.1.2 ! root      926:                                                        FREE_AND_NULL(post);
1.1       root      927:                                                        if(msg.total_hfields)
                    928:                                                                smb_freemsgmem(&msg);
                    929:                                                        msg.total_hfields=0;
                    930:                                                        msg.idx.offset=0;
                    931:                                                        if(!loadmsg(&msg,msg.idx.number)) {
                    932:                                                                errormsg(WHERE,ERR_READ,smb.file,msg.idx.number);
1.1.1.2 ! root      933:                                                                break; 
        !           934:                                                        }
1.1       root      935:                                                        sprintf(str,text[DeletePostQ],msg.hdr.number,msg.subj);
                    936:                                                        if(movemsg(&msg,subnum) && yesno(str)) {
                    937:                                                                msg.idx.attr|=MSG_DELETE;
                    938:                                                                msg.hdr.attr=msg.idx.attr;
                    939:                                                                if((i=smb_putmsg(&smb,&msg))!=0)
1.1.1.2 ! root      940:                                                                        errormsg(WHERE,ERR_WRITE,smb.file,i); 
        !           941:                                                        }
1.1       root      942:                                                        smb_unlockmsghdr(&smb,&msg);
                    943:                                                        break;
                    944: 
                    945:                                                case 'Q':
                    946:                                                        break;
                    947:                                                case 'S':   /* Save/Append message to another file */
                    948:        /*      05/26/95
                    949:                                                        if(!yesno(text[SaveMsgToFile]))
                    950:                                                                break;
                    951:        */
                    952:                                                        bputs(text[FileToWriteTo]);
                    953:                                                        if(getstr(str,40,K_LINE|K_UPPER))
                    954:                                                                msgtotxt(&msg,str,1,1);
                    955:                                                        break;
                    956:                                                case 'U':   /* User edit */
                    957:                                                        useredit(cfg.sub[subnum]->misc&SUB_NAME
                    958:                                                                ? userdatdupe(0,U_NAME,LEN_NAME,msg.from,0)
1.1.1.2 ! root      959:                                                                : matchuser(&cfg,msg.from,TRUE /* sysop_alias */));
1.1       root      960:                                                        break;
                    961:                                                case 'V':   /* Validate message */
                    962:                                                        if(msg.total_hfields)
                    963:                                                                smb_freemsgmem(&msg);
                    964:                                                        msg.total_hfields=0;
                    965:                                                        msg.idx.offset=0;
                    966:                                                        if(loadmsg(&msg,msg.idx.number)) {
                    967:                                                                msg.idx.attr|=MSG_VALIDATED;
                    968:                                                                msg.hdr.attr=msg.idx.attr;
                    969:                                                                if((i=smb_putmsg(&smb,&msg))!=0)
                    970:                                                                        errormsg(WHERE,ERR_WRITE,smb.file,i);
1.1.1.2 ! root      971:                                                                smb_unlockmsghdr(&smb,&msg); 
        !           972:                                                        }
1.1       root      973:                                                        break;
                    974:                                                default:
1.1.1.2 ! root      975:                                                        continue; 
        !           976:                                        }
        !           977:                                        break; 
        !           978:                                }
1.1       root      979:                                break;
                    980:                        case '.':   /* Thread forward */
                    981:                                l=msg.hdr.thread_first;
                    982:                                if(!l) l=msg.hdr.thread_next;
                    983:                                if(!l) {
                    984:                                        domsg=0;
1.1.1.2 ! root      985:                                        break; 
        !           986:                                }
        !           987:                                for(i=0;i<smb.msgs;i++)
1.1       root      988:                                        if(l==post[i].number)
                    989:                                                break;
1.1.1.2 ! root      990:                                if(i<smb.msgs)
        !           991:                                        smb.curmsg=i;
        !           992:                                do_find=false;
1.1       root      993:                                break;
                    994:                        case ',':   /* Thread backwards */
1.1.1.2 ! root      995:                                if(!msg.hdr.thread_back) {
1.1       root      996:                                        domsg=0;
1.1.1.2 ! root      997:                                        break; 
        !           998:                                }
        !           999:                                for(i=0;i<smb.msgs;i++)
        !          1000:                                        if(msg.hdr.thread_back==post[i].number)
1.1       root     1001:                                                break;
1.1.1.2 ! root     1002:                                if(i<smb.msgs)
        !          1003:                                        smb.curmsg=i;
        !          1004:                                do_find=false;
1.1       root     1005:                                break;
                   1006:                        case '>':   /* Search Title forward */
1.1.1.2 ! root     1007:                                for(i=smb.curmsg+1;i<smb.msgs;i++)
1.1       root     1008:                                        if(post[i].subj==msg.idx.subj)
                   1009:                                                break;
1.1.1.2 ! root     1010:                                if(i<smb.msgs)
        !          1011:                                        smb.curmsg=i;
1.1       root     1012:                                else
                   1013:                                        domsg=0;
1.1.1.2 ! root     1014:                                do_find=false;
1.1       root     1015:                                break;
                   1016:                        case '<':   /* Search Title backward */
1.1.1.2 ! root     1017:                                for(i=smb.curmsg-1;i>-1;i--)
1.1       root     1018:                                        if(post[i].subj==msg.idx.subj)
                   1019:                                                break;
                   1020:                                if(i>-1)
1.1.1.2 ! root     1021:                                        smb.curmsg=i;
1.1       root     1022:                                else
                   1023:                                        domsg=0;
1.1.1.2 ! root     1024:                                do_find=false;
1.1       root     1025:                                break;
                   1026:                        case '}':   /* Search Author forward */
                   1027:                                strcpy(str,msg.from);
1.1.1.2 ! root     1028:                                for(i=smb.curmsg+1;i<smb.msgs;i++)
1.1       root     1029:                                        if(post[i].from==msg.idx.from)
                   1030:                                                break;
1.1.1.2 ! root     1031:                                if(i<smb.msgs)
        !          1032:                                        smb.curmsg=i;
1.1       root     1033:                                else
                   1034:                                        domsg=0;
1.1.1.2 ! root     1035:                                do_find=false;
1.1       root     1036:                                break;
                   1037:                        case '{':   /* Search Author backward */
                   1038:                                strcpy(str,msg.from);
1.1.1.2 ! root     1039:                                for(i=smb.curmsg-1;i>-1;i--)
1.1       root     1040:                                        if(post[i].from==msg.idx.from)
                   1041:                                                break;
                   1042:                                if(i>-1)
1.1.1.2 ! root     1043:                                        smb.curmsg=i;
1.1       root     1044:                                else
                   1045:                                        domsg=0;
1.1.1.2 ! root     1046:                                do_find=false;
1.1       root     1047:                                break;
                   1048:                        case ']':   /* Search To User forward */
                   1049:                                strcpy(str,msg.to);
1.1.1.2 ! root     1050:                                for(i=smb.curmsg+1;i<smb.msgs;i++)
1.1       root     1051:                                        if(post[i].to==msg.idx.to)
                   1052:                                                break;
1.1.1.2 ! root     1053:                                if(i<smb.msgs)
        !          1054:                                        smb.curmsg=i;
1.1       root     1055:                                else
                   1056:                                        domsg=0;
1.1.1.2 ! root     1057:                                do_find=false;
1.1       root     1058:                                break;
                   1059:                        case '[':   /* Search To User backward */
                   1060:                                strcpy(str,msg.to);
1.1.1.2 ! root     1061:                                for(i=smb.curmsg-1;i>-1;i--)
1.1       root     1062:                                        if(post[i].to==msg.idx.to)
                   1063:                                                break;
                   1064:                                if(i>-1)
1.1.1.2 ! root     1065:                                        smb.curmsg=i;
1.1       root     1066:                                else
                   1067:                                        domsg=0;
1.1.1.2 ! root     1068:                                do_find=false;
1.1       root     1069:                                break;
                   1070:                        case 0: /* Carriage return - Next Message */
                   1071:                        case '+':
1.1.1.2 ! root     1072:                                if(smb.curmsg<smb.msgs-1) smb.curmsg++;
1.1       root     1073:                                else done=1;
                   1074:                                break;
                   1075:                        case '?':
                   1076:                                menu("msgscan");
                   1077:                                domsg=0;
                   1078:                                break;  } }
                   1079:        if(msg.total_hfields)
                   1080:                smb_freemsgmem(&msg);
                   1081:        if(post)
                   1082:                LFREE(post);
1.1.1.2 ! root     1083:        if(!(org_mode&(SCAN_CONST|SCAN_TOYOU|SCAN_FIND)) && !(cfg.sub[subnum]->misc&SUB_PONLY)
1.1       root     1084:                && reads && chk_ar(cfg.sub[subnum]->post_ar,&useron)
                   1085:                && !(useron.rest&FLAG('P'))) {
                   1086:                sprintf(str,text[Post],cfg.grp[cfg.sub[subnum]->grp]->sname
                   1087:                        ,cfg.sub[subnum]->lname);
                   1088:                if(!noyes(str))
1.1.1.2 ! root     1089:                        postmsg(subnum,0,0); 
        !          1090:        }
1.1       root     1091:        smb_close(&smb);
                   1092:        smb_stack(&smb,SMB_STACK_POP);
                   1093:        return(0);
                   1094: }
                   1095: 
                   1096: /****************************************************************************/
                   1097: /* This function will search the specified sub-board for messages that      */
                   1098: /* contain the string 'search'.                                             */
                   1099: /* Returns number of messages found.                                        */
                   1100: /****************************************************************************/
                   1101: int sbbs_t::searchsub(uint subnum, char *search)
                   1102: {
                   1103:        int     i,found;
                   1104:        long    posts;
                   1105:        ulong   total;
                   1106:        post_t  HUGE16 *post;
                   1107: 
                   1108:        if((i=smb_stack(&smb,SMB_STACK_PUSH))!=0) {
                   1109:                errormsg(WHERE,ERR_OPEN,cfg.sub[subnum]->code,i);
1.1.1.2 ! root     1110:                return(0)        !          1111:        }
        !          1112:        total=getposts(&cfg,subnum);
1.1       root     1113:        sprintf(smb.file,"%s%s",cfg.sub[subnum]->data_dir,cfg.sub[subnum]->code);
                   1114:        smb.retry_time=cfg.smb_retry_time;
1.1.1.2 ! root     1115:        smb.subnum=subnum;
1.1       root     1116:        if((i=smb_open(&smb))!=0) {
                   1117:                smb_stack(&smb,SMB_STACK_POP);
                   1118:                errormsg(WHERE,ERR_OPEN,smb.file,i,smb.last_error);
1.1.1.2 ! root     1119:                return(0)        !          1120:        }
1.1       root     1121:        post=loadposts(&posts,subnum,0,LP_BYSELF|LP_OTHERS);
                   1122:        bprintf(text[SearchSubFmt]
                   1123:                ,cfg.grp[cfg.sub[subnum]->grp]->sname,cfg.sub[subnum]->lname,posts,total);
                   1124:        found=searchposts(subnum,post,0,posts,search);
                   1125:        if(posts)
                   1126:                LFREE(post);
                   1127:        smb_close(&smb);
                   1128:        smb_stack(&smb,SMB_STACK_POP);
                   1129:        return(found);
                   1130: }
                   1131: 
                   1132: /****************************************************************************/
                   1133: /* Will search the messages pointed to by 'msg' for the occurance of the    */
                   1134: /* string 'search' and display any messages (number of message, author and  */
                   1135: /* title). 'msgs' is the total number of valid messages.                    */
                   1136: /* Returns number of messages found.                                        */
                   1137: /****************************************************************************/
                   1138: int sbbs_t::searchposts(uint subnum, post_t HUGE16 *post, long start, long posts
                   1139:        , char *search)
                   1140: {
                   1141:        char    HUGE16 *buf,ch;
                   1142:        long    l,found=0;
                   1143:        smbmsg_t msg;
                   1144: 
                   1145:        msg.total_hfields=0;
                   1146:        for(l=start;l<posts && !msgabort();l++) {
                   1147:                msg.idx.offset=post[l].offset;
                   1148:                if(!loadmsg(&msg,post[l].number))
                   1149:                        continue;
                   1150:                smb_unlockmsghdr(&smb,&msg);
1.1.1.2 ! root     1151:                buf=smb_getmsgtxt(&smb,&msg,GETMSGTXT_ALL);
1.1       root     1152:                if(!buf) {
                   1153:                        smb_freemsgmem(&msg);
1.1.1.2 ! root     1154:                        continue; 
        !          1155:                }
1.1       root     1156:                strupr((char *)buf);
                   1157:                if(strstr((char *)buf,search) || strstr(msg.subj,search)) {
                   1158:                        if(!found)
                   1159:                                CRLF;
                   1160:                        if(msg.hdr.attr&MSG_DELETE)
                   1161:                                ch='-';
                   1162:                        else if((!stricmp(msg.to,useron.alias) || !stricmp(msg.to,useron.name))
                   1163:                                && !(msg.hdr.attr&MSG_READ))
                   1164:                                ch='!';
1.1.1.2 ! root     1165:                        else if(msg.hdr.number>subscan[subnum].ptr)
1.1       root     1166:                                ch='*';
                   1167:                        else
                   1168:                                ch=' ';
                   1169:                        bprintf(text[SubMsgLstFmt],l+1
                   1170:                                ,(msg.hdr.attr&MSG_ANONYMOUS) && !sub_op(subnum) ? text[Anonymous]
                   1171:                                : msg.from
                   1172:                                ,msg.to
                   1173:                                ,ch
                   1174:                                ,msg.subj);
1.1.1.2 ! root     1175:                        found++; 
        !          1176:                }
1.1       root     1177:                FREE(buf);
1.1.1.2 ! root     1178:                smb_freemsgmem(&msg); 
        !          1179:        }
1.1       root     1180: 
                   1181:        return(found);
                   1182: }
                   1183: 
                   1184: /****************************************************************************/
                   1185: /* Will search the messages pointed to by 'msg' for message to the user on  */
                   1186: /* Returns number of messages found.                                        */
                   1187: /****************************************************************************/
                   1188: void sbbs_t::showposts_toyou(post_t HUGE16 *post, ulong start, long posts)
                   1189: {
                   1190:        char    str[128];
                   1191:        ushort  namecrc,aliascrc,sysop;
                   1192:        long    l,found;
                   1193:     smbmsg_t msg;
                   1194: 
                   1195:        strcpy(str,useron.alias);
                   1196:        strlwr(str);
1.1.1.2 ! root     1197:        aliascrc=crc16(str,0);
1.1       root     1198:        strcpy(str,useron.name);
                   1199:        strlwr(str);
1.1.1.2 ! root     1200:        namecrc=crc16(str,0);
        !          1201:        sysop=crc16("sysop",0);
1.1       root     1202:        msg.total_hfields=0;
                   1203:        for(l=start,found=0;l<posts && !msgabort();l++) {
                   1204: 
                   1205:                if((useron.number!=1 || post[l].to!=sysop)
                   1206:                        && post[l].to!=aliascrc && post[l].to!=namecrc)
                   1207:                        continue;
                   1208: 
                   1209:                if(msg.total_hfields)
                   1210:                        smb_freemsgmem(&msg);
                   1211:                msg.total_hfields=0;
                   1212:                msg.idx.offset=post[l].offset;
                   1213:                if(!loadmsg(&msg,post[l].number))
                   1214:                        continue;
                   1215:                smb_unlockmsghdr(&smb,&msg);
                   1216:                if((useron.number==1 && !stricmp(msg.to,"sysop") && !msg.from_net.type)
                   1217:                        || !stricmp(msg.to,useron.alias) || !stricmp(msg.to,useron.name)) {
                   1218:                        if(!found)
                   1219:                                CRLF;
                   1220:                        found++;
                   1221:                        bprintf(text[SubMsgLstFmt],l+1
                   1222:                                ,(msg.hdr.attr&MSG_ANONYMOUS) && !SYSOP
                   1223:                                ? text[Anonymous] : msg.from
                   1224:                                ,msg.to
                   1225:                                ,msg.hdr.attr&MSG_DELETE ? '-' : msg.hdr.attr&MSG_READ ? ' ' : '*'
1.1.1.2 ! root     1226:                                ,msg.subj); 
        !          1227:                } 
        !          1228:        }
1.1       root     1229: 
                   1230:        if(msg.total_hfields)
                   1231:                smb_freemsgmem(&msg);
                   1232: }
                   1233: 
                   1234: /****************************************************************************/
                   1235: /* This function will search the specified sub-board for messages that         */
                   1236: /* are sent to the currrent user.                                                                                      */
                   1237: /* returns number of messages found                                                                            */
                   1238: /****************************************************************************/
                   1239: int sbbs_t::searchsub_toyou(uint subnum)
                   1240: {
                   1241:        int     i;
                   1242:        long    posts;
                   1243:        ulong   total;
                   1244:        post_t  HUGE16 *post;
                   1245: 
                   1246:        if((i=smb_stack(&smb,SMB_STACK_PUSH))!=0) {
                   1247:                errormsg(WHERE,ERR_OPEN,cfg.sub[subnum]->code,i);
1.1.1.2 ! root     1248:                return(0)        !          1249:        }
        !          1250:        total=getposts(&cfg,subnum);
1.1       root     1251:        sprintf(smb.file,"%s%s",cfg.sub[subnum]->data_dir,cfg.sub[subnum]->code);
                   1252:        smb.retry_time=cfg.smb_retry_time;
1.1.1.2 ! root     1253:        smb.subnum=subnum;
1.1       root     1254:        if((i=smb_open(&smb))!=0) {
                   1255:                smb_stack(&smb,SMB_STACK_POP);
                   1256:                errormsg(WHERE,ERR_OPEN,smb.file,i,smb.last_error);
1.1.1.2 ! root     1257:                return(0)        !          1258:        }
1.1       root     1259:        post=loadposts(&posts,subnum,0,0);
                   1260:        bprintf(text[SearchSubFmt]
                   1261:                ,cfg.grp[cfg.sub[subnum]->grp]->sname,cfg.sub[subnum]->lname,total);
                   1262:        if(posts) {
                   1263:                if(post)
                   1264:                        LFREE(post);
                   1265:                post=loadposts(&posts,subnum,0,LP_BYSELF|LP_OTHERS);
1.1.1.2 ! root     1266:                showposts_toyou(post,0,posts); 
        !          1267:        }
1.1       root     1268:        if(post)
                   1269:                LFREE(post);
                   1270:        smb_close(&smb);
                   1271:        smb_stack(&smb,SMB_STACK_POP);
                   1272:        return(posts);
                   1273: }
                   1274: 
                   1275: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.