1 # 2 3 #include <sys/types.h> 4 #include <signal.h> 5 #include <stdio.h> 6 #include <sgtty.h> 7 #include "local.h" 8 9 #undef isalpha 10 #undef isdigit 11 12 /* 13 * Sccs Id = "@(#)def.h 2.12 06/15/83"; 14 */ 15 16 /* 17 * Mail -- a mail program 18 * 19 * Commands are: 20 * t <message list> print out these messages 21 * r <message list> reply to messages 22 * m <user list> mail to users (analogous to send) 23 * e <message list> edit messages 24 * c [directory] chdir to dir or home if none 25 * x exit quickly 26 * w <message list> file save messages in file 27 * q quit, save remaining stuff in mbox 28 * d <message list> delete messages 29 * u <message list> undelete messages 30 * h print message headers 31 * 32 * Author: Kurt Shoens (UCB) March 25, 1978 33 */ 34 35 36 #define ESCAPE '~' /* Default escape for sending */ 37 #define NMLSIZE 20 /* max names in a message list */ 38 #define PATHSIZE 100 /* Size of pathnames throughout */ 39 #define NAMESIZE 20 /* Max size of user name */ 40 #define HSHSIZE 19 /* Hash size for aliases and vars */ 41 #define HDRFIELDS 3 /* Number of header fields */ 42 #define LINESIZE BUFSIZ /* max readable line width */ 43 #define STRINGSIZE ((unsigned) 128)/* Dynamic allocation units */ 44 #define MAXARGC 20 /* Maximum list of raw strings */ 45 #define NOSTR ((char *) 0) /* Null string pointer */ 46 #define MAXEXP 25 /* Maximum expansion of aliases */ 47 #define equal(a, b) (strcmp(a,b)==0)/* A nice function to string compare */ 48 49 struct message { 50 short m_flag; /* flags, see below */ 51 short m_block; /* block number of this message */ 52 short m_offset; /* offset in block of message */ 53 long m_size; /* Bytes in the message */ 54 short m_lines; /* Lines in the message */ 55 }; 56 57 /* 58 * flag bits. 59 */ 60 61 #define MUSED (1<<0) /* entry is used, but this bit isn't */ 62 #define MDELETED (1<<1) /* entry has been deleted */ 63 #define MSAVED (1<<2) /* entry has been saved */ 64 #define MTOUCH (1<<3) /* entry has been noticed */ 65 #define MPRESERVE (1<<4) /* keep entry in sys mailbox */ 66 #define MMARK (1<<5) /* message is marked! */ 67 #define MODIFY (1<<6) /* message has been modified */ 68 #define MNEW (1<<7) /* message has never been seen */ 69 #define MREAD (1<<8) /* message has been read sometime. */ 70 #define MSTATUS (1<<9) /* message status has changed */ 71 #define MBOX (1<<10) /* Send this to mbox, regardless */ 72 73 /* 74 * Format of the command description table. 75 * The actual table is declared and initialized 76 * in lex.c 77 */ 78 79 struct cmd { 80 char *c_name; /* Name of command */ 81 int (*c_func)(); /* Implementor of the command */ 82 short c_argtype; /* Type of arglist (see below) */ 83 short c_msgflag; /* Required flags of messages */ 84 short c_msgmask; /* Relevant flags of messages */ 85 }; 86 87 /* Yechh, can't initialize unions */ 88 89 #define c_minargs c_msgflag /* Minimum argcount for RAWLIST */ 90 #define c_maxargs c_msgmask /* Max argcount for RAWLIST */ 91 92 /* 93 * Argument types. 94 */ 95 96 #define MSGLIST 0 /* Message list type */ 97 #define STRLIST 1 /* A pure string */ 98 #define RAWLIST 2 /* Shell string list */ 99 #define NOLIST 3 /* Just plain 0 */ 100 #define NDMLIST 4 /* Message list, no defaults */ 101 102 #define P 040 /* Autoprint dot after command */ 103 #define I 0100 /* Interactive command bit */ 104 #define M 0200 /* Legal from send mode bit */ 105 #define W 0400 /* Illegal when read only bit */ 106 #define F 01000 /* Is a conditional command */ 107 #define T 02000 /* Is a transparent command */ 108 #define R 04000 /* Cannot be called from collect */ 109 110 /* 111 * Oft-used mask values 112 */ 113 114 #define MMNORM (MDELETED|MSAVED)/* Look at both save and delete bits */ 115 #define MMNDEL MDELETED /* Look only at deleted bit */ 116 117 /* 118 * Structure used to return a break down of a head 119 * line (hats off to Bill Joy!) 120 */ 121 122 struct headline { 123 char *l_from; /* The name of the sender */ 124 char *l_tty; /* His tty string (if any) */ 125 char *l_date; /* The entire date string */ 126 }; 127 128 #define GTO 1 /* Grab To: line */ 129 #define GSUBJECT 2 /* Likewise, Subject: line */ 130 #define GCC 4 /* And the Cc: line */ 131 #define GBCC 8 /* And also the Bcc: line */ 132 #define GMASK (GTO|GSUBJECT|GCC|GBCC) 133 /* Mask of places from whence */ 134 135 #define GNL 16 /* Print blank line after */ 136 #define GDEL 32 /* Entity removed from list */ 137 #define GCOMMA 64 /* detract puts in commas */ 138 139 /* 140 * Structure used to pass about the current 141 * state of the user-typed message header. 142 */ 143 144 struct header { 145 char *h_to; /* Dynamic "To:" string */ 146 char *h_subject; /* Subject string */ 147 char *h_cc; /* Carbon copies string */ 148 char *h_bcc; /* Blind carbon copies */ 149 int h_seq; /* Sequence for optimization */ 150 }; 151 152 /* 153 * Structure of namelist nodes used in processing 154 * the recipients of mail and aliases and all that 155 * kind of stuff. 156 */ 157 158 struct name { 159 struct name *n_flink; /* Forward link in list. */ 160 struct name *n_blink; /* Backward list link */ 161 short n_type; /* From which list it came */ 162 char *n_name; /* This fella's name */ 163 }; 164 165 /* 166 * Structure of a variable node. All variables are 167 * kept on a singly-linked list of these, rooted by 168 * "variables" 169 */ 170 171 struct var { 172 struct var *v_link; /* Forward link to next variable */ 173 char *v_name; /* The variable's name */ 174 char *v_value; /* And it's current value */ 175 }; 176 177 struct group { 178 struct group *ge_link; /* Next person in this group */ 179 char *ge_name; /* This person's user name */ 180 }; 181 182 struct grouphead { 183 struct grouphead *g_link; /* Next grouphead in list */ 184 char *g_name; /* Name of this group */ 185 struct group *g_list; /* Users in group. */ 186 }; 187 188 #define NIL ((struct name *) 0) /* The nil pointer for namelists */ 189 #define NONE ((struct cmd *) 0) /* The nil pointer to command tab */ 190 #define NOVAR ((struct var *) 0) /* The nil pointer to variables */ 191 #define NOGRP ((struct grouphead *) 0)/* The nil grouphead pointer */ 192 #define NOGE ((struct group *) 0) /* The nil group pointer */ 193 194 /* 195 * Structure of the hash table of ignored header fields 196 */ 197 struct ignore { 198 struct ignore *i_link; /* Next ignored field in bucket */ 199 char *i_field; /* This ignored field */ 200 }; 201 202 /* 203 * Token values returned by the scanner used for argument lists. 204 * Also, sizes of scanner-related things. 205 */ 206 207 #define TEOL 0 /* End of the command line */ 208 #define TNUMBER 1 /* A message number */ 209 #define TDASH 2 /* A simple dash */ 210 #define TSTRING 3 /* A string (possibly containing -) */ 211 #define TDOT 4 /* A "." */ 212 #define TUP 5 /* An "^" */ 213 #define TDOLLAR 6 /* A "$" */ 214 #define TSTAR 7 /* A "*" */ 215 #define TOPEN 8 /* An '(' */ 216 #define TCLOSE 9 /* A ')' */ 217 #define TPLUS 10 /* A '+' */ 218 219 #define REGDEP 2 /* Maximum regret depth. */ 220 #define STRINGLEN 64 /* Maximum length of string token */ 221 222 /* 223 * Constants for conditional commands. These describe whether 224 * we should be executing stuff or not. 225 */ 226 227 #define CANY 0 /* Execute in send or receive mode */ 228 #define CRCV 1 /* Execute in receive mode only */ 229 #define CSEND 2 /* Execute in send mode only */ 230 231 /* 232 * Kludges to handle the change from setexit / reset to setjmp / longjmp 233 */ 234 235 #define setexit() setjmp(srbuf) 236 #define reset(x) longjmp(srbuf, x) 237 238 /* 239 * VM/UNIX has a vfork system call which is faster than forking. If we 240 * don't have it, fork(2) will do . . . 241 */ 242 243 #ifndef VMUNIX 244 #define vfork() fork() 245 #endif 246 #ifndef SIGRETRO 247 #define sigchild() 248 #endif 249 250 /* 251 * 4.2bsd signal interface help... 252 */ 253 #ifdef VMUNIX 254 #define sigset(s, a) signal(s, a) 255 #define mask(s) (1 << ((s) - 1)) 256 #define sigsys(s, a) signal(s, a) 257 #endif 258 259 /* 260 * Truncate a file to the last character written. This is 261 * useful just before closing an old file that was opened 262 * for read/write. 263 */ 264 #define trunc(stream) ftruncate(fileno(stream), (long) ftell(stream)) 265 266 /* 267 * Forward declarations of routine types to keep lint and cc happy. 268 */ 269 270 FILE *Fdopen(); 271 FILE *collect(); 272 FILE *infix(); 273 FILE *mesedit(); 274 FILE *mespipe(); 275 FILE *popen(); 276 FILE *setinput(); 277 char **unpack(); 278 char *addto(); 279 char *arpafix(); 280 char *calloc(); 281 char *copy(); 282 char *copyin(); 283 char *detract(); 284 char *expand(); 285 char *gets(); 286 char *hfield(); 287 char *index(); 288 char *name1(); 289 char *nameof(); 290 char *nextword(); 291 char *getenv(); 292 char *getfilename(); 293 char *hcontents(); 294 char *netmap(); 295 char *netname(); 296 char *readtty(); 297 char *reedit(); 298 char *rename(); 299 char *revarpa(); 300 char *rindex(); 301 char *rpair(); 302 char *salloc(); 303 char *savestr(); 304 char *skin(); 305 char *snarf(); 306 char *strcat(); 307 char *strcpy(); 308 char *value(); 309 char *vcopy(); 310 char *yankword(); 311 off_t fsize(); 312 #ifndef VMUNIX 313 int (*sigset())(); 314 #endif 315 struct cmd *lex(); 316 struct grouphead *findgroup(); 317 struct name *cat(); 318 struct name *delname(); 319 struct name *elide(); 320 struct name *extract(); 321 struct name *gexpand(); 322 struct name *map(); 323 struct name *outof(); 324 struct name *put(); 325 struct name *usermap(); 326 struct name *verify(); 327 struct var *lookup(); 328 long transmit(); 329 int icequal(); 330 int cmpdomain(); 331