$(NTMAKE_HEADERS)
$(CD) ..\..\..
-sys: cm_headers
- echo ***** $@
- $(DOCD) $(SRC)\$@
- $(CD) $(SRC)\$@
- $(NTMAKE)
- $(CD) ..\..
-
-afsdobjs: sys
+afsdobjs: cm_headers
echo ***** $@
$(DOCD) $(SRC)\WINNT\afsd
$(CD) $(SRC)\WINNT\afsd
$(NTMAKE_OBJS)
$(CD) ..\..\..
-auth: afsdobjs
+sys: afsdobjs
+ echo ***** $@
+ $(DOCD) $(SRC)\$@
+ $(CD) $(SRC)\$@
+ $(NTMAKE)
+ $(CD) ..\..
+
+auth: sys
echo ***** $@
$(DOCD) $(SRC)\$@
$(CD) $(SRC)\$@
$(IDLFILES):afsrpc.idl
midl $(MIDL_FLAGS) /no_robust $(AFSDEV_AUXMIDLFLAGS) /app_config $?
-
AFSDOBJS=\
$(OUT)\afsd_init.obj \
$(OUT)\cm_cell.obj \
$(OUT)\afsdcrash.obj \
!ENDIF
$(OUT)\cm_freelance.obj \
- $(OUT)\lanahelper.obj \
$(OUT)\afsd_eventlog.obj \
$(OUT)\afsd_flushvol.obj
$(DEL) $*.lib $*.exp
############################################################################
+# lanahelper.lib
+
+LANAHELPERLIB = $(DESTDIR)\lib\lanahelper.lib
+
+LANAHELPERLIB_OBJS =\
+ $(OUT)\lanahelper.obj
+
+$(LANAHELPERLIB_OBJS):
+
+$(LANAHELPERLIB): $(LANAHELPERLIB_OBJS)
+ $(LIBARCH) netapi32.lib
+
+############################################################################
# Install target; primary makefile target
-install_objs: $(OUT)\cm_dns.obj $(OUT)\cm_config.obj
+install_objs: $(OUT)\cm_dns.obj $(OUT)\cm_config.obj $(LANAHELPERLIB)
$(COPY) $(OUT)\cm_dns.obj $(DESTDIR)\lib
$(COPY) $(OUT)\cm_config.obj $(DESTDIR)\lib
$(DESTDIR)\lib\afs\mtafsint.lib \
$(DESTDIR)\lib\libafsconf.lib \
$(DESTDIR)\lib\afs\afsreg.lib \
+ $(LANAHELPERLIB) \
rpcrt4.lib \
user32.lib \
Dbghelp.lib
char cm_HostName[200];
long cm_HostAddr;
+char cm_NetbiosName[MAX_NB_NAME_LENGTH];
+
char cm_CachePath[200];
DWORD cm_CachePathLen;
long code;
/*int freelanceEnabled;*/
WSADATA WSAjunk;
+ lana_number_t lanaNum;
WSAStartup(0x0101, &WSAjunk);
osi_panic(buf, __FILE__, __LINE__);
}
- dummyLen = sizeof(LANadapter);
- code = RegQueryValueEx(parmKey, "LANadapter", NULL, NULL,
- (BYTE *) &LANadapter, &dummyLen);
- if (code == ERROR_SUCCESS) {
- afsi_log("LAN adapter number %d", LANadapter);
- if (LANadapter < 0 || LANadapter > MAX_LANA)
- LANadapter = -1;
- } else {
- LANadapter = -1;
- }
- if ( LANadapter == -1 )
- afsi_log("Default LAN adapter number");
-
dummyLen = sizeof(cacheSize);
code = RegQueryValueEx(parmKey, "CacheSize", NULL, NULL,
(BYTE *) &cacheSize, &dummyLen);
/* Don't log */
}
- dummyLen = sizeof(isGateway);
- code = RegQueryValueEx(parmKey, "IsGateway", NULL, NULL,
- (BYTE *) &isGateway, &dummyLen);
- if (code == ERROR_SUCCESS)
- afsi_log("Set for %s service",
- isGateway ? "gateway" : "stand-alone");
- else {
- isGateway = 0;
- /* Don't log */
- }
-
dummyLen = sizeof(reportSessionStartups);
code = RegQueryValueEx(parmKey, "ReportSessionStartups", NULL, NULL,
(BYTE *) &reportSessionStartups, &dummyLen);
RegCloseKey (parmKey);
+ /* Call lanahelper to get Netbios name, lan adapter number and gateway flag */
+ if(SUCCEEDED(code = lana_GetUncServerNameEx(cm_NetbiosName, &lanaNum, &isGateway, LANA_NETBIOS_NAME_FULL))) {
+ LANadapter = (lanaNum == LANA_INVALID)? -1: lanaNum;
+
+ if(LANadapter != -1)
+ afsi_log("LAN adapter number %d", LANadapter);
+ else
+ afsi_log("LAN adapter number not determined");
+
+ if(isGateway)
+ afsi_log("Set for gateway service");
+
+ afsi_log("Using >%s< as SMB server name", cm_NetbiosName);
+ } else {
+ /* something went horribly wrong. We can't proceed without a netbios name */
+ sprintf(buf,"Netbios name could not be determined: %li", code);
+ osi_panic(buf, __FILE__, __LINE__);
+ }
+
/* setup early variables */
/* These both used to be configurable. */
smb_UseV3 = 1;
int afsd_InitSMB(char **reasonP, void *aMBfunc)
{
- char hostName[200];
- char *ctemp;
- lana_number_t lana = LANA_INVALID;
-
/* Do this last so that we don't handle requests before init is done.
* Here we initialize the SMB listener.
*/
- if (LANadapter == -1) {
- DWORD noFindByName = 0;
- HKEY parmKey;
- DWORD dummyLen;
- long code;
-
- /* Find the default LAN adapter to use. First look for
- * the adapter named AFS; otherwise, unless we are doing
- * gateway service, look for any valid loopback adapter.
- */
- code = RegOpenKeyEx(HKEY_LOCAL_MACHINE, AFSConfigKeyName,
- 0, KEY_QUERY_VALUE, &parmKey);
- if (code == ERROR_SUCCESS) {
- dummyLen = sizeof(LANadapter);
- code = RegQueryValueEx(parmKey, "NoFindLanaByName", NULL, NULL,
- (BYTE *) &noFindByName, &dummyLen);
- RegCloseKey(parmKey);
- }
-
- if ( !noFindByName )
- lana = lana_FindLanaByName("AFS");
- if (lana == LANA_INVALID && !isGateway)
- lana = lana_FindLoopback();
- if (lana != LANA_INVALID)
- LANadapter = lana;
- }
- afsi_log("Lana %d", (int) lana);
- /* If we are using a loopback adapter, we can use the preferred
- * (but non-unique) server name; otherwise, we must fall back to
- * the <machine>-AFS name.
- */
- if (LANadapter >= 0 && lana_IsLoopback((lana_number_t) LANadapter)) {
- if ( cm_NetBiosName[0] )
- strcpy(hostName, cm_NetBiosName);
- else
- strcpy(hostName, "AFS");
- } else {
- if (!cm_NetBiosName[0])
- {
- strcpy(hostName, cm_HostName);
- ctemp = strchr(hostName, '.'); /* turn ntdfs.* into ntdfs */
- if (ctemp) *ctemp = 0;
- hostName[11] = 0; /* ensure that even after adding the -A, we
- * leave one byte free for the netbios server
- * type.
- */
- strcat(hostName, "-AFS");
- } else {
- strcpy(hostName, cm_NetBiosName);
- }
- _strupr(hostName);
- }
- smb_Init(afsd_logp, hostName, smb_UseV3, LANadapter, numSvThreads, aMBfunc);
- afsi_log("smb_Init");
+ smb_Init(afsd_logp, cm_NetbiosName, smb_UseV3, LANadapter, numSvThreads, aMBfunc);
+ afsi_log("smb_Init");
return 0;
}
#include <shellapi.h>
#include <objbase.h>
#include <shlobj.h>
-#include <shlwapi.h>
#include <wtypes.h>
#include <string.h>
#include <malloc.h>
-#include "lanahelper.h"
+#include <lanahelper.h>
+#define NOLOGGING
+#ifndef NOLOGGING
+extern "C" {
+ void afsi_log(...);
+}
+#endif
-extern "C" void afsi_log(...);
+static const char *szAFSConfigKeyName = "SYSTEM\\CurrentControlSet\\Services\\TransarcAFSDaemon\\Parameters";
+static const char *szNetbiosNameValue = "NetbiosName";
+static const char *szIsGatewayValue = "IsGateway";
+static const char *szLanAdapterValue = "LanAdapter";
+static const char *szNoFindLanaByName = "NoFindLanaByName";
-static HRESULT getname_shellfolder(WCHAR *wGuid, WCHAR *wName, int NameSize)
+// Use the IShellFolder API to get the connection name for the given Guid.
+static HRESULT lana_ShellGetNameFromGuidW(WCHAR *wGuid, WCHAR *wName, int NameSize)
{
// This is the GUID for the network connections folder. It is constant.
// {7007ACC7-3202-11D1-AAD2-00805FC1270E}
// Get the shell allocator.
HRESULT hr = SHGetMalloc(&pShellMalloc);
if (SUCCEEDED(hr))
+ {
// Create an instance of the network connections folder.
hr = CoCreateInstance(CLSID_NetworkConnections, NULL,
CLSCTX_INPROC_SERVER, IID_IShellFolder,
reinterpret_cast<LPVOID *>(&pShellFolder));
- if (SUCCEEDED(hr))
+ }
+ if (SUCCEEDED(hr))
+ {
hr = pShellFolder->ParseDisplayName(NULL, NULL, szAdapterGuid, NULL,
&pidl, NULL);
+ }
if (SUCCEEDED(hr)) {
// Get the display name; this returns the friendly name.
STRRET sName;
// The IShellFolder interface is not implemented on this platform.
// Try the (undocumented) HrLanConnectionNameFromGuidOrPath API
// from the netman DLL.
+#ifndef NOLOGGING
afsi_log("IShellFolder API not implemented, trying HrLanConnectionNameFromGuidOrPath");
+#endif
hNetMan = LoadLibrary("netman.dll");
if (hNetMan == NULL) {
free(wGuid);
return -1;
}
+ /* Super Secret Microsoft Call */
HrLanProc = (HrLanProcAddr) GetProcAddress(hNetMan,
"HrLanConnectionNameFromGuidOrPath");
if (HrLanProc == NULL) {
}
free(wGuid);
if (FAILED(status)) {
+#ifndef NOLOGGING
afsi_log("lana_GetNameFromGuid: failed to get connection name (status %ld)",
status);
+#endif
return -1;
}
if (name == NULL)
return -1;
WideCharToMultiByte(CP_ACP, 0, wName, -1, name, size, NULL, NULL);
+#ifndef NOLOGGING
afsi_log("Connection name for %s is '%s'", Guid, name);
+#endif
if (*Name)
*Name = name;
else
return 0;
}
-// Find the lana number for the given connection name.
-extern "C" lana_number_t lana_FindLanaByName(const char *LanaName)
+// Return an array of LANAINFOs corresponding to a connection named LanaName
+// (NULL LanaName matches all connections), and has an IPv4 binding. Returns
+// NULL if something goes wrong.
+// NOTE: caller must free the returned block if non NULL.
+extern "C" LANAINFO * lana_FindLanaByName(const char *LanaName)
{
const char RegNetBiosLinkageKeyName[] =
"System\\CurrentControlSet\\Services\\NetBios\\Linkage";
char *pBind;
char *p;
+ LANAINFO * lanainfo;
+
// Open the NetBios Linkage key.
status = RegOpenKeyEx(HKEY_LOCAL_MACHINE, RegNetBiosLinkageKeyName, 0,
KEY_QUERY_VALUE, &hkey);
- if (status != ERROR_SUCCESS) {
+ if (status != ERROR_SUCCESS) {
+#ifndef NOLOGGING
afsi_log("Failed to open NetBios Linkage key (status %ld)", status);
- return LANA_INVALID;
+#endif
+ return NULL;
}
// Read the lana map.
status = RegQueryValueEx(hkey, "LanaMap", 0, &type,
(BYTE *) &lanamap, &lanamapsize);
if (status != ERROR_SUCCESS) {
+#ifndef NOLOGGING
afsi_log("Failed to read LanaMap (status %ld)", status);
+#endif
RegCloseKey(hkey);
- return LANA_INVALID;
+ return NULL;
}
if (lanamapsize == 0) {
+#ifndef NOLOGGING
afsi_log("No data in LanaMap");
- return LANA_INVALID;
+#endif
+ return NULL;
}
nlana = lanamapsize / sizeof(lanamap[0]);
if (status == ERROR_SUCCESS && bindpathsize != 0) {
bindpaths = (char *) malloc(bindpathsize * sizeof(char));
if (bindpaths == NULL) {
+#ifndef NOLOGGING
afsi_log("Cannot allocate %ld bytes for bindpaths", bindpathsize);
+#endif
RegCloseKey(hkey);
- return LANA_INVALID;
+ return NULL;
}
status = RegQueryValueEx(hkey, "Bind", 0, &type,
(BYTE *) bindpaths, &bindpathsize);
}
RegCloseKey(hkey);
if (status != ERROR_SUCCESS) {
+#ifndef NOLOGGING
afsi_log("Failed to read bind paths (status %ld)", status);
+#endif
if (bindpaths != NULL)
free(bindpaths);
- return LANA_INVALID;
+ return NULL;
}
if (bindpathsize == 0) {
+#ifndef NOLOGGING
afsi_log("No bindpath data");
+#endif
if (bindpaths != NULL)
free(bindpaths);
- return LANA_INVALID;
+ return NULL;
+ }
+
+ if (LanaName)
+ {
+ lanainfo = (LANAINFO *) malloc(sizeof(LANAINFO)*2);
+ if(lanainfo == NULL) {
+ free(bindpaths);
+ return NULL;
+ }
+ memset(lanainfo, 0, sizeof(LANAINFO) * 2);
+ lanainfo[0].lana_number = LANA_INVALID;
+ }
+ else
+ {
+ lanainfo = (LANAINFO *) malloc(sizeof(LANAINFO)*(nlana+1));
+ if(lanainfo == NULL) {
+ free(bindpaths);
+ return NULL;
+ }
+ memset(lanainfo, 0, sizeof(LANAINFO) * (nlana+1));
}
+
+ int index = 0;
// Iterate over the lana map entries and bind paths.
for (i = 0, pBind = bindpaths; i < nlana;
if ((lanamap[i].flags & 1) == 0)
continue;
- // check for a IPv4 binding
+ // check for an IPv4 binding
if(!strstr(pBind,"_Tcpip_"))
continue;
*++p = '\0'; // Ignore anything after the GUID.
status = lana_GetNameFromGuid(guid, &name);
free(guid);
- if (status == 0 && name != 0) {
- status = strcmp(name, LanaName);
- free(name);
- if (status == 0) {
- free(bindpaths);
- afsi_log("lana_FindLanaByName: Found lana %d for %s",
- lanamap[i].number, LanaName);
- return lanamap[i].number;
- }
- }
+
+ if (status == 0 && name != 0)
+ {
+ if (LanaName)
+ {
+ if (strcmp(name, LanaName) ==0)
+ {
+ lanainfo[index].lana_number = lanamap[i].number;
+ _tcscpy(lanainfo[index].lana_name, name);
+ free(name);
+ index++;
+ break;
+ }
+ }
+ else
+ {
+ lanainfo[index].lana_number = lanamap[i].number;
+ _tcscpy(lanainfo[index].lana_name, name);
+ free(name);
+ index++;
+ }
+ }
}
+
+ lanainfo[index].lana_number = LANA_INVALID;
+
free(bindpaths);
- return LANA_INVALID;
+ return lanainfo;
}
extern "C" lana_number_t lana_FindLoopback(void)
ncb.ncb_length = sizeof(lana_list);
status = Netbios(&ncb);
if (status != 0) {
- afsi_log("Netbios NCBENUM failed: status %ld", status);
- return LANA_INVALID;
+#ifndef NOLOGGING
+ afsi_log("Netbios NCBENUM failed: status %ld", status);
+#endif
+ return LANA_INVALID;
}
for (i = 0; i < lana_list.length; i++) {
if (lana_IsLoopback(lana_list.lana[i])) {
// Found one, return it.
+#ifndef NOLOGGING
afsi_log("lana_FindLoopback: Found LAN adapter %d",
lana_list.lana[i]);
+#endif
return lana_list.lana[i];
}
}
}
// Is the given lana a Windows Loopback Adapter?
+// TODO: implement a better check for loopback
+// TODO: also check for proper bindings (IPv4)
extern "C" BOOL lana_IsLoopback(lana_number_t lana)
{
NCB ncb;
if (status == 0)
status = ncb.ncb_retcode;
if (status != 0) {
- afsi_log("NCBRESET failed: lana %u, status %ld", lana, status);
- return FALSE;
+#ifndef NOLOGGING
+ afsi_log("NCBRESET failed: lana %u, status %ld", lana, status);
+#endif
+ return FALSE;
}
// Use the NCBASTAT command to get the adapter address.
if (status == 0)
status = ncb.ncb_retcode;
if (ncb.ncb_retcode != 0) {
+#ifndef NOLOGGING
afsi_log("NCBASTAT failed: lana %u, status %ld", lana, status);
- return FALSE;
+#endif
+ return FALSE;
}
return (memcmp(astat.status.adapter_address, kWLA_MAC, 6) == 0);
}
+
+// Get the netbios named used/to-be-used by the AFS SMB server.
+// IF <lana specified> THEN
+// Use specified lana
+// ELSE
+// Look for an adapter named "AFS", failing which,
+// look for a loopback adapter.
+// ENDIF
+// IF lana is for a loopback && !IsGateway THEN
+// IF netbios name is specified THEN
+// use specified netbios name
+// ELSE
+// use "AFS"
+// ENDIF
+// ELSE
+// use netbios name "<hostname>-AFS"
+// ENDIF
+// Return ERROR_SUCCESS if netbios name was successfully generated.
+// Returns the lana number to use in *pLana (if pLana is non-NULL) and also
+// the IsGateway setting in *pIsGateway (if pIsGateway is non-NULL).
+// the type of name returned.
+//
+// buffer is assumed to hold at least MAX_NB_NAME_LENGTH bytes.
+//
+// flags :
+// LANA_NETBIOS_NAME_IN : Use the values of *pLana and *pIsGateway as [in] parameters.
+// LANA_NETBIOS_NAME_SUFFIX : Only return the suffix of netbios name
+// LANA_NETBIOS_NAME_FULL : Return full netbios name
+extern "C" long lana_GetUncServerNameEx(char *buffer, lana_number_t * pLana, int * pIsGateway, int flags) {
+ HKEY hkConfig;
+ DWORD dummyLen;
+ LONG rv;
+ int regLana;
+ int regGateway, regNoFindLanaByName;
+ char regNbName[MAX_NB_NAME_LENGTH];
+ char nbName[MAX_NB_NAME_LENGTH];
+ char hostname[MAX_COMPUTERNAME_LENGTH+1];
+
+ rv = RegOpenKeyEx(HKEY_LOCAL_MACHINE,szAFSConfigKeyName,0,KEY_READ,&hkConfig);
+ if(rv == ERROR_SUCCESS) {
+ if(!(flags & LANA_NETBIOS_NAME_IN) || !pLana) {
+ dummyLen = sizeof(regLana);
+ rv = RegQueryValueEx(hkConfig, szLanAdapterValue, NULL, NULL, (LPBYTE) ®Lana, &dummyLen);
+ if(rv != ERROR_SUCCESS) regLana = -1;
+ } else
+ regLana = *pLana;
+
+ if(!(flags & LANA_NETBIOS_NAME_IN) || !pIsGateway) {
+ dummyLen = sizeof(regGateway);
+ rv = RegQueryValueEx(hkConfig, szIsGatewayValue, NULL, NULL, (LPBYTE) ®Gateway, &dummyLen);
+ if(rv != ERROR_SUCCESS) regGateway = 0;
+ } else
+ regGateway = *pIsGateway;
+
+ dummyLen = sizeof(regNoFindLanaByName);
+ rv = RegQueryValueEx(hkConfig, szNoFindLanaByName, NULL, NULL, (LPBYTE) ®NoFindLanaByName, &dummyLen);
+ if(rv != ERROR_SUCCESS) regNoFindLanaByName = 0;
+
+ // Do not care if the call fails for insufficient buffer size. We are not interested
+ // in netbios names over 15 chars.
+ dummyLen = sizeof(regNbName);
+ rv = RegQueryValueEx(hkConfig, szNetbiosNameValue, NULL, NULL, (LPBYTE) ®NbName, &dummyLen);
+ if(rv != ERROR_SUCCESS) regNbName[0] = 0;
+ else regNbName[15] = 0;
+
+ RegCloseKey(hkConfig);
+ } else {
+ if(flags & LANA_NETBIOS_NAME_IN) {
+ regLana = (pLana)? *pLana: -1;
+ regGateway = (pIsGateway)? *pIsGateway: 0;
+ } else {
+ regLana = -1;
+ regGateway = 0;
+ }
+ regNoFindLanaByName = 0;
+ regNbName[0] = 0;
+ }
+
+ if(regLana < 0 || regLana > MAX_LANA)
+ regLana = -1;
+
+ if(regLana == -1) {
+ LANAINFO *lanaInfo = NULL;
+ int nLana = LANA_INVALID;
+
+ if (!regNoFindLanaByName)
+ lanaInfo = lana_FindLanaByName("AFS");
+ if(lanaInfo != NULL) {
+ nLana = lanaInfo[0].lana_number;
+ free(lanaInfo);
+ } else
+ nLana = LANA_INVALID;
+
+ if(nLana == LANA_INVALID && !regGateway) {
+ nLana = lana_FindLoopback();
+ }
+ if(nLana != LANA_INVALID)
+ regLana = nLana;
+ }
+
+ if(regLana >=0 && lana_IsLoopback((lana_number_t) regLana)) {
+ if(regNbName[0]) {
+ strncpy(nbName,regNbName,15);
+ nbName[16] = 0;
+ strupr(nbName);
+ }
+ else
+ strcpy(nbName,"AFS");
+ } else {
+ char * dot;
+
+ if(flags & LANA_NETBIOS_NAME_SUFFIX) {
+ strcpy(nbName,"-AFS");
+ } else {
+ dummyLen = sizeof(hostname);
+ // assume we are not a cluster.
+ rv = GetComputerName(hostname, &dummyLen);
+ if(!SUCCEEDED(rv)) { // should not happen, but...
+ return rv;
+ }
+ strncpy(nbName, hostname, 11);
+ nbName[11] = 0;
+ if(dot = strchr(nbName,'.'))
+ *dot = 0;
+ strcat(nbName,"-AFS");
+ }
+ }
+
+ if(pLana) *pLana = regLana;
+ if(pIsGateway) *pIsGateway = regGateway;
+
+ strcpy(buffer, nbName);
+
+ return ERROR_SUCCESS;
+}
+
+extern "C" void lana_GetUncServerNameDynamic(int lanaNumber, BOOL isGateway, TCHAR *name, int type) {
+ char szName[MAX_NB_NAME_LENGTH];
+ lana_number_t lana = (lana_number_t) lanaNumber;
+ int gateway = (int) isGateway;
+
+ if(SUCCEEDED(lana_GetUncServerNameEx(szName, &lana, &gateway, LANA_NETBIOS_NAME_IN | type))) {
+#ifdef _UNICODE
+ mbswcs(name,szName,MAX_NB_NAME_LENGTH);
+#else
+ strncpy(name,szName,MAX_NB_NAME_LENGTH);
+#endif
+ } else
+ *name = _T('\0');
+}
+
+extern "C" void lana_GetUncServerName(TCHAR *name, int type) {
+ char szName[MAX_NB_NAME_LENGTH];
+
+ if(SUCCEEDED(lana_GetUncServerNameEx(szName,NULL,NULL,type))) {
+#ifdef _UNICODE
+ mbswcs(name,szName,MAX_NB_NAME_LENGTH);
+#else
+ strncpy(name,szName,MAX_NB_NAME_LENGTH);
+#endif
+ } else {
+ *name = _T('\0');
+ }
+}
+
+extern "C" void lana_GetAfsNameString(int lanaNumber, BOOL isGateway, TCHAR* name)
+{
+ lana_GetUncServerNameDynamic(lanaNumber, isGateway, name,LANA_NETBIOS_NAME_FULL);
+ _stprintf(name, _T("Your UNC name to reach the root of AFS is \\\\%s\\all"), name);
+}
+
+extern "C" void lana_GetNetbiosName(LPTSTR pszName, int type)
+{
+ HKEY hkCfg;
+ TCHAR name[MAX_NB_NAME_LENGTH];
+ DWORD dummyLen;
+
+ memset(name, 0, sizeof(name));
+ if (GetVersion() >= 0x80000000) // not WindowsNT
+ {
+ if (type == LANA_NETBIOS_NAME_SUFFIX)
+ {
+ _tcscpy(pszName, TEXT("-afs"));
+ return;
+ }
+
+ if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,szAFSConfigKeyName,0,KEY_READ,&hkCfg) == ERROR_SUCCESS) {
+ dummyLen = sizeof(name);
+ if(RegQueryValueEx(hkCfg,TEXT("Gateway"),NULL,NULL,(LPBYTE) name,&dummyLen) == ERROR_SUCCESS)
+ name[0] = _T('\0');
+ RegCloseKey(hkCfg);
+ }
+
+ if (_tcslen(name) == 0)
+ {
+ _tcscpy(pszName, TEXT("unknown"));
+ return;
+ }
+
+ _tcscpy(pszName, name);
+ _tcscat(pszName, TEXT("-afs"));
+ return;
+ }
+
+ lana_GetUncServerName(name,type);
+ _tcslwr(name);
+ _tcscpy(pszName, name);
+ return;
+}
+
+#ifndef __LANAHELPER_H__
+#define __LANAHELPER_H__
+
#include <windows.h>
+#include <tchar.h>
#ifdef __cplusplus
extern "C" {
int lana_GetNameFromGuid(char *Guid, char **Name);
- lana_number_t lana_FindLanaByName(const char *LanaName);
+ struct LANAINFO
+ {
+ lana_number_t lana_number;
+ TCHAR lana_name[MAX_PATH];
+ };
+
+#define LANA_INVALID 0xff
+#define MAX_NB_NAME_LENGTH 17
+
+#define LANA_NETBIOS_NAME_SUFFIX 1
+#define LANA_NETBIOS_NAME_FULL 0
+
+#define LANA_NETBIOS_NAME_IN 2
+
+ int lana_GetNameFromGuid(char *Guid, char **Name);
+
+ struct LANAINFO * lana_FindLanaByName(const char *LanaName);
lana_number_t lana_FindLoopback(void);
BOOL lana_IsLoopback(lana_number_t lana);
+ long lana_GetUncServerNameEx(char *buffer, lana_number_t * pLana, int * pIsGateway, int flags);
+
+ void lana_GetUncServerNameDynamic(int lanaNumber, BOOL isGateway, TCHAR *name, int type);
+
+ void lana_GetUncServerName(TCHAR *name, int type);
+
+ void lana_GetAfsNameString(int lanaNumber, BOOL isGateway, TCHAR* name);
+
+ void lana_GetNetbiosName(LPTSTR pszName, int type);
+
#ifdef __cplusplus
}
#endif
+
+#endif
+
$(OUT)\isadmin.obj \
$(OUT)\dlg_automap.obj \
$(OUT)\dlg_binding.obj \
- $(OUT)\RegistrySupport.obj \
- $(OUT)\getlana.obj
+ $(OUT)\RegistrySupport.obj
EXEOBJSc = \
$(OUT)\cellservdb.obj
$(DESTDIR)\lib\afsrpc.lib \
$(DESTDIR)\lib\afsauthent.lib \
$(DESTDIR)\lib\libosi.lib \
- $(DESTDIR)\lib\libafsconf.lib
+ $(DESTDIR)\lib\libafsconf.lib \
+ $(DESTDIR)\lib\lanahelper.lib
############################################################################
#
#include "afs_config.h"
#include <stdio.h>
+#include <lanahelper.h>
/*
* DEFINITIONS ________________________________________________________________
* PROTOTYPES _________________________________________________________________
*
*/
-extern void GetNetbiosName(LPTSTR pszName, int type);
-
void AutoMap_OnInitDialog (HWND hDlg);
void AutoMap_OnAdd (HWND hDlg);
void AutoMap_OnSelect (HWND hDlg);
#else
memset(szMapping, '\0', sizeof(szMapping));
szMapping[0] = '\\';
- GetNetbiosName(&szMapping[1], 0);
+ lana_GetNetbiosName(&szMapping[1], LANA_NETBIOS_NAME_FULL);
#endif
SetDlgItemText (hDlg, IDC_PATH, szMapping);
SetDlgItemText (hDlg, IDC_DESC, pMap->szSubmount);
TCHAR szName[MAX_PATH];
memset(szName, '\0', sizeof(szName));
szName[0] = '\\';
- GetNetbiosName(&szName[1], 0);
+ lana_GetNetbiosName(&szName[1], LANA_NETBIOS_NAME_FULL);
if ( lstrncmpi (pMap->szMapping, szName, lstrlen(szName) ))
{
}
#include <stdio.h>
#include "afs_config.h"
-#include "getlana.h"
-
+#include <lanahelper.h>
/*
* DEFINITIONS ________________________________________________________________
nLanAdapter = GetAdapterNumber(selected);
}
- GetAfsName(nLanAdapter, isGateway, name);
+ lana_GetAfsNameString(nLanAdapter, isGateway, name);
SetDlgItemText (hDlg, IDC_BINDING_MESSAGE, name);
EnableWindow(GetDlgItem(hDlg,IDC_NICSELECTION),(nLanAdapter!=-1));
break;
nLanAdapter = GetAdapterNumber(selected);
- GetAfsName(nLanAdapter, isGateway, name);
+ lana_GetAfsNameString(nLanAdapter, isGateway, name);
SetDlgItemText (hDlg, IDC_BINDING_MESSAGE, name);
break;
}
void Binding_OnInitDialog (HWND hDlg)
{
-
- TCHAR msg[MAX_PATH];
- TCHAR name[MAX_PATH];
- memset(msg, 0, sizeof(msg));
- memset(name, 0, sizeof(name));
+ TCHAR name[MAX_PATH];
+ memset(name, 0, sizeof(name));
- if (fFirstTime) {
- Config_GetLanAdapter(&g.Configuration.nLanAdapter);
- nLanAdapter = g.Configuration.nLanAdapter;
- isGateway = g.Configuration.fBeGateway;
- fFirstTime = FALSE;
- }
-
- lanainfo = GetLana(msg, NULL);
-
- if (!lanainfo && _tcslen(msg) > 0)
- MessageBox(hDlg, msg, "LANA ERROR", MB_ICONERROR);
- else
- {
- HWND hwndCombo = GetDlgItem(hDlg, IDC_NICSELECTION);
- int index = 0;
- TCHAR tmp[MAX_PATH];
- while (_tcslen(lanainfo[index].lana_name) > 0)
- {
- _stprintf(tmp, "%s (lana number = %d)", lanainfo[index].lana_name,
- lanainfo[index].lana_number);
- SendMessage(hwndCombo, CB_ADDSTRING,
- 0, (LPARAM) tmp);
- if (nLanAdapter == lanainfo[index].lana_number)
- SendMessage(hwndCombo, CB_SELECTSTRING, (WPARAM)-1,
- (LPARAM)tmp);
- index++;
+ if (fFirstTime) {
+ Config_GetLanAdapter(&g.Configuration.nLanAdapter);
+ nLanAdapter = g.Configuration.nLanAdapter;
+ isGateway = g.Configuration.fBeGateway;
+ fFirstTime = FALSE;
}
- }
+ lanainfo = lana_FindLanaByName(NULL);
+
+ // TODO: Show more useful error message.
+ if (!lanainfo) {
+ MessageBox(hDlg, "Unable to obtain LANA list", "LANA ERROR", MB_ICONERROR);
+ }
+ else
+ {
+ HWND hwndCombo = GetDlgItem(hDlg, IDC_NICSELECTION);
+ int index = 0;
+ TCHAR tmp[MAX_PATH];
+ while (_tcslen(lanainfo[index].lana_name) > 0)
+ {
+ _stprintf(tmp, "%s (lana number = %d)", lanainfo[index].lana_name,
+ lanainfo[index].lana_number);
+ SendMessage(hwndCombo, CB_ADDSTRING,
+ 0, (LPARAM) tmp);
+ if (nLanAdapter == lanainfo[index].lana_number)
+ SendMessage(hwndCombo, CB_SELECTSTRING, (WPARAM)-1,
+ (LPARAM)tmp);
+ index++;
+ }
+ }
- GetAfsName(nLanAdapter, isGateway, name);
- SetDlgItemText (hDlg, IDC_BINDING_MESSAGE, name);
+ lana_GetAfsNameString(nLanAdapter, isGateway, name);
+ SetDlgItemText (hDlg, IDC_BINDING_MESSAGE, name);
- CheckDlgButton (hDlg, IDC_DEFAULTNIC, (nLanAdapter==-1));
+ CheckDlgButton (hDlg, IDC_DEFAULTNIC, (nLanAdapter==-1));
- EnableWindow(GetDlgItem(hDlg,IDC_NICSELECTION),(nLanAdapter!=-1));
+ EnableWindow(GetDlgItem(hDlg,IDC_NICSELECTION),(nLanAdapter!=-1));
}
void Binding_OnOK (HWND hDlg)
#include <adssts.h>
#define DEBUG_VERBOSE
#include <osilog.h>
+#include <lanahelper.h>
extern void Config_GetLanAdapter (ULONG *pnLanAdapter);
-void GetNetbiosName(LPTSTR pszName, int type);
extern BOOL Config_ReadNum (LPCTSTR pszLHS, DWORD *pdwRHS);
extern BOOL Config_ReadString (LPCTSTR pszLHS, LPTSTR pszRHS, size_t cchMax);
-extern void GetUncServerName(int lanaNumber, BOOL isGateway, TCHAR* name, int type);
-
-#define NETBIOS_NAME_FULL 0
-#define NETBIOS_NAME_SUFFIX 1
/*
* REGISTRY ___________________________________________________________________
return fIsWinNT;
}
-
+/* Check if the OS is Windows 2000 or higher.
+*/
BOOL IsWindows2000 (void)
{
static BOOL fChecked = FALSE;
void GetClientNetbiosName (LPTSTR pszName)
{
*pszName = TEXT('\0');
- GetNetbiosName(pszName, NETBIOS_NAME_FULL);
+ lana_GetNetbiosName(pszName, LANA_NETBIOS_NAME_FULL);
}
}
}
-
BOOL GetDriveSubmount (TCHAR chDrive, LPTSTR pszSubmountNow)
{
TCHAR szDrive[] = TEXT("*:");
szDrive[0] = chDrive;
- TCHAR szMapping[ MAX_PATH ] = TEXT("");
+ TCHAR szMapping[ _MAX_PATH ] = TEXT("");
LPTSTR pszSubmount = szMapping;
TCHAR szNetBiosName[32];
memset(szNetBiosName, '\0', sizeof(szNetBiosName));
- GetNetbiosName(szNetBiosName, NETBIOS_NAME_SUFFIX);
+ lana_GetNetbiosName(szNetBiosName, LANA_NETBIOS_NAME_SUFFIX);
_tcscat(szNetBiosName, TEXT("\\"));
if (IsWindowsNT())
- {
- QueryDosDevice (szDrive, szMapping, MAX_PATH);
+ {
+ if (!QueryDosDevice (szDrive, szMapping, MAX_PATH))
+ return FALSE;
// Now if this is an AFS network drive mapping, {szMapping} will be:
//
- // \Device\LanmanRedirector\Q:\machine-afs\submount
+ // \Device\LanmanRedirector\<Drive>:\<netbiosname>\submount
//
// on Windows NT. On Windows 2000, it will be:
//
- // \Device\LanmanRedirector\;Q:0\machine-afs\submount
+ // \Device\LanmanRedirector\;<Drive>:0\<netbiosname>\submount
//
// (This is presumably to support multiple drive mappings with
// Terminal Server).
//
- if (lstrncmpi (szMapping, cszLANMANDEVICE, lstrlen(cszLANMANDEVICE)))
+ // on Windows XP and 2003, it will be :
+ // \Device\LanmanRedirector\;<Drive>:<AuthID>\<netbiosname>\submount
+ //
+ // where : <Drive> : DOS drive letter
+ // <AuthID>: Authentication ID, 16 char hex.
+ // <netbiosname>: Netbios name of server
+ //
+ if (_tcsnicmp(szMapping, cszLANMANDEVICE, _tcslen(cszLANMANDEVICE)))
return FALSE;
- pszSubmount = &szMapping[ lstrlen(cszLANMANDEVICE) ];
+ pszSubmount = &szMapping[ _tcslen(cszLANMANDEVICE) ];
if (IsWindows2000())
{
if (*(++pszSubmount) != TEXT(':'))
return FALSE;
+#ifdef COMMENT
+ // No longer a safe assumption on XP
if (IsWindows2000())
if (*(++pszSubmount) != TEXT('0'))
return FALSE;
+#endif
// scan for next "\"
while (*(++pszSubmount) != TEXT('\\'))
if (*pszSubmount==0)
return FALSE;
}
+ ++pszSubmount;
+ if(!*pszSubmount || _tcsncicmp(pszSubmount, szNetBiosName, _tcslen(szNetBiosName)))
+ return FALSE;
+
+#ifdef COMMENT
+ // note that szNetBiosName has a '\\' tagged in the end earlier
for (++pszSubmount; *pszSubmount && (*pszSubmount != TEXT('\\')); ++pszSubmount)
if (!lstrncmpi (pszSubmount, szNetBiosName, lstrlen(szNetBiosName)))
break;
if ((!*pszSubmount) || (*pszSubmount == TEXT('\\')))
return FALSE;
- pszSubmount += lstrlen(szNetBiosName);
+#endif
+ pszSubmount += _tcslen(szNetBiosName);
}
else // (!IsWindowsNT())
{
CHAR *pSubmount="";
memset(szMachine, '\0', sizeof(szMachine));
- GetNetbiosName(szMachine, NETBIOS_NAME_FULL);
+ lana_GetNetbiosName(szMachine, LANA_NETBIOS_NAME_FULL);
// Initialize the data structure
if ((res=WNetOpenEnum(RESOURCE_CONNECTED,RESOURCETYPE_DISK,RESOURCEUSAGE_CONNECTABLE,lpnr,&hEnum))!=NO_ERROR)
DWORD cbBuffer=16384;
memset(szMachine, '\0', sizeof(szMachine));
- GetNetbiosName(szMachine, NETBIOS_NAME_FULL);
+ lana_GetNetbiosName(szMachine, LANA_NETBIOS_NAME_FULL);
// Initialize the data structure
if (!IsServiceActive())
TCHAR szMachine[ MAX_PATH],szPath[MAX_PATH];
memset(szMachine, '\0', sizeof(szMachine));
- GetNetbiosName(szMachine, NETBIOS_NAME_FULL);
+ lana_GetNetbiosName(szMachine, LANA_NETBIOS_NAME_FULL);
sprintf(szPath,"\\\\%s\\all",szMachine);
// Lets connect all submounts that weren't connectd
sprintf(szPath,"%c:",chDrive);
return DisMountDOSDriveFull(szPath,bForce);
}
-
-void GetNetbiosName(LPTSTR pszName, int type)
-{
- DWORD LanAdapter;
- DWORD dwIsGateWay = 0;
- TCHAR name[MAX_PATH];
- TCHAR *Ptr;
-
- memset(name, '\0', sizeof(name));
- if (!IsWindowsNT())
- {
- if (type == NETBIOS_NAME_SUFFIX)
- {
- _tcscpy(pszName, TEXT("-afs"));
- return;
- }
- Config_ReadString (TEXT("Gateway"), pszName, MAX_PATH);
- if (strlen(pszName) == 0)
- {
- strcpy(pszName, TEXT("unknown"));
- return;
- }
- _tcscat(pszName, TEXT("-afs"));
- return;
- }
- if (!Config_ReadNum (TEXT("IsGateway"), &dwIsGateWay))
- dwIsGateWay = 0;
- memset(name, 0, sizeof(name));
- if (!Config_ReadNum (TEXT("LANadapter"), &LanAdapter))
- LanAdapter = -1;
- GetUncServerName(LanAdapter, dwIsGateWay, name, type);
- _tcscpy(pszName, name);
- return;
-}
-
+++ /dev/null
-// getlana.cpp : Defines the entry point for the console application.
-//
-
-#include <afx.h>
-#include <windows.h>
-#include <winreg.h>
-#include <nb30.h>
-#include <tchar.h>
-#include <shellapi.h>
-#include <iostream>
-#include <objbase.h>
-#include <shlobj.h>
-#include <shlwapi.h>
-#include <wtypes.h>
-#include <string.h>
-#include <malloc.h>
-#include <winsock2.h>
-#include <getlana.h>
-
-
-
-#define LANA_INVALID 0xff
-using namespace std;
-BOOL lana_IsLoopback(lana_number_t lana, TCHAR*);
-lana_number_t lana_FindLoopback(TCHAR*);
-
-
-
-// Use the IShellFolder API to get the connection name for the given Guid.
-static HRESULT getname_shellfolder(WCHAR *wGuid, WCHAR *wName, int NameSize)
-{
- // This is the GUID for the network connections folder. It is constant.
- // {7007ACC7-3202-11D1-AAD2-00805FC1270E}
- const GUID CLSID_NetworkConnections = {
- 0x7007ACC7, 0x3202, 0x11D1, {
- 0xAA, 0xD2, 0x00, 0x80, 0x5F, 0xC1, 0x27, 0x0E
- }
- };
- LPITEMIDLIST pidl;
- IShellFolder *pShellFolder;
- IMalloc *pShellMalloc;
-
- // Build the display name in the form "::{GUID}".
- if (wcslen(wGuid) >= MAX_PATH)
- return E_INVALIDARG;
- WCHAR szAdapterGuid[MAX_PATH + 2];
- swprintf(szAdapterGuid, L"::%ls", wGuid);
-
- // Initialize COM.
- CoInitialize(NULL);
-
- // Get the shell allocator.
- HRESULT hr = SHGetMalloc(&pShellMalloc);
- if (SUCCEEDED(hr))
- {
- // Create an instance of the network connections folder.
- hr = CoCreateInstance(CLSID_NetworkConnections, NULL,
- CLSCTX_INPROC_SERVER, IID_IShellFolder,
- reinterpret_cast<LPVOID *>(&pShellFolder));
- }
- if (SUCCEEDED(hr))
- hr = pShellFolder->ParseDisplayName(NULL, NULL, szAdapterGuid, NULL,
- &pidl, NULL);
- if (SUCCEEDED(hr))
- {
- // Get the display name; this returns the friendly name.
- STRRET sName;
- hr = pShellFolder->GetDisplayNameOf(pidl, SHGDN_NORMAL, &sName);
- if (SUCCEEDED(hr))
- wcsncpy(wName, sName.pOleStr, NameSize);
- pShellMalloc->Free(pidl);
- }
-
- CoUninitialize();
- return hr;
-}
-
-// Get the Connection Name for the given GUID.
-static int lana_GetNameFromGuid(char *Guid, char **Name)
-{
- typedef HRESULT (WINAPI *HrLanProcAddr)(GUID *, PCWSTR, PWSTR, LPDWORD);
- HrLanProcAddr HrLanProc = NULL;
- HMODULE hNetMan;
- int size;
- WCHAR *wGuid = NULL;
- WCHAR wName[MAX_PATH];
- DWORD NameSize = (sizeof(wName) / sizeof(wName[0]));
- HRESULT status;
-
- // Convert the Guid string to Unicode. First we ask only for the size
- // of the converted string. Then we allocate a buffer of sufficient
- // size to hold the result of the conversion.
- size = MultiByteToWideChar(CP_ACP, 0, Guid, -1, NULL, 0);
- wGuid = (WCHAR *) malloc(size * sizeof(WCHAR));
- MultiByteToWideChar(CP_ACP, 0, Guid, -1, wGuid, size);
-
- // First try the IShellFolder interface, which was unimplemented
- // for the network connections folder before XP.
- status = getname_shellfolder(wGuid, wName, NameSize);
- if (status == E_NOTIMPL)
- {
- // The IShellFolder interface is not implemented on this platform.
- // Try the (undocumented) HrLanConnectionNameFromGuidOrPath API
- // from the netman DLL.
- hNetMan = LoadLibrary("netman.dll");
- if (hNetMan == NULL)
- {
- free(wGuid);
- return -1;
- }
- HrLanProc =
- (HrLanProcAddr) GetProcAddress(hNetMan,
- "HrLanConnectionNameFromGuidOrPath");
- if (HrLanProc == NULL)
- {
- FreeLibrary(hNetMan);
- free(wGuid);
- return -1;
- }
- // Super Secret Microsoft Call
- status = HrLanProc(NULL, wGuid, wName, &NameSize);
- FreeLibrary(hNetMan);
- }
- free(wGuid);
- if (FAILED(status))
- {
- cerr << "lana_GetNameFromGuid: failed to get connection name (status "
- << status << ")\r\n";
- return -1;
- }
-
- // Get the required buffer size, and then convert the string.
- size = WideCharToMultiByte(CP_ACP, 0, wName, -1, NULL, 0, NULL, NULL);
- *Name = (char *) malloc(size);
- if (*Name == NULL)
- return -1;
- WideCharToMultiByte(CP_ACP, 0, wName, -1, *Name, size, NULL, NULL);
- return 0;
-}
-
-LANAINFO* GetLana(TCHAR* msg, const char *LanaName)
-{
- const char RegNetBiosLinkageKeyName[] =
- "System\\CurrentControlSet\\Services\\NetBios\\Linkage";
- HKEY hkey;
- LONG status;
- struct {
- BYTE flags;
- BYTE number;
- } lanamap[MAX_LANA+1];
- DWORD lanamapsize = sizeof(lanamap);
- DWORD type;
- char *bindpaths = NULL;
- DWORD bindpathsize;
- int nlana;
- int i;
- char *guid;
- char *name;
- char *pBind;
- char *p;
-
- LANAINFO* lanainfo;
-
- // Open the NetBios Linkage key.
- status = RegOpenKeyEx(HKEY_LOCAL_MACHINE, RegNetBiosLinkageKeyName, 0,
- KEY_QUERY_VALUE, &hkey);
-
- if (status != ERROR_SUCCESS)
- {
- _stprintf(msg, _T("Failed to open NetBios Linkage key (status %d)"), status);
- return NULL;
- }
-
- // Read the lana map.
- status = RegQueryValueEx(hkey, "LanaMap", 0, &type,
- (BYTE *) &lanamap, &lanamapsize);
- if (status != ERROR_SUCCESS)
- {
- _stprintf(msg, _T("Failed to read LanaMap (status %d)"), status);
- RegCloseKey(hkey);
- return NULL;
- }
- if (lanamapsize == 0)
- {
- _stprintf(msg, _T("No data in LanaMap"));
- return NULL;
- }
- nlana = lanamapsize / sizeof(lanamap[0]);
-
- // Get the bind paths for NetBios so we can match them up
- // with the lana map. First we query for the size, so we
- // can allocate an appropriate buffer.
- status = RegQueryValueEx(hkey, "Bind", 0, &type, NULL, &bindpathsize);
- if (status == ERROR_SUCCESS && bindpathsize != 0)
- {
- bindpaths = (char *) malloc(bindpathsize * sizeof(char));
- if (bindpaths == NULL)
- {
- _stprintf(msg, _T("Cannot allocate %d bytes for bindpaths"), bindpathsize);
-
- RegCloseKey(hkey);
- return NULL;
- }
- status = RegQueryValueEx(hkey, "Bind", 0, &type,
- (BYTE *) bindpaths, &bindpathsize);
- }
- RegCloseKey(hkey);
- if (status != ERROR_SUCCESS)
- {
- _stprintf(msg, _T("Failed to read bind paths (status %d)"), status);
- if (bindpaths != NULL)
- free(bindpaths);
- return NULL;
- }
- if (bindpathsize == 0)
- {
- _stprintf(msg, _T("No bindpath data"));
- if (bindpaths != NULL)
- free(bindpaths);
- return NULL;
- }
-
- if (LanaName)
- {
- lanainfo = new LANAINFO[1];
- lanainfo[0].lana_number = LANA_INVALID;
- memset(lanainfo[0].lana_name, 0, sizeof(lanainfo[0].lana_name));
- }
- else
- {
- lanainfo = new LANAINFO[nlana+1];
- memset(lanainfo, 0, sizeof(LANAINFO) * nlana);
- }
- int index = 0;
- for (i = 0, pBind = bindpaths; i < nlana;
- i++, pBind += strlen(pBind) + 1)
- {
- // Ignore an invalid map entry.
- if ((lanamap[i].flags & 1) == 0)
- continue;
- // Find the beginning of the GUID.
- guid = strchr(pBind, '{');
- if (guid == NULL)
- continue; // Malformed path entry?
- guid = strdup(guid);
- if (guid == NULL)
- continue;
- // Find the end of the GUID.
- p = strchr(guid, '}');
- if (p == NULL)
- {
- free(guid); // Malformed GUID?
- continue;
- }
- *++p = '\0'; // Ignore anything after the GUID.
- status = lana_GetNameFromGuid(guid, &name);
- if (status == 0)
- {
- if (LanaName)
- {
- if (strcmp(name, LanaName) ==0)
- {
- lanainfo[index].lana_number = lanamap[i].number;
- _tcscpy(lanainfo[index].lana_name ,name);
- free(name);
- free(guid);
- break;
- }
- }
- else
- {
- lanainfo[index].lana_number = lanamap[i].number;
- _tcscpy(lanainfo[index].lana_name ,name);
- free(name);
- index++;
- }
- }
-
- free(guid);
- }
- free(bindpaths);
- return lanainfo;
-}
-
-
-lana_number_t lana_FindLoopback(TCHAR* msg)
-{
- NCB ncb;
- LANA_ENUM lana_list;
- int status;
- int i;
-
- memset(&ncb, 0, sizeof(ncb));
- ncb.ncb_command = NCBENUM;
- ncb.ncb_buffer = (UCHAR *) &lana_list;
- ncb.ncb_length = sizeof(lana_list);
- status = Netbios(&ncb);
- if (status != 0) {
- _stprintf(msg, _T("Netbios NCBENUM failed: status %ld"), status);
- return LANA_INVALID;
- }
-
- for (i = 0; i < lana_list.length; i++) {
- if (lana_IsLoopback(lana_list.lana[i], msg)) {
- // Found one, return it.
- return lana_list.lana[i];
- }
- }
- // Could not find a loopback adapter.
- return LANA_INVALID;
-}
-
-
-// Is the given lana a Windows Loopback Adapter?
-BOOL lana_IsLoopback(lana_number_t lana, TCHAR* msg)
-{
- NCB ncb;
- struct {
- ADAPTER_STATUS status;
- NAME_BUFFER names[MAX_LANA+1];
- } astat;
- unsigned char kWLA_MAC[6] = { 0x02, 0x00, 0x4c, 0x4f, 0x4f, 0x50 };
- int status;
-
- // Reset the adapter: in Win32, this is required for every process, and
- // acts as an init call, not as a real hardware reset.
- memset(&ncb, 0, sizeof(ncb));
- ncb.ncb_command = NCBRESET;
- ncb.ncb_callname[0] = 100;
- ncb.ncb_callname[2] = 100;
- ncb.ncb_lana_num = lana;
- status = Netbios(&ncb);
- if (status == 0)
- status = ncb.ncb_retcode;
- if (status != 0) {
- sprintf(msg, "NCBRESET failed: lana %u, status %ld", lana, status);
- return FALSE;
- }
-
- // Use the NCBASTAT command to get the adapter address.
- memset(&ncb, 0, sizeof(ncb));
- ncb.ncb_command = NCBASTAT;
- ncb.ncb_lana_num = lana;
- strcpy((char *) ncb.ncb_callname, "* ");
- ncb.ncb_buffer = (UCHAR *) &astat;
- ncb.ncb_length = sizeof(astat);
- status = Netbios(&ncb);
- if (status == 0)
- status = ncb.ncb_retcode;
- if (ncb.ncb_retcode != 0) {
- sprintf(msg, "NCBASTAT failed: lana %u, status %ld", lana, status);
- return FALSE;
- }
- return (memcmp(astat.status.adapter_address, kWLA_MAC, 6) == 0);
-}
-
-#define NETBIOS_NAME_FULL 0
-#define NETBIOS_NAME_SUFFIX 1
-#define AFSCONFIGKEYNAME TEXT("SYSTEM\\CurrentControlSet\\Services\\TransarcAFSDaemon\\Parameters")
-
-void GetUncServerName(int lanaNumber, BOOL isGateway, TCHAR* name, int type)
-{
- lana_number_t lana = LANA_INVALID;
- LANAINFO* lanainfo;
- WSADATA WSAjunk;
- char cm_HostName[MAX_PATH];
- TCHAR tmpName[MAX_PATH];
- TCHAR msg[MAX_PATH];
- memset(msg, 0, sizeof(msg));
- memset(tmpName, 0, sizeof(tmpName));
- memset(cm_HostName, 0, sizeof(cm_HostName));
- WSAStartup(0x0101, &WSAjunk);
-
- if (lanaNumber == -1) {
- /* Find the default LAN adapter to use. First look for
- * the adapter named AFS; otherwise, unless we are doing
- * gateway service, look for any valid loopback adapter.
- */
- lanainfo = GetLana(msg, "AFS");
- if (lanainfo)
- {
- lana = lanainfo[0].lana_number;
- delete lanainfo;
- }
- if (lana == LANA_INVALID && !isGateway)
- lana = lana_FindLoopback(msg);
- if (lana != LANA_INVALID)
- lanaNumber = lana;
- }
- /* If we are using a loopback adapter, we can use the preferred
- * (but non-unique) server name; otherwise, we must fall back to
- * the <machine>-AFS name.
- */
- if (lanaNumber >= 0 && lana_IsLoopback(lanaNumber, msg))
- {
- HKEY parmKey;
- char explicitNetbiosName[MAX_PATH+1];
- DWORD len=sizeof(explicitNetbiosName)-1;
- if ((RegOpenKeyEx(HKEY_LOCAL_MACHINE, AFSCONFIGKEYNAME,0, KEY_QUERY_VALUE, &parmKey)!= ERROR_SUCCESS)
- || (RegQueryValueEx(parmKey, "NetbiosName", NULL, NULL,(LPBYTE)(explicitNetbiosName), &len)!= ERROR_SUCCESS)
- || (len > sizeof(explicitNetbiosName)-1)
- )
- strcpy(explicitNetbiosName, "AFS");
- RegCloseKey(parmKey);
- explicitNetbiosName[len]=0; /*safety see ms-help://MS.MSDNQTR.2002OCT.1033/sysinfo/base/regqueryvalueex.htm*/
- _tcscpy(name, explicitNetbiosName);
- } else {
- gethostname(cm_HostName, sizeof(cm_HostName));
- _tcscpy(tmpName, cm_HostName);
- char* ctemp = _tcschr(tmpName, '.'); /* turn ntdfs.* into ntdfs */
- if (ctemp) *ctemp = 0;
- tmpName[11] = 0; /* ensure that even after adding the -A, we
- * leave one byte free for the netbios server
- * type.
- */
- if (type == NETBIOS_NAME_FULL) {
- _tcscat(tmpName, _T("-afs"));
- _tcscpy(name, tmpName);
- } else {
- _tcscpy(name, _T("-afs"));
- }
- }
-}
-
-void GetAfsName(int lanaNumber, BOOL isGateway, TCHAR* name)
-{
- TCHAR tmpName[MAX_PATH];
- GetUncServerName(lanaNumber, isGateway, tmpName, NETBIOS_NAME_FULL);
- _stprintf(name, _T("Your UNC name to reach the root of AFS is \\\\%s\\all"), tmpName);
-}
-
+++ /dev/null
-/*
- * Copyright 2000, International Business Machines Corporation and others.
- * All Rights Reserved.
- *
- * This software has been released under the terms of the IBM Public
- * License. For details, see the LICENSE file in the top-level source
- * directory or online at http://www.openafs.org/dl/license10.html
- */
-
-#ifndef GETLANA_H
-#define GETLANA_H
-
-typedef BYTE lana_number_t;
-struct LANAINFO
- {
- lana_number_t lana_number;
- TCHAR lana_name[MAX_PATH];
- };
-
- LANAINFO * GetLana(TCHAR* msg, const char *LanaName);
-
- void GetAfsName(int lanaNumber, BOOL isGateway, TCHAR* name);
-
-#endif
\ No newline at end of file
#include "afs_config.h"
#include "tab_drives.h"
-
+#include <lanahelper.h>
/*
* PROTOTYPES _________________________________________________________________
return FALSE;
}
-extern void GetNetbiosName(LPTSTR pszName, int type);
-
void DriveEdit_OnInitDialog (HWND hDlg)
{
PDRIVEMAP pMap = (PDRIVEMAP)GetWindowLong (hDlg, DWL_USER);
SendMessage (hCombo, CB_SETCURSEL, iItemSel, 0);
TCHAR szMapping[ MAX_PATH ];
-#ifdef NOLANA
- AdjustAfsPath (szMapping, ((pMap->szMapping[0]) ? pMap->szMapping : cm_slash_mount_root), TRUE, FALSE);
-#else
memset(szMapping, '\0', sizeof(szMapping));
szMapping[0] = '\\';
- GetNetbiosName(&szMapping[1], 0);
-#endif
+ lana_GetNetbiosName(&szMapping[1], LANA_NETBIOS_NAME_FULL);
CHAR msg[256], msgf[256];
if (GetDlgItemText(hDlg,IDC_STATICSUBMOUNT,(LPSTR)msg,sizeof(msg)-1)>0)
CLIENTOBJS = \
$(OUT)\drivemap.obj \
- $(OUT)\RegistrySupport.obj \
- $(OUT)\getlana.obj
+ $(OUT)\RegistrySupport.obj
VCLIBS =\
iphlpapi.lib \
EXELIBS = \
$(DESTDIR)\lib\afs\afspioctl.lib \
$(DESTDIR)\lib\libosi.lib \
- $(DESTDIR)\lib\afs\TaLocale.lib
+ $(DESTDIR)\lib\afs\TaLocale.lib \
+ $(DESTDIR)\lib\lanahelper.lib
############################################################################
#
if (queue_IsEmpty(&waiter_cache)) {
new = (cond_waiters_t *) malloc(sizeof(cond_waiters_t));
- if (new != NULL) {
-#if 1
- CHAR eventName[MAX_PATH];
- static eventCount = 0;
- sprintf(eventName, "cond_waiters_t %d::%d", _getpid(), eventCount++);
- new->event = CreateEvent((LPSECURITY_ATTRIBUTES) 0, FALSE,
- FALSE, (LPCTSTR) eventName);
-#else
- new->event = CreateEvent((LPSECURITY_ATTRIBUTES) 0, FALSE,
- FALSE, (LPCTSTR) 0);
- if (new->event == NULL) {
- free(new);
- new = NULL;
- }
-#endif
- }
+ if (new != NULL) {
+ new->event = CreateEvent((LPSECURITY_ATTRIBUTES) 0, FALSE,
+ FALSE, (LPCTSTR) 0);
+ if (new->event == NULL) {
+ free(new);
+ new = NULL;
+ }
+ }
} else {
new = queue_First(&waiter_cache, cond_waiter);
queue_Remove(new);
LeaveCriticalSection(&waiter_cache_cs);
return new;
+
}
static void put_waiter(cond_waiters_t *old) {
$(DESTDIR)\lib\afsdes.lib \
$(DESTDIR)\lib\afs\afsutil.lib \
$(DESTDIR)\lib\afs\afsreg.lib \
- $(DESTDIR)\lib\afs\afseventlog.lib
+ $(DESTDIR)\lib\afs\afseventlog.lib \
+ $(DESTDIR)\lib\lanahelper.lib
$(LIBFILE): $(DLLOBJS) $(DLLLIBS) $(RXOBJS)
$(DLLCONLINK) /DEF:afsauthent.def rpcrt4.lib dnsapi.lib
LIBOBJS =\
$(OUT)\pioctl_nt.obj
-$(LIBFILE): $(LIBOBJS)
- $(LIBARCH)
+$(LIBFILE): $(LIBOBJS) $(DESTDIR)\lib\lanahelper.lib
+ $(LIBARCH) $(DESTDIR)\lib\lanahelper.lib
############################################################################
# Install target; primary makefile target
#include <smb.h>
#include <pioctl_nt.h>
-/* Are we using the canonical Netbios name (AFS)? */
-BOOL smb_TruncateNetbios = FALSE; /* what the registry says */
-BOOL smb_TruncateNetbiosReal = FALSE; /* what we actually grant */
+#include <lanahelper.h>
static char AFSConfigKeyName[] =
"SYSTEM\\CurrentControlSet\\Services\\TransarcAFSDaemon\\Parameters";
GetIoctlHandle(char *fileNamep, HANDLE * handlep)
{
char *drivep;
- char hostName[256];
+ char netbiosName[MAX_NB_NAME_LENGTH];
char tbuffer[100];
- char buf[200];
- char explicitNetbiosName[32];
- DWORD isGateway = 0;
- char *ctemp;
HANDLE fh;
- HKEY parmKey;
- DWORD dummyLen;
- long code;
if (fileNamep) {
drivep = strchr(fileNamep, ':');
strcpy(tbuffer, SMB_IOCTL_FILENAME);
} else {
/* No file name specified, use UNC name */
- code = RegOpenKeyEx(HKEY_LOCAL_MACHINE, AFSConfigKeyName, 0,
- KEY_QUERY_VALUE, &parmKey);
- if (code != ERROR_SUCCESS)
- goto nogateway;
-
- dummyLen = sizeof(buf);
- code = RegQueryValueEx(parmKey, "TruncateNetbios", NULL, NULL,
- (BYTE *) buf, &dummyLen);
- if (code == ERROR_SUCCESS)
- {
- if (!stricmp( (const char *) buf, "on"))
- {
- smb_TruncateNetbios = TRUE;
- smb_TruncateNetbiosReal = TRUE;
- }
- }
-
- dummyLen = sizeof(isGateway);
- code = RegQueryValueEx(parmKey, "IsGateway", NULL, NULL,
- (BYTE *) &isGateway, &dummyLen);
-
- /* Is there an explicit name we should use? */
- dummyLen = sizeof(explicitNetbiosName);
- code = RegQueryValueEx(parmKey, "NetbiosName", NULL, NULL,
- (BYTE *) &explicitNetbiosName, &dummyLen);
- if (!code == ERROR_SUCCESS)
- {
- explicitNetbiosName[0] = 0;
- }
-
- /* Look for gateway host in Registry */
- dummyLen = sizeof(hostName);
- code = RegQueryValueEx(parmKey, "Gateway", NULL, NULL, hostName,
- &dummyLen);
- RegCloseKey(parmKey);
- if (code == ERROR_SUCCESS)
- goto havehost;
-
- nogateway:
- /* No gateway name in registry; use ourself */
-#ifndef AFS_WIN95_ENV
- gethostname(hostName, sizeof(hostName));
-#else
- {
- int hostsize;
- /* DJGPP version of gethostname gets the NetBIOS
- * name of the machine, so that is what we are using for
- * the AFS server name instead of the DNS name. */
- hostsize = sizeof(hostName);
- GetComputerName(hostName, &hostsize);
- }
-#endif /* AFS_WIN95_ENV */
-
- havehost:
- ctemp = strchr(hostName, '.'); /* turn ntafs.* into ntafs */
- if (ctemp)
- *ctemp = 0;
- hostName[11] = 0;
-
- if (explicitNetbiosName[0])
- {
- _strupr(explicitNetbiosName);
- sprintf(tbuffer, "\\\\%s\\all%s",
- explicitNetbiosName, SMB_IOCTL_FILENAME);
- }
- else if (smb_TruncateNetbiosReal) {
- sprintf(tbuffer, "\\\\AFS\\all%s", SMB_IOCTL_FILENAME);
- }
- else
- {
- _strupr(hostName);
- sprintf(tbuffer, "\\\\%s-AFS\\all%s",
- hostName, SMB_IOCTL_FILENAME);
- }
+ lana_GetNetbiosName(netbiosName,LANA_NETBIOS_NAME_FULL);
+ sprintf(tbuffer,"\\\\%s\\all%s",netbiosName,SMB_IOCTL_FILENAME);
}
fflush(stdout);