2 * Copyright 2001 Mike McCormack
14 #include "debugtools.h"
18 #ifdef HAVE_SYS_FILE_H
19 # include <sys/file.h>
21 #include <sys/ioctl.h>
22 #ifdef HAVE_SYS_SOCKET_H
23 # include <sys/socket.h>
25 #ifdef HAVE_SYS_SOCKIO_H
26 # include <sys/sockio.h>
31 #ifdef HAVE_NETINET_IN_H
32 # include <netinet/in.h>
35 #ifdef HAVE_SOCKADDR_SA_LEN
37 # define max(a,b) ((a) > (b) ? (a) : (b))
39 # define ifreq_size(i) max(sizeof(struct ifreq),\
40 sizeof((i).ifr_name)+(i).ifr_addr.sa_len)
42 # define ifreq_size(i) sizeof(struct ifreq)
43 # endif /* defined(HAVE_SOCKADDR_SA_LEN) */
45 DEFAULT_DEBUG_CHANNEL(netbios);
47 HMODULE NETAPI32_hModule = 0;
52 unsigned char address[6];
55 static struct NetBiosAdapter NETBIOS_Adapter[MAX_LANA];
58 int get_hw_address(int sd, struct ifreq *ifr, unsigned char *address)
60 if (ioctl(sd, SIOCGIFHWADDR, ifr) < 0)
62 memcpy(address, (unsigned char *)&ifr->ifr_hwaddr.sa_data, 6);
67 int get_hw_address(int sd, struct ifreq *ifr, unsigned char *address)
69 if (ioctl(sd, SIOCGENADDR, ifr) < 0)
71 memcpy(address, (unsigned char *) ifr->ifr_enaddr, 6);
75 int get_hw_address(int sd, struct ifreq *ifr, unsigned char *address)
79 # endif /* SIOCGENADDR */
80 # endif /* SIOCGIFHWADDR */
82 static UCHAR NETBIOS_Enum(PNCB ncb)
86 struct ifreq ifr, *ifrp;
88 unsigned char buf[1024];
91 LANA_ENUM *lanas = (PLANA_ENUM) ncb->ncb_buffer;
98 /* BSD 4.4 defines the size of an ifreq to be
99 * max(sizeof(ifreq), sizeof(ifreq.ifr_name)+ifreq.ifr_addr.sa_len
100 * However, under earlier systems, sa_len isn't present, so
101 * the size is just sizeof(struct ifreq)
104 sd = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP);
106 return NRC_OPENERROR;
108 memset(buf, 0, sizeof(buf));
109 ifc.ifc_len = sizeof(buf);
111 /* get the ifconf interface */
112 if (ioctl (sd, SIOCGIFCONF, (char *)&ifc) < 0)
115 return NRC_OPENERROR;
118 /* loop through the interfaces, looking for a valid one */
119 /* n = ifc.ifc_len; */
121 for (i = 0; i < ifc.ifc_len; i++)
123 unsigned char *a = NETBIOS_Adapter[i].address;
125 ifrp = (struct ifreq *)((char *)ifc.ifc_buf+ofs);
126 strncpy(ifr.ifr_name, ifrp->ifr_name, IFNAMSIZ);
128 /* try to get the address for this interface */
129 if(get_hw_address(sd, &ifr, a)==0)
131 /* make sure it's not blank */
132 /* if (!a[0] && !a[1] && !a[2] && !a[3] && !a[4] && !a[5])
135 TRACE("Found valid adapter %d at %02x:%02x:%02x:%02x:%02x:%02x\n", i,
136 a[0],a[1],a[2],a[3],a[4],a[5]);
138 NETBIOS_Adapter[i].valid = TRUE;
139 lanas->lana[lanas->length] = i;
142 ofs += ifreq_size(ifr);
145 #endif /* HAVE_NET_IF_H */
150 static UCHAR NETBIOS_Astat(PNCB ncb)
152 struct NetBiosAdapter *nad = &NETBIOS_Adapter[ncb->ncb_lana_num];
153 PADAPTER_STATUS astat = (PADAPTER_STATUS) ncb->ncb_buffer;
155 TRACE("NCBASTAT (Adapter %d)\n", ncb->ncb_lana_num);
158 return NRC_INVADDRESS;
160 memset(astat, 0, sizeof astat);
161 memcpy(astat->adapter_address, nad->address, sizeof astat->adapter_address);
167 NETAPI32_LibMain (HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
169 TRACE("%x,%lx,%p\n", hinstDLL, fdwReason, lpvReserved);
172 case DLL_PROCESS_ATTACH:
173 NETAPI32_hModule = hinstDLL;
175 case DLL_PROCESS_DETACH:
182 BOOL WINAPI Netbios(PNCB pncb)
184 UCHAR ret = NRC_ILLCMD;
186 TRACE("ncb = %p\n",pncb);
189 return NRC_INVADDRESS;
191 switch(pncb->ncb_command&0x7f)
194 FIXME("NCBRESET adapter %d\n",pncb->ncb_lana_num);
195 if( (pncb->ncb_lana_num < MAX_LANA ) &&
196 NETBIOS_Adapter[pncb->ncb_lana_num].valid)
199 ret = NRC_ILLCMD; /* NetBIOS emulator not found */
203 FIXME("NCBADDNAME\n");
207 FIXME("NCBADDGRNAME\n");
211 FIXME("NCBDELNAME\n");
223 FIXME("NCBHANGUP\n");
227 FIXME("NCBCANCEL\n");
231 FIXME("NCBLISTEN\n");
235 ret = NETBIOS_Astat(pncb);
239 ret = NETBIOS_Enum(pncb);
243 FIXME("(%p): command code %02x\n", pncb, pncb->ncb_command);
245 ret = NRC_ILLCMD; /* NetBIOS emulator not found */
247 pncb->ncb_retcode = ret;