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