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.5 2006/05/06 09:13:21 ssianky Exp $
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   short mode;       /* Mode of File (from 'begin') */
146   int   begin;      /* begin detected */
147   int   end;        /* end detected */
148   int   flags;      /* associated flags */
149 
150   short uudet;      /* valid encoded data. value indicates encoding */
151   short partno;     /* Mime-files have a part number within */
152   short maxpno;     /* ... plus the total number of parts   */
153 
154   char *sfname;     /* Associated source file */
155   long startpos;    /* ftell() position where data starts */
156   long length;      /* length of data */
157 } fileread;
158 
159 /*
160  * Structure for holding one part of a file, with some more information
161  * about it. The UUPreProcessPart() function takes one a fileread structure
162  * and produces this uufile structure.
163  * Linked List, ordered by partno.
164  **/
165 
166 typedef struct _uufile {
167   char     *filename;
168   char     *subfname;
169   char     *mimeid;
170   char     *mimetype;
171   short     partno;
172   fileread *data;
173   struct _uufile *NEXT;
174 } uufile;
175 
176 extern void *uu_MsgCBArg;
177 extern void *uu_BusyCBArg;
178 extern void *uu_FileCBArg;
179 extern void *uu_FFCBArg;
180 
181 /*
182  * variables
183  */
184 
185 extern int uu_fast_scanning;
186 extern int uu_bracket_policy;
187 extern int uu_verbose;
188 extern int uu_desperate;
189 extern int uu_ignreply;
190 extern int uu_debug;
191 extern int uu_errno;
192 extern int uu_dumbness;
193 extern int uu_overwrite;
194 extern int uu_ignmode;
195 extern int uu_headercount;
196 extern int uu_usepreamble;
197 extern int uu_handletext;
198 extern int uu_tinyb64;
199 extern int uu_remove_input;
200 extern int uu_more_mime;
201 
202 extern char *uusavepath;
203 extern char *uuencodeext;
204 
205 extern char *uufnchars;
206 
207 /*
208  * Encoding/Decoding tables
209  */
210 
211 extern unsigned char UUEncodeTable[];
212 extern unsigned char XXEncodeTable[];
213 extern unsigned char B64EncodeTable[];
214 extern unsigned char BHEncodeTable[];
215 
216 /*
217  * String tables from uustring.c
218  */
219 
220 extern char *msgnames[];
221 extern char *codenames[];
222 extern char *uuretcodes[];
223 
224 extern uulist *UUGlobalFileList;
225 
226 /*
227  * State of MIME variables and current progress
228  */
229 
230 extern int nofnum, mssdepth;
231 extern int mimseqno, lastvalid;
232 extern int lastenc;
233 extern scanstate  multistack[];
234 extern headers    localenv;
235 extern scanstate  sstate;
236 extern uuprogress progress;
237 
238 /*
239  * mallocable areas
240  */
241 
242 extern char *uugen_fnbuffer, *uugen_inbuffer;
243 extern char *uucheck_lastname, *uucheck_tempname;
244 extern char *uuestr_itemp, *uuestr_otemp;
245 extern char *uulib_msgstring, *uuncdl_fulline;
246 extern char *uuncdp_oline, *uuscan_shlline;
247 extern char *uuscan_pvvalue, *uuscan_phtext;
248 extern char *uuscan_sdline, *uuscan_sdbhds1;
249 extern char *uuscan_sdbhds2, *uuscan_spline;
250 extern char *uuutil_bhwtmp;
251 extern char *uunconc_UUxlat, *uunconc_UUxlen;
252 extern char *uunconc_B64xlat, *uunconc_XXxlat;
253 extern char *uunconc_BHxlat, *uunconc_save;
254 
255 extern void   (*uu_MsgCallback)  (void *, char *, int);
256 extern int    (*uu_BusyCallback) (void *, uuprogress *);
257 extern int    (*uu_FileCallback) (void *, char *, char *, int);
258 extern char * (*uu_FNameFilter)  (void *, char *);
259 
260 /*
261  * Functions from uulib.c that aren't defined in <uudeview.h>
262  * Be careful about the definition with variable arguments.
263  */
264 
265 #if defined(STDC_HEADERS) || defined(HAVE_STDARG_H)
266 int     UUMessage       (char *, int, int, char *, ...);
267 #else
268 int     UUMessage       ();
269 #endif
270 int     UUBusyPoll      (void);
271 
272 /*
273  * Functions from uucheck.c
274  */
275 
276 uufile *    UUPreProcessPart    (fileread *, int *);
277 int         UUInsertPartToList  (uufile *);
278 uulist *    UUCheckGlobalList   (void);
279 
280 /*
281  * Functions from uuutil.c
282  */
283 
284 void        UUkillfread         (fileread *);
285 void        UUkillfile          (uufile *);
286 void        UUkilllist          (uulist *);
287 void        UUkillheaders       (headers *);
288 
289 fileread *  ScanPart  (FILE *, char *, int *);
290 int     UUbhdecomp    (char *, char *, char *, int *,
291                        size_t, size_t, size_t *);
292 size_t  UUbhwrite     (char *, size_t, size_t, FILE *);
293 
294 /*
295  * Functions from uunconc.c
296  */
297 
298 int     UURepairData  (FILE *, char *, int, int *);
299 
300 void    UUInitConc    (void);
301 int     UUValidData   (char *, int, int *);
302 size_t  UUDecodeLine  (char *, char *, int);
303 int     UUDecodePart  (FILE *, FILE *, int *, long, int, int, char *);
304 int     UUDecode      (uulist *);
305 
306 /*
307  * Message retrieval from uustring.c
308  */
309 
310 char *  uustring      (int);
311 
312 /*
313  * From uuscan.c
314  */
315 
316 int     UUScanHeader  (FILE *, headers *);
317 
318 
319 #endif
320