summaryrefslogtreecommitdiffstats
path: root/private/nw/nwscript/lsparse.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--private/nw/nwscript/lsparse.c315
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);
+}
+