The following commit has been merged in the master branch:
commit ceb07b08dad4d5eead630064f45c7e7ded00a341
Author: Guillem Jover <guil...@debian.org>
Date:   Thu Sep 16 19:52:41 2010 +0200

    Refactor file_stat code
    
    Create a new file_stat struct, and use it instead of the
    filestatoverride one.

diff --git a/lib/dpkg/file.h b/lib/dpkg/file.h
index ce16c04..f9360d7 100644
--- a/lib/dpkg/file.h
+++ b/lib/dpkg/file.h
@@ -2,7 +2,7 @@
  * libdpkg - Debian packaging suite library routines
  * file.h - file handling routines
  *
- * Copyright © 2008 Guillem Jover <guil...@debian.org>
+ * Copyright © 2008-2010 Guillem Jover <guil...@debian.org>
  *
  * This is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -21,12 +21,21 @@
 #ifndef LIBDPKG_FILE_H
 #define LIBDPKG_FILE_H
 
+#include <sys/types.h>
+
 #include <stdbool.h>
 
 #include <dpkg/macros.h>
 
 DPKG_BEGIN_DECLS
 
+struct file_stat {
+       uid_t uid;
+       gid_t gid;
+       mode_t mode;
+       time_t mtime;
+};
+
 /*
  * Copy file ownership and permissions from one file to another.
  */
diff --git a/lib/dpkg/tarfn.c b/lib/dpkg/tarfn.c
index c5b598d..dd22e20 100644
--- a/lib/dpkg/tarfn.c
+++ b/lib/dpkg/tarfn.c
@@ -180,10 +180,10 @@ DecodeTarHeader(char *block, struct tar_entry *d)
        else
                d->name = StoC(h->Name, sizeof(h->Name));
        d->linkname = StoC(h->LinkName, sizeof(h->LinkName));
-       d->mode = get_unix_mode(h);
+       d->stat.mode = get_unix_mode(h);
        d->size = (size_t)OtoL(h->Size, sizeof(h->Size));
-       d->mtime = (time_t)OtoL(h->ModificationTime,
-                               sizeof(h->ModificationTime));
+       d->stat.mtime = (time_t)OtoL(h->ModificationTime,
+                                    sizeof(h->ModificationTime));
        d->dev = ((OtoL(h->MajorDevice,
                        sizeof(h->MajorDevice)) & 0xff) << 8) |
                 (OtoL(h->MinorDevice, sizeof(h->MinorDevice)) & 0xff);
@@ -191,16 +191,16 @@ DecodeTarHeader(char *block, struct tar_entry *d)
        if (*h->UserName)
                passwd = getpwnam(h->UserName);
        if (passwd)
-               d->uid = passwd->pw_uid;
+               d->stat.uid = passwd->pw_uid;
        else
-               d->uid = (uid_t)OtoL(h->UserID, sizeof(h->UserID));
+               d->stat.uid = (uid_t)OtoL(h->UserID, sizeof(h->UserID));
 
        if (*h->GroupName)
                group = getgrnam(h->GroupName);
        if (group)
-               d->gid = group->gr_gid;
+               d->stat.gid = group->gr_gid;
        else
-               d->gid = (gid_t)OtoL(h->GroupID, sizeof(h->GroupID));
+               d->stat.gid = (gid_t)OtoL(h->GroupID, sizeof(h->GroupID));
 
        checksum = OtoL(h->Checksum, sizeof(h->Checksum));
 
diff --git a/lib/dpkg/tarfn.h b/lib/dpkg/tarfn.h
index 0401cb0..2e6a3b4 100644
--- a/lib/dpkg/tarfn.h
+++ b/lib/dpkg/tarfn.h
@@ -3,6 +3,7 @@
  * tarfn.h - tar archive extraction functions
  *
  * Copyright © 1995 Bruce Perens
+ * Copyright © 2009-2010 Guillem Jover <guil...@debian.org>
  *
  * This is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -26,6 +27,8 @@
 #include <unistd.h>
 #include <stdlib.h>
 
