Line data Source code
1 : /* 2 : Unix SMB/CIFS implementation. 3 : Samba module with developer tools 4 : Copyright (C) Andrew Tridgell 2001 5 : Copyright (C) Jelmer Vernooij 2002 6 : 7 : This program is free software; you can redistribute it and/or modify 8 : it under the terms of the GNU General Public License as published by 9 : the Free Software Foundation; either version 3 of the License, or 10 : (at your option) any later version. 11 : 12 : This program is distributed in the hope that it will be useful, 13 : but WITHOUT ANY WARRANTY; without even the implied warranty of 14 : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 : GNU General Public License for more details. 16 : 17 : You should have received a copy of the GNU General Public License 18 : along with this program. If not, see <http://www.gnu.org/licenses/>. 19 : */ 20 : 21 : #include "replace.h" 22 : #include "charset_proto.h" 23 : 24 : #ifdef DEVELOPER 25 : 26 : static struct { 27 : char from; 28 : const char *to; 29 : int len; 30 : } weird_table[] = { 31 : { 32 : .from = 'q', 33 : .to = "^q^", 34 : .len = 3, 35 : }, 36 : { 37 : .from = 'Q', 38 : .to = "^Q^", 39 : .len = 3, 40 : }, 41 : { 42 : .len = 0, 43 : } 44 : }; 45 : 46 0 : size_t weird_pull(void *cd, const char **inbuf, size_t *inbytesleft, 47 : char **outbuf, size_t *outbytesleft) 48 : { 49 0 : while (*inbytesleft >= 1 && *outbytesleft >= 2) { 50 : int i; 51 0 : int done = 0; 52 0 : for (i=0;weird_table[i].from;i++) { 53 0 : if (strncmp((*inbuf), 54 : weird_table[i].to, 55 0 : weird_table[i].len) == 0) { 56 0 : if (*inbytesleft < weird_table[i].len) { 57 0 : abort(); 58 : } 59 : 60 0 : (*outbuf)[0] = weird_table[i].from; 61 0 : (*outbuf)[1] = 0; 62 0 : (*inbytesleft) -= weird_table[i].len; 63 0 : (*outbytesleft) -= 2; 64 0 : (*inbuf) += weird_table[i].len; 65 0 : (*outbuf) += 2; 66 0 : done = 1; 67 0 : break; 68 : } 69 : } 70 0 : if (done) continue; 71 0 : (*outbuf)[0] = (*inbuf)[0]; 72 0 : (*outbuf)[1] = 0; 73 0 : (*inbytesleft) -= 1; 74 0 : (*outbytesleft) -= 2; 75 0 : (*inbuf) += 1; 76 0 : (*outbuf) += 2; 77 : } 78 : 79 0 : if (*inbytesleft > 0) { 80 0 : errno = E2BIG; 81 0 : return -1; 82 : } 83 : 84 0 : return 0; 85 : } 86 : 87 0 : size_t weird_push(void *cd, const char **inbuf, size_t *inbytesleft, 88 : char **outbuf, size_t *outbytesleft) 89 : { 90 0 : int ir_count=0; 91 : 92 0 : while (*inbytesleft >= 2 && *outbytesleft >= 1) { 93 : int i; 94 0 : int done=0; 95 0 : for (i=0;weird_table[i].from;i++) { 96 0 : if ((*inbuf)[0] == weird_table[i].from && 97 0 : (*inbuf)[1] == 0) { 98 0 : if (*outbytesleft < weird_table[i].len) { 99 0 : abort(); 100 : } 101 0 : memcpy(*outbuf, 102 0 : weird_table[i].to, 103 0 : weird_table[i].len); 104 0 : (*inbytesleft) -= 2; 105 0 : (*outbytesleft) -= weird_table[i].len; 106 0 : (*inbuf) += 2; 107 0 : (*outbuf) += weird_table[i].len; 108 0 : done = 1; 109 0 : break; 110 : } 111 : } 112 0 : if (done) continue; 113 : 114 0 : (*outbuf)[0] = (*inbuf)[0]; 115 0 : if ((*inbuf)[1]) ir_count++; 116 0 : (*inbytesleft) -= 2; 117 0 : (*outbytesleft) -= 1; 118 0 : (*inbuf) += 2; 119 0 : (*outbuf) += 1; 120 : } 121 : 122 0 : if (*inbytesleft == 1) { 123 0 : errno = EINVAL; 124 0 : return -1; 125 : } 126 : 127 0 : if (*inbytesleft > 1) { 128 0 : errno = E2BIG; 129 0 : return -1; 130 : } 131 : 132 0 : return ir_count; 133 : } 134 : 135 : #else 136 : void charset_weird_dummy(void); 137 : void charset_weird_dummy(void) 138 : { 139 : return; 140 : } 141 : 142 : #endif