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 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 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 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