summaryrefslogtreecommitdiff
path: root/usr/src/cmd/mail/mail.h
blob: 08dbd66d75c27d05dcb857d4a30d442470742ead (plain)
1
2
3
4
5
6
7
8
9
10
11
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License, Version 1.0 only
 * (the "License").  You may not use this file except in compliance
 * with the License.
 *
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
 * or http://www.opensolaris.org/os/licensing.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
 * If applicable, add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your own identifying
 * information: Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 */
/*
 * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
 * Use is subject to license terms.
 */

/*	Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T	*/
/*	  All Rights Reserved  	*/

#ifndef _MAIL_H
#define	_MAIL_H

#pragma ident	"%Z%%M%	%I%	%E% SMI"

 /*
  * All global externs defined here. All variables are initialized
  * in init.c
  *
  * !!!!!IF YOU CHANGE (OR ADD) IT HERE, DO IT THERE ALSO !!!!!!!!
  *
  */
#include	<errno.h>
#include	<fcntl.h>
#include	<stdio.h>
#include	<ctype.h>
#include	<sys/types.h>
#include	<errno.h>
#include	<pwd.h>
#include	<signal.h>
#include	<string.h>
#include	<grp.h>
/* The following is a kludge to allow for inconsistent header files in SVR4 */
#define		_CLOCK_T
#include	<time.h>
#include	<sys/stat.h>
#include	<setjmp.h>
#include	<sys/utsname.h>
#include        <limits.h>

#ifdef SVR3
   struct utimbuf {
	time_t	actime;
	time_t	modtime;
   };
#else
#  include	<utime.h>
#endif
#include	"libmail.h"

/* The following typedefs must be used in SVR4 */
#ifdef SVR3
# ifndef sun
typedef int gid_t;
typedef int uid_t;
# endif
typedef int pid_t;
#endif

#define CHILD		0
#define SAME		0

#define	BELL		07

#   define	PIPER	"/usr/lib/mail/mail_pipe"

#define SENDMAIL "/usr/lib/sendmail"

#define CERROR		-1
#define CSUCCESS	0

#define TRUE	1
#define FALSE	0

#define	HEAD	1
#define TAIL	0

#define	REAL	1
#define DEFAULT	0

/* findSurg() return values */
#define	NOMATCH		-1
#define	DELIVER		0
#define	POSTDELIVER	1
#define	DENY		2
#define	TRANSLATE	3

/* sendsurg() return values */
#define	FAILURE		0
#define	CONTINUE	1
#define	SUCCESS		2
/*	TRANSLATE	3 */

#define	HDRSIZ	1024	/* maximum length of header line */

#define E_FLGE	1	/* flge error */
#define E_FLGE_OM 2	/* flgE error, mail present but already accessed */
#define	E_REMOTE 1	/* unknown remote */
#define E_FILE	2	/* file error */
#define E_SPACE	3	/* no space */
#define E_FRWD	4	/* cannot forward */
#define E_SYNTAX 5      /* syntax error */
#define E_FRWL	6	/* forwarding loop */
#define E_SNDR  7	/* invalid sender */
#define E_USER  8	/* invalid user */
#define E_FROM  9	/* too many From lines */
#define E_PERM  10 	/* bad permissions */
#define E_MBOX  11 	/* mbox problem */
#define E_TMP	12 	/* temporary file problem */
#define E_DEAD  13 	/* Cannot create dead.letter */
#define E_UNBND 14 	/* Unbounded forwarding */
#define E_LOCK  15 	/* cannot create lock file */
#define E_GROUP	16	/* no group id of 'mail' */
#define	E_MEM	17	/* malloc failure */
#define E_FORK	18	/* could not fork */
#define	E_PIPE	19	/* could not pipe */
#define	E_OWNR	20	/* invoker does not own mailfile */
#define	E_DENY	21	/* permission denied by mailsurr file */
#define E_SURG	22	/* surrogate command failed - rc != 0 || 99 */

