diff options
Diffstat (limited to '')
-rw-r--r-- | private/nw/nwscript/lsparse.c | 315 |
1 files changed, 315 insertions, 0 deletions
diff --git a/private/nw/nwscript/lsparse.c b/private/nw/nwscript/lsparse.c new file mode 100644 index 000000000..1b0e67fd1 --- /dev/null +++ b/private/nw/nwscript/lsparse.c @@ -0,0 +1,315 @@ +/* + * LSPARSE.C - NetWare Login Script processing routines for our Win32 + * NetWare 3.x LOGIN clone. + * + * Based on code contained in NWPARSE.C, written by Xiao Ying Ding. + * + * Modified and re-written for Win32 by J. SOUZA, February 1994. + * + * Modified for NT by Terry Treder + * + * Copyright (C)1994 Microsoft Corporation. + * + */ + +#include <common.h> + +/******************************************************************** + + ConverNDSPathToNetWarePathA + +Routine Description: + + Convert a NDS path to a Netware format path + +Arguments: + ndspath - origninal NDS path + objclass - type of NDS object, NULL if unknown + nwpath - Netware format path + +Return Value: + error + + *******************************************************************/ +unsigned int +ConverNDSPathToNetWarePathA(char *ndspath, char *objclass, char *nwpath) +{ + CHAR szDN[MAX_PATH]; + CHAR szObjName[MAX_PATH]; + CHAR cSave; + CHAR className[MAX_PATH]; + + LPSTR lpDelim = NULL; + LPSTR lpFilePath = ""; + LPSTR lpszValue; + LPSTR path; + LPSTR volume; + + DWORD dwRet; + DWORD length; + UINT NWStatus; + char bufAttribute[2048]; + + // optimize for path beginning with drive letter + // This assumes NDS volume and dir map names are at least 2 chars + + if (ndspath[1] == ':') + return 1; + // strip ':' from path before this call + if ( ( lpDelim = strchr(ndspath,':') ) != NULL + || ((lpDelim = strchr(ndspath,'\\')) != NULL)) { + cSave = *lpDelim; + *lpDelim = '\0'; + lpFilePath = lpDelim+1; + } + + if ( objclass == NULL ) { + + NWStatus = NDSCanonicalizeName( ndspath, szObjName, MAX_PATH, TRUE ); + + if ( NWStatus != 0 ) { +#ifdef DEBUG + printf("can't canonicalize [%s] (0x%x)\n", + ndspath, NWStatus ); +#endif + + if (lpDelim) { + *lpDelim = cSave; + } + + return 1; + } + + + NWStatus = NDSGetClassName( szObjName, className ); + + if ( NWStatus != 0 || + strcmp ( className, DSCL_SERVER ) && + strcmp ( className, DSCL_NCP_SERVER ) && + strcmp ( className, DSCL_VOLUME ) && + strcmp ( className, DSCL_QUEUE ) && + strcmp ( className, DSCL_DIRECTORY_MAP )) { + +#ifdef DEBUG + printf("no path DSOBJ: %d (%s) (%s)\n", + NWStatus, szObjName, className ); +#endif + + if (lpDelim) { + *lpDelim = cSave; + } + + return 1; + } + + objclass = className; + } + else + strcpy ( szObjName, ndspath ); + + if (lpDelim) { + *lpDelim = cSave; + } + +#ifdef DEBUG + printf("ConvertNDSPath BEFORE [%s]\n", szObjName); +#endif + + // + // Is f this is the server class object , we only need + // to extract it's common name and put into netware format + // + if ((strcmp(objclass,DSCL_SERVER) == 0 ) || + (strcmp(objclass,DSCL_NCP_SERVER) == 0 )) { + + // Abbreaviate first to remove type qualifiers + *szDN = '\0'; + if (0 != NDSAbbreviateName(FLAGS_LOCAL_CONTEXT,(LPSTR)szObjName,szDN)) { + return 1; + } + + // BUGBUG THis code should be separated as tokenizing function + lpDelim = strchr(szDN,'.'); + if (lpDelim) { + *lpDelim = '\0'; + } + + strcpy(nwpath,szDN); + +#ifdef DEBUG + printf("Returning Netware path:%s\n",nwpath); +#endif + + return 0; + + } /* endif server class */ + + // + // If this is share class object ( volume or queue), we need + // to find it's host server name and host resource name + // + if ((strcmp(objclass,DSCL_VOLUME) == 0 ) || + (strcmp(objclass,DSCL_QUEUE) == 0 ) + ) { + + // + // Read host server name first. It comes back as distinguished + // directory name, so we will need to extract server name from it + // + + NWStatus = NDSGetProperty ( szObjName, + DSAT_HOST_SERVER, + bufAttribute, + sizeof(bufAttribute), + NULL ); + + if (NWStatus != 0) { +#ifdef DEBUG + printf("Get host server failed. err=0x%x\n",NWStatus); +#endif + return 1; + } + + lpszValue = bufAttribute; + ConvertUnicodeToAscii( lpszValue ); + + // + // Now copy server distinguished name into temporary buffer + // and call ourselves to convert it to Netware + // + strcpy(szDN,lpszValue); + + dwRet = ConverNDSPathToNetWarePathA(szDN, DSCL_SERVER, nwpath); + if (dwRet) { +#ifdef DEBUG + printf("Resolving server DN failed\n"); +#endif + //Break(); + return 1; + } + + // + // Get volume name itself + // + NWStatus = NDSGetProperty ( szObjName, + DSAT_HOST_RESOURCE_NAME, + bufAttribute, + sizeof(bufAttribute), + NULL ); + + if (NWStatus != 0) { +#ifdef DEBUG + printf("Get host resource name failed. err=0x%x\n",NWStatus); +#endif + return 1; + } + + lpszValue = bufAttribute; + ConvertUnicodeToAscii( lpszValue ); + + // + // Now we already have server name in the user buffer, + // append share name to it + strcat(nwpath,"/"); + strcat(nwpath,lpszValue); + strcat(nwpath,":"); + strcat(nwpath, lpFilePath ); + +#ifdef DEBUG + printf("Returning Netware path:%s\n",nwpath); +#endif + + return 0; + + } /* endif Volume class */ + + // + // For directory maps we need to find host volume NDS name and + // append relative directory path + // + if (strcmp(objclass,DSCL_DIRECTORY_MAP) == 0 ) { + + // + // First get NDS name for host volume object + // + + NWStatus = NDSGetProperty ( szObjName, + DSAT_PATH, + bufAttribute, + sizeof(bufAttribute), + NULL ); + + if (NWStatus != 0) { +#ifdef DEBUG + printf("Get path %s failed. err=0x%x\n", szObjName, NWStatus); +#endif + return 1; + } + + volume = bufAttribute; + volume += sizeof(DWORD); + volume += sizeof(DWORD); + ConvertUnicodeToAscii( volume ); + + // Path is next + + path = bufAttribute; + path += sizeof(DWORD); + length = ROUNDUP4(*(DWORD *)path); + path += sizeof(DWORD); + path += length; + + // + // Check for 0 length paths + // + if ( *(DWORD *)path == 0 ) { + path = ""; + } + else { + path += sizeof(DWORD); + ConvertUnicodeToAscii( path ); + } + +#ifdef DEBUG + printf("path is %s\n",path); +#endif + + // + // Now copy volume distinguished name into temporary buffer + // and call ourselves to convert it to NetWare + // + strcpy(szDN,volume); + + dwRet = ConverNDSPathToNetWarePathA(szDN, DSCL_VOLUME, nwpath); + if (dwRet) { +#ifdef DEBUG + printf("Resolving volume DN failed\n"); +#endif + //Break(); + return 1; + } + + // + // Now we already have NetWare server\volume name in the user buffer, + // append directory path to it + //strcat(nwpath,"\\"); + // we want only one '\' + if (path[0] == '\\' || path[0] == '/') path++; + strcat(nwpath,path); + // append non-NDS part of path, if any + if (*lpFilePath) { + strcat(nwpath,"/"); + strcat(nwpath, lpFilePath ); + } + +#ifdef DEBUG + printf("Returning NetWare path:%s\n",nwpath); +#endif + + return 0; + + } /* endif DirectoryMap class */ + + return(1); +} + |