--- BasiliskII/src/AmigaOS/ether_amiga.cpp 1999/10/19 19:28:14 1.2 +++ BasiliskII/src/AmigaOS/ether_amiga.cpp 2000/08/20 14:08:41 1.5 @@ -346,6 +346,8 @@ static __saveds __regargs LONG copy_from static __saveds void net_func(void) { + const char *str; + BYTE od_error; struct MsgPort *write_port = NULL, *control_port = NULL; struct IOSana2Req *write_io = NULL, *control_io = NULL; bool opened = false; @@ -388,13 +390,48 @@ static __saveds void net_func(void) // Parse device name char dev_name[256]; ULONG dev_unit; - if (sscanf(PrefsFindString("ether"), "%[^/]/%ld", dev_name, &dev_unit) < 2) + + str = PrefsFindString("ether"); + if (str) + { + const char *FirstSlash = strchr(str, '/'); + const char *LastSlash = strrchr(str, '/'); + + if (FirstSlash && FirstSlash && FirstSlash != LastSlash) + { + // Device name contains path, i.e. "Networks/xyzzy.device" + const char *lp = str; + char *dp = dev_name; + + while (lp != LastSlash) + *dp++ = *lp++; + *dp = '\0'; + + if (strlen(dev_name) < 1) + goto quit; + + if (1 != sscanf(LastSlash, "/%ld", &dev_unit)) + goto quit; + +// printf("dev=<%s> unit=%d\n", dev_name, dev_unit); + } + else + { + if (2 != sscanf(str, "%[^/]/%ld", dev_name, &dev_unit)) + goto quit; + } + } + else goto quit; // Open device control_io->ios2_BufferManagement = buffer_tags; - if (OpenDevice((UBYTE *)dev_name, dev_unit, (struct IORequest *)control_io, 0) || control_io->ios2_Req.io_Device == 0) + od_error = OpenDevice((UBYTE *)dev_name, dev_unit, (struct IORequest *)control_io, 0); + if (0 != od_error || control_io->ios2_Req.io_Device == 0) + { + printf("WARNING: OpenDevice(<%s>, unit=%d) returned error %d)\n", (UBYTE *)dev_name, dev_unit, od_error); goto quit; + } opened = true; // Is it Ethernet? @@ -451,7 +488,7 @@ static __saveds void net_func(void) case MSG_ADD_MULTI: control_io->ios2_Req.io_Command = S2_ADDMULTICASTADDRESS; - memcpy(control_io->ios2_SrcAddr, Mac2HostAddr(msg->pointer + eMultiAddr), 6); + Mac2Host_memcpy(control_io->ios2_SrcAddr, msg->pointer + eMultiAddr, 6); DoIO((struct IORequest *)control_io); if (control_io->ios2_Req.io_Error == S2ERR_NOT_SUPPORTED) { WarningAlert(GetString(STR_NO_MULTICAST_WARN)); @@ -464,7 +501,7 @@ static __saveds void net_func(void) case MSG_DEL_MULTI: control_io->ios2_Req.io_Command = S2_DELMULTICASTADDRESS; - memcpy(control_io->ios2_SrcAddr, Mac2HostAddr(msg->pointer + eMultiAddr), 6); + Mac2Host_memcpy(control_io->ios2_SrcAddr, msg->pointer + eMultiAddr, 6); DoIO((struct IORequest *)control_io); if (control_io->ios2_Req.io_Error) msg->result = eMultiErr; @@ -550,8 +587,8 @@ static __saveds void net_func(void) // Get destination address, set source address uint32 hdr = ReadMacInt32(wds + 2); - memcpy(write_io->ios2_DstAddr, Mac2HostAddr(hdr), 6); - memcpy(Mac2HostAddr(hdr + 6), ether_addr, 6); + Mac2Host_memcpy(write_io->ios2_DstAddr, hdr, 6); + Host2Mac_memcpy(hdr + 6, ether_addr, 6); // Get packet type uint32 type = ReadMacInt16(hdr + 12); @@ -651,7 +688,7 @@ void EtherInterrupt(void) continue; // Copy header to RHA - memcpy(Mac2HostAddr(ether_data + ed_RHA), io->ios2_Data, 14); + Host2Mac_memcpy(ether_data + ed_RHA, io->ios2_Data, 14); D(bug(" header %08lx%04lx %08lx%04lx %04lx\n", ReadMacInt32(ether_data + ed_RHA), ReadMacInt16(ether_data + ed_RHA + 4), ReadMacInt32(ether_data + ed_RHA + 6), ReadMacInt16(ether_data + ed_RHA + 10), ReadMacInt16(ether_data + ed_RHA + 12))); // Call protocol handler