- Grand Renaming of rpm data types.
[platform/upstream/rpm.git] / build.c
diff --git a/build.c b/build.c
index b8f73dd..5e2e1d8 100644 (file)
--- a/build.c
+++ b/build.c
@@ -1,47 +1,50 @@
+/** \ingroup rpmcli
+ * Parse spec file and build package.
+ */
+
 #include "system.h"
 
+#include <rpmcli.h>
 #include <rpmbuild.h>
-#include <rpmurl.h>
+
+#include "rpmps.h"
+#include "rpmte.h"
+#include "rpmts.h"
 
 #include "build.h"
 #include "debug.h"
 
-static int checkSpec(Header h)
+/*@access rpmts @*/    /* XXX compared with NULL @*/
+/*@access rpmdb @*/            /* XXX compared with NULL @*/
+/*@access FD_t @*/             /* XXX compared with NULL @*/
+
+/**
+ */
+static int checkSpec(rpmts ts, Header h)
+       /*@globals fileSystem, internalState @*/
+       /*@modifies ts, h, fileSystem, internalState @*/
 {
-    char *rootdir = NULL;
-    rpmdb db = NULL;
-    int mode = O_RDONLY;
-    rpmTransactionSet ts;
-    struct rpmDependencyConflict * conflicts;
-    int numConflicts;
+    rpmps ps;
     int rc;
 
-    if (!headerIsEntry(h, RPMTAG_REQUIREFLAGS))
+    if (!headerIsEntry(h, RPMTAG_REQUIRENAME)
+     && !headerIsEntry(h, RPMTAG_CONFLICTNAME))
        return 0;
 
-    if (rpmdbOpen(rootdir, &db, mode, 0644)) {
-       const char *dn;
-       dn = rpmGetPath( (rootdir ? rootdir : ""), "%{_dbpath}", NULL);
-       rpmError(RPMERR_OPEN, _("cannot open rpm database in %s\n"), dn);
-       free((void *)dn);
-       exit(EXIT_FAILURE);
-    }
-    ts = rpmtransCreateSet(db, rootdir);
+    rc = rpmtsAddPackage(ts, h, NULL, 0, NULL);
 
-    rc = rpmtransAddPackage(ts, h, NULL, NULL, 0, NULL);
+    rc = rpmtsCheck(ts);
 
-    rc = rpmdepCheck(ts, &conflicts, &numConflicts);
-    if (rc == 0 && conflicts) {
-       rpmMessage(RPMMESS_ERROR, _("failed build dependencies:\n"));
-       printDepProblems(stderr, conflicts, numConflicts);
-       rpmdepFreeConflicts(conflicts, numConflicts);
+    ps = rpmtsGetProblems(ts);
+    if (rc == 0 && ps) {
+       rpmMessage(RPMMESS_ERROR, _("Failed build dependencies:\n"));
+       printDepProblems(stderr, ps);
        rc = 1;
     }
+    ps = rpmpsFree(ps);
 
-    if (ts)
-       rpmtransFree(ts);
-    if (db)
-       rpmdbClose(db);
+    /* XXX nuke the added package. */
+    rpmtsClean(ts);
 
     return rc;
 }
@@ -51,7 +54,11 @@ static int checkSpec(Header h)
  * angielsku...
  */
 /* XXX this is still a dumb test but at least it's i18n aware */
-static int isSpecFile(const char *specfile)
+/**
+ */
+static int isSpecFile(const char * specfile)
+       /*@globals fileSystem @*/
+       /*@modifies fileSystem @*/
 {
     char buf[256];
     const char * s;
@@ -66,7 +73,7 @@ static int isSpecFile(const char *specfile)
        return 0;
     }
     count = Fread(buf, sizeof(buf[0]), sizeof(buf), fd);
-    Fclose(fd);
+    (void) Fclose(fd);
 
     checking = 1;
     for (s = buf; count--; s++) {
@@ -74,23 +81,30 @@ static int isSpecFile(const char *specfile)
        case '\r':
        case '\n':
            checking = 1;
-           break;
+           /*@switchbreak@*/ break;
        case ':':
            checking = 0;
-           break;
+           /*@switchbreak@*/ break;
        default:
            if (checking && !(isprint(*s) || isspace(*s))) return 0;
-           break;
+           /*@switchbreak@*/ break;
        }
     }
     return 1;
 }
 
