ETHER: Tolerate whitespace after network transport designators (tap:, vde:, nat:, udp:)

This commit is contained in:
Mark Pizzolato 2015-10-20 14:12:44 -07:00
parent 3be5125d00
commit 027b15fe0f

View file

@ -1822,7 +1822,10 @@ memset(errbuf, 0, PCAP_ERRBUF_SIZE);
if (0 == strncmp("tap:", savname, 4)) { if (0 == strncmp("tap:", savname, 4)) {
int tun = -1; /* TUN/TAP Socket */ int tun = -1; /* TUN/TAP Socket */
int on = 1; int on = 1;
char *devname = savname + 4;
while (isspace(*devname))
++devname;
#if defined(HAVE_TAP_NETWORK) #if defined(HAVE_TAP_NETWORK)
if (!strcmp(savname, "tap:tapN")) { if (!strcmp(savname, "tap:tapN")) {
sim_printf ("Eth: Must specify actual tap device name (i.e. tap:tap0)\r\n"); sim_printf ("Eth: Must specify actual tap device name (i.e. tap:tap0)\r\n");
@ -1835,7 +1838,7 @@ if (0 == strncmp("tap:", savname, 4)) {
memset(&ifr, 0, sizeof(ifr)); memset(&ifr, 0, sizeof(ifr));
/* Set up interface flags */ /* Set up interface flags */
strcpy(ifr.ifr_name, savname+4); strcpy(ifr.ifr_name, devname);
ifr.ifr_flags = IFF_TAP|IFF_NO_PI; ifr.ifr_flags = IFF_TAP|IFF_NO_PI;
/* Send interface requests to TUN/TAP driver. */ /* Send interface requests to TUN/TAP driver. */
@ -1858,7 +1861,7 @@ if (0 == strncmp("tap:", savname, 4)) {
if (1) { if (1) {
char dev_name[64] = ""; char dev_name[64] = "";
snprintf(dev_name, sizeof(dev_name)-1, "/dev/%s", savname+4); snprintf(dev_name, sizeof(dev_name)-1, "/dev/%s", devname);
dev_name[sizeof(dev_name)-1] = '\0'; dev_name[sizeof(dev_name)-1] = '\0';
if ((tun = open(dev_name, O_RDWR)) >= 0) { if ((tun = open(dev_name, O_RDWR)) >= 0) {
@ -1868,7 +1871,7 @@ if (0 == strncmp("tap:", savname, 4)) {
} }
else { else {
*fd_handle = tun; *fd_handle = tun;
strcpy(savname, savname+4); strcpy(savname, devname);
} }
#if defined (__APPLE__) #if defined (__APPLE__)
if (1) { if (1) {
@ -1906,13 +1909,16 @@ else { /* !tap: */
if (0 == strncmp("vde:", savname, 4)) { if (0 == strncmp("vde:", savname, 4)) {
#if defined(HAVE_VDE_NETWORK) #if defined(HAVE_VDE_NETWORK)
struct vde_open_args voa; struct vde_open_args voa;
char *devname = savname + 4;
memset(&voa, 0, sizeof(voa)); memset(&voa, 0, sizeof(voa));
if (!strcmp(savname, "vde:vdedevice")) { if (!strcmp(savname, "vde:vdedevice")) {
sim_printf ("Eth: Must specify actual vde device name (i.e. vde:/tmp/switch)\r\n"); sim_printf ("Eth: Must specify actual vde device name (i.e. vde:/tmp/switch)\r\n");
return SCPE_OPENERR | SCPE_NOMESSAGE; return SCPE_OPENERR | SCPE_NOMESSAGE;
} }
if (!(*handle = (void*) vde_open(savname+4, "simh", &voa))) while (isspace(*devname))
++devname;
if (!(*handle = (void*) vde_open(devname, "simh", &voa)))
strncpy(errbuf, strerror(errno), PCAP_ERRBUF_SIZE-1); strncpy(errbuf, strerror(errno), PCAP_ERRBUF_SIZE-1);
else { else {
*eth_api = ETH_API_VDE; *eth_api = ETH_API_VDE;
@ -1925,7 +1931,11 @@ else { /* !tap: */
else { /* !vde: */ else { /* !vde: */
if (0 == strncmp("nat:", savname, 4)) { if (0 == strncmp("nat:", savname, 4)) {
#if defined(HAVE_SLIRP_NETWORK) #if defined(HAVE_SLIRP_NETWORK)
if (!(*handle = (void*) sim_slirp_open(savname+4, opaque, &_slirp_callback, dptr, dbit))) char *devname = savname + 4;
while (isspace(*devname))
++devname;
if (!(*handle = (void*) sim_slirp_open(devname, opaque, &_slirp_callback, dptr, dbit)))
strncpy(errbuf, strerror(errno), PCAP_ERRBUF_SIZE-1); strncpy(errbuf, strerror(errno), PCAP_ERRBUF_SIZE-1);
else { else {
*eth_api = ETH_API_NAT; *eth_api = ETH_API_NAT;
@ -1939,13 +1949,16 @@ else { /* !tap: */
if (0 == strncmp("udp:", savname, 4)) { if (0 == strncmp("udp:", savname, 4)) {
char localport[CBUFSIZE], host[CBUFSIZE], port[CBUFSIZE]; char localport[CBUFSIZE], host[CBUFSIZE], port[CBUFSIZE];
char hostport[2*CBUFSIZE]; char hostport[2*CBUFSIZE];
char *devname = savname + 4;
if (!strcmp(savname, "udp:sourceport:remotehost:remoteport")) { if (!strcmp(savname, "udp:sourceport:remotehost:remoteport")) {
sim_printf ("Eth: Must specify actual udp host and ports(i.e. udp:1224:somehost.com:2234)\r\n"); sim_printf ("Eth: Must specify actual udp host and ports(i.e. udp:1224:somehost.com:2234)\r\n");
return SCPE_OPENERR | SCPE_NOMESSAGE; return SCPE_OPENERR | SCPE_NOMESSAGE;
} }
if (SCPE_OK != sim_parse_addr_ex (savname+4, host, sizeof(host), "localhost", port, sizeof(port), localport, sizeof(localport), NULL)) while (isspace(*devname))
++devname;
if (SCPE_OK != sim_parse_addr_ex (devname, host, sizeof(host), "localhost", port, sizeof(port), localport, sizeof(localport), NULL))
return SCPE_OPENERR; return SCPE_OPENERR;
if (localport[0] == '\0') if (localport[0] == '\0')