summaryrefslogtreecommitdiff
path: root/build/parsePolicies.c
diff options
context:
space:
mode:
authorKim Kibum <kb0929.kim@samsung.com>2012-05-21 17:49:08 +0900
committerKim Kibum <kb0929.kim@samsung.com>2012-05-21 17:49:08 +0900
commitdec48cfa66e17ba4a7e50c92cb24b913289feb12 (patch)
treee1f48cd5cabb40a1d604b36949ff072d01267cb5 /build/parsePolicies.c
parentb7a3bffb8e0341b7e4ef69def268bca3a7f279ff (diff)
downloadrpm-dec48cfa66e17ba4a7e50c92cb24b913289feb12.tar.gz
rpm-dec48cfa66e17ba4a7e50c92cb24b913289feb12.tar.bz2
rpm-dec48cfa66e17ba4a7e50c92cb24b913289feb12.zip
Upload Tizen:Base source
Diffstat (limited to 'build/parsePolicies.c')
-rw-r--r--build/parsePolicies.c89
1 files changed, 89 insertions, 0 deletions
diff --git a/build/parsePolicies.c b/build/parsePolicies.c
new file mode 100644
index 0000000..2abc00c
--- /dev/null
+++ b/build/parsePolicies.c
@@ -0,0 +1,89 @@
+/** \ingroup rpmbuild
+ * \file build/parsePolicies.c
+ * Parse %policies section from spec file.
+ */
+
+#include "system.h"
+
+#include <rpm/header.h>
+#include <rpm/rpmbuild.h>
+#include <rpm/rpmlog.h>
+#include <rpm/rpmfileutil.h>
+#include "build/rpmbuild_internal.h"
+#include "debug.h"
+
+int parsePolicies(rpmSpec spec)
+{
+ int nextPart, res = PART_ERROR;
+ Package pkg;
+ int rc, argc;
+ int arg;
+ const char **argv = NULL;
+ const char *name = NULL;
+ int flag = PART_SUBNAME;
+ poptContext optCon = NULL;
+
+ struct poptOption optionsTable[] = {
+ {NULL, 'n', POPT_ARG_STRING, &name, 'n', NULL, NULL},
+ {0, 0, 0, 0, 0, NULL, NULL}
+ };
+
+ if ((rc = poptParseArgvString(spec->line, &argc, &argv))) {
+ rpmlog(RPMLOG_ERR, _("line %d: Error parsing %%policies: %s\n"),
+ spec->lineNum, poptStrerror(rc));
+ goto exit;
+ }
+
+ optCon = poptGetContext(NULL, argc, argv, optionsTable, 0);
+ while ((arg = poptGetNextOpt(optCon)) > 0) {
+ if (arg == 'n') {
+ flag = PART_NAME;
+ }
+ }
+
+ if (arg < -1) {
+ rpmlog(RPMLOG_ERR, _("line %d: Bad option %s: %s\n"),
+ spec->lineNum,
+ poptBadOption(optCon, POPT_BADOPTION_NOALIAS), spec->line);
+ goto exit;
+ }
+
+ if (poptPeekArg(optCon)) {
+ if (name == NULL)
+ name = poptGetArg(optCon);
+ if (poptPeekArg(optCon)) {
+ rpmlog(RPMLOG_ERR, _("line %d: Too many names: %s\n"),
+ spec->lineNum, spec->line);
+ goto exit;
+ }
+ }
+
+ if (lookupPackage(spec, name, flag, &pkg)) {
+ rpmlog(RPMLOG_ERR, _("line %d: Package does not exist: %s\n"),
+ spec->lineNum, spec->line);
+ goto exit;
+ }
+
+ if ((rc = readLine(spec, STRIP_TRAILINGSPACE | STRIP_COMMENTS)) > 0) {
+ nextPart = PART_NONE;
+ } else if (rc < 0) {
+ goto exit;
+ } else {
+ while (!(nextPart = isPart(spec->line))) {
+ argvAdd(&(pkg->policyList), spec->line);
+ if ((rc = readLine(spec, STRIP_TRAILINGSPACE | STRIP_COMMENTS)) > 0) {
+ nextPart = PART_NONE;
+ break;
+ } else if (rc < 0) {
+ goto exit;
+ }
+ }
+ }
+ res = nextPart;
+
+ exit:
+ argv = _free(argv);
+ optCon = poptFreeContext(optCon);
+
+ return res;
+}