1 /*
2  * This file and its contents are supplied under the terms of the
3  * Common Development and Distribution License ("CDDL"), version 1.0.
4  * You may only use this file in accordance with the terms of version
5  * 1.0 of the CDDL.
6  *
7  * A full copy of the text of the CDDL should have accompanied this
8  * source.  A copy of the CDDL is also available via the Internet at
9  * http://www.illumos.org/license/CDDL.
10  */
11 
12 /*
13  * Copyright 2015 Joyent, Inc.
14  */
15 
16 #include <string.h>
17 #include <locale.h>
18 #include <assert.h>
19 #include <errno.h>
20 #include <stdio.h>
21 #include <nl_types.h>
22 #include <sys/types.h>
23 
24 /*
25  * This is designed to check that we properly are honoring the global and
26  * per-thread locale when opening up a message catalog. To do this, we use the
27  * "TEST" message catalog which only exists in the system in the C/POSIX
28  * locales and thus alternate with our test locale zz_AA.UTF-8 which should not
29  * have it.
30  */
31 
32 #define	INVALID_CAT	((nl_catd)-1)
33 
34 static void
catopen_verify(boolean_t find)35 catopen_verify(boolean_t find)
36 {
37 	nl_catd cat;
38 
39 	cat = catopen("TEST", NL_CAT_LOCALE);
40 	if (find == B_TRUE) {
41 		assert(cat != INVALID_CAT);
42 		(void) catclose(cat);
43 	} else {
44 		assert(cat == INVALID_CAT);
45 	}
46 }
47 
48 int
main(void)49 main(void)
50 {
51 	locale_t loc;
52 
53 	(void) setlocale(LC_ALL, "C");
54 	catopen_verify(B_TRUE);
55 
56 	(void) setlocale(LC_ALL, "zz_AA.UTF-8");
57 	catopen_verify(B_FALSE);
58 
59 	(void) setlocale(LC_MESSAGES, "C");
60 	catopen_verify(B_TRUE);
61 
62 	(void) setlocale(LC_ALL, "C");
63 	loc = newlocale(LC_MESSAGES_MASK, "zz_AA.UTF-8", NULL);
64 	assert(loc != NULL);
65 
66 	catopen_verify(B_TRUE);
67 	(void) uselocale(loc);
68 	catopen_verify(B_FALSE);
69 
70 	(void) uselocale(LC_GLOBAL_LOCALE);
71 	catopen_verify(B_TRUE);
72 	freelocale(loc);
73 
74 	(void) setlocale(LC_ALL, "zz_AA.UTF-8");
75 	catopen_verify(B_FALSE);
76 
77 	loc = newlocale(LC_MESSAGES_MASK, "C", NULL);
78 	assert(loc != NULL);
79 
80 	catopen_verify(B_FALSE);
81 	(void) uselocale(loc);
82 	catopen_verify(B_TRUE);
83 
84 	return (0);
85 }
86