1: /*
2: * Copyright (c) 2012-2013 Todd C. Miller <Todd.Miller@courtesan.com>
3: *
4: * Permission to use, copy, modify, and distribute this software for any
5: * purpose with or without fee is hereby granted, provided that the above
6: * copyright notice and this permission notice appear in all copies.
7: *
8: * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9: * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10: * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11: * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12: * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13: * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14: * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15: */
16:
17: #include <config.h>
18:
19: #include <sys/types.h>
20: #include <stdio.h>
21: #ifdef STDC_HEADERS
22: # include <stdlib.h>
23: # include <stddef.h>
24: #else
25: # ifdef HAVE_STDLIB_H
26: # include <stdlib.h>
27: # endif
28: #endif /* STDC_HEADERS */
29: #ifdef HAVE_STRING_H
30: # include <string.h>
31: #endif /* HAVE_STRING_H */
32: #ifdef HAVE_STRINGS_H
33: # include <strings.h>
34: #endif /* HAVE_STRINGS_H */
35: #ifdef HAVE_STDBOOL_H
36: # include <stdbool.h>
37: #else
38: # include "compat/stdbool.h"
39: #endif /* HAVE_STDBOOL_H */
40:
41: #define DEFAULT_TEXT_DOMAIN "sudoers"
42: #include "gettext.h" /* must be included before missing.h */
43:
44: #include "missing.h"
45: #include "fatal.h"
46: #include "alloc.h"
47: #include "logging.h"
48:
49: static int current_locale = SUDOERS_LOCALE_USER;
50: static char *user_locale;
51: static char *sudoers_locale;
52:
53: int
54: sudoers_getlocale(void)
55: {
56: return current_locale;
57: }
58:
59: void
60: sudoers_initlocale(const char *ulocale, const char *slocale)
61: {
62: if (ulocale != NULL) {
63: efree(user_locale);
64: user_locale = estrdup(ulocale);
65: }
66: if (slocale != NULL) {
67: efree(sudoers_locale);
68: sudoers_locale = estrdup(slocale);
69: }
70: }
71:
72: /*
73: * Set locale to user or sudoers value.
74: * Returns true on success and false on failure,
75: * If prevlocale is non-NULL it will be filled in with the
76: * old SUDOERS_LOCALE_* value.
77: */
78: bool
79: sudoers_setlocale(int newlocale, int *prevlocale)
80: {
81: char *res = NULL;
82:
83: switch (newlocale) {
84: case SUDOERS_LOCALE_USER:
85: if (prevlocale)
86: *prevlocale = current_locale;
87: if (current_locale != SUDOERS_LOCALE_USER) {
88: current_locale = SUDOERS_LOCALE_USER;
89: res = setlocale(LC_ALL, user_locale ? user_locale : "");
90: if (res != NULL && user_locale == NULL)
91: user_locale = estrdup(setlocale(LC_ALL, NULL));
92: }
93: break;
94: case SUDOERS_LOCALE_SUDOERS:
95: if (prevlocale)
96: *prevlocale = current_locale;
97: if (current_locale != SUDOERS_LOCALE_SUDOERS) {
98: current_locale = SUDOERS_LOCALE_SUDOERS;
99: res = setlocale(LC_ALL, sudoers_locale ? sudoers_locale : "C");
100: if (res == NULL && sudoers_locale != NULL) {
101: if (strcmp(sudoers_locale, "C") != 0) {
102: efree(sudoers_locale);
103: sudoers_locale = estrdup("C");
104: res = setlocale(LC_ALL, "C");
105: }
106: }
107: }
108: break;
109: }
110: return res ? true : false;
111: }
112:
113: #ifdef HAVE_LIBINTL_H
114: char *
115: warning_gettext(const char *msgid)
116: {
117: int warning_locale;
118: char *msg;
119:
120: sudoers_setlocale(SUDOERS_LOCALE_USER, &warning_locale);
121: msg = gettext(msgid);
122: sudoers_setlocale(warning_locale, NULL);
123:
124: return msg;
125: }
126: #endif /* HAVE_LIBINTL_H */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>