| 31 |
#include <time.h> |
#include <time.h> |
| 32 |
#include <unistd.h> |
#include <unistd.h> |
| 33 |
#include <arpa/inet.h> |
#include <arpa/inet.h> |
|
#include <iconv.h> |
|
| 34 |
#include <libssh/libssh.h> |
#include <libssh/libssh.h> |
| 35 |
#include <libssh/server.h> |
#include <libssh/server.h> |
| 36 |
#include <libssh/callbacks.h> |
#include <libssh/callbacks.h> |
| 194 |
iflush(); |
iflush(); |
| 195 |
} |
} |
| 196 |
|
|
|
int bbsnet_io_buf_conv(iconv_t cd, char *p_buf, int *p_buf_len, int *p_buf_offset, char *p_conv, size_t conv_size, int *p_conv_len) |
|
|
{ |
|
|
char *in_buf; |
|
|
char *out_buf; |
|
|
size_t in_bytes; |
|
|
size_t out_bytes; |
|
|
int ret; |
|
|
|
|
|
in_buf = p_buf + *p_buf_offset; |
|
|
in_bytes = (size_t)(*p_buf_len - *p_buf_offset); |
|
|
out_buf = p_conv + *p_conv_len; |
|
|
out_bytes = conv_size - (size_t)(*p_conv_len); |
|
|
|
|
|
while (in_bytes > 0) |
|
|
{ |
|
|
ret = (int)iconv(cd, &in_buf, &in_bytes, &out_buf, &out_bytes); |
|
|
if (ret == -1) |
|
|
{ |
|
|
if (errno == EINVAL) // Incomplete |
|
|
{ |
|
|
#ifdef _DEBUG |
|
|
log_error("iconv(inbytes=%d, outbytes=%d) error: EINVAL\n", in_bytes, out_bytes); |
|
|
#endif |
|
|
*p_buf_len = (int)(p_buf + *p_buf_len - in_buf); |
|
|
*p_buf_offset = 0; |
|
|
*p_conv_len = (int)(conv_size - out_bytes); |
|
|
memmove(p_buf, in_buf, (size_t)(*p_buf_len)); |
|
|
|
|
|
break; |
|
|
} |
|
|
else if (errno == E2BIG) |
|
|
{ |
|
|
log_error("iconv(inbytes=%d, outbytes=%d) error: E2BIG\n", in_bytes, out_bytes); |
|
|
return -1; |
|
|
} |
|
|
else if (errno == EILSEQ) |
|
|
{ |
|
|
if (in_bytes > out_bytes || out_bytes <= 0) |
|
|
{ |
|
|
log_error("iconv(inbytes=%d, outbytes=%d) error: EILSEQ and E2BIG\n", in_bytes, out_bytes); |
|
|
return -2; |
|
|
} |
|
|
|
|
|
*out_buf = *in_buf; |
|
|
in_buf++; |
|
|
out_buf++; |
|
|
in_bytes--; |
|
|
out_bytes--; |
|
|
|
|
|
continue; |
|
|
} |
|
|
} |
|
|
else |
|
|
{ |
|
|
*p_buf_len = 0; |
|
|
*p_buf_offset = 0; |
|
|
*p_conv_len = (int)(conv_size - out_bytes); |
|
|
|
|
|
break; |
|
|
} |
|
|
} |
|
|
|
|
|
return 0; |
|
|
} |
|
|
|
|
| 197 |
int bbsnet_connect(int n) |
int bbsnet_connect(int n) |
| 198 |
{ |
{ |
| 199 |
int sock, ret, loop, error; |
int sock, ret, loop, error; |
| 587 |
{ |
{ |
| 588 |
if (input_buf_offset < input_buf_len) |
if (input_buf_offset < input_buf_len) |
| 589 |
{ |
{ |
| 590 |
ret = bbsnet_io_buf_conv(input_cd, input_buf, &input_buf_len, &input_buf_offset, input_conv, sizeof(input_conv), &input_conv_len); |
ret = io_buf_conv(input_cd, input_buf, &input_buf_len, &input_buf_offset, input_conv, sizeof(input_conv), &input_conv_len); |
| 591 |
if (ret < 0) |
if (ret < 0) |
| 592 |
{ |
{ |
| 593 |
log_error("bbsnet_io_buf_conv(input, %d, %d, %d) error\n", input_buf_len, input_buf_offset, input_conv_len); |
log_error("io_buf_conv(input, %d, %d, %d) error\n", input_buf_len, input_buf_offset, input_conv_len); |
| 594 |
} |
} |
| 595 |
} |
} |
| 596 |
|
|
| 682 |
{ |
{ |
| 683 |
if (output_buf_offset < output_buf_len) |
if (output_buf_offset < output_buf_len) |
| 684 |
{ |
{ |
| 685 |
ret = bbsnet_io_buf_conv(output_cd, output_buf, &output_buf_len, &output_buf_offset, output_conv, sizeof(output_conv), &output_conv_len); |
ret = io_buf_conv(output_cd, output_buf, &output_buf_len, &output_buf_offset, output_conv, sizeof(output_conv), &output_conv_len); |
| 686 |
if (ret < 0) |
if (ret < 0) |
| 687 |
{ |
{ |
| 688 |
log_error("bbsnet_io_buf_conv(output, %d, %d, %d) error\n", output_buf_len, output_buf_offset, output_conv_len); |
log_error("io_buf_conv(output, %d, %d, %d) error\n", output_buf_len, output_buf_offset, output_conv_len); |
| 689 |
} |
} |
| 690 |
} |
} |
| 691 |
|
|