Annotation of sbbs/src/smblib/smbtxt.c, revision 1.1.1.2

1.1       root        1: /* smbtxt.c */
                      2: 
                      3: /* Synchronet message base (SMB) message text library routines */
                      4: 
1.1.1.2 ! root        5: /* $Id: smbtxt.c,v 1.17 2007/08/12 19:24:08 deuce 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:  *                                                                                                                                                     *
                     11:  * Copyright 2005 Rob Swindell - http://www.synchro.net/copyright.html         *
                     12:  *                                                                                                                                                     *
                     13:  * This library is free software; you can redistribute it and/or                       *
                     14:  * modify it under the terms of the GNU Lesser 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 Lesser General Public License for more details: lgpl.txt or     *
                     18:  * http://www.fsf.org/copyleft/lesser.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: /* ANSI */
                     39: #include <stdlib.h>    /* malloc/realloc/free */
                     40: #include <string.h>    /* strlen */
                     41: 
                     42: /* SMB-specific */
                     43: #include "smblib.h"
                     44: 
                     45: char* SMBCALL smb_getmsgtxt(smb_t* smb, smbmsg_t* msg, ulong mode)
                     46: {
                     47:        char*   buf;
                     48:        char*   lzhbuf;
                     49:        char*   p;
                     50:        char*   str;
1.1.1.2 ! root       51:        uint16_t        xlat;
1.1       root       52:        uint    i;
                     53:        int             lzh;    /* BOOL */
                     54:        long    l=0,lzhlen,length;
                     55: 
                     56:        if((buf=(char*)malloc(sizeof(char)))==NULL) {
                     57:                sprintf(smb->last_error
                     58:                        ,"malloc failure of %u bytes for buffer"
                     59:                        ,sizeof(char));
                     60:                return(NULL);
                     61:        }
                     62:        *buf=0;
                     63: 
                     64:        if(!(mode&GETMSGTXT_NO_HFIELDS)) {
                     65:                for(i=0;i<(uint)msg->total_hfields;i++) {                       /* comment headers are part of text */
                     66:                        if(msg->hfield[i].type!=SMB_COMMENT && msg->hfield[i].type!=SMTPSYSMSG)
                     67:                                continue;
                     68:                        str=(char*)msg->hfield_dat[i];
                     69:                        length=strlen(str)+2;   /* +2 for crlf */
                     70:                        if((p=(char*)realloc(buf,l+length+1))==NULL) {
                     71:                                sprintf(smb->last_error
                     72:                                        ,"realloc failure of %ld bytes for comment buffer"
                     73:                                        ,l+length+1);
                     74:                                return(buf);
                     75:                        }
                     76:                        buf=p;
                     77:                        l+=sprintf(buf+l,"%s\r\n",str);
                     78:                }
                     79:        }
                     80: 
                     81:        for(i=0;i<(uint)msg->hdr.total_dfields;i++) {
                     82:                if(msg->dfield[i].length<=sizeof(xlat))
                     83:                        continue;
                     84:                switch(msg->dfield[i].type) {
                     85:                        case TEXT_BODY:
                     86:                                if(mode&GETMSGTXT_NO_BODY)
                     87:                                        continue;
                     88:                                break;
                     89:                        case TEXT_TAIL:
                     90:                                if(!(mode&GETMSGTXT_TAILS))
                     91:                                        continue;
                     92:                                break;
                     93:                        default:        /* ignore other data types */
                     94:                                continue;
                     95:                }
                     96:                fseek(smb->sdt_fp,msg->hdr.offset+msg->dfield[i].offset
                     97:                        ,SEEK_SET);
                     98:                fread(&xlat,sizeof(xlat),1,smb->sdt_fp);
                     99:                lzh=0;
                    100:                if(xlat==XLAT_LZH) {
                    101:                        lzh=1;
                    102:                        fread(&xlat,sizeof(xlat),1,smb->sdt_fp); 
                    103:                }
                    104:                if(xlat!=XLAT_NONE)     /* no other translations currently supported */
                    105:                        continue;
                    106: 
                    107:                length=msg->dfield[i].length-sizeof(xlat);
                    108:                if(lzh) {
                    109:                        length-=sizeof(xlat);
                    110:                        if(length<1)
                    111:                                continue;
                    112:                        if((lzhbuf=(char*)malloc(length))==NULL) {
                    113:                                sprintf(smb->last_error
                    114:                                        ,"malloc failure of %ld bytes for LZH buffer"
                    115:                                        ,length);
                    116:                                return(buf);
                    117:                        }
                    118:                        smb_fread(smb,lzhbuf,length,smb->sdt_fp);
1.1.1.2 ! root      119:                        lzhlen=*(int32_t*)lzhbuf;
1.1       root      120:                        if((p=(char*)realloc(buf,l+lzhlen+3L))==NULL) {
                    121:                                sprintf(smb->last_error
                    122:                                        ,"realloc failure of %ld bytes for text buffer"
                    123:                                        ,l+lzhlen+3L);
                    124:                                free(lzhbuf);
                    125:                                return(buf); 
                    126:                        }
                    127:                        buf=p;
                    128:                        lzh_decode((char*)lzhbuf,length,(char*)buf+l);
                    129:                        free(lzhbuf);
                    130:                        l+=lzhlen; 
                    131:                }
                    132:                else {
                    133:                        if((p=(char*)realloc(buf,l+length+3L))==NULL) {
                    134:                                sprintf(smb->last_error
                    135:                                        ,"realloc failure of %ld bytes for text buffer"
                    136:                                        ,l+length+3L);
                    137:                                return(buf);
                    138:                        }
                    139:                        buf=p;
                    140:                        p=buf+l;
                    141:                        l+=fread(p,1,length,smb->sdt_fp);
                    142:                }
                    143:                if(!l)
                    144:                        continue;
                    145:                l--;
                    146:                while(l && buf[l]==0) l--;
                    147:                l++;
                    148:                *(buf+l)='\r';  /* CR */
                    149:                l++;
                    150:                *(buf+l)='\n';  /* LF */
                    151:                l++;
                    152:                *(buf+l)=0; 
                    153:        }
                    154: 
                    155:        return(buf);
                    156: }
                    157: 
                    158: void SMBCALL smb_freemsgtxt(char* buf)
                    159: {
                    160:        if(buf!=NULL)
                    161:                free(buf);
                    162: }

unix.superglobalmegacorp.com

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