#define	H_AFWDCNT		1	/* "Auto-Forward-Count:"  */
#define	H_AFWDFROM		2	/* "Auto-Forwarded-From:" */
#define	H_CLEN			3	/* "Content-Length:"      */
#define	H_CTYPE			4	/* "Content-Type:"        */
#define	H_DATE			5	/* "Date:" 		  */
#define	H_DEFOPTS		6	/* "Default-Options:" 	  */
#define	H_EOH			7	/* "End-of-Header:" 	  */
#define	H_FROM			8	/* "From " 		  */
#define	H_FROM1			9	/* ">From " 		  */
#define	H_FROM2			10	/* "From: " 		  */
#define	H_MIMEVERS		11	/* "MIME-Version:"        */
#define	H_MTSID			12	/* "MTS-Message-ID:" 	  */
#define	H_MTYPE			13	/* "Message-Type:" 	  */
#define	H_MVERS			14	/* "Message-Version:" 	  */
#define	H_MSVC			15	/* "Message-Service:" 	  */
#define	H_RECEIVED		16	/* "Received:"	 	  */
#define	H_RVERS			17	/* "Report-Version:" 	  */
#define	H_SUBJ			18	/* "Subject:" 		  */
#define	H_TO			19	/* "To:" 		  */
#define	H_TCOPY			20	/* ">To:" 		  */
#define	H_TROPTS		21	/* "Transport-Options:"   */
#define	H_UAID			22	/* "UA-Content-ID:"	  */
#define	H_DAFWDFROM		23	/* Hold A-F-F when sending Del. Notf. */
#define	H_DTCOPY		24	/* Hold ">To:" when sending Del. Notf.*/
#define	H_DRECEIVED		25	/* Hold Rcvd: when sending Del. Notf.*/
#define	H_CONT			26	/* Continuation of previous line */
#define	H_NAMEVALUE		27	/* unrecognized "name: value" hdr line*/

/* MTA Transport Options */
#define	DELIVERY	001
#define	NODELIVERY	002
#define	REPORT		010
#define	RETURN		020
#define	IGNORE		040

/*
	copylet flags
*/
#define	REMOTE		1		/* remote mail, add rmtmsg */
#define ORDINARY	2
#define ZAP		3		/* zap header and trailing empty line */
#define FORWARD		4
#define TTY		5		/* suppress binary to tty */

#define	LSIZE		(2*BUFSIZ)	/* maximum size of a line */
#define	MAXLET		1000		/* maximum number of letters */
#define FROMLEVELS	20		/* maxium number of forwards */
#ifdef FILENAME_MAX
# define MAXFILENAME	FILENAME_MAX	/* max length of a filename */
#else
# define MAXFILENAME	512		/* max length of a filename */
#endif
#define DEADPERM	0600		/* permissions of dead.letter */

#ifndef	MFMODE
#define	MFMODE		0660		/* create mode for `/var/mail' files */
#endif

#define A_OK		0		/* return value for access */
#define A_EXECUTE	1
#define A_EXIST		0		/* access check for existence */
#define A_WRITE		2		/* access check for write permission */
#define A_READ		4		/* access check for read permission */

#  define MAILSURR "/etc/mail/mailsurr"
#  define MAILCNFG "/etc/mail/mailcnfg"

struct hdr {
	char	*tag;
	int	default_display;
};

struct hdrs {
	struct	hdrs	*next;
	struct	hdrs	*prev;
	struct	hdrs	*cont;	/* Continuation lines */
		char	value[HDRSIZ+1];
};

struct hdrlines {
	struct	hdrs	*head;
	struct	hdrs	*tail;
};

typedef struct recip {
	struct recip	*next;
	char		*name;
} recip;

typedef struct reciplist {
	recip *last_recip;
	recip recip_list;
} reciplist;

struct let {
	long	adr;		/* offset in mailfile of letter n */
	char	change;		/* disposition status of letter n */
	char	text;		/* 1 ==> text content, 0 ==> binary content.
				 * This is determined INDEPENDENTLY of what
				 * the Content-type, if present, says...
				 */
};

