1 /*
   2  * CDDL HEADER START
   3  *
   4  * The contents of this file are subject to the terms of the
   5  * Common Development and Distribution License (the "License").
   6  * You may not use this file except in compliance with the License.
   7  *
   8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
   9  * or http://www.opensolaris.org/os/licensing.
  10  * See the License for the specific language governing permissions
  11  * and limitations under the License.
  12  *
  13  * When distributing Covered Code, include this CDDL HEADER in each
  14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  15  * If applicable, add the following below this CDDL HEADER, with the
  16  * fields enclosed by brackets "[]" replaced with your own identifying
  17  * information: Portions Copyright [yyyy] [name of copyright owner]
  18  *
  19  * CDDL HEADER END
  20  */
  21 /*
  22  * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
  23  * Use is subject to license terms.
  24  *
  25  * Copyright 2017 RackTop Systems.
  26  */
  27 
  28 #ifndef _SYS_KICONV_H
  29 #define _SYS_KICONV_H
  30 
  31 #ifdef __cplusplus
  32 extern "C" {
  33 #endif
  34 
  35 #include <sys/types.h>
  36 
  37 #if defined(_KERNEL) || defined(_FAKE_KERNEL)
  38 
  39 /*
  40  * Supported fromcode/tocode values are saved in the following component type
  41  * of (name, id) pair. The id values of fromcode and tocode are used to
  42  * find out the corresponding code conversions.
  43  */
  44 typedef struct {
  45         char            *name;
  46         size_t          id;
  47 } kiconv_code_list_t;
  48 
  49 /*
  50  * Each unique kiconv code conversion identified by tocode and fromcode ids
  51  * have corresponding module id and internal function pointers to open(),
  52  * kiconv(), close(), and kiconvstr().
  53  */
  54 typedef struct {
  55         uint16_t        tid;            /* tocode id. */
  56         uint16_t        fid;            /* fromcode id. */
  57         uint16_t        mid;            /* module id. */
  58         void            *(*open)(void);
  59         size_t          (*kiconv)(void *, char **, size_t *, char **, size_t *,
  60                         int *);
  61         int             (*close)(void *);
  62         size_t          (*kiconvstr)(char *, size_t *, char *, size_t *, int,
  63                         int *);
  64 } kiconv_conv_list_t;
  65 
  66 /*
  67  * Each module id has a corresponding module name that is used to load
  68  * the module as needed and a reference counter.
  69  */
  70 typedef struct {
  71         char            *name;
  72         uint_t          refcount;
  73 } kiconv_mod_list_t;
  74 
  75 /*
  76  * The following two data structures are being used to transfer information
  77  * on the supported kiconv code conversions from a module to the framework.
  78  *
  79  * Details can be found from kiconv_ops(9S) and kiconv_module_info(9S)
  80  * man pages at PSARC/2007/173.
  81  */
  82 typedef struct {
  83         char            *tocode;
  84         char            *fromcode;
  85         void            *(*kiconv_open)(void);
  86         size_t          (*kiconv)(void *, char **, size_t *, char **, size_t *,
  87                         int *);
  88         int             (*kiconv_close)(void *);
  89         size_t          (*kiconvstr)(char *, size_t *, char *, size_t *, int,
  90                         int *);
  91 } kiconv_ops_t;
  92 
  93 typedef struct kiconv_mod_info {
  94         char            *module_name;
  95         size_t          kiconv_num_convs;
  96         kiconv_ops_t    *kiconv_ops_tbl;
  97         size_t          kiconv_num_aliases;
  98         char            **aliases;
  99         char            **canonicals;
 100         int             nowait;
 101 } kiconv_module_info_t;
 102 
 103 /* The kiconv code conversion descriptor data structure. */
 104 typedef struct {
 105         void            *handle;        /* Handle from the actual open(). */
 106         size_t          id;             /* Index to the conv_list[]. */
 107 } kiconv_data_t, *kiconv_t;
 108 
 109 /* Common conversion state data structure. */
 110 typedef struct {
 111         uint8_t         id;
 112         uint8_t         bom_processed;
 113 } kiconv_state_data_t, *kiconv_state_t;
 114 
 115 /* Common component types for possible code conversion mapping tables. */
 116 typedef struct {
 117         uchar_t         u8[3];
 118 } kiconv_to_utf8_tbl_comp_t;
 119 
 120 typedef struct {
 121         uint32_t        u8:24;
 122         uint32_t        sb:8;
 123 } kiconv_to_sb_tbl_comp_t;
 124 
 125 /*
 126  * The maximum name length for any given codeset or alias names; the following
 127  * should be plenty big enough.
 128  */
 129 #define KICONV_MAX_CODENAME_LEN         63
 130 
 131 /* The following characters do not exist in the normalized code names. */
 132 #define KICONV_SKIPPABLE_CHAR(c)        \
 133         ((c) == '-' || (c) == '_' || (c) == '.' || (c) == '@')
 134 
 135 /*
 136  * When we encounter non-identical characters, as like iconv(3C) we have,
 137  * map them into either one of the replacement characters based on what is
 138  * the current target tocde.
 139  *
 140  * The 0xefbfdb in UTF-8 is U+FFFD in Unicode scalar value.
 141  */
 142 #define KICONV_ASCII_REPLACEMENT_CHAR   ('?')
 143 #define KICONV_UTF8_REPLACEMENT_CHAR    (0xefbfbd)
 144 
 145 /* Numeric ids for kiconv modules. */
 146 #define KICONV_EMBEDDED                 (0)
 147 #define KICONV_MODULE_ID_JA             (1)
 148 #define KICONV_MODULE_ID_SC             (2)
 149 #define KICONV_MODULE_ID_KO             (3)
 150 #define KICONV_MODULE_ID_TC             (4)
 151 #define KICONV_MODULE_ID_EMEA           (5)
 152 
 153 #define KICONV_MAX_MODULE_ID            KICONV_MODULE_ID_EMEA
 154 
 155 /* Functions used in kiconv conversion and module management. */
 156 extern void     kiconv_init();
 157 extern int      kiconv_register_module(kiconv_module_info_t *);
 158 extern int      kiconv_unregister_module(kiconv_module_info_t *);
 159 extern size_t   kiconv_module_ref_count(size_t);
 160 
 161 #endif  /* _KERNEL */
 162 
 163 #ifdef __cplusplus
 164 }
 165 #endif
 166 
 167 #endif /* _SYS_KICONV_H */