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 }
705