]> git.michaelhowe.org Git - packages/o/openafs.git/commitdiff
lanahelper-library-20040305
authorJeffrey Altman <jaltman@mit.edu>
Fri, 5 Mar 2004 23:09:18 +0000 (23:09 +0000)
committerJeffrey Altman <jaltman@secure-endpoints.com>
Fri, 5 Mar 2004 23:09:18 +0000 (23:09 +0000)
* at my request Asanka Hearth of MIT ripped out all of the code used
  the compute the Netbios Name of the SMB Server and the mountRoot
  and constructed one commonly used library called lanahelper.lib.
  This library is now constructed in the WINNT/afsd directory and
  used throughout the tree.  At least we now have consistency if
  nothing else.

17 files changed:
src/NTMakefile
src/WINNT/afsd/NTMakefile
src/WINNT/afsd/afsd_init.c
src/WINNT/afsd/lanahelper.cpp
src/WINNT/afsd/lanahelper.h
src/WINNT/client_config/NTMakefile
src/WINNT/client_config/dlg_automap.cpp
src/WINNT/client_config/dlg_binding.cpp
src/WINNT/client_config/drivemap.cpp
src/WINNT/client_config/getlana.cpp [deleted file]
src/WINNT/client_config/getlana.h [deleted file]
src/WINNT/client_config/tab_drives.cpp
src/WINNT/client_creds/NTMakefile
src/WINNT/pthread/pthread.c
src/libafsauthent/NTMakefile
src/sys/NTMakefile
src/sys/pioctl_nt.c

index f224da70192c953ef4e5f1c4eff0f0935450d930..21fd3d76eb0a31310d67a6bbb41d41123be8613b 100644 (file)
@@ -195,21 +195,21 @@ cm_headers: libacl_headers
        $(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)\$@
index a27894da03c89ad3a8b95568a20be4fafe3bf9b1..a9d54ebbbc01551f28038c5410fcdcbcd3c6a62b 100644 (file)
@@ -85,7 +85,6 @@ $(RXOBJS): $(RX)\$$(@B).c
 $(IDLFILES):afsrpc.idl
        midl $(MIDL_FLAGS) /no_robust $(AFSDEV_AUXMIDLFLAGS) /app_config $?
 
-
 AFSDOBJS=\
        $(OUT)\afsd_init.obj \
        $(OUT)\cm_cell.obj \
@@ -115,7 +114,6 @@ AFSDOBJS=\
        $(OUT)\afsdcrash.obj \
 !ENDIF
     $(OUT)\cm_freelance.obj \
-    $(OUT)\lanahelper.obj  \
     $(OUT)\afsd_eventlog.obj \
     $(OUT)\afsd_flushvol.obj
 
@@ -217,10 +215,23 @@ $(LOG95_DLLFILE): $(LOG95_DLLOBJS)
        $(COPY) $*.lib $(DESTDIR)\lib
        $(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
 
@@ -308,6 +319,7 @@ AFSD_EXELIBS =\
        $(DESTDIR)\lib\afs\mtafsint.lib \
        $(DESTDIR)\lib\libafsconf.lib \
        $(DESTDIR)\lib\afs\afsreg.lib \
+    $(LANAHELPERLIB) \
        rpcrt4.lib \
        user32.lib \
     Dbghelp.lib
index f8e7c046a5b9a192b2bda9ed3dd7cc1cbd9335d0..b537a30bd442d8fae975273c3d5a2230cb1d6945 100644 (file)
@@ -67,6 +67,8 @@ int logReady = 0;
 char cm_HostName[200];
 long cm_HostAddr;
 
+char cm_NetbiosName[MAX_NB_NAME_LENGTH];
+
 char cm_CachePath[200];
 DWORD cm_CachePathLen;
 
@@ -199,6 +201,7 @@ int afsd_InitCM(char **reasonP)
        long code;
        /*int freelanceEnabled;*/
        WSADATA WSAjunk;
+    lana_number_t lanaNum;
 
        WSAStartup(0x0101, &WSAjunk);
 
@@ -234,19 +237,6 @@ int afsd_InitCM(char **reasonP)
                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);
