Unify usage of iopl-like code by introducing get_io_perms()

Factor out portable iopl()-style code into a global function which all
programmers can use, add missing close() call.

Corresponding to flashrom svn r511.

Signed-off-by: Uwe Hermann <uwe@hermann-uwe.de>
Acked-by: Uwe Hermann <uwe@hermann-uwe.de>
diff --git a/nic3com.c b/nic3com.c
index bc85ce5..a60f594 100644
--- a/nic3com.c
+++ b/nic3com.c
@@ -39,10 +39,6 @@
 struct pci_access *pacc;
 struct pci_filter filter;
 
-#if defined(__FreeBSD__) || defined(__DragonFly__)
-int io_fd;
-#endif
-
 #define OK 0
 #define NT 1	/* Not tested */
 
@@ -102,17 +98,7 @@
 	struct pci_dev *dev;
 	char *msg = NULL;
 
-#if defined (__sun) && (defined(__i386) || defined(__amd64))
-	if (sysi86(SI86V86, V86SC_IOPL, PS_IOPL) != 0) {
-#elif defined(__FreeBSD__) || defined (__DragonFly__)
-	if ((io_fd = open("/dev/io", O_RDWR)) < 0) {
-#else
-	if (iopl(3) != 0) {
-#endif
-		fprintf(stderr, "ERROR: Could not get IO privileges (%s).\n"
-			"You need to be root.\n", strerror(errno));
-		exit(1);
-	}
+	get_io_perms();
 
 	pacc = pci_alloc();     /* Get the pci_access structure */
 	pci_init(pacc);         /* Initialize the PCI library */
@@ -155,6 +141,9 @@
 {
 	free(nic_pcidev);
 	pci_cleanup(pacc);
+#if defined(__FreeBSD__) || defined(__DragonFly__)
+	close(io_fd);
+#endif
 	return 0;
 }