1 /*
2  * This file is part of uudeview, the simple and friendly multi-part multi-
3  * file uudecoder  program  (c) 1994-2001 by Frank Pilhofer. The author may
4  * be contacted at fp@fpx.de
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  */
16 
17 #ifndef __UUINT_H__
18 #define __UUINT_H__
19 
20 /*
21  * This file describes the internal structures, variables and definitions
22  * of UUDeview. It should not be included from other packages. Subject to
23  * change without notice. Do not depend on anything here.
24  *
25  * $Id: uuint.h,v 1.19 2003/04/12 23:18:31 fp Exp $
26  */
27 
28 #ifndef _ANSI_ARGS_
29 #ifdef PROTOTYPES
30 #define _ANSI_ARGS_(c)	c
31 #else
32 #define _ANSI_ARGS_(c)	()
33 #endif
34 #endif
35 
36 /*
37  * Busy Polls will be made after processing ... lines
38  */
39 
40 #define BUSY_LINE_TICKS		50
41 
42 /*
43  * States of MIME scanner
44  */
45 
46 #define MS_HEADERS	1	/* still inside of headers      */
47 #define MS_BODY		2	/* body of `simple' messages    */
48 #define MS_PREAMBLE	3	/* preamble of Multipart/Mixed  */
49 #define MS_SUBPART	4	/* within one of the Multiparts */
50 #define MS_EPILOGUE	5	/* epilogue of Multipart/Mixed  */
51 
52 /*
53  * Number of subsequent encoded lines we require to believe this
54  * is valid data.
55  */
56 
57 #define ELC_COUNT	4
58 
59 /*
60  * Flags a part may have. FL_PROPER means that we are sure about the file's
61  * encoding, beginning and end, and don't have to use special care when de-
62  * coding.
63  */
64 
65 #define FL_NONE		0	/* no flag, just plain normal   */
66 #define FL_SINGLE	1	/* standalone MSG, do not mix   */
67 #define FL_PARTIAL	2	/* from Message/Partial         */
68 #define FL_PROPER	4	/* proper MIME part             */
69 #define FL_TOEND	8	/* part continues to EOF        */
70 
71 /*
72  * Auxiliary macro: compute the percentage of a against b.
73  * The obvious answer is (100*a)/b, but this overflows for large a.
74  * a/(b/100) is better; we use a/((b/100)+1) so that we don't divide
75  * by zero for b<100 and the result doesn't become larger than 100%
76  */
77 
78 #define UUPERCENT(a,b)	((int) ((unsigned long)(a) / \
79 				(((unsigned long)(b)/100)+1)))
80 
81 /*
82  * Make the Busy Callback easier. The macro returns true if the BusyCallback
83  * wants us to terminate.
84  */
85 
86 extern unsigned long uuyctr;
87 #define UUBUSYPOLL(a,b) (((++uuyctr%BUSY_LINE_TICKS)==0) ? (progress.percent=UUPERCENT((a),(b)),UUBusyPoll()):0)
88 
89 /*
90  * How many lines of headers do we need to believe another mail
91  * header is approaching? Use more restrictive values for MIME
92  * mails, less restrictive for Freestyle
93  */
94 
95 typedef struct {
96   int restart;		/* restarting after a MIME body (not subpart) */
97   int afterdata;	/* after we had useful data in freestyle mode */
98   int afternl;		/* after an empty line in freestyle mode      */
99 } headercount;
100 
101 extern headercount hlcount;
102 
103 /*
104  * Information from the headers of a message. Each instance must
105  * have its very own copy of the strings. If `mimevers' is NULL,
106  * then this message does not comply to the MIME standard.
107  */
108 
109 typedef struct _headers {
110   char *from;		/* From:                                          */
111   char *subject;	/* Subject:                                       */
112   char *rcpt;		/* To:                                            */
113   char *date;		/* Date:                                          */
114   char *mimevers;	/* MIME-Version:                                  */
115   char *ctype;		/* Content-Type:                                  */
116   char *ctenc;		/* Content-Transfer-Encoding:                     */
117   char *fname;		/* Potential Filename from Content-Type Parameter */
118   char *boundary;	/* MIME-Boundary from Content-Type Parameter      */
119   char *mimeid;		/* MIME-Id for Message/Partial                    */
120   int partno;		/* part number for Message/Partial                */
121   int numparts;		/* number of parts for Message/Partial            */
122 } headers;
123 
124 /*
125  * Scanner state
126  */
127 
128 typedef struct _scanstate {
129   int isfolder;		/* if we think this is a valid email folder       */
130   int ismime;		/* if we are within a valid MIME message          */
131   int mimestate;	/* state of MIME scanner                          */
132   int mimeenc;		/* encoding of this MIME file                     */
133   char *source;		/* source filename                                */
134   headers envelope;	/* mail envelope headers                          */
135 } scanstate;
136 
137 /*
138  * Structure that holds the information for a single file / part of
139  * a file. If a subject line is encountered, it is copied to subject;
140  * if a begin is found, the mode and name of the file is extracted.
141  * flags are set if 'begin' or 'end' is detected and 'uudet' if valid
142  * uuencoded data is found. If the file contains a 'From:' line with
143  * a '@' in it (indicating an origin email address), it is preserved
144  * in 'origin'.
145  **/
146 
147 typedef struct _fileread {
148   char *subject;	/* Whole subject line */
149   char *filename;	/* Only filled in if begin detected */
150   char *origin;		/* Whole 'From:' line */
151   char *mimeid;		/* the ID for Mime-encoded files */
152   char *mimetype;	/* Content-Type */
153   short mode;		/* Mode of File (from 'begin') */
154   int   begin;		/* begin detected */
155   int   end;		/* end detected */
156   int   flags;		/* associated flags */
157 
158   short uudet;		/* valid encoded data. value indicates encoding */
159   short partno;		/* Mime-files have a part number within */
160   short maxpno;		/* ... plus the total number of parts   */
161 
162   char *sfname;		/* Associated source file */
163   long startpos;	/* ftell() position where data starts */
164   long length;		/* length of data */
165 } fileread;
166 
167 /*
168  * Structure for holding one part of a file, with some more information
169  * about it. The UUPreProcessPart() function takes one a fileread structure
170  * and produces this uufile structure.
171  * Linked List, ordered by partno.
172  **/
173 
174 typedef struct _uufile {
175   char     *filename;
176   char     *subfname;
177   char     *mimeid;
178   char     *mimetype;
179   short     partno;
180   fileread *data;
181   struct _uufile *NEXT;
182 } uufile;
183 
184 extern void *uu_MsgCBArg;
185 extern void *uu_BusyCBArg;
186 extern void *uu_FileCBArg;
187 extern void *uu_FFCBArg;
188 
189 /*
190  * variables
191  */
192 
193 extern int uu_fast_scanning;
194 extern int uu_bracket_policy;
195 extern int uu_verbose;
196 extern int uu_desperate;
197 extern int uu_ignreply;
198 extern int uu_debug;
199 extern int uu_errno;
200 extern int uu_dumbness;
201 extern int uu_overwrite;
202 extern int uu_ignmode;
203 extern int uu_headercount;
204 extern int uu_usepreamble;
205 extern int uu_handletext;
206 extern int uu_tinyb64;
207 extern int uu_remove_input;
208 extern int uu_more_mime;
209 
210 extern char *uusavepath;
211 extern char *uuencodeext;
212 
213 /*
214  * Encoding/Decoding tables
215  */
216 
217 extern unsigned char UUEncodeTable[];
218 extern unsigned char XXEncodeTable[];
219 extern unsigned char B64EncodeTable[];
220 extern unsigned char BHEncodeTable[];
221 
222 /*
223  * String tables from uustring.c
224  */
225 
226 extern char *msgnames[];
227 extern char *codenames[];
228 extern char *uuretcodes[];
229 
230 extern uulist *UUGlobalFileList;
231 
232 /*
233  * State of MIME variables and current progress
234  */
235 
236 extern int nofnum, mssdepth;
237 extern int mimseqno, lastvalid;
238 extern int lastenc;
239 extern scanstate  multistack[];
240 extern headers    localenv;
241 extern scanstate  sstate;
242 extern uuprogress progress;
243 
244 /*
245  * mallocable areas
246  */
247 
248 extern char *uugen_fnbuffer, *uugen_inbuffer;
249 extern char *uucheck_lastname, *uucheck_tempname;
250 extern char *uuestr_itemp, *uuestr_otemp;
251 extern char *uulib_msgstring, *uuncdl_fulline;
252 extern char *uuncdp_oline, *uuscan_shlline, *uuscan_shlline2;
253 extern char *uuscan_pvvalue, *uuscan_phtext;
254 extern char *uuscan_sdline, *uuscan_sdbhds1;
255 extern char *uuscan_sdbhds2, *uuscan_spline;
256 extern char *uuutil_bhwtmp;
257 extern char *uunconc_UUxlat, *uunconc_UUxlen;
258 extern char *uunconc_B64xlat, *uunconc_XXxlat;
259 extern char *uunconc_BHxlat, *uunconc_save;
260 
261 #ifdef __cplusplus
262 extern "C" {
263 #endif
264 
265 extern void   (*uu_MsgCallback)  _ANSI_ARGS_((void *, char *, int));
266 extern int    (*uu_BusyCallback) _ANSI_ARGS_((void *, uuprogress *));
267 extern int    (*uu_FileCallback) _ANSI_ARGS_((void *, char *, char *, int));
268 extern char * (*uu_FNameFilter)  _ANSI_ARGS_((void *, char *));
269 
270 /*
271  * Functions from uulib.c that aren't defined in <uudeview.h>
272  * Be careful about the definition with variable arguments.
273  */
274 
275 #if defined(STDC_HEADERS) || defined(HAVE_STDARG_H)
276 int		UUMessage		_ANSI_ARGS_((char *, int,
277 						     int, char *, ...));
278 #else
279 int		UUMessage		();
280 #endif
281 int		UUBusyPoll		_ANSI_ARGS_((void));
282 
283 /*
284  * Functions from uucheck.c
285  */
286 
287 uufile *	UUPreProcessPart	_ANSI_ARGS_((fileread *, int *));
288 int 		UUInsertPartToList	_ANSI_ARGS_((uufile *));
289 uulist *	UUCheckGlobalList	_ANSI_ARGS_((void));
290 
291 /*
292  * Functions from uuutil.c
293  */
294 
295 void 		UUkillfread 		_ANSI_ARGS_((fileread *));
296 void	 	UUkillfile 		_ANSI_ARGS_((uufile *));
297 void 		UUkilllist 		_ANSI_ARGS_((uulist *));
298 void 		UUkillheaders 		_ANSI_ARGS_((headers *));
299 
300 fileread *	ScanPart 		_ANSI_ARGS_((FILE *, char *, int *));
301 
302 int		UUbhdecomp		_ANSI_ARGS_((char *, char *,
303 						     char *, int *,
304 						     size_t, size_t,
305 						     size_t *));
306 size_t		UUbhwrite		_ANSI_ARGS_((char *, size_t, size_t,
307 						     FILE *));
308 
309 /*
310  * Functions from uunconc.c
311  */
312 
313 int		UURepairData		_ANSI_ARGS_((FILE *, char *,
314 						     int, int *));
315 
316 void 		UUInitConc		_ANSI_ARGS_((void));
317 int 		UUValidData		_ANSI_ARGS_((char *, int, int *));
318 size_t 		UUDecodeLine		_ANSI_ARGS_((char *, char *, int));
319 int		UUDecodeField		_ANSI_ARGS_((char *, char *, int));
320 int		UUDecodePart		_ANSI_ARGS_((FILE *, FILE *, int *,
321 						     long, int, int, char *));
322 int 		UUDecode 		_ANSI_ARGS_((uulist *));
323 
324 /*
325  * Message retrieval from uustring.c
326  */
327 
328 char *		uustring		_ANSI_ARGS_((int));
329 
330 /*
331  * From uuscan.c
332  */
333 
334 int		UUScanHeader		_ANSI_ARGS_((FILE *, headers *));
335 
336 #ifdef __cplusplus
337 }
338 #endif
339 #endif
340