|
|
1.1 ! root 1: #include <stdio.h> ! 2: ! 3: #if defined(RCSIDENT) && defined(MAINLINE) ! 4: static char zzstructs[] = "$Header: structs.h,v 1.7.0.1 85/03/17 20:57:42 notes Rel $"; ! 5: #endif defined(RCSIDENT) && defined(MAINLINE) ! 6: ! 7: /* ! 8: * structure definitions for the notesfile program. ! 9: * ! 10: * Constants/definitions likely to change with different ! 11: * kernels are included in the file "parms.h". ! 12: */ ! 13: ! 14: ! 15: #define TRUE 1 /* pretty euphemisms */ ! 16: #define FALSE 0 ! 17: #define NEVER (-1) /* expiration stuff */ ! 18: #define EDIT TRUE /* whether to edit or */ ! 19: #define NOEDIT FALSE /* not to edit */ ! 20: ! 21: #ifdef UID8 /* 8 bit uids */ ! 22: #define UIDMASK 0377 /* mask 8 bit uids */ ! 23: #define GIDMASK 0377 /* mask 8 bit gids */ ! 24: #else ! defined(UID8) /* 16 bit uids */ ! 25: #define UIDMASK 0177777 /* mask out high UID bits */ ! 26: #define GIDMASK 0177777 /* mask out high GID bits */ ! 27: #endif ! defined(UID8) ! 28: ! 29: #define NETLOG "net.log" /* network logfile */ ! 30: #define GRIPES "nfgripes" /* gripe notesfile */ ! 31: #define UTILITY ".utilities" /* utility directory */ ! 32: #define LOCKS ".locks" /* lock directory */ ! 33: #define SEQUENCER ".sequencer" /* sequencer files */ ! 34: #define SEQ ".SEQ" /* next d_nfnum */ ! 35: #define INDXHLP "index.help" /* index page help */ ! 36: #define RDMHLP "read.help" /* readem page help file */ ! 37: #define LIMHLP "lim.help" /* help for limited index */ ! 38: #define ACCHLP "access.help" /* for access editor */ ! 39: #define DIRHLP "dir.help" /* for director options */ ! 40: #define AVAILHLP "avail.notes" /* list of public notefiles */ ! 41: #define NFCOMMENT "nfcomment" /* nfcomment routine */ ! 42: #define ARCHALIAS "Archive-into" /* archive mapping */ ! 43: ! 44: #define TEXT "text" /* name of text file */ ! 45: #define INDEXN "note.indx" /* master index */ ! 46: #define INDEXR "resp.indx" /* response chains */ ! 47: #define ACCESS "access" /* access lists here */ ! 48: #define ARCHIVE "archive" /* archive sub-dir */ ! 49: #define COMPRESS "comp." /* compress names */ ! 50: #define SEQLOCK 's' /* .SEQ lock */ ! 51: #define LOGLOCK 'l' /* log file locking */ ! 52: #define ARCHLOCK 'a' /* archiving */ ! 53: #define TXTLOCK 't' /* text file */ ! 54: #define DSCRLOCK 'n' /* index file */ ! 55: ! 56: #define RESPSZ 5 /* number responses/response record */ ! 57: #define NAMESZ 17 /* longest user name */ ! 58: #define HOMESYSSZ 33 /* user home system */ ! 59: #define SYSSZ 33 /* system name length */ ! 60: /* above hold null byte also */ ! 61: #define BUFSIZE 1024 /* chars in core */ ! 62: ! 63: /* ! 64: * pick an appropriate default for the maximum message length ! 65: * (MAXMSG). Also pick an appropriate hard limit. (HARDMAX) ! 66: * HARDMAX must leave room for a one line message of up to 50 ! 67: * bytes of the form "ignoring %ld excess bytes" ! 68: */ ! 69: #ifdef BIGTEXT ! 70: #define MAXMSG 100000 /* can be larger */ ! 71: #define HARDMAX 3000000 /* 3 Mbytes */ ! 72: #else NOT BIGTEXT ! 73: #define MAXMSG 65000 /* not much larger */ ! 74: #define HARDMAX 65000 /* room for mesage */ ! 75: #endif NOT BIGTEXT ! 76: #define PAGESAV 50 /* display stack */ ! 77: /* using unsigned short */ ! 78: #define UNIQPLEX 100000 /* multiplex nfid into noteid */ ! 79: /* see putnote and putresp */ ! 80: ! 81: #define TITLEN 36 /* note title length */ ! 82: #define NNLEN 40 /* Notesfile Name length */ ! 83: #define DMLEN 40 /* director message length */ ! 84: #define NOT ~ /* tilde, prints wrong on hazeltines */ ! 85: #define WDLEN 128 /* longest file name */ ! 86: #define CMDLEN 512 /* build-a-command */ ! 87: #define PASSWDLEN 128 /* longest line in /etc/passwd */ ! 88: #define DATELEN 24 /* length of formatted date */ ! 89: #define NPERMS 35 /* max access list */ ! 90: /* ! 91: * NPERMS can be increased as desired. However, a static array is ! 92: * allocated based on this constant. Watch it if you are running in ! 93: * a memory starved environment (like an 11/60). ! 94: */ ! 95: #define PAGELEN 56 /* pagelength for 'S' */ ! 96: ! 97: #define ANONOK 01 /* permit anon notes */ ! 98: #define FRMNEWS 01 /* non-nf article */ ! 99: #define OPEN 02 /* open for public */ ! 100: #define DIRMES 04 /* director msg on */ ! 101: #define DELETED 010 /* is deleted */ ! 102: #define NFINVALID 010 /* got bad copy */ ! 103: #define NETWRKD 020 /* networking OK */ ! 104: #define CONTINUED 040 /* was auto-split */ ! 105: #define WRITONLY 0100 /* writeonly access when written */ ! 106: #define ORPHND 0200 /* foster parent */ ! 107: #define ISARCH 0400 /* is an archive */ ! 108: ! 109: /* change these only after modifying the table in access.c */ ! 110: #define READOK 01 /* allow user to read */ ! 111: #define WRITOK 02 /* allow user to write */ ! 112: #define DRCTOK 04 /* allow user to be director */ ! 113: #define RESPOK 010 /* ok to respond */ ! 114: /* ! 115: * archive writing keyed on director status for now... ! 116: */ ! 117: #define ARCHWRITOK 020 /* archive write */ ! 118: #define ARCHRESPOK 040 /* archive response */ ! 119: #define DFLTPERMS (READOK+WRITOK+RESPOK) /* default permissions */ ! 120: ! 121: #define PERMUSER 00 /* perm_f entry type */ ! 122: #define PERMGROUP 01 /* ORDER IS IMPORTANT */ ! 123: #define PERMSYSTEM 02 ! 124: ! 125: ! 126: /* ! 127: * Sequencer modes. ! 128: * modes < NOREADSEQ cause the time to be taken from "Basetime" ! 129: * modes < NOWRITESEQ cause no update when leaving the notesfile. ! 130: * There is currently no way to read from the sequencer file ! 131: * and not update -- it's a wierd case anyway. ! 132: */ ! 133: ! 134: #define NOSEQ 0 /* no sequencer */ ! 135: #define USERSEQ 1 /* usertime noupdate */ ! 136: ! 137: #define NOWRITESEQ 10 /* < this no write */ ! 138: #define BASESEQ 11 /* usertime & update */ ! 139: ! 140: #define NOREADSEQ 100 /* use Basetime if < */ ! 141: #define NORMSEQ 101 /* normal sequencer */ ! 142: #define EXTSEQ 102 /* enter anyway */ ! 143: #define INDXSEQ 103 /* index sequencer */ ! 144: /* from harpo!mmp */ ! 145: ! 146: #define QUITSEQ -2 /* quit, update sequencer */ ! 147: #define QUITNOSEQ -3 /* quit, no seq update */ ! 148: #define QUITFAST -4 /* quit almost abort */ ! 149: #define QUITUPD -5 /* like quitfast */ ! 150: #define QUITNEX -6 /* no notesfile */ ! 151: #define QUITBAD -7 /* bad notesfile */ ! 152: ! 153: #define GOOD 0 /* good exit status */ ! 154: #define BAD 1 /* bad exit status */ ! 155: #define NONF 2 /* no notefile */ ! 156: ! 157: #define POLICY 1 /* mnemonics */ ! 158: #define NOPOLICY 0 /* used in calls */ ! 159: #define LOCKIT 1 /* Do not change */ ! 160: #define NOLOCKIT 0 ! 161: #define COPYID 1 ! 162: #define NOCOPYID 0 ! 163: #define ADDID 1 ! 164: #define NOADDID 0 ! 165: #define ADDTIME 1 ! 166: #define NOADDTIME 0 ! 167: #define DETAIL 1 /* dump extra info */ ! 168: #define NODETAIL 0 /* used for generic form */ ! 169: ! 170: /* ! 171: * These defines are for the archiver. They are used for determining ! 172: * eligibility for archival along with the age of the note. ! 173: * DFLT means to use whatever value was supplied on the archive ! 174: * command line. The others mean the notesfile is configured ! 175: * for a specific archival setup. ! 176: */ ! 177: ! 178: #define DIRDFLT 0 /* use cmd line */ ! 179: #define DIRNOCARE 1 /* don't check dir */ ! 180: #define DIRON 2 /* only if dir on */ ! 181: #define DIROFF 3 /* only if dir off */ ! 182: ! 183: #define KEEPDFLT 0 /* use cmd line */ ! 184: #define KEEPNO 1 /* delete 'em */ ! 185: #define KEEPYES 2 /* archive 'em */ ! 186: ! 187: struct auth_f /* how we id author */ ! 188: { ! 189: char aname[NAMESZ]; /* his name */ ! 190: char asystem[HOMESYSSZ]; /* his system */ ! 191: int aid; /* uid (if local) */ ! 192: }; ! 193: ! 194: struct when_f /* standard date structure */ ! 195: { ! 196: short w_year; ! 197: short w_month; ! 198: short w_day; ! 199: short w_hours; ! 200: short w_mins; ! 201: long w_gmttime; /* stock unix time */ ! 202: }; ! 203: ! 204: struct id_f /* unique id for notes */ ! 205: { ! 206: char sys[SYSSZ]; ! 207: long uniqid; ! 208: }; ! 209: ! 210: struct perm_f /* permission tables */ ! 211: { ! 212: short ptype; /* user, group, system */ ! 213: char name[NAMESZ]; /* name of such */ ! 214: short perms; /* what he is allowed */ ! 215: }; ! 216: ! 217: struct daddr_f /* save a disk address */ ! 218: { ! 219: long addr; /* for lseeks */ ! 220: #ifdef BIGTEXT ! 221: unsigned long textlen; /* how long is text */ ! 222: #else NOT BIGTEXT ! 223: unsigned short textlen; /* how long the text is */ ! 224: #endif NOT BIGTEXT ! 225: }; ! 226: ! 227: struct txtbuf_f ! 228: { ! 229: char txtbuf[BUFSIZE]; /* hold a bunch of characters */ ! 230: }; ! 231: ! 232: struct dsply_f ! 233: { ! 234: struct daddr_f d_head; /* text start */ ! 235: struct txtbuf_f d_buf; ! 236: int optr, ! 237: olim; /* output index and end of buffer */ ! 238: long outcount; /* number of characters dumped */ ! 239: }; ! 240: ! 241: struct resp_f /* for each response: */ ! 242: { ! 243: short r_first, /* bounds of this */ ! 244: r_last; /* resp_f block */ ! 245: struct id_f r_id[RESPSZ]; /* system/id for each response */ ! 246: struct daddr_f r_addr[RESPSZ]; /* where the response is */ ! 247: struct when_f r_when[RESPSZ]; /* date/time of response */ ! 248: char r_from[RESPSZ][SYSSZ]; /* system that sent this to us */ ! 249: struct when_f r_rcvd[RESPSZ]; /* date/time for sequencer */ ! 250: struct auth_f r_auth[RESPSZ]; ! 251: char r_stat[RESPSZ]; /* director/status flag */ ! 252: int r_next; /* index of next response_ind */ ! 253: int r_previous; /* backlinks */ ! 254: /* [currently unused */ ! 255: }; ! 256: ! 257: struct note_f /* standard note structure: */ ! 258: { ! 259: struct id_f n_id; /* unique id for this note */ ! 260: short n_nresp; /* number of responses */ ! 261: char ntitle[TITLEN]; /* title of note */ ! 262: struct auth_f n_auth; /* note's author */ ! 263: struct when_f n_date; /* note's date */ ! 264: struct when_f n_rcvd; /* date we got it */ ! 265: struct when_f n_lmod; /* date of last mod */ ! 266: char n_from[SYSSZ]; /* system that handed us the note */ ! 267: int n_rindx; /* where the first set of responses lies */ ! 268: struct daddr_f n_addr; /* address of note's text on disk */ ! 269: char n_stat; /* director/status flag */ ! 270: }; ! 271: ! 272: struct descr_f /* for the notesfile: */ ! 273: { ! 274: long d_format; /* nf's format */ ! 275: char d_title[NNLEN]; /* nf's name */ ! 276: char d_drmes[DMLEN]; /* director message */ ! 277: short d_plcy; /* ==0 if no message */ ! 278: struct when_f d_lastm; /* last modified time */ ! 279: short d_stat; /* open/closed/etc */ ! 280: short d_nnote; /* how many notes in file */ ! 281: struct id_f d_id; /* sys name & unique id counter */ ! 282: struct when_f d_lstxmit; /* last network transmit */ ! 283: struct when_f d_created; /* creation date */ ! 284: struct when_f d_lastuse; /* last day used */ ! 285: long d_daysused; /* count those days */ ! 286: long d_rspwrit; /* number of responses ever written */ ! 287: long d_notwrit; /* number of notes ever written */ ! 288: long entries; /* number of entries into the notefile */ ! 289: long walltime; /* man-seconds (?) spent in notefile */ ! 290: long d_rspread; /* number of responses read */ ! 291: long d_notread; /* and number of notes */ ! 292: long d_rsprcvd; /* network in stats */ ! 293: long d_notrcvd; ! 294: long d_rspxmit; /* network out stats */ ! 295: long d_notxmit; ! 296: long d_notdrop; /* duplicate notes recieved */ ! 297: long d_rspdrop; /* and dropped on ground */ ! 298: long d_orphans; /* orphaned responses */ ! 299: long netwrkouts; /* number of times networked out */ ! 300: long netwrkins; /* and number of networked in */ ! 301: short d_nfnum; /* unique to this notesfile */ ! 302: long d_archtime; /* archive after X days */ ! 303: long d_workset; /* working set size */ ! 304: long d_delnote; /* count deletes */ ! 305: long d_delresp; /* count resp dels */ ! 306: long d_dmesgstat; /* use dirmsg for archive */ ! 307: long d_archkeep; /* keep/delete */ ! 308: long d_adopted; /* orphans adopted */ ! 309: long d_longnote; /* max per article */ ! 310: char d_filler[20]; /* future use ... */ ! 311: }; ! 312: ! 313: struct io_f /* master i/o form */ ! 314: { ! 315: int fidtxt; /* text */ ! 316: int fidndx; /* note.indx */ ! 317: int fidrdx; /* resp.indx */ ! 318: struct descr_f descr; /* current descr */ ! 319: /* updated by critical sections */ ! 320: char nf[NNLEN]; /* last part of name */ ! 321: char basedir[WDLEN]; /* its directory */ ! 322: char fullname[WDLEN]; /* full pathname */ ! 323: char xstring[TITLEN + 1]; /* search string */ ! 324: char xauthor[NAMESZ + SYSSZ + 2]; /* author search */ ! 325: /* site!user\0 */ ! 326: struct when_f stime; /* read notes/responses more recent than this */ ! 327: short access; /* what sort of access user has */ ! 328: int nrspwrit; /* number of responses written this entry */ ! 329: int nnotwrit; /* num of notes written */ ! 330: long entered; /* when started so can figure time in */ ! 331: int nrspread; /* how many responses he read */ ! 332: int nnotread; /* how many notes he read */ ! 333: /* num read may be tough */ ! 334: int nnotxmit; /* network out stats */ ! 335: int nrspxmit; ! 336: int nnotrcvd; /* network in stats */ ! 337: int nrsprcvd; ! 338: int nnotdrop; /* duplicates rom the network */ ! 339: int nrspdrop; ! 340: int norphans; /* orphans rcvd */ ! 341: int adopted; /* adoptions handled */ ! 342: }; ! 343: ! 344: struct seq_f /* sequencer entry list form */ ! 345: { ! 346: char nfname[NNLEN]; /* name of notefile */ ! 347: struct when_f lastin; /* last entry time */ ! 348: }; ! 349: ! 350: struct nflist_f /* nf's to scan */ ! 351: { ! 352: char *nf_name; ! 353: short nf_active; /* !'ed or not */ ! 354: short nf_seqmode; /* sequencer mode */ ! 355: }; ! 356: ! 357: /* ! 358: * Declare global variables. The actual instantiation of these ! 359: * variables is in the file startup.c ! 360: * ! 361: */ ! 362: ! 363: extern char *hised; /* preferred editor */ ! 364: extern char *hisshell; /* preferred shell */ ! 365: extern char *hispager; /* paging program */ ! 366: extern char *hismailer; /* mail program */ ! 367: extern int nrows; /* rows on screen */ ! 368: extern int ncols; /* screen width */ ! 369: extern char *histty; /* tty on command */ ! 370: extern int intflag; /* DEL hit recently */ ! 371: extern int globuid; /* his true user id */ ! 372: extern int Notesuid; /* who's god */ ! 373: extern int Anonuid; /* who's not allowed */ ! 374: extern int Nindex; /* index page rows */ ! 375: extern int ignoresigs; /* critical section */ ! 376: extern char *Mstdir; /* default nf place */ ! 377: extern char *System; /* point to it */ ! 378: extern char *Authsystem; /* author's system */ ! 379: extern char *Invokedas; /* argv[0] */ ! 380: extern char Seqname[]; /* sequencing name */ ! 381: extern struct when_f Basetime; /* zero time */ ! 382: ! 383: /* ! 384: * Various definitions that help keep things portable. ! 385: * Types that various functions return, etc. ! 386: */ ! 387: ! 388: #if defined(USG) ! 389: extern char *strchr (); /* UNIX4.0 index() */ ! 390: extern char *strrchr (); /* UNIX4.0 rindex() */ ! 391: #else ! 392: extern char *index (); /* for lint */ ! 393: extern char *rindex (); ! 394: #endif defined(USG) ! 395: ! 396: /* ! 397: * Standard library routines that return other than "int". ! 398: */ ! 399: ! 400: extern int errno; /* syscall errors */ ! 401: extern char *sys_errlist[]; /* errno messages */ ! 402: extern int sys_nerr; /* and how many */ ! 403: char *sprintf (); /* satisfy lint */ ! 404: char *getenv (); ! 405: long lseek (); /* for lint */ ! 406: ! 407: /* ! 408: * routines in the notesfile system that return other than ! 409: * "int". ! 410: */ ! 411: ! 412: extern char *strsave (); /* in misc.c */ ! 413: extern struct nflist_f *nextgroup (); /* in expand.c */ ! 414: extern long pagein (); /* in pagein.c */ ! 415: extern long gettext (); /* in gtext.c */ ! 416: extern long puttrec (); /* in recsio.c */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.