+#include <dpkg/file.h>
+
 #define TARBLKSZ       512
 
 enum tar_format {
@@ -54,11 +57,9 @@ struct tar_entry {
        char *name;             /* File name */
        char *linkname;         /* Name for symbolic and hard links */
        size_t size;            /* Size of file */
-       time_t mtime;           /* Last-modified time */
-       mode_t mode;            /* Unix mode, including device bits. */
-       uid_t uid;              /* Numeric UID */
-       gid_t gid;              /* Numeric GID */
        dev_t dev;              /* Special device for mknod() */
+
+       struct file_stat stat;
 };
 
 typedef int (*tar_read_func)(void *ctx, char *buffer, int length);
diff --git a/src/archives.c b/src/archives.c
index fdfad13..5103a94 100644
--- a/src/archives.c
+++ b/src/archives.c
@@ -4,6 +4,7 @@
  *
  * Copyright © 1994,1995 Ian Jackson <i...@chiark.greenend.org.uk>
  * Copyright © 2000 Wichert Akkerman <wakke...@debian.org>
+ * Copyright © 2007-2010 Guillem Jover <guil...@debian.org>
  *
  * This is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -46,6 +47,7 @@
 #include <dpkg/buffer.h>
 #include <dpkg/subproc.h>
 #include <dpkg/command.h>
+#include <dpkg/file.h>
 #include <dpkg/tarfn.h>
 #include <dpkg/myopt.h>
 #include <dpkg/triglib.h>
@@ -231,26 +233,23 @@ does_replace(struct pkginfo *newpigp, struct 
pkginfoperfile *newpifp,
 }
 
 static void
-newtarobject_utime(const char *path, struct tar_entry *ti)
+newtarobject_utime(const char *path, struct file_stat *st)
 {
   struct utimbuf utb;
   utb.actime= currenttime;
-  utb.modtime = ti->mtime;
+  utb.modtime = st->mtime;
   if (utime(path,&utb))
-    ohshite(_("error setting timestamps of `%.255s'"), ti->name);
+    ohshite(_("error setting timestamps of `%.255s'"), path);
 }
 
 static void
-newtarobject_allmodes(const char *path, struct tar_entry *ti,
-                      struct filestatoverride *statoverride)
+newtarobject_allmodes(const char *path, struct file_stat *st)
 {
-  if (chown(path,
-            statoverride ? statoverride->uid : ti->uid,
-            statoverride ? statoverride->gid : ti->gid))
-    ohshite(_("error setting ownership of `%.255s'"), ti->name);
-  if (chmod(path,(statoverride ? statoverride->mode : ti->mode) & ~S_IFMT))
-    ohshite(_("error setting permissions of `%.255s'"), ti->name);
-  newtarobject_utime(path,ti);
+  if (chown(path, st->uid, st->gid))
+    ohshite(_("error setting ownership of `%.255s'"), path);
+  if (chmod(path, st->mode & ~S_IFMT))
+    ohshite(_("error setting permissions of `%.255s'"), path);
+  newtarobject_utime(path, st);
 }
 
 static void
@@ -419,9 +418,9 @@ tarobject(void *ctx, struct tar_entry *ti)
   ssize_t r;
   struct stat stab, stabtmp;
   char databuf[TARBLKSZ];
+  struct file_stat *st;
   struct fileinlist *nifd, **oldnifd;
   struct pkginfo *divpkg, *otherpkg;
-  mode_t am;
 
   ensureobstackinit();
 
@@ -436,7 +435,8 @@ tarobject(void *ctx, struct tar_entry *ti)
   debug(dbg_eachfile,
         "tarobject ti->name='%s' mode=%lo owner=%u.%u type=%d(%c)"
         " ti->linkname='%s' namenode='%s' flags=%o instead='%s'",
-        ti->name, (long)ti->mode, (unsigned)ti->uid, (unsigned)ti->gid,
+        ti->name, (long)ti->stat.mode,
+        (unsigned)ti->stat.uid, (unsigned)ti->stat.gid,
         ti->type,
         ti->type >= '0' && ti->type <= '6' ? "-hlcbdp"[ti->type - '0'] : '?',
         ti->linkname,
@@ -461,6 +461,11 @@ tarobject(void *ctx, struct tar_entry *ti)
     }
   }
 
+  if (nifd->namenode->statoverride)
+    st = nifd->namenode->statoverride;
+  else
+    st = &ti->stat;
+
   usenode = namenodetouse(nifd->namenode, tc->pkg);
   usename = usenode->name + 1; /* Skip the leading '/'. */
 
@@ -695,15 +700,9 @@ tarobject(void *ctx, struct tar_entry *ti)
                          nifd->namenode->statoverride->uid,
                          nifd->namenode->statoverride->gid,
                          nifd->namenode->statoverride->mode);
-    if (fchown(fd,
-               nifd->namenode->statoverride ?
-               nifd->namenode->statoverride->uid : ti->uid,
-               nifd->namenode->statoverride ?
-               nifd->namenode->statoverride->gid : ti->gid))
+    if (fchown(fd, st->uid, st->gid))
       ohshite(_("error setting ownership of `%.255s'"), ti->name);
-    am = (nifd->namenode->statoverride ?
-          nifd->namenode->statoverride->mode : ti->mode) & ~S_IFMT;
-    if (fchmod(fd,am))
+    if (fchmod(fd, st->mode & ~S_IFMT))
       ohshite(_("error setting permissions of `%.255s'"), ti->name);
 
     /* Postpone the fsync, to try to avoid massive I/O degradation. */
@@ -712,25 +711,25 @@ tarobject(void *ctx, struct tar_entry *ti)
     pop_cleanup(ehflag_normaltidy); /* fd= open(fnamenewvb.buf) */
     if (close(fd))
       ohshite(_("error closing/writing `%.255s'"), ti->name);
-    newtarobject_utime(fnamenewvb.buf,ti);
+    newtarobject_utime(fnamenewvb.buf, st);
     break;
   case tar_filetype_fifo:
     if (mkfifo(fnamenewvb.buf,0))
       ohshite(_("error creating pipe `%.255s'"), ti->name);
     debug(dbg_eachfiledetail, "tarobject fifo");
-    newtarobject_allmodes(fnamenewvb.buf,ti, nifd->namenode->statoverride);
+    newtarobject_allmodes(fnamenewvb.buf, st);
     break;
   case tar_filetype_chardev:
     if (mknod(fnamenewvb.buf, S_IFCHR, ti->dev))
       ohshite(_("error creating device `%.255s'"), ti->name);
     debug(dbg_eachfiledetail, "tarobject chardev");
-    newtarobject_allmodes(fnamenewvb.buf,ti, nifd->namenode->statoverride);
+    newtarobject_allmodes(fnamenewvb.buf, st);
     break; 
   case tar_filetype_blockdev:
     if (mknod(fnamenewvb.buf, S_IFBLK, ti->dev))
       ohshite(_("error creating device `%.255s'"), ti->name);
     debug(dbg_eachfiledetail, "tarobject blockdev");
-    newtarobject_allmodes(fnamenewvb.buf,ti, nifd->namenode->statoverride);
+    newtarobject_allmodes(fnamenewvb.buf, st);
     break; 
   case tar_filetype_hardlink:
     varbufreset(&hardlinkfn);
@@ -743,18 +742,14 @@ tarobject(void *ctx, struct tar_entry *ti)
     if (link(hardlinkfn.buf,fnamenewvb.buf))
       ohshite(_("error creating hard link `%.255s'"), ti->name);
     debug(dbg_eachfiledetail, "tarobject hardlink");
-    newtarobject_allmodes(fnamenewvb.buf,ti, nifd->namenode->statoverride);
+    newtarobject_allmodes(fnamenewvb.buf, st);
     break;
   case tar_filetype_symlink:
     /* We've already cheched for an existing directory. */
     if (symlink(ti->linkname, fnamenewvb.buf))
       ohshite(_("error creating symbolic link `%.255s'"), ti->name);
     debug(dbg_eachfiledetail, "tarobject symlink creating");
-    if (lchown(fnamenewvb.buf,
-               nifd->namenode->statoverride ?
-               nifd->namenode->statoverride->uid : ti->uid,
-               nifd->namenode->statoverride ?
-               nifd->namenode->statoverride->gid : ti->gid))
+    if (lchown(fnamenewvb.buf, st->uid, st->gid))
       ohshite(_("error setting ownership of symlink `%.255s'"), ti->name);
     break;
   case tar_filetype_dir:
@@ -762,13 +757,13 @@ tarobject(void *ctx, struct tar_entry *ti)
     if (mkdir(fnamenewvb.buf,0))
       ohshite(_("error creating directory `%.255s'"), ti->name);
     debug(dbg_eachfiledetail, "tarobject directory creating");
-    newtarobject_allmodes(fnamenewvb.buf,ti,nifd->namenode->statoverride);
+    newtarobject_allmodes(fnamenewvb.buf, st);
     break;
   default:
     internerr("unknown tar type '%d', but already checked", ti->type);
   }
 
-  set_selinux_path_context(fnamevb.buf, fnamenewvb.buf, ti->mode);
+  set_selinux_path_context(fnamevb.buf, fnamenewvb.buf, st->mode);
 
   /* CLEANUP: Now we have extracted the new object in .dpkg-new (or,
    * if the file already exists as a directory and we were trying to extract
diff --git a/src/filesdb.h b/src/filesdb.h
index 7d2645c..44a2c85 100644
--- a/src/filesdb.h
+++ b/src/filesdb.h
@@ -3,6 +3,7 @@
  * filesdb.h - management of database of files installed on system
  *
  * Copyright © 1995 Ian Jackson <i...@chiark.greenend.org.uk>
+ * Copyright © 2008-2010 Guillem Jover <guil...@debian.org>
  *
  * This is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -21,6 +22,8 @@
 #ifndef FILESDB_H
 #define FILESDB_H
 
+#include <dpkg/file.h>
+
 /*
  * Data structure here is as follows:
  * 
@@ -57,7 +60,14 @@ struct filenamenode {
   const char *name;
   struct filepackages *packages;
   struct diversion *divert;
-  struct filestatoverride *statoverride;
+
+  /* We allow the administrator to override the owner, group and mode of
+   * a file. If such an override is present we use that instead of the
+   * stat information stored in the archive.
+   *
+   * This functionality used to be in the suidmanager package. */
+  struct file_stat *statoverride;
+
   /* Fields from here on are used by archives.c &c, and cleared by
    * filesdbinit.
    */
@@ -83,18 +93,6 @@ struct fileinlist {
   struct filenamenode *namenode;
 };
 
-struct filestatoverride {
-  /* We allow the administrator to override the owner, group and mode of
-   * a file. If such an override is present we use that instead of the
-   * stat information stored in the archive.
-   *
-   * This functionality used to be in the suidmanager package.
-   */
-  uid_t uid;
-  gid_t gid;
-  mode_t mode;
-};
-
 struct diversion {
   /* When we deal with an `overridden' file, every package except
    * the overriding one is considered to contain the other file
diff --git a/src/statcmd.c b/src/statcmd.c
index 42aad13..337e351 100644
--- a/src/statcmd.c
+++ b/src/statcmd.c
@@ -2,7 +2,7 @@
  * dpkg-statoverride - override ownership and mode of files
  *
  * Copyright © 2000, 2001 Wichert Akkerman <wakke...@debian.org>
- * Copyright © 2006-2009 Guillem Jover <guil...@debian.org>
+ * Copyright © 2006-2010 Guillem Jover <guil...@debian.org>
  *
  * This is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -128,10 +128,10 @@ path_cleanup(const char *path)
        return new_path;
 }
 
-static struct filestatoverride *
+static struct file_stat *
 statdb_node_new(const char *user, const char *group, const char *mode)
 {
-       struct filestatoverride *filestat;
+       struct file_stat *filestat;
 
        filestat = nfmalloc(sizeof(*filestat));
 
@@ -142,7 +142,7 @@ statdb_node_new(const char *user, const char *group, const 
char *mode)
        return filestat;
 }
 
-static struct filestatoverride **
+static struct file_stat **
 statdb_node_find(const char *filename)
 {
        struct filenamenode *file;
@@ -167,7 +167,7 @@ statdb_node_remove(const char *filename)
 }
 
 static void
-statdb_node_apply(const char *filename, struct filestatoverride *filestat)
+statdb_node_apply(const char *filename, struct file_stat *filestat)
 {
        if (chown(filename, filestat->uid, filestat->gid) < 0)
                ohshite(_("error setting ownership of `%.255s'"), filename);
@@ -178,7 +178,7 @@ statdb_node_apply(const char *filename, struct 
filestatoverride *filestat)
 static void
 statdb_node_print(FILE *out, struct filenamenode *file)
 {
-       struct filestatoverride *filestat = file->statoverride;
+       struct file_stat *filestat = file->statoverride;
        struct passwd *pw;
        struct group *gr;
 
@@ -260,7 +260,7 @@ statoverride_add(const char *const *argv)
        const char *mode = argv[2];
        const char *path = argv[3];
        char *filename;
-       struct filestatoverride **filestat;
+       struct file_stat **filestat;
 
        if (!user || !group || !mode || !path || argv[4])
                badusage(_("--add needs four arguments"));
diff --git a/src/statdb.c b/src/statdb.c
index 6ff02ae..adeaef0 100644
--- a/src/statdb.c
+++ b/src/statdb.c
@@ -4,6 +4,7 @@
  *
  * Copyright © 1995 Ian Jackson <i...@chiark.greenend.org.uk>
  * Copyright © 2000, 2001 Wichert Akkerman <wakke...@debian.org>
+ * Copyright © 2008-2010 Guillem Jover <guil...@debian.org>
  *
  * This is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -112,7 +113,7 @@ ensure_statoverrides(void)
        struct stat stab1, stab2;
        FILE *file;
        char *loaded_list, *loaded_list_end, *thisline, *nextline, *ptr;
-       struct filestatoverride *fso;
+       struct file_stat *fso;
        struct filenamenode *fnn;
 
        varbufreset(&vb);
@@ -164,7 +165,7 @@ ensure_statoverrides(void)
 
        thisline = loaded_list;
        while (thisline < loaded_list_end) {
-               fso = nfmalloc(sizeof(struct filestatoverride));
+               fso = nfmalloc(sizeof(struct file_stat));
 
                if (!(ptr = memchr(thisline, '\n', loaded_list_end - thisline)))
                        ohshit(_("statoverride file is missing final newline"));

-- 
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