diff options
author | Joel Sherrill <joel.sherrill@OARcorp.com> | 1999-03-23 22:39:13 +0000 |
---|---|---|
committer | Joel Sherrill <joel.sherrill@OARcorp.com> | 1999-03-23 22:39:13 +0000 |
commit | b6f5f9385daf2d4b5a6272c5085c7e253f381aa9 (patch) | |
tree | c2b6ed42c83093b3efe5827ee653494ee97ea906 | |
parent | Regenerated. (diff) | |
download | rtems-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.h | 2 | ||||
-rw-r--r-- | c/src/exec/libnetworking/rtems/rtems_glue.c | 43 | ||||
-rw-r--r-- | c/src/lib/libbsp/m68k/gen68360/network/network.c | 29 | ||||
-rw-r--r-- | c/src/lib/libnetworking/rtems/rtems_bsdnet_internal.h | 2 | ||||
-rw-r--r-- | c/src/lib/libnetworking/rtems/rtems_glue.c | 43 | ||||
-rw-r--r-- | c/src/libnetworking/rtems/rtems_bsdnet_internal.h | 2 | ||||
-rw-r--r-- | c/src/libnetworking/rtems/rtems_glue.c | 43 | ||||
-rw-r--r-- | cpukit/libnetworking/rtems/rtems_bsdnet_internal.h | 2 | ||||
-rw-r--r-- | cpukit/libnetworking/rtems/rtems_glue.c | 43 |
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; +} |