components/openscap/patches/system_info.c.patch
changeset 1369 20813e08fff3
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/openscap/patches/system_info.c.patch	Tue Jun 25 10:43:56 2013 -0700
@@ -0,0 +1,97 @@
+This patch provides the system info probe functionality for solaris. It
+detects the ethernet network interfaces and MAC and IP addresses associated
+with them.
+This patch has not been contributed upstream, but is planned to be done by
+ 2013-Jul-12.
+
+--- openscap-0.9.5/src/OVAL/probes/independent/system_info.c.~1~	2012-11-06 05:51:30.048128639 -0800
++++ openscap-0.9.5/src/OVAL/probes/independent/system_info.c	2013-04-03 15:04:36.221945232 -0700
+@@ -92,7 +92,73 @@
+ 
+        return mac_buf;
+ }
++#else if defined(__SVR4) && defined(__sun)
++#include <sys/socket.h>
++#include <ifaddrs.h>
++#include <netdb.h>
++#include <sys/ioctl.h>
++#include <string.h>
++#include <net/if.h>
++#include <arpa/inet.h>
++#include <sys/sockio.h>
++#include <net/if_types.h>
++#include <libdlpi.h>
+ 
++static int fd=-1;
++
++static char *get_mac(const struct ifaddrs *ifa)
++{
++       struct lifreq lifr;
++	uint_t physaddrlen = DLPI_PHYSADDR_MAX;
++	uchar_t physaddr[DLPI_PHYSADDR_MAX];
++	static char mac_buf[DLPI_PHYSADDR_MAX];
++	char *str;
++	int retv;
++	dlpi_handle_t dh;
++	dlpi_info_t dlinfo;
++
++	memset(mac_buf, 0, sizeof(mac_buf));
++       memset(&lifr, 0, sizeof(struct lifreq));
++       strlcpy(lifr.lifr_name, ifa->ifa_name, sizeof (lifr.lifr_name));
++	if (ioctl(fd, SIOCGLIFFLAGS, &lifr) >= 0) {
++
++		if (lifr.lifr_flags & (IFF_VIRTUAL| IFF_IPMP))
++			return (mac_buf);
++
++		if (dlpi_open(lifr.lifr_name, &dh, 0) != DLPI_SUCCESS)
++			return (NULL);
++
++		retv = dlpi_get_physaddr(dh, DL_CURR_PHYS_ADDR, physaddr,
++			&physaddrlen);
++		if (retv != DLPI_SUCCESS) {
++			dlpi_close(dh);
++			return (NULL);
++		}
++		
++		retv = dlpi_info(dh, &dlinfo, DLPI_INFO_VERSION);
++		if (retv != DLPI_SUCCESS) {
++			dlpi_close(dh);
++			return (NULL);
++		}
++		dlpi_close(dh);
++		str = _link_ntoa(physaddr, NULL, physaddrlen, IFT_OTHER);
++
++		if (str != NULL && physaddrlen != 0) {
++			switch(dlinfo.di_mactype) {
++			case DL_IB:
++				break;	
++			default:
++				strlcpy(mac_buf, str, sizeof(mac_buf));
++				break;
++			}
++			free(str);
++		}
++	}
++	return mac_buf;
++}
++#endif
++
++#if defined(__linux__) || (defined(__SVR4) && defined(__sun))
+ static int get_ifs(SEXP_t *item)
+ {
+        struct ifaddrs *ifaddr, *ifa;
+@@ -119,6 +185,14 @@
+                         continue;
+ 
+                 mac = get_mac(ifa);
++#if defined(__SVR4) && defined(__sun)
++		if (mac == NULL) {
++			rc = 1;
++			goto leave2;
++		}
++		if (mac[0] == '\0')
++			continue;
++#endif
+ 		if (family == AF_INET) {
+ 			rc = getnameinfo(ifa->ifa_addr, sizeof(struct sockaddr_in),
+ 				host, NI_MAXHOST, NULL, 0, NI_NUMERICHOST);