1
0
mirror of https://github.com/samba-team/samba.git synced 2025-02-11 17:58:16 +03:00
samba-mirror/source/lib/charset.c
Samba Release Account 7719fb0652 modified become_master() to a state-based system. becoming a master
is now performed in stages: wait for each NetBIOS name to be
successfully registered before proceeding to the next stage.

tied implicit name registration and release (broadcast method) to the
same piece of code as explicit method (via WINS server).

created special_browser_name() function that checks __MSBROWSE__
name: this name is ignored by WINS servers apparently.

fixed likely incompatibility between refresh_my_names() and add_my_names().
(netbios entries were unlikely to be refreshed).

NOTE: none of these changes have been tested. at all.

lkcl
-

112 lines
3.3 KiB
C

/*
Unix SMB/Netbios implementation.
Version 1.9.
Character set handling
Copyright (C) Andrew Tridgell 1992-1995
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
the Free Software Foundation; either version 2 of the License, or
(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
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#define CHARSET_C
#include "includes.h"
extern int DEBUGLEVEL;
char xx_dos_char_map[256];
char xx_upper_char_map[256];
char xx_lower_char_map[256];
char *dos_char_map = NULL;
char *upper_char_map = NULL;
char *lower_char_map = NULL;
static void add_dos_char(int lower, int upper)
{
DEBUG(6,("Adding chars 0%o 0%o\n",lower,upper));
if (lower) dos_char_map[(char)lower] = 1;
if (upper) dos_char_map[(char)upper] = 1;
if (lower && upper) {
lower_char_map[(char)upper] = (char)lower;
upper_char_map[(char)lower] = (char)upper;
}
}
/****************************************************************************
initialise the charset arrays
****************************************************************************/
void charset_initialise(void)
{
int i;
dos_char_map = &xx_dos_char_map[128];
upper_char_map = &xx_upper_char_map[128];
lower_char_map = &xx_lower_char_map[128];
for (i= -128;i<=127;i++) {
dos_char_map[(char)i] = 0;
}
for (i=0;i<=127;i++) {
if (isalnum((char)i) || strchr("._^$~!#%&-{}()@'`",(char)i))
add_dos_char(i,0);
}
for (i= -128;i<=127;i++) {
char c = (char)i;
upper_char_map[i] = lower_char_map[i] = c;
if (isupper(c)) lower_char_map[c] = tolower(c);
if (islower(c)) upper_char_map[c] = toupper(c);
}
/* valid for all DOS PC */
add_dos_char(142,0); /* A trema */
add_dos_char(143,0); /* A o */
add_dos_char(144,0); /* E ' */
add_dos_char(146,0); /* AE */
add_dos_char(153,0); /* O trema */
add_dos_char(154,0); /* U trema */
add_dos_char(165,0); /* N tilda */
add_dos_char(128,0); /* C cedille */
add_dos_char(156,0); /* Pound */
add_dos_char(183,0); /* A ` (WIN)*/
add_dos_char(157,0); /* Phi (WIN)*/
add_dos_char(212,0); /* E` (WIN)*/
}
/*******************************************************************
add characters depending on a string passed by the user
********************************************************************/
void add_char_string(char *s)
{
char *extra_chars = (char *)strdup(s);
char *t;
if (!extra_chars) return;
for (t=strtok(extra_chars," \t\r\n"); t; t=strtok(NULL," \t\r\n")) {
char c1=0,c2=0;
int i1=0,i2=0;
if (isdigit(*t) || (*t)=='-') {
sscanf(t,"%i:%i",&i1,&i2);
add_dos_char(i1,i2);
} else {
sscanf(t,"%c:%c",&c1,&c2);
add_dos_char(c1,c2);
}
}
free(extra_chars);
}