- create a function to set the various transformation matrices to
[wine/multimedia.git] / dlls / netapi32 / netapi32.c
blob21c2a9b61485d40ebbc578ee9cfff3a95b40b93e
1 /*
2 * Copyright 2001 Mike McCormack
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19 #include "config.h"
21 #include <string.h>
22 #include <stdio.h>
23 #include <fcntl.h>
24 #ifdef HAVE_UNISTD_H
25 # include <unistd.h>
26 #endif
28 #include "winbase.h"
29 #include "winreg.h"
30 #include "wingdi.h"
31 #include "winuser.h"
32 #include "wine/debug.h"
33 #include "winerror.h"
34 #include "nb30.h"
36 #ifdef HAVE_SYS_FILE_H
37 # include <sys/file.h>
38 #endif
39 #ifdef HAVE_SYS_IOCTL_H
40 # include <sys/ioctl.h>
41 #endif
42 #ifdef HAVE_SYS_SOCKET_H
43 # include <sys/socket.h>
44 #endif
45 #ifdef HAVE_SYS_SOCKIO_H
46 # include <sys/sockio.h>
47 #endif
48 #ifdef HAVE_NET_IF_H
49 # include <net/if.h>
50 #endif
51 #ifdef HAVE_NETINET_IN_H
52 # include <netinet/in.h>
53 #endif
55 #ifdef HAVE_SOCKADDR_SA_LEN
56 # ifndef max
57 # define max(a,b) ((a) > (b) ? (a) : (b))
58 # endif
59 # define ifreq_size(i) max(sizeof(struct ifreq),\
60 sizeof((i).ifr_name)+(i).ifr_addr.sa_len)
61 # else
62 # define ifreq_size(i) sizeof(struct ifreq)
63 # endif /* defined(HAVE_SOCKADDR_SA_LEN) */
65 WINE_DEFAULT_DEBUG_CHANNEL(netbios);
67 HMODULE NETAPI32_hModule = 0;
69 struct NetBiosAdapter
71 int valid;
72 unsigned char address[6];
75 static struct NetBiosAdapter NETBIOS_Adapter[MAX_LANA];
77 # ifdef SIOCGIFHWADDR
78 int get_hw_address(int sd, struct ifreq *ifr, unsigned char *address)
80 if (ioctl(sd, SIOCGIFHWADDR, ifr) < 0)
81 return -1;
82 memcpy(address, (unsigned char *)&ifr->ifr_hwaddr.sa_data, 6);
83 return 0;
85 # else
86 # ifdef SIOCGENADDR
87 int get_hw_address(int sd, struct ifreq *ifr, unsigned char *address)
89 if (ioctl(sd, SIOCGENADDR, ifr) < 0)
90 return -1;
91 memcpy(address, (unsigned char *) ifr->ifr_enaddr, 6);
92 return 0;
94 # else
95 int get_hw_address(int sd, struct ifreq *ifr, unsigned char *address)
97 return -1;
99 # endif /* SIOCGENADDR */
100 # endif /* SIOCGIFHWADDR */
102 static UCHAR NETBIOS_Enum(PNCB ncb)
104 #ifdef HAVE_NET_IF_H
105 int sd;
106 struct ifreq ifr, *ifrp;
107 struct ifconf ifc;
108 unsigned char buf[1024];
109 int i, ofs;
110 #endif
111 LANA_ENUM *lanas = (PLANA_ENUM) ncb->ncb_buffer;
113 TRACE("NCBENUM\n");
115 lanas->length = 0;
117 #ifdef HAVE_NET_IF_H
118 /* BSD 4.4 defines the size of an ifreq to be
119 * max(sizeof(ifreq), sizeof(ifreq.ifr_name)+ifreq.ifr_addr.sa_len
120 * However, under earlier systems, sa_len isn't present, so
121 * the size is just sizeof(struct ifreq)
124 sd = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP);
125 if (sd < 0)
126 return NRC_OPENERROR;
128 memset(buf, 0, sizeof(buf));
129 ifc.ifc_len = sizeof(buf);
130 ifc.ifc_buf = buf;
131 /* get the ifconf interface */
132 if (ioctl (sd, SIOCGIFCONF, (char *)&ifc) < 0)
134 close(sd);
135 return NRC_OPENERROR;
138 /* loop through the interfaces, looking for a valid one */
139 /* n = ifc.ifc_len; */
140 ofs = 0;
141 for (i = 0; i < ifc.ifc_len; i++)
143 unsigned char *a = NETBIOS_Adapter[i].address;
145 ifrp = (struct ifreq *)((char *)ifc.ifc_buf+ofs);
146 strncpy(ifr.ifr_name, ifrp->ifr_name, IFNAMSIZ);
148 /* try to get the address for this interface */
149 if(get_hw_address(sd, &ifr, a)==0)
151 /* make sure it's not blank */
152 /* if (!a[0] && !a[1] && !a[2] && !a[3] && !a[4] && !a[5])
153 continue; */
155 TRACE("Found valid adapter %d at %02x:%02x:%02x:%02x:%02x:%02x\n", i,
156 a[0],a[1],a[2],a[3],a[4],a[5]);
158 NETBIOS_Adapter[i].valid = TRUE;
159 lanas->lana[lanas->length] = i;
160 lanas->length++;
162 ofs += ifreq_size(ifr);
164 close(sd);
165 #endif /* HAVE_NET_IF_H */
166 return NRC_GOODRET;
170 static UCHAR NETBIOS_Astat(PNCB ncb)
172 struct NetBiosAdapter *nad = &NETBIOS_Adapter[ncb->ncb_lana_num];
173 PADAPTER_STATUS astat = (PADAPTER_STATUS) ncb->ncb_buffer;
175 TRACE("NCBASTAT (Adapter %d)\n", ncb->ncb_lana_num);
177 if(!nad->valid)
178 return NRC_INVADDRESS;
180 memset(astat, 0, sizeof astat);
181 memcpy(astat->adapter_address, nad->address, sizeof astat->adapter_address);
183 return NRC_GOODRET;
186 BOOL WINAPI DllMain (HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
188 TRACE("%p,%lx,%p\n", hinstDLL, fdwReason, lpvReserved);
190 switch (fdwReason) {
191 case DLL_PROCESS_ATTACH:
192 NETAPI32_hModule = hinstDLL;
193 break;
194 case DLL_PROCESS_DETACH:
195 break;
198 return TRUE;
201 BOOL WINAPI Netbios(PNCB pncb)
203 UCHAR ret = NRC_ILLCMD;
205 TRACE("ncb = %p\n",pncb);
207 if(!pncb)
208 return NRC_INVADDRESS;
210 switch(pncb->ncb_command&0x7f)
212 case NCBRESET:
213 FIXME("NCBRESET adapter %d\n",pncb->ncb_lana_num);
214 if( (pncb->ncb_lana_num < MAX_LANA ) &&
215 NETBIOS_Adapter[pncb->ncb_lana_num].valid)
216 ret = NRC_GOODRET;
217 else
218 ret = NRC_ILLCMD; /* NetBIOS emulator not found */
219 break;
221 case NCBADDNAME:
222 FIXME("NCBADDNAME\n");
223 break;
225 case NCBADDGRNAME:
226 FIXME("NCBADDGRNAME\n");
227 break;
229 case NCBDELNAME:
230 FIXME("NCBDELNAME\n");
231 break;
233 case NCBSEND:
234 FIXME("NCBSEND\n");
235 break;
237 case NCBRECV:
238 FIXME("NCBRECV\n");
239 break;
241 case NCBHANGUP:
242 FIXME("NCBHANGUP\n");
243 break;
245 case NCBCANCEL:
246 FIXME("NCBCANCEL\n");
247 break;
249 case NCBLISTEN:
250 FIXME("NCBLISTEN\n");
251 break;
253 case NCBASTAT:
254 ret = NETBIOS_Astat(pncb);
255 break;
257 case NCBENUM:
258 ret = NETBIOS_Enum(pncb);
259 break;
261 default:
262 FIXME("(%p): command code %02x\n", pncb, pncb->ncb_command);
264 ret = NRC_ILLCMD; /* NetBIOS emulator not found */
266 pncb->ncb_retcode = ret;
267 return ret;