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 f224da7..21fd3d7 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 a27894d..a9d54eb 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
 
@@ -218,9 +216,22 @@ $(LOG95_DLLFILE): $(LOG95_DLLOBJS)
        $(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 f8e7c04..b537a30 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 7fd8601..5a8d368 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 4526464..6a44a72 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 c18cee5..08051d7 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 831fd31..a9f9f35 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 91aafd2..a455ae8 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 240cfdd..44573ac 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 5c2d1c9..69b701d 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 1483edb..6453bfd 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 00d034a..4c72ab6 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 565ebd7..2942eb5 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 ea55baf..c9a805a 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 a35a243..499e513 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);