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 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 if (timediff > ONEYEAR && pkt->p_verbose) 36 fprintf(stderr,"Clock may be set wrong! (co11)\n"); 37 pkt->p_idel = alloc(n = ((dt.d_serial + 1) * sizeof(*pkt->p_idel))); 38 zero(pkt->p_idel,n); 39 pkt->p_apply = alloc(n = ((dt.d_serial + 1) * sizeof(*pkt->p_apply))); 40 zero(pkt->p_apply,n); 41 pkt->p_idel->i_pred = dt.d_serial; 42 } 43 if (dt.d_type == 'D') { 44 if (sidp && eqsid(&dt.d_sid,sidp)) { 45 copy(dt.d_pgmr,Pgmr); /* for rmchg */ 46 zero(sidp,sizeof(*sidp)); 47 founddel = 1; 48 First_esc = 1; 49 for (p = pkt->p_line; *p && *p != 'D'; p++) 50 ; 51 if (*p) 52 *p = type; 53 } 54 else 55 First_esc = founddel = 0; 56 pkt->p_maxr = max(pkt->p_maxr,dt.d_sid.s_rel); 57 rdp = &pkt->p_idel[dt.d_serial]; 58 rdp->i_sid.s_rel = dt.d_sid.s_rel; 59 rdp->i_sid.s_lev = dt.d_sid.s_lev; 60 rdp->i_sid.s_br = dt.d_sid.s_br; 61 rdp->i_sid.s_seq = dt.d_sid.s_seq; 62 rdp->i_pred = dt.d_pred; 63 rdp->i_datetime = dt.d_datetime; 64 } 65 while ((n = getline(pkt)) != NULL) 66 if (pkt->p_line[0] != CTLCHAR) 67 break; 68 else { 69 switch (pkt->p_line[1]) { 70 case EDELTAB: 71 break; 72 case COMMENTS: 73 case MRNUM: 74 if (founddel) 75 escdodelt(pkt); 76 continue; 77 default: 78 fmterr(pkt); 79 case INCLUDE: 80 case EXCLUDE: 81 case IGNORE: 82 if (dt.d_type == 'D') 83 doixg(pkt->p_line,&rdp->i_ixg); 84 continue; 85 } 86 break; 87 } 88 if (n == NULL || pkt->p_line[0] != CTLCHAR || getline(pkt) == NULL) 89 fmterr(pkt); 90 if (pkt->p_line[0] != CTLCHAR || pkt->p_line[1] != STATS) 91 break; 92 } 93 return(pkt->p_idel); 94 } 95 96 97 getadel(pkt,dt) 98 register struct packet *pkt; 99 register struct deltab *dt; 100 { 101 if (getline(pkt) == NULL) 102 fmterr(pkt); 103 return(del_ab(pkt->p_line,dt,pkt)); 104 } 105 106 107 doixg(p,ixgp) 108 char *p; 109 struct ixg *ixgp; 110 { 111 int *v, *ip; 112 int type, cnt; 113 struct ixg *cur, *prev; 114 115 v = ip = alloca(BUFSIZ); 116 ++p; 117 type = *p++; 118 NONBLANK(p); 119 while (numeric(*p)) { 120 p = satoi(p,ip++); 121 NONBLANK(p); 122 } 123 cnt = ip - v; 124 for (cur = ixgp; cur = (prev = cur)->i_next; ) 125 ; 126 prev->i_next = cur = alloc(sizeof(*cur) + (cnt - 1) * sizeof(cur->i_ser[0])); 127 cur->i_next = 0; 128 cur->i_type = type; 129 cur->i_cnt = cnt; 130 move(v,cur->i_ser,cnt * sizeof(cur->i_ser[0])); 131 } 132