Print this page
2964 need POSIX 2008 locale object support
Reviewed by: Robert Mustacchi <rm@joyent.com>
Reviewed by: Gordon Ross <gordon.ross@nexenta.com>
Approved by: TBD
Split |
Close |
Expand all |
Collapse all |
--- old/usr/src/lib/libc/port/locale/ldpart.c
+++ new/usr/src/lib/libc/port/locale/ldpart.c
1 1 /*
2 + * Copyright 2013 Garrett D'Amore <garrett@damore.org>
2 3 * Copyright 2010 Nexenta Systems, Inc. All rights reserved.
3 4 * Copyright (c) 2000, 2001 Alexey Zelkin <phantom@FreeBSD.org>
4 5 * All rights reserved.
5 6 *
6 7 * Redistribution and use in source and binary forms, with or without
7 8 * modification, are permitted provided that the following conditions
8 9 * are met:
9 10 * 1. Redistributions of source code must retain the above copyright
10 11 * notice, this list of conditions and the following disclaimer.
11 12 * 2. Redistributions in binary form must reproduce the above copyright
12 13 * notice, this list of conditions and the following disclaimer in the
13 14 * documentation and/or other materials provided with the distribution.
14 15 *
15 16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16 17 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17 18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18 19 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19 20 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20 21 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21 22 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22 23 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23 24 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24 25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25 26 * SUCH DAMAGE.
26 27 */
27 28
28 29 #include "lint.h"
29 30 #include "file64.h"
↓ open down ↓ |
18 lines elided |
↑ open up ↑ |
30 31 #include <sys/types.h>
31 32 #include <sys/stat.h>
32 33 #include <errno.h>
33 34 #include <fcntl.h>
34 35 #include <limits.h>
35 36 #include <stdlib.h>
36 37 #include <string.h>
37 38 #include <unistd.h>
38 39 #include <stdio.h>
39 40
41 +#include "libc.h"
40 42 #include "ldpart.h"
41 43 #include "setlocale.h"
42 44
43 45 static int split_lines(char *, const char *);
44 46
45 47 int
46 -__part_load_locale(const char *name, int *using_locale,
48 +__part_load_locale(const char *name,
47 49 char **locale_buf, const char *category_filename,
48 50 int locale_buf_size_max, int locale_buf_size_min,
49 51 const char **dst_localebuf)
50 52 {
51 53 int saverr, fd, i, num_lines;
52 54 char *lbuf, *p;
53 55 const char *plim;
54 56 char filename[PATH_MAX];
55 57 struct stat st;
56 58 size_t namesize, bufsize;
57 59
58 - /* 'name' must be already checked. */
59 - if (strcmp(name, "C") == 0 || strcmp(name, "POSIX") == 0) {
60 - *using_locale = 0;
61 - return (_LDP_CACHE);
62 - }
63 -
64 60 /*
65 - * If the locale name is the same as our cache, use the cache.
66 - */
67 - if (*locale_buf != NULL && strcmp(name, *locale_buf) == 0) {
68 - *using_locale = 1;
69 - return (_LDP_CACHE);
70 - }
71 -
72 - /*
73 61 * Slurp the locale file into the cache.
74 62 */
75 63 namesize = strlen(name) + 1;
76 64
77 65 /* 'PathLocale' must be already set & checked. */
78 66
79 67 (void) snprintf(filename, sizeof (filename), "%s/%s/%s/LCL_DATA",
80 68 _PathLocale, name, category_filename);
81 69
82 70 if ((fd = open(filename, O_RDONLY)) < 0)
83 71 return (_LDP_ERROR);
84 72 if (fstat(fd, &st) != 0)
85 73 goto bad_locale;
86 74 if (st.st_size <= 0) {
87 75 errno = EINVAL;
88 76 goto bad_locale;
89 77 }
90 78 bufsize = namesize + st.st_size;
91 - if ((lbuf = malloc(bufsize)) == NULL) {
79 + if ((lbuf = libc_malloc(bufsize)) == NULL) {
92 80 errno = ENOMEM;
93 81 goto bad_locale;
94 82 }
95 83 (void) strcpy(lbuf, name);
96 84 p = lbuf + namesize;
97 85 plim = p + st.st_size;
98 86 if (read(fd, p, (size_t)st.st_size) != st.st_size)
99 87 goto bad_lbuf;
100 88 /*
101 89 * Parse the locale file into localebuf.
102 90 */
103 91 if (plim[-1] != '\n') {
104 92 errno = EINVAL;
105 93 goto bad_lbuf;
106 94 }
107 95 num_lines = split_lines(p, plim);
108 96 if (num_lines >= locale_buf_size_max)
109 97 num_lines = locale_buf_size_max;
↓ open down ↓ |
8 lines elided |
↑ open up ↑ |
110 98 else if (num_lines >= locale_buf_size_min)
111 99 num_lines = locale_buf_size_min;
112 100 else {
113 101 errno = EINVAL;
114 102 goto bad_lbuf;
115 103 }
116 104 (void) close(fd);
117 105 /*
118 106 * Record the successful parse in the cache.
119 107 */
120 - if (*locale_buf != NULL)
121 - free(*locale_buf);
122 108 *locale_buf = lbuf;
123 109 for (p = *locale_buf, i = 0; i < num_lines; i++)
124 110 dst_localebuf[i] = (p += strlen(p) + 1);
125 111 for (i = num_lines; i < locale_buf_size_max; i++)
126 112 dst_localebuf[i] = NULL;
127 - *using_locale = 1;
128 113
129 114 return (_LDP_LOADED);
130 115
131 116 bad_lbuf:
132 117 saverr = errno;
133 118 free(lbuf);
134 119 errno = saverr;
135 120 bad_locale:
136 121 saverr = errno;
137 122 (void) close(fd);
138 123 errno = saverr;
139 124
140 125 return (_LDP_ERROR);
141 126 }
142 127
143 128 static int
144 129 split_lines(char *p, const char *plim)
145 130 {
146 131 int i;
147 132
148 133 i = 0;
149 134 while (p < plim) {
150 135 if (*p == '\n') {
151 136 *p = '\0';
152 137 i++;
153 138 }
154 139 p++;
155 140 }
156 141 return (i);
157 142 }
↓ open down ↓ |
20 lines elided |
↑ open up ↑ |
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX