|
|
1.1 ! root 1: #ident "@(#)def.h 1.5 'attmail mail(1) command'" ! 2: #ident "@(#)mailx:hdr/def.h 1.5.2.1" ! 3: /* Copyright (c) 1984 AT&T */ ! 4: /* All Rights Reserved */ ! 5: ! 6: /* THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF AT&T */ ! 7: /* The copyright notice above does not evidence any */ ! 8: /* actual or intended publication of such source code. */ ! 9: ! 10: #ident "@(#)mailx:hdr/def.h 1.5" ! 11: ! 12: #include <sys/types.h> ! 13: #include <signal.h> ! 14: #include <stdio.h> ! 15: #include <fcntl.h> ! 16: #include <string.h> ! 17: #include <setjmp.h> ! 18: #include <time.h> ! 19: #include <sys/stat.h> ! 20: #include <ctype.h> ! 21: #include <errno.h> ! 22: #ifndef preSVr4 ! 23: # include <maillock.h> /* adb */ ! 24: # include <unistd.h> ! 25: # include <stdlib.h> ! 26: # include <ulimit.h> ! 27: #endif ! 28: #include "local.h" ! 29: #include "uparm.h" ! 30: ! 31: /* ! 32: * mailx -- a modified version of a University of California at Berkeley ! 33: * mail program ! 34: */ ! 35: ! 36: #ifdef preSVr4 /* support for void* */ ! 37: # define VOID char ! 38: #else ! 39: # define VOID void ! 40: #endif ! 41: ! 42: #define SENDESC '~' /* Default escape for sending */ ! 43: #define NMLSIZE 1024 /* max names in a message list */ ! 44: #define PATHSIZE 1024 /* Size of pathnames throughout */ ! 45: #define HSHSIZE 19 /* Hash size for aliases and vars */ ! 46: #define LINESIZE 5120 /* max readable line width */ ! 47: #define STRINGSIZE ((unsigned) 128)/* Dynamic allocation units */ ! 48: #define MAXARGC 1024 /* Maximum list of raw strings */ ! 49: #define NOSTR ((char *) 0) /* Nill string pointer */ ! 50: #define NOSTRPTR ((char **) 0) /* Nill pointer to string pointer */ ! 51: #define NOINTPTR ((int *) 0) /* Nill pointer */ ! 52: #define MAXEXP 25 /* Maximum expansion of aliases */ ! 53: ! 54: #define equal(a, b) (strcmp(a,b)==0)/* A nice function to string compare */ ! 55: #define fopen(s,t) my_fopen(s,t) /* Keep a list of all opened files */ ! 56: #define fclose(s) my_fclose(s) /* delete closed file from the list*/ ! 57: #define plural(n) ((n) == 1 ? "" : "s") ! 58: ! 59: struct message { ! 60: long m_block; /* block number of this message */ ! 61: long m_offset; /* offset in block of message */ ! 62: long m_size; /* Bytes in the message */ ! 63: long m_lines; /* Lines in the message */ ! 64: long m_clen; /* Content-Length of the mesg */ ! 65: short m_flag; /* flags, see below */ ! 66: char m_text; /* TRUE if the contents is text */ ! 67: /* False otherwise */ ! 68: }; ! 69: ! 70: typedef struct fplst { ! 71: FILE *fp; ! 72: struct fplst *next; ! 73: } NODE; ! 74: ! 75: /* ! 76: * flag bits. ! 77: */ ! 78: ! 79: #define MUSED (1<<0) /* entry is used, but this bit isn't */ ! 80: #define MDELETED (1<<1) /* entry has been deleted */ ! 81: #define MSAVED (1<<2) /* entry has been saved */ ! 82: #define MTOUCH (1<<3) /* entry has been noticed */ ! 83: #define MPRESERVE (1<<4) /* keep entry in sys mailbox */ ! 84: #define MMARK (1<<5) /* message is marked! */ ! 85: #define MODIFY (1<<6) /* message has been modified */ ! 86: #define MNEW (1<<7) /* message has never been seen */ ! 87: #define MREAD (1<<8) /* message has been read sometime. */ ! 88: #define MSTATUS (1<<9) /* message status has changed */ ! 89: #define MBOX (1<<10) /* Send this to mbox, regardless */ ! 90: ! 91: #define H_AFWDCNT 1 /* "Auto-Forward-Count:" */ ! 92: #define H_AFWDFROM 2 /* "Auto-Forwarded-From:" */ ! 93: #define H_CLEN 3 /* "Content-Length:" */ ! 94: #define H_CTYPE 4 /* "Content-Type:" */ ! 95: #define H_DATE 5 /* "Date:" */ ! 96: #define H_DEFOPTS 6 /* "Default-Options:" */ ! 97: #define H_EOH 7 /* "End-of-Header:" */ ! 98: #define H_FROM 8 /* "From " */ ! 99: #define H_FROM1 9 /* ">From " */ ! 100: #define H_FROM2 10 /* "From: " */ ! 101: #define H_MTSID 11 /* "MTS-Message-ID:" */ ! 102: #define H_MTYPE 12 /* "Message-Type:" */ ! 103: #define H_MVERS 13 /* "Message-Version:" */ ! 104: #define H_MSVC 14 /* "Message-Service:" */ ! 105: #define H_RECEIVED 15 /* "Received:" */ ! 106: #define H_RVERS 16 /* "Report-Version:" */ ! 107: #define H_STATUS 17 /* "Status:" */ ! 108: #define H_SUBJ 18 /* "Subject:" */ ! 109: #define H_TO 19 /* "To:" */ ! 110: #define H_TCOPY 20 /* ">To:" */ ! 111: #define H_TROPTS 21 /* "Transport-Options:" */ ! 112: #define H_UAID 22 /* "UA-Content-ID:" */ ! 113: #define H_DAFWDFROM 23 /* Hold A-F-F when sending Del. Notf. */ ! 114: #define H_DTCOPY 24 /* Hold ">To:" when sending Del. Notf.*/ ! 115: #define H_DRECEIVED 25 /* Hold Rcvd: when sending Del. Notf.*/ ! 116: #define H_CONT 26 /* Continuation of previous line */ ! 117: #define H_NAMEVALUE 27 /* unrecognized "name: value" hdr line*/ ! 118: ! 119: /* ! 120: * Format of the command description table. ! 121: * The actual table is declared and initialized ! 122: * in lex.c ! 123: */ ! 124: ! 125: struct cmd { ! 126: char *c_name; /* Name of command */ ! 127: int (*c_func)(); /* Implementor of the command */ ! 128: short c_argtype; /* Type of arglist (see below) */ ! 129: short c_msgflag; /* Required flags of messages */ ! 130: short c_msgmask; /* Relevant flags of messages */ ! 131: }; ! 132: ! 133: /* can't initialize unions */ ! 134: ! 135: #define c_minargs c_msgflag /* Minimum argcount for RAWLIST */ ! 136: #define c_maxargs c_msgmask /* Max argcount for RAWLIST */ ! 137: ! 138: /* ! 139: * Argument types. ! 140: */ ! 141: ! 142: #define MSGLIST 0 /* Message list type */ ! 143: #define STRLIST 1 /* A pure string */ ! 144: #define RAWLIST 2 /* Shell string list */ ! 145: #define NOLIST 3 /* Just plain 0 */ ! 146: #define NDMLIST 4 /* Message list, no defaults */ ! 147: ! 148: #define P 040 /* Autoprint dot after command */ ! 149: #define I 0100 /* Interactive command bit */ ! 150: #define M 0200 /* Legal from send mode bit */ ! 151: #define W 0400 /* Illegal when read only bit */ ! 152: #define F 01000 /* Is a conditional command */ ! 153: #define T 02000 /* Is a transparent command */ ! 154: #define R 04000 /* Cannot be called from collect */ ! 155: ! 156: /* ! 157: * Oft-used mask values ! 158: */ ! 159: ! 160: #define MMNORM (MDELETED|MSAVED)/* Look at both save and delete bits */ ! 161: #define MMNDEL MDELETED /* Look only at deleted bit */ ! 162: ! 163: /* ! 164: * Structure used to return a break down of a head ! 165: * line ! 166: */ ! 167: ! 168: struct headline { ! 169: char *l_from; /* The name of the sender */ ! 170: char *l_tty; /* His tty string (if any) */ ! 171: char *l_date; /* The entire date string */ ! 172: }; ! 173: ! 174: #define GTO 1 /* Grab To: line */ ! 175: #define GSUBJECT 2 /* Likewise, Subject: line */ ! 176: #define GCC 4 /* And the Cc: line */ ! 177: #define GBCC 8 /* And also the Bcc: line */ ! 178: #define GDEFOPT 16 /* And the Default-Options: lines */ ! 179: #define GNL 32 /* Print blank line after */ ! 180: #define GOTHER 64 /* Other header lines */ ! 181: #define GMASK (GTO|GSUBJECT|GCC|GBCC|GDEFOPT|GNL|GOTHER) ! 182: /* Mask of all header lines */ ! 183: #define GDEL 128 /* Entity removed from list */ ! 184: ! 185: /* ! 186: * Structure used to pass about the current ! 187: * state of the user-typed message header. ! 188: */ ! 189: ! 190: struct header { ! 191: char *h_to; /* Dynamic "To:" string */ ! 192: char *h_subject; /* Subject string */ ! 193: char *h_cc; /* Carbon copies string */ ! 194: char *h_bcc; /* Blind carbon copies */ ! 195: char *h_defopt; /* Default options */ ! 196: char **h_others; /* Other header lines */ ! 197: int h_seq; /* Sequence for optimization */ ! 198: }; ! 199: ! 200: /* ! 201: * Structure of namelist nodes used in processing ! 202: * the recipients of mail and aliases and all that ! 203: * kind of stuff. ! 204: */ ! 205: ! 206: struct name { ! 207: struct name *n_flink; /* Forward link in list. */ ! 208: struct name *n_blink; /* Backward list link */ ! 209: short n_type; /* From which list it came */ ! 210: char *n_name; /* This fella's name */ ! 211: char *n_full; /* Full name */ ! 212: }; ! 213: ! 214: /* ! 215: * Structure of a variable node. All variables are ! 216: * kept on a singly-linked list of these, rooted by ! 217: * "variables" ! 218: */ ! 219: ! 220: struct var { ! 221: struct var *v_link; /* Forward link to next variable */ ! 222: char *v_name; /* The variable's name */ ! 223: char *v_value; /* And it's current value */ ! 224: }; ! 225: ! 226: struct mgroup { ! 227: struct mgroup *ge_link; /* Next person in this group */ ! 228: char *ge_name; /* This person's user name */ ! 229: }; ! 230: ! 231: struct grouphead { ! 232: struct grouphead *g_link; /* Next grouphead in list */ ! 233: char *g_name; /* Name of this group */ ! 234: struct mgroup *g_list; /* Users in group. */ ! 235: }; ! 236: ! 237: #define NIL ((struct name *) 0) /* The nil pointer for namelists */ ! 238: #define NONE ((struct cmd *) 0) /* The nil pointer to command tab */ ! 239: #define NOVAR ((struct var *) 0) /* The nil pointer to variables */ ! 240: #define NOGRP ((struct grouphead *) 0)/* The nil grouphead pointer */ ! 241: #define NOGE ((struct mgroup *) 0) /* The nil group pointer */ ! 242: #define NOFP ((struct fplst *) 0) /* The nil file pointer */ ! 243: ! 244: #define TRUE 1 ! 245: #define FALSE 0 ! 246: ! 247: #define LSIZE BUFSIZ /* maximum size of a line */ ! 248: #define DEADPERM 0600 /* permissions of dead.letter */ ! 249: #define TEMPPERM 0600 /* permissions of temp files */ ! 250: #define MBOXPERM 0600 /* permissions of ~/mbox */ ! 251: ! 252: #ifndef MFMODE ! 253: # define MFMODE 0660 /* create mode for `/var/mail' files */ ! 254: #endif ! 255: ! 256: /* ! 257: * Structure of the hash table of ignored header fields ! 258: */ ! 259: struct ignore { ! 260: struct ignore *i_link; /* Next ignored field in bucket */ ! 261: char *i_field; /* This ignored field */ ! 262: }; ! 263: ! 264: /* Default_display indicates whether to display this header line to the TTY */ ! 265: /* when in default mode. Can be overridden via 'P' command at ? prompt */ ! 266: struct hdr { ! 267: char *tag; ! 268: int default_display; ! 269: }; ! 270: ! 271: #ifdef preSVr4 ! 272: struct utimbuf { ! 273: time_t actime; ! 274: time_t modtime; ! 275: }; ! 276: #else ! 277: # include <utime.h> ! 278: #endif ! 279: ! 280: /* ! 281: * Token values returned by the scanner used for argument lists. ! 282: * Also, sizes of scanner-related things. ! 283: */ ! 284: ! 285: #define TEOL 0 /* End of the command line */ ! 286: #define TNUMBER 1 /* A message number */ ! 287: #define TDASH 2 /* A simple dash */ ! 288: #define TSTRING 3 /* A string (possibly containing -) */ ! 289: #define TDOT 4 /* A "." */ ! 290: #define TUP 5 /* An "^" */ ! 291: #define TDOLLAR 6 /* A "$" */ ! 292: #define TSTAR 7 /* A "*" */ ! 293: #define TOPEN 8 /* An '(' */ ! 294: #define TCLOSE 9 /* A ')' */ ! 295: #define TPLUS 10 /* A '+' */ ! 296: #define TERROR 11 /* abandon ship adb */ ! 297: ! 298: #define REGDEP 2 /* Maximum regret depth. */ ! 299: #define STRINGLEN 64 /* Maximum length of string token */ ! 300: ! 301: /* ! 302: * Constants for conditional commands. These describe whether ! 303: * we should be executing stuff or not. ! 304: */ ! 305: ! 306: #define CANY 0 /* Execute in send or receive mode */ ! 307: #define CRCV 1 /* Execute in receive mode only */ ! 308: #define CSEND 2 /* Execute in send mode only */ ! 309: ! 310: /* ! 311: * The pointers for the string allocation routines, ! 312: * there are NSPACE independent areas. ! 313: * The first holds STRINGSIZE bytes, the next ! 314: * twice as much, and so on. ! 315: */ ! 316: ! 317: #define NSPACE 25 /* Total number of string spaces */ ! 318: struct strings { ! 319: char *s_topFree; /* Beginning of this area */ ! 320: char *s_nextFree; /* Next alloctable place here */ ! 321: unsigned s_nleft; /* Number of bytes left here */ ! 322: }; ! 323: ! 324: /* The following typedefs must be used in SVR4 */ ! 325: #ifdef preSVr4 ! 326: typedef int gid_t; ! 327: typedef int uid_t; ! 328: typedef int pid_t; ! 329: typedef int mode_t; ! 330: #endif ! 331: ! 332: /* ! 333: * Forward declarations of routine types to keep lint and cc happy. ! 334: */ ! 335: ! 336: extern int Copy(); ! 337: extern FILE *Fdopen(); ! 338: extern int Followup(); ! 339: extern char *Getf(); ! 340: extern int Respond(); ! 341: extern int Save(); ! 342: extern int Sendm(); ! 343: extern int Type(); ! 344: extern void Verhogen(); ! 345: extern char *addone(); ! 346: extern char *addto(); ! 347: extern void alter(); ! 348: extern int alternates(); ! 349: extern void announce(); ! 350: extern int any(); ! 351: extern int anyof(); ! 352: extern int argcount(); ! 353: extern void assign(); ! 354: extern int blankline(); ! 355: extern int blockof(); ! 356: extern struct name *cat(); ! 357: extern void clrbuf(); ! 358: extern FILE *collect(); ! 359: extern void commands(); ! 360: extern char *copy(); ! 361: extern int copycmd(); ! 362: extern int deassign(); ! 363: extern int delete(); ! 364: extern struct name *delname(); ! 365: extern int deltype(); ! 366: extern char *detract(); ! 367: extern int docomma(); ! 368: extern int dopipe(); ! 369: extern int dosh(); ! 370: extern int echo(); ! 371: extern int editor(); ! 372: extern int edstop(); ! 373: extern struct name *elide(); ! 374: extern int elsecmd(); ! 375: extern int endifcmd(); ! 376: extern int execute(); ! 377: extern char *expand(); ! 378: extern struct name *extract(); ! 379: extern int file(); ! 380: extern struct grouphead *findgroup(); ! 381: extern void findmail(); ! 382: extern int first(); ! 383: extern void flush(); ! 384: extern int folders(); ! 385: extern int followup(); ! 386: extern int from(); ! 387: extern off_t fsize(); ! 388: extern int getfold(); ! 389: extern int gethfield(); ! 390: extern int getline(); ! 391: extern int getmsglist(); ! 392: extern int getname(); ! 393: extern int getrawlist(); ! 394: extern void getrecf(); ! 395: extern uid_t getuserid(); ! 396: extern int grabh(); ! 397: extern int group(); ! 398: extern void hangup(); ! 399: extern int hash(); ! 400: extern char *hcontents(); ! 401: extern int headerp(); ! 402: extern int headers(); ! 403: extern int help(); ! 404: extern char *hfield(); ! 405: extern void holdsigs(); ! 406: extern int icequal(); ! 407: extern int ifcmd(); ! 408: extern int igfield(); ! 409: extern void inithost(); ! 410: extern int isdir(); ! 411: extern int isheader(); ! 412: extern int ishfield(); ! 413: extern int ishost(); ! 414: extern int isign(); ! 415: extern int istext(); ! 416: extern void istrcpy(); ! 417: extern void lcwrite(); ! 418: extern int linecount(); ! 419: extern void load(); ! 420: extern int lock(); ! 421: extern void lockmail(); ! 422: extern int mail(); ! 423: extern void mail1(); ! 424: extern char *maildomain(); ! 425: extern void mapf(); ! 426: extern int mboxit(); ! 427: extern void mechk(); ! 428: extern int messize(); ! 429: extern void minit(); ! 430: extern int my_fclose(); ! 431: extern FILE *my_fopen(); ! 432: extern int name(); ! 433: extern char *nameof(); ! 434: extern char *netmap(); ! 435: extern int newfileinfo(); ! 436: extern int next(); ! 437: extern int npclose(); ! 438: extern FILE *npopen(); ! 439: extern int null(); ! 440: extern int offsetofaddr(); ! 441: extern int outof(); ! 442: extern struct name *outpre(); ! 443: extern int panic(); ! 444: extern void parse(); ! 445: extern int pcmdlist(); ! 446: extern int pdot(); ! 447: extern int preserve(); ! 448: extern void printgroup(); ! 449: extern void printhead(); ! 450: extern int puthead(); ! 451: extern int putline(); ! 452: extern int pversion(); ! 453: extern void quit(); ! 454: extern int readline(); ! 455: extern void receipt(); ! 456: extern void relsesigs(); ! 457: extern int removefile(); ! 458: extern int respond(); ! 459: extern int rexit(); ! 460: extern VOID *salloc(); ! 461: extern VOID *srealloc(); ! 462: extern int samebody(); ! 463: extern int save(); ! 464: extern void savedead(); ! 465: extern char *savestr(); ! 466: extern int schdir(); ! 467: extern int scroll(); ! 468: extern long send(); ! 469: extern int sendm(); ! 470: extern int set(); ! 471: extern int setfile(); ! 472: extern FILE *setinput(); ! 473: extern void setptr(); ! 474: extern int shell(); ! 475: extern void sigchild(); ! 476: extern void (*sigset())(); ! 477: extern char *skin(); ! 478: extern char *snarf(); ! 479: extern int source(); ! 480: extern char *splice(); ! 481: extern void sreset(); ! 482: extern void stop(); ! 483: extern int stouch(); ! 484: extern void stradd(); ! 485: extern int substr(); ! 486: extern int swrite(); ! 487: extern struct name *tailof(); ! 488: extern void tinit(); ! 489: extern int top(); ! 490: extern void touch(); ! 491: extern struct name *translate(); ! 492: extern int type(); ! 493: extern int undelete(); ! 494: extern int unigfield(); ! 495: extern void unlockmail(); ! 496: extern char **unpack(); ! 497: extern int unset(); ! 498: extern int unstack(); ! 499: extern char *unuucp(); ! 500: extern struct name *usermap(); ! 501: extern int username(); ! 502: extern char *value(); ! 503: extern char *vcopy(); ! 504: extern int visual(); ! 505: extern char *yankword(); ! 506: ! 507: /* ! 508: * Standard functions from the C library. ! 509: * These are all defined in <stdlib.h> in SVr4. ! 510: */ ! 511: #ifdef preSVr4 ! 512: extern long atol(); ! 513: extern char *getcwd(); ! 514: extern char *calloc(); ! 515: extern char *getenv(); ! 516: extern void exit(); ! 517: extern void free(); ! 518: extern char *malloc(); ! 519: extern time_t time(); ! 520: extern long ulimit(); ! 521: extern int utime(); ! 522: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.