1/* 2 Unix SMB/CIFS implementation. 3 SWAT language handling 4 5 This program is free software; you can redistribute it and/or modify 6 it under the terms of the GNU General Public License as published by 7 the Free Software Foundation; either version 3 of the License, or 8 (at your option) any later version. 9 10 This program is distributed in the hope that it will be useful, 11 but WITHOUT ANY WARRANTY; without even the implied warranty of 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 GNU General Public License for more details. 14 15 You should have received a copy of the GNU General Public License 16 along with this program. If not, see <http://www.gnu.org/licenses/>. 17 18 Created by Ryo Kawahara <rkawa@lbe.co.jp> 19*/ 20 21#include "includes.h" 22#include "web/swat_proto.h" 23 24/* 25 during a file download we first check to see if there is a language 26 specific file available. If there is then use that, otherwise 27 just open the specified file 28*/ 29int web_open(const char *fname, int flags, mode_t mode) 30{ 31 char *p = NULL; 32 char *lang = lang_tdb_current(); 33 int fd; 34 if (lang) { 35 if (asprintf(&p, "lang/%s/%s", lang, fname) != -1) { 36 fd = sys_open(p, flags, mode); 37 free(p); 38 if (fd != -1) { 39 return fd; 40 } 41 } 42 } 43 44 /* fall through to default name */ 45 return sys_open(fname, flags, mode); 46} 47 48 49struct pri_list { 50 float pri; 51 char *string; 52}; 53 54static int qsort_cmp_list(const void *x, const void *y) { 55 struct pri_list *a = (struct pri_list *)x; 56 struct pri_list *b = (struct pri_list *)y; 57 if (a->pri > b->pri) return -1; 58 if (a->pri < b->pri) return 1; 59 return 0; 60} 61 62/* 63 choose from a list of languages. The list can be comma or space 64 separated 65 Keep choosing until we get a hit 66 Changed to habdle priority -- Simo 67*/ 68 69void web_set_lang(const char *lang_string) 70{ 71 char **lang_list, **count; 72 struct pri_list *pl; 73 int lang_num, i; 74 75 /* build the lang list */ 76 lang_list = str_list_make_v3(talloc_tos(), lang_string, ", \t\r\n"); 77 if (!lang_list) return; 78 79 /* sort the list by priority */ 80 lang_num = 0; 81 count = lang_list; 82 while (*count && **count) { 83 count++; 84 lang_num++; 85 } 86 pl = SMB_MALLOC_ARRAY(struct pri_list, lang_num); 87 if (!pl) { 88 return; 89 } 90 91 for (i = 0; i < lang_num; i++) { 92 char *pri_code; 93 if ((pri_code=strstr(lang_list[i], ";q="))) { 94 *pri_code = '\0'; 95 pri_code += 3; 96 sscanf(pri_code, "%f", &(pl[i].pri)); 97 } else { 98 pl[i].pri = 1; 99 } 100 pl[i].string = SMB_STRDUP(lang_list[i]); 101 } 102 TALLOC_FREE(lang_list); 103 104 qsort(pl, lang_num, sizeof(struct pri_list), &qsort_cmp_list); 105 106 /* it's not an error to not initialise - we just fall back to 107 the default */ 108 109 for (i = 0; i < lang_num; i++) { 110 if (lang_tdb_init(pl[i].string)) break; 111 } 112 113 for (i = 0; i < lang_num; i++) { 114 SAFE_FREE(pl[i].string); 115 } 116 SAFE_FREE(pl); 117 118 return; 119} 120