Separate "Enumerate Hardware Addresses" as function, as other netapi32

function need it.
Implemented level 0 of NetWkstaTransportEnum.
This commit is contained in:
Uwe Bonnes 2003-02-14 23:29:24 +00:00 committed by Alexandre Julliard
parent 909ffb7930
commit 51e4839fb0
4 changed files with 119 additions and 13 deletions

View File

@ -99,22 +99,15 @@ int get_hw_address(int sd, struct ifreq *ifr, unsigned char *address)
# endif /* SIOCGENADDR */
# endif /* SIOCGIFHWADDR */
static UCHAR NETBIOS_Enum(PNCB ncb)
int enum_hw(void)
{
int ret = 0;
#ifdef HAVE_NET_IF_H
int sd;
struct ifreq ifr, *ifrp;
struct ifconf ifc;
unsigned char buf[1024];
int i, ofs;
#endif
LANA_ENUM *lanas = (PLANA_ENUM) ncb->ncb_buffer;
TRACE("NCBENUM\n");
lanas->length = 0;
#ifdef HAVE_NET_IF_H
/* BSD 4.4 defines the size of an ifreq to be
* max(sizeof(ifreq), sizeof(ifreq.ifr_name)+ifreq.ifr_addr.sa_len
* However, under earlier systems, sa_len isn't present, so
@ -156,13 +149,49 @@ static UCHAR NETBIOS_Enum(PNCB ncb)
a[0],a[1],a[2],a[3],a[4],a[5]);
NETBIOS_Adapter[i].valid = TRUE;
lanas->lana[lanas->length] = i;
lanas->length++;
ret++;
}
ofs += ifreq_size(ifr);
}
close(sd);
TRACE("found %d adapters\n",ret);
#endif /* HAVE_NET_IF_H */
return ret;
}
void wprint_mac(WCHAR* buffer, int index)
{
int i;
unsigned char val;
for (i = 0; i<6; i++)
{
val = NETBIOS_Adapter[index].address[i];
if ((val >>4) >9)
buffer[2*i] = (WCHAR)((val >>4) + 'A' - 10);
else
buffer[2*i] = (WCHAR)((val >>4) + '0');
if ((val & 0xf ) >9)
buffer[2*i+1] = (WCHAR)((val & 0xf) + 'A' - 10);
else
buffer[2*i+1] = (WCHAR)((val & 0xf) + '0');
}
buffer[12]=(WCHAR)0;
}
static UCHAR NETBIOS_Enum(PNCB ncb)
{
int i;
LANA_ENUM *lanas = (PLANA_ENUM) ncb->ncb_buffer;
TRACE("NCBENUM\n");
lanas->length = 0;
for (i = 0; i < enum_hw(); i++)
{
lanas->lana[lanas->length] = i;
lanas->length++;
}
return NRC_GOODRET;
}
@ -266,4 +295,3 @@ BOOL WINAPI Netbios(PNCB pncb)
pncb->ncb_retcode = ret;
return ret;
}

View File

@ -198,7 +198,7 @@
@ stub NetWkstaSetInfo
@ stub NetWkstaTransportAdd
@ stub NetWkstaTransportDel
@ stub NetWkstaTransportEnum
@ stdcall NetWkstaTransportEnum (wstr long ptr long ptr ptr ptr) NetWkstaTransportEnum
@ stub NetWkstaUserEnum
@ stdcall NetWkstaUserGetInfo(wstr long ptr) NetWkstaUserGetInfo
@ stub NetWkstaUserSetInfo

View File

@ -59,6 +59,76 @@ BOOL NETAPI_IsLocalComputer(LPCWSTR ServerName)
}
}
int enum_hw(void);
void wprint_mac(WCHAR* buffer, int index);
NET_API_STATUS WINAPI
NetWkstaTransportEnum(LPCWSTR ServerName, DWORD level, LPBYTE* pbuf,
DWORD prefmaxlen, LPDWORD read_entries,
LPDWORD total_entries, LPDWORD hresume)
{
FIXME(":%s, 0x%08lx, %p, 0x%08lx, %p, %p, %p\n", debugstr_w(ServerName),
level, pbuf, prefmaxlen, read_entries, total_entries,hresume);
if (!NETAPI_IsLocalComputer(ServerName))
{
FIXME(":not implemented for non-local computers\n");
return ERROR_INVALID_LEVEL;
}
else
{
if (hresume && *hresume)
{
FIXME(":resume handle not implemented\n");
return ERROR_INVALID_LEVEL;
}
switch (level)
{
case 0: /* transport info */
{
PWKSTA_TRANSPORT_INFO_0 ti;
int i,size_needed,n_adapt = enum_hw();
size_needed = n_adapt * (sizeof(WKSTA_TRANSPORT_INFO_0)
* 13 * sizeof (WCHAR));
if (prefmaxlen == MAX_PREFERRED_LENGTH)
NetApiBufferAllocate( size_needed, (LPVOID *) pbuf);
else
{
if (size_needed > prefmaxlen)
return ERROR_MORE_DATA;
NetApiBufferAllocate(prefmaxlen,
(LPVOID *) pbuf);
}
for (i = 0; i <n_adapt; i++)
{
ti = (PWKSTA_TRANSPORT_INFO_0)
((PBYTE) *pbuf + i * sizeof(WKSTA_TRANSPORT_INFO_0));
ti->wkti0_quality_of_service=0;
ti->wkti0_number_of_vcs=0;
ti->wkti0_transport_name=NULL;
ti->wkti0_transport_address= (LPWSTR)
((PBYTE )*pbuf + n_adapt* sizeof(WKSTA_TRANSPORT_INFO_0)
+ i * 13 * sizeof (WCHAR));
ti->wkti0_wan_ish=TRUE; /*TCPIP/NETBIOS Protocoll*/
wprint_mac(ti->wkti0_transport_address,i);
TRACE("%d of %d:ti at %p transport_address at %p %s\n",i,n_adapt,
ti, ti->wkti0_transport_address, debugstr_w(ti->wkti0_transport_address));
}
if(read_entries)*read_entries = n_adapt;
if(total_entries)*total_entries = n_adapt;
if(hresume) *hresume= 0;
break;
}
default:
ERR("Invalid level %ld is specified\n", level);
return ERROR_INVALID_LEVEL;
}
return NERR_Success;
}
}
/************************************************************
* NetWkstaUserGetInfo (NETAPI32.@)
*/

View File

@ -28,6 +28,14 @@ extern "C" {
/* NetBIOS */
UCHAR WINAPI Netbios(PNCB pncb);
typedef struct _WKSTA_TRANSPORT_INFO_0 {
DWORD wkti0_quality_of_service;
DWORD wkti0_number_of_vcs;
LPWSTR wkti0_transport_name;
LPWSTR wkti0_transport_address;
BOOL wkti0_wan_ish;
} WKSTA_TRANSPORT_INFO_0, *PWKSTA_TRANSPORT_INFO_0, *LPWKSTA_TRANSPORT_INFO_0;
typedef struct _WKSTA_USER_INFO_0 {
LPWSTR wkui0_username;
} WKSTA_USER_INFO_0, *PWKSTA_USER_INFO_0, *LPWKSTA_USER_INFO_0;