# include "../hdr/defines.h" SCCSID(@(#)putline 2.1.1.1); /* Routine to write out either the current line in the packet (if newline is zero) or the line specified by newline. A line is actually written (and the x-file is only opened) if pkt->p_upd is non-zero. When the current line from the packet is written, pkt->p_wrttn is set non-zero, and further attempts to write it are ignored. When a line is read into the packet, pkt->p_wrttn must be turned off. */ int Xcreate; FILE *Xiop; putline(pkt,newline) register struct packet *pkt; char *newline; { static char obf[BUFSIZ]; char *xf; register char *p; if(pkt->p_upd == 0) return; if(!Xcreate) { stat(pkt->p_file,&Statbuf); xf = auxf(pkt->p_file,'x'); Xiop = xfcreat(xf,Statbuf.st_mode); setbuf(Xiop,obf); chown(xf,Statbuf.st_uid,Statbuf.st_gid); } if (newline) p = newline; else { if(!pkt->p_wrttn++) p = pkt->p_line; else p = 0; } if (p) { fputs(p,Xiop); if (Xcreate) while (*p) pkt->p_nhash =+ *p++; } Xcreate = 1; } flushline(pkt,stats) register struct packet *pkt; register struct stats *stats; { register char *p; char ins[6], del[6], unc[6], hash[6]; if (pkt->p_upd == 0) return; putline(pkt,0); rewind(Xiop); if (stats) { sprintf(ins,"%05u",stats->s_ins); sprintf(del,"%05u",stats->s_del); sprintf(unc,"%05u",stats->s_unc); for (p = ins; *p; p++) pkt->p_nhash =+ (*p - '0'); for (p = del; *p; p++) pkt->p_nhash =+ (*p - '0'); for (p = unc; *p; p++) pkt->p_nhash =+ (*p - '0'); } sprintf(hash,"%5u",pkt->p_nhash&0xFFFF); zeropad(hash); fprintf(Xiop,"%c%c%s\n",CTLCHAR,HEAD,hash); if (stats) fprintf(Xiop,"%c%c %s/%s/%s\n",CTLCHAR,STATS,ins,del,unc); fclose(Xiop); } xrm(pkt) struct packet *pkt; { if (Xiop) fclose(Xiop); Xiop = Xcreate = 0; }