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 2 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, write to the Free Software 17 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 18 19 Created by Ryo Kawahara <rkawa@lbe.co.jp> 20*/ 21 22#include "includes.h" 23#include "web/swat_proto.h" 24 25/* 26 during a file download we first check to see if there is a language 27 specific file available. If there is then use that, otherwise 28 just open the specified file 29*/ 30int web_open(const char *fname, int flags, mode_t mode) 31{ 32 char *p = NULL; 33 char *lang = lang_tdb_current(); 34 int fd; 35 if (lang) { 36 asprintf(&p, "lang/%s/%s", lang, fname); 37 if (p) { 38 fd = sys_open(p, flags, mode); 39 free(p); 40 if (fd != -1) { 41 return fd; 42 } 43 } 44 } 45 46 /* fall through to default name */ 47 return sys_open(fname, flags, mode); 48} 49 50 51struct pri_list { 52 float pri; 53 char *string; 54}; 55 56static int qsort_cmp_list(const void *x, const void *y) { 57 struct pri_list *a = (struct pri_list *)x; 58 struct pri_list *b = (struct pri_list *)y; 59 if (a->pri > b->pri) return -1; 60 if (a->pri == b->pri) return 0; 61 return 1; 62} 63 64/* 65 choose from a list of languages. The list can be comma or space 66 separated 67 Keep choosing until we get a hit 68 Changed to habdle priority -- Simo 69*/ 70 71void web_set_lang(const char *lang_string) 72{ 73 char **lang_list, **count; 74 struct pri_list *pl; 75 int lang_num, i; 76 77 /* build the lang list */ 78 lang_list = str_list_make(lang_string, ", \t\r\n"); 79 if (!lang_list) return; 80 81 /* sort the list by priority */ 82 lang_num = 0; 83 count = lang_list; 84 while (*count && **count) { 85 count++; 86 lang_num++; 87 } 88 pl = SMB_MALLOC_ARRAY(struct pri_list, lang_num); 89 for (i = 0; i < lang_num; i++) { 90 char *pri_code; 91 if ((pri_code=strstr(lang_list[i], ";q="))) { 92 *pri_code = '\0'; 93 pri_code += 3; 94 sscanf(pri_code, "%f", &(pl[i].pri)); 95 } else { 96 pl[i].pri = 1; 97 } 98 pl[i].string = SMB_STRDUP(lang_list[i]); 99 } 100 str_list_free(&lang_list); 101 102 qsort(pl, lang_num, sizeof(struct pri_list), &qsort_cmp_list); 103 104 /* it's not an error to not initialise - we just fall back to 105 the default */ 106 107 for (i = 0; i < lang_num; i++) { 108 if (lang_tdb_init(pl[i].string)) break; 109 } 110 111 for (i = 0; i < lang_num; i++) { 112 SAFE_FREE(pl[i].string); 113 } 114 SAFE_FREE(pl); 115 116 return; 117} 118