|
|
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:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.