The following commit has been merged in the master branch: commit 67d524ea0b9fe7b2a19c2f81c848a8523508a538 Author: Guillem Jover <guil...@debian.org> Date: Wed Jul 28 16:32:48 2010 +0200
Pass tar context pointer as an argument instead of a struct member The context does not have anything to do with the TarInfo struct, so pass it as a function argument either as 'void *' or as 'struct tarcontext *' if the type is known. diff --git a/lib/dpkg/tarfn.c b/lib/dpkg/tarfn.c index 42bd3df..3f82d13 100644 --- a/lib/dpkg/tarfn.c +++ b/lib/dpkg/tarfn.c @@ -176,7 +176,7 @@ struct symlinkList { }; int -TarExtractor(void *userData, const struct tar_operations *ops) +TarExtractor(void *ctx, const struct tar_operations *ops) { int status; char buffer[TARBLKSZ]; @@ -194,9 +194,8 @@ TarExtractor(void *userData, const struct tar_operations *ops) h.Name = NULL; h.LinkName = NULL; - h.UserData = userData; - while ((status = ops->read(userData, buffer, TARBLKSZ)) == TARBLKSZ) { + while ((status = ops->read(ctx, buffer, TARBLKSZ)) == TARBLKSZ) { int nameLength; if (!DecodeTarHeader(buffer, &h)) { @@ -236,7 +235,7 @@ TarExtractor(void *userData, const struct tar_operations *ops) case NormalFile1: /* Compatibility with pre-ANSI ustar. */ if (h.Name[nameLength - 1] != '/') { - status = ops->extract_file(&h); + status = ops->extract_file(ctx, &h); break; } /* Else, fall through. */ @@ -244,10 +243,10 @@ TarExtractor(void *userData, const struct tar_operations *ops) if (h.Name[nameLength - 1] == '/') { h.Name[nameLength - 1] = '\0'; } - status = ops->mkdir(&h); + status = ops->mkdir(ctx, &h); break; case HardLink: - status = ops->link(&h); + status = ops->link(ctx, &h); break; case SymbolicLink: symlink_node = m_malloc(sizeof(*symlink_node)); @@ -266,7 +265,7 @@ TarExtractor(void *userData, const struct tar_operations *ops) case CharacterDevice: case BlockDevice: case FIFO: - status = ops->mknod(&h); + status = ops->mknod(ctx, &h); break; case GNU_LONGLINK: case GNU_LONGNAME: @@ -295,7 +294,7 @@ TarExtractor(void *userData, const struct tar_operations *ops) long_read -= TARBLKSZ) { int copysize; - status = ops->read(userData, buffer, TARBLKSZ); + status = ops->read(ctx, buffer, TARBLKSZ); /* If we didn't get TARBLKSZ bytes read, punt. */ if (status != TARBLKSZ) { /* Read partial header record? */ @@ -332,7 +331,7 @@ TarExtractor(void *userData, const struct tar_operations *ops) while (symlink_head) { symlink_node = symlink_head->next; if (status == 0) - status = ops->symlink(&symlink_head->h); + status = ops->symlink(ctx, &symlink_head->h); free(symlink_head->h.Name); free(symlink_head->h.LinkName); free(symlink_head); diff --git a/lib/dpkg/tarfn.h b/lib/dpkg/tarfn.h index a4c7326..e5a7e63 100644 --- a/lib/dpkg/tarfn.h +++ b/lib/dpkg/tarfn.h @@ -50,7 +50,6 @@ enum TarFileType { struct TarInfo { enum tar_format format; /* Tar archive format. */ - void * UserData; /* User passed this in as argument */ char * Name; /* File name */ mode_t Mode; /* Unix mode, including device bits. */ size_t Size; /* Size of file */ @@ -62,8 +61,8 @@ struct TarInfo { gid_t GroupID; /* Numeric GID */ }; -typedef int (*tar_read_func)(void * userData, char * buffer, int length); -typedef int (*tar_func)(struct TarInfo * h); +typedef int (*tar_read_func)(void *ctx, char *buffer, int length); +typedef int (*tar_func)(void *ctx, struct TarInfo *h); struct tar_operations { tar_read_func read; @@ -75,6 +74,6 @@ struct tar_operations { tar_func mknod; }; -int TarExtractor(void *userData, const struct tar_operations *ops); +int TarExtractor(void *ctx, const struct tar_operations *ops); #endif diff --git a/src/archives.c b/src/archives.c index 2b5b87e..68b7cfa 100644 --- a/src/archives.c +++ b/src/archives.c @@ -180,9 +180,8 @@ int tarfileread(void *ud, char *buf, int len) { } static void -tarfile_skip_one_forward(struct TarInfo *ti) +tarfile_skip_one_forward(struct tarcontext *tc, struct TarInfo *ti) { - struct tarcontext *tc = (struct tarcontext *)ti->UserData; size_t r; char databuf[TARBLKSZ]; @@ -338,12 +337,10 @@ struct fileinlist *addfiletolist(struct tarcontext *tc, } static void -remove_file_from_list(struct TarInfo *ti, +remove_file_from_list(struct tarcontext *tc, struct TarInfo *ti, struct fileinlist **oldnifd, struct fileinlist *nifd) { - struct tarcontext *tc = (struct tarcontext *)ti->UserData; - obstack_free(&tar_obs, nifd); tc->newfilesp = oldnifd; *oldnifd = NULL; @@ -394,7 +391,9 @@ linktosameexistingdir(const struct TarInfo *ti, const char *fname, return true; } -int tarobject(struct TarInfo *ti) { +int +tarobject(void *ctx, struct TarInfo *ti) +{ static struct varbuf conffderefn, hardlinkfn, symlinkfn; static int fd; const char *usename; @@ -402,7 +401,7 @@ int tarobject(struct TarInfo *ti) { struct filenamenode *linknode; struct conffile *conff; - struct tarcontext *tc= (struct tarcontext*)ti->UserData; + struct tarcontext *tc = ctx; bool existingdirectory, keepexisting; int statr; ssize_t r; @@ -621,15 +620,15 @@ int tarobject(struct TarInfo *ti) { } if (keepexisting) { - remove_file_from_list(ti, oldnifd, nifd); - tarfile_skip_one_forward(ti); + remove_file_from_list(tc, ti, oldnifd, nifd); + tarfile_skip_one_forward(tc, ti); return 0; } if (filter_should_skip(ti)) { nifd->namenode->flags &= ~fnnf_new_inarchive; nifd->namenode->flags |= fnnf_filtered; - tarfile_skip_one_forward(ti); + tarfile_skip_one_forward(tc, ti); return 0; } diff --git a/src/archives.h b/src/archives.h index 8370e80..d08c3f1 100644 --- a/src/archives.h +++ b/src/archives.h @@ -64,7 +64,7 @@ void ok_prermdeconfigure(int argc, void **argv); void setupfnamevbs(const char *filename); int unlinkorrmdir(const char *filename); -int tarobject(struct TarInfo *ti); +int tarobject(void *ctx, struct TarInfo *ti); int tarfileread(void *ud, char *buf, int len); void tar_deferred_extract(struct fileinlist *files, struct pkginfo *pkg); -- dpkg's main repository -- To UNSUBSCRIBE, email to debian-dpkg-cvs-requ...@lists.debian.org with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org