1 #include "../hdr/defines.h"
2
3 # define ONEYEAR 31536000L
4
5 SCCSID(@(#)dodelt 2.1);
6
7 long Timenow;
8
9 char Pgmr[SZLNAM]; /* for rmdel & chghist (rmchg) */
10 int First_esc;
11
dodelt(pkt,statp,sidp,type)12 dodelt(pkt,statp,sidp,type)
13 register struct packet *pkt;
14 struct stats *statp;
15 struct sid *sidp;
16 char type;
17 {
18 extern char *satoi();
19 struct deltab dt;
20 register struct idel *rdp;
21 int n, founddel;
22 long timediff;
23 register char *p;
24
25 pkt->p_idel = 0;
26 founddel = 0;
27
28 time(&Timenow);
29 stats_ab(pkt,statp);
30 while (getadel(pkt,&dt) == BDELTAB) {
31 if (pkt->p_idel == 0) {
32 if (Timenow < dt.d_datetime)
33 fprintf(stderr,"Clock may be set wrong! (co11)");
34 timediff = Timenow - dt.d_datetime;
35 pkt->p_idel = alloc(n = ((dt.d_serial + 1) * sizeof(*pkt->p_idel)));
36 bzero(pkt->p_idel,n);
37 pkt->p_apply = alloc(n = ((dt.d_serial + 1) * sizeof(*pkt->p_apply)));
38 bzero(pkt->p_apply,n);
39 pkt->p_idel->i_pred = dt.d_serial;
40 }
41 if (dt.d_type == 'D') {
42 if (sidp && eqsid(&dt.d_sid,sidp)) {
43 copy(dt.d_pgmr,Pgmr); /* for rmchg */
44 bzero(sidp,sizeof(*sidp));
45 founddel = 1;
46 First_esc = 1;
47 for (p = pkt->p_line; *p && *p != 'D'; p++)
48 ;
49 if (*p)
50 *p = type;
51 }
52 else
53 First_esc = founddel = 0;
54 pkt->p_maxr = max(pkt->p_maxr,dt.d_sid.s_rel);
55 rdp = &pkt->p_idel[dt.d_serial];
56 rdp->i_sid.s_rel = dt.d_sid.s_rel;
57 rdp->i_sid.s_lev = dt.d_sid.s_lev;
58 rdp->i_sid.s_br = dt.d_sid.s_br;
59 rdp->i_sid.s_seq = dt.d_sid.s_seq;
60 rdp->i_pred = dt.d_pred;
61 rdp->i_datetime = dt.d_datetime;
62 }
63 while ((n = getline(pkt)) != NULL)
64 if (pkt->p_line[0] != CTLCHAR)
65 break;
66 else {
67 switch (pkt->p_line[1]) {
68 case EDELTAB:
69 break;
70 case COMMENTS:
71 case MRNUM:
72 if (founddel)
73 escdodelt(pkt);
74 continue;
75 default:
76 fmterr(pkt);
77 case INCLUDE:
78 case EXCLUDE:
79 case IGNORE:
80 if (dt.d_type == 'D')
81 doixg(pkt->p_line,&rdp->i_ixg);
82 continue;
83 }
84 break;
85 }
86 if (n == NULL || pkt->p_line[0] != CTLCHAR || getline(pkt) == NULL)
87 fmterr(pkt);
88 if (pkt->p_line[0] != CTLCHAR || pkt->p_line[1] != STATS)
89 break;
90 }
91 return(pkt->p_idel);
92 }
93
94
getadel(pkt,dt)95 getadel(pkt,dt)
96 register struct packet *pkt;
97 register struct deltab *dt;
98 {
99 if (getline(pkt) == NULL)
100 fmterr(pkt);
101 return(del_ab(pkt->p_line,dt,pkt));
102 }
103
104
doixg(p,ixgp)105 doixg(p,ixgp)
106 char *p;
107 struct ixg *ixgp;
108 {
109 int *v, *ip;
110 int type, cnt;
111 struct ixg *cur, *prev;
112 char buf[BUFSIZ];
113
114 v = ip = (int *)buf;
115 ++p;
116 type = *p++;
117 NONBLANK(p);
118 while (numeric(*p)) {
119 p = satoi(p,ip++);
120 NONBLANK(p);
121 }
122 cnt = ip - v;
123 for (cur = ixgp; cur = (prev = cur)->i_next; )
124 ;
125 prev->i_next = cur = alloc(sizeof(*cur) + (cnt - 1) * sizeof(cur->i_ser[0]));
126 cur->i_next = 0;
127 cur->i_type = type;
128 cur->i_cnt = cnt;
129 bcopy(v,cur->i_ser,cnt * sizeof(cur->i_ser[0]));
130 }
131