summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJoel Sherrill <joel.sherrill@OARcorp.com>1999-03-23 22:39:13 +0000
committerJoel Sherrill <joel.sherrill@OARcorp.com>1999-03-23 22:39:13 +0000
commitb6f5f9385daf2d4b5a6272c5085c7e253f381aa9 (patch)
treec2b6ed42c83093b3efe5827ee653494ee97ea906
parentRegenerated. (diff)
downloadrtems-b6f5f9385daf2d4b5a6272c5085c7e253f381aa9.tar.bz2
Patch from Eric Norum <eric@skatter.usask.ca> to improve parsing of
network interface names. This change does not introduce any compatibility problems.
-rw-r--r--c/src/exec/libnetworking/rtems/rtems_bsdnet_internal.h2
-rw-r--r--c/src/exec/libnetworking/rtems/rtems_glue.c43
-rw-r--r--c/src/lib/libbsp/m68k/gen68360/network/network.c29
-rw-r--r--c/src/lib/libnetworking/rtems/rtems_bsdnet_internal.h2
-rw-r--r--c/src/lib/libnetworking/rtems/rtems_glue.c43
-rw-r--r--c/src/libnetworking/rtems/rtems_bsdnet_internal.h2
-rw-r--r--c/src/libnetworking/rtems/rtems_glue.c43
-rw-r--r--cpukit/libnetworking/rtems/rtems_bsdnet_internal.h2
-rw-r--r--cpukit/libnetworking/rtems/rtems_glue.c43
9 files changed, 198 insertions, 11 deletions
diff --git a/c/src/exec/libnetworking/rtems/rtems_bsdnet_internal.h b/c/src/exec/libnetworking/rtems/rtems_bsdnet_internal.h
index adaecbd5f9..ae1a419bd8 100644
--- a/c/src/exec/libnetworking/rtems/rtems_bsdnet_internal.h
+++ b/c/src/exec/libnetworking/rtems/rtems_bsdnet_internal.h
@@ -116,6 +116,7 @@ struct file;
struct buf;
struct tty;
struct uio;
+struct rtems_bsdnet_ifconfig;
/*
* Redo kernel memory allocation
@@ -130,6 +131,7 @@ void rtems_bsdnet_free (void *addr, int type);
void rtems_bsdnet_semaphore_obtain (void);
void rtems_bsdnet_semaphore_release (void);
void rtems_bsdnet_schednetisr (int n);
+int rtems_bsdnet_parse_driver_name (const struct rtems_bsdnet_ifconfig *config, char **namep);
unsigned long rtems_bsdnet_seconds_since_boot (void);
unsigned long rtems_bsdnet_random (void);
diff --git a/c/src/exec/libnetworking/rtems/rtems_glue.c b/c/src/exec/libnetworking/rtems/rtems_glue.c
index 0601e5659f..ab734c1aca 100644
--- a/c/src/exec/libnetworking/rtems/rtems_glue.c
+++ b/c/src/exec/libnetworking/rtems/rtems_glue.c
@@ -882,3 +882,46 @@ rtems_bsdnet_initialize_network (void)
(*rtems_bsdnet_config.bootp)();
return 0;
}
+
+/*
+ * Parse a network driver name into a name and a unit number
+ */
+int
+rtems_bsdnet_parse_driver_name (const struct rtems_bsdnet_ifconfig *config, char **namep)
+{
+ const char *cp = config->name;
+ char c;
+ int unitNumber = 0;
+
+ if (cp == NULL) {
+ printf ("No network driver name");
+ return -1;
+ }
+ while ((c = *cp++) != '\0') {
+ if ((c >= '0') && (c <= '9')) {
+ int len = cp - config->name - 1;
+ if ((len < 2) || (len > 50))
+ break;
+ for (;;) {
+ unitNumber = (unitNumber * 10) + (c - '0');
+ c = *cp++;
+ if (c == '\0') {
+ char *unitName = malloc (len);
+ if (unitName == NULL) {
+ printf ("No memory");
+ return -1;
+ }
+ strncpy (unitName, config->name, len - 1);
+ unitName[len-1] = '\0';
+ *namep = unitName;
+ return unitNumber;
+ }
+ if ((c < '0') || (c > '9'))
+ break;
+ }
+ break;
+ }
+ }
+ printf ("Bad network driver name `%s'", config->name);
+ return -1;
+}
diff --git a/c/src/lib/libbsp/m68k/gen68360/network/network.c b/c/src/lib/libbsp/m68k/gen68360/network/network.c
index bc10e220b4..b2887dad6d 100644
--- a/c/src/lib/libbsp/m68k/gen68360/network/network.c
+++ b/c/src/lib/libbsp/m68k/gen68360/network/network.c
@@ -852,19 +852,26 @@ rtems_scc1_driver_attach (struct rtems_bsdnet_ifconfig *config)
struct scc_softc *sc;
struct ifnet *ifp;
int mtu;
- int i;
+ int unitNumber;
+ char *unitName;
/*
- * Find a free driver
+ * Parse driver name
*/
- for (i = 0 ; i < NSCCDRIVER ; i++) {
- sc = &scc_softc[i];
- ifp = &sc->arpcom.ac_if;
- if (ifp->if_softc == NULL)
- break;
+ if ((unitNumber = rtems_bsdnet_parse_driver_name (config, &unitName)) < 0)
+ return 0;
+
+ /*
+ * Is driver free?
+ */
+ if ((unitNumber <= 0) || (unitNumber > NSCCDRIVER)) {
+ printf ("Bad SCC unit number.\n");
+ return 0;
}
- if (i >= NSCCDRIVER) {
- printf ("Too many SCC drivers.\n");
+ sc = &scc_softc[unitNumber - 1];
+ ifp = &sc->arpcom.ac_if;
+ if (ifp->if_softc != NULL) {
+ printf ("Driver already in use.\n");
return 0;
}
@@ -930,8 +937,8 @@ rtems_scc1_driver_attach (struct rtems_bsdnet_ifconfig *config)
* Set up network interface values
*/
ifp->if_softc = sc;
- ifp->if_unit = i + 1;
- ifp->if_name = "scc";
+ ifp->if_unit = unitNumber;
+ ifp->if_name = unitName;
ifp->if_mtu = mtu;
ifp->if_init = scc_init;
ifp->if_ioctl = scc_ioctl;
diff --git a/c/src/lib/libnetworking/rtems/rtems_bsdnet_internal.h b/c/src/lib/libnetworking/rtems/rtems_bsdnet_internal.h
index adaecbd5f9..ae1a419bd8 100644
--- a/c/src/lib/libnetworking/rtems/rtems_bsdnet_internal.h
+++ b/c/src/lib/libnetworking/rtems/rtems_bsdnet_internal.h
@@ -116,6 +116,7 @@ struct file;
struct buf;
struct tty;
struct uio;
+struct rtems_bsdnet_ifconfig;
/*
* Redo kernel memory allocation
@@ -130,6 +131,7 @@ void rtems_bsdnet_free (void *addr, int type);
void rtems_bsdnet_semaphore_obtain (void);
void rtems_bsdnet_semaphore_release (void);
void rtems_bsdnet_schednetisr (int n);
+int rtems_bsdnet_parse_driver_name (const struct rtems_bsdnet_ifconfig *config, char **namep);
unsigned long rtems_bsdnet_seconds_since_boot (void);
unsigned long rtems_bsdnet_random (void);
diff --git a/c/src/lib/libnetworking/rtems/rtems_glue.c b/c/src/lib/libnetworking/rtems/rtems_glue.c
index 0601e5659f..ab734c1aca 100644
--- a/c/src/lib/libnetworking/rtems/rtems_glue.c
+++ b/c/src/lib/libnetworking/rtems/rtems_glue.c
@@ -882,3 +882,46 @@ rtems_bsdnet_initialize_network (void)
(*rtems_bsdnet_config.bootp)();
return 0;
}
+
+/*
+ * Parse a network driver name into a name and a unit number
+ */
+int
+rtems_bsdnet_parse_driver_name (const struct rtems_bsdnet_ifconfig *config, char **namep)
+{
+ const char *cp = config->name;
+ char c;
+ int unitNumber = 0;
+
+ if (cp == NULL) {
+ printf ("No network driver name");
+ return -1;
+ }
+ while ((c = *cp++) != '\0') {
+ if ((c >= '0') && (c <= '9')) {
+ int len = cp - config->name - 1;
+ if ((len < 2) || (len > 50))
+ break;
+ for (;;) {
+ unitNumber = (unitNumber * 10) + (c - '0');
+ c = *cp++;
+ if (c == '\0') {
+ char *unitName = malloc (len);
+ if (unitName == NULL) {
+ printf ("No memory");
+ return -1;
+ }
+ strncpy (unitName, config->name, len - 1);
+ unitName[len-1] = '\0';
+ *namep = unitName;
+ return unitNumber;
+ }
+ if ((c < '0') || (c > '9'))
+ break;
+ }
+ break;
+ }
+ }
+ printf ("Bad network driver name `%s'", config->name);
+ return -1;
+}
diff --git a/c/src/libnetworking/rtems/rtems_bsdnet_internal.h b/c/src/libnetworking/rtems/rtems_bsdnet_internal.h
index adaecbd5f9..ae1a419bd8 100644
--- a/c/src/libnetworking/rtems/rtems_bsdnet_internal.h
+++ b/c/src/libnetworking/rtems/rtems_bsdnet_internal.h
@@ -116,6 +116,7 @@ struct file;
struct buf;
struct tty;
struct uio;
+struct rtems_bsdnet_ifconfig;
/*
* Redo kernel memory allocation
@@ -130,6 +131,7 @@ void rtems_bsdnet_free (void *addr, int type);
void rtems_bsdnet_semaphore_obtain (void);
void rtems_bsdnet_semaphore_release (void);
void rtems_bsdnet_schednetisr (int n);
+int rtems_bsdnet_parse_driver_name (const struct rtems_bsdnet_ifconfig *config, char **namep);
unsigned long rtems_bsdnet_seconds_since_boot (void);
unsigned long rtems_bsdnet_random (void);
diff --git a/c/src/libnetworking/rtems/rtems_glue.c b/c/src/libnetworking/rtems/rtems_glue.c
index 0601e5659f..ab734c1aca 100644
--- a/c/src/libnetworking/rtems/rtems_glue.c
+++ b/c/src/libnetworking/rtems/rtems_glue.c
@@ -882,3 +882,46 @@ rtems_bsdnet_initialize_network (void)
(*rtems_bsdnet_config.bootp)();
return 0;
}
+
+/*
+ * Parse a network driver name into a name and a unit number
+ */
+int
+rtems_bsdnet_parse_driver_name (const struct rtems_bsdnet_ifconfig *config, char **namep)
+{
+ const char *cp = config->name;
+ char c;
+ int unitNumber = 0;
+
+ if (cp == NULL) {
+ printf ("No network driver name");
+ return -1;
+ }
+ while ((c = *cp++) != '\0') {
+ if ((c >= '0') && (c <= '9')) {
+ int len = cp - config->name - 1;
+ if ((len < 2) || (len > 50))
+ break;
+ for (;;) {
+ unitNumber = (unitNumber * 10) + (c - '0');
+ c = *cp++;
+ if (c == '\0') {
+ char *unitName = malloc (len);
+ if (unitName == NULL) {
+ printf ("No memory");
+ return -1;
+ }
+ strncpy (unitName, config->name, len - 1);
+ unitName[len-1] = '\0';
+ *namep = unitName;
+ return unitNumber;
+ }
+ if ((c < '0') || (c > '9'))
+ break;
+ }
+ break;
+ }
+ }
+ printf ("Bad network driver name `%s'", config->name);
+ return -1;
+}
diff --git a/cpukit/libnetworking/rtems/rtems_bsdnet_internal.h b/cpukit/libnetworking/rtems/rtems_bsdnet_internal.h
index adaecbd5f9..ae1a419bd8 100644
--- a/cpukit/libnetworking/rtems/rtems_bsdnet_internal.h
+++ b/cpukit/libnetworking/rtems/rtems_bsdnet_internal.h
@@ -116,6 +116,7 @@ struct file;
struct buf;
struct tty;
struct uio;
+struct rtems_bsdnet_ifconfig;
/*
* Redo kernel memory allocation
@@ -130,6 +131,7 @@ void rtems_bsdnet_free (void *addr, int type);
void rtems_bsdnet_semaphore_obtain (void);
void rtems_bsdnet_semaphore_release (void);
void rtems_bsdnet_schednetisr (int n);
+int rtems_bsdnet_parse_driver_name (const struct rtems_bsdnet_ifconfig *config, char **namep);
unsigned long rtems_bsdnet_seconds_since_boot (void);
unsigned long rtems_bsdnet_random (void);
diff --git a/cpukit/libnetworking/rtems/rtems_glue.c b/cpukit/libnetworking/rtems/rtems_glue.c
index 0601e5659f..ab734c1aca 100644
--- a/cpukit/libnetworking/rtems/rtems_glue.c
+++ b/cpukit/libnetworking/rtems/rtems_glue.c
@@ -882,3 +882,46 @@ rtems_bsdnet_initialize_network (void)
(*rtems_bsdnet_config.bootp)();
return 0;
}
+
+/*
+ * Parse a network driver name into a name and a unit number
+ */
+int
+rtems_bsdnet_parse_driver_name (const struct rtems_bsdnet_ifconfig *config, char **namep)
+{
+ const char *cp = config->name;
+ char c;
+ int unitNumber = 0;
+
+ if (cp == NULL) {
+ printf ("No network driver name");
+ return -1;
+ }
+ while ((c = *cp++) != '\0') {
+ if ((c >= '0') && (c <= '9')) {
+ int len = cp - config->name - 1;
+ if ((len < 2) || (len > 50))
+ break;
+ for (;;) {
+ unitNumber = (unitNumber * 10) + (c - '0');
+ c = *cp++;
+ if (c == '\0') {
+ char *unitName = malloc (len);
+ if (unitName == NULL) {
+ printf ("No memory");
+ return -1;
+ }
+ strncpy (unitName, config->name, len - 1);
+ unitName[len-1] = '\0';
+ *namep = unitName;
+ return unitNumber;
+ }
+ if ((c < '0') || (c > '9'))
+ break;
+ }
+ break;
+ }
+ }
+ printf ("Bad network driver name `%s'", config->name);
+ return -1;
+}