cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

nls_koi8-ru.c (1681B)


      1/*
      2 * linux/fs/nls/nls_koi8-ru.c
      3 *
      4 * Charset koi8-ru translation based on charset koi8-u.
      5 * The Unicode to charset table has only exact mappings.
      6 */
      7
      8#include <linux/module.h>
      9#include <linux/kernel.h>
     10#include <linux/string.h>
     11#include <linux/nls.h>
     12#include <linux/errno.h>
     13
     14static struct nls_table *p_nls;
     15
     16static int uni2char(const wchar_t uni,
     17		    unsigned char *out, int boundlen)
     18{
     19	if (boundlen <= 0)
     20		return -ENAMETOOLONG;
     21
     22	if ((uni & 0xffaf) == 0x040e || (uni & 0xffce) == 0x254c) {
     23		/* koi8-ru and koi8-u differ only on two characters */
     24		if (uni == 0x040e)
     25			out[0] = 0xbe;
     26		else if (uni == 0x045e)
     27			out[0] = 0xae;
     28		else if (uni == 0x255d || uni == 0x256c)
     29			return 0;
     30		else
     31			return p_nls->uni2char(uni, out, boundlen);
     32		return 1;
     33	}
     34	else
     35		/* fast path */
     36		return p_nls->uni2char(uni, out, boundlen);
     37}
     38
     39static int char2uni(const unsigned char *rawstring, int boundlen,
     40		    wchar_t *uni)
     41{
     42	int n;
     43
     44	if ((*rawstring & 0xef) != 0xae) {
     45		/* koi8-ru and koi8-u differ only on two characters */
     46		*uni = (*rawstring & 0x10) ? 0x040e : 0x045e;
     47		return 1;
     48	}
     49
     50	n = p_nls->char2uni(rawstring, boundlen, uni);
     51	return n;
     52}
     53
     54static struct nls_table table = {
     55	.charset	= "koi8-ru",
     56	.uni2char	= uni2char,
     57	.char2uni	= char2uni,
     58};
     59
     60static int __init init_nls_koi8_ru(void)
     61{
     62	p_nls = load_nls("koi8-u");
     63
     64	if (p_nls) {
     65		table.charset2upper = p_nls->charset2upper;
     66		table.charset2lower = p_nls->charset2lower;
     67		return register_nls(&table);
     68	}
     69
     70	return -EINVAL;
     71}
     72
     73static void __exit exit_nls_koi8_ru(void)
     74{
     75	unregister_nls(&table);
     76	unload_nls(p_nls);
     77}
     78
     79module_init(init_nls_koi8_ru)
     80module_exit(exit_nls_koi8_ru)
     81
     82MODULE_LICENSE("Dual BSD/GPL");