2003-04-26 15:49:05 +04:00
/*
Unix SMB / CIFS implementation .
Samba module with developer tools
Copyright ( C ) Andrew Tridgell 2001
Copyright ( C ) Jelmer Vernooij 2002
This program is free software ; you can redistribute it and / or modify
it under the terms of the GNU General Public License as published by
2007-07-09 23:25:36 +04:00
the Free Software Foundation ; either version 3 of the License , or
2003-04-26 15:49:05 +04:00
( at your option ) any later version .
This program is distributed in the hope that it will be useful ,
but WITHOUT ANY WARRANTY ; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
GNU General Public License for more details .
You should have received a copy of the GNU General Public License
2007-07-10 04:52:41 +04:00
along with this program . If not , see < http : //www.gnu.org/licenses/>.
2003-04-26 15:49:05 +04:00
*/
# include "includes.h"
static struct {
char from ;
2005-09-30 21:13:37 +04:00
const char * to ;
2003-04-26 15:49:05 +04:00
int len ;
} weird_table [ ] = {
2005-05-31 17:46:45 +04:00
{ ' q ' , " ^q^ " , 3 } ,
{ ' Q ' , " ^Q^ " , 3 } ,
2003-04-26 15:49:05 +04:00
{ 0 , NULL }
} ;
2004-08-31 01:35:43 +04:00
static size_t weird_pull ( void * cd , const char * * inbuf , size_t * inbytesleft ,
2003-04-26 15:49:05 +04:00
char * * outbuf , size_t * outbytesleft )
{
while ( * inbytesleft > = 1 & & * outbytesleft > = 2 ) {
int i ;
int done = 0 ;
for ( i = 0 ; weird_table [ i ] . from ; i + + ) {
if ( strncmp ( ( * inbuf ) ,
weird_table [ i ] . to ,
weird_table [ i ] . len ) = = 0 ) {
if ( * inbytesleft < weird_table [ i ] . len ) {
DEBUG ( 0 , ( " ERROR: truncated weird string \n " ) ) ;
/* smb_panic("weird_pull"); */
} else {
( * outbuf ) [ 0 ] = weird_table [ i ] . from ;
( * outbuf ) [ 1 ] = 0 ;
( * inbytesleft ) - = weird_table [ i ] . len ;
( * outbytesleft ) - = 2 ;
( * inbuf ) + = weird_table [ i ] . len ;
( * outbuf ) + = 2 ;
done = 1 ;
break ;
}
}
}
if ( done ) continue ;
( * outbuf ) [ 0 ] = ( * inbuf ) [ 0 ] ;
( * outbuf ) [ 1 ] = 0 ;
( * inbytesleft ) - = 1 ;
( * outbytesleft ) - = 2 ;
( * inbuf ) + = 1 ;
( * outbuf ) + = 2 ;
}
if ( * inbytesleft > 0 ) {
errno = E2BIG ;
return - 1 ;
}
return 0 ;
}
2004-08-31 01:35:43 +04:00
static size_t weird_push ( void * cd , const char * * inbuf , size_t * inbytesleft ,
2003-04-26 15:49:05 +04:00
char * * outbuf , size_t * outbytesleft )
{
int ir_count = 0 ;
while ( * inbytesleft > = 2 & & * outbytesleft > = 1 ) {
int i ;
int done = 0 ;
for ( i = 0 ; weird_table [ i ] . from ; i + + ) {
if ( ( * inbuf ) [ 0 ] = = weird_table [ i ] . from & &
( * inbuf ) [ 1 ] = = 0 ) {
if ( * outbytesleft < weird_table [ i ] . len ) {
DEBUG ( 0 , ( " No room for weird character \n " ) ) ;
/* smb_panic("weird_push"); */
} else {
memcpy ( * outbuf , weird_table [ i ] . to ,
weird_table [ i ] . len ) ;
( * inbytesleft ) - = 2 ;
( * outbytesleft ) - = weird_table [ i ] . len ;
( * inbuf ) + = 2 ;
( * outbuf ) + = weird_table [ i ] . len ;
done = 1 ;
break ;
}
}
}
if ( done ) continue ;
( * outbuf ) [ 0 ] = ( * inbuf ) [ 0 ] ;
if ( ( * inbuf ) [ 1 ] ) ir_count + + ;
( * inbytesleft ) - = 2 ;
( * outbytesleft ) - = 1 ;
( * inbuf ) + = 2 ;
( * outbuf ) + = 1 ;
}
if ( * inbytesleft = = 1 ) {
errno = EINVAL ;
return - 1 ;
}
if ( * inbytesleft > 1 ) {
errno = E2BIG ;
return - 1 ;
}
return ir_count ;
}
struct charset_functions weird_functions = { " WEIRD " , weird_pull , weird_push } ;
2006-12-20 04:07:21 +03:00
NTSTATUS charset_weird_init ( void ) ;
2003-04-28 21:48:48 +04:00
NTSTATUS charset_weird_init ( void )
2003-04-26 15:49:05 +04:00
{
return smb_register_charset ( & weird_functions ) ;
}