socsvn commit: r305167 - soc2016/yuanxunzhang/head/usr.sbin/eaps
yuanxunzhang at FreeBSD.org
yuanxunzhang at FreeBSD.org
Mon Jun 13 23:18:07 UTC 2016
Author: yuanxunzhang
Date: Mon Jun 13 23:18:06 2016
New Revision: 305167
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=305167
Log:
EAPS: load the eaps module, when user create eaps instance
Modified:
soc2016/yuanxunzhang/head/usr.sbin/eaps/eaps.c
Modified: soc2016/yuanxunzhang/head/usr.sbin/eaps/eaps.c
==============================================================================
--- soc2016/yuanxunzhang/head/usr.sbin/eaps/eaps.c Mon Jun 13 22:31:16 2016 (r305166)
+++ soc2016/yuanxunzhang/head/usr.sbin/eaps/eaps.c Mon Jun 13 23:18:06 2016 (r305167)
@@ -31,6 +31,8 @@
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
+#include <sys/module.h>
+#include <sys/linker.h>
#include <net/if.h>
#include <sys/param.h>
#include <sys/file.h>
@@ -54,9 +56,7 @@
* EAPS Command Line Module - configure, and display eaps
*/
-/*
-* EAPS Configuration Descriptor
-*/
+static const char eaps_ifname[] = "eaps";
static struct keytab {
const char *kt_cp;
@@ -71,6 +71,7 @@
static void delete_domain(int, char **);
static void display(int, char **);
static void usage(const char *);
+void load_module(const char *);
int
main(int argc, char **argv)
@@ -98,6 +99,35 @@
return retval;
}
+void
+load_module(const char *module_name)
+{
+ struct module_stat mstat;
+
+ mstat.version = sizeof(struct module_stat);
+
+ for (fileid = kldnext(0); fileid > 0; fileid = kldnext(fileid)) {
+ /* scan modules in file */
+ for (modid = kldfirstmod(fileid); modid > 0;
+ modid = modfnext(modid)) {
+ if (modstat(modid, &mstat) < 0)
+ continue;
+ /* strip bus name if present */
+ if ((cp = strchr(mstat.name, '/')) != NULL) {
+ cp++;
+ } else {
+ cp = mstat.name;
+ }
+ /* already loaded? */
+ if (strcmp(module_name, cp) == 0)
+ return;
+ }
+ }
+
+ /* not present, we should try to load it */
+ kldload(module_name);
+}
+
static void
create_domain(int argc, char **argv, int s)
{
@@ -107,10 +137,13 @@
printf("Create eaps %s!\n", domain_name);
// Create EAPS interface
+ /* check and maybe load support for this interface */
+ load_module(eaps_ifname);
+
struct ifreq ifr;
memset(&ifr, 0, sizeof(ifr));
- (void) strlcpy(ifr.ifr_name, "eaps", sizeof(ifr.ifr_name));
+ (void) strlcpy(ifr.ifr_name, eaps_ifname, sizeof(ifr.ifr_name));
if (ioctl(s, SIOCIFCREATE2, &ifr) < 0)
err(1, "SIOCIFCREATE2");
More information about the svn-soc-all
mailing list