Annotation of src/usr.bin/mail/def.h, Revision 1.1
1.1 ! deraadt 1: /*
! 2: * Copyright (c) 1980, 1993
! 3: * The Regents of the University of California. All rights reserved.
! 4: *
! 5: * Redistribution and use in source and binary forms, with or without
! 6: * modification, are permitted provided that the following conditions
! 7: * are met:
! 8: * 1. Redistributions of source code must retain the above copyright
! 9: * notice, this list of conditions and the following disclaimer.
! 10: * 2. Redistributions in binary form must reproduce the above copyright
! 11: * notice, this list of conditions and the following disclaimer in the
! 12: * documentation and/or other materials provided with the distribution.
! 13: * 3. All advertising materials mentioning features or use of this software
! 14: * must display the following acknowledgement:
! 15: * This product includes software developed by the University of
! 16: * California, Berkeley and its contributors.
! 17: * 4. Neither the name of the University nor the names of its contributors
! 18: * may be used to endorse or promote products derived from this software
! 19: * without specific prior written permission.
! 20: *
! 21: * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
! 22: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
! 23: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
! 24: * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
! 25: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
! 26: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
! 27: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
! 28: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
! 29: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
! 30: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
! 31: * SUCH DAMAGE.
! 32: *
! 33: * from: @(#)def.h 8.2 (Berkeley) 3/21/94
! 34: * $Id: def.h,v 1.7 1995/05/02 01:40:14 mycroft Exp $
! 35: */
! 36:
! 37: /*
! 38: * Mail -- a mail program
! 39: *
! 40: * Author: Kurt Shoens (UCB) March 25, 1978
! 41: */
! 42:
! 43: #include <sys/param.h>
! 44: #include <sys/stat.h>
! 45: #include <sys/time.h>
! 46:
! 47: #include <signal.h>
! 48: #include <termios.h>
! 49: #include <unistd.h>
! 50: #include <stdlib.h>
! 51: #include <stdio.h>
! 52: #include <ctype.h>
! 53: #include <string.h>
! 54: #include "pathnames.h"
! 55:
! 56: #define APPEND /* New mail goes to end of mailbox */
! 57:
! 58: #define ESCAPE '~' /* Default escape for sending */
! 59: #define NMLSIZE 1024 /* max names in a message list */
! 60: #define PATHSIZE MAXPATHLEN /* Size of pathnames throughout */
! 61: #define HSHSIZE 59 /* Hash size for aliases and vars */
! 62: #define LINESIZE BUFSIZ /* max readable line width */
! 63: #define STRINGSIZE ((unsigned) 128)/* Dynamic allocation units */
! 64: #define MAXARGC 1024 /* Maximum list of raw strings */
! 65: #define NOSTR ((char *) 0) /* Null string pointer */
! 66: #define MAXEXP 25 /* Maximum expansion of aliases */
! 67:
! 68: #define equal(a, b) (strcmp(a,b)==0)/* A nice function to string compare */
! 69:
! 70: struct message {
! 71: short m_flag; /* flags, see below */
! 72: short m_block; /* block number of this message */
! 73: short m_offset; /* offset in block of message */
! 74: long m_size; /* Bytes in the message */
! 75: short m_lines; /* Lines in the message */
! 76: };
! 77:
! 78: /*
! 79: * flag bits.
! 80: */
! 81:
! 82: #define MUSED (1<<0) /* entry is used, but this bit isn't */
! 83: #define MDELETED (1<<1) /* entry has been deleted */
! 84: #define MSAVED (1<<2) /* entry has been saved */
! 85: #define MTOUCH (1<<3) /* entry has been noticed */
! 86: #define MPRESERVE (1<<4) /* keep entry in sys mailbox */
! 87: #define MMARK (1<<5) /* message is marked! */
! 88: #define MODIFY (1<<6) /* message has been modified */
! 89: #define MNEW (1<<7) /* message has never been seen */
! 90: #define MREAD (1<<8) /* message has been read sometime. */
! 91: #define MSTATUS (1<<9) /* message status has changed */
! 92: #define MBOX (1<<10) /* Send this to mbox, regardless */
! 93:
! 94: /*
! 95: * Given a file address, determine the block number it represents.
! 96: */
! 97: #define blockof(off) ((int) ((off) / 4096))
! 98: #define offsetof(off) ((int) ((off) % 4096))
! 99: #define positionof(block, offset) ((off_t)(block) * 4096 + (offset))
! 100:
! 101: /*
! 102: * Format of the command description table.
! 103: * The actual table is declared and initialized
! 104: * in lex.c
! 105: */
! 106: struct cmd {
! 107: char *c_name; /* Name of command */
! 108: int (*c_func)(); /* Implementor of the command */
! 109: short c_argtype; /* Type of arglist (see below) */
! 110: short c_msgflag; /* Required flags of messages */
! 111: short c_msgmask; /* Relevant flags of messages */
! 112: };
! 113:
! 114: /* Yechh, can't initialize unions */
! 115:
! 116: #define c_minargs c_msgflag /* Minimum argcount for RAWLIST */
! 117: #define c_maxargs c_msgmask /* Max argcount for RAWLIST */
! 118:
! 119: /*
! 120: * Argument types.
! 121: */
! 122:
! 123: #define MSGLIST 0 /* Message list type */
! 124: #define STRLIST 1 /* A pure string */
! 125: #define RAWLIST 2 /* Shell string list */
! 126: #define NOLIST 3 /* Just plain 0 */
! 127: #define NDMLIST 4 /* Message list, no defaults */
! 128:
! 129: #define P 040 /* Autoprint dot after command */
! 130: #define I 0100 /* Interactive command bit */
! 131: #define M 0200 /* Legal from send mode bit */
! 132: #define W 0400 /* Illegal when read only bit */
! 133: #define F 01000 /* Is a conditional command */
! 134: #define T 02000 /* Is a transparent command */
! 135: #define R 04000 /* Cannot be called from collect */
! 136:
! 137: /*
! 138: * Oft-used mask values
! 139: */
! 140:
! 141: #define MMNORM (MDELETED|MSAVED)/* Look at both save and delete bits */
! 142: #define MMNDEL MDELETED /* Look only at deleted bit */
! 143:
! 144: /*
! 145: * Structure used to return a break down of a head
! 146: * line (hats off to Bill Joy!)
! 147: */
! 148:
! 149: struct headline {
! 150: char *l_from; /* The name of the sender */
! 151: char *l_tty; /* His tty string (if any) */
! 152: char *l_date; /* The entire date string */
! 153: };
! 154:
! 155: #define GTO 1 /* Grab To: line */
! 156: #define GSUBJECT 2 /* Likewise, Subject: line */
! 157: #define GCC 4 /* And the Cc: line */
! 158: #define GBCC 8 /* And also the Bcc: line */
! 159: #define GMASK (GTO|GSUBJECT|GCC|GBCC)
! 160: /* Mask of places from whence */
! 161:
! 162: #define GNL 16 /* Print blank line after */
! 163: #define GDEL 32 /* Entity removed from list */
! 164: #define GCOMMA 64 /* detract puts in commas */
! 165:
! 166: /*
! 167: * Structure used to pass about the current
! 168: * state of the user-typed message header.
! 169: */
! 170:
! 171: struct header {
! 172: struct name *h_to; /* Dynamic "To:" string */
! 173: char *h_subject; /* Subject string */
! 174: struct name *h_cc; /* Carbon copies string */
! 175: struct name *h_bcc; /* Blind carbon copies */
! 176: struct name *h_smopts; /* Sendmail options */
! 177: };
! 178:
! 179: /*
! 180: * Structure of namelist nodes used in processing
! 181: * the recipients of mail and aliases and all that
! 182: * kind of stuff.
! 183: */
! 184:
! 185: struct name {
! 186: struct name *n_flink; /* Forward link in list. */
! 187: struct name *n_blink; /* Backward list link */
! 188: short n_type; /* From which list it came */
! 189: char *n_name; /* This fella's name */
! 190: };
! 191:
! 192: /*
! 193: * Structure of a variable node. All variables are
! 194: * kept on a singly-linked list of these, rooted by
! 195: * "variables"
! 196: */
! 197:
! 198: struct var {
! 199: struct var *v_link; /* Forward link to next variable */
! 200: char *v_name; /* The variable's name */
! 201: char *v_value; /* And it's current value */
! 202: };
! 203:
! 204: struct group {
! 205: struct group *ge_link; /* Next person in this group */
! 206: char *ge_name; /* This person's user name */
! 207: };
! 208:
! 209: struct grouphead {
! 210: struct grouphead *g_link; /* Next grouphead in list */
! 211: char *g_name; /* Name of this group */
! 212: struct group *g_list; /* Users in group. */
! 213: };
! 214:
! 215: #define NIL ((struct name *) 0) /* The nil pointer for namelists */
! 216: #define NONE ((struct cmd *) 0) /* The nil pointer to command tab */
! 217: #define NOVAR ((struct var *) 0) /* The nil pointer to variables */
! 218: #define NOGRP ((struct grouphead *) 0)/* The nil grouphead pointer */
! 219: #define NOGE ((struct group *) 0) /* The nil group pointer */
! 220:
! 221: /*
! 222: * Structure of the hash table of ignored header fields
! 223: */
! 224: struct ignoretab {
! 225: int i_count; /* Number of entries */
! 226: struct ignore {
! 227: struct ignore *i_link; /* Next ignored field in bucket */
! 228: char *i_field; /* This ignored field */
! 229: } *i_head[HSHSIZE];
! 230: };
! 231:
! 232: /*
! 233: * Token values returned by the scanner used for argument lists.
! 234: * Also, sizes of scanner-related things.
! 235: */
! 236:
! 237: #define TEOL 0 /* End of the command line */
! 238: #define TNUMBER 1 /* A message number */
! 239: #define TDASH 2 /* A simple dash */
! 240: #define TSTRING 3 /* A string (possibly containing -) */
! 241: #define TDOT 4 /* A "." */
! 242: #define TUP 5 /* An "^" */
! 243: #define TDOLLAR 6 /* A "$" */
! 244: #define TSTAR 7 /* A "*" */
! 245: #define TOPEN 8 /* An '(' */
! 246: #define TCLOSE 9 /* A ')' */
! 247: #define TPLUS 10 /* A '+' */
! 248: #define TERROR 11 /* A lexical error */
! 249:
! 250: #define REGDEP 2 /* Maximum regret depth. */
! 251: #define STRINGLEN 1024 /* Maximum length of string token */
! 252:
! 253: /*
! 254: * Constants for conditional commands. These describe whether
! 255: * we should be executing stuff or not.
! 256: */
! 257:
! 258: #define CANY 0 /* Execute in send or receive mode */
! 259: #define CRCV 1 /* Execute in receive mode only */
! 260: #define CSEND 2 /* Execute in send mode only */
! 261:
! 262: /*
! 263: * Kludges to handle the change from setexit / reset to setjmp / longjmp
! 264: */
! 265:
! 266: #define setexit() setjmp(srbuf)
! 267: #define reset(x) longjmp(srbuf, x)
! 268:
! 269: /*
! 270: * Truncate a file to the last character written. This is
! 271: * useful just before closing an old file that was opened
! 272: * for read/write.
! 273: */
! 274: #define trunc(stream) { \
! 275: (void)fflush(stream); \
! 276: (void)ftruncate(fileno(stream), (off_t)ftell(stream)); \
! 277: }