| 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 |
{ |
{ |
| 988 |
return -2; |
return -2; |
| 989 |
} |
} |
| 990 |
|
|
| 991 |
|
// reset in_bytes when "//IGNORE" is applied |
| 992 |
|
if (in_bytes == 0) |
| 993 |
|
{ |
| 994 |
|
in_bytes = (size_t)(*p_buf_len - *p_buf_offset); |
| 995 |
|
} |
| 996 |
|
|
| 997 |
*out_buf = *in_buf; |
*out_buf = *in_buf; |
| 998 |
in_buf++; |
in_buf++; |
| 999 |
out_buf++; |
out_buf++; |
| 1018 |
|
|
| 1019 |
int io_conv_init(const char *charset) |
int io_conv_init(const char *charset) |
| 1020 |
{ |
{ |
| 1021 |
|
char tocode[32]; |
| 1022 |
|
|
| 1023 |
if (charset == NULL) |
if (charset == NULL) |
| 1024 |
{ |
{ |
| 1025 |
log_error("NULL pointer error\n"); |
log_error("NULL pointer error\n"); |
| 1028 |
|
|
| 1029 |
io_conv_cleanup(); |
io_conv_cleanup(); |
| 1030 |
|
|
| 1031 |
snprintf(stdio_charset, sizeof(stdio_charset), "%s//TRANSLIT", charset); |
strncpy(stdio_charset, charset, sizeof(stdio_charset) - 1); |
| 1032 |
|
stdio_charset[sizeof(stdio_charset) - 1] = '\0'; |
| 1033 |
|
|
| 1034 |
stdin_cd = iconv_open(BBS_DEFAULT_CHARSET, stdio_charset); |
stdin_cd = iconv_open(BBS_DEFAULT_CHARSET "//IGNORE", stdio_charset); |
| 1035 |
if (stdin_cd == (iconv_t)(-1)) |
if (stdin_cd == (iconv_t)(-1)) |
| 1036 |
{ |
{ |
| 1037 |
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 "//IGNORE", errno); |
| 1038 |
return -2; |
return -2; |
| 1039 |
} |
} |
| 1040 |
stdout_cd = iconv_open(stdio_charset, BBS_DEFAULT_CHARSET); |
|
| 1041 |
|
snprintf(tocode, sizeof(tocode), "%s//TRANSLIT", stdio_charset); |
| 1042 |
|
stdout_cd = iconv_open(tocode, BBS_DEFAULT_CHARSET); |
| 1043 |
if (stdout_cd == (iconv_t)(-1)) |
if (stdout_cd == (iconv_t)(-1)) |
| 1044 |
{ |
{ |
| 1045 |
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); |
| 1046 |
iconv_close(stdin_cd); |
iconv_close(stdin_cd); |
| 1047 |
return -2; |
return -2; |
| 1048 |
} |
} |