Changeset View
Changeset View
Standalone View
Standalone View
usr.bin/bsdiff/bspatch/bspatch.c
Show All 27 Lines | |||||
__FBSDID("$FreeBSD$"); | __FBSDID("$FreeBSD$"); | ||||
#include <bzlib.h> | #include <bzlib.h> | ||||
#include <stdlib.h> | #include <stdlib.h> | ||||
#include <stdio.h> | #include <stdio.h> | ||||
#include <string.h> | #include <string.h> | ||||
#include <err.h> | #include <err.h> | ||||
#include <unistd.h> | #include <unistd.h> | ||||
#include <fcntl.h> | #include <fcntl.h> | ||||
oshogbo: Maybe:
#include <bzlib.h>
#include <err.h>
#include <fcntl.h>
#include <stdio.h>
#include… | |||||
#ifndef O_BINARY | #ifndef O_BINARY | ||||
#define O_BINARY 0 | #define O_BINARY 0 | ||||
#endif | #endif | ||||
static off_t offtin(u_char *buf) | static off_t offtin(u_char *buf) | ||||
{ | { | ||||
off_t y; | off_t y; | ||||
y=buf[7]&0x7F; | y = buf[7] & 0x7F; | ||||
y=y*256;y+=buf[6]; | y = y * 256; y += buf[6]; | ||||
y=y*256;y+=buf[5]; | y = y * 256; y += buf[5]; | ||||
y=y*256;y+=buf[4]; | y = y * 256; y += buf[4]; | ||||
y=y*256;y+=buf[3]; | y = y * 256; y += buf[3]; | ||||
y=y*256;y+=buf[2]; | y = y * 256; y += buf[2]; | ||||
y=y*256;y+=buf[1]; | y = y * 256; y += buf[1]; | ||||
y=y*256;y+=buf[0]; | y = y * 256; y += buf[0]; | ||||
if(buf[7]&0x80) y=-y; | if (buf[7] & 0x80) | ||||
y = -y; | |||||
return y; | return y; | ||||
Not Done Inline Actionsreturn (y); oshogbo: return (y); | |||||
} | } | ||||
static void | static void | ||||
usage(void) | usage(void) | ||||
{ | { | ||||
fprintf(stderr, "usage: bspatch oldfile newfile patchfile\n"); | fprintf(stderr, "usage: bspatch oldfile newfile patchfile\n"); | ||||
exit(1); | exit(1); | ||||
} | } | ||||
int main(int argc,char * argv[]) | int main(int argc, char *argv[]) | ||||
{ | { | ||||
FILE * f, * cpf, * dpf, * epf; | FILE * f, * cpf, * dpf, * epf; | ||||
Not Done Inline ActionsI know that is not direct connected by maybe: FILE *f, *cpf, *dpf, *epf; oshogbo: I know that is not direct connected by maybe:
FILE *f, *cpf, *dpf, *epf;
BZFILE *cpfbz2… | |||||
BZFILE * cpfbz2, * dpfbz2, * epfbz2; | BZFILE * cpfbz2, * dpfbz2, * epfbz2; | ||||
int cbz2err, dbz2err, ebz2err; | int cbz2err, dbz2err, ebz2err; | ||||
int fd; | int newfd, oldfd; | ||||
ssize_t oldsize,newsize; | ssize_t oldsize, newsize; | ||||
ssize_t bzctrllen,bzdatalen; | ssize_t bzctrllen, bzdatalen; | ||||
u_char header[32],buf[8]; | u_char header[32], buf[8]; | ||||
u_char *old, *new; | u_char *old, *new; | ||||
off_t oldpos,newpos; | off_t oldpos, newpos; | ||||
off_t ctrl[3]; | off_t ctrl[3]; | ||||
off_t lenread; | off_t lenread; | ||||
off_t i; | off_t i; | ||||
if (argc != 4) | if (argc != 4) | ||||
usage(); | usage(); | ||||
/* Open patch file */ | /* Open patch file */ | ||||
Show All 21 Lines | if (fread(header, 1, 32, f) < 32) { | ||||
err(1, "fread(%s)", argv[3]); | err(1, "fread(%s)", argv[3]); | ||||
} | } | ||||
/* Check for appropriate magic */ | /* Check for appropriate magic */ | ||||
if (memcmp(header, "BSDIFF40", 8) != 0) | if (memcmp(header, "BSDIFF40", 8) != 0) | ||||
errx(1, "Corrupt patch\n"); | errx(1, "Corrupt patch\n"); | ||||
/* Read lengths from header */ | /* Read lengths from header */ | ||||
bzctrllen=offtin(header+8); | bzctrllen =o fftin(header + 8); | ||||
allanjudeUnsubmitted Not Done Inline Actionsspace in the wrong position allanjude: space in the wrong position | |||||
bzdatalen=offtin(header+16); | bzdatalen = offtin(header + 16); | ||||
newsize=offtin(header+24); | newsize = offtin(header + 24); | ||||
if((bzctrllen<0) || (bzdatalen<0) || (newsize<0)) | if ((bzctrllen < 0) || (bzdatalen < 0) || (newsize < 0)) | ||||
errx(1,"Corrupt patch\n"); | errx(1, "Corrupt patch\n"); | ||||
/* Close patch file and re-open it via libbzip2 at the right places */ | /* Close patch file and re-open it via libbzip2 at the right places */ | ||||
if (fclose(f)) | if (fclose(f)) | ||||
err(1, "fclose(%s)", argv[3]); | err(1, "fclose(%s)", argv[3]); | ||||
if ((cpf = fopen(argv[3], "rb")) == NULL) | if ((cpf = fopen(argv[3], "rb")) == NULL) | ||||
err(1, "fopen(%s)", argv[3]); | err(1, "fopen(%s)", argv[3]); | ||||
if (fseeko(cpf, 32, SEEK_SET)) | if (fseeko(cpf, 32, SEEK_SET)) | ||||
err(1, "fseeko(%s, %lld)", argv[3], | err(1, "fseeko(%s, %lld)", argv[3], | ||||
Show All 10 Lines | int main(int argc, char *argv[]) | ||||
if ((epf = fopen(argv[3], "rb")) == NULL) | if ((epf = fopen(argv[3], "rb")) == NULL) | ||||
err(1, "fopen(%s)", argv[3]); | err(1, "fopen(%s)", argv[3]); | ||||
if (fseeko(epf, 32 + bzctrllen + bzdatalen, SEEK_SET)) | if (fseeko(epf, 32 + bzctrllen + bzdatalen, SEEK_SET)) | ||||
err(1, "fseeko(%s, %lld)", argv[3], | err(1, "fseeko(%s, %lld)", argv[3], | ||||
(long long)(32 + bzctrllen + bzdatalen)); | (long long)(32 + bzctrllen + bzdatalen)); | ||||
if ((epfbz2 = BZ2_bzReadOpen(&ebz2err, epf, 0, 0, NULL, 0)) == NULL) | if ((epfbz2 = BZ2_bzReadOpen(&ebz2err, epf, 0, 0, NULL, 0)) == NULL) | ||||
errx(1, "BZ2_bzReadOpen, bz2err = %d", ebz2err); | errx(1, "BZ2_bzReadOpen, bz2err = %d", ebz2err); | ||||
if(((fd=open(argv[1],O_RDONLY|O_BINARY,0))<0) || | oldfd = open(argv[1], O_RDONLY | O_BINARY, 0); | ||||
((oldsize=lseek(fd,0,SEEK_END))==-1) || | if (oldfd < 0) | ||||
err(1, "%s", argv[1]); | |||||
if (((oldsize = lseek(oldfd, 0, SEEK_END)) == -1) || | |||||
emasteAuthorUnsubmitted Not Done Inline Actionsthis change (and a similar one for newfd) is not specifically a style(9) change but is a small refactoring also to reduce later capsicum changes emaste: this change (and a similar one for newfd) is not specifically a style(9) change but is a small… | |||||
((old=malloc(oldsize+1))==NULL) || | ((old = malloc(oldsize+1)) == NULL) || | ||||
(lseek(fd,0,SEEK_SET)!=0) || | (lseek(oldfd, 0, SEEK_SET) != 0) || | ||||
(read(fd,old,oldsize)!=oldsize) || | (read(oldfd, old, oldsize) != oldsize) || | ||||
(close(fd)==-1)) err(1,"%s",argv[1]); | (close(oldfd) == -1)) | ||||
if((new=malloc(newsize+1))==NULL) err(1,NULL); | err(1, "%s", argv[1]); | ||||
if ((new = malloc(newsize + 1)) == NULL) | |||||
err(1, NULL); | |||||
oldpos=0;newpos=0; | oldpos = 0; | ||||
newpos = 0; | |||||
while(newpos<newsize) { | while (newpos < newsize) { | ||||
/* Read control data */ | /* Read control data */ | ||||
for(i=0;i<=2;i++) { | for (i = 0; i <= 2; i++) { | ||||
lenread = BZ2_bzRead(&cbz2err, cpfbz2, buf, 8); | lenread = BZ2_bzRead(&cbz2err, cpfbz2, buf, 8); | ||||
if ((lenread < 8) || ((cbz2err != BZ_OK) && | if ((lenread < 8) || ((cbz2err != BZ_OK) && | ||||
(cbz2err != BZ_STREAM_END))) | (cbz2err != BZ_STREAM_END))) | ||||
errx(1, "Corrupt patch\n"); | errx(1, "Corrupt patch\n"); | ||||
ctrl[i]=offtin(buf); | ctrl[i] = offtin(buf); | ||||
} | } | ||||
/* Sanity-check */ | /* Sanity-check */ | ||||
if ((ctrl[0] < 0) || (ctrl[1] < 0)) | if ((ctrl[0] < 0) || (ctrl[1] < 0)) | ||||
errx(1,"Corrupt patch\n"); | errx(1, "Corrupt patch\n"); | ||||
/* Sanity-check */ | /* Sanity-check */ | ||||
if(newpos+ctrl[0]>newsize) | if (newpos + ctrl[0] > newsize) | ||||
errx(1,"Corrupt patch\n"); | errx(1, "Corrupt patch\n"); | ||||
/* Read diff string */ | /* Read diff string */ | ||||
lenread = BZ2_bzRead(&dbz2err, dpfbz2, new + newpos, ctrl[0]); | lenread = BZ2_bzRead(&dbz2err, dpfbz2, new + newpos, ctrl[0]); | ||||
if ((lenread < ctrl[0]) || | if ((lenread < ctrl[0]) || | ||||
((dbz2err != BZ_OK) && (dbz2err != BZ_STREAM_END))) | ((dbz2err != BZ_OK) && (dbz2err != BZ_STREAM_END))) | ||||
errx(1, "Corrupt patch\n"); | errx(1, "Corrupt patch\n"); | ||||
/* Add old data to diff string */ | /* Add old data to diff string */ | ||||
for(i=0;i<ctrl[0];i++) | for (i = 0; i < ctrl[0]; i++) | ||||
if((oldpos+i>=0) && (oldpos+i<oldsize)) | if ((oldpos + i >= 0) && (oldpos + i < oldsize)) | ||||
new[newpos+i]+=old[oldpos+i]; | new[newpos + i] += old[oldpos + i]; | ||||
/* Adjust pointers */ | /* Adjust pointers */ | ||||
newpos+=ctrl[0]; | newpos += ctrl[0]; | ||||
oldpos+=ctrl[0]; | oldpos += ctrl[0]; | ||||
/* Sanity-check */ | /* Sanity-check */ | ||||
if(newpos+ctrl[1]>newsize) | if (newpos + ctrl[1] > newsize) | ||||
errx(1,"Corrupt patch\n"); | errx(1, "Corrupt patch\n"); | ||||
/* Read extra string */ | /* Read extra string */ | ||||
lenread = BZ2_bzRead(&ebz2err, epfbz2, new + newpos, ctrl[1]); | lenread = BZ2_bzRead(&ebz2err, epfbz2, new + newpos, ctrl[1]); | ||||
if ((lenread < ctrl[1]) || | if ((lenread < ctrl[1]) || | ||||
((ebz2err != BZ_OK) && (ebz2err != BZ_STREAM_END))) | ((ebz2err != BZ_OK) && (ebz2err != BZ_STREAM_END))) | ||||
errx(1, "Corrupt patch\n"); | errx(1, "Corrupt patch\n"); | ||||
/* Adjust pointers */ | /* Adjust pointers */ | ||||
newpos+=ctrl[1]; | newpos+=ctrl[1]; | ||||
oldpos+=ctrl[2]; | oldpos+=ctrl[2]; | ||||
} | } | ||||
/* Clean up the bzip2 reads */ | /* Clean up the bzip2 reads */ | ||||
BZ2_bzReadClose(&cbz2err, cpfbz2); | BZ2_bzReadClose(&cbz2err, cpfbz2); | ||||
BZ2_bzReadClose(&dbz2err, dpfbz2); | BZ2_bzReadClose(&dbz2err, dpfbz2); | ||||
BZ2_bzReadClose(&ebz2err, epfbz2); | BZ2_bzReadClose(&ebz2err, epfbz2); | ||||
if (fclose(cpf) || fclose(dpf) || fclose(epf)) | if (fclose(cpf) || fclose(dpf) || fclose(epf)) | ||||
err(1, "fclose(%s)", argv[3]); | err(1, "fclose(%s)", argv[3]); | ||||
/* Write the new file */ | /* Write the new file */ | ||||
if(((fd=open(argv[2],O_CREAT|O_TRUNC|O_WRONLY|O_BINARY,0666))<0) || | newfd = open(argv[2], O_CREAT | O_TRUNC | O_WRONLY | O_BINARY, 0666); | ||||
(write(fd,new,newsize)!=newsize) || (close(fd)==-1)) | if (newfd < 0) | ||||
err(1, "%s", argv[2]); | |||||
if (write(newfd, new, newsize) != newsize) || (close(newfd) == -1) | |||||
err(1,"%s",argv[2]); | err(1, "%s", argv[2]); | ||||
free(new); | free(new); | ||||
free(old); | free(old); | ||||
return 0; | return 0; | ||||
Not Done Inline Actionsreturn (0); oshogbo: return (0); | |||||
} | } |
Maybe:
#include <bzlib.h>
#include <err.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>