| 31 |
#include <libssh/libssh.h> |
#include <libssh/libssh.h> |
| 32 |
#include <libssh/server.h> |
#include <libssh/server.h> |
| 33 |
|
|
| 34 |
char stdio_charset[32] = BBS_DEFAULT_CHARSET; |
char stdio_charset[20] = BBS_DEFAULT_CHARSET; |
| 35 |
|
|
| 36 |
// static input / output buffer |
// static input / output buffer |
| 37 |
static char stdin_buf[LINE_BUFFER_LEN]; |
static char stdin_buf[LINE_BUFFER_LEN]; |
| 38 |
static char stdin_conv[LINE_BUFFER_LEN]; |
static char stdout_buf[BUFSIZ]; |
| 39 |
static int stdin_buf_len = 0; |
static int stdin_buf_len = 0; |
| 40 |
static int stdin_conv_len = 0; |
static int stdout_buf_len = 0; |
| 41 |
static int stdin_buf_offset = 0; |
static int stdin_buf_offset = 0; |
| 42 |
static int stdin_conv_offset = 0; |
static int stdout_buf_offset = 0; |
| 43 |
|
|
| 44 |
static char stdout_buf[BUFSIZ]; |
static char stdin_conv[LINE_BUFFER_LEN * 2]; |
| 45 |
static char stdout_conv[BUFSIZ]; |
static char stdout_conv[BUFSIZ * 2]; |
| 46 |
static int stdout_buf_len = 0; |
static int stdin_conv_len = 0; |
| 47 |
static int stdout_conv_len = 0; |
static int stdout_conv_len = 0; |
| 48 |
static int stdout_buf_offset = 0; |
static int stdin_conv_offset = 0; |
| 49 |
static int stdout_conv_offset = 0; |
static int stdout_conv_offset = 0; |
| 50 |
|
|
| 51 |
static iconv_t stdin_cd = NULL; |
static iconv_t stdin_cd = NULL; |
| 285 |
flags = fcntl(STDIN_FILENO, F_GETFL, 0); |
flags = fcntl(STDIN_FILENO, F_GETFL, 0); |
| 286 |
fcntl(STDIN_FILENO, F_SETFL, flags | O_NONBLOCK); |
fcntl(STDIN_FILENO, F_SETFL, flags | O_NONBLOCK); |
| 287 |
|
|
| 288 |
for (loop = 1; loop && stdin_conv_offset >= stdin_conv_len && !SYS_server_exit;) |
for (loop = 1; loop && stdin_buf_len < sizeof(stdin_buf) && stdin_conv_offset >= stdin_conv_len && !SYS_server_exit;) |
| 289 |
{ |
{ |
| 290 |
if (SSH_v2 && ssh_channel_is_closed(SSH_channel)) |
if (SSH_v2 && ssh_channel_is_closed(SSH_channel)) |
| 291 |
{ |
{ |
| 1012 |
|
|
| 1013 |
int io_conv_init(const char *charset) |
int io_conv_init(const char *charset) |
| 1014 |
{ |
{ |
| 1015 |
|
char tocode[32]; |
| 1016 |
|
|
| 1017 |
if (charset == NULL) |
if (charset == NULL) |
| 1018 |
{ |
{ |
| 1019 |
log_error("NULL pointer error\n"); |
log_error("NULL pointer error\n"); |
| 1022 |
|
|
| 1023 |
io_conv_cleanup(); |
io_conv_cleanup(); |
| 1024 |
|
|
| 1025 |
snprintf(stdio_charset, sizeof(stdio_charset), "%s//TRANSLIT", charset); |
strncpy(stdio_charset, charset, sizeof(stdio_charset) - 1); |
| 1026 |
|
stdio_charset[sizeof(stdio_charset) - 1] = '\0'; |
| 1027 |
|
|
| 1028 |
stdin_cd = iconv_open(BBS_DEFAULT_CHARSET, stdio_charset); |
stdin_cd = iconv_open(BBS_DEFAULT_CHARSET "//TRANSLIT", stdio_charset); |
| 1029 |
if (stdin_cd == (iconv_t)(-1)) |
if (stdin_cd == (iconv_t)(-1)) |
| 1030 |
{ |
{ |
| 1031 |
log_error("iconv_open(%s->%s) error: %d\n", stdio_charset, BBS_DEFAULT_CHARSET, errno); |
log_error("iconv_open(%s->%s) error: %d\n", stdio_charset, BBS_DEFAULT_CHARSET "//TRANSLIT", errno); |
| 1032 |
return -2; |
return -2; |
| 1033 |
} |
} |
| 1034 |
stdout_cd = iconv_open(stdio_charset, BBS_DEFAULT_CHARSET); |
|
| 1035 |
|
snprintf(tocode, sizeof(tocode), "%s//TRANSLIT", stdio_charset); |
| 1036 |
|
stdout_cd = iconv_open(tocode, BBS_DEFAULT_CHARSET); |
| 1037 |
if (stdout_cd == (iconv_t)(-1)) |
if (stdout_cd == (iconv_t)(-1)) |
| 1038 |
{ |
{ |
| 1039 |
log_error("iconv_open(%s->%s) error: %d\n", BBS_DEFAULT_CHARSET, stdio_charset, errno); |
log_error("iconv_open(%s->%s) error: %d\n", BBS_DEFAULT_CHARSET, tocode, errno); |
| 1040 |
iconv_close(stdin_cd); |
iconv_close(stdin_cd); |
| 1041 |
return -2; |
return -2; |
| 1042 |
} |
} |