@@ -374,17 +364,6 @@ int afsd_InitCM(char **reasonP)
                /* 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);
@@ -510,6 +489,25 @@ int afsd_InitCM(char **reasonP)
 
        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;
@@ -706,67 +704,11 @@ int afsd_InitDaemons(char **reasonP)
 
 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;
 }
index 7fd86019343374e1bfac6e7a2d810770f9397a34..5a8d3686a21d74c8a37dec1eab2f40efda1f6872 100644 (file)
@@ -6,16 +6,26 @@
 #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}
@@ -40,13 +50,17 @@ static HRESULT getname_shellfolder(WCHAR *wGuid, WCHAR *wName, int NameSize)
     // 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;
@@ -98,12 +112,15 @@ extern "C" int lana_GetNameFromGuid(char *Guid, char **Name)
         // 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) {
@@ -116,8 +133,10 @@ extern "C" int lana_GetNameFromGuid(char *Guid, char **Name)
     }
     free(wGuid);
     if (FAILED(status)) {
+#ifndef NOLOGGING
         afsi_log("lana_GetNameFromGuid: failed to get connection name (status %ld)",
                 status);
+#endif
         return -1;
     }
 
@@ -127,7 +146,9 @@ extern "C" int lana_GetNameFromGuid(char *Guid, char **Name)
     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
@@ -135,8 +156,11 @@ extern "C" int lana_GetNameFromGuid(char *Guid, char **Name)
     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";
@@ -157,26 +181,34 @@ extern "C" lana_number_t lana_FindLanaByName(const char *LanaName)
     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]);
 
@@ -187,26 +219,54 @@ extern "C" lana_number_t lana_FindLanaByName(const char *LanaName)
     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;
@@ -215,7 +275,7 @@ extern "C" lana_number_t lana_FindLanaByName(const char *LanaName)
         if ((lanamap[i].flags & 1) == 0)
             continue;
 
-               // check for a IPv4 binding
+               // check for an IPv4 binding
                if(!strstr(pBind,"_Tcpip_"))
                        continue;
 
@@ -235,19 +295,34 @@ extern "C" lana_number_t lana_FindLanaByName(const char *LanaName)
         *++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)
@@ -263,14 +338,18 @@ 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];
        }
     }
@@ -279,6 +358,8 @@ extern "C" lana_number_t lana_FindLoopback(void)
 }
 
 // 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;
@@ -300,8 +381,10 @@ extern "C" BOOL lana_IsLoopback(lana_number_t lana)
     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.
@@ -315,8 +398,220 @@ extern "C" BOOL lana_IsLoopback(lana_number_t lana)
     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) &regLana, &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) &regGateway, &dummyLen);
+                       if(rv != ERROR_SUCCESS) regGateway = 0;
+               } else
+                       regGateway = *pIsGateway;
+
+               dummyLen = sizeof(regNoFindLanaByName);
+               rv = RegQueryValueEx(hkConfig, szNoFindLanaByName, NULL, NULL, (LPBYTE) &regNoFindLanaByName, &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) &regNbName, &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;
+}
+
index 45264648ba11cc11e5a8be9a3f87efda205334e8..6a44a7263e009e115b2a798139a9a32eee13c88d 100644 (file)
@@ -1,4 +1,8 @@
+#ifndef __LANAHELPER_H__
+#define __LANAHELPER_H__
+
 #include <windows.h>
+#include <tchar.h>
 
 #ifdef __cplusplus
 extern "C" {
@@ -10,12 +14,41 @@ 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
+
index c18cee513c98789e849e1e19ad8b6dba3fbe5196..08051d79d22f821cf73c9be601be03b60c050ac3 100644 (file)
@@ -38,8 +38,7 @@ EXEOBJS = \
        $(OUT)\isadmin.obj \
        $(OUT)\dlg_automap.obj \
     $(OUT)\dlg_binding.obj \
-    $(OUT)\RegistrySupport.obj \
-    $(OUT)\getlana.obj
+    $(OUT)\RegistrySupport.obj
 
 EXEOBJSc = \
        $(OUT)\cellservdb.obj
@@ -63,7 +62,8 @@ EXELIBS = \
        $(DESTDIR)\lib\afsrpc.lib \
        $(DESTDIR)\lib\afsauthent.lib \
        $(DESTDIR)\lib\libosi.lib \
-       $(DESTDIR)\lib\libafsconf.lib
+       $(DESTDIR)\lib\libafsconf.lib \
+    $(DESTDIR)\lib\lanahelper.lib
 
 ############################################################################
 #
index 831fd31a1fadb7d63a336a9dcb5cf9bafb7c7860..a9f9f35775d808d3642959abe0312c4d6bf82e25 100644 (file)
@@ -15,6 +15,7 @@ extern "C" {
 
 #include "afs_config.h"
 #include <stdio.h>
+#include <lanahelper.h>
 
 /*
  * DEFINITIONS ________________________________________________________________
@@ -33,8 +34,6 @@ enum DDDACTION  { DDD_ADD, DDD_REMOVE };
  * PROTOTYPES _________________________________________________________________
  *
  */
