/* * CDDL HEADER START * * The contents of this file are subject to the terms of the * Common Development and Distribution License (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 2014 Joyent, Inc. */ /* * Copyright (c) 1985, 2010, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2016 by Delphix. All rights reserved. */ /* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */ /* All Rights Reserved */ /* * University Copyright- Copyright (c) 1982, 1986, 1988 * The Regents of the University of California * All Rights Reserved * * University Acknowledgment- Portions of this document are derived from * software developed by the University of California, Berkeley, and its * contributors. */ #ifndef _MAILX_DEF_H #define _MAILX_DEF_H #ifdef __cplusplus extern "C" { #endif #include #include #include #include #include #include #include #include #include #include #include #include #ifndef preSVr4 #include #include #include #include #include #endif #ifdef VMUNIX #include #endif #include "local.h" #include "uparm.h" /* * mailx -- a modified version of a University of California at Berkeley * mail program */ #define SENDESC '~' /* Default escape for sending */ #define NMLSIZE 1024 /* max names in a message list */ #define PATHSIZE 1024 /* Size of pathnames throughout */ #define HSHSIZE 59 /* Hash size for aliases and vars */ #define HDRFIELDS 3 /* Number of header fields */ #define LINESIZE 5120 /* max readable line width */ #define STRINGSIZE ((unsigned)128) /* Dynamic allocation units */ #define MAXARGC 1024 /* Maximum list of raw strings */ #define NOSTR ((char *)0) /* Nill string pointer */ #define NOSTRPTR ((char **)0) /* Nill pointer to string pointer */ #define NOINTPTR ((int *)0) /* Nill pointer */ #define MAXEXP 25 /* Maximum expansion of aliases */ /* A nice function to string compare */ #define equal(a, b) (strcmp(a, b) == 0) /* Keep a list of all opened files */ #define fopen(s, t) my_fopen(s, t) /* Delete closed file from the list */ #define fclose(s) my_fclose(s) struct message { off_t m_offset; /* offset in block of message */ long m_size; /* Bytes in the message */ long m_lines; /* Lines in the message */ long m_clen; /* Content-Length of the mesg */ short m_flag; /* flags, see below */ char m_text; /* TRUE if the contents is text */ /* False otherwise */ }; typedef struct fplst { FILE *fp; struct fplst *next; } NODE; /* * flag bits. */ #define MUSED (1<<0) /* entry is used, but this bit isn't */ #define MDELETED (1<<1) /* entry has been deleted */ #define MSAVED (1<<2) /* entry has been saved */ #define MTOUCH (1<<3) /* entry has been noticed */ #define MPRESERVE (1<<4) /* keep entry in sys mailbox */ #define MMARK (1<<5) /* message is marked! */ #define MODIFY (1<<6) /* message has been modified */ #define MNEW (1<<7) /* message has never been seen */ #define MREAD (1<<8) /* message has been read sometime. */ #define MSTATUS (1<<9) /* message status has changed */ #define MBOX (1<<10) /* Send this to mbox, regardless */ #define MBOXED (1<<11) /* message has been sent to mbox */ #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_MTSID 11 /* "MTS-Message-ID:" */ #define H_MTYPE 12 /* "Message-Type:" */ #define H_MVERS 13 /* "Message-Version:" */ #define H_MSVC 14 /* "Message-Service:" */ #define H_RECEIVED 15 /* "Received:" */ #define H_RVERS 16 /* "Report-Version:" */ #define H_STATUS 17 /* "Status:" */ #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 */ /* * Format of the command description table. * The actual table is declared and initialized * in lex.c */ struct cmd { char *c_name; /* Name of command */ int (*c_func)(void *); /* Implementor of the command */ short c_argtype; /* Type of arglist (see below) */ short c_msgflag; /* Required flags of messages */ short c_msgmask; /* Relevant flags of messages */ }; /* can't initialize unions */ #define c_minargs c_msgflag /* Minimum argcount for RAWLIST */ #define c_maxargs c_msgmask /* Max argcount for RAWLIST */ /* * Argument types. */ #define MSGLIST 0 /* Message list type */ #define STRLIST 1 /* A pure string */ #define RAWLIST 2 /* Shell string list */ #define NOLIST 3 /* Just plain 0 */ #define NDMLIST 4 /* Message list, no defaults */ #define P 040 /* Autoprint dot after command */ #define I 0100 /* Interactive command bit */ #define M 0200 /* Legal from send mode bit */ #define W 0400 /* Illegal when read only bit */ #define F 01000 /* Is a conditional command */ #define T 02000 /* Is a transparent command */ #define R 04000 /* Cannot be called from collect */ /* * Oft-used mask values */ #define MMNORM (MDELETED|MSAVED) /* Look at both save and delete bits */ #define MMNDEL MDELETED /* Look only at deleted bit */ /* * Structure used to return a break down of a head * line */ typedef struct headline { custr_t *hl_from; /* The name of the sender */ custr_t *hl_tty; /* Its tty string (if any) */ custr_t *hl_date; /* The entire date string */ } headline_t; #define GTO 1 /* Grab To: line */ #define GSUBJECT 2 /* Likewise, Subject: line */ #define GCC 4 /* And the Cc: line */ #define GBCC 8 /* And also the Bcc: line */ #define GDEFOPT 16 /* And the Default-Options: lines */ #define GNL 32 /* Print blank line after */ #define GOTHER 64 /* Other header lines */ #define GMASK (GTO|GSUBJECT|GCC|GBCC|GDEFOPT|GNL|GOTHER) /* Mask of all header lines */ #define GDEL 128 /* Entity removed from list */ #define GCLEN 256 /* Include Content-Length header */ /* * Structure used to pass about the current * state of the user-typed message header. */ struct header { char *h_to; /* Dynamic "To:" string */ char *h_subject; /* Subject string */ char *h_cc; /* Carbon copies string */ char *h_bcc; /* Blind carbon copies */ char *h_defopt; /* Default options */ char **h_others; /* Other header lines */ int h_seq; /* Sequence for optimization */ }; /* * Structure of namelist nodes used in processing * the recipients of mail and aliases and all that * kind of stuff. */ struct name { struct name *n_flink; /* Forward link in list. */ struct name *n_blink; /* Backward list link */ short n_type; /* From which list it came */ char *n_name; /* This fella's name */ char *n_full; /* Full name */ }; /* * Structure of a variable node. All variables are * kept on a singly-linked list of these, rooted by * "variables" */ struct var { struct var *v_link; /* Forward link to next variable */ char *v_name; /* The variable's name */ char *v_value; /* And it's current value */ }; struct mgroup { struct mgroup *ge_link; /* Next person in this group */ char *ge_name; /* This person's user name */ }; struct grouphead { struct grouphead *g_link; /* Next grouphead in list */ char *g_name; /* Name of this group */ struct mgroup *g_list; /* Users in group. */ }; #define NIL ((struct name *)0) /* The nil pointer for namelists */ #define NONE ((struct cmd *)0) /* The nil pointer to command tab */ #define NOVAR ((struct var *)0) /* The nil pointer to variables */ #define NOGRP ((struct grouphead *)0) /* The nil grouphead pointer */ #define NOGE ((struct mgroup *)0) /* The nil group pointer */ #define NOFP ((struct fplst *)0) /* The nil file pointer */ #define TRUE 1 #define FALSE 0 #define DEADPERM 0600 /* permissions of dead.letter */ #define TEMPPERM 0600 /* permissions of temp files */ #define MBOXPERM 0600 /* permissions of ~/mbox */ #ifndef MFMODE #define MFMODE 0600 /* create mode for `/var/mail' files */ #endif /* * Structure of the hash table of ignored header fields */ struct ignore { struct ignore *i_link; /* Next ignored field in bucket */ char *i_field; /* This ignored field */ }; #ifdef preSVr4 struct utimbuf { time_t actime; time_t modtime; }; #else #include #endif /* * Token values returned by the scanner used for argument lists. * Also, sizes of scanner-related things. */ #define TEOL 0 /* End of the command line */ #define TNUMBER 1 /* A message number */ #define TDASH 2 /* A simple dash */ #define TSTRING 3 /* A string (possibly containing -) */ #define TDOT 4 /* A "." */ #define TUP 5 /* An "^" */ #define TDOLLAR 6 /* A "$" */ #define TSTAR 7 /* A "*" */ #define TOPEN 8 /* An '(' */ #define TCLOSE 9 /* A ')' */ #define TPLUS 10 /* A '+' */ #define REGDEP 2 /* Maximum regret depth. */ #define STRINGLEN 1024 /* Maximum length of string token */ /* * Constants for conditional commands. These describe whether * we should be executing stuff or not. */ #define CANY 0 /* Execute in send or receive mode */ #define CRCV 1 /* Execute in receive mode only */ #define CSEND 2 /* Execute in send mode only */ #define CTTY 3 /* Execute if attached to a tty only */ #define CNOTTY 4 /* Execute if not attached to a tty */ /* * Flags for msend(). */ #define M_IGNORE 1 /* Do "ignore/retain" processing */ #define M_SAVING 2 /* Saving to a file/folder */ /* * VM/UNIX has a vfork system call which is faster than forking. If we * don't have it, fork(2) will do . . . */ #if !defined(VMUNIX) && defined(preSVr4) #define vfork() fork() #endif #ifndef SIGRETRO #define sigchild() #endif /* * 4.2bsd signal interface help... */ #ifdef VMUNIX #define sigset(s, a) signal(s, a) #define sigsys(s, a) signal(s, a) #else #ifndef preSVr4 /* SVr4 version of sigset() in fio.c */ #define sigsys(s, a) signal(s, a) #define setjmp(x) sigsetjmp((x), 1) #define longjmp siglongjmp #define jmp_buf sigjmp_buf #else #define OLD_BSD_SIGS #endif #endif /* * Truncate a file to the last character written. This is * useful just before closing an old file that was opened * for read/write. */ #define trunc(stream) ftruncate(fileno(stream), (long)ftell(stream)) /* * The pointers for the string allocation routines, * there are NSPACE independent areas. * The first holds STRINGSIZE bytes, the next * twice as much, and so on. */ #define NSPACE 25 /* Total number of string spaces */ struct strings { char *s_topFree; /* Beginning of this area */ char *s_nextFree; /* Next alloctable place here */ unsigned s_nleft; /* Number of bytes left here */ }; /* The following typedefs must be used in SVR4 */ #ifdef preSVr4 #ifndef sun typedef int gid_t; typedef int uid_t; typedef int mode_t; typedef int pid_t; #endif #endif #define STSIZ 40 #define TMPSIZ 14 /* * Forward declarations of routine types to keep lint and cc happy. */ extern int Copy(int *msgvec); extern FILE *Fdopen(int fildes, char *mode); extern int Followup(int *msgvec); extern char *Getf(register char *s); extern int More(int *msgvec); extern int Respond(int *msgvec); extern int Save(int *msgvec); extern int Sendm(char *str); extern int Sput(char str[]); extern int Type(int *msgvec); extern void Verhogen(void); extern char *addone(char hf[], char news[]); extern char *addto(char hf[], char news[]); extern void alter(char name[]); extern int alternates(char **namelist); extern void announce(void); extern int any(int ch, char *str); extern int anyof(register char *s1, register char *s2); extern int argcount(char **argv); extern void assign(char name[], char value[]); extern int blankline(const char linebuf[]); extern struct name *cat(struct name *n1, struct name *n2); extern FILE *collect(struct header *hp); extern void commands(void); extern char *copy(char *str1, char *str2); extern int copycmd(char str[]); extern int deassign(register char *s); extern int delm(int *msgvec); extern struct name *delname(register struct name *np, char name[]); extern int deltype(int msgvec[]); extern char *detract(register struct name *np, int ntype); extern int docomma(char *s); extern int dopipe(char str[]); extern int dosh(char *str); extern int echo(register char **argv); extern int editor(int *msgvec); extern int edstop(int noremove); extern struct name *elide(struct name *names); extern int elsecmd(void); extern int endifcmd(void); extern int execute(char linebuf[], int contxt); extern char *expand(char *name); extern struct name *extract(char line[], int arg_ntype); extern int fferror(FILE *iob); extern int field(char str[]); extern int file(char **argv); extern struct grouphead *findgroup(char name[]); extern void findmail(char *name); extern int first(int f, int m); extern void flush(void); extern int folders(char **arglist); extern int followup(int *msgvec); extern int from(int *msgvec); extern off_t fsize(FILE *iob); extern int getfold(char *name); extern int gethfield(register FILE *f, char linebuf[], register long rem); extern int getaline(char *line, int size, FILE *f, int *hasnulls); extern int getmessage(char *buf, int *vector, int flags); extern int getmsglist(char *buf, int *vector, int flags); extern int getname(uid_t uid, char namebuf[]); extern int getrawlist(char line[], char **argv, int argc); extern void getrecf(char *buf, char *recfile, int useauthor, int sz_recfile); extern uid_t getuserid(char name[]); extern int grabh(register struct header *hp, int gflags, int subjtop); extern int group(char **argv); extern void hangup(int); extern int hash(char name[]); extern char *hcontents(char hfield[]); extern int headerp(register char *line); extern int headers(int *msgvec); extern int headline_alloc(headline_t **); extern void headline_free(headline_t *); extern void headline_reset(headline_t *); extern int help(void); extern char *helppath(char *file); extern char *hfield(char field[], struct message *mp, char *(*add)(char *, char *)); extern void holdsigs(void); extern int icequal(register char *s1, register char *s2); extern int ifcmd(char **argv); extern int igfield(char *list[]); extern int inc(void); extern void inithost(void); extern int isdir(char name[]); extern boolean_t is_headline(const char *); extern int ishfield(char linebuf[], char field[]); extern int ishost(char *sys, char *rest); extern int isign(char *field, int saving); extern void istrcpy(char *dest, int dstsize, char *src); extern void lcwrite(char *fn, FILE *fi, FILE *fo, int addnl); extern void load(char *name); extern int loadmsg(char str[]); extern int lock(FILE *fp, char *mode, int blk); extern void lockmail(void); extern int mail(char **people); extern void mail1(struct header *hp, int use_to, char *orig_to); extern void mapf(register struct name *np, char *from); extern int mboxit(int msgvec[]); extern void mechk(struct name *names); extern int member(register char *realfield, register struct ignore **table); extern int messize(int *msgvec); extern void minit(void); extern int more(int *msgvec); extern long msend(struct message *mailp, FILE *obuf, int flag, int (*fp)(const char *, FILE *)); extern int my_fclose(register FILE *iop); extern FILE *my_fopen(char *file, char *mode); extern char *nameof(register struct message *mp); extern char *netmap(char name[], char from[]); extern int newfileinfo(int start); extern int next(int *msgvec); extern int npclose(FILE *ptr); extern FILE *npopen(char *cmd, char *mode); extern char *nstrcpy(char *dst, int dstsize, char *src); extern char *nstrcat(char *dst, int dstsize, char *src); extern int null(char *e); extern int outof(struct name *names, FILE *fo); extern struct name *outpre(struct name *to); extern void panic(char *str); extern int parse_headline(const char *, headline_t *); extern int pcmdlist(void); extern int pdot(void); extern int preserve(int *msgvec); extern void printgroup(char name[]); extern void printhead(int mesg); extern int puthead(struct header *hp, FILE *fo, int w, long clen); extern int pversion(char *e); extern void quit(int noremove); extern int readline(FILE *ibuf, char *linebuf); extern void receipt(struct message *mp); extern void relsesigs(void); extern int removefile(char name[]); extern int replyall(int *msgvec); extern int replysender(int *msgvec); extern int respond(int *msgvec); extern int retfield(char *list[]); extern int rexit(int e); extern char *safeexpand(char name[]); extern void *salloc(unsigned size); extern void *srealloc(void *optr, unsigned size); extern int samebody(register char *user, register char *addr, int fuzzy); extern int save(char str[]); extern void savedead(int s); extern char *savestr(char *str); extern int schdir(char *str); extern int screensize(void); extern int scroll(char arg[]); extern int sendm(char *str); extern int set(char **arglist); extern void setclen(register struct message *mp); extern int setfile(char *name, int isedit); extern FILE *setinput(register struct message *mp); extern void setptr(register FILE *ibuf); extern int shell(char *str); #ifndef sigchild extern void sigchild(void); #endif #ifndef sigset extern void (*sigset())(); #endif extern char *skin(char *name); extern char *snarf(char linebuf[], int *flag, int erf); extern int source(char name[]); extern char *splice(char *addr, char *hdr); extern int sput(char str[]); extern void sreset(void); extern void stop(int s); extern int stouch(int msgvec[]); extern int substr(char *string1, char *string2); extern int swrite(char str[]); extern struct name *tailof(struct name *name); extern void tinit(void); extern int tmail(void); extern int top(int *msgvec); extern void touch(int mesg); extern struct name *translate(struct name *np); extern int type(int *msgvec); extern int undelete(int *msgvec); extern int ungroup(char **argv); extern int unigfield(char *list[]); extern void unlockmail(void); extern char **unpack(struct name *np); extern int unread(int msgvec[]); extern int unretfield(char *list[]); extern int unset(char **arglist); extern int unstack(void); extern char *unuucp(char *name); extern struct name *usermap(struct name *names); extern char *value(char name[]); extern char *vcopy(char str[]); extern void vfree(register char *cp); extern int visual(int *msgvec); extern char *yankword(char *name, char *word, int sz, int comma); /* * These functions are defined in libmail.a */ #ifdef __cplusplus extern "C" { #endif extern int delempty(mode_t, char *); extern char *maildomain(void); extern void touchlock(void); extern char *xgetenv(char *); extern int xsetenv(char *); #ifdef __cplusplus } #endif /* * Standard functions from the C library. * These are all defined in and in SVr4. */ #ifdef preSVr4 extern long atol(); extern char *getcwd(); extern char *calloc(); extern char *getenv(); extern void exit(); extern void free(); extern char *malloc(); extern time_t time(); extern long ulimit(); extern int utime(); extern int wait(); extern int fputs(); #endif #ifdef __cplusplus } #endif #endif /* _MAILX_DEF_H */