typedef enum t_surrtype
{
    t_eof, t_transport = '<',
    t_accept = 'a', t_deny = 'd',
    t_translate = 't', t_postprocess = '>'
} t_surrtype;

typedef struct t_surrfile
{
    /* originator's regular expression */
    string *orig_pattern;
    char *orig_regex;
    int orig_reglen;
    int orig_nbra;

    /* recipient's regular expression */
    string *recip_pattern;
    char *recip_regex;
    int recip_reglen;
    int recip_nbra;

    /* the type of the command string */
    t_surrtype surr_type;

    int batchsize;	/* transport	translate	postprocess */
    char *statlist;	/* transport				    */
    string *cmd_left;	/* transport	translate	postprocess */
    string *cmd_right;	/* transport	translate	postprocess */
    int fullyresolved;	/*		translate		    */
} t_surrfile;

#include <stdlib.h>
#include <unistd.h>

extern	void	Dout(char *subname, int level, char *fmt, ...);
extern	void	Tout(char *subname, char *msg, ...);
extern	int	add_recip(reciplist *plist, char *name, int checkdups);
extern	char	*altcompile(const char *instring, char *expbuf, char *endbuf);
extern	int	areforwarding(char *mailfile);
extern	void	cat(char*, char*, char*);
extern	int	ckdlivopts(int tcopy_hdr, int *svopts);
extern	void	cksaved(char *user);
extern	int	cksurg_rc(int surr_num, int rc);
extern	void	clr_hinfo(void);
extern	void	clrhdr(int hdrtype);
extern	void	cmdexpand(int letnum, string *instr, string *outstr, char **lbraslist, char **lbraelist);
extern	void	copyback(void);
extern	int	copylet(int letnum, FILE *f, int type);
extern	void	copymt(FILE *f1, FILE *f2);
extern	void	createmf(uid_t uid, char *file);
extern	void	del_reciplist (reciplist *list);
extern	void	delete(int);
extern	void	doFopt(void);
extern	void	done(int) __NORETURN;
extern	void	sig_done(int);
extern	FILE	*doopen(char *file, char *type, int errnum);
extern	int	dowait(pid_t pidval);
extern	void	dumpaff(int type, int htype, int *didafflines, int *suppress, FILE *f);
extern	void	dumprcv(int type, int htype, int *didrcvlines, int *suppress, FILE *f);
extern	void	errmsg(int error_value, char *error_message);
extern	int	findSurg(int letnum, string *execbuf, int flag, int *psurr_num, int *paccept, string *lorig, string *lrecipname);
extern	void	gendeliv(FILE *fp, int rc, char *name);
extern	int	getcomment(char *s, char *q);
extern	int	gethead(int	current, int all);
extern	int	getline(char *ptr2line, int max, FILE *f);
extern	int	getnumbr(char *s);
extern	int	getsurr(FILE *fp, string *buf, int firstfield);
extern	void	goback(int letnum);
extern	int	init(void);
extern	void	initsurrfile(void);
extern	int	isheader(char *lp, int *ctfp);
extern	int	isit(char *lp, int type);
extern	int	islocal(char *user, uid_t *puid);
extern	int	istext(unsigned char *s, int size);
extern	int	legal(char *file);
extern	void	lock(char	*user);
extern	void	madd_recip(reciplist *plist, char *name, int checkdups);
extern	char	*mailcompile(string *pattern, int *retlen, int *retnbra);
extern	void	mkdead(void);
extern	void	mktmp(void);
extern	void	mta_ercode(FILE *outfile);
extern	void	new_reciplist (reciplist *list);
extern	int	notme(char *fto, char *myname);
extern	int	parse(int argc, char **argv);
extern	int	pckaffspot(void);
extern	int	pckrcvspot(void);
extern	void	pickFrom(char *lineptr);
extern	int	pipletr(int letter, char *command, int cltype);
extern	void	poplist (int hdrtype, int where);
extern	int	printhdr (int type, int hdrtype, struct hdrs *hptr, FILE *fp);
extern	void	printmail(void);
extern	void	pushlist(int hdrtype, int where, char *s, int contflg);
extern	void	savdead(void);
extern	void	savehdrs(char *s, int hdrtype);
extern	int	sel_disp (int type, int hdrtype, char *s);
extern	int	sendlist(reciplist *list, int letnum, int level);
extern	void	sendmail(int argc, char **argv);
extern	int	sendsurg(reciplist *plist, int  letnum, int flag, int local);
extern	void	setletr(int letter, int status);
extern	void	(*setsig(int i, void(*f)()))();
extern	void	setsurg_bt(string *st, int *pbatchsize, int *presolved);
extern	char	*setsurg_rc(string *st, int defreal, int *pbatchsize);
extern	char	**setup_exec(char*);
extern	void	stamp(void);
extern	int	systm(char *s);
extern	void	tmperr(void);
extern	string	*tokdef(string *fld, string *tok, char *name);
extern	int	translate(reciplist *plist, char *cmdstr, char *origname);
extern	void	unlock(void);
extern	int	validmsg(int);
extern	int	wtmpf(char *str, int length);