-static int buildForTarget(const char *arg, struct rpmBuildArguments *ba,
-       const char *passPhrase, char *cookie)
+/**
+ */
+static int buildForTarget(rpmts ts, const char * arg, BTA_t ba)
+       /*@globals rpmGlobalMacroContext,
+               fileSystem, internalState @*/
+       /*@modifies ts, rpmGlobalMacroContext,
+               fileSystem, internalState @*/
 {
+    const char * passPhrase = ba->passPhrase;
+    const char * cookie = ba->cookie;
     int buildAmount = ba->buildAmount;
-    const char *buildRootURL = NULL;
+    const char * buildRootURL = NULL;
     const char * specFile;
     const char * specURL;
     int specut;
@@ -102,16 +116,20 @@ static int buildForTarget(const char *arg, struct rpmBuildArguments *ba,
     rpmSetTables(RPM_MACHTABLE_BUILDARCH, RPM_MACHTABLE_BUILDOS);
 #endif
 
+    /*@-branchstate@*/
     if (ba->buildRootOverride)
        buildRootURL = rpmGenPath(NULL, ba->buildRootOverride, NULL);
+    /*@=branchstate@*/
 
+    /*@-compmempass@*/ /* FIX: static zcmds heartburn */
     if (ba->buildMode == 't') {
        FILE *fp;
-       const char *specDir;
+       const char * specDir;
        const char * tmpSpecFile;
-       char * cmd, *s;
+       char * cmd, * s;
        rpmCompressedMagic res = COMPRESSED_OTHER;
-       static const char *zcmds[] = { "cat", "gunzip", "bunzip2", "cat" };
+       /*@observer@*/ static const char *zcmds[] =
+               { "cat", "gunzip", "bunzip2", "cat" };
 
        specDir = rpmGetPath("%{_specdir}", NULL);
 
@@ -119,46 +137,48 @@ static int buildForTarget(const char *arg, struct rpmBuildArguments *ba,
        /* XXX FWIW, default %{_specdir} is root.root 0755 */
        {   char tfn[64];
            strcpy(tfn, "rpm-spec.XXXXXX");
+           /*@-unrecog@*/
            tmpSpecFile = rpmGetPath("%{_specdir}/", mktemp(tfn), NULL);
+           /*@=unrecog@*/
        }
 
-       isCompressed(arg, &res);
+       (void) isCompressed(arg, &res);
 
        cmd = alloca(strlen(arg) + 50 + strlen(tmpSpecFile));
        sprintf(cmd, "%s < %s | tar xOvf - Specfile 2>&1 > %s",
                        zcmds[res & 0x3], arg, tmpSpecFile);
        if (!(fp = popen(cmd, "r"))) {
            rpmError(RPMERR_POPEN, _("Failed to open tar pipe: %m\n"));
-           free((void *)specDir);
-           free((void *)tmpSpecFile);
+           specDir = _free(specDir);
+           tmpSpecFile = _free(tmpSpecFile);
            return 1;
        }
        if ((!fgets(buf, sizeof(buf) - 1, fp)) || !strchr(buf, '/')) {
            /* Try again */
-           pclose(fp);
+           (void) pclose(fp);
 
            sprintf(cmd, "%s < %s | tar xOvf - \\*.spec 2>&1 > %s",
                    zcmds[res & 0x3], arg, tmpSpecFile);
            if (!(fp = popen(cmd, "r"))) {
                rpmError(RPMERR_POPEN, _("Failed to open tar pipe: %m\n"));
-               free((void *)specDir);
-               free((void *)tmpSpecFile);
+               specDir = _free(specDir);
+               tmpSpecFile = _free(tmpSpecFile);
                return 1;
            }
            if (!fgets(buf, sizeof(buf) - 1, fp)) {
                /* Give up */
                rpmError(RPMERR_READ, _("Failed to read spec file from %s\n"),
                        arg);
-               unlink(tmpSpecFile);
-               free((void *)specDir);
-               free((void *)tmpSpecFile);
+               (void) unlink(tmpSpecFile);
+               specDir = _free(specDir);
+               tmpSpecFile = _free(tmpSpecFile);
                return 1;
            }
        }
-       pclose(fp);
+       (void) pclose(fp);
 
        cmd = s = buf;
-       while (*cmd) {
+       while (*cmd != '\0') {
            if (*cmd == '/') s = cmd + 1;
            cmd++;
        }
@@ -172,16 +192,16 @@ static int buildForTarget(const char *arg, struct rpmBuildArguments *ba,
        specURL = s = alloca(strlen(specDir) + strlen(cmd) + 5);
        sprintf(s, "%s/%s", specDir, cmd);
        res = rename(tmpSpecFile, s);
-       free((void *)specDir);
+       specDir = _free(specDir);
        
        if (res) {
            rpmError(RPMERR_RENAME, _("Failed to rename %s to %s: %m\n"),
                        tmpSpecFile, s);
-           unlink(tmpSpecFile);
-           free((void *)tmpSpecFile);
+           (void) unlink(tmpSpecFile);
+           tmpSpecFile = _free(tmpSpecFile);
            return 1;
        }
-       free((void *)tmpSpecFile);
+       tmpSpecFile = _free(tmpSpecFile);
 
        /* Make the directory which contains the tarball the source 
           directory for this run */
@@ -201,6 +221,7 @@ static int buildForTarget(const char *arg, struct rpmBuildArguments *ba,
     } else {
        specURL = arg;
     }
+    /*@=compmempass@*/
 
     specut = urlPath(specURL, &specFile);
     if (*specFile != '/') {
@@ -248,7 +269,7 @@ static int buildForTarget(const char *arg, struct rpmBuildArguments *ba,
     initSourceHeader(spec);
 
     /* Check build prerequisites */
-    if (!ba->noDeps && checkSpec(spec->sourceHeader)) {
+    if (!ba->noDeps && checkSpec(ts, spec->sourceHeader)) {
        rc = 1;
        goto exit;
     }
@@ -258,28 +279,26 @@ static int buildForTarget(const char *arg, struct rpmBuildArguments *ba,
        goto exit;
     }
     
-    if (ba->buildMode == 't') Unlink(specURL);
+    if (ba->buildMode == 't')
+       (void) Unlink(specURL);
     rc = 0;
 
 exit:
-    if (spec)
-       freeSpec(spec);
-    if (buildRootURL)
-       free((void *)buildRootURL);
+    spec = freeSpec(spec);
+    buildRootURL = _free(buildRootURL);
     return rc;
 }
 
-int build(const char * arg, struct rpmBuildArguments * ba,
-       const char * passPhrase, char * cookie, const char * rcfile)
+int build(rpmts ts, const char * arg, BTA_t ba, const char * rcfile)
 {
     char *t, *te;
     int rc = 0;
-    char *targets = ba->targets;
+    char * targets = ba->targets;
 #define        buildCleanMask  (RPMBUILD_RMSOURCE|RPMBUILD_RMSPEC)
     int cleanFlags = ba->buildAmount & buildCleanMask;
 
     if (targets == NULL) {
-       rc =  buildForTarget(arg, ba, passPhrase, cookie);
+       rc =  buildForTarget(ts, arg, ba);
        goto exit;
     }
 
@@ -295,7 +314,7 @@ int build(const char * arg, struct rpmBuildArguments * ba,
        target = alloca(te-t+1);
        strncpy(target, t, (te-t));
        target[te-t] = '\0';
-       if (*te)
+       if (*te != '\0')
            te++;
        else    /* XXX Perform clean-up after last target build. */
            ba->buildAmount |= cleanFlags;
@@ -304,8 +323,8 @@ int build(const char * arg, struct rpmBuildArguments * ba,
 
        /* Read in configuration for target. */
        rpmFreeMacros(NULL);
-       rpmReadConfigFiles(rcfile, target);
-       rc = buildForTarget(arg, ba, passPhrase, cookie);
+       (void) rpmReadConfigFiles(rcfile, target);
+       rc = buildForTarget(ts, arg, ba);
        if (rc)
            break;
     }
@@ -313,6 +332,7 @@ int build(const char * arg, struct rpmBuildArguments * ba,
 exit:
     /* Restore original configuration. */
     rpmFreeMacros(NULL);
-    rpmReadConfigFiles(rcfile, NULL);
+    (void) rpmReadConfigFiles(rcfile, NULL);
+
     return rc;
 }