1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License, Version 1.0 only
6  * (the "License").  You may not use this file except in compliance
7  * with the License.
8  *
9  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10  * or http://www.opensolaris.org/os/licensing.
11  * See the License for the specific language governing permissions
12  * and limitations under the License.
13  *
14  * When distributing Covered Code, include this CDDL HEADER in each
15  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16  * If applicable, add the following below this CDDL HEADER, with the
17  * fields enclosed by brackets "[]" replaced with your own identifying
18  * information: Portions Copyright [yyyy] [name of copyright owner]
19  *
20  * CDDL HEADER END
21  */
22 /*	Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T	*/
23 /*	  All Rights Reserved  	*/
24 
25 
26 /*
27  * Copyright 2003 Sun Microsystems, Inc.  All rights reserved.
28  * Use is subject to license terms.
29  */
30 
31 #ifndef _MAIL_H
32 #define	_MAIL_H
33 
34 /*	from OpenSolaris "mail.h	1.17	05/06/08 SMI"	*/
35 
36 /*
37  * Portions Copyright (c) 2005 Gunnar Ritter, Freiburg i. Br., Germany
38  *
39  * Sccsid @(#)mail.h	1.11 (gritter) 7/3/05
40  */
41 
42  /*
43   * All global externs defined here. All variables are initialized
44   * in init.c
45   *
46   * !!!!!IF YOU CHANGE (OR ADD) IT HERE, DO IT THERE ALSO !!!!!!!!
47   *
48   */
49 #include	<errno.h>
50 #include	<fcntl.h>
51 #include	<stdio.h>
52 #include	<ctype.h>
53 #include	<sys/types.h>
54 #include	<errno.h>
55 #include	<pwd.h>
56 #include	<signal.h>
57 #include	<string.h>
58 #include	<grp.h>
59 /* The following is a kludge to allow for inconsistent header files in SVR4 */
60 #define		_CLOCK_T
61 #include	<time.h>
62 #include	<sys/stat.h>
63 #include	<setjmp.h>
64 #include	<sys/utsname.h>
65 #include        <limits.h>
66 
67 #include	<utime.h>
68 #include	"libmail.h"
69 
70 #include	<sigset.h>
71 
72 #define CHILD		0
73 #define SAME		0
74 
75 #define	BELL		07
76 
77 #   define	PIPER	"/usr/lib/mail/mail_pipe"
78 
79 #define SENDMAIL "/usr/lib/sendmail"
80 
81 #define CERROR		-1
82 #define CSUCCESS	0
83 
84 #define TRUE	1
85 #define FALSE	0
86 
87 #define	HEAD	1
88 #define TAIL	0
89 
90 #define	REAL	1
91 #define DEFAULT	0
92 
93 /* findSurg() return values */
94 #define	NOMATCH		-1
95 #define	DELIVER		0
96 #define	POSTDELIVER	1
97 #define	DENY		2
98 #define	TRANSLATE	3
99 
100 /* sendsurg() return values */
101 #define	FAILURE		0
102 #define	CONTINUE	1
103 #define	SUCCESS		2
104 /*	TRANSLATE	3 */
105 
106 #define	HDRSIZ	1024	/* maximum length of header line */
107 
108 #define E_FLGE	1	/* flge error */
109 #define E_FLGE_OM 2	/* flgE error, mail present but already accessed */
110 #define	E_REMOTE 1	/* unknown remote */
111 #define E_FILE	2	/* file error */
112 #define E_SPACE	3	/* no space */
113 #define E_FRWD	4	/* cannot forward */
114 #define E_SYNTAX 5      /* syntax error */
115 #define E_FRWL	6	/* forwarding loop */
116 #define E_SNDR  7	/* invalid sender */
117 #define E_USER  8	/* invalid user */
118 #define E_FROM  9	/* too many From lines */
119 #define E_PERM  10 	/* bad permissions */
120 #define E_MBOX  11 	/* mbox problem */
121 #define E_TMP	12 	/* temporary file problem */
122 #define E_DEAD  13 	/* Cannot create dead.letter */
123 #define E_UNBND 14 	/* Unbounded forwarding */
124 #define E_LOCK  15 	/* cannot create lock file */
125 #define E_GROUP	16	/* no group id of 'mail' */
126 #define	E_MEM	17	/* malloc failure */
127 #define E_FORK	18	/* could not fork */
128 #define	E_PIPE	19	/* could not pipe */
129 #define	E_OWNR	20	/* invoker does not own mailfile */
130 #define	E_DENY	21	/* permission denied by mailsurr file */
131 #define E_SURG	22	/* surrogate command failed - rc != 0 || 99 */
132 
133 #define	H_AFWDCNT		1	/* "Auto-Forward-Count:"  */
134 #define	H_AFWDFROM		2	/* "Auto-Forwarded-From:" */
135 /*	H_CLEN			3	   "Content-Length:"      */
136 #define	H_CTYPE			4	/* "Content-Type:"        */
137 #define	H_DATE			5	/* "Date:" 		  */
138 #define	H_DEFOPTS		6	/* "Default-Options:" 	  */
139 #define	H_EOH			7	/* "End-of-Header:" 	  */
140 #define	H_FROM			8	/* "From " 		  */
141 #define	H_FROM1			9	/* ">From " 		  */
142 #define	H_FROM2			10	/* "From: " 		  */
143 /*	H_MIMEVERS		11	   "MIME-Version:"        */
144 #define	H_MTSID			12	/* "MTS-Message-ID:" 	  */
145 #define	H_MTYPE			13	/* "Message-Type:" 	  */
146 #define	H_MVERS			14	/* "Message-Version:" 	  */
147 #define	H_MSVC			15	/* "Message-Service:" 	  */
148 #define	H_RECEIVED		16	/* "Received:"	 	  */
149 #define	H_RVERS			17	/* "Report-Version:" 	  */
150 #define	H_SUBJ			18	/* "Subject:" 		  */
151 #define	H_TO			19	/* "To:" 		  */
152 #define	H_TCOPY			20	/* ">To:" 		  */
153 #define	H_TROPTS		21	/* "Transport-Options:"   */
154 #define	H_UAID			22	/* "UA-Content-ID:"	  */
155 #define	H_DAFWDFROM		23	/* Hold A-F-F when sending Del. Notf. */
156 #define	H_DTCOPY		24	/* Hold ">To:" when sending Del. Notf.*/
157 #define	H_DRECEIVED		25	/* Hold Rcvd: when sending Del. Notf.*/
158 #define	H_CONT			26	/* Continuation of previous line */
159 #define	H_NAMEVALUE		27	/* unrecognized "name: value" hdr line*/
160 
161 /* MTA Transport Options */
162 #define	DELIVERY	001
163 #define	NODELIVERY	002
164 #define	REPORT		010
165 #define	RETURN		020
166 #define	IGNORE		040
167 
168 /*
169 	copylet flags
170 */
171 #define	REMOTE		1		/* remote mail, add rmtmsg */
172 #define ORDINARY	2
173 #define ZAP		3		/* zap header and trailing empty line */
174 #define FORWARD		4
175 #define TTY		5		/* suppress binary to tty */
176 
177 #define	LSIZE		(2*BUFSIZ)	/* maximum size of a line */
178 #define	MAXLET		1000		/* maximum number of letters */
179 #define FROMLEVELS	20		/* maxium number of forwards */
180 #ifdef FILENAME_MAX
181 # define MAXFILENAME	FILENAME_MAX	/* max length of a filename */
182 #else
183 # define MAXFILENAME	512		/* max length of a filename */
184 #endif
185 #define DEADPERM	0600		/* permissions of dead.letter */
186 
187 #ifndef	MFMODE
188 #define	MFMODE		0660		/* create mode for `/var/mail' files */
189 #endif
190 
191 #define A_OK		0		/* return value for access */
192 #define A_EXECUTE	1
193 #define A_EXIST		0		/* access check for existence */
194 #define A_WRITE		2		/* access check for write permission */
195 #define A_READ		4		/* access check for read permission */
196 
197 #  define MAILSURR "/etc/mail/mailsurr"
198 #  define MAILCNFG "/etc/mail/mailcnfg"
199 
200 struct hdr {
201 	char	*tag;
202 	int	default_display;
203 };
204 
205 struct hdrs {
206 	struct	hdrs	*next;
207 	struct	hdrs	*prev;
208 	struct	hdrs	*cont;	/* Continuation lines */
209 		char	value[HDRSIZ+1];
210 };
211 
212 struct hdrlines {
213 	struct	hdrs	*head;
214 	struct	hdrs	*tail;
215 };
216 
217 typedef struct recip {
218 	struct recip	*next;
219 	char		*name;
220 } recip;
221 
222 typedef struct reciplist {
223 	recip *last_recip;
224 	recip recip_list;
225 } reciplist;
226 
227 struct let {
228 	long	adr;		/* offset in mailfile of letter n */
229 	char	change;		/* disposition status of letter n */
230 	char	text;		/* 1 ==> text content, 0 ==> binary content.
231 				 * This is determined INDEPENDENTLY of what
232 				 * the Content-type, if present, says...
233 				 */
234 };
235 
236 typedef enum t_surrtype
237 {
238     t_eof, t_transport = '<',
239     t_accept = 'a', t_deny = 'd',
240     t_translate = 't', t_postprocess = '>'
241 } t_surrtype;
242 
243 typedef struct t_surrfile
244 {
245     /* originator's regular expression */
246     string *orig_pattern;
247     char *orig_regex;
248     int orig_reglen;
249     int orig_nbra;
250 
251     /* recipient's regular expression */
252     string *recip_pattern;
253     char *recip_regex;
254     int recip_reglen;
255     int recip_nbra;
256 
257     /* the type of the command string */
258     t_surrtype surr_type;
259 
260     int batchsize;	/* transport	translate	postprocess */
261     char *statlist;	/* transport				    */
262     string *cmd_left;	/* transport	translate	postprocess */
263     string *cmd_right;	/* transport	translate	postprocess */
264     int fullyresolved;	/*		translate		    */
265 } t_surrfile;
266 
267 #include <stdlib.h>
268 #include <unistd.h>
269 
270 extern	void	Dout(char *subname, int level, char *fmt, ...);
271 extern	void	Tout(char *subname, char *msg, ...);
272 extern	int	accessmf(char *path);
273 extern	int	add_recip(reciplist *plist, char *name, int checkdups);
274 extern	char	*altcompile(const char *instring, char *expbuf, char *endbuf);
275 extern	int	areforwarding(char *mailfile);
276 extern	void	cat(char**, size_t *, const char*, const char*);
277 extern	int	ckdlivopts(int tcopy_hdr, int *svopts);
278 extern	void	cksaved(char *user);
279 extern	int	cksurg_rc(int surr_num, int rc);
280 extern	void	clr_hinfo(void);
281 extern	void	clrhdr(int hdrtype);
282 extern	void	cmdexpand(int letnum, string *instr, string *outstr, char **lbraslist, char **lbraelist);
283 extern	void	concat(char **, size_t *, const char *);
284 extern	void	copyback(void);
285 extern	int	copylet(int letnum, FILE *f, int type);
286 extern	void	copymt(FILE *f1, FILE *f2);
287 #define	cpy(a, b, c)	cat(a, b, c, NULL)
288 extern	void	createmf(uid_t uid, char *file);
289 extern	void	del_reciplist (reciplist *list);
290 extern	void	delete(int);
291 extern	void	doFopt(void);
292 extern	void	done(int);
293 extern	void	sig_done(int);
294 extern	FILE	*doopen(char *file, char *type, int errnum);
295 extern	int	dowait(pid_t pidval);
296 extern	void	dumpaff(int type, int htype, int *didafflines, int *suppress, FILE *f);
297 extern	void	dumprcv(int type, int htype, int *didrcvlines, int *suppress, FILE *f);
298 extern	void	errmsg(int error_value, char *error_message);
299 extern	char	*fgetline(char **, size_t *, size_t *, FILE *);
300 extern	int	findSurg(int letnum, string *execbuf, int flag, int *psurr_num, int *paccept, string *lorig, string *lrecipname);
301 extern	void	gendeliv(FILE *fp, int rc, char *name);
302 extern	char	*getarg(char *, char *);
303 extern	int	getcomment(char *s, char *q);
304 extern	int	gethead(int	current, int all);
305 #define	getline(a, b, c)	ma_getline(a, b, c)
306 extern	int	getline(char **ptr2line, size_t *max, FILE *f);
307 extern	int	getnumbr(char *s);
308 extern	int	getsurr(FILE *fp, string *buf, int firstfield);
309 extern	void	goback(int letnum);
310 extern	int	init(void);
311 extern	void	initsurrfile(void);
312 extern	int	isheader(char *lp, int *ctfp);
313 extern	int	isit(char *lp, int type);
314 extern	int	islocal(char *user, uid_t *puid);
315 extern	int	istext(unsigned char *s, int size);
316 extern	int	legal(char *file);
317 extern	void	lock(char	*user);
318 extern	void	madd_recip(reciplist *plist, char *name, int checkdups);
319 extern	char	*mailcompile(string *pattern, int *retlen, int *retnbra);
320 extern	void	mkdead(void);
321 extern	void	mktmp(void);
322 extern	void	mta_ercode(FILE *outfile);
323 extern	void	new_reciplist (reciplist *list);
324 extern	int	notme(char *fto, char *myname);
325 extern	int	parse(int argc, char **argv);
326 extern	int	pckaffspot(void);
327 extern	int	pckrcvspot(void);
328 extern	void	pickFrom(char *lineptr);
329 extern	int	pipletr(int letter, char *command, int cltype);
330 extern	void	poplist (int hdrtype, int where);
331 extern	int	printhdr (int type, int hdrtype, struct hdrs *hptr, FILE *fp);
332 extern	void	printmail(void);
333 extern	void	pushlist(int hdrtype, int where, char *s, int contflg);
334 extern	void	savdead(int);
335 extern	void	savehdrs(char *s, int hdrtype);
336 extern	int	sel_disp (int type, int hdrtype, char *s);
337 extern	int	sendlist(reciplist *list, int letnum, int level);
338 extern	void	sendmail(int argc, char **argv);
339 extern	int	sendsurg(reciplist *plist, int  letnum, int flag, int local);
340 extern	void	setletr(int letter, int status);
341 extern	void	(*setsig(int i, void(*f)(int)))(int);
342 extern	void	setsurg_bt(string *st, int *pbatchsize, int *presolved);
343 extern	char	*setsurg_rc(string *st, int defreal, int *pbatchsize);
344 extern	char	**setup_exec(char*);
345 #define	smalloc(n)	srealloc(NULL, n);
346 extern	void	*srealloc(void *, size_t);
347 extern	void	stamp(void);
348 extern	int	systm(char *s);
349 extern	void	tmperr(void);
350 extern	string	*tokdef(string *fld, string *tok, char *name);
351 extern	int	translate(reciplist *plist, char *cmdstr, char *origname);
352 extern	void	unlock(void);
353 extern	int	validmsg(int);
354 extern	int	wtmpf(char *str, int length);
355 
356 extern	int	ac;		/* argument list count */
357 extern	char	**av;		/* argument list */
358 extern	int	affbytecnt;     /* Total bytes of Auto-Fwd. info in msg. */
359 extern	int	affcnt;		/* Number of Auto-Fwd.-From: lines in msg. */
360 extern	int	Daffbytecnt;    /* Hold affbytecnt when sending Deliv. Notif. */
361 extern	int	Daffcnt;	/* Hold affcnt when sending Deliv. Notif. */
362 extern	char	binmsg[];
363 extern	int	changed;	/* > 0 says mailfile has changed */
364 extern	char	datestring[60];
365 extern	char	dbgfname[20];	/* name of file for debugging output */
366 extern	FILE	*dbgfp;		/* FILE* for debugging output */
367 extern	char	dead[];		/* name of dead.letter */
368 extern	int	debug;		/* Controls debugging level. 0 ==> no debugging */
369 extern	int	delflg;
370 extern	int	dflag;		/* 1 says returning unsendable mail */
371 extern	char	*errlist[];
372 extern	int	error;		/* Local value for error */
373 extern	char	*failsafe;	/* $FAILSAFE */
374 extern	int	file_size;
375 extern	int	flge;		/* 1 ==> 'e' option specified */
376 extern  int     flgE;		/* 1 ==> 'E' option specified */
377 extern	int	flgF;		/* 1 ==> Installing/Removing  Forwarding */
378 extern	int	flgf;		/* 1 ==> 'f' option specified */
379 extern	int	flgh;		/* 1 ==> 'h' option specified */
380 extern	int	flgm;
381 extern	int	flgp;		/* 1 ==> 'p' option specified */
382 extern	int	flgP;		/* 1 ==> 'P' option specified */
383 extern	int	flgr;		/* 1 ==> 'r' option -- print in fifo order */
384 extern	int	flgt;		/* 1 ==> 't' option -- add To: line to letter */
385 extern	int	flgT;		/* 1 ==> 'T' option specified */
386 extern	int	flgw;		/* 1 ==> 'w' option specified */
387 extern	int	fnuhdrtype;	/* type of first non-UNIX header line */
388 extern	char	forwmsg[];	/* " forwarded by %s" */
389 extern	char	frwlmsg[];	/* "Forwarding loop detected in mailfile" */
390 extern	char	*fromS;		/* stored here by sendmail for sendsurg */
391 extern	size_t	fromSsize;
392 extern	char	*fromU;		/* stored here by sendmail for sendsurg */
393 extern	size_t	fromUsize;
394 extern	char	frwrd[];	/* forwarding sentinel */
395 extern	char	fwdFrom[1024];
396 extern	int	goerr;		/* counts parsing errors */
397 extern	struct	group *grpptr;	/* pointer to struct group */
398 extern	struct hdrlines hdrlines[H_CONT];
399 extern	struct hdr header[];	/* H_* #define's used to index into array */
400 extern	char	*help[];
401 extern	char	*hmbox;		/* pointer to $HOME/mbox */
402 extern	size_t	hmboxsize;
403 extern	char	*hmdead;	/* pointer to $HOME/dead.letter */
404 extern	size_t	hmdeadsize;
405 extern	char	*home;		/* pointer to $HOME */
406 extern	time_t	iop;
407 extern	int	interactive;	/* 1 says user is interactive */
408 extern	int	ismail;		/* default to program=mail */
409 extern  int     deliverflag;     /* -d flag, bypass sendmail and go to mbox */
410 extern  int     fromflag;       /* -f from_user while sending */
411 extern	int	keepdbgfile;	/* does debug file get deleted at end? */
412 extern	struct let let[MAXLET];
413 extern	char	*lettmp;	/* pointer to tmp filename */
414 extern	char	lfil[MAXFILENAME];
415 extern	char	*line;		/* holds a line of a letter in many places */
416 extern	size_t	linesize;
417 extern	char	*mailfile;	/* pointer to mailfile */
418 extern	char	mailcnfg[];	/* /etc/mail/mailcnfg */
419 extern	char	maildir[];	/* directory for mail files */
420 extern	gid_t	mailgrp;	/* numeric id of group 'mail' */
421 extern	char	mailsave[];	/* dir for save files */
422 extern	char	*mailsurr;	/* surrogate file name */
423 extern	FILE	*malf;		/* File pointer for mailfile */
424 extern	int	maxerr;		/* largest value of error */
425 extern	int	mb_cur_max;	/* MB_CUR_MAX */
426 extern	char	mbox[];		/* name for mbox */
427 extern	uid_t	mf_uid;		/* uid of user's mailfile */
428 extern	gid_t	mf_gid;		/* gid of user's mailfile */
429 extern	char	*msgtype;
430 extern	char	*my_name;	/* user's name who invoked this command */
431 extern	size_t	my_namesize;
432 extern	char	from_user[1024];/* name of user mail's from, used w/ -f */
433 extern	uid_t	my_euid;	/* user's euid */
434 extern	gid_t	my_egid;	/* user's egid */
435 extern	uid_t	my_uid;		/* user's uid */
436 extern	gid_t	my_gid;		/* user's gid */
437 extern	int	nlet;		/* current number of letters in mailfile */
438 extern	int	onlet;		/* number of letters in mailfile at startup*/
439 extern	int	optcnt;		/* Number of options specified */
440 extern	int	orig_aff;	/* orig. msg. contained H_AFWDFROM lines */
441 extern	int	orig_dbglvl;	/* argument to -x invocation option */
442 extern	int	orig_rcv;	/* orig. msg. contained H_RECEIVED lines */
443 extern	int	orig_tcopy;	/* orig. msg. contained H_TCOPY lines */
444 extern	struct	passwd *pwd;	/* holds passwd entry for this user */
445 extern	int	pflg;		/* binary message display override flag */
446 extern	int	Pflg;		/* Selective display flag; 1 ==> display all */
447 extern	char	*program;	/* program name */
448 extern	int	rcvbytecnt;     /* Total bytes of Received: info in msg. */
449 extern	int	Drcvbytecnt;    /* Hold rcvbytecnt when sending Del. Notif. */
450 extern	char	*recipname;	/* full recipient name/address */
451 extern	int	replying;	/* 1 says we are replying to a letter */
452 extern	char	RFC822datestring[60];/* Date in RFC822 date format */
453 extern	char	rmtmsg[];	/* "remote from %s" */
454 extern	char	*Rpath;		/* return path to sender of message */
455 extern	size_t	Rpathsize;
456 extern	char	rtrnmsg[];	/* "UNDELIVERABLE MAIL being returned by %s" */
457 extern	int	sav_errno;
458 extern	char	*savefile;	/* holds filename of save file */
459 extern	size_t	savefilesize;
460 extern	void	(*saveint)(int);
461 extern	char	*seldisp[];
462 extern	int	sending;	/* TRUE==>sending mail; FALSE==>printing mail */
463 extern	char	*m_sendto;
464 extern	size_t	m_sendtosize;
465 extern	jmp_buf	sjbuf;
466 extern	int	surg_rc;	/* exit code of surrogate command */
467 extern	t_surrfile *surrfile;	/* the compiled surrogate file */
468 extern	int	surr_len;	/* # entries in surrogate file */
469 extern	char	*SURRcmdstr;	/* save in case of FAILURE */
470 extern	FILE	*SURRerrfile;	/* stderr from surrogate in case of failure */
471 extern	char	*thissys;	/* Holds name of the system we are on */
472 extern	FILE	*tmpf;		/* file pointer for temporary files */
473 extern	mode_t	umsave;
474 extern	struct	utsname utsn;
475 extern	struct utimbuf *utimep;
476 extern	char	uval[1024];
477 
478 #ifdef NOTDEF
479 #ifdef sun
480 #define _NFILE getdtablesize()
481 #endif
482 #endif /* NOTDEF */
483 
484 #ifdef	__GNUC__
485 #define	UNUSED	__attribute__ ((unused))
486 #else
487 #define	UNUSED
488 #endif
489 
490 #define	nextb(to, tosize, i) \
491 		if ((i) >= *(tosize)) \
492 			*(to) = srealloc(*(to), *(tosize) += 32); \
493 		(*(to))[(i)++]
494 
495 #endif /* _MAIL_H */
496