extern	int	ac;		/* argument list count */
extern	char	**av;		/* argument list */
extern	int	affbytecnt;     /* Total bytes of Auto-Fwd. info in msg. */
extern	int	affcnt;		/* Number of Auto-Fwd.-From: lines in msg. */
extern	int	Daffbytecnt;    /* Hold affbytecnt when sending Deliv. Notif. */
extern	int	Daffcnt;	/* Hold affcnt when sending Deliv. Notif. */
extern	char	binmsg[];
extern	int	changed;	/* > 0 says mailfile has changed */
extern	char	datestring[60];
extern	char	dbgfname[20];	/* name of file for debugging output */
extern	FILE	*dbgfp;		/* FILE* for debugging output */
extern	char	dead[];		/* name of dead.letter */
extern	int	debug;		/* Controls debugging level. 0 ==> no debugging */
extern	int	delflg;
extern	int	dflag;		/* 1 says returning unsendable mail */
extern	char	*errlist[];
extern	int	error;		/* Local value for error */
extern	char	*failsafe;	/* $FAILSAFE */
extern	int	file_size;
extern	int	flge;		/* 1 ==> 'e' option specified */
extern  int     flgE;		/* 1 ==> 'E' option specified */
extern	int	flgF;		/* 1 ==> Installing/Removing  Forwarding */
extern	int	flgf;		/* 1 ==> 'f' option specified */
extern	int	flgh;		/* 1 ==> 'h' option specified */
extern	int	flgm;
extern	int	flgp;		/* 1 ==> 'p' option specified */
extern	int	flgP;		/* 1 ==> 'P' option specified */
extern	int	flgr;		/* 1 ==> 'r' option -- print in fifo order */
extern	int	flgt;		/* 1 ==> 't' option -- add To: line to letter */
extern	int	flgT;		/* 1 ==> 'T' option specified */
extern	int	flgw;		/* 1 ==> 'w' option specified */
extern	int	fnuhdrtype;	/* type of first non-UNIX header line */
extern	char	forwmsg[];	/* " forwarded by %s" */
extern	char	frwlmsg[];	/* "Forwarding loop detected in mailfile" */
extern	char	fromS[1024];	/* stored here by sendmail for sendsurg */
extern	char	fromU[1024];	/* stored here by sendmail for sendsurg */
extern	char	frwrd[];	/* forwarding sentinel */
extern	char	fwdFrom[1024];
extern	int	goerr;		/* counts parsing errors */
extern	struct	group *grpptr;	/* pointer to struct group */
extern	struct hdrlines hdrlines[H_CONT];
extern	struct hdr header[];	/* H_* #define's used to index into array */
extern	char	*help[];
extern	char	*hmbox;		/* pointer to $HOME/mbox */
extern	char	*hmdead;	/* pointer to $HOME/dead.letter */
extern	char	*home;		/* pointer to $HOME */
extern	time_t	iop;
extern	int	interactive;	/* 1 says user is interactive */
extern	int	ismail;		/* default to program=mail */
extern  int     deliverflag;     /* -d flag, bypass sendmail and go to mbox */
extern  int     fromflag;       /* -f from_user while sending */
extern	int	keepdbgfile;	/* does debug file get deleted at end? */
extern	struct let let[MAXLET];
extern	char	*lettmp;	/* pointer to tmp filename */
extern	char	lfil[MAXFILENAME];
extern	char	line[LSIZE];	/* holds a line of a letter in many places */
extern	char	*mailfile;	/* pointer to mailfile */
extern	char	mailcnfg[];	/* /etc/mail/mailcnfg */
extern	char	maildir[];	/* directory for mail files */
extern	gid_t	mailgrp;	/* numeric id of group 'mail' */
extern	char	mailsave[];	/* dir for save files */
extern	char	*mailsurr;	/* surrogate file name */
extern	FILE	*malf;		/* File pointer for mailfile */
extern	int	maxerr;		/* largest value of error */
extern	char	mbox[];		/* name for mbox */
extern	uid_t	mf_uid;		/* uid of user's mailfile */
extern	gid_t	mf_gid;		/* gid of user's mailfile */
extern	char	*msgtype;
extern	char	my_name[1024];	/* user's name who invoked this command */
extern	char	from_user[1024];/* name of user mail's from, used w/ -f */
extern	uid_t	my_euid;	/* user's euid */
extern	gid_t	my_egid;	/* user's egid */
extern	uid_t	my_uid;		/* user's uid */
extern	gid_t	my_gid;		/* user's gid */
extern	int	nlet;		/* current number of letters in mailfile */
extern	int	onlet;		/* number of letters in mailfile at startup*/
extern	int	optcnt;		/* Number of options specified */
extern	int	orig_aff;	/* orig. msg. contained H_AFWDFROM lines */
extern	int	orig_dbglvl;	/* argument to -x invocation option */
extern	int	orig_rcv;	/* orig. msg. contained H_RECEIVED lines */
extern	int	orig_tcopy;	/* orig. msg. contained H_TCOPY lines */
extern	struct	passwd *pwd;	/* holds passwd entry for this user */
extern	int	pflg;		/* binary message display override flag */
extern	int	Pflg;		/* Selective display flag; 1 ==> display all */
extern	char	*program;	/* program name */
extern	int	rcvbytecnt;     /* Total bytes of Received: info in msg. */
extern	int	Drcvbytecnt;    /* Hold rcvbytecnt when sending Del. Notif. */
extern	char	*recipname;	/* full recipient name/address */
extern	int	replying;	/* 1 says we are replying to a letter */
extern	char	RFC822datestring[60];/* Date in RFC822 date format */
extern	char	rmtmsg[];	/* "remote from %s" */
extern	char	Rpath[1024];	/* return path to sender of message */
extern	char	rtrnmsg[];	/* "UNDELIVERABLE MAIL being returned by %s" */
extern	int	sav_errno;
extern	char	savefile[MAXFILENAME];	/* holds filename of save file */
extern	void	(*saveint)(int);
extern	char	*seldisp[];
extern	int	sending;	/* TRUE==>sending mail; FALSE==>printing mail */
extern	char	m_sendto[1024];
extern	jmp_buf	sjbuf;
extern	int	surg_rc;	/* exit code of surrogate command */
extern	t_surrfile *surrfile;	/* the compiled surrogate file */
extern	int	surr_len;	/* # entries in surrogate file */
extern	char	*SURRcmdstr;	/* save in case of FAILURE */
extern	FILE	*SURRerrfile;	/* stderr from surrogate in case of failure */
extern	char	*thissys;	/* Holds name of the system we are on */
extern	FILE	*tmpf;		/* file pointer for temporary files */
extern	mode_t	umsave;
extern	struct	utsname utsn;
extern	struct utimbuf *utimep;
extern	char	uval[1024];

#ifdef NOTDEF
#ifdef sun
#define _NFILE getdtablesize()
#endif
#endif /* NOTDEF */

#endif /* _MAIL_H */