Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
openSUSE:Evergreen:11.1:kernel-2.6.32
deltarpm
deltarpm.lzma.diff
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File deltarpm.lzma.diff of Package deltarpm
diff -ur Makefile.orig Makefile --- Makefile.orig 2007-03-06 14:35:55.000000000 +0100 +++ Makefile 2008-04-22 13:39:58.000000000 +0200 @@ -5,7 +5,7 @@ zlibdir=zlib-1.2.2.f-rsyncable CFLAGS = -O2 -Wall CPPFLAGS = -DDELTARPM_64BIT -DBSDIFF_NO_SUF -DRPMDUMPHEADER=\"$(rpmdumpheader)\" -I$(zlibdir) -LDLIBS = -lbz2 $(zlibdir)/libz.a +LDLIBS = -lbz2 $(zlibdir)/libz.a -llzma LDFLAGS = all: makedeltarpm applydeltarpm rpmdumpheader makedeltaiso applydeltaiso combinedeltarpm fragiso @@ -19,7 +19,7 @@ rpmdumpheader: rpmdumpheader.o $(CC) $(LDFLAGS) $^ -lrpm -o $@ -makedeltaiso: makedeltaiso.o delta.o rpmoffs.o util.o md5.o cfile.o $(zlibdir)/libz.a +makedeltaiso: makedeltaiso.o delta.o rpmoffs.o rpmhead.o util.o md5.o cfile.o $(zlibdir)/libz.a applydeltaiso: applydeltaiso.o util.o md5.o cfile.o $(zlibdir)/libz.a diff -ur applydeltaiso.c.orig applydeltaiso.c --- applydeltaiso.c.orig 2005-06-13 19:53:20.000000000 +0200 +++ applydeltaiso.c 2008-04-22 13:56:15.000000000 +0200 @@ -10,9 +10,11 @@ #include <stdio.h> #include <string.h> #include <stdlib.h> +#include <stdint.h> #include <zlib.h> #include <bzlib.h> +#include <lzma.h> #include "util.h" #include "md5.h" @@ -73,18 +75,6 @@ void applydelta(FILE *fpold, struct cfile *ocf, struct cfile *cf, unsigned char *outdata, unsigned int outlen, unsigned int *nmp, int nmpn); -char * -comp2str(int comp) -{ - if (comp == CFILE_COMP_UN) - return "uncomp."; - if (comp == CFILE_COMP_GZ) - return "gzip"; - if (comp == CFILE_COMP_BZ) - return "bzip"; - return "???"; -} - void processrpm(FILE *fpold, struct cfile *ocf, struct cfile *cf, unsigned int *nmp, int nmpn) { @@ -102,6 +92,8 @@ exit(1); } ctype = namebuf[0]; + if (ctype < 254) + ctype = CFILE_MKCOMP(ctype & 15, ctype >> 4); i = namebuf[1]; if (cf->read(cf, namebuf, i) != i) { @@ -136,7 +128,7 @@ if (ctype == 254) printf("%s: copying unchanged payload\n", namebuf); else - printf("%s (%s): applying delta\n", namebuf, comp2str(ctype)); + printf("%s (%s): applying delta\n", namebuf, cfile_comp2str(ctype)); rpmn = cget4(cf); if (rpmn < 0 || rpmn >= nmpn) { diff -ur applydeltarpm.c.orig applydeltarpm.c --- applydeltarpm.c.orig 2007-03-06 14:35:16.000000000 +0100 +++ applydeltarpm.c 2008-04-22 14:47:29.000000000 +0200 @@ -21,6 +21,7 @@ #include <bzlib.h> #include <zlib.h> +#include <lzma.h> #include "util.h" #include "md5.h" @@ -936,19 +937,6 @@ return b; } -char *comp2str(int comp) -{ - if (comp == CFILE_COMP_BZ) - return "bzip2"; - if (comp == CFILE_COMP_GZ) - return "gzip"; - if (comp == CFILE_COMP_GZ_RSYNC) - return "gzip rsyncable"; - if (comp == CFILE_COMP_UN) - return "uncompressed"; - return "???"; -} - int cfile_write_uncomp(struct cfile *f, void *buf, int len) { @@ -1252,13 +1240,15 @@ addblkcomp = CFILE_COMP_BZ; if (d.addblklen > 9 && d.addblk[0] == 0x1f && d.addblk[1] == 0x8b) addblkcomp = CFILE_COMP_GZ; + else if (d.addblklen > 3 && (d.addblk[0] == 255 && d.addblk[1] == 'L' && d.addblk[2] == 'Z')) + addblkcomp = CFILE_COMP_LZMA; if (info) { unsigned int *size; if (d.version) printf("deltarpm version: %c\n", d.version & 0xff); printf("deltarpm type: %s\n", d.h ? "standard" : d.targetcomp != CFILE_COMP_UN || d.inn != 0 || d.outn != 0 ? "rpm-only" : "rpm-only, no diff"); - printf("deltarpm compression: %s\n", comp2str(d.deltacomp)); + printf("deltarpm compression: %s\n", cfile_comp2str(d.deltacomp)); printf("sequence: %s-", d.nevr); for (i = 0; i < d.seql; i++) printf("%02x", d.seq[i]); @@ -1271,7 +1261,7 @@ { printf("target payload size: %llu\n", (unsigned long long)d.paylen); if (d.targetcomp != CFILE_COMP_XX) - printf("target payload compression: %s\n", comp2str(d.targetcomp)); + printf("target payload compression: %s\n", cfile_comp2str(d.targetcomp)); } if (d.targetsize == 0) { @@ -1294,7 +1284,7 @@ printf("internal data size: %llu\n", (unsigned long long)d.inlen); printf("compressed add data size: %d\n", d.addblklen); if (d.addblklen) - printf("compressed add data compression: %s\n", comp2str(addblkcomp)); + printf("compressed add data compression: %s\n", cfile_comp2str(addblkcomp)); printf("instructions: %d\n", d.inn + d.outn); } if (bfp) diff -ur cfile.c.orig cfile.c --- cfile.c.orig 2005-09-29 15:44:19.000000000 +0200 +++ cfile.c 2008-04-22 14:29:25.000000000 +0200 @@ -8,10 +8,12 @@ #include <stdio.h> #include <string.h> #include <stdlib.h> +#include <stdint.h> #include <unistd.h> #include <zlib.h> #include <bzlib.h> +#include <lzma.h> #include "cfile.h" @@ -274,11 +276,11 @@ { int r; BZ2_bzDecompressEnd(&f->strm.bz); - if (f->fd == CFILE_IO_CFILE && f->strm.gz.avail_in) + if (f->fd == CFILE_IO_CFILE && f->strm.bz.avail_in) { struct cfile *cf = (struct cfile *)f->fp; - if (cf->unread(cf, f->strm.gz.next_in, f->strm.gz.avail_in) != -1) - f->strm.gz.avail_in = 0; + if (cf->unread(cf, f->strm.bz.next_in, f->strm.bz.avail_in) != -1) + f->strm.bz.avail_in = 0; } r = (f->len != CFILE_LEN_UNLIMITED ? f->len : 0) + f->strm.bz.avail_in; if (f->unreadbuf != f->buf) @@ -357,7 +359,9 @@ static struct cfile * cwopen_bz(struct cfile *f) { - if (BZ2_bzCompressInit(&f->strm.bz, 9, 0, 30) != BZ_OK) + if (!f->level) + f->level = 9; + if (BZ2_bzCompressInit(&f->strm.bz, f->level, 0, 30) != BZ_OK) { free(f); return 0; @@ -605,13 +609,15 @@ f->crc = crc32(0L, Z_NULL, 0); f->crclen = 0; + if (!f->level) + f->level = Z_BEST_COMPRESSION; #ifdef Z_RSYNCABLE - ret = deflateInit2(&f->strm.gz, Z_BEST_COMPRESSION, Z_DEFLATED, -MAX_WBITS, 8, Z_DEFAULT_STRATEGY | (f->comp == CFILE_COMP_GZ_RSYNC ? Z_RSYNCABLE : 0)); + ret = deflateInit2(&f->strm.gz, f->level, Z_DEFLATED, -MAX_WBITS, 8, Z_DEFAULT_STRATEGY | (f->comp == CFILE_COMP_GZ_RSYNC ? Z_RSYNCABLE : 0)); #else if (f->comp == CFILE_COMP_GZ_RSYNC) ret = Z_VERSION_ERROR; else - ret = deflateInit2(&f->strm.gz, Z_BEST_COMPRESSION, Z_DEFLATED, -MAX_WBITS, 8, Z_DEFAULT_STRATEGY); + ret = deflateInit2(&f->strm.gz, f->level, Z_DEFLATED, -MAX_WBITS, 8, Z_DEFAULT_STRATEGY); #endif if (ret != Z_OK) { @@ -642,6 +648,159 @@ return cfile_unreadbuf(f, buf, len, 0); } + +/***************************************************************** + * lzma io + */ + +static struct cfile * +cropen_lz(struct cfile *f) +{ + f->strm.lz = LZMA_STREAM_INIT_VAR; + if (lzma_auto_decoder(&f->strm.lz, 0, 0) != LZMA_OK) + { + free(f); + return 0; + } + f->eof = 0; + f->strm.lz.avail_in = f->bufN == -1 ? 0 : f->bufN; + f->strm.lz.next_in = (unsigned char *)f->buf; + return f; +} + +static int +crread_lz(struct cfile *f, void *buf, int len) +{ + int ret, used; + if (f->eof) + return 0; + f->strm.lz.avail_out = len; + f->strm.lz.next_out = buf; + for (;;) + { + if (f->strm.lz.avail_in == 0 && f->bufN) + { + if (cfile_readbuf(f, f->buf, sizeof(f->buf)) == -1) + return -1; + f->strm.lz.avail_in = f->bufN; + f->strm.lz.next_in = (unsigned char *)f->buf; + } + used = f->strm.lz.avail_in; + ret = lzma_code(&f->strm.lz, LZMA_RUN); + if (ret != LZMA_OK && ret != LZMA_STREAM_END) + return -1; + used -= f->strm.lz.avail_in; + if (used && f->ctxup) + f->ctxup(f->ctx, (unsigned char *)(f->strm.lz.next_in - used), used); + f->bytes += used; + if (ret == LZMA_STREAM_END) + { + f->eof = 1; + return len - f->strm.lz.avail_out; + } + if (f->strm.lz.avail_out == 0) + return len; + if (f->bufN == 0) + return -1; + } +} + +static int +crclose_lz(struct cfile *f) +{ + int r; + lzma_end(&f->strm.lz); + if (f->fd == CFILE_IO_CFILE && f->strm.lz.avail_in) + { + struct cfile *cf = (struct cfile *)f->fp; + if (cf->unread(cf, (void *)f->strm.lz.next_in, f->strm.lz.avail_in) != -1) + f->strm.lz.avail_in = 0; + } + r = (f->len != CFILE_LEN_UNLIMITED ? f->len : 0) + f->strm.lz.avail_in; + if (f->unreadbuf != f->buf) + free(f->unreadbuf); + free(f); + return r; +} + +static struct cfile * +cwopen_lz(struct cfile *f) +{ + lzma_options_alone alone; + + if (!f->level) + f->level = 3; + lzma_init_encoder(); + f->strm.lz = LZMA_STREAM_INIT_VAR; + alone.uncompressed_size = LZMA_VLI_VALUE_UNKNOWN; + memcpy(&alone.lzma, &lzma_preset_lzma[f->level - 1], sizeof(alone.lzma)); + if (lzma_alone_encoder(&f->strm.lz, &alone) != LZMA_OK) + { + free(f); + return 0; + } + return f; +} + +static int +cwclose_lz(struct cfile *f) +{ + int bytes, ret, n; + f->strm.lz.avail_in = 0; + f->strm.lz.next_in = 0; + for (;;) + { + f->strm.lz.avail_out = sizeof(f->buf); + f->strm.lz.next_out = (unsigned char *)f->buf; + ret = lzma_code(&f->strm.lz, LZMA_FINISH); + if (ret != LZMA_OK && ret != LZMA_STREAM_END) + return -1; + n = sizeof(f->buf) - f->strm.lz.avail_out; + if (n > 0) + if (cfile_writebuf(f, f->buf, n) != n) + return -1; + if (ret == LZMA_STREAM_END) + break; + } + lzma_end(&f->strm.lz); + if (f->fd == CFILE_IO_ALLOC) + cwclose_fixupalloc(f); + bytes = f->bytes; + free(f); + return bytes; +} + +static int +cwwrite_lz(struct cfile *f, void *buf, int len) +{ + int n, ret; + + if (len <= 0) + return len < 0 ? -1 : 0; + f->strm.lz.avail_in = len; + f->strm.lz.next_in = buf; + for (;;) + { + f->strm.lz.avail_out = sizeof(f->buf); + f->strm.lz.next_out = (unsigned char *)f->buf; + ret = lzma_code(&f->strm.lz, LZMA_RUN); + if (ret != LZMA_OK) + return -1; + n = sizeof(f->buf) - f->strm.lz.avail_out; + if (n > 0) + if (cfile_writebuf(f, f->buf, n) != n) + return -1; + if (f->strm.lz.avail_in == 0) + return len; + } +} + +static int +crunread_lz(struct cfile *f, void *buf, int len) +{ + return cfile_unreadbuf(f, buf, len, 0); +} + /***************************************************************** * uncompressed io */ @@ -939,10 +1098,15 @@ comp = CFILE_COMP_BZ; else if (f->buf[0] == 0x1f && f->buf[1] == 0x8b) comp = CFILE_COMP_GZ; + else if (f->buf[0] == 255 && f->buf[1] == 'L' && f->buf[2] == 'Z') + comp = CFILE_COMP_LZMA; + else if (f->buf[0] == 0135 && f->buf[1] == 0 && f->buf[2] == 0) + comp = CFILE_COMP_LZMA; } } - f->comp = comp; - switch (comp) + f->comp = CFILE_COMPALGO(comp); + f->level = CFILE_COMPLEVEL(comp); + switch (f->comp) { case CFILE_COMP_UN: f->read = mode == CFILE_OPEN_RD ? crread_un : 0; @@ -969,6 +1133,14 @@ f->write = mode == CFILE_OPEN_WR ? cwwrite_bz : 0; f->close = mode == CFILE_OPEN_RD ? crclose_bz : cwclose_bz; return mode == CFILE_OPEN_RD ? cropen_bz(f) : cwopen_bz(f); + case CFILE_COMP_LZMA: + f->strm.lz.allocator = 0; + f->strm.lz.internal = 0; + f->read = mode == CFILE_OPEN_RD ? crread_lz : 0; + f->unread = mode == CFILE_OPEN_RD ? crunread_lz : 0; + f->write = mode == CFILE_OPEN_WR ? cwwrite_lz : 0; + f->close = mode == CFILE_OPEN_RD ? crclose_lz : cwclose_lz; + return mode == CFILE_OPEN_RD ? cropen_lz(f) : cwopen_lz(f); default: free(f); return 0; @@ -1010,3 +1182,48 @@ } return l; } + +char * +cfile_comp2str(int comp) +{ + if (CFILE_COMPLEVEL(comp)) + { + static char buf[64]; + sprintf(buf, "%s.%d", cfile_comp2str(CFILE_COMPALGO(comp)), CFILE_COMPLEVEL(comp)); + return buf; + } + switch (comp) + { + case CFILE_COMP_UN: + return "uncomp."; + case CFILE_COMP_GZ: + return "gzip"; + case CFILE_COMP_GZ_RSYNC: + return "gzip rsyncable"; + case CFILE_COMP_BZ: + return "bzip"; + case CFILE_COMP_LZMA: + return "lzma"; + } + return "???"; +} + +int +cfile_setlevel(int comp, int level) +{ + int deflevel = 0; + comp = CFILE_COMPALGO(comp); + switch(comp) + { + case CFILE_COMP_GZ: + case CFILE_COMP_GZ_RSYNC: + case CFILE_COMP_BZ: + deflevel = 9; + break; + default: + break; + } + if (level == 0 || level == deflevel) + return comp; + return CFILE_MKCOMP(comp, level); +} diff -ur cfile.h.orig cfile.h --- cfile.h.orig 2005-06-21 15:13:40.000000000 +0200 +++ cfile.h 2008-04-22 12:06:14.000000000 +0200 @@ -9,6 +9,7 @@ int fd; void *fp; int comp; + int level; size_t len; unsigned char buf[4096]; int bufN; @@ -23,6 +24,7 @@ union { bz_stream bz; z_stream gz; + lzma_stream lz; } strm; int (*read)(struct cfile *f, void *buf, int len); int (*write)(struct cfile *f, void *buf, int len); @@ -45,8 +47,16 @@ #define CFILE_COMP_XX (255) #define CFILE_COMP_UN (0) #define CFILE_COMP_GZ (1) -#define CFILE_COMP_BZ (2) +#define CFILE_COMP_BZ_20 (2) #define CFILE_COMP_GZ_RSYNC (3) +#define CFILE_COMP_BZ_17 (4) +#define CFILE_COMP_LZMA (5) + +#define CFILE_COMP_BZ CFILE_COMP_BZ_20 + +#define CFILE_MKCOMP(comp, level) ((comp) | ((level) << 8)) +#define CFILE_COMPALGO(comp) ((comp) & 255) +#define CFILE_COMPLEVEL(comp) ((comp) >> 8 & 255) #define CFILE_OPEN_RD ('r') #define CFILE_OPEN_WR ('w') @@ -64,3 +74,5 @@ struct cfile *cfile_open(int mode, int fd, void *fp, int comp, size_t len, void (*ctxup)(void *, unsigned char *, unsigned int), void *ctx); int cfile_copy(struct cfile *in, struct cfile *out, int flags); int cfile_detect_rsync(struct cfile *f); +char *cfile_comp2str(int comp); +int cfile_setlevel(int comp, int level); diff -ur combinedeltarpm.c.orig combinedeltarpm.c --- combinedeltarpm.c.orig 2007-03-06 14:35:55.000000000 +0100 +++ combinedeltarpm.c 2008-04-22 10:40:47.000000000 +0200 @@ -14,6 +14,7 @@ #include <bzlib.h> #include <zlib.h> +#include <lzma.h> #include <sys/stat.h> #include "util.h" @@ -380,6 +381,8 @@ if (!strcmp(comp, "gzip rsyncable")) return CFILE_COMP_GZ_RSYNC; #endif + if (!strcmp(comp, "lzma")) + return CFILE_COMP_LZMA; if (!strcmp(comp, "uncompressed")) return CFILE_COMP_UN; fprintf(stderr, "unknown compression type: %s\n", comp); diff -ur fragiso.c.orig fragiso.c --- fragiso.c.orig 2007-03-06 14:35:55.000000000 +0100 +++ fragiso.c 2008-04-22 13:37:17.000000000 +0200 @@ -10,9 +10,11 @@ #include <stdio.h> #include <string.h> #include <stdlib.h> +#include <stdint.h> #include <unistd.h> #include <zlib.h> +#include <lzma.h> #include <bzlib.h> #include "rpmhead.h" @@ -212,7 +214,7 @@ fprintf(stderr, "bad rpm (bad h): %s\n", name); exit(1); } - /* ok, all header are read in, extrac information */ + /* ok, all header are read in, extract information */ rpmn = headstring(h, TAG_NAME); if (!rpmn) { diff -ur makedeltaiso.c.orig makedeltaiso.c --- makedeltaiso.c.orig 2005-09-30 15:52:37.000000000 +0200 +++ makedeltaiso.c 2008-04-22 14:14:32.000000000 +0200 @@ -14,6 +14,7 @@ #include <zlib.h> #include <bzlib.h> +#include <lzma.h> #include "rpmoffs.h" #include "delta.h" @@ -279,19 +280,6 @@ void diffit(struct cfile *fpout, FILE *fpold, FILE *fpnew, unsigned char *old, unsigned int oldl, unsigned char *new, int newl, struct rpmpay *newpays, int newpayn, struct rpmpay *oldpays, int oldpayn, MD5_CTX *ctx); -char *comp2str(int comp) -{ - if (comp == CFILE_COMP_UN) - return "uncomp."; - if (comp == CFILE_COMP_GZ) - return "gzip"; - if (comp == CFILE_COMP_GZ_RSYNC) - return "gzip rsyncable"; - if (comp == CFILE_COMP_BZ) - return "bzip"; - return "???"; -} - unsigned int payread(FILE *fp, off64_t off, unsigned int len, unsigned char **pp, MD5_CTX *ctx, unsigned char *namebuf) { int l, r; @@ -402,7 +390,11 @@ namebuf[0] = 254; } else - printf("%s (%s): creating delta...", namebuf + 2, comp2str(namebuf[0])); + { + int comp = cfile_setlevel(namebuf[0], pay->level); + printf("%s (%s): creating delta...", namebuf + 2, cfile_comp2str(comp)); + namebuf[0] = CFILE_COMPALGO(comp) | (CFILE_COMPLEVEL(comp) << 4); /* argh! */ + } fflush(stdout); if (fpout->write(fpout, namebuf, l + 2) != l + 2) { diff -ur makedeltarpm.c.orig makedeltarpm.c --- makedeltarpm.c.orig 2007-03-06 14:35:55.000000000 +0100 +++ makedeltarpm.c 2008-04-22 14:41:24.000000000 +0200 @@ -15,6 +15,7 @@ #include <bzlib.h> #include <zlib.h> +#include <lzma.h> #include "util.h" #include "md5.h" @@ -347,6 +348,8 @@ if (!strcmp(comp, "gzip rsyncable")) return CFILE_COMP_GZ_RSYNC; #endif + if (!strcmp(comp, "lzma")) + return CFILE_COMP_LZMA; if (!strcmp(comp, "uncompressed")) return CFILE_COMP_UN; fprintf(stderr, "unknown compression type: %s\n", comp); @@ -483,6 +486,7 @@ int paycomp = CFILE_COMP_XX; int addblkcomp = CFILE_COMP_BZ; int targetcomp = CFILE_COMP_XX; + char *payloadflags; memset(&d, 0, sizeof(d)); while ((c = getopt(argc, argv, "vV:prl:s:z:u")) != -1) @@ -685,6 +689,8 @@ targetcomp = CFILE_COMP_UN; if (paycomp == CFILE_COMP_XX) paycomp = CFILE_COMP_GZ; /* no need for better compression */ + if (addblkcomp == CFILE_COMP_XX) + addblkcomp = CFILE_COMP_GZ; d.targetsize = fullsize; d.targetcomp = targetcomp; d.targetcomppara = 0; @@ -760,8 +766,13 @@ exit(1); } targetcomp = newbz->comp; + if ((payloadflags = headstring(d.h, TAG_PAYLOADFLAGS)) != 0) + if (*payloadflags >= '1' && *payloadflags <= '9') + targetcomp = cfile_setlevel(targetcomp, *payloadflags - '0'); if (paycomp == CFILE_COMP_XX) paycomp = targetcomp; + if (addblkcomp == CFILE_COMP_XX) + addblkcomp = targetcomp; while ((l = newbz->read(newbz, buf, sizeof(buf))) > 0) addtocpio(&newcpio, &newcpiolen, (unsigned char *)buf, l); if (l < 0) @@ -1138,8 +1149,13 @@ exit(1); } targetcomp = newbz->comp; + if ((payloadflags = headstring(d.h, TAG_PAYLOADFLAGS)) != 0) + if (*payloadflags >= '1' && *payloadflags <= '9') + targetcomp = cfile_setlevel(targetcomp, *payloadflags - '0'); if (paycomp == CFILE_COMP_XX) paycomp = targetcomp; + if (addblkcomp == CFILE_COMP_XX) + addblkcomp = targetcomp; while ((l = newbz->read(newbz, buf, sizeof(buf))) > 0) addtocpio(&newcpio, &newcpiolen, (unsigned char *)buf, l); if (l < 0) diff -ur readdeltarpm.c.orig readdeltarpm.c --- readdeltarpm.c.orig 2005-06-14 15:49:21.000000000 +0200 +++ readdeltarpm.c 2008-04-22 10:42:28.000000000 +0200 @@ -14,6 +14,7 @@ #include <bzlib.h> #include <zlib.h> +#include <lzma.h> #include <sys/stat.h> #include "util.h" @@ -384,7 +385,9 @@ else { char *compressor = headstring(d->h, TAG_PAYLOADCOMPRESSOR); - if (compressor && !strcmp(compressor, "bzip2")) + if (compressor && !strcmp(compressor, "lzma")) + d->targetcomp = CFILE_COMP_LZMA; + else if (compressor && !strcmp(compressor, "bzip2")) d->targetcomp = CFILE_COMP_BZ; else d->targetcomp = CFILE_COMP_GZ; diff -ur rpmhead.h.orig rpmhead.h --- rpmhead.h.orig 2007-03-06 14:35:55.000000000 +0100 +++ rpmhead.h 2008-03-18 12:45:29.000000000 +0100 @@ -27,6 +27,7 @@ #define TAG_DIRNAMES 1118 #define TAG_PAYLOADFORMAT 1124 #define TAG_PAYLOADCOMPRESSOR 1125 +#define TAG_PAYLOADFLAGS 1126 #define SIGTAG_SIZE 1000 #define SIGTAG_MD5 1004 diff -ur rpmoffs.c.orig rpmoffs.c --- rpmoffs.c.orig 2005-05-06 22:21:28.000000000 +0200 +++ rpmoffs.c 2008-04-22 14:18:08.000000000 +0200 @@ -12,6 +12,7 @@ #include <stdlib.h> #include "rpmoffs.h" +#include "rpmhead.h" static unsigned int get4(unsigned char *p) @@ -44,7 +45,7 @@ static int rpmpayn; static void -addrpm(char *name, off64_t o, unsigned int l) +addrpm(char *name, off64_t o, unsigned int l, int level) { char *n; if ((rpmpayn & 31) == 0) @@ -70,6 +71,7 @@ rpmpays[rpmpayn].l = l; rpmpays[rpmpayn].x = 0; rpmpays[rpmpayn].lx = 0; + rpmpays[rpmpayn].level = level; rpmpayn++; } @@ -100,7 +102,7 @@ unsigned char blk2[0x800]; unsigned char name[256]; int namel; - unsigned int filepos, filelen, filepos2, hstart; + unsigned int filepos, filelen, filepos2, hoffset; unsigned char *pt, *ep; int i, j, l, nl, el, nml, nmf, hcnt, hdcnt; @@ -112,8 +114,17 @@ unsigned int ce_off; unsigned int ce_len; + unsigned char *rpmb; + int len, rpmblen, rpmbalen; + int level; + off64_t paystart; int paylen; + struct rpmhead *h; + char *payloadflags; + + rpmbalen = 0x800 * 4; + rpmb = malloc(rpmbalen); readblk(fp, blk, 16); if (memcmp(blk, "\001CD001", 6)) @@ -250,58 +261,76 @@ continue; if (filelen < 0x70 || strcmp((char *)name + namel - 4, ".rpm")) continue; - readblk(fp, blk2, filepos); + filepos2 = filepos; - if (get4(blk2) != 0xdbeeabed) + readblk(fp, rpmb, filepos2++); + rpmblen = 0x800; + if (get4(rpmb) != 0xdbeeabed) continue; - if (get4(blk2 + 0x60) != 0x01e8ad8e) + if (get4(rpmb + 0x60) != 0x01e8ad8e) { fprintf(stderr, "bad rpm (bad sigheader): %s\n", name); exit(1); } - hcnt = get4n(blk2 + 0x68); - hdcnt = get4n(blk2 + 0x6c); + hcnt = get4n(rpmb + 0x68); + hdcnt = get4n(rpmb + 0x6c); if ((hdcnt & 7) != 0) hdcnt += 8 - (hdcnt & 7); - if (0x70 + hcnt * 16 + hdcnt + 0x70 >= filelen) + len = 0x60 + 16 + hcnt * 16 + hdcnt + 16; + if (len > filelen) { fprintf(stderr, "bad rpm (no header): %s\n", name); exit(1); } - hstart = 0x70 + hcnt * 16 + hdcnt; - if (hstart >= 0x800) + while (rpmblen < len) { - filepos2 += hstart / 0x800; - readblk(fp, blk2, filepos2); - hstart &= 0x7ff; + if (rpmblen + 0x800 > rpmbalen) + { + rpmbalen += 0x800 * 4; + rpmb = realloc(rpmb, rpmbalen); + } + readblk(fp, rpmb + rpmblen, filepos2++); + rpmblen += 0x800; } - if (get4(blk2 + hstart) != 0x01e8ad8e) + hoffset = len - 16; + if (get4(rpmb + hoffset) != 0x01e8ad8e) { fprintf(stderr, "bad rpm (bad header): %s\n", name); exit(1); } - hstart += 8; - if (hstart >= 0x800) + hcnt = get4n(rpmb + hoffset + 8); + hdcnt = get4n(rpmb + hoffset + 12); + len += hcnt * 16 + hdcnt; + if (len >= filelen) { - filepos2++; - readblk(fp, blk2, filepos2); - hstart &= 0x7ff; - } - hcnt = get4n(blk2 + hstart); - hdcnt = get4n(blk2 + hstart + 4); - hstart += 0x8 + hcnt * 16 + hdcnt; - if (hstart >= 0x800) - { - filepos2 += hstart / 0x800; - hstart &= 0x7ff; - } - if (hstart + (filepos2 - filepos) * 0x800 > filelen) + fprintf(stderr, "bad rpm (EOF): %s\n", name); + exit(1); + } + while (rpmblen < len) { - fprintf(stderr, "bad rpm (no payload): %s\n", name); + if (rpmblen + 0x800 > rpmbalen) + { + rpmbalen += 0x800 * 4; + rpmb = realloc(rpmb, rpmbalen); + } + readblk(fp, rpmb + rpmblen, filepos2++); + rpmblen += 0x800; + } + paystart = 0x800 * (off64_t)filepos + len; + paylen = filelen - len; + h = readhead_buf(rpmb + hoffset, 16 + hcnt * 16 + hdcnt, 0); + if (!h) + { + fprintf(stderr, "bad rpm (bad h): %s\n", name); exit(1); } - paystart = 0x800 * (off64_t)filepos2 + hstart; - paylen = filelen - (hstart + (filepos2 - filepos) * 0x800); + level = 0; + payloadflags = headstring(h, TAG_PAYLOADFLAGS); + if (payloadflags && *payloadflags >= '1' && *payloadflags <= '9') + level = *payloadflags - '0'; + + free(h); + namel -= 4; name[namel] = 0; l = namel; @@ -330,11 +359,12 @@ } } } - addrpm((char *)name, paystart, paylen); + addrpm((char *)name, paystart, paylen, level); } } + free(rpmb); sortrpm(); - addrpm(0, 0, 0); + addrpm(0, 0, 0, 0); i = rpmpayn - 1; *retp = rpmpays; rpmpayn = 0; diff -ur rpmoffs.h.orig rpmoffs.h --- rpmoffs.h.orig 2005-02-03 19:41:51.000000000 +0100 +++ rpmoffs.h 2008-04-22 13:30:52.000000000 +0200 @@ -5,6 +5,7 @@ unsigned int lx; off64_t o; unsigned int l; + int level; }; int rpmoffs(FILE *fp, char *isoname, struct rpmpay **retp); diff -ur writedeltarpm.c.orig writedeltarpm.c --- writedeltarpm.c.orig 2005-06-13 19:21:41.000000000 +0200 +++ writedeltarpm.c 2008-04-22 10:42:39.000000000 +0200 @@ -14,6 +14,7 @@ #include <bzlib.h> #include <zlib.h> +#include <lzma.h> #include <sys/stat.h> #include "md5.h"
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor