RPM Package Manager, CVS Repository http://rpm5.org/cvs/ ____________________________________________________________________________
Server: rpm5.org Name: Jeff Johnson Root: /v/rpm/cvs Email: [EMAIL PROTECTED] Module: rpm Date: 30-Jul-2007 14:40:30 Branch: rpm-4_5 Handle: 2007073013402801 Modified files: (Branch: rpm-4_5) rpm CHANGES rpm/rpmdb db_emu.h hdrinline.h header.c header.h librpmdb.vers rpmdb.c rpmdb.h sqlite.c Log: - adjust signal polling for python exit purposes <[EMAIL PROTECTED]>. - adopt rpm.org signal handling <[EMAIL PROTECTED]>. - void * for headerRead and headerWrite. Summary: Revision Changes Path 1.1360.2.30 +4 -0 rpm/CHANGES 1.1.6.1 +7 -1 rpm/rpmdb/db_emu.h 1.7.2.2 +8 -8 rpm/rpmdb/hdrinline.h 1.48.2.3 +7 -5 rpm/rpmdb/header.c 1.13.2.2 +6 -6 rpm/rpmdb/header.h 1.3.2.1 +1 -0 rpm/rpmdb/librpmdb.vers 1.128.2.7 +23 -11 rpm/rpmdb/rpmdb.c 1.57.2.2 +15 -1 rpm/rpmdb/rpmdb.h 1.5.2.2 +64 -4 rpm/rpmdb/sqlite.c ____________________________________________________________________________ patch -p0 <<'@@ .' Index: rpm/CHANGES ============================================================================ $ cvs diff -u -r1.1360.2.29 -r1.1360.2.30 CHANGES --- rpm/CHANGES 30 Jul 2007 03:07:58 -0000 1.1360.2.29 +++ rpm/CHANGES 30 Jul 2007 12:40:28 -0000 1.1360.2.30 @@ -3,6 +3,10 @@ - jbj: eliminate --rsegfault/--wsegfault. - jbj: add RPMTAG_DBINSTANCE header extension. - jbj: parameterize Depends index and dependency result caching. + - jbj: adjust signal polling for python exit purposes <[EMAIL PROTECTED]>. + - jbj: use _macro_BUFSIZ, not compiled in BUFSIZ, to size expansion targets. + - jbj: enable %{dirname:...} macro primitive. + - jbj: adopt rpm.org signal handling <[EMAIL PROTECTED]>. - jbj: fix a --import memory leak. - jbj: selinux: use matchpthcon() instead or rpmsx. - jbj: insure that RPMFILE_EXISTS is set for %config files. @@ . patch -p0 <<'@@ .' Index: rpm/rpmdb/db_emu.h ============================================================================ $ cvs diff -u -r1.1 -r1.1.6.1 db_emu.h --- rpm/rpmdb/db_emu.h 28 Jan 2005 21:56:56 -0000 1.1 +++ rpm/rpmdb/db_emu.h 30 Jul 2007 12:40:29 -0000 1.1.6.1 @@ -22,7 +22,7 @@ u_int32_t size; void *data; - #define DB_DBT_MALLOC 0x01 /* We malloc the memory and hand off a copy. */ +#define DB_DBT_MALLOC 0x01 /* We malloc the memory and hand off a copy. */ u_int32_t flags; }; @@ -48,5 +48,11 @@ #define DB_SET 32 #define DB_WRITECURSOR 39 #define DB_NOTFOUND (-30990) +#define DB_PRIVATE 0x0200000 +#define DB_EXCL 0x0004000 + +#define DB_VERSION_MAJOR 3 +#define DB_VERSION_MINOR 0 +#define DB_VERSION_PATCH 0 #endif @@ . patch -p0 <<'@@ .' Index: rpm/rpmdb/hdrinline.h ============================================================================ $ cvs diff -u -r1.7.2.1 -r1.7.2.2 hdrinline.h --- rpm/rpmdb/hdrinline.h 9 Jun 2007 19:08:52 -0000 1.7.2.1 +++ rpm/rpmdb/hdrinline.h 30 Jul 2007 12:40:29 -0000 1.7.2.2 @@ -192,32 +192,32 @@ /** \ingroup header * Read (and load) header from file handle. - * @param fd file handle + * @param _fd file handle * @param magicp read (and verify) 8 bytes of (magic, 0)? * @return header (or NULL on error) */ /[EMAIL PROTECTED]@*/ static inline -/[EMAIL PROTECTED]@*/ Header headerRead(FD_t fd, enum hMagic magicp) - /[EMAIL PROTECTED] fd @*/ +/[EMAIL PROTECTED]@*/ Header headerRead(void * _fd, enum hMagic magicp) + /[EMAIL PROTECTED] _fd @*/ { - return hdrVec->hdrread(fd, magicp); + return hdrVec->hdrread(_fd, magicp); } /** \ingroup header * Write (with unload) header to file handle. - * @param fd file handle + * @param _fd file handle * @param h header * @param magicp prefix write with 8 bytes of (magic, 0)? * @return 0 on success, 1 on error */ /[EMAIL PROTECTED]@*/ static inline -int headerWrite(FD_t fd, /[EMAIL PROTECTED]@*/ Header h, enum hMagic magicp) - /[EMAIL PROTECTED] fd, h @*/ +int headerWrite(void * _fd, /[EMAIL PROTECTED]@*/ Header h, enum hMagic magicp) + /[EMAIL PROTECTED] _fd, h @*/ { /[EMAIL PROTECTED]@*/ if (h == NULL) return 0; /[EMAIL PROTECTED]@*/ - return (h2hv(h)->hdrwrite) (fd, h, magicp); + return (h2hv(h)->hdrwrite) (_fd, h, magicp); } /** \ingroup header @@ . patch -p0 <<'@@ .' Index: rpm/rpmdb/header.c ============================================================================ $ cvs diff -u -r1.48.2.2 -r1.48.2.3 header.c --- rpm/rpmdb/header.c 17 Jun 2007 14:41:58 -0000 1.48.2.2 +++ rpm/rpmdb/header.c 30 Jul 2007 12:40:29 -0000 1.48.2.3 @@ -1335,14 +1335,15 @@ /** \ingroup header * Read (and load) header from file handle. - * @param fd file handle + * @param _fd file handle * @param magicp read (and verify) 8 bytes of (magic, 0)? * @return header (or NULL on error) */ static /[EMAIL PROTECTED]@*/ -Header headerRead(FD_t fd, enum hMagic magicp) - /[EMAIL PROTECTED] fd @*/ +Header headerRead(void * _fd, enum hMagic magicp) + /[EMAIL PROTECTED] _fd @*/ { + FD_t fd = _fd; int_32 block[4]; int_32 reserved; int_32 * ei = NULL; @@ -1420,16 +1421,17 @@ /** \ingroup header * Write (with unload) header to file handle. - * @param fd file handle + * @param _fd file handle * @param h header * @param magicp prefix write with 8 bytes of (magic, 0)? * @return 0 on success, 1 on error */ static -int headerWrite(FD_t fd, /[EMAIL PROTECTED]@*/ Header h, enum hMagic magicp) +int headerWrite(void * _fd, /[EMAIL PROTECTED]@*/ Header h, enum hMagic magicp) /[EMAIL PROTECTED] fileSystem @*/ /[EMAIL PROTECTED] fd, h, fileSystem @*/ { + FD_t fd = _fd; ssize_t nb; int length; const void * uh; @@ . patch -p0 <<'@@ .' Index: rpm/rpmdb/header.h ============================================================================ $ cvs diff -u -r1.13.2.1 -r1.13.2.2 header.h --- rpm/rpmdb/header.h 9 Jun 2007 19:08:52 -0000 1.13.2.1 +++ rpm/rpmdb/header.h 30 Jul 2007 12:40:29 -0000 1.13.2.2 @@ -455,25 +455,25 @@ /** \ingroup header * Read (and load) header from file handle. - * @param fd file handle + * @param _fd file handle * @param magicp read (and verify) 8 bytes of (magic, 0)? * @return header (or NULL on error) */ typedef -/[EMAIL PROTECTED]@*/ Header (*HDRread) (FD_t fd, enum hMagic magicp) - /[EMAIL PROTECTED] fd @*/; +/[EMAIL PROTECTED]@*/ Header (*HDRread) (void * _fd, enum hMagic magicp) + /[EMAIL PROTECTED] _fd @*/; /** \ingroup header * Write (with unload) header to file handle. - * @param fd file handle + * @param _fd file handle * @param h header * @param magicp prefix write with 8 bytes of (magic, 0)? * @return 0 on success, 1 on error */ typedef -int (*HDRwrite) (FD_t fd, /[EMAIL PROTECTED]@*/ Header h, enum hMagic magicp) +int (*HDRwrite) (void * _fd, /[EMAIL PROTECTED]@*/ Header h, enum hMagic magicp) /[EMAIL PROTECTED] fileSystem @*/ - /[EMAIL PROTECTED] fd, h, fileSystem @*/; + /[EMAIL PROTECTED] _fd, h, fileSystem @*/; /** \ingroup header * Check if tag is in header. @@ . patch -p0 <<'@@ .' Index: rpm/rpmdb/librpmdb.vers ============================================================================ $ cvs diff -u -r1.3 -r1.3.2.1 librpmdb.vers --- rpm/rpmdb/librpmdb.vers 25 May 2007 17:36:33 -0000 1.3 +++ rpm/rpmdb/librpmdb.vers 30 Jul 2007 12:40:29 -0000 1.3.2.1 @@ -44,6 +44,7 @@ rpmdbAppendIterator; rpmDBArgs; rpmdbCheckSignals; + rpmdbCheckTerminate; rpmdbClose; rpmdbBlockDBI; rpmdbCloseDBI; @@ . patch -p0 <<'@@ .' Index: rpm/rpmdb/rpmdb.c ============================================================================ $ cvs diff -u -r1.128.2.6 -r1.128.2.7 rpmdb.c --- rpm/rpmdb/rpmdb.c 30 Jul 2007 03:03:32 -0000 1.128.2.6 +++ rpm/rpmdb/rpmdb.c 30 Jul 2007 12:40:29 -0000 1.128.2.7 @@ -677,14 +677,14 @@ /[EMAIL PROTECTED]@*/ /[EMAIL PROTECTED]@*/ /[EMAIL PROTECTED]@*/ static rpmdbMatchIterator rpmmiRock; -int rpmdbCheckSignals(void) +int rpmdbCheckTerminate(int terminate) /[EMAIL PROTECTED] rpmdbRock, rpmmiRock @*/ /[EMAIL PROTECTED] rpmdbRock, rpmmiRock @*/ { sigset_t newMask, oldMask; - static int terminate = 0; + static int terminating = 0; - if (terminate) return 0; + if (terminating) return 1; (void) sigfillset(&newMask); /* block all signals */ (void) sigprocmask(SIG_BLOCK, &newMask, &oldMask); @@ -693,17 +693,14 @@ || sigismember(&rpmsqCaught, SIGQUIT) || sigismember(&rpmsqCaught, SIGHUP) || sigismember(&rpmsqCaught, SIGTERM) - || sigismember(&rpmsqCaught, SIGPIPE)) - terminate = 1; + || sigismember(&rpmsqCaught, SIGPIPE) + || terminate) + terminating = 1; - if (terminate) { + if (terminating) { rpmdb db; rpmdbMatchIterator mi; -/[EMAIL PROTECTED]@*/ /* sigset_t is abstract type */ - rpmMessage(RPMMESS_DEBUG, D_("Exiting on signal(0x%lx) ...\n"), *((unsigned long *)&rpmsqCaught)); -/[EMAIL PROTECTED]@*/ - /[EMAIL PROTECTED]@*/ while ((mi = rpmmiRock) != NULL) { /[EMAIL PROTECTED]@*/ rpmmiRock = mi->mi_next; @@ -719,9 +716,24 @@ (void) rpmdbClose(db); } /[EMAIL PROTECTED]@*/ + } + (void) sigprocmask(SIG_SETMASK, &oldMask, NULL); + return terminating; +} + +int rpmdbCheckSignals(void) + /[EMAIL PROTECTED] rpmdbRock, rpmmiRock @*/ + /[EMAIL PROTECTED] rpmdbRock, rpmmiRock @*/ +{ + + if (rpmdbCheckTerminate(0)) { +/[EMAIL PROTECTED]@*/ /* sigset_t is abstract type */ + rpmMessage(RPMMESS_DEBUG, D_("Exiting on signal(0x%lx) ...\n"), *((unsigned long *)&rpmsqCaught)); +/[EMAIL PROTECTED]@*/ exit(EXIT_FAILURE); } - return sigprocmask(SIG_SETMASK, &oldMask, NULL); + return 0; + } /** @@ . patch -p0 <<'@@ .' Index: rpm/rpmdb/rpmdb.h ============================================================================ $ cvs diff -u -r1.57.2.1 -r1.57.2.2 rpmdb.h --- rpm/rpmdb/rpmdb.h 30 Jul 2007 03:03:32 -0000 1.57.2.1 +++ rpm/rpmdb/rpmdb.h 30 Jul 2007 12:40:29 -0000 1.57.2.2 @@ -1101,7 +1101,21 @@ /[EMAIL PROTECTED] mi, rpmGlobalMacroContext, fileSystem, internalState @*/; /** \ingroup rpmdb - * Check rpmdb signal handler for trapped signal exit. + * Check rpmdb signal handler for trapped signal and/or requested exit. + * Clean up any open iterators and databases on termination condition. + * On non-zero exit any open references to rpmdb are invalid and cannot + * be accessed anymore, calling process should terminate immediately. + * + * @param terminate 0 to only check for signals, 1 to terminate anyway + * @return 0 to continue, 1 if termination cleanup was done. + */ +/[EMAIL PROTECTED]@*/ +int rpmdbCheckTerminate(int terminate) + /[EMAIL PROTECTED] fileSystem, internalState @*/ + /[EMAIL PROTECTED] fileSystem, internalState @*/; + +/** \ingroup rpmdb + * Check for and exit on termination signals. */ /[EMAIL PROTECTED]@*/ int rpmdbCheckSignals(void) @@ . patch -p0 <<'@@ .' Index: rpm/rpmdb/sqlite.c ============================================================================ $ cvs diff -u -r1.5.2.1 -r1.5.2.2 sqlite.c --- rpm/rpmdb/sqlite.c 9 Jun 2007 15:47:56 -0000 1.5.2.1 +++ rpm/rpmdb/sqlite.c 30 Jul 2007 12:40:29 -0000 1.5.2.2 @@ -38,6 +38,7 @@ #include "system.h" #include <rpmlib.h> +#include <rpmio.h> #include <rpmmacro.h> #include <rpmurl.h> /* XXX urlPath proto */ @@ -453,7 +454,7 @@ } } else if (!strcmp(vtype, "text")) { - const char * v = sqlite3_column_text(scp->pStmt, i); + const char * v = (const char *)sqlite3_column_text(scp->pStmt, i); nb = strlen(v) + 1; if (_debug) fprintf(stderr, "\t%d %s %s \"%s\"\n", i, cname, vtype, v); @@ -686,6 +687,38 @@ char cmd[BUFSIZ]; int rc = 0; + if (dbi->dbi_tmpdir) { + const char *root; + const char *tmpdir; + root = (dbi->dbi_root ? dbi->dbi_root : dbi->dbi_rpmdb->db_root); + /[EMAIL PROTECTED]@*/ + if ((root[0] == '/' && root[1] == '\0') || dbi->dbi_rpmdb->db_chrootDone) + root = NULL; + /[EMAIL PROTECTED]@*/ + /[EMAIL PROTECTED]@*/ + tmpdir = rpmGenPath(root, dbi->dbi_tmpdir, NULL); + /[EMAIL PROTECTED]@*/ + int xx; + sprintf(cmd, "PRAGMA temp_store_directory = '%s';", tmpdir); + xx = sqlite3_exec(sqldb->db, cmd, NULL, NULL, (char **)&scp->pzErrmsg); + tmpdir = _free(tmpdir); + } + if (dbi->dbi_eflags & DB_EXCL) { + int xx; + sprintf(cmd, "PRAGMA locking_mode = EXCLUSIVE;"); + xx = sqlite3_exec(sqldb->db, cmd, NULL, NULL, (char **)&scp->pzErrmsg); + } + if (dbi->dbi_pagesize > 0) { + int xx; + sprintf(cmd, "PRAGMA cache_size = %d;", dbi->dbi_cachesize); + xx = sqlite3_exec(sqldb->db, cmd, NULL, NULL, (char **)&scp->pzErrmsg); + } + if (dbi->dbi_cachesize > 0) { + int xx; + sprintf(cmd, "PRAGMA page_size = %d;", dbi->dbi_pagesize); + xx = sqlite3_exec(sqldb->db, cmd, NULL, NULL, (char **)&scp->pzErrmsg); + } + /* Check if the table exists... */ sprintf(cmd, "SELECT name FROM 'sqlite_master' WHERE type='table' and name='%s';", @@ -729,13 +762,15 @@ } if (_debug) fprintf(stderr, "\t%s(%d) type(%d) keytype %s\n", tagName(dbi->dbi_rpmtag), dbi->dbi_rpmtag, (tagType(dbi->dbi_rpmtag) & RPM_MASK_TYPE), keytype); - sprintf(cmd, "CREATE TABLE '%s' (key %s, value %s)", + sprintf(cmd, "CREATE %sTABLE '%s' (key %s, value %s)", + dbi->dbi_temporary ? "TEMPORARY " : "", dbi->dbi_subfile, keytype, valtype); rc = sqlite3_exec(sqldb->db, cmd, NULL, NULL, (char **)&scp->pzErrmsg); if (rc) goto exit; - sprintf(cmd, "CREATE TABLE 'db_info' (endian TEXT)"); + sprintf(cmd, "CREATE %sTABLE 'db_info' (endian TEXT)", + dbi->dbi_temporary ? "TEMPORARY " : ""); rc = sqlite3_exec(sqldb->db, cmd, NULL, NULL, (char **)&scp->pzErrmsg); if (rc) goto exit; @@ -826,6 +861,17 @@ rpmMessage(RPMMESS_DEBUG, D_("closed sql db %s\n"), dbi->dbi_subfile); +#if defined(MAYBE) /* XXX should SQLite and BDB have different semantics? */ + if (dbi->dbi_temporary && !(dbi->dbi_eflags & DB_PRIVATE)) { + const char * dbhome = NULL; + urltype ut = urlPath(dbi->dbi_home, &dbhome); + const char * dbfname = rpmGenPath(dbhome, dbi->dbi_file, NULL); + int xx = (dbfname ? Unlink(dbfname) : 0); + ut = ut; xx = xx; /* XXX tell gcc to be quiet. */ + dbfname = _free(dbfname); + } +#endif + dbi->dbi_stats = _free(dbi->dbi_stats); dbi->dbi_file = _free(dbi->dbi_file); dbi->dbi_db = _free(dbi->dbi_db); @@ -859,6 +905,7 @@ const char * dbfile; const char * dbfname; const char * sql_errcode; + mode_t umask_safed = 0002; dbiIndex dbi; SQL_DB * sqldb; size_t len; @@ -922,7 +969,10 @@ */ (void) rpmioMkpath(dbhome, 0755, getuid(), getgid()); - dbfname = rpmGenPath(dbhome, dbi->dbi_file, NULL); + if (dbi->dbi_eflags & DB_PRIVATE) + dbfname = strdup(":memory:"); + else + dbfname = rpmGenPath(dbhome, dbi->dbi_file, NULL); rpmMessage(RPMMESS_DEBUG, D_("opening sql db %s (%s) mode=0x%x\n"), dbfname, dbi->dbi_subfile, dbi->dbi_mode); @@ -931,7 +981,17 @@ sqldb = xcalloc(1, sizeof(*sqldb)); sql_errcode = NULL; + if (dbi->dbi_perms) + /* mask-out permission bits which are not requested (security) */ + umask_safed = umask(~((mode_t)(dbi->dbi_perms))); xx = sqlite3_open(dbfname, &sqldb->db); + if (dbi->dbi_perms) { + if ((0644 /* = SQLite hard-coded default */ & dbi->dbi_perms) != dbi->dbi_perms) { + /* add requested permission bits which are still missing (semantic) */ + chmod(dbfname, dbi->dbi_perms); + } + umask(umask_safed); + } if (xx != SQLITE_OK) sql_errcode = sqlite3_errmsg(sqldb->db); @@ . ______________________________________________________________________ RPM Package Manager http://rpm5.org CVS Sources Repository rpm-cvs@rpm5.org