4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
23 * Copyright (c) 1989, 2010, Oracle and/or its affiliates. All rights reserved.
26 /* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
27 /* All Rights Reserved */
33 * All global externs defined here. All variables are initialized
36 * !!!!!IF YOU CHANGE (OR ADD) IT HERE, DO IT THERE ALSO !!!!!!!!
43 #include <sys/types.h>
49 /* The following is a kludge to allow for inconsistent header files in SVR4 */
54 #include <sys/utsname.h>
67 /* The following typedefs must be used in SVR4 */
81 # define PIPER "/usr/lib/mail/mail_pipe"
83 #define SENDMAIL "/usr/lib/sendmail"
97 /* findSurg() return values */
100 #define POSTDELIVER 1
104 /* sendsurg() return values */
110 #define HDRSIZ 1024 /* maximum length of header line */
112 #define E_FLGE 1 /* flge error */
113 #define E_FLGE_OM 2 /* flgE error, mail present but already accessed */
114 #define E_REMOTE 1 /* unknown remote */
115 #define E_FILE 2 /* file error */
116 #define E_SPACE 3 /* no space */
117 #define E_FRWD 4 /* cannot forward */
118 #define E_SYNTAX 5 /* syntax error */
119 #define E_FRWL 6 /* forwarding loop */
120 #define E_SNDR 7 /* invalid sender */
121 #define E_USER 8 /* invalid user */
122 #define E_FROM 9 /* too many From lines */
123 #define E_PERM 10 /* bad permissions */
124 #define E_MBOX 11 /* mbox problem */
125 #define E_TMP 12 /* temporary file problem */
126 #define E_DEAD 13 /* Cannot create dead.letter */
127 #define E_UNBND 14 /* Unbounded forwarding */
128 #define E_LOCK 15 /* cannot create lock file */
129 #define E_GROUP 16 /* no group id of 'mail' */
130 #define E_MEM 17 /* malloc failure */
131 #define E_FORK 18 /* could not fork */
132 #define E_PIPE 19 /* could not pipe */
133 #define E_OWNR 20 /* invoker does not own mailfile */
134 #define E_DENY 21 /* permission denied by mailsurr file */
135 #define E_SURG 22 /* surrogate command failed - rc != 0 || 99 */
137 #define H_AFWDCNT 1 /* "Auto-Forward-Count:" */
138 #define H_AFWDFROM 2 /* "Auto-Forwarded-From:" */
139 #define H_CLEN 3 /* "Content-Length:" */
140 #define H_CTYPE 4 /* "Content-Type:" */
141 #define H_DATE 5 /* "Date:" */
142 #define H_DEFOPTS 6 /* "Default-Options:" */
143 #define H_EOH 7 /* "End-of-Header:" */
144 #define H_FROM 8 /* "From " */
145 #define H_FROM1 9 /* ">From " */
146 #define H_FROM2 10 /* "From: " */
147 #define H_MIMEVERS 11 /* "MIME-Version:" */
148 #define H_MTSID 12 /* "MTS-Message-ID:" */
149 #define H_MTYPE 13 /* "Message-Type:" */
150 #define H_MVERS 14 /* "Message-Version:" */
151 #define H_MSVC 15 /* "Message-Service:" */
152 #define H_RECEIVED 16 /* "Received:" */
153 #define H_RVERS 17 /* "Report-Version:" */
154 #define H_SUBJ 18 /* "Subject:" */
155 #define H_TO 19 /* "To:" */
156 #define H_TCOPY 20 /* ">To:" */
157 #define H_TROPTS 21 /* "Transport-Options:" */
158 #define H_UAID 22 /* "UA-Content-ID:" */
159 #define H_DAFWDFROM 23 /* Hold A-F-F when sending Del. Notf. */
160 #define H_DTCOPY 24 /* Hold ">To:" when sending Del. Notf.*/
161 #define H_DRECEIVED 25 /* Hold Rcvd: when sending Del. Notf.*/
162 #define H_CONT 26 /* Continuation of previous line */
163 #define H_NAMEVALUE 27 /* unrecognized "name: value" hdr line*/
165 /* MTA Transport Options */
167 #define NODELIVERY 002
175 #define REMOTE 1 /* remote mail, add rmtmsg */
177 #define ZAP 3 /* zap header and trailing empty line */
179 #define TTY 5 /* suppress binary to tty */
181 #define LSIZE (2*BUFSIZ) /* maximum size of a line */
182 #define MAXLET 1000 /* maximum number of letters */
183 #define FROMLEVELS 20 /* maxium number of forwards */
185 # define MAXFILENAME FILENAME_MAX /* max length of a filename */
187 # define MAXFILENAME 512 /* max length of a filename */
189 #define DEADPERM 0600 /* permissions of dead.letter */
192 #define MFMODE 0660 /* create mode for `/var/mail' files */
195 #define A_OK 0 /* return value for access */
197 #define A_EXIST 0 /* access check for existence */
198 #define A_WRITE 2 /* access check for write permission */
199 #define A_READ 4 /* access check for read permission */
201 # define MAILSURR "/etc/mail/mailsurr"
202 # define MAILCNFG "/etc/mail/mailcnfg"
212 struct hdrs
*cont
; /* Continuation lines */
213 char value
[HDRSIZ
+1];
221 typedef struct recip
{
226 typedef struct reciplist
{
232 long adr
; /* offset in mailfile of letter n */
233 char change
; /* disposition status of letter n */
234 char text
; /* 1 ==> text content, 0 ==> binary content.
235 * This is determined INDEPENDENTLY of what
236 * the Content-type, if present, says...
240 typedef enum t_surrtype
242 t_eof
, t_transport
= '<',
243 t_accept
= 'a', t_deny
= 'd',
244 t_translate
= 't', t_postprocess
= '>'
247 typedef struct t_surrfile
249 /* originator's regular expression */
250 string
*orig_pattern
;
255 /* recipient's regular expression */
256 string
*recip_pattern
;
261 /* the type of the command string */
262 t_surrtype surr_type
;
264 int batchsize
; /* transport translate postprocess */
265 char *statlist
; /* transport */
266 string
*cmd_left
; /* transport translate postprocess */
267 string
*cmd_right
; /* transport translate postprocess */
268 int fullyresolved
; /* translate */
274 extern void Dout(char *subname
, int level
, char *fmt
, ...);
275 extern void Tout(char *subname
, char *msg
, ...);
276 extern int add_recip(reciplist
*plist
, char *name
, int checkdups
);
277 extern char *altcompile(const char *instring
, char *expbuf
, char *endbuf
);
278 extern int areforwarding(char *mailfile
);
279 extern void cat(char*, char*, char*);
280 extern int ckdlivopts(int tcopy_hdr
, int *svopts
);
281 extern void cksaved(char *user
);
282 extern int cksurg_rc(int surr_num
, int rc
);
283 extern void clr_hinfo(void);
284 extern void clrhdr(int hdrtype
);
285 extern void cmdexpand(int letnum
, string
*instr
, string
*outstr
, char **lbraslist
, char **lbraelist
);
286 extern void copyback(void);
287 extern int copylet(int letnum
, FILE *f
, int type
);
288 extern void copymt(FILE *f1
, FILE *f2
);
289 extern void createmf(uid_t uid
, char *file
);
290 extern void del_reciplist (reciplist
*list
);
291 extern void delete(int);
292 extern void doFopt(void);
293 extern void done(int) __NORETURN
;
294 extern void sig_done(int);
295 extern FILE *doopen(char *file
, char *type
, int errnum
);
296 extern int dowait(pid_t pidval
);
297 extern void dumpaff(int type
, int htype
, int *didafflines
, int *suppress
, FILE *f
);
298 extern void dumprcv(int type
, int htype
, int *didrcvlines
, int *suppress
, FILE *f
);
299 extern void errmsg(int error_value
, char *error_message
);
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 int getcomment(char *s
, char *q
);
303 extern int gethead(int current
, int all
);
304 extern int getaline(char *ptr2line
, int max
, FILE *f
);
305 extern int getnumbr(char *s
);
306 extern int getsurr(FILE *fp
, string
*buf
, int firstfield
);
307 extern void goback(int letnum
);
308 extern int init(void);
309 extern void initsurrfile(void);
310 extern int isheader(char *lp
, int *ctfp
);
311 extern int isit(char *lp
, int type
);
312 extern int islocal(char *user
, uid_t
*puid
);
313 extern int istext(unsigned char *s
, int size
);
314 extern int legal(char *file
);
315 extern void lock(char *user
);
316 extern void madd_recip(reciplist
*plist
, char *name
, int checkdups
);
317 extern char *mailcompile(string
*pattern
, int *retlen
, int *retnbra
);
318 extern void mkdead(void);
319 extern void mktmp(void);
320 extern void mta_ercode(FILE *outfile
);
321 extern void new_reciplist (reciplist
*list
);
322 extern int notme(char *fto
, char *myname
);
323 extern int parse(int argc
, char **argv
);
324 extern int pckaffspot(void);
325 extern int pckrcvspot(void);
326 extern void pickFrom(char *lineptr
);
327 extern int pipletr(int letter
, char *command
, int cltype
);
328 extern void poplist (int hdrtype
, int where
);
329 extern int printhdr (int type
, int hdrtype
, struct hdrs
*hptr
, FILE *fp
);
330 extern void printmail(void);
331 extern void pushlist(int hdrtype
, int where
, char *s
, int contflg
);
332 extern void savdead(void);
333 extern void savehdrs(char *s
, int hdrtype
);
334 extern int sel_disp (int type
, int hdrtype
, char *s
);
335 extern int sendlist(reciplist
*list
, int letnum
, int level
);
336 extern void sendmail(int argc
, char **argv
);
337 extern int sendsurg(reciplist
*plist
, int letnum
, int flag
, int local
);
338 extern void setletr(int letter
, int status
);
339 extern void (*setsig(int i
, void(*f
)()))();
340 extern void setsurg_bt(string
*st
, int *pbatchsize
, int *presolved
);
341 extern char *setsurg_rc(string
*st
, int defreal
, int *pbatchsize
);
342 extern char **setup_exec(char*);
343 extern void stamp(void);
344 extern int systm(char *s
);
345 extern void tmperr(void);
346 extern string
*tokdef(string
*fld
, string
*tok
, char *name
);
347 extern int translate(reciplist
*plist
, char *cmdstr
, char *origname
);
348 extern void unlock(void);
349 extern int validmsg(int);
350 extern int wtmpf(char *str
, int length
);
352 extern int ac
; /* argument list count */
353 extern char **av
; /* argument list */
354 extern int affbytecnt
; /* Total bytes of Auto-Fwd. info in msg. */
355 extern int affcnt
; /* Number of Auto-Fwd.-From: lines in msg. */
356 extern int Daffbytecnt
; /* Hold affbytecnt when sending Deliv. Notif. */
357 extern int Daffcnt
; /* Hold affcnt when sending Deliv. Notif. */
358 extern char binmsg
[];
359 extern int changed
; /* > 0 says mailfile has changed */
360 extern char datestring
[60];
361 extern char dbgfname
[20]; /* name of file for debugging output */
362 extern FILE *dbgfp
; /* FILE* for debugging output */
363 extern char dead
[]; /* name of dead.letter */
364 extern int debug
; /* Controls debugging level. 0 ==> no debugging */
366 extern int dflag
; /* 1 says returning unsendable mail */
367 extern char *errlist
[];
368 extern int error
; /* Local value for error */
369 extern char *failsafe
; /* $FAILSAFE */
370 extern int file_size
;
371 extern int flge
; /* 1 ==> 'e' option specified */
372 extern int flgE
; /* 1 ==> 'E' option specified */
373 extern int flgF
; /* 1 ==> Installing/Removing Forwarding */
374 extern int flgf
; /* 1 ==> 'f' option specified */
375 extern int flgh
; /* 1 ==> 'h' option specified */
377 extern int flgp
; /* 1 ==> 'p' option specified */
378 extern int flgP
; /* 1 ==> 'P' option specified */
379 extern int flgr
; /* 1 ==> 'r' option -- print in fifo order */
380 extern int flgt
; /* 1 ==> 't' option -- add To: line to letter */
381 extern int flgT
; /* 1 ==> 'T' option specified */
382 extern int flgw
; /* 1 ==> 'w' option specified */
383 extern int fnuhdrtype
; /* type of first non-UNIX header line */
384 extern char forwmsg
[]; /* " forwarded by %s" */
385 extern char frwlmsg
[]; /* "Forwarding loop detected in mailfile" */
386 extern char fromS
[1024]; /* stored here by sendmail for sendsurg */
387 extern char fromU
[1024]; /* stored here by sendmail for sendsurg */
388 extern char frwrd
[]; /* forwarding sentinel */
389 extern char fwdFrom
[1024];
390 extern int goerr
; /* counts parsing errors */
391 extern struct group
*grpptr
; /* pointer to struct group */
392 extern struct hdrlines hdrlines
[H_CONT
];
393 extern struct hdr header
[]; /* H_* #define's used to index into array */
395 extern char *hmbox
; /* pointer to $HOME/mbox */
396 extern char *hmdead
; /* pointer to $HOME/dead.letter */
397 extern char *home
; /* pointer to $HOME */
399 extern int interactive
; /* 1 says user is interactive */
400 extern int ismail
; /* default to program=mail */
401 extern int deliverflag
; /* -d flag, bypass sendmail and go to mbox */
402 extern int fromflag
; /* -f from_user while sending */
403 extern int keepdbgfile
; /* does debug file get deleted at end? */
404 extern struct let let
[MAXLET
];
405 extern char *lettmp
; /* pointer to tmp filename */
406 extern char lfil
[MAXFILENAME
];
407 extern char line
[LSIZE
]; /* holds a line of a letter in many places */
408 extern char *mailfile
; /* pointer to mailfile */
409 extern char mailcnfg
[]; /* /etc/mail/mailcnfg */
410 extern char maildir
[]; /* directory for mail files */
411 extern gid_t mailgrp
; /* numeric id of group 'mail' */
412 extern char mailsave
[]; /* dir for save files */
413 extern char *mailsurr
; /* surrogate file name */
414 extern FILE *malf
; /* File pointer for mailfile */
415 extern int maxerr
; /* largest value of error */
416 extern char mbox
[]; /* name for mbox */
417 extern uid_t mf_uid
; /* uid of user's mailfile */
418 extern gid_t mf_gid
; /* gid of user's mailfile */
419 extern char *msgtype
;
420 extern char my_name
[1024]; /* user's name who invoked this command */
421 extern char from_user
[1024];/* name of user mail's from, used w/ -f */
422 extern uid_t my_euid
; /* user's euid */
423 extern gid_t my_egid
; /* user's egid */
424 extern uid_t my_uid
; /* user's uid */
425 extern gid_t my_gid
; /* user's gid */
426 extern int nlet
; /* current number of letters in mailfile */
427 extern int onlet
; /* number of letters in mailfile at startup*/
428 extern int optcnt
; /* Number of options specified */
429 extern int orig_aff
; /* orig. msg. contained H_AFWDFROM lines */
430 extern int orig_dbglvl
; /* argument to -x invocation option */
431 extern int orig_rcv
; /* orig. msg. contained H_RECEIVED lines */
432 extern int orig_tcopy
; /* orig. msg. contained H_TCOPY lines */
433 extern struct passwd
*pwd
; /* holds passwd entry for this user */
434 extern int pflg
; /* binary message display override flag */
435 extern int Pflg
; /* Selective display flag; 1 ==> display all */
436 extern char *program
; /* program name */
437 extern int rcvbytecnt
; /* Total bytes of Received: info in msg. */
438 extern int Drcvbytecnt
; /* Hold rcvbytecnt when sending Del. Notif. */
439 extern char *recipname
; /* full recipient name/address */
440 extern int replying
; /* 1 says we are replying to a letter */
441 extern char RFC822datestring
[60];/* Date in RFC822 date format */
442 extern char rmtmsg
[]; /* "remote from %s" */
443 extern char Rpath
[1024]; /* return path to sender of message */
444 extern char rtrnmsg
[]; /* "UNDELIVERABLE MAIL being returned by %s" */
445 extern int sav_errno
;
446 extern char savefile
[MAXFILENAME
]; /* holds filename of save file */
447 extern void (*saveint
)(int);
448 extern char *seldisp
[];
449 extern int sending
; /* TRUE==>sending mail; FALSE==>printing mail */
450 extern char m_sendto
[1024];
451 extern jmp_buf sjbuf
;
452 extern int surg_rc
; /* exit code of surrogate command */
453 extern t_surrfile
*surrfile
; /* the compiled surrogate file */
454 extern int surr_len
; /* # entries in surrogate file */
455 extern char *SURRcmdstr
; /* save in case of FAILURE */
456 extern FILE *SURRerrfile
; /* stderr from surrogate in case of failure */
457 extern char *thissys
; /* Holds name of the system we are on */
458 extern FILE *tmpf
; /* file pointer for temporary files */
459 extern mode_t umsave
;
460 extern struct utsname utsn
;
461 extern struct utimbuf
*utimep
;
462 extern char uval
[1024];
466 #define _NFILE getdtablesize()