smbtxt.c 4.53 KB
Newer Older
1
2
3
4
5
6
7
8
9
10
/* smbtxt.c */

/* Synchronet message base (SMB) message text library routines */

/* $Id$ */

/****************************************************************************
 * @format.tab-size 4		(Plain Text/Source Code File Header)			*
 * @format.use-tabs true	(see http://www.synchro.net/ptsc_hdr.html)		*
 *																			*
11
 * Copyright 2005 Rob Swindell - http://www.synchro.net/copyright.html		*
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
 *																			*
 * This library is free software; you can redistribute it and/or			*
 * modify it under the terms of the GNU Lesser General Public License		*
 * as published by the Free Software Foundation; either version 2			*
 * of the License, or (at your option) any later version.					*
 * See the GNU Lesser General Public License for more details: lgpl.txt or	*
 * http://www.fsf.org/copyleft/lesser.html									*
 *																			*
 * Anonymous FTP access to the most recent released source is available at	*
 * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net	*
 *																			*
 * Anonymous CVS access to the development source and modification history	*
 * is available at cvs.synchro.net:/cvsroot/sbbs, example:					*
 * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login			*
 *     (just hit return, no password is necessary)							*
 * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src		*
 *																			*
 * For Synchronet coding style and modification guidelines, see				*
 * http://www.synchro.net/source.html										*
 *																			*
 * You are encouraged to submit any modifications (preferably in Unix diff	*
 * format) via e-mail to mods@synchro.net									*
 *																			*
 * Note: If this box doesn't appear square, then you need to fix your tabs.	*
 ****************************************************************************/

/* ANSI */
39
40
#include <stdlib.h>	/* malloc/realloc/free */
#include <string.h>	/* strlen */
41
42
43
44

/* SMB-specific */
#include "smblib.h"

45
char* SMBCALL smb_getmsgtxt(smb_t* smb, smbmsg_t* msg, ulong mode)
46
{
47
48
49
	char*	buf;
	char*	lzhbuf;
	char*	p;
50
	char*	str;
deuce's avatar
64-bit    
deuce committed
51
	uint16_t	xlat;
52
53
	uint 	i;
	int		lzh;	/* BOOL */
54
55
	long	l=0,lzhlen,length;

56
	if((buf=(char*)malloc(sizeof(char)))==NULL) {
57
		sprintf(smb->last_error
deuce's avatar
deuce committed
58
			,"malloc failure of %" XP_PRIsize_t "u bytes for buffer"
59
60
61
62
63
			,sizeof(char));
		return(NULL);
	}
	*buf=0;

64
65
66
67
68
69
70
71
72
73
74
75
76
77
	if(!(mode&GETMSGTXT_NO_HFIELDS)) {
		for(i=0;i<(uint)msg->total_hfields;i++) {			/* comment headers are part of text */
			if(msg->hfield[i].type!=SMB_COMMENT && msg->hfield[i].type!=SMTPSYSMSG)
				continue;
			str=(char*)msg->hfield_dat[i];
			length=strlen(str)+2;	/* +2 for crlf */
			if((p=(char*)realloc(buf,l+length+1))==NULL) {
				sprintf(smb->last_error
					,"realloc failure of %ld bytes for comment buffer"
					,l+length+1);
				return(buf);
			}
			buf=p;
			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
85
86
87
88
89
90
91
92
93
94
95
		switch(msg->dfield[i].type) {
			case TEXT_BODY:
				if(mode&GETMSGTXT_NO_BODY)
					continue;
				break;
			case TEXT_TAIL:
				if(!(mode&GETMSGTXT_TAILS))
					continue;
				break;
			default:	/* ignore other data types */
				continue;
		}
96
97
		fseek(smb->sdt_fp,msg->hdr.offset+msg->dfield[i].offset
			,SEEK_SET);
98
		fread(&xlat,sizeof(xlat),1,smb->sdt_fp);
99
100
101
		lzh=0;
		if(xlat==XLAT_LZH) {
			lzh=1;
102
			fread(&xlat,sizeof(xlat),1,smb->sdt_fp); 
103
104
105
106
		}
		if(xlat!=XLAT_NONE) 	/* no other translations currently supported */
			continue;

107
		length=msg->dfield[i].length-sizeof(xlat);
108
		if(lzh) {
109
			length-=sizeof(xlat);
110
111
			if(length<1)
				continue;
112
			if((lzhbuf=(char*)malloc(length))==NULL) {
113
114
115
116
117
				sprintf(smb->last_error
					,"malloc failure of %ld bytes for LZH buffer"
					,length);
				return(buf);
			}
118
			smb_fread(smb,lzhbuf,length,smb->sdt_fp);
deuce's avatar
deuce committed
119
			lzhlen=*(int32_t*)lzhbuf;
120
			if((p=(char*)realloc(buf,l+lzhlen+3L))==NULL) {
121
122
123
				sprintf(smb->last_error
					,"realloc failure of %ld bytes for text buffer"
					,l+lzhlen+3L);
124
				free(lzhbuf);
125
126
127
				return(buf); 
			}
			buf=p;
deuce's avatar
deuce committed
128
			lzh_decode((uint8_t *)lzhbuf,length,(uint8_t *)buf+l);
129
			free(lzhbuf);
130
131
132
			l+=lzhlen; 
		}
		else {
133
			if((p=(char*)realloc(buf,l+length+3L))==NULL) {
134
135
136
137
138
139
140
141
142
143
144
145
146
147
				sprintf(smb->last_error
					,"realloc failure of %ld bytes for text buffer"
					,l+length+3L);
				return(buf);
			}
			buf=p;
			p=buf+l;
			l+=fread(p,1,length,smb->sdt_fp);
		}
		if(!l)
			continue;
		l--;
		while(l && buf[l]==0) l--;
		l++;
148
		*(buf+l)='\r';	/* CR */
149
		l++;
150
		*(buf+l)='\n';	/* LF */
151
152
153
		l++;
		*(buf+l)=0; 
	}
154

155
156
157
	return(buf);
}

158
void SMBCALL smb_freemsgtxt(char* buf)
159
160
{
	if(buf!=NULL)
161
		free(buf);
162
}