示例#1
0
NWDSCCODE nds_login(
		NWDSContextHandle ctx,
		const NWDSChar* objectName,
		const char *objectPassword) {
	NWCONN_HANDLE	conn;
	NWObjectID	objectID;
	NWObjectID	pseudoID;
	nuint8		rndseed[4];
	nuint8*		serverPublicKey;
	NWDSCCODE	err;
	size_t		pwdLen;
	nuint8		pwdHash[16];
	nuint8*		privKey;
	size_t		privKeyLen;
	nuint8		logindata[8];
	NWDSCCODE	grace_err;
	wchar_t		unaliasedName[MAX_DN_CHARS + 1];
	NWDSContextHandle wctx;

	err = __NWDSGenerateObjectKeyPairStep1(ctx, objectName,
			&conn, &objectID, &pseudoID, rndseed,
			&serverPublicKey);
	if (err)
		return err;
	err = NWDSDuplicateContextHandleInt(ctx, &wctx);
	if (err) {
		__NWDSGenerateObjectKeyPairStep3(conn, serverPublicKey);
		return err;
	}
	err = NWDSMapIDToName(wctx, conn, objectID, (NWDSChar*)unaliasedName);
	if (err) {
		NWDSFreeContext(wctx);
		__NWDSGenerateObjectKeyPairStep3(conn, serverPublicKey);
		return err;
	}
	/* compute key... */
	pwdLen = strlen(objectPassword);
	/* BEWARE! other NWDS*Password functions do NOT uppercase password */
	__NWDSHashPasswordUpper(objectPassword, pseudoID, pwdLen, pwdHash);
	grace_err = __NWDSGetPrivateKey(conn, serverPublicKey,
	    rndseed, objectID, pwdHash, logindata, &privKey, &privKeyLen);
	__NWDSGenerateObjectKeyPairStep3(conn, serverPublicKey);
	if (!grace_err || grace_err == NWE_PASSWORD_EXPIRED) {
		err = NWDSSetKeys(wctx, logindata, unaliasedName, privKey, privKeyLen);
		memset(privKey, 0, privKeyLen);
		free(privKey);
		if (err)
			goto err_exit;
	}
	err = grace_err;
err_exit:
	NWDSFreeContext(wctx);
	memset(logindata, 0, sizeof(logindata));
	return err; 
}
示例#2
0
static NWDSCCODE __NWDSGenerateObjectKeyPairStep1(
		NWDSContextHandle	ctx, 
		const NWDSChar*		objectName,
		NWCONN_HANDLE*		conn,
		NWObjectID*		objectID,
		NWObjectID*		oldPseudoID,
		nuint8			rndseed[4],
		nuint8**		connPublicKey
) {
	NWDSCCODE err;
	NWDSContextHandle unictx;
	NWCONN_HANDLE lconn;

	*connPublicKey = NULL;

	err = NWDSResolveName2DR(ctx, objectName, DS_RESOLVE_DEREF_ALIASES | DS_RESOLVE_WRITEABLE,
		&lconn, objectID);
	if (err)
		return err;
	err = __NWDSBeginLoginV0(lconn, *objectID, oldPseudoID, rndseed);
	if (err)
		goto err_free_conn;
	err = NWDSDuplicateContextHandle(ctx, &unictx);
	if (err)
		goto err_free_conn;
	unictx->dck.flags = DCV_TYPELESS_NAMES | DCV_XLATE_STRINGS;
	err = NWDSSetContext(unictx, DCK_LOCAL_CHARSET, "WCHAR_T//");
	if (err)
		goto err_free_ctx_conn;
	err = __NWDSGetPublicKeyFromConnection(unictx, lconn, connPublicKey);
	NWDSFreeContext(unictx);
	if (err)
		goto err_free_conn;
	*conn = lconn;
	return 0;
err_free_ctx_conn:;
	NWDSFreeContext(unictx);
err_free_conn:;
	NWCCCloseConn(*conn);
	return err;
}
示例#3
0
void Cleanup (void)
{
        NWDSCCODE res;

	// set the auto screen destroy mode based on the command line arguments
        SetAutoScreenDestructionMode (AutoDestroyScreen);

	// if we logged in, we should logout
	if (DoLogin == 1)
        
                if ((res = NWDSLogout (NDSContext)) != 0)
                        printf ("NWDSLogout returned: %d\n", res);

	// free the context handle
	if ((res = NWDSFreeContext (NDSContext)) != 0)
                printf ("NWDSFreeContext returned: %d\n", res);

	// decrement the thread counter
	ThreadCount--;
}
int main(int argc, char *argv[]) {
	NWDSCCODE dserr;
	NWDSContextHandle ctx;
	NWCONN_HANDLE conn;
	const char* objectname = "[Root]";
	const char* context = "OrgUnit.Org.Country";
	const char* server = "CDROM";
	const char* pwd = "TEST";
	int opt;
	int raw = 0;
	int ret = 2;
	u_int32_t ctxflag = 0;
	u_int32_t confidence = 0;

#ifndef N_PLAT_MSW4
	setlocale(LC_ALL, "");
	bindtextdomain(NCPFS_PACKAGE, LOCALEDIR);
	textdomain(NCPFS_PACKAGE);
#endif

	progname = argv[0];

	NWCallsInit(NULL, NULL);
#ifndef N_PLAT_MSW4
	NWDSInitRequester();
#endif

	dserr = NWDSCreateContextHandle(&ctx);
	if (dserr) {
		fprintf(stderr, "NWDSCretateContextHandle failed with %s\n", strnwerror(dserr));
		return 123;
	}
	while ((opt = getopt(argc, argv, "h?o:c:v:S:C:P:r")) != EOF)
	{
		switch (opt)
		{
		case 'C':
			confidence = strtoul(optarg, NULL, 0);
			break;
		case 'o':
			objectname = optarg;
			break;
		case 'c':
			context = optarg;
			break;
		case 'P':
			pwd = optarg;
			break;
		case 'v':
			ctxflag = strtoul(optarg, NULL, 0);
			break;
		case 'h':
		case '?':
			help();
			goto finished;
		case 'S':
			server = optarg;
			break;
		case 'r':
			raw = 1;
			break;
		default:
			usage();
			goto finished;
		}
	}

	if (!raw) {
		char* p;
		char c;

		for (p = pwd; (c = *p) != 0; p++) {
			if (islower(c))
				*p = toupper(c);
		}
	}

	ctxflag |= DCV_XLATE_STRINGS;
	
	dserr = NWDSSetContext(ctx, DCK_FLAGS, &ctxflag);
	if (dserr) {
		fprintf(stderr, "NWDSSetContext(DCK_FLAGS) failed: %s\n",
			strnwerror(dserr));
		return 123;
	}
	dserr = NWDSSetContext(ctx, DCK_NAME_CONTEXT, context);
	if (dserr) {
		fprintf(stderr, "NWDSSetContext(DCK_NAME_CONTEXT) failed: %s\n",
			strnwerror(dserr));
		return 122;
	}
	dserr = NWDSSetContext(ctx, DCK_CONFIDENCE, &confidence);
	if (dserr) {
		fprintf(stderr, "NWDSSetContext(DCK_CONFIDENCE) failed: %s\n",
			strnwerror(dserr));
		return 122;
	}
#ifndef N_PLAT_MSW4
	{
		static const u_int32_t add[] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
		dserr = NWDSSetTransport(ctx, 16, add);
		if (dserr) {
			fprintf(stderr, "NWDSSetTransport failed: %s\n",
				strnwerror(dserr));
			return 124;
		}
	}
#endif
#ifdef N_PLAT_MSW4
	dserr = NWDSOpenConnToNDSServer(ctx, server, &conn);
#else
	if (server[0] == '/') {
		dserr = ncp_open_mount(server, &conn);
		if (dserr) {
			fprintf(stderr, "ncp_open_mount failed with %s\n",
				strnwerror(dserr));
			return 111;
		}
	} else {
		struct ncp_conn_spec connsp;
		long err;
		
		memset(&connsp, 0, sizeof(connsp));
		strcpy(connsp.server, server);
		conn = ncp_open(&connsp, &err);
		if (!conn) {
			fprintf(stderr, "ncp_open failed with %s\n",
				strnwerror(err));
			return 111;
		}
	}
	dserr = NWDSAddConnection(ctx, conn);
#endif
	if (dserr) {
		fprintf(stderr, "Cannot bind connection to context: %s\n",
			strnwerror(dserr));
	}
	dserr = NWDSVerifyObjectPassword(ctx, NDS_PASSWORD, objectname, pwd);
	if (dserr) {
		fprintf(stderr, "Verify password failed: %s\n",
			strnwerror(dserr));
		ret = 1;
	} else {
		ret = 0;
	}
	NWCCCloseConn(conn);
	dserr = NWDSFreeContext(ctx);
	if (dserr) {
		fprintf(stderr, "NWDSFreeContext failed with %s\n", strnwerror(dserr));
		return 121;
	}
finished:
	return ret;
}
int main(int argc, char *argv[]) {
	NWDSCCODE dserr;
	NWDSContextHandle ctx;
	NWCONN_HANDLE conn;

	const char* context = "[Root]";
        const char * server=NULL;
        const char *  scanFilter="*";

        int allTrees=1;

	int opt;
	u_int32_t ctxflag = 0;
	u_int32_t confidence = 0;


         long err;

#ifndef N_PLAT_MSW4
	setlocale(LC_ALL, "");
	bindtextdomain(NCPFS_PACKAGE, LOCALEDIR);
	textdomain(NCPFS_PACKAGE);
#endif

	progname = argv[0];

	NWCallsInit(NULL, NULL);
#ifndef N_PLAT_MSW4
	NWDSInitRequester();
#endif

	dserr = NWDSCreateContextHandle(&ctx);
	if (dserr) {
		fprintf(stderr, "NWDSCreateContextHandle failed with %s\n", strnwerror(dserr));
		return 123;
	}
	while ((opt = getopt(argc, argv, "h?c:v:S:C:F:f:a")) != EOF)
	{
		switch (opt)
		{
		case 'C':
			confidence = strtoul(optarg, NULL, 0);
			break;
		case 'c':
			context = optarg;
			break;
         	case 'a':
		        allTrees=0;
			break;

		case 'v':
			ctxflag = strtoul(optarg, NULL, 0);
			break;
		case 'h':
		case '?':
			help();
			goto finished;
		case 'S':
			server = optarg;
			break;
                case 'F':
                case 'f':
                 scanFilter =optarg; break;
        	default:
		  usage();
		  goto finished;
		}
	}


	ctxflag |= DCV_XLATE_STRINGS;

	dserr = NWDSSetContext(ctx, DCK_FLAGS, &ctxflag);
	if (dserr) {
		fprintf(stderr, "NWDSSetContext(DCK_FLAGS) failed: %s\n",
			strnwerror(dserr));
		return 123;
	}
	dserr = NWDSSetContext(ctx, DCK_NAME_CONTEXT, context);
	if (dserr) {
		fprintf(stderr, "NWDSSetContext(DCK_NAME_CONTEXT) failed: %s\n",
			strnwerror(dserr));
                err = 122;
		goto closing_ctx;
	}
	dserr = NWDSSetContext(ctx, DCK_CONFIDENCE, &confidence);
	if (dserr) {
		fprintf(stderr, "NWDSSetContext(DCK_CONFIDENCE) failed: %s\n",
			strnwerror(dserr));
                err=121;
		goto closing_ctx;
	}
#ifndef N_PLAT_MSW4
	{
		static const u_int32_t add[] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
		dserr = NWDSSetTransport(ctx, 16, add);
		if (dserr) {
			fprintf(stderr, "NWDSSetTransport failed: %s\n",
				strnwerror(dserr));
			err= 124;
                        goto closing_ctx;
		}
	}
#endif

#ifdef N_PLAT_MSW4
	dserr = NWDSOpenConnToNDSServer(ctx, server, &conn);
#else
         {
               conn=ncp_initialize(&argc,argv,0,&err); /* no login required*/
               if (!conn) {
		 fprintf(stderr, "ncp_initialize failed with %s\n",strnwerror(err));
		err= 111;
                goto closing_ctx;
                }
        }
	dserr = NWDSAddConnection(ctx, conn);

#endif

	if (dserr) {
		fprintf(stderr, "failed: Cannot bind connection to context: %s\n",
			strnwerror(dserr));
                err=dserr;
                goto closing_all;

        }

// testing code goes here
        {
#define NB 64

        nuint32 i,cnt,totTrees;
        char* table[NB];
        char * nextBlock;
        for (i=0;i<NB;i++) {
	  table[i]=(char *)malloc (MAX_TREE_NAME_CHARS);
          if (!table[i]) {
                fprintf(stderr, "failed: out of memory\n");

          }
        }

        if (allTrees) {
                /* request a count only*/
                err=NWDSReturnBlockOfAvailableTrees (ctx,conn,scanFilter,NULL,NULL,0,NULL,NULL,&totTrees);
                if (err) {
	                fprintf(stderr, "NWDSReturnBlockOfAvailableTres failed: %s\n",strnwerror(err));
                        goto closing_all;
                }

                nextBlock=NULL;
                do {
                        if (totTrees >NB)
                                totTrees=NB;
                        err=NWDSReturnBlockOfAvailableTrees (ctx,conn,scanFilter,nextBlock,NULL,totTrees,table,&cnt,&totTrees);
                        if (err) {
	                        fprintf(stderr, "NWDSReturnBlockOfAvailableTrees failed: %s\n",strnwerror(err));
                                goto closing_all;
                        }

                        for (i=0; i<cnt;i++) {
                                printf( "%s\n",table[i]);
                         }
                        nextBlock=table[cnt-1];
                } while (cnt);
       }else {
                err=NWDSScanConnsForTrees (ctx,NB,&totTrees,table);
                if (err) {
	                fprintf(stderr, "NWDSScanConnsForTreesfailed: %s\n",strnwerror(err));
                        goto closing_all;
                }
                for (i=0; i<totTrees;i++) {
                                printf( "%s\n",table[i]);
                }


       }
/* end of test block*/
}

err=0;

closing_all:
	NWCCCloseConn(conn);
closing_ctx:
	dserr = NWDSFreeContext(ctx);
	if (dserr) {
		fprintf(stderr, "NWDSFreeContext failed with %s\n", strnwerror(dserr));
		return 121;
	}
finished:
	return err;
}
int main(int argc, char *argv[]) {
	NWDSCCODE dserr;
	NWDSContextHandle ctx;
	NWCONN_HANDLE conn;
	const char* context = "[Root]";
	const char* server = "CDROM.VC.CVUT.CZ";
	int opt;
	u_int32_t ctxflag = 0;
	u_int32_t confidence = 0;

#ifdef N_PLAT_LINUX
	setlocale(LC_ALL, "");
	bindtextdomain(NCPFS_PACKAGE, LOCALEDIR);
	textdomain(NCPFS_PACKAGE);
#endif

	progname = argv[0];

	NWCallsInit(NULL, NULL);

	dserr = NWDSCreateContextHandle(&ctx);
	if (dserr) {
		fprintf(stderr, "NWDSCretateContextHandle failed with %s\n", strnwerror(dserr));
		return 123;
	}
	while ((opt = getopt(argc, argv, "h?o:c:v:S:C:t:")) != EOF)
	{
		switch (opt)
		{
		case 'C':
			confidence = strtoul(optarg, NULL, 0);
			break;
		case 'c':
			context = optarg;
			break;
		case 'v':
			ctxflag = strtoul(optarg, NULL, 0);
			break;
		case 'h':
		case '?':
			help();
			goto finished;
		case 'S':
			server = optarg;
			break;
		default:
			usage();
			goto finished;
		}
	}

	ctxflag |= DCV_XLATE_STRINGS;
	
	dserr = NWDSSetContext(ctx, DCK_FLAGS, &ctxflag);
	if (dserr) {
		fprintf(stderr, "NWDSSetContext(DCK_FLAGS) failed: %s\n",
			strnwerror(dserr));
		return 123;
	}
	dserr = NWDSSetContext(ctx, DCK_NAME_CONTEXT, context);
	if (dserr) {
		fprintf(stderr, "NWDSSetContext(DCK_NAME_CONTEXT) failed: %s\n",
			strnwerror(dserr));
		return 122;
	}
	dserr = NWDSSetContext(ctx, DCK_CONFIDENCE, &confidence);
	if (dserr) {
		fprintf(stderr, "NWDSSetContext(DCK_CONFIDENCE) failed: %s\n",
			strnwerror(dserr));
		return 122;
	}
#ifdef N_PLAT_LINUX
	{
		static const u_int32_t add[] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
		dserr = NWDSSetTransport(ctx, 16, add);
		if (dserr) {
			fprintf(stderr, "NWDSSetTransport failed: %s\n",
				strnwerror(dserr));
			return 124;
		}
	}
	if (server[0] == '/') {
		dserr = ncp_open_mount(server, &conn);
		if (dserr) {
			fprintf(stderr, "ncp_open_mount failed with %s\n",
				strnwerror(dserr));
			return 111;
		}
	} else {
		struct ncp_conn_spec connsp;
		long err;
		
		memset(&connsp, 0, sizeof(connsp));
		strcpy(connsp.server, server);
		conn = ncp_open(&connsp, &err);
		if (!conn) {
			fprintf(stderr, "ncp_open failed with %s\n",
				strnwerror(err));
			return 111;
		}
	}
	dserr = NWDSAddConnection(ctx, conn);
#else	
	dserr = NWDSOpenConnToNDSServer(ctx, server, &conn);
#endif
	if (dserr) {
		fprintf(stderr, "Cannot bind connection to context: %s\n",
			strnwerror(dserr));
	}
	DemoGetTime(conn);
	printf("Waiting 500 ms\n"); 
#ifdef N_PLAT_LINUX
	usleep(500000);
#else
	Sleep(500);
#endif
	DemoGetTime(conn);
	DemoGetVersion(conn);
	DemoGetGarbage(conn);
	NWCCCloseConn(conn);
	dserr = NWDSFreeContext(ctx);
	if (dserr) {
		fprintf(stderr, "NWDSFreeContext failed with %s\n", strnwerror(dserr));
		return 121;
	}
finished:
	return 0;
}
int main(int argc, char *argv[]) {
	NWDSCCODE dserr;
	NWDSContextHandle ctx;
	NWCONN_HANDLE conn;
	const char* objectname = "[Root]";
	const char* context = "OrgUnit.Org.Country";
	const char* server = "CDROM";
	int opt;
	u_int32_t ctxflag = 0;
	u_int32_t confidence = 0;
	u_int32_t req = 0;
	int req_present = 0;
	nuint32 ih = NO_MORE_ITERATIONS;
	Buf_T* buf;
	size_t size = DEFAULT_MESSAGE_LEN;

#ifndef N_PLAT_MSW4
	setlocale(LC_ALL, "");
	bindtextdomain(NCPFS_PACKAGE, LOCALEDIR);
	textdomain(NCPFS_PACKAGE);
#endif

	progname = argv[0];

	NWCallsInit(NULL, NULL);
#ifndef N_PLAT_MSW4
	NWDSInitRequester();
#endif

	dserr = NWDSCreateContextHandle(&ctx);
	if (dserr) {
		fprintf(stderr, "NWDSCretateContextHandle failed with %s\n", strnwerror(dserr));
		return 123;
	}
	while ((opt = getopt(argc, argv, "h?o:c:v:S:C:q:s:")) != EOF)
	{
		switch (opt)
		{
		case 'C':
			confidence = strtoul(optarg, NULL, 0);
			break;
		case 'o':
			objectname = optarg;
			break;
		case 'c':
			context = optarg;
			break;
		case 'v':
			ctxflag = strtoul(optarg, NULL, 0);
			break;
		case 'q':
			req = strtoul(optarg, NULL, 0);
			req_present = 1;
			break;
		case 's':
			size = strtoul(optarg, NULL, 0);
			break;
		case 'h':
		case '?':
			help();
			goto finished;
		case 'S':
			server = optarg;
			break;
		default:
			usage();
			goto finished;
		}
	}

	ctxflag |= DCV_XLATE_STRINGS;
	
	dserr = NWDSSetContext(ctx, DCK_FLAGS, &ctxflag);
	if (dserr) {
		fprintf(stderr, "NWDSSetContext(DCK_FLAGS) failed: %s\n",
			strnwerror(dserr));
		return 123;
	}
	dserr = NWDSSetContext(ctx, DCK_NAME_CONTEXT, context);
	if (dserr) {
		fprintf(stderr, "NWDSSetContext(DCK_NAME_CONTEXT) failed: %s\n",
			strnwerror(dserr));
		return 122;
	}
	dserr = NWDSSetContext(ctx, DCK_CONFIDENCE, &confidence);
	if (dserr) {
		fprintf(stderr, "NWDSSetContext(DCK_CONFIDENCE) failed: %s\n",
			strnwerror(dserr));
		return 122;
	}
#ifndef N_PLAT_MSW4
	{
		static const u_int32_t add[] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
		dserr = NWDSSetTransport(ctx, 16, add);
		if (dserr) {
			fprintf(stderr, "NWDSSetTransport failed: %s\n",
				strnwerror(dserr));
			return 124;
		}
	}
#endif
#ifdef N_PLAT_MSW4
	dserr = NWDSOpenConnToNDSServer(ctx, server, &conn);
#else
	if (server[0] == '/') {
		dserr = ncp_open_mount(server, &conn);
		if (dserr) {
			fprintf(stderr, "ncp_open_mount failed with %s\n",
				strnwerror(dserr));
			return 111;
		}
	} else {
		struct ncp_conn_spec connsp;
		long err;
		
		memset(&connsp, 0, sizeof(connsp));
		strcpy(connsp.server, server);
		conn = ncp_open(&connsp, &err);
		if (!conn) {
			fprintf(stderr, "ncp_open failed with %s\n",
				strnwerror(err));
			return 111;
		}
	}
	dserr = NWDSAddConnection(ctx, conn);
#endif
	if (dserr) {
		fprintf(stderr, "Cannot bind connection to context: %s\n",
			strnwerror(dserr));
	}
	dserr = NWDSAllocBuf(size, &buf);
	if (dserr) {
		fprintf(stderr, "Cannot create reply buffer: %s\n",
			strnwerror(dserr));
	}
	do {
		if (req_present)
			dserr = NWDSListPartitionsExtInfo(ctx, &ih, objectname, req, buf);
		else
			dserr = NWDSListPartitions(ctx, &ih, objectname, buf);
		if (dserr) {
			fprintf(stderr, "ListPartitions failed with %s\n", 
				strnwerror(dserr));
		} else {
			unsigned char* pp;
			NWObjectCount cnt;
			char sn[MAX_DN_CHARS + 1];
			size_t pcnt;

			printf("Iteration handle: %08X\n", ih);
		
			dserr = NWDSGetServerName(ctx, buf, sn, &cnt);
			if (dserr) {
				fprintf(stderr, "GetServerName failed with %s\n",
					strnwerror(dserr));
			} else {
				pcnt = 0;
				printf("Server %s holds %u partitions\n",
					sn, cnt);
				while (!dserr && cnt--) {
					printf("Partition #%u\n", pcnt++);
					if (req_present) {
						char* start;
						char* end;
						
						dserr = NWDSGetPartitionExtInfoPtr(
								ctx, buf, &start, &end);
						if (dserr) {
							fprintf(stderr, "  NWDSGetPartitionExtInfoPtr failed with %s\n",
								strnwerror(dserr));
						} else {
							nuint32 pt;
							union {
							nuint32     x32;
							TimeStamp_T ts;
							NWObjectID  id;
							char        name[MAX_DN_CHARS + 1];
							} info;
							nuint32 bit;
							size_t len;
							
							printf("  Partition info length:  %10u\n", end - start);
							if (req & DSP_OUTPUT_FIELDS) {
								dserr = NWDSGetPartitionExtInfo(ctx, start, end, DSP_OUTPUT_FIELDS, &len, &pt);
								if (dserr) {
									fprintf(stderr, "  NWDSGetPartitionExtInfo(DSP_OUTPUT_FIELDS) failed with %s\n",
										strnwerror(dserr));
									pt = req;
								} else {
									printf("  Output fields:            %08X (%u bytes)\n", pt, len);
								}
							} else {
								pt = req;
							}
							for (bit = DSP_PARTITION_ID; bit; bit <<= 1) {
								if (pt & bit) {
									dserr = NWDSGetPartitionExtInfo(ctx, start, end, bit, &len, &info);
									if (dserr)
										fprintf(stderr, "  NWDSGetPartitionExtInfo(0x%08X) failed with %s\n",
											bit, strnwerror(dserr));
									else {
										switch (bit) {
											case DSP_PARTITION_ID:
												printf("  Partition ID:             %08X (%u bytes)\n", info.id, len);
												break;
											case DSP_REPLICA_STATE:
												printf("  Replica state:          %10u (%u bytes)\n", info.x32, len);
												break;
											case DSP_MODIFICATION_TIMESTAMP:
												printf("  Modification timestamp: %10u.%u.%u (%u bytes)\n",
													info.ts.wholeSeconds, info.ts.replicaNum,
													info.ts.eventID, len);
												break;
											case DSP_PURGE_TIME:
												printf("  Purge time:             %10u (%u bytes)\n", 
													info.x32, len);
												break;
											case DSP_LOCAL_PARTITION_ID:
												printf("  Local partition ID:     %10u (%u bytes)\n",
													info.x32, len);
												break;
											case DSP_PARTITION_DN:
												printf("  Partition DN:           %s (%u bytes)\n",
													info.name, len);
												break;
											case DSP_REPLICA_TYPE:
												printf("  Replica type:           %10u (%u bytes)\n",
													info.x32, len);
												break;
											case DSP_PARTITION_BUSY:
												printf("  Partition busy:         %10u (%u bytes)\n",
													info.x32, len);
												break;
											default:
												printf("  Unknown %08X:       %10u (%u bytes)\n",
													bit, info.x32, len);
												break;
										}
									}
								}
							}
						}
					} else {
						nuint32 pt;
						
						dserr = NWDSGetPartitionInfo(ctx, buf, sn, &pt);
						if (dserr) {
							fprintf(stderr, "  NWDSGetPartitionInfo failed with %s\n",
								strnwerror(dserr));
						} else {
							printf("  Partition DN: %s\n", sn);
							printf("  Replica type: %u\n", pt);
						}
					}
#if 0
					Object_Info_T tt;
					char name[8192];
					size_t attrs;
					
					dserr = NWDSGetObjectName(ctx, buf, name, &attrs, &tt);
					if (dserr) {
						fprintf(stderr, "GetObjectName failed with %s\n",
							strnwerror(dserr));
						break;
					}
					printf("Name: %s\n", name);
					printf("  Attrs: %u\n", attrs);
					printf("  Flags: %08X\n", tt.objectFlags);
					printf("  Subordinate Count: %u\n", tt.subordinateCount);
					printf("  Modification Time: %lu\n", tt.modificationTime);
					printf("  Base Class: %s\n", tt.baseClass);
#endif
				}
			}
#ifndef N_PLAT_MSW4
			pp = buf->curPos;	
			for (; pp < buf->dataend; pp++) {
				printf("%02X ", *pp);
			}
			printf("\n");
#endif
		}
	} while ((dserr == 0) && (ih != NO_MORE_ITERATIONS));
	NWCCCloseConn(conn);
	dserr = NWDSFreeContext(ctx);
	if (dserr) {
		fprintf(stderr, "NWDSFreeContext failed with %s\n", strnwerror(dserr));
		return 121;
	}
finished:
	return 0;
}
int main(int argc, char *argv[]) {
	NWDSCCODE dserr;
	NWDSContextHandle ctx;
	NWCONN_HANDLE conn;
	const char* objectname = "[Root]";
	const char* context = "OrgUnit.Org.Country";
	const char* server = "CDROM";
	int opt;
	u_int32_t ctxflag = 0;
	u_int32_t confidence = 0;
	Buf_T* buf;
	size_t size = DEFAULT_MESSAGE_LEN;

#ifndef N_PLAT_MSW4
	setlocale(LC_ALL, "");
	bindtextdomain(NCPFS_PACKAGE, LOCALEDIR);
	textdomain(NCPFS_PACKAGE);
#endif

	progname = argv[0];

	NWCallsInit(NULL, NULL);
#ifndef N_PLAT_MSW4
	NWDSInitRequester();
#endif

	dserr = NWDSCreateContextHandle(&ctx);
	if (dserr) {
		fprintf(stderr, "NWDSCretateContextHandle failed with %s\n", strnwerror(dserr));
		return 123;
	}
	dserr = NWDSAllocBuf(size, &buf);
	if (dserr) {
		fprintf(stderr, "Cannot create request buffer: %s\n",
			strnwerror(dserr));
	}
	dserr = NWDSInitBuf(ctx, DSV_MODIFY_CLASS_DEF, buf);
	if (dserr) {
		fprintf(stderr, "Cannot init buffer: %s\n",
			strnwerror(dserr));
	}
	while ((opt = getopt(argc, argv, "h?o:c:v:S:C:s:A:")) != EOF)
	{
		switch (opt)
		{
		case 'C':
			confidence = strtoul(optarg, NULL, 0);
			break;
		case 'o':
			objectname = optarg;
			break;
		case 'c':
			context = optarg;
			break;
		case 'v':
			ctxflag = strtoul(optarg, NULL, 0);
			break;
		case 's':
			size = strtoul(optarg, NULL, 0);
			break;
		case 'A':
			dserr = NWDSPutClassItem(ctx, buf, optarg);
			if (dserr) {
				fprintf(stderr, "Cannot NWDSPutClassItem `%s': %s\n",
					optarg, strnwerror(dserr));
			}
			break;
		case 'h':
		case '?':
			help();
			goto finished;
		case 'S':
			server = optarg;
			break;
		default:
			usage();
			goto finished;
		}
	}

	ctxflag |= DCV_XLATE_STRINGS;
	
	dserr = NWDSSetContext(ctx, DCK_FLAGS, &ctxflag);
	if (dserr) {
		fprintf(stderr, "NWDSSetContext(DCK_FLAGS) failed: %s\n",
			strnwerror(dserr));
		return 123;
	}
	dserr = NWDSSetContext(ctx, DCK_NAME_CONTEXT, context);
	if (dserr) {
		fprintf(stderr, "NWDSSetContext(DCK_NAME_CONTEXT) failed: %s\n",
			strnwerror(dserr));
		return 122;
	}
	dserr = NWDSSetContext(ctx, DCK_CONFIDENCE, &confidence);
	if (dserr) {
		fprintf(stderr, "NWDSSetContext(DCK_CONFIDENCE) failed: %s\n",
			strnwerror(dserr));
		return 122;
	}
#ifndef N_PLAT_MSW4
	{
		static const u_int32_t add[] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
		dserr = NWDSSetTransport(ctx, 16, add);
		if (dserr) {
			fprintf(stderr, "NWDSSetTransport failed: %s\n",
				strnwerror(dserr));
			return 124;
		}
	}
#endif
#ifdef N_PLAT_MSW4
	dserr = NWDSOpenConnToNDSServer(ctx, server, &conn);
#else
	if (server[0] == '/') {
		dserr = ncp_open_mount(server, &conn);
		if (dserr) {
			fprintf(stderr, "ncp_open_mount failed with %s\n",
				strnwerror(dserr));
			return 111;
		}
	} else {
		struct ncp_conn_spec connsp;
		long err;
		
		memset(&connsp, 0, sizeof(connsp));
		strcpy(connsp.server, server);
		conn = ncp_open(&connsp, &err);
		if (!conn) {
			fprintf(stderr, "ncp_open failed with %s\n",
				strnwerror(err));
			return 111;
		}
	}
	dserr = NWDSAddConnection(ctx, conn);
#endif
	if (dserr) {
		fprintf(stderr, "Cannot bind connection to context: %s\n",
			strnwerror(dserr));
	}
	dserr = NWDSModifyClassDef(ctx, objectname, buf);
	if (dserr) {
		fprintf(stderr, "ModifyClassDef failed with %s\n", 
			strnwerror(dserr));
	} else {
		printf("ModifyClassDef suceeded\n");
	}
	NWCCCloseConn(conn);
	dserr = NWDSFreeContext(ctx);
	if (dserr) {
		fprintf(stderr, "NWDSFreeContext failed with %s\n", strnwerror(dserr));
		return 121;
	}
finished:
	return 0;
}
/*************************************************************************
** main
*/
int main (int argc, char** argv) {
	NWDSContextHandle	context;
	NWDSCCODE ccode;
	nint32	iterationHandle;
	nint32	countObjectsSearched;
	nuint32	objCntr,attrCntr,valCntr;
	nuint32	objCount;			
	nuint32	attrCount;			
	char 	admin[MAX_DN_CHARS+1];
	char	password[MAX_VALUE_LEN+1];
	char	objectName[MAX_DN_CHARS+1];
	char	attrName[MAX_SCHEMA_NAME_CHARS+1];
	nuint32	attrValCount;
	nuint32	syntaxID;
	nuint32	attrValSize;
	char*	attrVal;
	nint32	screenCntr=0;
	nuint32 contextFlags;
	
	// buffers
	pBuf_T	searchFilter=NULL;	// search filter
	pBuf_T	retBuf=NULL;		// result buffer for NWDSSearch
	pBuf_T	attrNames=NULL;		// specify which attribute values to return
	Filter_Cursor_T* cur=NULL;	// search expression tree temporary buffer
	Object_Info_T	objectInfo;
		
	/*******************************************************************
	create context and set current context to Root
	 *******************************************************************/
	 
	ccode = NWDSCreateContextHandle(&context);
	
	if((long)context == ERR_CONTEXT_CREATION) {
		 printf("Error creating context.\n");
		 goto Exit1;
	}

	ccode=NWDSSetContext(context, DCK_NAME_CONTEXT, "[Root]");
	if(ccode){
		 printf("Error NWDSSetContext(): %d\n",ccode);
		 goto Exit2;
	}


	ccode= NWDSGetContext(context, DCK_FLAGS, &contextFlags);
	if( ccode != 0) 
	{
		printf("NWDSGetContext (DCK_FLAGS) failed, returns %d\n", ccode);
	}

	contextFlags|= DCV_TYPELESS_NAMES;

/*****************************************************
 In order to see the problem, first compile, and run with the line below
 commented out. The program will display a list of users on the NDS.
 Now, un-comment the line belog, compile, and re-run the NLM, and the 
 NWDSSearch function fails with error code -601
 *****************************************************/
 
/*	contextFlags &= ~DCV_XLATE_STRINGS;  */
	
	ccode= NWDSSetContext( context, DCK_FLAGS, &contextFlags);
	if( ccode != 0) 
	{
		printf("NWDSSetContext (DCK_FLAGS DCV_TYPELESS_NAMES) failed, returns %d\n", ccode);
	}


	/*******************************************************************
	Login to NDS
	*/
	//ccode = NWDSLoginAsServer( context );
	{
		NWCONN_HANDLE conn;

//		ccode = ncp_open_mount("/root/fdnet", &conn);
		ccode = NWCCOpenConnByName(NULL, "FDNET", NWCC_NAME_FORMAT_BIND, 0, 0, &conn);

		if (!ccode)
			NWDSAddConnection(context, conn);
	}
	
	if(ccode){
		switch (ccode) {
			case -601:
				// user object not found
				printf("User object not found: %s\n",admin);
				break;
			case -669:
				// auth failed
				printf("Failed authentication.  Check Password\n");
				break;
			default:
				 printf("Error: NWDSLogin failed (%s) for %s\n",strnwerror(ccode),admin);
		}
		goto Exit2;
	}


	/*******************************************************************
	In order to search, we need:
		A Filter Cursor (to build the search expression)
		A Filter Buffer (to store the expression; used by NWDSSearch)
		A Buffer to store which attributes we need information on
		A Result Buffer (to store the search results)
	*/

	/*******************************************************************
	** Allocate Filter buffer and Cursor and populate
	*/
	ccode = NWDSAllocBuf(DEFAULT_MESSAGE_LEN,&searchFilter);
	if (ccode < 0) {
		printf("NWDSAllocBuf returned: %d\n", ccode);
		goto Exit3;
	}

	// Initialize the searchFilter buffer
	ccode = NWDSInitBuf(context,DSV_SEARCH_FILTER,searchFilter);
	if (ccode < 0) {
		printf("NWDSInitBuf returned: %d\n", ccode);
		goto Exit4;
	}

	// Allocate a filter cursor to put the search expression 
	ccode = NWDSAllocFilter(&cur);
	if (ccode < 0) {
		printf("NWDSAllocFilter returned: %d\n", ccode);
		goto Exit4;
	}

	// Build the expression tree in cur, then place into searchFilter 
	// Object Class = User
	ccode = NWDSAddFilterToken(cur,FTOK_ANAME,"Object Class",SYN_CLASS_NAME);
	if (ccode < 0) {
			printf("NWDSAddFilterToken returned: %d\n", ccode);
			goto Exit4;
	}

	ccode = NWDSAddFilterToken(cur,FTOK_EQ,NULL,0);
	if (ccode < 0) {
			printf("NWDSAddFilterToken returned: %d\n", ccode);
			goto Exit4;
	}

	ccode = NWDSAddFilterToken(cur,FTOK_AVAL,"User",SYN_CLASS_NAME);
	if (ccode < 0) {
			printf("NWDSAddFilterToken returned: %d\n", ccode);
			goto Exit4;
	}

	// now place the cursor into the searchFilter buffer 
	// NWDSPutFilter frees the expression tree filter (cur)
	//	so if it succeeds, set cur to NULL so it won't be
	//	freed below 
	ccode = NWDSPutFilter(context,searchFilter,cur,NULL);
	if (ccode < 0) {
			printf("NWDSPutFilter returned: %d\n", ccode);
			goto Exit4;
	}
	else
		cur=NULL;

	/*******************************************************************
	** Specify which attributes we want information on
	*/
	// allocate and initialize the attrNames buffer 
	ccode = NWDSAllocBuf(DEFAULT_MESSAGE_LEN,&attrNames);
	if (ccode < 0) {
			printf("NWDSAllocBuf returned: %d\n", ccode);
			goto Exit4;
	}
	ccode = NWDSInitBuf(context,DSV_SEARCH,attrNames);
	if (ccode < 0) {
			printf("NWDSInitBuf returned: %d\n", ccode);
			goto Exit4;
	}

	// specify the attributes to retrieve for the objects
	// In this case: Given Name and Full Name
	ccode = NWDSPutAttrName(context,attrNames,"Given Name");
	if (ccode < 0) {
			printf("NWDSPutAttrName returned: %d\n", ccode);
			goto Exit4;
	}
	ccode = NWDSPutAttrName(context,attrNames,"Full Name");
	if (ccode < 0) {
			printf("NWDSPutAttrName returned: %d\n", ccode);
			goto Exit4;
	}
	ccode = NWDSPutAttrName(context,attrNames,"Surname");
	if (ccode < 0) {
			printf("NWDSPutAttrName returned: %d\n", ccode);
			goto Exit4;
	}
	ccode = NWDSPutAttrName(context,attrNames,"Title");
	if (ccode < 0) {
			printf("NWDSPutAttrName returned: %d\n", ccode);
			goto Exit4;
	}

	/*******************************************************************
	** Allocate a result buffer
	*/
	ccode = NWDSAllocBuf(65500,&retBuf);
	if (ccode < 0) {
			printf("NWDSAllocBuf returned: %d\n", ccode);
			goto Exit4;
	}

	/*******************************************************************
	** We are now ready to do the search
	*/
	iterationHandle = NO_MORE_ITERATIONS;
	// while NWDSSearch still can get some objects...
	do {
		ccode = NWDSSearch(context,
				"[Root]",
				DS_SEARCH_SUBTREE,
				FALSE,		// don't dereference aliases
				searchFilter,
				TRUE,		// we want attributes and values
				FALSE,		// only want information in attrNames
				attrNames,
				&iterationHandle,
				0,		// reserved
				&countObjectsSearched,
				retBuf);
		if (ccode) {
			printf("NWDSSearch returned: %s\n", strnwerror(ccode));
			goto Exit4;
		}

		// count the object returned in the buffer
		ccode = NWDSGetObjectCount(context,retBuf,&objCount);
		if (ccode) {
			printf("NWDSGetObjectCount returned: %d\n", ccode);
			goto Exit4;
		}

		printf("Objects found: %d\n",objCount);
		printf("-----------------------------------------\n");
		screenCntr+=2;

		// for the number of objects returned...
		for (objCntr=0;objCntr<objCount;objCntr++) {
			// get an object name
			ccode = NWDSGetObjectName(context,retBuf,objectName,&attrCount,&objectInfo);
			if (ccode) {
				printf("NWDSGetObjectName returned: %d\n", ccode);
				goto Exit4;
			}
			printf("%s\n",objectName);
			screenCntr++;

			// for the number of attributes returned with the object...
			for (attrCntr=0;attrCntr<attrCount;attrCntr++) {
				// get the attribute name
				ccode = NWDSGetAttrName(context,retBuf,attrName,&attrValCount,&syntaxID);
				if (ccode) {
					printf("NWDSGetAttrName returned: %d\n", ccode);
					goto Exit4;
				}
				// compute and allocate space for the value
				ccode = NWDSComputeAttrValSize(context,retBuf,syntaxID,&attrValSize);
				if (ccode) {
					printf("NWDSComputeAttrValSize returned: %d\n", ccode);
					goto Exit4;
				}
				attrVal = malloc(attrValSize);
				// for the number of values returned with the attribute...
				for (valCntr=0;valCntr<attrValCount;valCntr++) {
					// get the value
					ccode = NWDSGetAttrVal(context,retBuf,syntaxID,attrVal);
					if (ccode) {
						printf("NWDSGetAttrVal returned: %d\n", ccode);
						goto Exit4;
					}
					printf("  %s =\t%s\n",attrName,attrVal);
					screenCntr++;
				} // valCntr
				free(attrVal);
			} // attrCntr
			printf("\n");
		} // objCntr
	} while ((nuint32)iterationHandle != NO_MORE_ITERATIONS);


Exit4:
	if (retBuf)
		NWDSFreeBuf(retBuf);
	if (cur)
		NWDSFreeFilter(cur, NULL);
	if (searchFilter)
		NWDSFreeBuf(searchFilter);
	if (attrNames)
		NWDSFreeBuf(attrNames);
Exit3:
//	NWDSLogout(context);
Exit2:
	NWDSFreeContext(context);
Exit1:
	exit(0);
}