172 lines
4.0 KiB
C
172 lines
4.0 KiB
C
# include "../hdr/defines.h"
|
|
|
|
extern char *fgets();
|
|
extern FILE *fdfopen();
|
|
|
|
/* routines which are shared between get and the NSE version of
|
|
* delta which does forced checkin even if no p. file present
|
|
*/
|
|
|
|
getser(pkt, defdel, hadt)
|
|
register struct packet *pkt;
|
|
char *defdel;
|
|
int hadt;
|
|
{
|
|
register struct idel *rdp;
|
|
int n, ser, def;
|
|
char *p;
|
|
|
|
def = 0;
|
|
if (pkt->p_reqsid.s_rel == 0) {
|
|
if (p = defdel)
|
|
chksid(sid_ab(p, &pkt->p_reqsid), &pkt->p_reqsid);
|
|
else {
|
|
pkt->p_reqsid.s_rel = MAX;
|
|
def = 1;
|
|
}
|
|
}
|
|
ser = 0;
|
|
|
|
if (pkt->p_reqsid.s_lev == 0) {
|
|
for (n = maxser(pkt); n; n--) {
|
|
rdp = &pkt->p_idel[n];
|
|
if ((rdp->i_sid.s_br == 0 || hadt) &&
|
|
pkt->p_reqsid.s_rel >= rdp->i_sid.s_rel &&
|
|
rdp->i_sid.s_rel > pkt->p_gotsid.s_rel) {
|
|
ser = n;
|
|
pkt->p_gotsid.s_rel = rdp->i_sid.s_rel;
|
|
}
|
|
}
|
|
}
|
|
/*
|
|
* If had '-t' keyletter and R.L SID type, find
|
|
* the youngest SID
|
|
*/
|
|
else if ((pkt->p_reqsid.s_br == 0) && hadt) {
|
|
for (n = maxser(pkt); n; n--) {
|
|
rdp = &pkt->p_idel[n];
|
|
if (rdp->i_sid.s_rel == pkt->p_reqsid.s_rel &&
|
|
rdp->i_sid.s_lev == pkt->p_reqsid.s_lev )
|
|
break;
|
|
}
|
|
ser = n;
|
|
}
|
|
else if (pkt->p_reqsid.s_br && pkt->p_reqsid.s_seq == 0) {
|
|
for (n = maxser(pkt); n; n--) {
|
|
rdp = &pkt->p_idel[n];
|
|
if (rdp->i_sid.s_rel == pkt->p_reqsid.s_rel &&
|
|
rdp->i_sid.s_lev == pkt->p_reqsid.s_lev &&
|
|
rdp->i_sid.s_br == pkt->p_reqsid.s_br)
|
|
break;
|
|
}
|
|
ser = n;
|
|
}
|
|
else {
|
|
ser = sidtoser(&pkt->p_reqsid,pkt);
|
|
}
|
|
if (ser == 0)
|
|
fatal("nonexistent sid (ge5)");
|
|
rdp = &pkt->p_idel[ser];
|
|
move(&rdp->i_sid, &pkt->p_gotsid, sizeof(pkt->p_gotsid));
|
|
if (def || (pkt->p_reqsid.s_lev == 0 && pkt->p_reqsid.s_rel == pkt->p_gotsid.s_rel))
|
|
move(&pkt->p_gotsid, &pkt->p_reqsid, sizeof(pkt->p_gotsid));
|
|
return(ser);
|
|
}
|
|
|
|
newsid(pkt,branch, joint)
|
|
register struct packet *pkt;
|
|
int branch;
|
|
int joint;
|
|
{
|
|
int chkbr;
|
|
|
|
chkbr = 0;
|
|
/* if branch value is 0 set newsid level to 1 */
|
|
if (pkt->p_reqsid.s_br == 0) {
|
|
pkt->p_reqsid.s_lev += 1;
|
|
/*
|
|
if the sid requested has been deltaed or the branch
|
|
flag was set or the requested SID exists in the p-file
|
|
then create a branch delta off of the gotten SID
|
|
*/
|
|
if (sidtoser(&pkt->p_reqsid,pkt) ||
|
|
pkt->p_maxr > pkt->p_reqsid.s_rel || branch ||
|
|
in_pfile(&pkt->p_reqsid,pkt, joint)) {
|
|
pkt->p_reqsid.s_rel = pkt->p_gotsid.s_rel;
|
|
pkt->p_reqsid.s_lev = pkt->p_gotsid.s_lev;
|
|
pkt->p_reqsid.s_br = pkt->p_gotsid.s_br + 1;
|
|
pkt->p_reqsid.s_seq = 1;
|
|
chkbr++;
|
|
}
|
|
}
|
|
/*
|
|
if a three component SID was given as the -r argument value
|
|
and the b flag is not set then up the gotten SID sequence
|
|
number by 1
|
|
*/
|
|
else if (pkt->p_reqsid.s_seq == 0 && !branch)
|
|
pkt->p_reqsid.s_seq = pkt->p_gotsid.s_seq + 1;
|
|
else {
|
|
/*
|
|
if sequence number is non-zero then increment the
|
|
requested SID sequence number by 1
|
|
*/
|
|
pkt->p_reqsid.s_seq += 1;
|
|
if (branch || sidtoser(&pkt->p_reqsid,pkt) ||
|
|
in_pfile(&pkt->p_reqsid,pkt, joint)) {
|
|
pkt->p_reqsid.s_br += 1;
|
|
pkt->p_reqsid.s_seq = 1;
|
|
chkbr++;
|
|
}
|
|
}
|
|
/*
|
|
keep checking the requested SID until a good SID to be
|
|
made is calculated or all possibilities have been tried
|
|
*/
|
|
while (chkbr) {
|
|
--chkbr;
|
|
while (in_pfile(&pkt->p_reqsid,pkt, joint)) {
|
|
pkt->p_reqsid.s_br += 1;
|
|
++chkbr;
|
|
}
|
|
while (sidtoser(&pkt->p_reqsid,pkt)) {
|
|
pkt->p_reqsid.s_br += 1;
|
|
++chkbr;
|
|
}
|
|
}
|
|
if (sidtoser(&pkt->p_reqsid,pkt) ||
|
|
in_pfile(&pkt->p_reqsid,pkt, joint))
|
|
fatal("bad SID calculated in newsid()");
|
|
}
|
|
|
|
in_pfile(sp,pkt, joint)
|
|
struct sid *sp;
|
|
struct packet *pkt;
|
|
int joint;
|
|
{
|
|
struct pfile pf;
|
|
char line[BUFSIZ];
|
|
char *p;
|
|
FILE *in;
|
|
|
|
if (joint) {
|
|
if (exists(auxf(pkt->p_file,'p'))) {
|
|
in = xfopen(auxf(pkt->p_file,'p'),0);
|
|
while ((p = fgets(line,sizeof(line),in)) != NULL) {
|
|
p[length(p) - 1] = 0;
|
|
pf_ab(p,&pf,0);
|
|
if (pf.pf_nsid.s_rel == sp->s_rel &&
|
|
pf.pf_nsid.s_lev == sp->s_lev &&
|
|
pf.pf_nsid.s_br == sp->s_br &&
|
|
pf.pf_nsid.s_seq == sp->s_seq) {
|
|
fclose(in);
|
|
return(1);
|
|
}
|
|
}
|
|
fclose(in);
|
|
}
|
|
else return(0);
|
|
}
|
|
else return(0);
|
|
}
|