#include <commonp.h>
#include <com.h>
#include <dce/rpcsts.h>
#include <dce/codesets.h>
#include <stdio.h>
#include <stdlib.h>
#include <iconv.h>
#include <langinfo.h>
#include <string.h>
#include <errno.h>
#if 0
#include <codesets.h>
#endif
#include <cs_s.h>
void stub_conversion
(
rpc_binding_handle_t h __attribute((unused)),
boolean32 server_side __attribute((unused)),
unsigned32 from_tag,
unsigned32 to_tag,
byte_t *conv_ldata,
unsigned32 conv_l_data_len,
byte_t *conv_wdata,
unsigned32 *conv_p_w_data_len,
error_status_t *status
)
{
iconv_t cd;
byte_t *ldata = conv_ldata;
byte_t *wdata = conv_wdata;
size_t inbytesleft;
size_t outbytesleft;
char *iconv_from_cd;
char *iconv_to_cd;
int i_ret;
size_t init_len;
dce_cs_rgy_to_loc (
from_tag,
(idl_char **)&iconv_from_cd,
NULL,
NULL,
status );
if (*status != dce_cs_c_ok)
return;
dce_cs_rgy_to_loc (
to_tag,
(idl_char **)&iconv_to_cd,
NULL,
NULL,
status );
if (*status != dce_cs_c_ok)
return;
if ((cd = iconv_open(iconv_to_cd, iconv_from_cd)) == (iconv_t)-1)
{
*status = rpc_s_ss_incompatible_codesets;
return;
}
init_len = strlen((char *)ldata);
inbytesleft = init_len;
outbytesleft = (size_t)conv_l_data_len * sizeof(unsigned_char_t);
i_ret = iconv(cd, (const char **)&ldata, &inbytesleft, (char **)&wdata, &outbytesleft);
if (i_ret)
{
if (errno == EILSEQ)
*status = rpc_s_ss_invalid_char_input;
else if (errno == E2BIG)
*status = rpc_s_ss_short_conv_buffer;
else if (errno == EINVAL)
*status = rpc_s_ss_invalid_char_input;
i_ret = iconv_close(cd);
return;
}
*wdata = '\0';
if ((i_ret = iconv_close(cd)) == -1)
{
*status = rpc_s_ss_iconv_error;
return;
}
if (conv_p_w_data_len != NULL)
{
*conv_p_w_data_len = strlen((char *)conv_wdata);
}
*status = rpc_s_ok;
return;
}