/* .c -- Binary patcher Copyright 2003,2004 Colin Percival For the terms under which this work may be distributed, please see the adjoining file "LICENSE". */ #ifndef BZIP2 #define BZIP2 "/usr/bin/bzip2" #endif #include #include #include #include #include #include ssize_t loopread(int d,void *buf,size_t nbytes) { ssize_t ptr,lenread; for(ptr=0;ptrnewsize) errx(1,"Corrupt patch\n"); if((lenread=loopread(diffpipe,new+newpos,ctrl[0]))<0) err(1,NULL); if(lenread!=ctrl[0]) errx(1,"Corrupt patch\n"); for(i=0;i=0) && (oldpos+inewsize) errx(1,"Corrupt patch\n"); if((lenread=loopread(extrapipe,new+newpos,ctrl[1]))<0) err(1,NULL); if(lenread!=ctrl[1]) errx(1,"Corrupt patch\n"); newpos+=ctrl[1]; oldpos+=ctrl[2]; }; }; if(loopread(ctrlpipe,buf,1)!=0) errx(1,"Corrupt patch\n"); if(loopread(diffpipe,buf,1)!=0) errx(1,"Corrupt patch\n"); if(version==2) if(loopread(extrapipe,buf,1)!=0) errx(1,"Corrupt patch\n"); if(close(ctrlpipe) || close(diffpipe) || ((version==2) && close(extrapipe))) err(1,NULL); for(i=0;i<(version+1)*2;i++) waitpid(pids[i],NULL,0); if(((fd=open(argv[2],O_CREAT|O_TRUNC|O_WRONLY,0666))<0) || (write(fd,new,newsize)!=newsize) || (close(fd)==-1)) err(1,"%s",argv[2]); free(new); free(old); return 0; }