22353495 setting the XCCDF rule's role to unscored, has no effect on the scoring
authorJacob Varughese <jacob.varughese@oracle.com>
Fri, 13 May 2016 18:08:27 -0700
changeset 5985 6b195cad32d4
parent 5984 a0d520e4038e
child 5986 bab15c34f645
22353495 setting the XCCDF rule's role to unscored, has no effect on the scoring 22380388 openscap delivers file under /usr/etc 18428552 need a probe to implement the OVAL solaris package511 schema 22908304 openscap*.py should not be in /64 subdir 23144774 Addition of fts to libc requires OpenSCAP fts_sun.h change 21368296 compliance command stumbles on results.xccdf.xml files with invalid characters
components/openscap/Makefile
components/openscap/openscap-python-PYVER.p5m
components/openscap/openscap.p5m
components/openscap/patches/oscap_acquire.c.patch
components/openscap/patches/result_scoring.c.patch
components/openscap/patches/zz_probe_package511.patch
components/openscap/patches/zzz_fts_sun.h.patch
--- a/components/openscap/Makefile	Fri May 13 17:33:56 2016 -0700
+++ b/components/openscap/Makefile	Fri May 13 18:08:27 2016 -0700
@@ -47,6 +47,9 @@
 
 CONFIGURE_BINDIR.64 =	$(CONFIGURE_PREFIX)/bin
 CPPFLAGS +=	-I$(USRINCDIR)/openldap
+RAD_CLIENT_LIB_PATH =   /usr/lib/rad/client/c/$(MACH64)
+
+LDFLAGS += -L$(RAD_CLIENT_LIB_PATH) -R$(RAD_CLIENT_LIB_PATH) -lradclient -ladr -lips_client
 
 # XXX This shouldn't be necessary, but is; investigate why.
 CFLAGS += -D_FILE_OFFSET_BITS=64