-extern void GetNetbiosName(LPTSTR pszName, int type);
-
 void AutoMap_OnInitDialog (HWND hDlg);
 void AutoMap_OnAdd (HWND hDlg);
 void AutoMap_OnSelect (HWND hDlg);
@@ -455,7 +454,7 @@ void AutoMapEdit_OnInitDialog (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);
@@ -495,7 +494,7 @@ void AutoMapEdit_OnOK (HWND hDlg)
    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) ))
       {
index 91aafd226f02bb76b4f8d44a220603c08de253ef..a455ae81f125ef0ec5ea07d5032c077aea27b594 100644 (file)
@@ -13,8 +13,7 @@ extern "C" {
 }
 #include <stdio.h>
 #include "afs_config.h"
-#include "getlana.h"
-
+#include <lanahelper.h>
 
 /*
  * DEFINITIONS ________________________________________________________________
@@ -106,7 +105,7 @@ BOOL CALLBACK Binding_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
                       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;
@@ -130,7 +129,7 @@ BOOL CALLBACK Binding_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
                   nLanAdapter = GetAdapterNumber(selected);
         
                                  
-                GetAfsName(nLanAdapter, isGateway, name);
+                lana_GetAfsNameString(nLanAdapter, isGateway, name);
                 SetDlgItemText (hDlg, IDC_BINDING_MESSAGE, name);
                 break;
               }
@@ -149,48 +148,46 @@ BOOL CALLBACK Binding_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
 
 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)
index 240cfdd5a39013314c790d14689bb5dac7730d72..44573acdf376bfe9db34bdee45a7358f05eacfda 100644 (file)
@@ -23,15 +23,11 @@ extern "C" {
 #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 ___________________________________________________________________
@@ -161,7 +157,8 @@ static BOOL IsWindowsNT (void)
    return fIsWinNT;
 }
 
-
+/* Check if the OS is Windows 2000 or higher.
+*/
 BOOL IsWindows2000 (void)
 {
    static BOOL fChecked = FALSE;
@@ -194,7 +191,7 @@ BOOL IsWindows2000 (void)
 void GetClientNetbiosName (LPTSTR pszName)
 {
     *pszName = TEXT('\0');
-    GetNetbiosName(pszName, NETBIOS_NAME_FULL);
+    lana_GetNetbiosName(pszName, LANA_NETBIOS_NAME_FULL);
 }
 
 
@@ -711,38 +708,45 @@ void AdjustAfsPath (LPTSTR pszTarget, LPCTSTR pszSource, BOOL fWantAFS, BOOL fWa
       }
 }
 
-
 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())
          {
@@ -757,9 +761,12 @@ BOOL GetDriveSubmount (TCHAR chDrive, LPTSTR pszSubmountNow)
       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('\\'))
@@ -767,12 +774,19 @@ BOOL GetDriveSubmount (TCHAR chDrive, LPTSTR pszSubmountNow)
          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())
       {
@@ -921,7 +935,7 @@ void DoUnMapShare(BOOL drivemap)    //disconnect drivemap
        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)
