Annotation of sbbs/sbbs2/postmsg.c, revision 1.1

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: }

unix.superglobalmegacorp.com

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