@@ -60,7 +63,9 @@
 
 COMPONENT_POST_INSTALL_ACTION =	\
 	$(RM) $(PROTO_DIR)/usr/share/openscap/cpe/* && \
-	$(CP) files/cpe/* $(PROTO_DIR)/usr/share/openscap/cpe;
+	$(CP) files/cpe/* $(PROTO_DIR)/usr/share/openscap/cpe; \
+	$(MV) $(PROTO_DIR)/usr/lib/python2.7/vendor-packages/64/*.py* \
+	$(PROTO_DIR)/usr/lib/python2.7/vendor-packages/ ;
 
 
 # Needed to make "gmake test" work.
@@ -81,7 +86,7 @@
 EXTRA_LIBS +=		-lnsl -lsocket
 endif
 EXTRA_LIBS +=		-lscf -ldlpi -lsec -lzonecfg -lv12n
-CONFIGURE_OPTIONS +=	LIBS="$(EXTRA_LIBS)"
+CONFIGURE_OPTIONS +=	LDFLAGS="$(LDFLAGS) $(EXTRA_LIBS)"
 
 DOCS_DIR = $(PROTO_DIR)/usr/share/doc/openscap/html/
 
@@ -106,5 +111,7 @@
 REQUIRED_PACKAGES += system/library/math
 REQUIRED_PACKAGES += system/library/security/libgcrypt
 REQUIRED_PACKAGES += system/library/libv12n
+REQUIRED_PACKAGES += system/management/rad
+REQUIRED_PACKAGES += system/management/rad/client/rad-c
 REQUIRED_PACKAGES += system/zones
 REQUIRED_PACKAGES += web/curl
--- a/components/openscap/openscap-python-PYVER.p5m	Fri May 13 17:33:56 2016 -0700
+++ b/components/openscap/openscap-python-PYVER.p5m	Fri May 13 18:08:27 2016 -0700
@@ -35,8 +35,8 @@
 set name=org.opensolaris.consolidation value=$(CONSOLIDATION)
 #
 file path=usr/lib/python$(PYVER)/vendor-packages/64/_openscap_py.so
-file path=usr/lib/python$(PYVER)/vendor-packages/64/openscap.py
-file path=usr/lib/python$(PYVER)/vendor-packages/64/openscap_api.py
+file path=usr/lib/python$(PYVER)/vendor-packages/openscap.py
+file path=usr/lib/python$(PYVER)/vendor-packages/openscap_api.py
 license openscap.license license="LGPLv2.1, LGPLv3, OVAL"
 
 # force a dependency on the Python $(PYVER) runtime
--- a/components/openscap/openscap.p5m	Fri May 13 17:33:56 2016 -0700
+++ b/components/openscap/openscap.p5m	Fri May 13 18:08:27 2016 -0700
@@ -38,7 +38,6 @@
 
 
 file path=usr/bin/oscap
-file path=usr/etc/bash_completion.d/oscap
 file path=usr/include/openscap/check_engine_plugin.h
 file path=usr/include/openscap/cpe_dict.h
 file path=usr/include/openscap/cpe_lang.h
@@ -89,6 +88,7 @@
 file path=usr/lib/$(MACH64)/openscap/probe_isainfo
 file path=usr/lib/$(MACH64)/openscap/probe_ldap57
 file path=usr/lib/$(MACH64)/openscap/probe_package
+file path=usr/lib/$(MACH64)/openscap/probe_package511
 file path=usr/lib/$(MACH64)/openscap/probe_password
 file path=usr/lib/$(MACH64)/openscap/probe_patch
 file path=usr/lib/$(MACH64)/openscap/probe_process
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/openscap/patches/oscap_acquire.c.patch	Fri May 13 18:08:27 2016 -0700
@@ -0,0 +1,22 @@
+This patch fixes issues with the report not working
+when the SCE script output contains special characters.
+This patch has not been submitted upstream but
+will be by 2016-Jun-01.
+--- openscap-1.2.6/src/common/oscap_acquire.c.~1~	2016-05-09 10:10:31.879607312 -0700
++++ openscap-1.2.6/src/common/oscap_acquire.c	2016-05-09 10:15:56.086122585 -0700
+@@ -183,6 +183,15 @@
+ 			// & is a special case, we have to "escape" it manually
+ 			// (all else will eventually get handled by libxml)
+ 			oscap_string_append_string(pipe_string, "&amp;");
++                } else if (readbuf < 0x20 && !(readbuf == '\t' ||
++               readbuf == '\n' || readbuf == '\r')) {
++            // libxml doesn't tolerate most control characters
++            // in its input stream, reformat
++            char tranbuf[5];
++
++            snprintf(tranbuf, sizeof(tranbuf), "\\%03o", readbuf);
++            oscap_string_append_string(pipe_string, tranbuf);
++
+ 		} else {
+ 			oscap_string_append_char(pipe_string, readbuf);
+ 		}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/openscap/patches/result_scoring.c.patch	Fri May 13 18:08:27 2016 -0700
@@ -0,0 +1,31 @@
+This patch is from the community and resolves the issue when XCCDF rule
+role=unscored is set, the rule is not counted against the score of the
+benchmark. This patch will no longer be needed once we pull in the
+latest version of openscap from the cummunity.  
+
+--- openscap-1.2.6/src/XCCDF/result_scoring.c.~1~	2015-10-02 08:22:02.497343616 -0700
++++ openscap-1.2.6/src/XCCDF/result_scoring.c	2016-01-07 08:57:38.143524150 -0800
+@@ -71,7 +71,10 @@
+ 		const char *rule_id = xccdf_rule_get_id((const struct xccdf_rule *) item);
+ 		rule_result = xccdf_result_get_rule_result_by_id(test_result, rule_id);
+ 		if (rule_result == NULL) {
+-			dE("Rule result ID(%s) not fount", rule_id);
++			dE("Rule result ID(%s) not found", rule_id);
++			return NULL;
++		}
++		if (xccdf_rule_result_get_role(rule_result) == XCCDF_ROLE_UNSCORED) {
+ 			return NULL;
+ 		}
+ 
+@@ -168,7 +171,10 @@
+ 		const char *rule_id = xccdf_rule_get_id((const struct xccdf_rule *) item);
+ 		rule_result = xccdf_result_get_rule_result_by_id(test_result, rule_id);
+ 		if (rule_result == NULL) {
+-			dE("Rule result ID(%s) not fount", rule_id);
++			dE("Rule result ID(%s) not found", rule_id);
++			return NULL;
++		}
++		if (xccdf_rule_result_get_role(rule_result) == XCCDF_ROLE_UNSCORED) {
+ 			return NULL;
+ 		}
+ 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/openscap/patches/zz_probe_package511.patch	Fri May 13 18:08:27 2016 -0700
@@ -0,0 +1,435 @@
+This patch implements the package_511 schema probe
+for solaris.
+This patch has not been submitted upstream but will
+be by 2016-Jul-15.
+--- openscap-1.2.6/src/OVAL/oval_enumerations.c.~3~	2016-02-23 12:20:08.398905458 -0800
++++ openscap-1.2.6/src/OVAL/oval_enumerations.c	2016-02-23 12:21:52.263496707 -0800
+@@ -516,6 +516,7 @@
+ 	{OVAL_SOLARIS_PACKAGECHECK, "packagecheck"},
+ 	{OVAL_SOLARIS_SMFPROPERTY, "smfproperty"},
+ 	{OVAL_SOLARIS_VIRTUALIZATIONINFO, "virtualizationinfo"},
++	{OVAL_SOLARIS_PACKAGE511, "package511"},
+ 	{OVAL_SUBTYPE_UNKNOWN, NULL}
+ };
+ 
+--- openscap-1.2.6/src/OVAL/probes/Makefile.am.~3~	2016-02-23 12:24:40.391851036 -0800
++++ openscap-1.2.6/src/OVAL/probes/Makefile.am	2016-02-23 12:24:03.718455915 -0800
+@@ -218,6 +218,11 @@
+ probe_virtualizationinfo_SOURCES= unix/solaris/virtualizationinfo.c
+ endif
+ 
++if probe_package511_enabled
++pkglibexec_PROGRAMS += probe_package511
++probe_package511_SOURCES =unix/solaris/package511.c
++endif
++
+ endif
+ 
+ #
+--- openscap-1.2.6/src/OVAL/public/oval_types.h.~2~	2016-02-23 13:06:40.621110617 -0800
++++ openscap-1.2.6/src/OVAL/public/oval_types.h	2016-02-23 13:07:12.072800278 -0800
+@@ -240,7 +240,8 @@
+ 	OVAL_SOLARIS_NDD = OVAL_FAMILY_SOLARIS + 6,
+ 	OVAL_SOLARIS_PACKAGECHECK = OVAL_FAMILY_SOLARIS + 7,
+ 	OVAL_SOLARIS_SMFPROPERTY = OVAL_FAMILY_SOLARIS + 8,
+-	OVAL_SOLARIS_VIRTUALIZATIONINFO = OVAL_FAMILY_SOLARIS + 9
++	OVAL_SOLARIS_VIRTUALIZATIONINFO = OVAL_FAMILY_SOLARIS + 9,
++	OVAL_SOLARIS_PACKAGE511 = OVAL_FAMILY_SOLARIS + 10
+ } oval_solaris_subtype_t;
+ 
+ /// Unix subtypes
+--- openscap-1.2.6/configure.ac.~5~	2016-02-23 12:45:30.591588060 -0800
++++ openscap-1.2.6/configure.ac	2016-02-23 12:47:23.889508750 -0800
+@@ -269,6 +269,10 @@
+ probe_virtualizationinfo_req_deps_missing=
+ probe_virtualizationinfo_opt_deps_ok=yes
+ probe_virtualizationinfo_opt_deps_missing=
++probe_package511_req_deps_ok=yes
++probe_package511_req_deps_missing=
++probe_package511_opt_deps_ok=yes
++probe_package511_opt_deps_missing=
+ 
+ #
+ # env
+@@ -1365,6 +1369,8 @@
+ probe_smfproperty_enabled=$probe_smfproperty_req_deps_ok
+ AM_CONDITIONAL([probe_virtualizationinfo_enabled], test "$probe_virtualizationinfo_req_deps_ok" = yes)
+ probe_virtualizationinfo_enabled=$probe_virtualizationinfo_req_deps_ok
++AM_CONDITIONAL([probe_package511_enabled], test "$probe_package511_req_deps_ok" = yes)
++probe_package511_enabled=$probe_package511_req_deps_ok
+ 
+ AM_CONDITIONAL([WANT_CCE],  test "$cce"  = yes)
+ 
+@@ -1803,6 +1809,12 @@
+   probe_virtualizationinfo_table_result="NO (missing: $probe_virtualizationinfo_req_deps_missing)"
+ fi
+ printf "  %-28s %s\n" "virtualizationinfo:" "$probe_virtualizationinfo_table_result"
++if test "$probe_package511_req_deps_ok" = "yes"; then
++  probe_package511_table_result="yes"
++else
++  probe_package511_table_result="NO (missing: $probe_package511_req_deps_missing)"
++fi
++printf "  %-28s %s\n" "package511:" "$probe_package511_table_result"
+ echo
+ echo "  === configuration ==="
+ echo "  probe directory set to:      $probe_dir"
+--- openscap-1.2.6/src/OVAL/oval_probe.c.~2~	2016-02-25 13:35:49.511778373 -0800
++++ openscap-1.2.6/src/OVAL/oval_probe.c	2016-02-25 13:36:30.685802320 -0800
+@@ -94,7 +94,8 @@
+         OVAL_PROBE_EXTERNAL(OVAL_UNIX_SYMLINK, "symlink"),
+         OVAL_PROBE_EXTERNAL(OVAL_SOLARIS_SMF, "smf"),
+         OVAL_PROBE_EXTERNAL(OVAL_SOLARIS_SMFPROPERTY,"smfproperty"),
+-        OVAL_PROBE_EXTERNAL(OVAL_SOLARIS_VIRTUALIZATIONINFO, "virtualizationinfo")
++        OVAL_PROBE_EXTERNAL(OVAL_SOLARIS_VIRTUALIZATIONINFO, "virtualizationinfo"),
++        OVAL_PROBE_EXTERNAL(OVAL_SOLARIS_PACKAGE511, "package511")
+ };
+ 
+ #define __PROBE_META_COUNT (sizeof OSCAP_GSYM(__probe_meta)/sizeof OSCAP_GSYM(__probe_meta)[0])
++#endif
+--- openscap-1.2.6/src/OVAL/probes/unix/solaris/package511.c.~1~	2016-04-19 09:54:58.291212479 -0700
++++ openscap-1.2.6/src/OVAL/probes/unix/solaris/package511.c	2016-04-19 09:58:06.575618974 -0700
+@@ -0,0 +1,344 @@
++/**
++ * @file package511.c
++ * @brief package511 probe
++ * @author "Jacob Varughese" <[email protected]>
++ *
++ * This probe retrieves the meta data from packages.
++ */
++
++
++#include "probe-api.h"
++#ifdef HAVE_CONFIG_H
++#include <config.h>
++#endif
++
++#if	defined(__SVR4) && defined(__sun)
++#include <stdlib.h>
++#include <string.h>
++#include <stdio.h>
++#include <errno.h>
++#include <sys/stat.h>
++#include <ctype.h>
++#include <sys/types.h>
++#include <limits.h>
++#include <unistd.h>
++#include <sys/types.h>
++#include <rad/client/1/ips.h>
++#include "seap.h"
++#include "probe/entcmp.h"
++#include "alloc.h"
++#include "common/debug_priv.h"
++
++/* Convenience structure for the results being reported */
++
++/*
++ * package511 probe:
++ *
++ *
++ * publisher;
++ * pkgname;
++ * version;
++ * timestamp;
++ * fmri;
++ * summary;
++ * description;
++ * category;
++ * updates_available;
++ */
++
++
++/* Convenience structure for the results being reported */
++struct result_info {
++	char *publisher;
++	char *pkgname;
++	char *version;
++	char *timestamp;
++	char *fmri;
++	char *summary;
++	char *description;
++	char *category;
++	boolean_t updates_available;
++};
++
++#define STR(x) ((x == NULL) ? "" : x)
++
++static void
++report_pkg_metadata(struct result_info *res, probe_ctx *ctx)
++{
++	SEXP_t *item;
++
++	item = probe_item_create(OVAL_SOLARIS_PACKAGE511, NULL,
++	    "publisher", OVAL_DATATYPE_STRING, STR(res->publisher),
++	    "name", OVAL_DATATYPE_STRING, STR(res->pkgname),
++	    "version", OVAL_DATATYPE_VERSION, STR(res->version),
++	    "timestamp", OVAL_DATATYPE_STRING, STR(res->timestamp),
++	    "fmri", OVAL_DATATYPE_STRING, STR(res->fmri),
++	    "summary", OVAL_DATATYPE_STRING, STR(res->summary),
++	    "description", OVAL_DATATYPE_STRING, STR(res->description),
++	    "category", OVAL_DATATYPE_STRING, STR(res->category),
++	    "updates_available", OVAL_DATATYPE_BOOLEAN, res->updates_available,
++	    NULL);
++	probe_item_collect(ctx, item);
++}
++
++#if !defined(NDEBUG)
++void
++print_list(int status, char *interface,  int *name_count,
++    adr_name_t **name_list)
++{
++	int i;
++	if (status == RCE_OK) {
++		dI("Found %s\n", interface);
++	       for (i = 0; i < *name_count; i++) {
++		        const char *name = adr_name_tostr(name_list[i]);
++			dI("%s\n", name);
++		}
++	}
++}
++#endif
++
++int
++print_pkginfo(rc_instance_t *pkginfo_inst, struct result_info *r)
++{
++	rc_err_t status;
++
++	status = ips_PkgInfo_get_pkg_name(pkginfo_inst, &(r->pkgname));
++	if (status != RCE_OK) {
++		dI("PkgInfo_get_pkg_name failed.\n");
++	}
++	dI("pkg name=%s\n", r->pkgname);
++	status = ips_PkgInfo_get_summary(pkginfo_inst, &(r->summary));
++	if (status != RCE_OK) {
++		dI("PkgInfo_get_summary failed.\n");
++	} else {
++		dI("summary=%s\n", r->summary);
++	}
++	status = ips_PkgInfo_get_description(pkginfo_inst,
++	    &(r->description));
++	if (status != RCE_OK) {
++		dI("PkgInfo_get_description failed.\n");
++	} else {
++		dI("description=%s\n", r->description);
++	}
++	status = ips_PkgInfo_get_category(pkginfo_inst, &(r->category));
++	if (status != RCE_OK) {
++		dI("PkgInfo_get_category failed.\n");
++	} else {
++		dI("category=%s\n", r->category);
++	}
++	return (0);
++}
++
++int
++print_fmriinfo(rc_instance_t *fmri_inst, struct result_info *r)
++{
++		rc_err_t status;
++
++		status = ips_PkgFmri_get_name(fmri_inst, &(r->pkgname));
++		if (status != RCE_OK) {
++			dI("PkgFmri_get_name failed.\n");
++		}
++		dI("name=%s\n", r->pkgname);
++		status = ips_PkgFmri_get_version(fmri_inst, &(r->version));
++		if (status != RCE_OK) {
++			dI("PkgFmri_get_version failed.\n");
++		} else {
++			dI("version=%s\n", r->version);
++		}
++		status = ips_PkgFmri_get_timestamp(fmri_inst, &(r->timestamp));
++		if (status != RCE_OK) {
++			dI("PkgFmri_get_timestamp failed.\n");
++		} else {
++			dI("timestamp=%s\n", r->timestamp);
++		}
++		status = ips_PkgFmri_get_publisher(fmri_inst, &(r->publisher));
++		if (status != RCE_OK) {
++			dI("PkgFmri_get_publisher failed.\n");
++		} else {
++			dI("publisher=%s\n", r->publisher);
++		}
++		status = ips_PkgFmri_get_fmri(fmri_inst, NULL, NULL, NULL,
++		    NULL, NULL, &(r->fmri));
++		if (status != RCE_OK) {
++			dI("PkgFmri_get_fmri failed.\n");
++		} else {
++			dI("fmri=%s\n", r->fmri);
++		}
++		return (0);
++}
++
++static int
++collect_package_info(char *apkgname, char *aversion, char *atimestamp,
++    char *publisher, probe_ctx *ctx)
++{
++	struct result_info r;
++	rc_conn_t *conn;
++	rc_err_t status;
++	rc_instance_t *pkgimg_inst;
++	rc_instance_t *ipsmgr_inst;
++	int inst_count;
++	ips_PkgError_t* pkg_error;
++	adr_name_t **name_list;
++	adr_name_t *image_name;
++	int name_count, rc = 0;
++
++	dI("In collect_package_info");
++	memset(&r, 0, sizeof(r));
++	/* Connect to rad */
++	conn = rc_connect_unix(NULL, NULL);
++	if (conn == NULL) {
++		dI("Unable to connect to rad.\n");
++		goto error;
++	}
++
++	status = ips_IPSManager__rad_lookup(conn, _B_TRUE, &ipsmgr_inst, 0);
++	if (status != RCE_OK) {
++		dI("IPSManager lookup failed.\n");
++		goto error;
++	}
++	status = ips_IPSManager__rad_list(conn, _B_TRUE, NS_GLOB, &name_list,
++	   &name_count, 0);
++#if !defined(NDEBUG)
++	print_list(status, "IPSManager", &name_count, name_list);
++#endif
++	name_array_free(name_list, name_count);
++
++	status = ips_PkgImage__rad_list(conn, _B_TRUE, NS_GLOB, &name_list,
++	   &name_count, 0);
++	image_name = name_list[0];
++#if !defined(NDEBUG)
++	print_list(status, "PkgImage", &name_count, name_list);
++#endif
++	status = rc_lookup(conn, image_name, NULL,  _B_TRUE, &pkgimg_inst); 
++	name_array_free(name_list, name_count);
++	if (status != RCE_OK) {
++		dI("PkgImage instance lookup failed.\n");
++		goto error;
++	} else {
++		boolean_t installed = _B_TRUE;
++		boolean_t upgradable = _B_FALSE;
++		const char *fmris[1]= {apkgname};
++		rc_instance_t **pkginfo_inst;
++		rc_instance_t *pkgfmri_inst;
++		rc_instance_t **pkgfmris_inst;
++
++		status = ips_PkgImage_list_packages(pkgimg_inst, fmris, 1,
++		    NULL, NULL, 0, &installed, NULL, NULL, &upgradable, NULL,
++		    &pkgfmris_inst, &inst_count, &pkg_error);
++		if (status != RCE_OK) {
++			if (pkg_error != NULL) {
++				dI("rc = %d\n", pkg_error->ipe_error_code);	
++				dI("error = %s\n",
++				    pkg_error->ipe_error_message);
++				goto error;
++			}
++		}
++		dI("Latest revision of %s\n", fmris[0]);
++		if (print_fmriinfo(pkgfmris_inst[0], &r) > 0)
++			goto error;
++		status = ips_PkgImage_info(pkgimg_inst, fmris, 1,
++			NULL, NULL, NULL,
++			NULL, 0, NULL, &pkginfo_inst, &inst_count, &pkg_error);
++		if (status != RCE_OK) {
++			if (pkg_error != NULL) {
++				dI("rc = %d\n", pkg_error->ipe_error_code);	
++				dI("error = %s\n",
++				    pkg_error->ipe_error_message);
++			}
++			dI("PkgImage info failed.\n");
++			goto error;
++		}
++		dI("Got package count=%d\n", inst_count);
++		if (print_pkginfo(pkginfo_inst[0], &r) > 0)
++			goto error;
++		r.updates_available = upgradable;
++		dI("upgradable=%s\n", upgradable ? "true":"false"); 
++	}
++	report_pkg_metadata(&r, ctx);
++error:
++	rc_disconnect(conn);
++	return rc;
++}
++
++int
++probe_main(probe_ctx *ctx, void *arg)
++{
++	SEXP_t *probe_in, *publisher = NULL, *pkgname = NULL, *version = NULL;
++	SEXP_t *timestamp = NULL;
++	SEXP_t *publisher_val = NULL, *pkgname_val = NULL, *version_val = NULL;
++	SEXP_t *timestamp_val = NULL;
++	char *pkgname_str = NULL, *version_str = NULL, *timestamp_str = NULL;
++	char *publisher_str = NULL;
++	int rc;
++
++	probe_in = probe_ctx_getobject(ctx);
++	if (probe_in == NULL) {
++		return PROBE_ENOOBJ;
++	}
++
++	publisher = probe_obj_getent(probe_in, "publisher", 1);
++	if (publisher != NULL) {
++		publisher_val = probe_ent_getval(publisher);
++		publisher_str = SEXP_string_cstr(publisher_val);
++	}
++	if (publisher_str != NULL && strcmp(publisher_str, "") == 0)
++		publisher_str = NULL;
++	dI("publisher in context: %s.\n", (publisher_str==NULL ? "":publisher_str));
++
++	pkgname = probe_obj_getent(probe_in, "name", 1);
++	if (pkgname == NULL) {
++		dE("No pkg name in context.\n");
++		return PROBE_ENOENT;
++	}
++	pkgname_val = probe_ent_getval(pkgname);
++	if (pkgname_val == NULL) {
++		dE("Get service value failed.\n");
++		rc = PROBE_ENOVAL;
++		goto error;
++	}
++	pkgname_str = SEXP_string_cstr(pkgname_val);
++	dI("pkgname in context: %s.\n", pkgname_str);
++
++	version = probe_obj_getent(probe_in, "version", 1);
++	if (version != NULL) {
++		version_val = probe_ent_getval(version);
++		version_str = SEXP_string_cstr(version_val);
++	}
++	if (version_str != NULL && strcmp(version_str, "") == 0)
++		version_str = NULL;
++	dI("version in context: %s.\n", version_str);
++
++	timestamp = probe_obj_getent(probe_in, "timestamp", 1);
++	if (timestamp != NULL) {
++		timestamp_val = probe_ent_getval(timestamp);
++		timestamp_str = SEXP_string_cstr(timestamp_val);
++	}
++	if (timestamp_str != NULL && strcmp(timestamp_str, "") == 0)
++		timestamp_str = NULL;
++	dI("timestamp in context: %s.\n", timestamp_str);
++
++	rc = collect_package_info(pkgname_str, version_str, timestamp_str,
++	    publisher_str, ctx);
++error:
++	free(pkgname_str);
++	free(version_str);
++	free(timestamp_str);
++	free(publisher_str);
++	SEXP_free(pkgname);
++	SEXP_free(version);
++	SEXP_free(timestamp);
++	SEXP_free(publisher);
++	SEXP_free(pkgname_val);
++	SEXP_free(version_val);
++	SEXP_free(timestamp_val);
++	SEXP_free(publisher_val);
++	return rc;
++}
++#else
++
++int
++probe_main(probe_ctx *ctx, void *probe_arg)
++{
++	return PROBE_EOPNOTSUPP;
++}
++#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/openscap/patches/zzz_fts_sun.h.patch	Fri May 13 18:08:27 2016 -0700
@@ -0,0 +1,17 @@
+This patch has been submitted and accepted by
+upstream and can be removed when we bring in 
+the  next version 1.2.9, which will be done
+by 2016-Jun-01.
+
+--- openscap-1.2.6/src/OVAL/fts_sun.h~1~	2016-03-16 10:49:51.181254807 -0700
++++ openscap-1.2.6/src/OVAL/fts_sun.h	2016-03-16 10:50:51.407098175 -0700
+@@ -248,5 +248,9 @@
+ __END_DECLS
+ 
+ #endif /* fts.h */
++#else
++#if defined(__SVR4) && defined(__sun)
++#include <fts.h>
++#endif /* defined(__SVR4) && defined(__sun) */ 
+ 
+ #endif /* HAVE_FTS_OPEN */