home *** CD-ROM | disk | FTP | other *** search
/ PC Online 1998 September / PCO_0998.ISO / filesbbs / dos / sbbs_src.exe / SBBS / POSTMSG.C < prev    next >
Encoding:
C/C++ Source or Header  |  1997-05-20  |  8.7 KB  |  309 lines

  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. }
  309.