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

Reply via email to