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 6/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:  * Forward declarations of routine types to keep lint and cc happy.
 252:  */
 253: 
 254: FILE    *Fdopen();
 255: FILE    *collect();
 256: FILE    *infix();
 257: FILE    *mesedit();
 258: FILE    *mespipe();
 259: FILE    *popen();
 260: FILE    *setinput();
 261: char    **unpack();
 262: char    *addto();
 263: char    *arpafix();
 264: char    *calloc();
 265: char    *copy();
 266: char    *copyin();
 267: char    *detract();
 268: char    *expand();
 269: char    *gets();
 270: char    *hfield();
 271: char    *index();
 272: char    *name1();
 273: char    *nameof();
 274: char    *nextword();
 275: char    *getenv();
 276: char    *getfilename();
 277: char    *hcontents();
 278: char    *netmap();
 279: char    *netname();
 280: char    *readtty();
 281: char    *reedit();
 282: char    *rename();
 283: char    *revarpa();
 284: char    *rindex();
 285: char    *rpair();
 286: char    *salloc();
 287: char    *savestr();
 288: char    *skin();
 289: char    *snarf();
 290: char    *strcat();
 291: char    *strcpy();
 292: char    *value();
 293: char    *vcopy();
 294: char    *yankword();
 295: off_t   fsize();
 296: #ifdef  VMUNIX
 297: int (*sigset())();
 298: #endif
 299: struct  cmd *lex();
 300: struct  grouphead   *findgroup();
 301: struct  name    *cat();
 302: struct  name    *delname();
 303: struct  name    *elide();
 304: struct  name    *extract();
 305: struct  name    *gexpand();
 306: struct  name    *map();
 307: struct  name    *outof();
 308: struct  name    *put();
 309: struct  name    *usermap();
 310: struct  name    *verify();
 311: struct  var *lookup();
 312: long    transmit();
 313: int icequal();
 314: int cmpdomain();

Defined struct's

cmd defined in line 79; used 16 times
group defined in line 177; used 12 times
grouphead defined in line 182; used 20 times
header defined in line 144; used 24 times
headline defined in line 122; used 6 times
ignore defined in line 197; used 12 times
message defined in line 49; used 82 times
name defined in line 158; used 126 times
var defined in line 171; used 18 times

Defined macros

CANY defined in line 227; used 7 times
CRCV defined in line 228; used 3 times
CSEND defined in line 229; used 3 times
ESCAPE defined in line 36; used 1 times
F defined in line 106; used 5 times
GBCC defined in line 131; used 6 times
GCOMMA defined in line 137; used 4 times
GDEL defined in line 136; used 6 times
GMASK defined in line 132; used 2 times
GNL defined in line 135; used 6 times
HDRFIELDS defined in line 41; never used
HSHSIZE defined in line 40; used 7 times
I defined in line 103; used 11 times
M defined in line 104; used 32 times
MAXARGC defined in line 44; used 1 times
MAXEXP defined in line 46; used 2 times
MMARK defined in line 66; used 5 times
MMNDEL defined in line 115; used 19 times
MMNORM defined in line 114; used 6 times
MODIFY defined in line 67; used 3 times
MSGLIST defined in line 96; used 22 times
MSTATUS defined in line 70; used 6 times
MUSED defined in line 61; used 3 times
NAMESIZE defined in line 39; never used
NDMLIST defined in line 100; used 1 times
NIL defined in line 188; used 58 times
NMLSIZE defined in line 37; used 1 times
NOGE defined in line 192; used 4 times
NOGRP defined in line 191; used 8 times
NOLIST defined in line 99; used 11 times
NONE defined in line 189; used 2 times
NOSTR defined in line 45; used 212 times
NOVAR defined in line 190; used 7 times
P defined in line 102; used 4 times
PATHSIZE defined in line 38; used 5 times
R defined in line 108; used 7 times
RAWLIST defined in line 98; used 16 times
REGDEP defined in line 219; used 1 times
STRINGLEN defined in line 220; used 2 times
STRINGSIZE defined in line 43; used 4 times
STRLIST defined in line 97; used 9 times
T defined in line 107; used 5 times
TCLOSE defined in line 216; used 1 times
TDASH defined in line 209; used 2 times
TDOLLAR defined in line 213; used 1 times
TDOT defined in line 211; used 1 times
TEOL defined in line 207; used 2 times
TNUMBER defined in line 208; used 1 times
TOPEN defined in line 215; used 1 times
TPLUS defined in line 217; used 1 times
TSTAR defined in line 214; used 1 times
TSTRING defined in line 210; used 1 times
TUP defined in line 212; used 1 times
W defined in line 105; used 9 times
c_maxargs defined in line 90; used 2 times
c_minargs defined in line 89; used 2 times
reset defined in line 236; used 7 times
setexit defined in line 235; used 2 times

Usage of this include

Last modified: 1983-07-08
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 1518
Valid CSS Valid XHTML 1.0 Strict