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*25a9a7aaSGordon Ross  * Copyright 2019 Nexenta 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 /*
367d1ffc32SGordon Ross  * Put ASCII string with NULL
377d1ffc32SGordon Ross  */
387d1ffc32SGordon Ross static void
msg_put_a0()397d1ffc32SGordon Ross msg_put_a0()
407d1ffc32SGordon Ross {
417d1ffc32SGordon Ross 	uint8_t wire[] = { 'o', 'n', 'e', 0, 42, 0 };
427d1ffc32SGordon Ross 	uint8_t temp[32];
437d1ffc32SGordon Ross 	smb_msgbuf_t mb;
447d1ffc32SGordon Ross 	int mbflags = 0;
457d1ffc32SGordon Ross 	int rc;
467d1ffc32SGordon Ross 
477d1ffc32SGordon Ross 	smb_msgbuf_init(&mb, temp, sizeof (temp), mbflags);
487d1ffc32SGordon Ross 
497d1ffc32SGordon Ross 	rc = smb_msgbuf_encode(&mb, "sw", "one", 42);
507d1ffc32SGordon Ross 	if (rc != 6) {
517d1ffc32SGordon Ross 		printf("Fail: msg_put_a0 encode\n");
527d1ffc32SGordon Ross 		goto out;
537d1ffc32SGordon Ross 	}
547d1ffc32SGordon Ross 
557d1ffc32SGordon Ross 	if (memcmp(temp, wire, 6)) {
567d1ffc32SGordon Ross 		printf("Fail: msg_put_a0 cmp:\n");
577d1ffc32SGordon Ross 		hexdump((uchar_t *)temp, 6);
587d1ffc32SGordon Ross 		return;
597d1ffc32SGordon Ross 	}
607d1ffc32SGordon Ross 
617d1ffc32SGordon Ross 	printf("Pass: msg_put_a0\n");
627d1ffc32SGordon Ross 
637d1ffc32SGordon Ross out:
647d1ffc32SGordon Ross 	smb_msgbuf_term(&mb);
657d1ffc32SGordon Ross }
667d1ffc32SGordon Ross 
677d1ffc32SGordon Ross /*
687d1ffc32SGordon Ross  * Put ASCII string, no NULL
697d1ffc32SGordon Ross  */
707d1ffc32SGordon Ross static void
msg_put_a1()717d1ffc32SGordon Ross msg_put_a1()
727d1ffc32SGordon Ross {
737d1ffc32SGordon Ross 	uint8_t wire[] = { 'o', 'n', 'e', '.', 42, 0 };
747d1ffc32SGordon Ross 	uint8_t temp[32];
757d1ffc32SGordon Ross 	smb_msgbuf_t mb;
767d1ffc32SGordon Ross 	int mbflags = 0;
777d1ffc32SGordon Ross 	int rc;
787d1ffc32SGordon Ross 
797d1ffc32SGordon Ross 	smb_msgbuf_init(&mb, temp, sizeof (temp), mbflags);
807d1ffc32SGordon Ross 
817d1ffc32SGordon Ross 	rc = smb_msgbuf_encode(&mb, "4sw", "one.", 42);
827d1ffc32SGordon Ross 	if (rc != 6) {
837d1ffc32SGordon Ross 		printf("Fail: msg_put_a1 encode\n");
847d1ffc32SGordon Ross 		goto out;
857d1ffc32SGordon Ross 	}
867d1ffc32SGordon Ross 
877d1ffc32SGordon Ross 	if (memcmp(temp, wire, 6)) {
887d1ffc32SGordon Ross 		printf("Fail: msg_put_a1 cmp:\n");
897d1ffc32SGordon Ross 		hexdump((uchar_t *)temp, 6);
907d1ffc32SGordon Ross 		return;
917d1ffc32SGordon Ross 	}
927d1ffc32SGordon Ross 
937d1ffc32SGordon Ross 	printf("Pass: msg_put_a1\n");
947d1ffc32SGordon Ross 
957d1ffc32SGordon Ross out:
967d1ffc32SGordon Ross 	smb_msgbuf_term(&mb);
977d1ffc32SGordon Ross }
987d1ffc32SGordon Ross 
997d1ffc32SGordon Ross static void
msg_put_apad()1007d1ffc32SGordon Ross msg_put_apad()
1017d1ffc32SGordon Ross {
1027d1ffc32SGordon Ross 	uint8_t wire[] = { 'o', 'n', 'e', 0, 0 };
1037d1ffc32SGordon Ross 	uint8_t temp[32];
1047d1ffc32SGordon Ross 	smb_msgbuf_t mb;
1057d1ffc32SGordon Ross 	int mbflags = 0;
1067d1ffc32SGordon Ross 	int rc;
1077d1ffc32SGordon Ross 
1087d1ffc32SGordon Ross 	smb_msgbuf_init(&mb, temp, sizeof (temp), mbflags);
1097d1ffc32SGordon Ross 
1107d1ffc32SGordon Ross 	/* Encode with wire length > strlen */
1117d1ffc32SGordon Ross 	rc = smb_msgbuf_encode(&mb, "5s", "one");
1127d1ffc32SGordon Ross 	if (rc != 5) {
1137d1ffc32SGordon Ross 		printf("Fail: msg_put_apad encode\n");
1147d1ffc32SGordon Ross 		goto out;
1157d1ffc32SGordon Ross 	}
1167d1ffc32SGordon Ross 
1177d1ffc32SGordon Ross 	if (memcmp(temp, wire, 5)) {
1187d1ffc32SGordon Ross 		printf("Fail: msg_put_apad cmp:\n");
1197d1ffc32SGordon Ross 		hexdump((uchar_t *)temp, 5);
1207d1ffc32SGordon Ross 		return;
1217d1ffc32SGordon Ross 	}
1227d1ffc32SGordon Ross 
1237d1ffc32SGordon Ross 	printf("Pass: msg_put_apad\n");
1247d1ffc32SGordon Ross 
1257d1ffc32SGordon Ross out:
1267d1ffc32SGordon Ross 	smb_msgbuf_term(&mb);
1277d1ffc32SGordon Ross }
1287d1ffc32SGordon Ross 
1297d1ffc32SGordon Ross static void
msg_put_atrunc1()130*25a9a7aaSGordon Ross msg_put_atrunc1()
1317d1ffc32SGordon Ross {
1327d1ffc32SGordon Ross 	uint8_t wire[] = { 'o', 'n', 'e', 't', };
1337d1ffc32SGordon Ross 	uint8_t temp[32];
1347d1ffc32SGordon Ross 	smb_msgbuf_t mb;
1357d1ffc32SGordon Ross 	int mbflags = 0;
1367d1ffc32SGordon Ross 	int rc;
1377d1ffc32SGordon Ross 
1387d1ffc32SGordon Ross 	smb_msgbuf_init(&mb, temp, sizeof (temp), mbflags);
1397d1ffc32SGordon Ross 
1407d1ffc32SGordon Ross 	/* Encode with wire length < strlen */
1417d1ffc32SGordon Ross 	rc = smb_msgbuf_encode(&mb, "4s", "onetwo");
1427d1ffc32SGordon Ross 	/* Trunc should put exactly 4 */
1437d1ffc32SGordon Ross 	if (rc != 4) {
144*25a9a7aaSGordon Ross 		printf("Fail: msg_put_atrunc1 encode\n");
1457d1ffc32SGordon Ross 		goto out;
1467d1ffc32SGordon Ross 	}
1477d1ffc32SGordon Ross 
1487d1ffc32SGordon Ross 	if (memcmp(temp, wire, 4)) {
149*25a9a7aaSGordon Ross 		printf("Fail: msg_put_atrunc1 cmp:\n");
1507d1ffc32SGordon Ross 		hexdump((uchar_t *)temp, 4);
1517d1ffc32SGordon Ross 		return;
1527d1ffc32SGordon Ross 	}
1537d1ffc32SGordon Ross 
154*25a9a7aaSGordon Ross 	printf("Pass: msg_put_atrunc1\n");
155*25a9a7aaSGordon Ross 
156*25a9a7aaSGordon Ross out:
157*25a9a7aaSGordon Ross 	smb_msgbuf_term(&mb);
158*25a9a7aaSGordon Ross }
159*25a9a7aaSGordon Ross 
160*25a9a7aaSGordon Ross static void
msg_put_atrunc2()161*25a9a7aaSGordon Ross msg_put_atrunc2()
162*25a9a7aaSGordon Ross {
163*25a9a7aaSGordon Ross 	uint8_t wire[] = { 'o', 'n', 'e', 't', 0};
164*25a9a7aaSGordon Ross 	uint8_t temp[32];
165*25a9a7aaSGordon Ross 	smb_msgbuf_t mb;
166*25a9a7aaSGordon Ross 	int mbflags = 0;
167*25a9a7aaSGordon Ross 	int rc;
168*25a9a7aaSGordon Ross 
169*25a9a7aaSGordon Ross 	(void) memset(temp, 0, sizeof (temp));
170*25a9a7aaSGordon Ross 	smb_msgbuf_init(&mb, temp, 4, mbflags);
171*25a9a7aaSGordon Ross 
172*25a9a7aaSGordon Ross 	/* Encode with wire length < strlen */
173*25a9a7aaSGordon Ross 	rc = smb_msgbuf_encode(&mb, "s", "onetwo");
174*25a9a7aaSGordon Ross 	/* Trunc should return "overflow" */
175*25a9a7aaSGordon Ross 	if (rc != -1) {
176*25a9a7aaSGordon Ross 		printf("Fail: msg_put_atrunc2 encode rc=%d\n", rc);
177*25a9a7aaSGordon Ross 		goto out;
178*25a9a7aaSGordon Ross 	}
179*25a9a7aaSGordon Ross 
180*25a9a7aaSGordon Ross 	if (memcmp(temp, wire, 5)) {
181*25a9a7aaSGordon Ross 		printf("Fail: msg_put_atrunc2 cmp:\n");
182*25a9a7aaSGordon Ross 		hexdump((uchar_t *)temp, 5);
183*25a9a7aaSGordon Ross 		return;
184*25a9a7aaSGordon Ross 	}
185*25a9a7aaSGordon Ross 
186*25a9a7aaSGordon Ross 	printf("Pass: msg_put_atrunc2\n");
1877d1ffc32SGordon Ross 
1887d1ffc32SGordon Ross out:
1897d1ffc32SGordon Ross 	smb_msgbuf_term(&mb);
1907d1ffc32SGordon Ross }
1917d1ffc32SGordon Ross 
1927d1ffc32SGordon Ross /*
1937d1ffc32SGordon Ross  * Put unicode string with NULL
1947d1ffc32SGordon Ross  */
1957d1ffc32SGordon Ross static void
msg_put_u0()1967d1ffc32SGordon Ross msg_put_u0()
1977d1ffc32SGordon Ross {
1987d1ffc32SGordon Ross 	uint16_t wire[] = { 'o', 'n', 'e', 0, 42, 0 };
1997d1ffc32SGordon Ross 	uint8_t temp[32];
2007d1ffc32SGordon Ross 	smb_msgbuf_t mb;
2017d1ffc32SGordon Ross 	int mbflags = 0;
2027d1ffc32SGordon Ross 	int rc;
2037d1ffc32SGordon Ross 
2047d1ffc32SGordon Ross 	smb_msgbuf_init(&mb, temp, sizeof (temp), mbflags);
2057d1ffc32SGordon Ross 
2067d1ffc32SGordon Ross 	rc = smb_msgbuf_encode(&mb, "Uw", "one", 42);
2077d1ffc32SGordon Ross 	if (rc != 10) {
2087d1ffc32SGordon Ross 		printf("Fail: msg_put_u0 encode\n");
2097d1ffc32SGordon Ross 		goto out;
2107d1ffc32SGordon Ross 	}
2117d1ffc32SGordon Ross 
2127d1ffc32SGordon Ross 	if (memcmp(temp, wire, 10)) {
2137d1ffc32SGordon Ross 		printf("Fail: msg_put_u0 cmp:\n");
2147d1ffc32SGordon Ross 		hexdump((uchar_t *)temp, 10);
2157d1ffc32SGordon Ross 		return;
2167d1ffc32SGordon Ross 	}
2177d1ffc32SGordon Ross 
2187d1ffc32SGordon Ross 	printf("Pass: msg_put_u0\n");
2197d1ffc32SGordon Ross 
2207d1ffc32SGordon Ross out:
2217d1ffc32SGordon Ross 	smb_msgbuf_term(&mb);
2227d1ffc32SGordon Ross }
2237d1ffc32SGordon Ross 
2247d1ffc32SGordon Ross /*
2257d1ffc32SGordon Ross  * Put unicode string, no NULL
2267d1ffc32SGordon Ross  */
2277d1ffc32SGordon Ross static void
msg_put_u1()2287d1ffc32SGordon Ross msg_put_u1()
2297d1ffc32SGordon Ross {
2307d1ffc32SGordon Ross 	uint16_t wire[] = { 'o', 'n', 'e', '.', 42, 0 };
2317d1ffc32SGordon Ross 	uint8_t temp[32];
2327d1ffc32SGordon Ross 	smb_msgbuf_t mb;
2337d1ffc32SGordon Ross 	int mbflags = 0;
2347d1ffc32SGordon Ross 	int rc;
2357d1ffc32SGordon Ross 
2367d1ffc32SGordon Ross 	smb_msgbuf_init(&mb, temp, sizeof (temp), mbflags);
2377d1ffc32SGordon Ross 
2387d1ffc32SGordon Ross 	rc = smb_msgbuf_encode(&mb, "8Uw", "one.", 42);
2397d1ffc32SGordon Ross 	if (rc != 10) {
2407d1ffc32SGordon Ross 		printf("Fail: msg_put_u1 encode\n");
2417d1ffc32SGordon Ross 		goto out;
2427d1ffc32SGordon Ross 	}
2437d1ffc32SGordon Ross 
2447d1ffc32SGordon Ross 	if (memcmp(temp, wire, 10)) {
2457d1ffc32SGordon Ross 		printf("Fail: msg_put_u1 cmp:\n");
2467d1ffc32SGordon Ross 		hexdump((uchar_t *)temp, 10);
2477d1ffc32SGordon Ross 		return;
2487d1ffc32SGordon Ross 	}
2497d1ffc32SGordon Ross 
2507d1ffc32SGordon Ross 	printf("Pass: msg_put_u1\n");
2517d1ffc32SGordon Ross 
2527d1ffc32SGordon Ross out:
2537d1ffc32SGordon Ross 	smb_msgbuf_term(&mb);
2547d1ffc32SGordon Ross }
2557d1ffc32SGordon Ross 
2567d1ffc32SGordon Ross static void
msg_put_u3()2577d1ffc32SGordon Ross msg_put_u3()
2587d1ffc32SGordon Ross {
2597d1ffc32SGordon Ross 	uint8_t temp[32];
2607d1ffc32SGordon Ross 	smb_msgbuf_t mb;
2617d1ffc32SGordon Ross 	int mbflags = 0;
2627d1ffc32SGordon Ross 	int rc;
2637d1ffc32SGordon Ross 
2647d1ffc32SGordon Ross 	smb_msgbuf_init(&mb, temp, sizeof (temp), mbflags);
2657d1ffc32SGordon Ross 
2667d1ffc32SGordon Ross 	rc = smb_msgbuf_encode(&mb, "U", mbsa);
2677d1ffc32SGordon Ross 	if (rc != 8) {
2687d1ffc32SGordon Ross 		printf("Fail: msg_put_u3 encode\n");
2697d1ffc32SGordon Ross 		goto out;
2707d1ffc32SGordon Ross 	}
2717d1ffc32SGordon Ross 
2727d1ffc32SGordon Ross 	if (memcmp(temp, wcsa, 8)) {
2737d1ffc32SGordon Ross 		printf("Fail: msg_put_u3 cmp:\n");
2747d1ffc32SGordon Ross 		hexdump((uchar_t *)temp, 8);
2757d1ffc32SGordon Ross 		return;
2767d1ffc32SGordon Ross 	}
2777d1ffc32SGordon Ross 
2787d1ffc32SGordon Ross 	printf("Pass: msg_put_u3\n");
2797d1ffc32SGordon Ross 
2807d1ffc32SGordon Ross out:
2817d1ffc32SGordon Ross 	smb_msgbuf_term(&mb);
2827d1ffc32SGordon Ross }
2837d1ffc32SGordon Ross 
2847d1ffc32SGordon Ross static void
msg_put_u4()2857d1ffc32SGordon Ross msg_put_u4()
2867d1ffc32SGordon Ross {
2877d1ffc32SGordon Ross 	uint8_t temp[32];
2887d1ffc32SGordon Ross 	smb_msgbuf_t mb;
2897d1ffc32SGordon Ross 	int mbflags = 0;
2907d1ffc32SGordon Ross 	int rc;
2917d1ffc32SGordon Ross 
2927d1ffc32SGordon Ross 	smb_msgbuf_init(&mb, temp, sizeof (temp), mbflags);
2937d1ffc32SGordon Ross 
2947d1ffc32SGordon Ross 	rc = smb_msgbuf_encode(&mb, "U", mbsp);
2957d1ffc32SGordon Ross 	if (rc != 10) {
2967d1ffc32SGordon Ross 		printf("Fail: msg_put_u4 encode\n");
2977d1ffc32SGordon Ross 		goto out;
2987d1ffc32SGordon Ross 	}
2997d1ffc32SGordon Ross 
3007d1ffc32SGordon Ross 	if (memcmp(temp, wcsp, 10)) {
3017d1ffc32SGordon Ross 		printf("Fail: msg_put_u4 cmp:\n");
3027d1ffc32SGordon Ross 		hexdump((uchar_t *)temp, 10);
3037d1ffc32SGordon Ross 		return;
3047d1ffc32SGordon Ross 	}
3057d1ffc32SGordon Ross 
3067d1ffc32SGordon Ross 	printf("Pass: msg_put_u4\n");
3077d1ffc32SGordon Ross 
3087d1ffc32SGordon Ross out:
3097d1ffc32SGordon Ross 	smb_msgbuf_term(&mb);
3107d1ffc32SGordon Ross }
3117d1ffc32SGordon Ross 
3127d1ffc32SGordon Ross static void
msg_put_upad()3137d1ffc32SGordon Ross msg_put_upad()
3147d1ffc32SGordon Ross {
3157d1ffc32SGordon Ross 	uint16_t wire[] = { 'o', 'n', 'e', 0, 0 };
3167d1ffc32SGordon Ross 	uint8_t temp[32];
3177d1ffc32SGordon Ross 	smb_msgbuf_t mb;
3187d1ffc32SGordon Ross 	int mbflags = 0;
3197d1ffc32SGordon Ross 	int rc;
3207d1ffc32SGordon Ross 
3217d1ffc32SGordon Ross 	smb_msgbuf_init(&mb, temp, sizeof (temp), mbflags);
3227d1ffc32SGordon Ross 
3237d1ffc32SGordon Ross 	/* Encode with wire length > strlen */
3247d1ffc32SGordon Ross 	rc = smb_msgbuf_encode(&mb, "10U", "one");
3257d1ffc32SGordon Ross 	if (rc != 10) {
3267d1ffc32SGordon Ross 		printf("Fail: msg_put_upad encode\n");
3277d1ffc32SGordon Ross 		goto out;
3287d1ffc32SGordon Ross 	}
3297d1ffc32SGordon Ross 
3307d1ffc32SGordon Ross 	if (memcmp(temp, wire, 10)) {
3317d1ffc32SGordon Ross 		printf("Fail: msg_put_upad cmp:\n");
3327d1ffc32SGordon Ross 		hexdump((uchar_t *)temp, 10);
3337d1ffc32SGordon Ross 		return;
3347d1ffc32SGordon Ross 	}
3357d1ffc32SGordon Ross 
3367d1ffc32SGordon Ross 	printf("Pass: msg_put_upad\n");
3377d1ffc32SGordon Ross 
3387d1ffc32SGordon Ross out:
3397d1ffc32SGordon Ross 	smb_msgbuf_term(&mb);
3407d1ffc32SGordon Ross }
3417d1ffc32SGordon Ross 
3427d1ffc32SGordon Ross static void
msg_put_utrunc1()343*25a9a7aaSGordon Ross msg_put_utrunc1()
3447d1ffc32SGordon Ross {
3457d1ffc32SGordon Ross 	uint16_t wire[] = { 'o', 'n', 'e', 't' };
3467d1ffc32SGordon Ross 	uint8_t temp[32];
3477d1ffc32SGordon Ross 	smb_msgbuf_t mb;
3487d1ffc32SGordon Ross 	int mbflags = 0;
3497d1ffc32SGordon Ross 	int rc;
3507d1ffc32SGordon Ross 
3517d1ffc32SGordon Ross 	smb_msgbuf_init(&mb, temp, sizeof (temp), mbflags);
3527d1ffc32SGordon Ross 
3537d1ffc32SGordon Ross 	/* Encode with wire length < strlen */
3547d1ffc32SGordon Ross 	rc = smb_msgbuf_encode(&mb, "8U", "onetwo");
3557d1ffc32SGordon Ross 	/* Trunc should put exactly 8 */
3567d1ffc32SGordon Ross 	if (rc != 8) {
357*25a9a7aaSGordon Ross 		printf("Fail: msg_put_utrunc1 encode\n");
3587d1ffc32SGordon Ross 		goto out;
3597d1ffc32SGordon Ross 	}
3607d1ffc32SGordon Ross 
3617d1ffc32SGordon Ross 	if (memcmp(temp, wire, 8)) {
362*25a9a7aaSGordon Ross 		printf("Fail: msg_put_utrunc1 cmp:\n");
3637d1ffc32SGordon Ross 		hexdump((uchar_t *)temp, 8);
3647d1ffc32SGordon Ross 		return;
3657d1ffc32SGordon Ross 	}
3667d1ffc32SGordon Ross 
367*25a9a7aaSGordon Ross 	printf("Pass: msg_put_utrunc1\n");
368*25a9a7aaSGordon Ross 
369*25a9a7aaSGordon Ross out:
370*25a9a7aaSGordon Ross 	smb_msgbuf_term(&mb);
371*25a9a7aaSGordon Ross }
372*25a9a7aaSGordon Ross 
373*25a9a7aaSGordon Ross static void
msg_put_utrunc2()374*25a9a7aaSGordon Ross msg_put_utrunc2()
375*25a9a7aaSGordon Ross {
376*25a9a7aaSGordon Ross 	uint16_t wire[] = { 'o', 'n', 'e', 't', 0 };
377*25a9a7aaSGordon Ross 	uint8_t temp[32];
378*25a9a7aaSGordon Ross 	smb_msgbuf_t mb;
379*25a9a7aaSGordon Ross 	int mbflags = 0;
380*25a9a7aaSGordon Ross 	int rc;
381*25a9a7aaSGordon Ross 
382*25a9a7aaSGordon Ross 	(void) memset(temp, 0, sizeof (temp));
383*25a9a7aaSGordon Ross 	smb_msgbuf_init(&mb, temp, 8, mbflags);
384*25a9a7aaSGordon Ross 
385*25a9a7aaSGordon Ross 	/* Encode with wire length < strlen */
386*25a9a7aaSGordon Ross 	rc = smb_msgbuf_encode(&mb, "U", "onetwo");
387*25a9a7aaSGordon Ross 	/* Trunc should return "overflow" */
388*25a9a7aaSGordon Ross 	if (rc != -1) {
389*25a9a7aaSGordon Ross 		printf("Fail: msg_put_utrunc2 encode rc=%d\n", rc);
390*25a9a7aaSGordon Ross 		goto out;
391*25a9a7aaSGordon Ross 	}
392*25a9a7aaSGordon Ross 
393*25a9a7aaSGordon Ross 	if (memcmp(temp, wire, 10)) {
394*25a9a7aaSGordon Ross 		printf("Fail: msg_put_utrunc2 cmp:\n");
395*25a9a7aaSGordon Ross 		hexdump((uchar_t *)temp, 10);
396*25a9a7aaSGordon Ross 		return;
397*25a9a7aaSGordon Ross 	}
398*25a9a7aaSGordon Ross 
399*25a9a7aaSGordon Ross 	printf("Pass: msg_put_utrunc2\n");
4007d1ffc32SGordon Ross 
4017d1ffc32SGordon Ross out:
4027d1ffc32SGordon Ross 	smb_msgbuf_term(&mb);
4037d1ffc32SGordon Ross }
4047d1ffc32SGordon Ross 
4057d1ffc32SGordon Ross /*
4067d1ffc32SGordon Ross  * Parse an ascii string.
4077d1ffc32SGordon Ross  */
4087d1ffc32SGordon Ross static void
msg_get_a0()4097d1ffc32SGordon Ross msg_get_a0()
4107d1ffc32SGordon Ross {
4117d1ffc32SGordon Ross 	uint8_t wire[] = { 'o', 'n', 'e', 0, 42, 0 };
4127d1ffc32SGordon Ross 	smb_msgbuf_t mb;
4137d1ffc32SGordon Ross 	int mbflags = 0;
4147d1ffc32SGordon Ross 	char *s;
4157d1ffc32SGordon Ross 	int rc;
4167d1ffc32SGordon Ross 	uint16_t w;
4177d1ffc32SGordon Ross 
4187d1ffc32SGordon Ross 	smb_msgbuf_init(&mb, wire, sizeof (wire), mbflags);
4197d1ffc32SGordon Ross 
4207d1ffc32SGordon Ross 	rc = smb_msgbuf_decode(&mb, "sw", &s, &w);
4217d1ffc32SGordon Ross 	if (rc != 6) {
4227d1ffc32SGordon Ross 		printf("Fail: msg_get_a0 decode\n");
4237d1ffc32SGordon Ross 		goto out;
4247d1ffc32SGordon Ross 	}
4257d1ffc32SGordon Ross 	/*
4267d1ffc32SGordon Ross 	 * Decode a word after the string to make sure we
4277d1ffc32SGordon Ross 	 * end up positioned correctly after the string.
4287d1ffc32SGordon Ross 	 */
4297d1ffc32SGordon Ross 	if (w != 42) {
4307d1ffc32SGordon Ross 		printf("Fail: msg_get_a0 w=%d\n", w);
4317d1ffc32SGordon Ross 		return;
4327d1ffc32SGordon Ross 	}
4337d1ffc32SGordon Ross 	if (strcmp(s, "one") != 0) {
4347d1ffc32SGordon Ross 		printf("Fail: msg_get_a0 cmp: <%s>\n", s);
4357d1ffc32SGordon Ross 		return;
4367d1ffc32SGordon Ross 	}
4377d1ffc32SGordon Ross 
4387d1ffc32SGordon Ross 	printf("Pass: msg_get_a0\n");
4397d1ffc32SGordon Ross 
4407d1ffc32SGordon Ross out:
4417d1ffc32SGordon Ross 	smb_msgbuf_term(&mb);
4427d1ffc32SGordon Ross }
4437d1ffc32SGordon Ross 
4447d1ffc32SGordon Ross /*
4457d1ffc32SGordon Ross  * Parse an ascii string, no NULL
4467d1ffc32SGordon Ross  */
4477d1ffc32SGordon Ross static void
msg_get_a1()4487d1ffc32SGordon Ross msg_get_a1()
4497d1ffc32SGordon Ross {
4507d1ffc32SGordon Ross 	uint8_t wire[] = { 'o', 'n', 'e', '.', 42, 0 };
4517d1ffc32SGordon Ross 	smb_msgbuf_t mb;
4527d1ffc32SGordon Ross 	int mbflags = 0;
4537d1ffc32SGordon Ross 	char *s;
4547d1ffc32SGordon Ross 	int rc;
4557d1ffc32SGordon Ross 	uint16_t w;
4567d1ffc32SGordon Ross 
4577d1ffc32SGordon Ross 	smb_msgbuf_init(&mb, wire, sizeof (wire), mbflags);
4587d1ffc32SGordon Ross 
4597d1ffc32SGordon Ross 	rc = smb_msgbuf_decode(&mb, "3s.w", &s, &w);
4607d1ffc32SGordon Ross 	if (rc != 6) {
4617d1ffc32SGordon Ross 		printf("Fail: msg_get_a1 decode\n");
4627d1ffc32SGordon Ross 		goto out;
4637d1ffc32SGordon Ross 	}
4647d1ffc32SGordon Ross 	/*
4657d1ffc32SGordon Ross 	 * Decode a word after the string to make sure we
4667d1ffc32SGordon Ross 	 * end up positioned correctly after the string.
4677d1ffc32SGordon Ross 	 */
4687d1ffc32SGordon Ross 	if (w != 42) {
4697d1ffc32SGordon Ross 		printf("Fail: msg_get_a1 w=%d\n", w);
4707d1ffc32SGordon Ross 		return;
4717d1ffc32SGordon Ross 	}
4727d1ffc32SGordon Ross 	if (strcmp(s, "one") != 0) {
4737d1ffc32SGordon Ross 		printf("Fail: msg_get_a1 cmp: <%s>\n", s);
4747d1ffc32SGordon Ross 		return;
4757d1ffc32SGordon Ross 	}
4767d1ffc32SGordon Ross 
4777d1ffc32SGordon Ross 	printf("Pass: msg_get_a1\n");
4787d1ffc32SGordon Ross 
4797d1ffc32SGordon Ross out:
4807d1ffc32SGordon Ross 	smb_msgbuf_term(&mb);
4817d1ffc32SGordon Ross }
4827d1ffc32SGordon Ross 
4837d1ffc32SGordon Ross /* parse exactly to end of data */
4847d1ffc32SGordon Ross static void
msg_get_a2()4857d1ffc32SGordon Ross msg_get_a2()
4867d1ffc32SGordon Ross {
4877d1ffc32SGordon Ross 	uint8_t wire[] = { 'o', 'n', 'e' };
4887d1ffc32SGordon Ross 	smb_msgbuf_t mb;
4897d1ffc32SGordon Ross 	int mbflags = 0;
4907d1ffc32SGordon Ross 	char *s;
4917d1ffc32SGordon Ross 	int rc;
4927d1ffc32SGordon Ross 
4937d1ffc32SGordon Ross 	smb_msgbuf_init(&mb, wire, sizeof (wire), mbflags);
4947d1ffc32SGordon Ross 
4957d1ffc32SGordon Ross 	rc = smb_msgbuf_decode(&mb, "3s", &s);
4967d1ffc32SGordon Ross 	if (rc != 3) {
4977d1ffc32SGordon Ross 		printf("Fail: msg_get_a2 decode\n");
4987d1ffc32SGordon Ross 		goto out;
4997d1ffc32SGordon Ross 	}
5007d1ffc32SGordon Ross 	if (mb.scan != mb.end) {
5017d1ffc32SGordon Ross 		printf("Fail: msg_get_a2 wrong pos\n");
5027d1ffc32SGordon Ross 		return;
5037d1ffc32SGordon Ross 	}
5047d1ffc32SGordon Ross 	if (strcmp(s, "one") != 0) {
5057d1ffc32SGordon Ross 		printf("Fail: msg_get_a2 cmp: <%s>\n", s);
5067d1ffc32SGordon Ross 		return;
5077d1ffc32SGordon Ross 	}
5087d1ffc32SGordon Ross 
5097d1ffc32SGordon Ross 	printf("Pass: msg_get_a2\n");
5107d1ffc32SGordon Ross 
5117d1ffc32SGordon Ross out:
5127d1ffc32SGordon Ross 	smb_msgbuf_term(&mb);
5137d1ffc32SGordon Ross }
5147d1ffc32SGordon Ross 
5157d1ffc32SGordon Ross /*
5167d1ffc32SGordon Ross  * Parse a unicode string.
5177d1ffc32SGordon Ross  */
5187d1ffc32SGordon Ross static void
msg_get_u0()5197d1ffc32SGordon Ross msg_get_u0()
5207d1ffc32SGordon Ross {
5217d1ffc32SGordon Ross 	uint16_t wire[] = { 'o', 'n', 'e', 0, 42, 0 };
5227d1ffc32SGordon Ross 	smb_msgbuf_t mb;
5237d1ffc32SGordon Ross 	int mbflags = 0;
5247d1ffc32SGordon Ross 	char *s;
5257d1ffc32SGordon Ross 	int rc;
5267d1ffc32SGordon Ross 	uint16_t w;
5277d1ffc32SGordon Ross 
5287d1ffc32SGordon Ross 	smb_msgbuf_init(&mb, (uint8_t *)wire, sizeof (wire), mbflags);
5297d1ffc32SGordon Ross 
5307d1ffc32SGordon Ross 	rc = smb_msgbuf_decode(&mb, "Uw", &s, &w);
5317d1ffc32SGordon Ross 	if (rc != 10) {
5327d1ffc32SGordon Ross 		printf("Fail: msg_get_u0 decode\n");
5337d1ffc32SGordon Ross 		goto out;
5347d1ffc32SGordon Ross 	}
5357d1ffc32SGordon Ross 	/*
5367d1ffc32SGordon Ross 	 * Decode a word after the string to make sure we
5377d1ffc32SGordon Ross 	 * end up positioned correctly after the string.
5387d1ffc32SGordon Ross 	 */
5397d1ffc32SGordon Ross 	if (w != 42) {
5407d1ffc32SGordon Ross 		printf("Fail: msg_get_u0 w=%d\n", w);
5417d1ffc32SGordon Ross 		return;
5427d1ffc32SGordon Ross 	}
5437d1ffc32SGordon Ross 	if (strcmp(s, "one") != 0) {
5447d1ffc32SGordon Ross 		printf("Fail: msg_get_u0 cmp: <%s>\n", s);
5457d1ffc32SGordon Ross 		return;
5467d1ffc32SGordon Ross 	}
5477d1ffc32SGordon Ross 
5487d1ffc32SGordon Ross 	printf("Pass: msg_get_u0\n");
5497d1ffc32SGordon Ross 
5507d1ffc32SGordon Ross out:
5517d1ffc32SGordon Ross 	smb_msgbuf_term(&mb);
5527d1ffc32SGordon Ross }
5537d1ffc32SGordon Ross 
5547d1ffc32SGordon Ross /*
5557d1ffc32SGordon Ross  * Parse a string that's NOT null terminated.
5567d1ffc32SGordon Ross  */
5577d1ffc32SGordon Ross static void
msg_get_u1()5587d1ffc32SGordon Ross msg_get_u1()
5597d1ffc32SGordon Ross {
5607d1ffc32SGordon Ross 	uint16_t wire[] = { 'o', 'n', 'e', '.', 42, 0 };
5617d1ffc32SGordon Ross 	smb_msgbuf_t mb;
5627d1ffc32SGordon Ross 	int mbflags = 0;
5637d1ffc32SGordon Ross 	char *s;
5647d1ffc32SGordon Ross 	int rc;
5657d1ffc32SGordon Ross 	uint16_t w;
5667d1ffc32SGordon Ross 
5677d1ffc32SGordon Ross 	smb_msgbuf_init(&mb, (uint8_t *)wire, sizeof (wire), mbflags);
5687d1ffc32SGordon Ross 
5697d1ffc32SGordon Ross 	rc = smb_msgbuf_decode(&mb, "6U..w", &s, &w);
5707d1ffc32SGordon Ross 	if (rc != 10) {
5717d1ffc32SGordon Ross 		printf("Fail: msg_get_u1 decode\n");
5727d1ffc32SGordon Ross 		goto out;
5737d1ffc32SGordon Ross 	}
5747d1ffc32SGordon Ross 	/*
5757d1ffc32SGordon Ross 	 * Decode a word after the string to make sure we
5767d1ffc32SGordon Ross 	 * end up positioned correctly after the string.
5777d1ffc32SGordon Ross 	 */
5787d1ffc32SGordon Ross 	if (w != 42) {
5797d1ffc32SGordon Ross 		printf("Fail: msg_get_u1 w=%d\n", w);
5807d1ffc32SGordon Ross 		return;
5817d1ffc32SGordon Ross 	}
5827d1ffc32SGordon Ross 	if (strcmp(s, "one") != 0) {
5837d1ffc32SGordon Ross 		printf("Fail: msg_get_u1 cmp: <%s>\n", s);
5847d1ffc32SGordon Ross 		return;
5857d1ffc32SGordon Ross 	}
5867d1ffc32SGordon Ross 
5877d1ffc32SGordon Ross 	printf("Pass: msg_get_u1\n");
5887d1ffc32SGordon Ross 
5897d1ffc32SGordon Ross out:
5907d1ffc32SGordon Ross 	smb_msgbuf_term(&mb);
5917d1ffc32SGordon Ross }
5927d1ffc32SGordon Ross 
5937d1ffc32SGordon Ross /* parse exactly to end of data */
5947d1ffc32SGordon Ross static void
msg_get_u2()5957d1ffc32SGordon Ross msg_get_u2()
5967d1ffc32SGordon Ross {
5977d1ffc32SGordon Ross 	uint16_t wire[] = { 'o', 'n', 'e' };
5987d1ffc32SGordon Ross 	smb_msgbuf_t mb;
5997d1ffc32SGordon Ross 	int mbflags = 0;
6007d1ffc32SGordon Ross 	char *s;
6017d1ffc32SGordon Ross 	int rc;
6027d1ffc32SGordon Ross 
6037d1ffc32SGordon Ross 	smb_msgbuf_init(&mb, (uint8_t *)wire, sizeof (wire), mbflags);
6047d1ffc32SGordon Ross 
6057d1ffc32SGordon Ross 	rc = smb_msgbuf_decode(&mb, "6U", &s);
6067d1ffc32SGordon Ross 	if (rc != 6) {
6077d1ffc32SGordon Ross 		printf("Fail: msg_get_u2 decode\n");
6087d1ffc32SGordon Ross 		goto out;
6097d1ffc32SGordon Ross 	}
6107d1ffc32SGordon Ross 	if (mb.scan != mb.end) {
6117d1ffc32SGordon Ross 		printf("Fail: msg_get_u2 wrong pos\n");
6127d1ffc32SGordon Ross 		return;
6137d1ffc32SGordon Ross 	}
6147d1ffc32SGordon Ross 	if (strcmp(s, "one") != 0) {
6157d1ffc32SGordon Ross 		printf("Fail: msg_get_u2 cmp: <%s>\n", s);
6167d1ffc32SGordon Ross 		return;
6177d1ffc32SGordon Ross 	}
6187d1ffc32SGordon Ross 
6197d1ffc32SGordon Ross 	printf("Pass: msg_get_u2\n");
6207d1ffc32SGordon Ross 
6217d1ffc32SGordon Ross out:
6227d1ffc32SGordon Ross 	smb_msgbuf_term(&mb);
6237d1ffc32SGordon Ross }
6247d1ffc32SGordon Ross 
6257d1ffc32SGordon Ross static void
msg_get_u3()6267d1ffc32SGordon Ross msg_get_u3()
6277d1ffc32SGordon Ross {
6287d1ffc32SGordon Ross 	smb_msgbuf_t mb;
6297d1ffc32SGordon Ross 	int mbflags = 0;
6307d1ffc32SGordon Ross 	char *s;
6317d1ffc32SGordon Ross 	int rc;
6327d1ffc32SGordon Ross 
6337d1ffc32SGordon Ross 	smb_msgbuf_init(&mb, (uint8_t *)wcsa, sizeof (wcsa), mbflags);
6347d1ffc32SGordon Ross 
6357d1ffc32SGordon Ross 	rc = smb_msgbuf_decode(&mb, "#U", sizeof (wcsa), &s);
6367d1ffc32SGordon Ross 	if (rc != 8) {
6377d1ffc32SGordon Ross 		printf("Fail: msg_get_u3 decode\n");
6387d1ffc32SGordon Ross 		goto out;
6397d1ffc32SGordon Ross 	}
6407d1ffc32SGordon Ross 	if (strcmp(s, mbsa) != 0) {
6417d1ffc32SGordon Ross 		printf("Fail: msg_get_u3 cmp: <%s>\n", s);
6427d1ffc32SGordon Ross 		return;
6437d1ffc32SGordon Ross 	}
6447d1ffc32SGordon Ross 
6457d1ffc32SGordon Ross 	printf("Pass: msg_get_u3\n");
6467d1ffc32SGordon Ross 
6477d1ffc32SGordon Ross out:
6487d1ffc32SGordon Ross 	smb_msgbuf_term(&mb);
6497d1ffc32SGordon Ross }
6507d1ffc32SGordon Ross 
6517d1ffc32SGordon Ross static void
msg_get_u4()6527d1ffc32SGordon Ross msg_get_u4()
6537d1ffc32SGordon Ross {
6547d1ffc32SGordon Ross 	smb_msgbuf_t mb;
6557d1ffc32SGordon Ross 	int mbflags = 0;
6567d1ffc32SGordon Ross 	char *s;
6577d1ffc32SGordon Ross 	int rc;
6587d1ffc32SGordon Ross 
6597d1ffc32SGordon Ross 	smb_msgbuf_init(&mb, (uint8_t *)wcsp, sizeof (wcsp), mbflags);
6607d1ffc32SGordon Ross 
6617d1ffc32SGordon Ross 	rc = smb_msgbuf_decode(&mb, "#U", sizeof (wcsp), &s);
6627d1ffc32SGordon Ross 	if (rc != 10) {
6637d1ffc32SGordon Ross 		printf("Fail: msg_get_u4 decode\n");
6647d1ffc32SGordon Ross 		goto out;
6657d1ffc32SGordon Ross 	}
6667d1ffc32SGordon Ross 	if (strcmp(s, mbsp) != 0) {
6677d1ffc32SGordon Ross 		printf("Fail: msg_get_u4 cmp: <%s>\n", s);
6687d1ffc32SGordon Ross 		return;
6697d1ffc32SGordon Ross 	}
6707d1ffc32SGordon Ross 
6717d1ffc32SGordon Ross 	printf("Pass: msg_get_u4\n");
6727d1ffc32SGordon Ross 
6737d1ffc32SGordon Ross out:
6747d1ffc32SGordon Ross 	smb_msgbuf_term(&mb);
6757d1ffc32SGordon Ross }
6767d1ffc32SGordon Ross 
6777d1ffc32SGordon Ross void
test_msgbuf()6787d1ffc32SGordon Ross test_msgbuf()
6797d1ffc32SGordon Ross {
6807d1ffc32SGordon Ross 
6817d1ffc32SGordon Ross 	msg_put_a0();
6827d1ffc32SGordon Ross 	msg_put_a1();
6837d1ffc32SGordon Ross 	msg_put_apad();
684*25a9a7aaSGordon Ross 	msg_put_atrunc1();
685*25a9a7aaSGordon Ross 	msg_put_atrunc2();
6867d1ffc32SGordon Ross 
6877d1ffc32SGordon Ross 	msg_put_u0();
6887d1ffc32SGordon Ross 	msg_put_u1();
6897d1ffc32SGordon Ross 	msg_put_u3();
6907d1ffc32SGordon Ross 	msg_put_u4();
6917d1ffc32SGordon Ross 	msg_put_upad();
692*25a9a7aaSGordon Ross 	msg_put_utrunc1();
693*25a9a7aaSGordon Ross 	msg_put_utrunc2();
6947d1ffc32SGordon Ross 
6957d1ffc32SGordon Ross 	msg_get_a0();
6967d1ffc32SGordon Ross 	msg_get_a1();
6977d1ffc32SGordon Ross 	msg_get_a2();
6987d1ffc32SGordon Ross 	msg_get_u0();
6997d1ffc32SGordon Ross 	msg_get_u1();
7007d1ffc32SGordon Ross 	msg_get_u2();
7017d1ffc32SGordon Ross 	msg_get_u3();
7027d1ffc32SGordon Ross 	msg_get_u4();
7037d1ffc32SGordon Ross 
7047d1ffc32SGordon Ross }