1: /* mh.h - main header file for all of MH */ 2: 3: 4: /* Well-used constants */ 5: 6: #define NOTOK (-1) /* syscall()s return this on error */ 7: #define OK 0 /* ditto on success */ 8: #define DONE 1 /* trinary logic */ 9: #define ALL "" 10: #define NULLCP ((char *) 0) 11: #define NULLVP ((char **) 0) 12: 13: #define MAXARGS 1000 /* max arguments to exec */ 14: 15: #define NFOLDERS 200 /* max folder arguments on command line */ 16: 17: #define MAXFOLDER 1000 /* message increment */ 18: #define DMAXFOLDER 4 /* typical number of digits */ 19: 20: #ifndef BSD42 || BSD41A || VMUNIX 21: #define vfork fork 22: #endif not BSD /* how sad... */ 23: 24: /* */ 25: 26: /* profile structure */ 27: 28: struct node { 29: char *n_name; /* key */ 30: char *n_field; /* value */ 31: 32: char n_context; /* context, not profile */ 33: 34: struct node *n_next; /* next entry */ 35: }; 36: 37: 38: /* switches structure */ 39: 40: #define AMBIGSW (-2) /* from smatch() on ambiguous switch */ 41: #define UNKWNSW (-1) /* ditto on unknown switch */ 42: 43: struct swit { 44: char *sw; 45: int minchars; 46: }; 47: 48: extern struct swit anoyes[]; /* standard yes/no switches */ 49: 50: 51: /* messages structure */ 52: 53: struct msgs { 54: int hghmsg; /* Highest msg in directory */ 55: int nummsg; /* Actual Number of msgs */ 56: int lowmsg; /* Lowest msg number */ 57: int curmsg; /* Number of current msg if any */ 58: 59: int lowsel; /* Lowest selected msg number */ 60: int hghsel; /* Highest selected msg number */ 61: int numsel; /* Number of msgs selected */ 62: 63: char *foldpath; /* Pathname of folder */ 64: 65: char msgflags; /* Folder status bits */ 66: #ifndef MTR 67: char pad1[sizeof (int) - sizeof (char)]; 68: #endif not MTR 69: #define READONLY 0x01 /* No write access to folder */ 70: #define SEQMOD 0x02 /* folder's sequences modifed */ 71: #define MHPATH 0x04 /* mhpath-style folder handling */ 72: #define OTHERS 0x08 /* folder has other files */ 73: #define MODIFIED 0x10 /* msh in-core folder modified */ 74: #define FBITS "\020\01READONLY\02SEQMOD\03MHPATH\04OTHERS\05MODIFIED" 75: 76: /* Note well: msgstats[] is a short, so we have 16 bits to work 77: with. The first 5 are for standard MH message flags, 78: this leaves us 11 for user-defined attributes. Of these, 79: 1 is reserved for future internal use, so this leaves 80: users 10. */ 81: #define NATTRS 10 /* could be 11, see above */ 82: char *msgattrs[NATTRS + 1];/* folder attributes */ 83: short attrstats; /* public=0/private=1 */ 84: #ifndef MTR 85: char pad2[sizeof (int) - sizeof (short)]; 86: #endif not MTR 87: 88: int lowoff; /* low element in msgstats[] */ 89: int hghoff; /* hgh element in msgstats[] */ 90: 91: #ifndef MTR 92: short msgstats[1]; /* msg status */ 93: #else MTR 94: short *msgbase; /* msg base */ 95: short *msgstats; /* msg status */ 96: #endif MTR 97: #define EXISTS 0x0001 /* exists */ 98: #define DELETED 0x0002 /* deleted */ 99: #define SELECTED 0x0004 /* selected for use */ 100: #define SELECT_EMPTY 0x0008 /* mhpath "new" */ 101: #define UNSEEN 0x0010 /* inc/show "unseen" */ 102: #define FFATTRSLOT 5 /* user-defined attributes */ 103: /* first free slot is */ 104: /* (1 << 5) or 0x20 */ 105: #define MBITS "\020\01EXISTS\02DELETED\03SELECTED\04NEW\05UNSEEN" 106: 107: #ifndef MTR 108: #define MSIZE(mp,lo,hi) \ 109: ((unsigned) (sizeof *mp + ((hi) + 2) * sizeof *mp -> msgstats)) 110: #else MTR 111: #define MSIZE(mp,lo,hi) ((unsigned) sizeof *mp) 112: #define MSIZEX(mp,lo,hi) \ 113: ((unsigned) (((hi) - (lo) + 1) * sizeof *mp -> msgstats)) 114: #endif MTR 115: }; 116: 117: #define NULLMP ((struct msgs *) 0) 118: 119: /* */ 120: 121: /* m_getfld() message parsing */ 122: 123: #define NAMESZ 128 /* Limit on component name size */ 124: 125: #define LENERR (-2) /* Name too long error from getfld */ 126: #define FMTERR (-3) /* Message Format error */ 127: #define FLD 0 /* Field returned */ 128: #define FLDPLUS 1 /* Field " with more to come */ 129: #define FLDEOF 2 /* Field " ending at eom */ 130: #define BODY 3 /* Body " with more to come */ 131: #define BODYEOF 4 /* Body " ending at eom */ 132: #define FILEEOF 5 /* Reached end of input file */ 133: 134: 135: /* Maildrop styles */ 136: 137: #define MS_DEFAULT 0 /* default (one msg per file) */ 138: #define MS_UNKNOWN 1 /* type not known yet */ 139: #define MS_UUCP 2 /* Unix-style "from" lines */ 140: #define MS_MMDF 3 /* string mmdlm2 */ 141: #define MS_MSH 4 /* whacko msh */ 142: 143: extern int msg_count; /* m_getfld() indicators */ 144: extern int msg_style; /* .. */ 145: extern char *msg_delim; /* .. */ 146: 147: 148: #define NOUSE 0 /* draft being re-used */ 149: 150: #define TFOLDER 0 /* path() given a +folder */ 151: #define TFILE 1 /* path() given a file */ 152: #define TSUBCWF 2 /* path() given a @folder */ 153: 154: #ifndef LINK 155: #define LINK "@" 156: #endif not LINK 157: 158: #ifndef SBACKUP 159: #define SBACKUP "," 160: #endif not SBACKUP 161: 162: 163: #define OUTPUTLINELEN 72 /* default line length for headers */ 164: 165: /* */ 166: 167: /* 168: * These standard strings are defined in config.c. They are the 169: * only system-dependent parameters in MH, and thus by redefining 170: * their values and reloading the various modules, MH will run 171: * on any system. 172: */ 173: 174: extern char *components; 175: extern char *context; 176: extern char *current; 177: extern char *defalt; 178: extern char *digestcomps; 179: extern char *distcomps; 180: extern char *draft; 181: extern char *fileproc; 182: extern char *foldprot; 183: extern char *forwcomps; 184: extern char *incproc; 185: extern char *installproc; 186: extern char *lproc; 187: extern char *mailproc; 188: extern char *mh_defaults; 189: extern char *mh_profile; 190: extern char *mh_seq; 191: extern char *mhlformat; 192: extern char *mhlforward; 193: extern char *mhlproc; 194: extern char *moreproc; 195: extern char *msgprot; 196: extern char *mshproc; 197: extern char *nsequence; 198: extern char *packproc; 199: extern char *postproc; 200: extern char *pfolder; 201: extern char *psequence; 202: extern char *rcvdistcomps; 203: extern char *replcomps; 204: extern char *rmfproc; 205: extern char *rmmproc; 206: extern char *sendproc; 207: extern char *showproc; 208: extern char *slocalproc; 209: extern char *sysed; 210: extern char *usequence; 211: extern char *version; 212: extern char *vmhproc; 213: extern char *whatnowproc; 214: extern char *whomproc; 215: 216: /* */ 217: 218: /* global variables -sigh- */ 219: 220: extern char ctxflags; 221: #define CTXMOD 0x01 /* context information modified */ 222: #define DBITS "\020\01CTXMOD" 223: 224: #ifdef OVERHEAD 225: extern int fd_def; 226: extern int fd_ctx; 227: #endif OVERHEAD 228: 229: extern char *invo_name; /* pgm invocation name */ 230: extern char *mypath; /* user's $HOME */ 231: extern char *defpath; /* pathname of user's profile */ 232: extern char *ctxpath; /* pathname of user's context */ 233: 234: extern struct node *m_defs; 235: 236: /* */ 237: 238: /* from the MH subroutine library */ 239: 240: char *add (); 241: void adios (); 242: void admonish (); 243: void advise (); 244: void advertise (); 245: void ambigsw (); 246: int atooi (); 247: char **brkstring (); 248: void closefds (); 249: char *concat (); 250: char *copy (); 251: char **copyip (); 252: void cpydata (); 253: void cpydgst (); 254: void discard (); 255: void done (); 256: int fdcompare (); 257: int gans (); 258: char **getans (); 259: int getanswer (); 260: char *getcpy (); 261: void help (); 262: char *libpath (); 263: int m_atoi (); 264: char *m_backup (); 265: int m_convert (); 266: int m_delete (); 267: char *m_draft (); 268: void m_eomsbr (); 269: int m_file (); 270: char *m_find (); 271: void m_fmsg (); 272: void m_foil (); 273: void m_getdefs (); 274: int m_getfld (); 275: char *m_getfolder (); 276: int m_gmprot (); 277: struct msgs *m_gmsg (); 278: char *m_maildir (); 279: char *m_mailpath (); 280: char *m_name (); 281: void m_readefs (); 282: struct msgs *m_remsg (); 283: void m_replace (); 284: char *m_scratch (); 285: char *m_seq (); 286: int m_seqadd (); 287: char *m_seqbits (); 288: int m_seqdel (); 289: int m_seqflag (); 290: int m_seqnew (); 291: void m_setcur (); 292: void m_setseq (); 293: void m_setvis (); 294: void m_sync (); 295: char *m_tmpfil (); 296: void m_unknown (); 297: void m_update (); 298: int m_whatnow (); 299: int makedir (); 300: char *path (); 301: int peekc (); 302: int pidwait (); 303: #define pidXwait(id,cp) pidstatus (pidwait (id, NOTOK), stdout, cp) 304: int pidstatus (); 305: void printsw (); 306: void push (); 307: int putenv (); 308: char *pwd (); 309: char *r1bindex (); 310: int refile (); 311: int remdir (); 312: int showfile (); 313: int smatch (); 314: char *sprintb(); 315: int ssequal (); 316: int stringdex (); 317: char *trimcpy (); 318: int type (); 319: int uleq (); 320: int unputenv (); 321: int uprf (); 322: int vfgets (); 323: 324: /* */ 325: 326: #include "../h/strings.h" 327: 328: 329: /* should be in <stdio.h> */ 330: 331: #ifndef SYS5 332: typedef struct _iobuf *FP; 333: FP popen (); 334: #else SYS5 335: #define FP FILE* 336: #endif SYS5 337: 338: 339: /* miscellaneous */ 340: 341: #ifndef BSD42 342: #define rename(f1,f2) (link (f1, f2) != NOTOK ? unlink (f1) : NOTOK) 343: #endif BSD42 344: 345: #define setsig(s,f) if (signal (s, SIG_IGN) != SIG_IGN) \ 346: (void) signal (s, f) 347: #define setsigx(i,s,f) if ((i = signal (s, SIG_IGN)) != SIG_IGN) \ 348: (void) signal (s, f) 349: 350: #ifdef sun 351: #define ruserpass _ruserpass 352: #endif sun