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