|
|
1.1 ! root 1: #line 1 "POSTMSG.C" ! 2: ! 3: /* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ ! 4: ! 5: #include "sbbs.h" ! 6: ! 7: /****************************************************************************/ ! 8: /* Posts a message on subboard number sub, with 'top' as top of message. */ ! 9: /* Returns 1 if posted, 0 if not. */ ! 10: /****************************************************************************/ ! 11: char postmsg(uint subnum, smbmsg_t *remsg, int wm_mode) ! 12: { ! 13: char str[256],touser[256],title[LEN_TITLE+1],buf[SDT_BLOCK_LEN] ! 14: ,top[256],c; ! 15: ushort xlat,msgattr; ! 16: int i,j,n,x,file,storage; ! 17: ulong l,length,offset,crc=0xffffffff; ! 18: FILE *instream; ! 19: smbmsg_t msg,tmpmsg; ! 20: ! 21: if(remsg) { ! 22: sprintf(title,"%.*s",LEN_TITLE,remsg->subj); ! 23: if(sub[subnum]->misc&SUB_INET) // All Internet posts to "All" 05/20/97 ! 24: touser[0]=0; ! 25: else if(remsg->hdr.attr&MSG_ANONYMOUS) ! 26: strcpy(touser,text[Anonymous]); ! 27: else ! 28: strcpy(touser,remsg->from); ! 29: msgattr=(remsg->hdr.attr&MSG_PRIVATE); ! 30: sprintf(top,text[RegardingByTo],title,touser,remsg->to ! 31: ,timestr((time_t *)&remsg->hdr.when_written.time) ! 32: ,zonestr(remsg->hdr.when_written.zone)); } ! 33: else { ! 34: title[0]=0; ! 35: touser[0]=0; ! 36: top[0]=0; ! 37: msgattr=0; } ! 38: ! 39: if(useron.rest&FLAG('P')) { ! 40: bputs(text[R_Post]); ! 41: return(0); } ! 42: ! 43: if((sub[subnum]->misc&(SUB_QNET|SUB_FIDO|SUB_PNET|SUB_INET)) ! 44: && (useron.rest&FLAG('N'))) { ! 45: bputs(text[CantPostOnSub]); ! 46: return(0); } ! 47: ! 48: if(useron.ptoday>=level_postsperday[useron.level]) { ! 49: bputs(text[TooManyPostsToday]); ! 50: return(0); } ! 51: ! 52: bprintf(text[Posting],grp[sub[subnum]->grp]->sname,sub[subnum]->lname); ! 53: action=NODE_PMSG; ! 54: nodesync(); ! 55: ! 56: if(!(msgattr&MSG_PRIVATE) && (sub[subnum]->misc&SUB_PONLY ! 57: || (sub[subnum]->misc&SUB_PRIV && !noyes(text[PrivatePostQ])))) ! 58: msgattr|=MSG_PRIVATE; ! 59: ! 60: if(sys_status&SS_ABORT) ! 61: return(0); ! 62: ! 63: if(!(sub[subnum]->misc&SUB_INET) // Prompt for TO: user ! 64: && (sub[subnum]->misc&SUB_TOUSER || msgattr&MSG_PRIVATE || touser[0])) { ! 65: if(!touser[0] && !(msgattr&MSG_PRIVATE)) ! 66: strcpy(touser,"All"); ! 67: bputs(text[PostTo]); ! 68: i=LEN_ALIAS; ! 69: if(sub[subnum]->misc&(SUB_PNET|SUB_INET)) ! 70: i=60; ! 71: if(sub[subnum]->misc&SUB_FIDO) ! 72: i=35; ! 73: if(sub[subnum]->misc&SUB_QNET) ! 74: i=25; ! 75: getstr(touser,i,K_UPRLWR|K_LINE|K_EDIT|K_AUTODEL); ! 76: if(stricmp(touser,"ALL") ! 77: && !(sub[subnum]->misc&(SUB_PNET|SUB_FIDO|SUB_QNET|SUB_INET|SUB_ANON))) { ! 78: if(sub[subnum]->misc&SUB_NAME) { ! 79: if(!userdatdupe(useron.number,U_NAME,LEN_NAME,touser,0)) { ! 80: bputs(text[UnknownUser]); ! 81: return(0); } } ! 82: else { ! 83: if((i=finduser(touser))==0) ! 84: return(0); ! 85: username(i,touser); } } ! 86: if(sys_status&SS_ABORT) ! 87: return(0); } ! 88: ! 89: if(!touser[0]) ! 90: strcpy(touser,"All"); // Default to ALL ! 91: ! 92: if(!stricmp(touser,"SYSOP") && !SYSOP) // Change SYSOP to user #1 ! 93: username(1,touser); ! 94: ! 95: if(msgattr&MSG_PRIVATE && !stricmp(touser,"ALL")) { ! 96: bputs(text[NoToUser]); ! 97: return(0); } ! 98: if(msgattr&MSG_PRIVATE) ! 99: wm_mode|=WM_PRIVATE; ! 100: ! 101: if(sub[subnum]->misc&SUB_AONLY ! 102: || (sub[subnum]->misc&SUB_ANON && useron.exempt&FLAG('A') ! 103: && !noyes(text[AnonymousQ]))) ! 104: msgattr|=MSG_ANONYMOUS; ! 105: ! 106: if(sub[subnum]->mod_ar[0] && chk_ar(sub[subnum]->mod_ar,useron)) ! 107: msgattr|=MSG_MODERATED; ! 108: ! 109: if(sub[subnum]->misc&SUB_SYSPERM && sub_op(subnum)) ! 110: msgattr|=MSG_PERMANENT; ! 111: ! 112: if(msgattr&MSG_PRIVATE) ! 113: bputs(text[PostingPrivately]); ! 114: ! 115: if(msgattr&MSG_ANONYMOUS) ! 116: bputs(text[PostingAnonymously]); ! 117: ! 118: if(sub[subnum]->misc&SUB_NAME) ! 119: bputs(text[UsingRealName]); ! 120: ! 121: sprintf(str,"%sINPUT.MSG",node_dir); ! 122: if(!writemsg(str,top,title,wm_mode,subnum,touser)) { ! 123: bputs(text[Aborted]); ! 124: return(0); } ! 125: ! 126: bputs(text[WritingIndx]); ! 127: ! 128: if((i=smb_stack(&smb,SMB_STACK_PUSH))!=0) { ! 129: errormsg(WHERE,ERR_OPEN,sub[subnum]->code,i); ! 130: return(0); } ! 131: ! 132: sprintf(smb.file,"%s%s",sub[subnum]->data_dir,sub[subnum]->code); ! 133: smb.retry_time=smb_retry_time; ! 134: if((i=smb_open(&smb))!=0) { ! 135: smb_stack(&smb,SMB_STACK_POP); ! 136: errormsg(WHERE,ERR_OPEN,smb.file,i); ! 137: return(0); } ! 138: ! 139: if(filelength(fileno(smb.shd_fp))<1) { /* Create it if it doesn't exist */ ! 140: smb.status.max_crcs=sub[subnum]->maxcrcs; ! 141: smb.status.max_msgs=sub[subnum]->maxmsgs; ! 142: smb.status.max_age=sub[subnum]->maxage; ! 143: smb.status.attr=sub[subnum]->misc&SUB_HYPER ? SMB_HYPERALLOC : 0; ! 144: if((i=smb_create(&smb))!=0) { ! 145: smb_close(&smb); ! 146: smb_stack(&smb,SMB_STACK_POP); ! 147: errormsg(WHERE,ERR_CREATE,smb.file,i); ! 148: return(0); } } ! 149: ! 150: if((i=smb_locksmbhdr(&smb))!=0) { ! 151: smb_close(&smb); ! 152: smb_stack(&smb,SMB_STACK_POP); ! 153: errormsg(WHERE,ERR_LOCK,smb.file,i); ! 154: return(0); } ! 155: ! 156: if((i=smb_getstatus(&smb))!=0) { ! 157: smb_close(&smb); ! 158: smb_stack(&smb,SMB_STACK_POP); ! 159: errormsg(WHERE,ERR_READ,smb.file,i); ! 160: return(0); } ! 161: ! 162: length=flength(str)+2; /* +2 for translation string */ ! 163: ! 164: if(length&0xfff00000UL) { ! 165: smb_close(&smb); ! 166: smb_stack(&smb,SMB_STACK_POP); ! 167: errormsg(WHERE,ERR_LEN,str,length); ! 168: return(0); } ! 169: ! 170: if(smb.status.attr&SMB_HYPERALLOC) { ! 171: offset=smb_hallocdat(&smb); ! 172: storage=SMB_HYPERALLOC; } ! 173: else { ! 174: if((i=smb_open_da(&smb))!=0) { ! 175: smb_unlocksmbhdr(&smb); ! 176: smb_close(&smb); ! 177: smb_stack(&smb,SMB_STACK_POP); ! 178: errormsg(WHERE,ERR_OPEN,smb.file,i); ! 179: return(0); } ! 180: if(sub[subnum]->misc&SUB_FAST) { ! 181: offset=smb_fallocdat(&smb,length,1); ! 182: storage=SMB_FASTALLOC; } ! 183: else { ! 184: offset=smb_allocdat(&smb,length,1); ! 185: storage=SMB_SELFPACK; } ! 186: smb_close_da(&smb); } ! 187: ! 188: if((file=open(str,O_RDONLY|O_BINARY))==-1 ! 189: || (instream=fdopen(file,"rb"))==NULL) { ! 190: smb_freemsgdat(&smb,offset,length,1); ! 191: smb_unlocksmbhdr(&smb); ! 192: smb_close(&smb); ! 193: smb_stack(&smb,SMB_STACK_POP); ! 194: errormsg(WHERE,ERR_OPEN,str,O_RDONLY|O_BINARY); ! 195: return(0); } ! 196: ! 197: setvbuf(instream,NULL,_IOFBF,2*1024); ! 198: fseek(smb.sdt_fp,offset,SEEK_SET); ! 199: xlat=XLAT_NONE; ! 200: fwrite(&xlat,2,1,smb.sdt_fp); ! 201: x=SDT_BLOCK_LEN-2; /* Don't read/write more than 255 */ ! 202: while(!feof(instream)) { ! 203: memset(buf,0,x); ! 204: j=fread(buf,1,x,instream); ! 205: if((j!=x || feof(instream)) && buf[j-1]==LF && buf[j-2]==CR) ! 206: buf[j-1]=buf[j-2]=0; /* Convert to NULL */ ! 207: if(sub[subnum]->maxcrcs) { ! 208: for(i=0;i<j;i++) ! 209: crc=ucrc32(buf[i],crc); } ! 210: fwrite(buf,j,1,smb.sdt_fp); ! 211: x=SDT_BLOCK_LEN; } ! 212: fflush(smb.sdt_fp); ! 213: fclose(instream); ! 214: crc=~crc; ! 215: ! 216: memset(&msg,0,sizeof(smbmsg_t)); ! 217: memcpy(msg.hdr.id,"SHD\x1a",4); ! 218: msg.hdr.version=SMB_VERSION; ! 219: msg.hdr.attr=msg.idx.attr=msgattr; ! 220: msg.hdr.when_written.time=msg.hdr.when_imported.time=time(NULL); ! 221: msg.hdr.when_written.zone=msg.hdr.when_imported.zone=sys_timezone; ! 222: if(remsg) { ! 223: msg.hdr.thread_orig=remsg->hdr.number; ! 224: if(!remsg->hdr.thread_first) { ! 225: remsg->hdr.thread_first=smb.status.last_msg+1; ! 226: if((i=smb_lockmsghdr(&smb,remsg))!=0) ! 227: errormsg(WHERE,ERR_LOCK,smb.file,i); ! 228: else { ! 229: i=smb_putmsghdr(&smb,remsg); ! 230: smb_unlockmsghdr(&smb,remsg); ! 231: if(i) ! 232: errormsg(WHERE,ERR_WRITE,smb.file,i); } } ! 233: else { ! 234: l=remsg->hdr.thread_first; ! 235: while(1) { ! 236: tmpmsg.idx.offset=0; ! 237: if(!loadmsg(&tmpmsg,l)) ! 238: break; ! 239: if(tmpmsg.hdr.thread_next && tmpmsg.hdr.thread_next!=l) { ! 240: l=tmpmsg.hdr.thread_next; ! 241: smb_unlockmsghdr(&smb,&tmpmsg); ! 242: smb_freemsgmem(&tmpmsg); ! 243: continue; } ! 244: tmpmsg.hdr.thread_next=smb.status.last_msg+1; ! 245: if((i=smb_putmsghdr(&smb,&tmpmsg))!=0) ! 246: errormsg(WHERE,ERR_WRITE,smb.file,i); ! 247: smb_unlockmsghdr(&smb,&tmpmsg); ! 248: smb_freemsgmem(&tmpmsg); ! 249: break; } } } ! 250: ! 251: ! 252: if(sub[subnum]->maxcrcs) { ! 253: i=smb_addcrc(&smb,crc); ! 254: if(i) { ! 255: smb_freemsgdat(&smb,offset,length,1); ! 256: smb_unlocksmbhdr(&smb); ! 257: smb_close(&smb); ! 258: smb_stack(&smb,SMB_STACK_POP); ! 259: bputs("\1r\1h\1iDuplicate message!\r\n"); ! 260: return(0); } } ! 261: ! 262: msg.hdr.offset=offset; ! 263: ! 264: smb_hfield(&msg,RECIPIENT,strlen(touser),touser); ! 265: strlwr(touser); ! 266: msg.idx.to=crc16(touser); ! 267: ! 268: strcpy(str,sub[subnum]->misc&SUB_NAME ? useron.name : useron.alias); ! 269: smb_hfield(&msg,SENDER,strlen(str),str); ! 270: strlwr(str); ! 271: msg.idx.from=crc16(str); ! 272: ! 273: sprintf(str,"%u",useron.number); ! 274: smb_hfield(&msg,SENDEREXT,strlen(str),str); ! 275: ! 276: smb_hfield(&msg,SUBJECT,strlen(title),title); ! 277: strcpy(str,title); ! 278: strlwr(str); ! 279: remove_re(str); ! 280: msg.idx.subj=crc16(str); ! 281: ! 282: smb_dfield(&msg,TEXT_BODY,length); ! 283: ! 284: smb_unlocksmbhdr(&smb); ! 285: i=smb_addmsghdr(&smb,&msg,storage); ! 286: smb_close(&smb); ! 287: smb_stack(&smb,SMB_STACK_POP); ! 288: ! 289: smb_freemsgmem(&msg); ! 290: if(i) { ! 291: smb_freemsgdat(&smb,offset,length,1); ! 292: errormsg(WHERE,ERR_WRITE,smb.file,i); ! 293: return(0); } ! 294: ! 295: useron.ptoday++; ! 296: useron.posts++; ! 297: logon_posts++; ! 298: putuserrec(useron.number,U_POSTS,5,itoa(useron.posts,str,10)); ! 299: putuserrec(useron.number,U_PTODAY,5,itoa(useron.ptoday,str,10)); ! 300: bprintf(text[Posted],grp[sub[subnum]->grp]->sname ! 301: ,sub[subnum]->lname); ! 302: sprintf(str,"Posted on %s %s",grp[sub[subnum]->grp]->sname,sub[subnum]->lname); ! 303: logline("P+",str); ! 304: if(sub[subnum]->misc&SUB_FIDO && sub[subnum]->echomail_sem[0]) /* semaphore */ ! 305: if((file=nopen(sub[subnum]->echomail_sem,O_WRONLY|O_CREAT|O_TRUNC))!=-1) ! 306: close(file); ! 307: return(1); ! 308: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.