17d1ffc32SGordon Ross /*
27d1ffc32SGordon Ross  * This file and its contents are supplied under the terms of the
37d1ffc32SGordon Ross  * Common Development and Distribution License ("CDDL"), version 1.0.
47d1ffc32SGordon Ross  * You may only use this file in accordance with the terms of version
57d1ffc32SGordon Ross  * 1.0 of the CDDL.
67d1ffc32SGordon Ross  *
77d1ffc32SGordon Ross  * A full copy of the text of the CDDL should have accompanied this
87d1ffc32SGordon Ross  * source.  A copy of the CDDL is also available via the Internet at
97d1ffc32SGordon Ross  * http://www.illumos.org/license/CDDL.
107d1ffc32SGordon Ross  */
117d1ffc32SGordon Ross 
127d1ffc32SGordon Ross /*
13*897907ceSGordon Ross  * Copyright 2018-2021 Tintri by DDN, Inc. All rights reserved.
147d1ffc32SGordon Ross  */
157d1ffc32SGordon Ross 
167d1ffc32SGordon Ross /*
177d1ffc32SGordon Ross  * Test putting/getting unicode strings in mbchains.
187d1ffc32SGordon Ross  */
197d1ffc32SGordon Ross 
207d1ffc32SGordon Ross #include <sys/types.h>
217d1ffc32SGordon Ross #include <sys/debug.h>
227d1ffc32SGordon Ross #include <sys/varargs.h>
237d1ffc32SGordon Ross #include <smbsrv/smb_kproto.h>
247d1ffc32SGordon Ross #include <stdio.h>
257d1ffc32SGordon Ross #include <string.h>
267d1ffc32SGordon Ross #include <strings.h>
277d1ffc32SGordon Ross 
287d1ffc32SGordon Ross #include "test_defs.h"
297d1ffc32SGordon Ross 
307d1ffc32SGordon Ross static char mbsa[] = "A\xef\xbc\xa1.";		// A fwA . (5)
317d1ffc32SGordon Ross static char mbsp[] = "P\xf0\x9f\x92\xa9.";	// P poop . (6)
327d1ffc32SGordon Ross static smb_wchar_t wcsa[] = { 'A', 0xff21, '.', 0 };	// (3)
337d1ffc32SGordon Ross static smb_wchar_t wcsp[] = { 'P', 0xd83d, 0xdca9, '.', 0 }; // (4)
347d1ffc32SGordon Ross 
357d1ffc32SGordon Ross smb_session_t test_ssn;
367d1ffc32SGordon Ross smb_request_t test_sr;
377d1ffc32SGordon Ross 
387d1ffc32SGordon Ross /*
397d1ffc32SGordon Ross  * Put ASCII string with NULL
407d1ffc32SGordon Ross  */
417d1ffc32SGordon Ross static void
mbm_put_a0()427d1ffc32SGordon Ross mbm_put_a0()
437d1ffc32SGordon Ross {
447d1ffc32SGordon Ross 	uint8_t wire[] = { 'o', 'n', 'e', 0, 42, 0 };
457d1ffc32SGordon Ross 	mbuf_chain_t *mbc;
467d1ffc32SGordon Ross 	int rc;
477d1ffc32SGordon Ross 
487d1ffc32SGordon Ross 	mbc = smb_mbc_alloc(100);
497d1ffc32SGordon Ross 
507d1ffc32SGordon Ross 	rc = smb_mbc_encodef(mbc, "sw", "one", 42);
517d1ffc32SGordon Ross 	if (rc != 0) {
527d1ffc32SGordon Ross 		printf("Fail: mbm_put_a0 encode\n");
537d1ffc32SGordon Ross 		goto out;
547d1ffc32SGordon Ross 	}
557d1ffc32SGordon Ross 	if (mbc->chain->m_len != 6) {
567d1ffc32SGordon Ross 		printf("Fail: mbm_put_a0 len=%d\n",
577d1ffc32SGordon Ross 		    mbc->chain->m_len);
587d1ffc32SGordon Ross 		return;
597d1ffc32SGordon Ross 	}
607d1ffc32SGordon Ross 
617d1ffc32SGordon Ross 	if (memcmp(mbc->chain->m_data, wire, 6)) {
627d1ffc32SGordon Ross 		printf("Fail: mbm_put_a0 cmp:\n");
637d1ffc32SGordon Ross 		hexdump((uchar_t *)mbc->chain->m_data, 6);
647d1ffc32SGordon Ross 		return;
657d1ffc32SGordon Ross 	}
667d1ffc32SGordon Ross 
677d1ffc32SGordon Ross 	printf("Pass: mbm_put_a0\n");
687d1ffc32SGordon Ross 
697d1ffc32SGordon Ross out:
707d1ffc32SGordon Ross 	smb_mbc_free(mbc);
717d1ffc32SGordon Ross }
727d1ffc32SGordon Ross 
737d1ffc32SGordon Ross /*
747d1ffc32SGordon Ross  * Put ASCII string, no NULL
757d1ffc32SGordon Ross  */
767d1ffc32SGordon Ross static void
mbm_put_a1()777d1ffc32SGordon Ross mbm_put_a1()
787d1ffc32SGordon Ross {
797d1ffc32SGordon Ross 	uint8_t wire[] = { 'o', 'n', 'e', '.', 42, 0 };
807d1ffc32SGordon Ross 	mbuf_chain_t *mbc;
817d1ffc32SGordon Ross 	int rc;
827d1ffc32SGordon Ross 
837d1ffc32SGordon Ross 	mbc = smb_mbc_alloc(100);
847d1ffc32SGordon Ross 
857d1ffc32SGordon Ross 	rc = smb_mbc_encodef(mbc, "4sw", "one.", 42);
867d1ffc32SGordon Ross 	if (rc != 0) {
877d1ffc32SGordon Ross 		printf("Fail: mbm_put_a1 encode\n");
887d1ffc32SGordon Ross 		goto out;
897d1ffc32SGordon Ross 	}
907d1ffc32SGordon Ross 	if (mbc->chain->m_len != 6) {
917d1ffc32SGordon Ross 		printf("Fail: mbm_put_a1 len=%d\n",
927d1ffc32SGordon Ross 		    mbc->chain->m_len);
937d1ffc32SGordon Ross 		return;
947d1ffc32SGordon Ross 	}
957d1ffc32SGordon Ross 
967d1ffc32SGordon Ross 	if (memcmp(mbc->chain->m_data, wire, 6)) {
977d1ffc32SGordon Ross 		printf("Fail: mbm_put_a1 cmp:\n");
987d1ffc32SGordon Ross 		hexdump((uchar_t *)mbc->chain->m_data, 6);
997d1ffc32SGordon Ross 		return;
1007d1ffc32SGordon Ross 	}
1017d1ffc32SGordon Ross 
1027d1ffc32SGordon Ross 	printf("Pass: mbm_put_a1\n");
1037d1ffc32SGordon Ross 
1047d1ffc32SGordon Ross out:
1057d1ffc32SGordon Ross 	smb_mbc_free(mbc);
1067d1ffc32SGordon Ross }
1077d1ffc32SGordon Ross 
1087d1ffc32SGordon Ross static void
mbm_put_apad()1097d1ffc32SGordon Ross mbm_put_apad()
1107d1ffc32SGordon Ross {
1117d1ffc32SGordon Ross 	uint8_t wire[] = { 'o', 'n', 'e', 0, 0 };
1127d1ffc32SGordon Ross 	mbuf_chain_t *mbc;
1137d1ffc32SGordon Ross 	int rc;
1147d1ffc32SGordon Ross 
1157d1ffc32SGordon Ross 	mbc = smb_mbc_alloc(100);
1167d1ffc32SGordon Ross 
1177d1ffc32SGordon Ross 	/* Encode with wire length > strlen */
1187d1ffc32SGordon Ross 	rc = smb_mbc_encodef(mbc, "5s", "one");
1197d1ffc32SGordon Ross 	if (rc != 0) {
1207d1ffc32SGordon Ross 		printf("Fail: mbm_put_apad encode\n");
1217d1ffc32SGordon Ross 		goto out;
1227d1ffc32SGordon Ross 	}
1237d1ffc32SGordon Ross 	if (mbc->chain->m_len != 5) {
1247d1ffc32SGordon Ross 		printf("Fail: mbm_put_apad len=%d\n",
1257d1ffc32SGordon Ross 		    mbc->chain->m_len);
1267d1ffc32SGordon Ross 		return;
1277d1ffc32SGordon Ross 	}
1287d1ffc32SGordon Ross 
1297d1ffc32SGordon Ross 	if (memcmp(mbc->chain->m_data, wire, 5)) {
1307d1ffc32SGordon Ross 		printf("Fail: mbm_put_apad cmp:\n");
1317d1ffc32SGordon Ross 		hexdump((uchar_t *)mbc->chain->m_data, 5);
1327d1ffc32SGordon Ross 		return;
1337d1ffc32SGordon Ross 	}
1347d1ffc32SGordon Ross 
1357d1ffc32SGordon Ross 	printf("Pass: mbm_put_apad\n");
1367d1ffc32SGordon Ross 
1377d1ffc32SGordon Ross out:
1387d1ffc32SGordon Ross 	smb_mbc_free(mbc);
1397d1ffc32SGordon Ross }
1407d1ffc32SGordon Ross 
1417d1ffc32SGordon Ross static void
mbm_put_atrunc1()14225a9a7aaSGordon Ross mbm_put_atrunc1()
1437d1ffc32SGordon Ross {
1447d1ffc32SGordon Ross 	uint8_t wire[] = { 'o', 'n', 'e', 't', };
1457d1ffc32SGordon Ross 	mbuf_chain_t *mbc;
1467d1ffc32SGordon Ross 	int rc;
1477d1ffc32SGordon Ross 
1487d1ffc32SGordon Ross 	mbc = smb_mbc_alloc(100);
1497d1ffc32SGordon Ross 
1507d1ffc32SGordon Ross 	/* Encode with wire length < strlen */
1517d1ffc32SGordon Ross 	rc = smb_mbc_encodef(mbc, "4s", "onetwo");
1527d1ffc32SGordon Ross 	if (rc != 0) {
15325a9a7aaSGordon Ross 		printf("Fail: mbm_put_atrunc1 encode\n");
1547d1ffc32SGordon Ross 		goto out;
1557d1ffc32SGordon Ross 	}
1567d1ffc32SGordon Ross 	/* Trunc should put exactly 4 */
1577d1ffc32SGordon Ross 	if (mbc->chain->m_len != 4) {
15825a9a7aaSGordon Ross 		printf("Fail: mbm_put_atrunc1 len=%d\n",
1597d1ffc32SGordon Ross 		    mbc->chain->m_len);
1607d1ffc32SGordon Ross 		return;
1617d1ffc32SGordon Ross 	}
1627d1ffc32SGordon Ross 
1637d1ffc32SGordon Ross 	if (memcmp(mbc->chain->m_data, wire, 4)) {
16425a9a7aaSGordon Ross 		printf("Fail: mbm_put_atrunc1 cmp:\n");
1657d1ffc32SGordon Ross 		hexdump((uchar_t *)mbc->chain->m_data, 4);
1667d1ffc32SGordon Ross 		return;
1677d1ffc32SGordon Ross 	}
1687d1ffc32SGordon Ross 
16925a9a7aaSGordon Ross 	printf("Pass: mbm_put_atrunc1\n");
17025a9a7aaSGordon Ross 
17125a9a7aaSGordon Ross out:
17225a9a7aaSGordon Ross 	smb_mbc_free(mbc);
17325a9a7aaSGordon Ross }
17425a9a7aaSGordon Ross 
17525a9a7aaSGordon Ross static void
mbm_put_atrunc2()17625a9a7aaSGordon Ross mbm_put_atrunc2()
17725a9a7aaSGordon Ross {
17825a9a7aaSGordon Ross 	uint8_t wire[] = { 'o', 'n', 'e', 't', 0 };
17925a9a7aaSGordon Ross 	mbuf_chain_t *mbc;
18025a9a7aaSGordon Ross 	int rc;
18125a9a7aaSGordon Ross 
18225a9a7aaSGordon Ross 	mbc = smb_mbc_alloc(4);
18325a9a7aaSGordon Ross 
18425a9a7aaSGordon Ross 	/* Encode with wire length < strlen */
18525a9a7aaSGordon Ross 	rc = smb_mbc_encodef(mbc, "s", "onetwo");
18625a9a7aaSGordon Ross 	if (rc != 1) {
18725a9a7aaSGordon Ross 		printf("Fail: mbm_put_atrunc2 encode rc=%d\n", rc);
18825a9a7aaSGordon Ross 		goto out;
18925a9a7aaSGordon Ross 	}
19025a9a7aaSGordon Ross 	/* Trunc should put exactly 4 */
19125a9a7aaSGordon Ross 	if (mbc->chain->m_len != 4) {
19225a9a7aaSGordon Ross 		printf("Fail: mbm_put_atrunc2 len=%d\n",
19325a9a7aaSGordon Ross 		    mbc->chain->m_len);
19425a9a7aaSGordon Ross 		return;
19525a9a7aaSGordon Ross 	}
19625a9a7aaSGordon Ross 
19725a9a7aaSGordon Ross 	if (memcmp(mbc->chain->m_data, wire, 5)) {
19825a9a7aaSGordon Ross 		printf("Fail: mbm_put_atrunc2 cmp:\n");
19925a9a7aaSGordon Ross 		hexdump((uchar_t *)mbc->chain->m_data, 4);
20025a9a7aaSGordon Ross 		return;
20125a9a7aaSGordon Ross 	}
20225a9a7aaSGordon Ross 
20325a9a7aaSGordon Ross 	printf("Pass: mbm_put_atrunc2\n");
2047d1ffc32SGordon Ross 
2057d1ffc32SGordon Ross out:
2067d1ffc32SGordon Ross 	smb_mbc_free(mbc);
2077d1ffc32SGordon Ross }
2087d1ffc32SGordon Ross 
2097d1ffc32SGordon Ross /*
2107d1ffc32SGordon Ross  * Put unicode string with NULL
2117d1ffc32SGordon Ross  */
2127d1ffc32SGordon Ross static void
mbm_put_u0()2137d1ffc32SGordon Ross mbm_put_u0()
2147d1ffc32SGordon Ross {
2157d1ffc32SGordon Ross 	uint16_t wire[] = { 'o', 'n', 'e', 0, 42, 0 };
2167d1ffc32SGordon Ross 	mbuf_chain_t *mbc;
2177d1ffc32SGordon Ross 	int rc;
2187d1ffc32SGordon Ross 
2197d1ffc32SGordon Ross 	mbc = smb_mbc_alloc(100);
2207d1ffc32SGordon Ross 
2217d1ffc32SGordon Ross 	rc = smb_mbc_encodef(mbc, "Uw", "one", 42);
2227d1ffc32SGordon Ross 	if (rc != 0) {
2237d1ffc32SGordon Ross 		printf("Fail: mbm_put_u0 encode\n");
2247d1ffc32SGordon Ross 		goto out;
2257d1ffc32SGordon Ross 	}
2267d1ffc32SGordon Ross 	if (mbc->chain->m_len != 10) {
2277d1ffc32SGordon Ross 		printf("Fail: mbm_put_u0 len=%d\n",
2287d1ffc32SGordon Ross 		    mbc->chain->m_len);
2297d1ffc32SGordon Ross 		return;
2307d1ffc32SGordon Ross 	}
2317d1ffc32SGordon Ross 
2327d1ffc32SGordon Ross 	if (memcmp(mbc->chain->m_data, wire, 10)) {
2337d1ffc32SGordon Ross 		printf("Fail: mbm_put_u0 cmp:\n");
2347d1ffc32SGordon Ross 		hexdump((uchar_t *)mbc->chain->m_data, 10);
2357d1ffc32SGordon Ross 		return;
2367d1ffc32SGordon Ross 	}
2377d1ffc32SGordon Ross 
2387d1ffc32SGordon Ross 	printf("Pass: mbm_put_u0\n");
2397d1ffc32SGordon Ross 
2407d1ffc32SGordon Ross out:
2417d1ffc32SGordon Ross 	smb_mbc_free(mbc);
2427d1ffc32SGordon Ross }
2437d1ffc32SGordon Ross 
2447d1ffc32SGordon Ross /*
2457d1ffc32SGordon Ross  * Put unicode string, no NULL
2467d1ffc32SGordon Ross  */
2477d1ffc32SGordon Ross static void
mbm_put_u1()2487d1ffc32SGordon Ross mbm_put_u1()
2497d1ffc32SGordon Ross {
2507d1ffc32SGordon Ross 	uint16_t wire[] = { 'o', 'n', 'e', '.', 42, 0 };
2517d1ffc32SGordon Ross 	mbuf_chain_t *mbc;
2527d1ffc32SGordon Ross 	int rc;
2537d1ffc32SGordon Ross 
2547d1ffc32SGordon Ross 	mbc = smb_mbc_alloc(100);
2557d1ffc32SGordon Ross 
2567d1ffc32SGordon Ross 	rc = smb_mbc_encodef(mbc, "8Uw", "one.", 42);
2577d1ffc32SGordon Ross 	if (rc != 0) {
2587d1ffc32SGordon Ross 		printf("Fail: mbm_put_u1 encode\n");
2597d1ffc32SGordon Ross 		goto out;
2607d1ffc32SGordon Ross 	}
2617d1ffc32SGordon Ross 	if (mbc->chain->m_len != 10) {
2627d1ffc32SGordon Ross 		printf("Fail: mbm_put_u1 len=%d\n",
2637d1ffc32SGordon Ross 		    mbc->chain->m_len);
2647d1ffc32SGordon Ross 		return;
2657d1ffc32SGordon Ross 	}
2667d1ffc32SGordon Ross 
2677d1ffc32SGordon Ross 	if (memcmp(mbc->chain->m_data, wire, 10)) {
2687d1ffc32SGordon Ross 		printf("Fail: mbm_put_u1 cmp:\n");
2697d1ffc32SGordon Ross 		hexdump((uchar_t *)mbc->chain->m_data, 10);
2707d1ffc32SGordon Ross 		return;
2717d1ffc32SGordon Ross 	}
2727d1ffc32SGordon Ross 
2737d1ffc32SGordon Ross 	printf("Pass: mbm_put_u1\n");
2747d1ffc32SGordon Ross 
2757d1ffc32SGordon Ross out:
2767d1ffc32SGordon Ross 	smb_mbc_free(mbc);
2777d1ffc32SGordon Ross }
2787d1ffc32SGordon Ross 
2797d1ffc32SGordon Ross static void
mbm_put_u3()2807d1ffc32SGordon Ross mbm_put_u3()
2817d1ffc32SGordon Ross {
2827d1ffc32SGordon Ross 	mbuf_chain_t *mbc;
2837d1ffc32SGordon Ross 	int rc;
2847d1ffc32SGordon Ross 
2857d1ffc32SGordon Ross 	mbc = smb_mbc_alloc(100);
2867d1ffc32SGordon Ross 
2877d1ffc32SGordon Ross 	rc = smb_mbc_encodef(mbc, "U", mbsa);
2887d1ffc32SGordon Ross 	if (rc != 0) {
2897d1ffc32SGordon Ross 		printf("Fail: mbm_put_u3 encode\n");
2907d1ffc32SGordon Ross 		goto out;
2917d1ffc32SGordon Ross 	}
2927d1ffc32SGordon Ross 	if (mbc->chain->m_len != 8) {
2937d1ffc32SGordon Ross 		printf("Fail: mbm_put_u3 len=%d\n",
2947d1ffc32SGordon Ross 		    mbc->chain->m_len);
2957d1ffc32SGordon Ross 		return;
2967d1ffc32SGordon Ross 	}
2977d1ffc32SGordon Ross 
2987d1ffc32SGordon Ross 	if (memcmp(mbc->chain->m_data, wcsa, 8)) {
2997d1ffc32SGordon Ross 		printf("Fail: mbm_put_u3 cmp:\n");
3007d1ffc32SGordon Ross 		hexdump((uchar_t *)mbc->chain->m_data, 8);
3017d1ffc32SGordon Ross 		return;
3027d1ffc32SGordon Ross 	}
3037d1ffc32SGordon Ross 
3047d1ffc32SGordon Ross 	printf("Pass: mbm_put_u3\n");
3057d1ffc32SGordon Ross 
3067d1ffc32SGordon Ross out:
3077d1ffc32SGordon Ross 	smb_mbc_free(mbc);
3087d1ffc32SGordon Ross }
3097d1ffc32SGordon Ross 
3107d1ffc32SGordon Ross static void
mbm_put_u4()3117d1ffc32SGordon Ross mbm_put_u4()
3127d1ffc32SGordon Ross {
3137d1ffc32SGordon Ross 	mbuf_chain_t *mbc;
3147d1ffc32SGordon Ross 	int rc;
3157d1ffc32SGordon Ross 
3167d1ffc32SGordon Ross 	mbc = smb_mbc_alloc(100);
3177d1ffc32SGordon Ross 
3187d1ffc32SGordon Ross 	rc = smb_mbc_encodef(mbc, "U", mbsp);
3197d1ffc32SGordon Ross 	if (rc != 0) {
3207d1ffc32SGordon Ross 		printf("Fail: mbm_put_u4 encode\n");
3217d1ffc32SGordon Ross 		goto out;
3227d1ffc32SGordon Ross 	}
3237d1ffc32SGordon Ross 	if (mbc->chain->m_len != 10) {
3247d1ffc32SGordon Ross 		printf("Fail: mbm_put_u4 len=%d\n",
3257d1ffc32SGordon Ross 		    mbc->chain->m_len);
3267d1ffc32SGordon Ross 		return;
3277d1ffc32SGordon Ross 	}
3287d1ffc32SGordon Ross 
3297d1ffc32SGordon Ross 	if (memcmp(mbc->chain->m_data, wcsp, 10)) {
3307d1ffc32SGordon Ross 		printf("Fail: mbm_put_u4 cmp:\n");
3317d1ffc32SGordon Ross 		hexdump((uchar_t *)mbc->chain->m_data, 10);
3327d1ffc32SGordon Ross 		return;
3337d1ffc32SGordon Ross 	}
3347d1ffc32SGordon Ross 
3357d1ffc32SGordon Ross 	printf("Pass: mbm_put_u4\n");
3367d1ffc32SGordon Ross 
3377d1ffc32SGordon Ross out:
3387d1ffc32SGordon Ross 	smb_mbc_free(mbc);
3397d1ffc32SGordon Ross }
3407d1ffc32SGordon Ross 
3417d1ffc32SGordon Ross static void
mbm_put_upad()3427d1ffc32SGordon Ross mbm_put_upad()
3437d1ffc32SGordon Ross {
3447d1ffc32SGordon Ross 	uint16_t wire[] = { 'o', 'n', 'e', 0, 0 };
3457d1ffc32SGordon Ross 	mbuf_chain_t *mbc;
3467d1ffc32SGordon Ross 	int rc;
3477d1ffc32SGordon Ross 
3487d1ffc32SGordon Ross 	mbc = smb_mbc_alloc(100);
3497d1ffc32SGordon Ross 
3507d1ffc32SGordon Ross 	/* Encode with wire length > strlen */
3517d1ffc32SGordon Ross 	rc = smb_mbc_encodef(mbc, "10U", "one");
3527d1ffc32SGordon Ross 	if (rc != 0) {
3537d1ffc32SGordon Ross 		printf("Fail: mbm_put_upad encode\n");
3547d1ffc32SGordon Ross 		goto out;
3557d1ffc32SGordon Ross 	}
3567d1ffc32SGordon Ross 	if (mbc->chain->m_len != 10) {
3577d1ffc32SGordon Ross 		printf("Fail: mbm_put_upad len=%d\n",
3587d1ffc32SGordon Ross 		    mbc->chain->m_len);
3597d1ffc32SGordon Ross 		return;
3607d1ffc32SGordon Ross 	}
3617d1ffc32SGordon Ross 
3627d1ffc32SGordon Ross 	if (memcmp(mbc->chain->m_data, wire, 10)) {
3637d1ffc32SGordon Ross 		printf("Fail: mbm_put_upad cmp:\n");
3647d1ffc32SGordon Ross 		hexdump((uchar_t *)mbc->chain->m_data, 10);
3657d1ffc32SGordon Ross 		return;
3667d1ffc32SGordon Ross 	}
3677d1ffc32SGordon Ross 
3687d1ffc32SGordon Ross 	printf("Pass: mbm_put_upad\n");
3697d1ffc32SGordon Ross 
3707d1ffc32SGordon Ross out:
3717d1ffc32SGordon Ross 	smb_mbc_free(mbc);
3727d1ffc32SGordon Ross }
3737d1ffc32SGordon Ross 
3747d1ffc32SGordon Ross static void
mbm_put_utrunc1()37525a9a7aaSGordon Ross mbm_put_utrunc1()
3767d1ffc32SGordon Ross {
3777d1ffc32SGordon Ross 	uint16_t wire[] = { 'o', 'n', 'e', 't' };
3787d1ffc32SGordon Ross 	mbuf_chain_t *mbc;
3797d1ffc32SGordon Ross 	int rc;
3807d1ffc32SGordon Ross 
3817d1ffc32SGordon Ross 	mbc = smb_mbc_alloc(100);
3827d1ffc32SGordon Ross 
3837d1ffc32SGordon Ross 	/* Encode with wire length < strlen */
3847d1ffc32SGordon Ross 	rc = smb_mbc_encodef(mbc, "8U", "onetwo");
3857d1ffc32SGordon Ross 	if (rc != 0) {
38625a9a7aaSGordon Ross 		printf("Fail: mbm_put_utrunc1 encode\n");
3877d1ffc32SGordon Ross 		goto out;
3887d1ffc32SGordon Ross 	}
3897d1ffc32SGordon Ross 	/* Trunc should put exactly 8 */
3907d1ffc32SGordon Ross 	if (mbc->chain->m_len != 8) {
39125a9a7aaSGordon Ross 		printf("Fail: mbm_put_utrunc1 len=%d\n",
3927d1ffc32SGordon Ross 		    mbc->chain->m_len);
3937d1ffc32SGordon Ross 		return;
3947d1ffc32SGordon Ross 	}
3957d1ffc32SGordon Ross 
3967d1ffc32SGordon Ross 	if (memcmp(mbc->chain->m_data, wire, 8)) {
39725a9a7aaSGordon Ross 		printf("Fail: mbm_put_utrunc1 cmp:\n");
39825a9a7aaSGordon Ross 		hexdump((uchar_t *)mbc->chain->m_data, 8);
39925a9a7aaSGordon Ross 		return;
40025a9a7aaSGordon Ross 	}
40125a9a7aaSGordon Ross 
40225a9a7aaSGordon Ross 	printf("Pass: mbm_put_utrunc1\n");
40325a9a7aaSGordon Ross 
40425a9a7aaSGordon Ross out:
40525a9a7aaSGordon Ross 	smb_mbc_free(mbc);
40625a9a7aaSGordon Ross }
40725a9a7aaSGordon Ross 
40825a9a7aaSGordon Ross static void
mbm_put_utrunc2()40925a9a7aaSGordon Ross mbm_put_utrunc2()
41025a9a7aaSGordon Ross {
41125a9a7aaSGordon Ross 	uint16_t wire[] = { 'o', 'n', 'e', 't', 0 };
41225a9a7aaSGordon Ross 	mbuf_chain_t *mbc;
41325a9a7aaSGordon Ross 	int rc;
41425a9a7aaSGordon Ross 
41525a9a7aaSGordon Ross 	mbc = smb_mbc_alloc(8);
41625a9a7aaSGordon Ross 
41725a9a7aaSGordon Ross 	/* Encode with wire length < strlen */
41825a9a7aaSGordon Ross 	rc = smb_mbc_encodef(mbc, "U", "onetwo");
41925a9a7aaSGordon Ross 	if (rc != 1) {
42025a9a7aaSGordon Ross 		printf("Fail: mbm_put_utrunc2 encode rc=%d\n", rc);
42125a9a7aaSGordon Ross 		goto out;
42225a9a7aaSGordon Ross 	}
42325a9a7aaSGordon Ross 	/* Trunc should put exactly 8 */
42425a9a7aaSGordon Ross 	if (mbc->chain->m_len != 8) {
42525a9a7aaSGordon Ross 		printf("Fail: mbm_put_utrunc2 len=%d\n",
42625a9a7aaSGordon Ross 		    mbc->chain->m_len);
42725a9a7aaSGordon Ross 		return;
42825a9a7aaSGordon Ross 	}
42925a9a7aaSGordon Ross 
43025a9a7aaSGordon Ross 	if (memcmp(mbc->chain->m_data, wire, 10)) {
43125a9a7aaSGordon Ross 		printf("Fail: mbm_put_utrunc2 cmp:\n");
4327d1ffc32SGordon Ross 		hexdump((uchar_t *)mbc->chain->m_data, 8);
4337d1ffc32SGordon Ross 		return;
4347d1ffc32SGordon Ross 	}
4357d1ffc32SGordon Ross 
43625a9a7aaSGordon Ross 	printf("Pass: mbm_put_utrunc2\n");
4377d1ffc32SGordon Ross 
4387d1ffc32SGordon Ross out:
4397d1ffc32SGordon Ross 	smb_mbc_free(mbc);
4407d1ffc32SGordon Ross }
4417d1ffc32SGordon Ross 
442*897907ceSGordon Ross static void
mbm_put_mbuf1()443*897907ceSGordon Ross mbm_put_mbuf1()
444*897907ceSGordon Ross {
445*897907ceSGordon Ross 	uint8_t wire[] = "onetwo";
446*897907ceSGordon Ross 	mbuf_chain_t mbc, mbc2;
447*897907ceSGordon Ross 	int rc;
448*897907ceSGordon Ross 
449*897907ceSGordon Ross 	MBC_INIT(&mbc, 16);
450*897907ceSGordon Ross 	MBC_INIT(&mbc2, 8);
451*897907ceSGordon Ross 
452*897907ceSGordon Ross 	rc = smb_mbc_encodef(&mbc, "3s", "one");
453*897907ceSGordon Ross 	if (rc != 0) {
454*897907ceSGordon Ross 		printf("Fail: mbm_put_mbuf1 encode 1 rc=%d\n", rc);
455*897907ceSGordon Ross 		goto out;
456*897907ceSGordon Ross 	}
457*897907ceSGordon Ross 	if (mbc.chain_offset != 3) {
458*897907ceSGordon Ross 		printf("Fail: mbm_put_mbuf1 encode 1 len=%d\n",
459*897907ceSGordon Ross 		    mbc.chain_offset);
460*897907ceSGordon Ross 		goto out;
461*897907ceSGordon Ross 	}
462*897907ceSGordon Ross 
463*897907ceSGordon Ross 	rc = smb_mbc_encodef(&mbc2, "s", "two");
464*897907ceSGordon Ross 	if (rc != 0) {
465*897907ceSGordon Ross 		printf("Fail: mbm_put_mbuf1 encode 2 rc=%d\n", rc);
466*897907ceSGordon Ross 		goto out;
467*897907ceSGordon Ross 	}
468*897907ceSGordon Ross 	if (mbc2.chain_offset != 4) {
469*897907ceSGordon Ross 		printf("Fail: mbm_put_mbuf1 encode 2 len=%d\n",
470*897907ceSGordon Ross 		    mbc.chain_offset);
471*897907ceSGordon Ross 		goto out;
472*897907ceSGordon Ross 	}
473*897907ceSGordon Ross 
474*897907ceSGordon Ross 	/* Append */
475*897907ceSGordon Ross 	rc = smb_mbc_encodef(&mbc, "m", mbc2.chain);
476*897907ceSGordon Ross 	mbc2.chain = NULL;
477*897907ceSGordon Ross 	if (rc != 0) {
478*897907ceSGordon Ross 		printf("Fail: mbm_put_mbuf1 encode 3 rc=%d\n", rc);
479*897907ceSGordon Ross 		goto out;
480*897907ceSGordon Ross 	}
481*897907ceSGordon Ross 	if (mbc.chain_offset != 7) {
482*897907ceSGordon Ross 		printf("Fail: mbm_put_mbuf1 encode 3 len=%d\n",
483*897907ceSGordon Ross 		    mbc.chain_offset);
484*897907ceSGordon Ross 		goto out;
485*897907ceSGordon Ross 	}
486*897907ceSGordon Ross 
487*897907ceSGordon Ross 	if (memcmp(mbc.chain->m_data, wire, 7)) {
488*897907ceSGordon Ross 		printf("Fail: mbm_put_mbuf1 cmp:\n");
489*897907ceSGordon Ross 		hexdump((uchar_t *)mbc.chain->m_data, 7);
490*897907ceSGordon Ross 		goto out;
491*897907ceSGordon Ross 	}
492*897907ceSGordon Ross 
493*897907ceSGordon Ross 	printf("Pass: mbm_put_mbuf1\n");
494*897907ceSGordon Ross 
495*897907ceSGordon Ross out:
496*897907ceSGordon Ross 	MBC_FLUSH(&mbc);
497*897907ceSGordon Ross 	MBC_FLUSH(&mbc2);
498*897907ceSGordon Ross }
499*897907ceSGordon Ross 
500*897907ceSGordon Ross /*
501*897907ceSGordon Ross  * Verify m_prepend works
502*897907ceSGordon Ross  */
503*897907ceSGordon Ross static void
mbm_put_mbuf2()504*897907ceSGordon Ross mbm_put_mbuf2()
505*897907ceSGordon Ross {
506*897907ceSGordon Ross 	uint8_t wire[] = "one.two";
507*897907ceSGordon Ross 	mbuf_chain_t mbc;
508*897907ceSGordon Ross 	mbuf_t *m;
509*897907ceSGordon Ross 	int len, rc;
510*897907ceSGordon Ross 
511*897907ceSGordon Ross 	MBC_INIT(&mbc, 512);
512*897907ceSGordon Ross 
513*897907ceSGordon Ross 	rc = smb_mbc_encodef(&mbc, "s", "two");
514*897907ceSGordon Ross 	if (rc != 0) {
515*897907ceSGordon Ross 		printf("Fail: mbm_put_mbuf2 encode 1 rc=%d\n", rc);
516*897907ceSGordon Ross 		goto out;
517*897907ceSGordon Ross 	}
518*897907ceSGordon Ross 	if (mbc.chain_offset != 4) {
519*897907ceSGordon Ross 		printf("Fail: mbm_put_mbuf2 encode 1 len=%d\n",
520*897907ceSGordon Ross 		    mbc.chain_offset);
521*897907ceSGordon Ross 		goto out;
522*897907ceSGordon Ross 	}
523*897907ceSGordon Ross 
524*897907ceSGordon Ross 	/* Prepend.  Should use prepend space, not allocate. */
525*897907ceSGordon Ross 	m = m_prepend(mbc.chain, 4, M_WAIT);
526*897907ceSGordon Ross 	if (m != mbc.chain) {
527*897907ceSGordon Ross 		(void) m_free(m);
528*897907ceSGordon Ross 		printf("Fail: mbm_put_mbuf2 m_prepend error\n", rc);
529*897907ceSGordon Ross 		goto out;
530*897907ceSGordon Ross 	}
531*897907ceSGordon Ross 
532*897907ceSGordon Ross 	/* Now write into the prepend space. */
533*897907ceSGordon Ross 	bcopy("one.", m->m_data, 4);
534*897907ceSGordon Ross 
535*897907ceSGordon Ross 	/* Verify length and content */
536*897907ceSGordon Ross 	len = MBC_LENGTH(&mbc);
537*897907ceSGordon Ross 	if (len != 8) {
538*897907ceSGordon Ross 		printf("Fail: mbm_put_mbuf2 encode 2 len=%d\n",
539*897907ceSGordon Ross 		    mbc.chain_offset);
540*897907ceSGordon Ross 		goto out;
541*897907ceSGordon Ross 	}
542*897907ceSGordon Ross 
543*897907ceSGordon Ross 	if (memcmp(mbc.chain->m_data, wire, 7)) {
544*897907ceSGordon Ross 		printf("Fail: mbm_put_mbuf2 cmp:\n");
545*897907ceSGordon Ross 		hexdump((uchar_t *)mbc.chain->m_data, 7);
546*897907ceSGordon Ross 		goto out;
547*897907ceSGordon Ross 	}
548*897907ceSGordon Ross 
549*897907ceSGordon Ross 	printf("Pass: mbm_put_mbuf2\n");
550*897907ceSGordon Ross 
551*897907ceSGordon Ross out:
552*897907ceSGordon Ross 	MBC_FLUSH(&mbc);
553*897907ceSGordon Ross }
554*897907ceSGordon Ross 
555*897907ceSGordon Ross /*
556*897907ceSGordon Ross  * Check how mbc_marshal_make_room crosses a message boundary
557*897907ceSGordon Ross  */
558*897907ceSGordon Ross static void
mbm_put_mbuf3()559*897907ceSGordon Ross mbm_put_mbuf3()
560*897907ceSGordon Ross {
561*897907ceSGordon Ross 	mbuf_chain_t mbc;
562*897907ceSGordon Ross 	mbuf_t *m;
563*897907ceSGordon Ross 	char *p;
564*897907ceSGordon Ross 	int rc;
565*897907ceSGordon Ross 
566*897907ceSGordon Ross 	MBC_INIT(&mbc, 16384);
567*897907ceSGordon Ross 
568*897907ceSGordon Ross 	/*
569*897907ceSGordon Ross 	 * Encode near the end of the first mbuf
570*897907ceSGordon Ross 	 * running over into the second.
571*897907ceSGordon Ross 	 */
572*897907ceSGordon Ross 	m = mbc.chain;
573*897907ceSGordon Ross 	mbc.chain_offset = M_TRAILINGSPACE(m) - 4;
574*897907ceSGordon Ross 	rc = smb_mbc_encodef(&mbc, "s", "one.two");
575*897907ceSGordon Ross 	if (rc != 0) {
576*897907ceSGordon Ross 		printf("Fail: mbm_put_mbuf3 encode 1 rc=%d\n", rc);
577*897907ceSGordon Ross 		goto out;
578*897907ceSGordon Ross 	}
579*897907ceSGordon Ross 
580*897907ceSGordon Ross 	/* Verify first segment */
581*897907ceSGordon Ross 	p = m->m_data + m->m_len - 4;
582*897907ceSGordon Ross 	if (memcmp(p, "one.", 4)) {
583*897907ceSGordon Ross 		printf("Fail: mbm_put_mbuf3 cmp1:\n");
584*897907ceSGordon Ross 		hexdump((uchar_t *)p, 4);
585*897907ceSGordon Ross 		goto out;
586*897907ceSGordon Ross 	}
587*897907ceSGordon Ross 
588*897907ceSGordon Ross 	/* Verify second segment */
589*897907ceSGordon Ross 	p = m->m_next->m_data;
590*897907ceSGordon Ross 	if (memcmp(p, "two", 4)) {
591*897907ceSGordon Ross 		printf("Fail: mbm_put_mbuf3 cmp2:\n");
592*897907ceSGordon Ross 		hexdump((uchar_t *)p, 4);
593*897907ceSGordon Ross 		goto out;
594*897907ceSGordon Ross 	}
595*897907ceSGordon Ross 
596*897907ceSGordon Ross 	printf("Pass: mbm_put_mbuf3\n");
597*897907ceSGordon Ross 
598*897907ceSGordon Ross out:
599*897907ceSGordon Ross 	MBC_FLUSH(&mbc);
600*897907ceSGordon Ross }
601*897907ceSGordon Ross 
6027d1ffc32SGordon Ross /*
6037d1ffc32SGordon Ross  * Parse an ascii string.
6047d1ffc32SGordon Ross  */
6057d1ffc32SGordon Ross static void
mbm_get_a0()6067d1ffc32SGordon Ross mbm_get_a0()
6077d1ffc32SGordon Ross {
6087d1ffc32SGordon Ross 	uint8_t wire[] = { 'o', 'n', 'e', 0, 42, 0 };
6097d1ffc32SGordon Ross 	mbuf_chain_t mbc;
6107d1ffc32SGordon Ross 	char *s;
6117d1ffc32SGordon Ross 	int rc;
6127d1ffc32SGordon Ross 	uint16_t w;
6137d1ffc32SGordon Ross 
6147d1ffc32SGordon Ross 	bzero(&mbc, sizeof (mbc));
6157d1ffc32SGordon Ross 	MBC_ATTACH_BUF(&mbc, (uchar_t *)wire, sizeof (wire));
6167d1ffc32SGordon Ross 
6177d1ffc32SGordon Ross 	rc = smb_mbc_decodef(&mbc, "%sw", &test_sr, &s, &w);
6187d1ffc32SGordon Ross 	if (rc != 0) {
6197d1ffc32SGordon Ross 		printf("Fail: mbm_get_a0 decode\n");
6207d1ffc32SGordon Ross 		goto out;
6217d1ffc32SGordon Ross 	}
6227d1ffc32SGordon Ross 	/*
6237d1ffc32SGordon Ross 	 * Decode a word after the string to make sure we
6247d1ffc32SGordon Ross 	 * end up positioned correctly after the string.
6257d1ffc32SGordon Ross 	 */
6267d1ffc32SGordon Ross 	if (w != 42) {
6277d1ffc32SGordon Ross 		printf("Fail: mbm_get_a0 w=%d\n", w);
6287d1ffc32SGordon Ross 		return;
6297d1ffc32SGordon Ross 	}
6307d1ffc32SGordon Ross 	if (strcmp(s, "one") != 0) {
6317d1ffc32SGordon Ross 		printf("Fail: mbm_get_a0 cmp: <%s>\n", s);
6327d1ffc32SGordon Ross 		return;
6337d1ffc32SGordon Ross 	}
6347d1ffc32SGordon Ross 
6357d1ffc32SGordon Ross 	printf("Pass: mbm_get_a0\n");
6367d1ffc32SGordon Ross 
6377d1ffc32SGordon Ross out:
6387d1ffc32SGordon Ross 	MBC_FLUSH(&mbc);
6397d1ffc32SGordon Ross }
6407d1ffc32SGordon Ross 
6417d1ffc32SGordon Ross /*
6427d1ffc32SGordon Ross  * Parse an ascii string, no NULL
6437d1ffc32SGordon Ross  */
6447d1ffc32SGordon Ross static void
mbm_get_a1()6457d1ffc32SGordon Ross mbm_get_a1()
6467d1ffc32SGordon Ross {
6477d1ffc32SGordon Ross 	uint8_t wire[] = { 'o', 'n', 'e', '.', 42, 0 };
6487d1ffc32SGordon Ross 	mbuf_chain_t mbc;
6497d1ffc32SGordon Ross 	char *s;
6507d1ffc32SGordon Ross 	int rc;
6517d1ffc32SGordon Ross 	uint16_t w;
6527d1ffc32SGordon Ross 
6537d1ffc32SGordon Ross 	bzero(&mbc, sizeof (mbc));
6547d1ffc32SGordon Ross 	MBC_ATTACH_BUF(&mbc, (uchar_t *)wire, sizeof (wire));
6557d1ffc32SGordon Ross 
6567d1ffc32SGordon Ross 	rc = smb_mbc_decodef(&mbc, "%3s.w", &test_sr, &s, &w);
6577d1ffc32SGordon Ross 	if (rc != 0) {
6587d1ffc32SGordon Ross 		printf("Fail: mbm_get_a1 decode\n");
6597d1ffc32SGordon Ross 		goto out;
6607d1ffc32SGordon Ross 	}
6617d1ffc32SGordon Ross 	/*
6627d1ffc32SGordon Ross 	 * Decode a word after the string to make sure we
6637d1ffc32SGordon Ross 	 * end up positioned correctly after the string.
6647d1ffc32SGordon Ross 	 */
6657d1ffc32SGordon Ross 	if (w != 42) {
6667d1ffc32SGordon Ross 		printf("Fail: mbm_get_a1 w=%d\n", w);
6677d1ffc32SGordon Ross 		return;
6687d1ffc32SGordon Ross 	}
6697d1ffc32SGordon Ross 	if (strcmp(s, "one") != 0) {
6707d1ffc32SGordon Ross 		printf("Fail: mbm_get_a1 cmp: <%s>\n", s);
6717d1ffc32SGordon Ross 		return;
6727d1ffc32SGordon Ross 	}
6737d1ffc32SGordon Ross 
6747d1ffc32SGordon Ross 	printf("Pass: mbm_get_a1\n");
6757d1ffc32SGordon Ross 
6767d1ffc32SGordon Ross out:
6777d1ffc32SGordon Ross 	MBC_FLUSH(&mbc);
6787d1ffc32SGordon Ross }
6797d1ffc32SGordon Ross 
6807d1ffc32SGordon Ross /* parse exactly to end of data */
6817d1ffc32SGordon Ross static void
mbm_get_a2()6827d1ffc32SGordon Ross mbm_get_a2()
6837d1ffc32SGordon Ross {
6847d1ffc32SGordon Ross 	uint8_t wire[] = { 'o', 'n', 'e' };
6857d1ffc32SGordon Ross 	mbuf_chain_t mbc;
6867d1ffc32SGordon Ross 	char *s;
6877d1ffc32SGordon Ross 	int rc;
6887d1ffc32SGordon Ross 
6897d1ffc32SGordon Ross 	bzero(&mbc, sizeof (mbc));
6907d1ffc32SGordon Ross 	MBC_ATTACH_BUF(&mbc, (uchar_t *)wire, sizeof (wire));
6917d1ffc32SGordon Ross 
6927d1ffc32SGordon Ross 	rc = smb_mbc_decodef(&mbc, "%3s", &test_sr, &s);
6937d1ffc32SGordon Ross 	if (rc != 0) {
6947d1ffc32SGordon Ross 		printf("Fail: mbm_get_a2 decode\n");
6957d1ffc32SGordon Ross 		goto out;
6967d1ffc32SGordon Ross 	}
6977d1ffc32SGordon Ross 	if (mbc.chain_offset != 3) {
6987d1ffc32SGordon Ross 		printf("Fail: mbm_get_a2 wrong pos\n");
6997d1ffc32SGordon Ross 		return;
7007d1ffc32SGordon Ross 	}
7017d1ffc32SGordon Ross 	if (strcmp(s, "one") != 0) {
7027d1ffc32SGordon Ross 		printf("Fail: mbm_get_a2 cmp: <%s>\n", s);
7037d1ffc32SGordon Ross 		return;
7047d1ffc32SGordon Ross 	}
7057d1ffc32SGordon Ross 
7067d1ffc32SGordon Ross 	printf("Pass: mbm_get_a2\n");
7077d1ffc32SGordon Ross 
7087d1ffc32SGordon Ross out:
7097d1ffc32SGordon Ross 	MBC_FLUSH(&mbc);
7107d1ffc32SGordon Ross }
7117d1ffc32SGordon Ross 
7127d1ffc32SGordon Ross /*
7137d1ffc32SGordon Ross  * Parse a unicode string.
7147d1ffc32SGordon Ross  */
7157d1ffc32SGordon Ross static void
mbm_get_u0()7167d1ffc32SGordon Ross mbm_get_u0()
7177d1ffc32SGordon Ross {
7187d1ffc32SGordon Ross 	uint16_t wire[] = { 'o', 'n', 'e', 0, 42, 0 };
7197d1ffc32SGordon Ross 	mbuf_chain_t mbc;
7207d1ffc32SGordon Ross 	char *s;
7217d1ffc32SGordon Ross 	int rc;
7227d1ffc32SGordon Ross 	uint16_t w;
7237d1ffc32SGordon Ross 
7247d1ffc32SGordon Ross 	bzero(&mbc, sizeof (mbc));
7257d1ffc32SGordon Ross 	MBC_ATTACH_BUF(&mbc, (uchar_t *)wire, sizeof (wire));
7267d1ffc32SGordon Ross 
7277d1ffc32SGordon Ross 	rc = smb_mbc_decodef(&mbc, "%Uw", &test_sr, &s, &w);
7287d1ffc32SGordon Ross 	if (rc != 0) {
7297d1ffc32SGordon Ross 		printf("Fail: mbm_get_u0 decode\n");
7307d1ffc32SGordon Ross 		goto out;
7317d1ffc32SGordon Ross 	}
7327d1ffc32SGordon Ross 	/*
7337d1ffc32SGordon Ross 	 * Decode a word after the string to make sure we
7347d1ffc32SGordon Ross 	 * end up positioned correctly after the string.
7357d1ffc32SGordon Ross 	 */
7367d1ffc32SGordon Ross 	if (w != 42) {
7377d1ffc32SGordon Ross 		printf("Fail: mbm_get_u0 w=%d\n", w);
7387d1ffc32SGordon Ross 		return;
7397d1ffc32SGordon Ross 	}
7407d1ffc32SGordon Ross 	if (strcmp(s, "one") != 0) {
7417d1ffc32SGordon Ross 		printf("Fail: mbm_get_u0 cmp: <%s>\n", s);
7427d1ffc32SGordon Ross 		return;
7437d1ffc32SGordon Ross 	}
7447d1ffc32SGordon Ross 
7457d1ffc32SGordon Ross 	printf("Pass: mbm_get_u0\n");
7467d1ffc32SGordon Ross 
7477d1ffc32SGordon Ross out:
7487d1ffc32SGordon Ross 	MBC_FLUSH(&mbc);
7497d1ffc32SGordon Ross }
7507d1ffc32SGordon Ross 
7517d1ffc32SGordon Ross /*
7527d1ffc32SGordon Ross  * Parse a string that's NOT null terminated.
7537d1ffc32SGordon Ross  */
7547d1ffc32SGordon Ross static void
mbm_get_u1()7557d1ffc32SGordon Ross mbm_get_u1()
7567d1ffc32SGordon Ross {
7577d1ffc32SGordon Ross 	uint16_t wire[] = { 'o', 'n', 'e', '.', 42, 0 };
7587d1ffc32SGordon Ross 	mbuf_chain_t mbc;
7597d1ffc32SGordon Ross 	char *s;
7607d1ffc32SGordon Ross 	int rc;
7617d1ffc32SGordon Ross 	uint16_t w;
7627d1ffc32SGordon Ross 
7637d1ffc32SGordon Ross 	bzero(&mbc, sizeof (mbc));
7647d1ffc32SGordon Ross 	MBC_ATTACH_BUF(&mbc, (uchar_t *)wire, sizeof (wire));
7657d1ffc32SGordon Ross 
7667d1ffc32SGordon Ross 	rc = smb_mbc_decodef(&mbc, "%6U..w", &test_sr, &s, &w);
7677d1ffc32SGordon Ross 	if (rc != 0) {
7687d1ffc32SGordon Ross 		printf("Fail: mbm_get_u1 decode\n");
7697d1ffc32SGordon Ross 		goto out;
7707d1ffc32SGordon Ross 	}
7717d1ffc32SGordon Ross 	/*
7727d1ffc32SGordon Ross 	 * Decode a word after the string to make sure we
7737d1ffc32SGordon Ross 	 * end up positioned correctly after the string.
7747d1ffc32SGordon Ross 	 */
7757d1ffc32SGordon Ross 	if (w != 42) {
7767d1ffc32SGordon Ross 		printf("Fail: mbm_get_u1 w=%d\n", w);
7777d1ffc32SGordon Ross 		return;
7787d1ffc32SGordon Ross 	}
7797d1ffc32SGordon Ross 	if (strcmp(s, "one") != 0) {
7807d1ffc32SGordon Ross 		printf("Fail: mbm_get_u1 cmp: <%s>\n", s);
7817d1ffc32SGordon Ross 		return;
7827d1ffc32SGordon Ross 	}
7837d1ffc32SGordon Ross 
7847d1ffc32SGordon Ross 	printf("Pass: mbm_get_u1\n");
7857d1ffc32SGordon Ross 
7867d1ffc32SGordon Ross out:
7877d1ffc32SGordon Ross 	MBC_FLUSH(&mbc);
7887d1ffc32SGordon Ross }
7897d1ffc32SGordon Ross 
7907d1ffc32SGordon Ross /* parse exactly to end of data */
7917d1ffc32SGordon Ross static void
mbm_get_u2()7927d1ffc32SGordon Ross mbm_get_u2()
7937d1ffc32SGordon Ross {
7947d1ffc32SGordon Ross 	uint16_t wire[] = { 't', 'w', 'o' };
7957d1ffc32SGordon Ross 	mbuf_chain_t mbc;
7967d1ffc32SGordon Ross 	char *s;
7977d1ffc32SGordon Ross 	int rc;
7987d1ffc32SGordon Ross 
7997d1ffc32SGordon Ross 	bzero(&mbc, sizeof (mbc));
8007d1ffc32SGordon Ross 	MBC_ATTACH_BUF(&mbc, (uchar_t *)wire, sizeof (wire));
8017d1ffc32SGordon Ross 
8027d1ffc32SGordon Ross 	rc = smb_mbc_decodef(&mbc, "%6U", &test_sr, &s);
8037d1ffc32SGordon Ross 	if (rc != 0) {
8047d1ffc32SGordon Ross 		printf("Fail: mbm_get_u2 decode\n");
8057d1ffc32SGordon Ross 		goto out;
8067d1ffc32SGordon Ross 	}
8077d1ffc32SGordon Ross 	if (mbc.chain_offset != 6) {
8087d1ffc32SGordon Ross 		printf("Fail: mbm_get_u2 wrong pos\n");
8097d1ffc32SGordon Ross 		return;
8107d1ffc32SGordon Ross 	}
8117d1ffc32SGordon Ross 	if (strcmp(s, "two") != 0) {
8127d1ffc32SGordon Ross 		printf("Fail: mbm_get_u2 cmp: <%s>\n", s);
8137d1ffc32SGordon Ross 		return;
8147d1ffc32SGordon Ross 	}
8157d1ffc32SGordon Ross 
8167d1ffc32SGordon Ross 	printf("Pass: mbm_get_a2\n");
8177d1ffc32SGordon Ross 
8187d1ffc32SGordon Ross out:
8197d1ffc32SGordon Ross 	MBC_FLUSH(&mbc);
8207d1ffc32SGordon Ross }
8217d1ffc32SGordon Ross 
8227d1ffc32SGordon Ross static void
mbm_get_u3()8237d1ffc32SGordon Ross mbm_get_u3()
8247d1ffc32SGordon Ross {
8257d1ffc32SGordon Ross 	mbuf_chain_t mbc;
8267d1ffc32SGordon Ross 	char *s;
8277d1ffc32SGordon Ross 	int rc;
8287d1ffc32SGordon Ross 
8297d1ffc32SGordon Ross 	bzero(&mbc, sizeof (mbc));
8307d1ffc32SGordon Ross 	MBC_ATTACH_BUF(&mbc, (uchar_t *)wcsa, sizeof (wcsa));
8317d1ffc32SGordon Ross 
8327d1ffc32SGordon Ross 	rc = smb_mbc_decodef(&mbc, "%#U", &test_sr, sizeof (wcsa), &s);
8337d1ffc32SGordon Ross 	if (rc != 0) {
8347d1ffc32SGordon Ross 		printf("Fail: mbm_get_u3 decode\n");
8357d1ffc32SGordon Ross 		goto out;
8367d1ffc32SGordon Ross 	}
8377d1ffc32SGordon Ross 	if (strcmp(s, mbsa) != 0) {
8387d1ffc32SGordon Ross 		printf("Fail: mbm_get_u3 cmp: <%s>\n", s);
8397d1ffc32SGordon Ross 		return;
8407d1ffc32SGordon Ross 	}
8417d1ffc32SGordon Ross 
8427d1ffc32SGordon Ross 	printf("Pass: mbm_get_u3\n");
8437d1ffc32SGordon Ross 
8447d1ffc32SGordon Ross out:
8457d1ffc32SGordon Ross 	MBC_FLUSH(&mbc);
8467d1ffc32SGordon Ross }
8477d1ffc32SGordon Ross 
8487d1ffc32SGordon Ross static void
mbm_get_u4()8497d1ffc32SGordon Ross mbm_get_u4()
8507d1ffc32SGordon Ross {
8517d1ffc32SGordon Ross 	mbuf_chain_t mbc;
8527d1ffc32SGordon Ross 	char *s;
8537d1ffc32SGordon Ross 	int rc;
8547d1ffc32SGordon Ross 
8557d1ffc32SGordon Ross 	bzero(&mbc, sizeof (mbc));
8567d1ffc32SGordon Ross 	MBC_ATTACH_BUF(&mbc, (uchar_t *)wcsp, sizeof (wcsp));
8577d1ffc32SGordon Ross 
8587d1ffc32SGordon Ross 	rc = smb_mbc_decodef(&mbc, "%#U", &test_sr, sizeof (wcsp), &s);
8597d1ffc32SGordon Ross 	if (rc != 0) {
8607d1ffc32SGordon Ross 		printf("Fail: mbm_get_u4 decode\n");
8617d1ffc32SGordon Ross 		goto out;
8627d1ffc32SGordon Ross 	}
8637d1ffc32SGordon Ross 	if (strcmp(s, mbsp) != 0) {
8647d1ffc32SGordon Ross 		printf("Fail: mbm_get_u4 cmp: <%s>\n", s);
8657d1ffc32SGordon Ross 		return;
8667d1ffc32SGordon Ross 	}
8677d1ffc32SGordon Ross 
8687d1ffc32SGordon Ross 	printf("Pass: mbm_get_u4\n");
8697d1ffc32SGordon Ross 
8707d1ffc32SGordon Ross out:
8717d1ffc32SGordon Ross 	MBC_FLUSH(&mbc);
8727d1ffc32SGordon Ross }
8737d1ffc32SGordon Ross 
8747d1ffc32SGordon Ross void
test_mbmarshal()8757d1ffc32SGordon Ross test_mbmarshal()
8767d1ffc32SGordon Ross {
8777d1ffc32SGordon Ross 
8787d1ffc32SGordon Ross 	smb_mbc_init();
8797d1ffc32SGordon Ross 
8807d1ffc32SGordon Ross 	test_ssn.dialect = 0x210;	// SMB 2.1
8817d1ffc32SGordon Ross 	test_sr.session = &test_ssn;
8827d1ffc32SGordon Ross 	test_sr.sr_magic = SMB_REQ_MAGIC;
8837d1ffc32SGordon Ross 	smb_srm_init(&test_sr);
8847d1ffc32SGordon Ross 
8857d1ffc32SGordon Ross 	mbm_put_a0();
8867d1ffc32SGordon Ross 	mbm_put_a1();
8877d1ffc32SGordon Ross 	mbm_put_apad();
88825a9a7aaSGordon Ross 	mbm_put_atrunc1();
88925a9a7aaSGordon Ross 	mbm_put_atrunc2();
8907d1ffc32SGordon Ross 
8917d1ffc32SGordon Ross 	mbm_put_u0();
8927d1ffc32SGordon Ross 	mbm_put_u1();
8937d1ffc32SGordon Ross 	mbm_put_u3();
8947d1ffc32SGordon Ross 	mbm_put_u4();
8957d1ffc32SGordon Ross 	mbm_put_upad();
89625a9a7aaSGordon Ross 	mbm_put_utrunc1();
89725a9a7aaSGordon Ross 	mbm_put_utrunc2();
8987d1ffc32SGordon Ross 
899*897907ceSGordon Ross 	mbm_put_mbuf1();
900*897907ceSGordon Ross 	mbm_put_mbuf2();
901*897907ceSGordon Ross 	mbm_put_mbuf3();
902*897907ceSGordon Ross 
9037d1ffc32SGordon Ross 	mbm_get_a0();
9047d1ffc32SGordon Ross 	mbm_get_a1();
9057d1ffc32SGordon Ross 	mbm_get_a2();
9067d1ffc32SGordon Ross 	mbm_get_u0();
9077d1ffc32SGordon Ross 	mbm_get_u1();
9087d1ffc32SGordon Ross 	mbm_get_u2();
9097d1ffc32SGordon Ross 	mbm_get_u3();
9107d1ffc32SGordon Ross 	mbm_get_u4();
9117d1ffc32SGordon Ross 
9127d1ffc32SGordon Ross 	smb_srm_fini(&test_sr);
9137d1ffc32SGordon Ross 	smb_mbc_fini();
9147d1ffc32SGordon Ross }
915