@@ -964,7 +978,7 @@ BOOL DoMapShareChange()
     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())
@@ -1052,7 +1066,7 @@ BOOL DoMapShare()
 
        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
@@ -1201,38 +1215,3 @@ DWORD DisMountDOSDrive(const char chDrive,BOOL bForce)
     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;
-}
-
diff --git a/src/WINNT/client_config/getlana.cpp b/src/WINNT/client_config/getlana.cpp
deleted file mode 100644 (file)
index 96afbf3..0000000
+++ /dev/null
@@ -1,431 +0,0 @@
-// 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);
-}
-
diff --git a/src/WINNT/client_config/getlana.h b/src/WINNT/client_config/getlana.h
deleted file mode 100644 (file)
index abb2659..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * 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
index 5c2d1c95fa8d3e1c43bc31a06f5e1862f73aab7c..69b701d29f27696b6a527ae6f84cb5b8b2f1aa08 100644 (file)
@@ -15,7 +15,7 @@ extern "C" {
 
 #include "afs_config.h"
 #include "tab_drives.h"
-
+#include <lanahelper.h>
 
 /*
  * PROTOTYPES _________________________________________________________________
@@ -394,8 +394,6 @@ BOOL CALLBACK DriveEdit_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
    return FALSE;
 }
 
-extern void GetNetbiosName(LPTSTR pszName, int type);
-
 void DriveEdit_OnInitDialog (HWND hDlg)
 {
    PDRIVEMAP pMap = (PDRIVEMAP)GetWindowLong (hDlg, DWL_USER);
@@ -435,13 +433,9 @@ void DriveEdit_OnInitDialog (HWND hDlg)
    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)
index 1483edb3d9ae1221d8c517d6507b1d046fd27ac4..6453bfddb6670552df1436bda39ef19eae957b2f 100644 (file)
@@ -50,8 +50,7 @@ AFSAPPLIBOBJS= \
 
 CLIENTOBJS = \
        $(OUT)\drivemap.obj \
-    $(OUT)\RegistrySupport.obj \
-    $(OUT)\getlana.obj
+    $(OUT)\RegistrySupport.obj 
 
 VCLIBS =\
     iphlpapi.lib \
@@ -65,7 +64,8 @@ VCLIBS =\
 EXELIBS = \
        $(DESTDIR)\lib\afs\afspioctl.lib \
        $(DESTDIR)\lib\libosi.lib \
-       $(DESTDIR)\lib\afs\TaLocale.lib
+       $(DESTDIR)\lib\afs\TaLocale.lib \
+    $(DESTDIR)\lib\lanahelper.lib
 
 ############################################################################
 #
index 00d034a209e7a945ee20d8c8b6d5976dd560c443..4c72ab6c17b1391029746a3d3856b59d5dd8a9a2 100644 (file)
@@ -710,22 +710,14 @@ static cond_waiters_t *get_waiter() {
  
     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);
@@ -733,6 +725,7 @@ static cond_waiters_t *get_waiter() {
  
     LeaveCriticalSection(&waiter_cache_cs);
     return new;
 }
  
 static void put_waiter(cond_waiters_t *old) {
index 565ebd7a5889c826949a53709cf2eb3a62414fd2..2942eb53a4c1d676e2c1f7cf67038ec7eee4c965 100644 (file)
@@ -137,7 +137,8 @@ DLLLIBS =\
        $(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
index ea55baf43a072748a2e591da90a02c701b2366cb..c9a805ac45672ae34caa1e5ce1893901c0cdbfc9 100644 (file)
@@ -23,8 +23,8 @@ LIBFILE = $(DESTDIR)\lib\afs\afspioctl.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
index a35a24312400d9367c383e11a9b96c25eda0f757..499e513ed62dafec0f63478ce7db3612f991f52e 100644 (file)
@@ -39,9 +39,7 @@ RCSID
 #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";
@@ -104,16 +102,9 @@ static long
 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, ':');
@@ -125,80 +116,8 @@ GetIoctlHandle(char *fileNamep, HANDLE * handlep)
             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);