catopen.c revision b599bd937c305a895426e8c412ca920ce7824850
b599bd937c305a895426e8c412ca920ce7824850Robert Mustacchi/*
b599bd937c305a895426e8c412ca920ce7824850Robert Mustacchi * This file and its contents are supplied under the terms of the
b599bd937c305a895426e8c412ca920ce7824850Robert Mustacchi * Common Development and Distribution License ("CDDL"), version 1.0.
b599bd937c305a895426e8c412ca920ce7824850Robert Mustacchi * You may only use this file in accordance with the terms of version
b599bd937c305a895426e8c412ca920ce7824850Robert Mustacchi * 1.0 of the CDDL.
b599bd937c305a895426e8c412ca920ce7824850Robert Mustacchi *
b599bd937c305a895426e8c412ca920ce7824850Robert Mustacchi * A full copy of the text of the CDDL should have accompanied this
b599bd937c305a895426e8c412ca920ce7824850Robert Mustacchi * source. A copy of the CDDL is also available via the Internet at
b599bd937c305a895426e8c412ca920ce7824850Robert Mustacchi * http://www.illumos.org/license/CDDL.
b599bd937c305a895426e8c412ca920ce7824850Robert Mustacchi */
b599bd937c305a895426e8c412ca920ce7824850Robert Mustacchi
b599bd937c305a895426e8c412ca920ce7824850Robert Mustacchi/*
b599bd937c305a895426e8c412ca920ce7824850Robert Mustacchi * Copyright 2015 Joyent, Inc.
b599bd937c305a895426e8c412ca920ce7824850Robert Mustacchi */
b599bd937c305a895426e8c412ca920ce7824850Robert Mustacchi
b599bd937c305a895426e8c412ca920ce7824850Robert Mustacchi#include <string.h>
b599bd937c305a895426e8c412ca920ce7824850Robert Mustacchi#include <locale.h>
b599bd937c305a895426e8c412ca920ce7824850Robert Mustacchi#include <assert.h>
b599bd937c305a895426e8c412ca920ce7824850Robert Mustacchi#include <errno.h>
b599bd937c305a895426e8c412ca920ce7824850Robert Mustacchi#include <stdio.h>
b599bd937c305a895426e8c412ca920ce7824850Robert Mustacchi#include <nl_types.h>
b599bd937c305a895426e8c412ca920ce7824850Robert Mustacchi#include <sys/types.h>
b599bd937c305a895426e8c412ca920ce7824850Robert Mustacchi
b599bd937c305a895426e8c412ca920ce7824850Robert Mustacchi/*
b599bd937c305a895426e8c412ca920ce7824850Robert Mustacchi * This is designed to check that we properly are honoring the global and
b599bd937c305a895426e8c412ca920ce7824850Robert Mustacchi * per-thread locale when opening up a message catalog. To do this, we use the
b599bd937c305a895426e8c412ca920ce7824850Robert Mustacchi * "TEST" message catalog which only exists in the system in the C/POSIX
b599bd937c305a895426e8c412ca920ce7824850Robert Mustacchi * locales and thus alternate with our test locale zz_AA.UTF-8 which should not
b599bd937c305a895426e8c412ca920ce7824850Robert Mustacchi * have it.
b599bd937c305a895426e8c412ca920ce7824850Robert Mustacchi */
b599bd937c305a895426e8c412ca920ce7824850Robert Mustacchi
b599bd937c305a895426e8c412ca920ce7824850Robert Mustacchi#define INVALID_CAT ((nl_catd)-1)
b599bd937c305a895426e8c412ca920ce7824850Robert Mustacchi
b599bd937c305a895426e8c412ca920ce7824850Robert Mustacchistatic void
b599bd937c305a895426e8c412ca920ce7824850Robert Mustacchicatopen_verify(boolean_t find)
b599bd937c305a895426e8c412ca920ce7824850Robert Mustacchi{
b599bd937c305a895426e8c412ca920ce7824850Robert Mustacchi nl_catd cat;
b599bd937c305a895426e8c412ca920ce7824850Robert Mustacchi
b599bd937c305a895426e8c412ca920ce7824850Robert Mustacchi cat = catopen("TEST", NL_CAT_LOCALE);
b599bd937c305a895426e8c412ca920ce7824850Robert Mustacchi if (find == B_TRUE) {
b599bd937c305a895426e8c412ca920ce7824850Robert Mustacchi assert(cat != INVALID_CAT);
b599bd937c305a895426e8c412ca920ce7824850Robert Mustacchi (void) catclose(cat);
b599bd937c305a895426e8c412ca920ce7824850Robert Mustacchi } else {
b599bd937c305a895426e8c412ca920ce7824850Robert Mustacchi assert(cat == INVALID_CAT);
b599bd937c305a895426e8c412ca920ce7824850Robert Mustacchi }
b599bd937c305a895426e8c412ca920ce7824850Robert Mustacchi}
b599bd937c305a895426e8c412ca920ce7824850Robert Mustacchi
b599bd937c305a895426e8c412ca920ce7824850Robert Mustacchiint
b599bd937c305a895426e8c412ca920ce7824850Robert Mustacchimain(void)
b599bd937c305a895426e8c412ca920ce7824850Robert Mustacchi{
b599bd937c305a895426e8c412ca920ce7824850Robert Mustacchi locale_t loc;
b599bd937c305a895426e8c412ca920ce7824850Robert Mustacchi
b599bd937c305a895426e8c412ca920ce7824850Robert Mustacchi (void) setlocale(LC_ALL, "C");
b599bd937c305a895426e8c412ca920ce7824850Robert Mustacchi catopen_verify(B_TRUE);
b599bd937c305a895426e8c412ca920ce7824850Robert Mustacchi
b599bd937c305a895426e8c412ca920ce7824850Robert Mustacchi (void) setlocale(LC_ALL, "zz_AA.UTF-8");
b599bd937c305a895426e8c412ca920ce7824850Robert Mustacchi catopen_verify(B_FALSE);
b599bd937c305a895426e8c412ca920ce7824850Robert Mustacchi
b599bd937c305a895426e8c412ca920ce7824850Robert Mustacchi (void) setlocale(LC_MESSAGES, "C");
b599bd937c305a895426e8c412ca920ce7824850Robert Mustacchi catopen_verify(B_TRUE);
b599bd937c305a895426e8c412ca920ce7824850Robert Mustacchi
b599bd937c305a895426e8c412ca920ce7824850Robert Mustacchi (void) setlocale(LC_ALL, "C");
b599bd937c305a895426e8c412ca920ce7824850Robert Mustacchi loc = newlocale(LC_MESSAGES_MASK, "zz_AA.UTF-8", NULL);
b599bd937c305a895426e8c412ca920ce7824850Robert Mustacchi assert(loc != NULL);
b599bd937c305a895426e8c412ca920ce7824850Robert Mustacchi
b599bd937c305a895426e8c412ca920ce7824850Robert Mustacchi catopen_verify(B_TRUE);
b599bd937c305a895426e8c412ca920ce7824850Robert Mustacchi (void) uselocale(loc);
b599bd937c305a895426e8c412ca920ce7824850Robert Mustacchi catopen_verify(B_FALSE);
b599bd937c305a895426e8c412ca920ce7824850Robert Mustacchi
b599bd937c305a895426e8c412ca920ce7824850Robert Mustacchi (void) uselocale(LC_GLOBAL_LOCALE);
b599bd937c305a895426e8c412ca920ce7824850Robert Mustacchi catopen_verify(B_TRUE);
b599bd937c305a895426e8c412ca920ce7824850Robert Mustacchi freelocale(loc);
b599bd937c305a895426e8c412ca920ce7824850Robert Mustacchi
b599bd937c305a895426e8c412ca920ce7824850Robert Mustacchi (void) setlocale(LC_ALL, "zz_AA.UTF-8");
b599bd937c305a895426e8c412ca920ce7824850Robert Mustacchi catopen_verify(B_FALSE);
b599bd937c305a895426e8c412ca920ce7824850Robert Mustacchi
b599bd937c305a895426e8c412ca920ce7824850Robert Mustacchi loc = newlocale(LC_MESSAGES_MASK, "C", NULL);
b599bd937c305a895426e8c412ca920ce7824850Robert Mustacchi assert(loc != NULL);
b599bd937c305a895426e8c412ca920ce7824850Robert Mustacchi
b599bd937c305a895426e8c412ca920ce7824850Robert Mustacchi catopen_verify(B_FALSE);
b599bd937c305a895426e8c412ca920ce7824850Robert Mustacchi (void) uselocale(loc);
b599bd937c305a895426e8c412ca920ce7824850Robert Mustacchi catopen_verify(B_TRUE);
b599bd937c305a895426e8c412ca920ce7824850Robert Mustacchi
b599bd937c305a895426e8c412ca920ce7824850Robert Mustacchi return (0);
b599bd937c305a895426e8c412ca920ce7824850Robert Mustacchi}