--- lbbs/src/bbs_net.c 2025/10/04 15:55:26 1.60 +++ lbbs/src/bbs_net.c 2025/10/10 14:02:41 1.63 @@ -48,6 +48,8 @@ #define MAXSTATION 26 * 2 #define STATION_PER_LINE 4 +#define BBS_NET_DEFAULT_CHARSET "UTF-8" + struct _bbsnet_conf { char host1[20]; @@ -213,6 +215,9 @@ int bbsnet_io_buf_conv(iconv_t cd, char { 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); @@ -229,11 +234,13 @@ int bbsnet_io_buf_conv(iconv_t cd, char { if (in_bytes > out_bytes || out_bytes <= 0) { - errno = E2BIG; - return -1; + log_error("iconv(inbytes=%d, outbytes=%d) error: EILSEQ and E2BIG\n", in_bytes, out_bytes); + return -2; } - *out_buf++ = *in_buf++; + *out_buf = *in_buf; + in_buf++; + out_buf++; in_bytes--; out_bytes--; @@ -286,6 +293,9 @@ int bbsnet_connect(int n) int tos; char remote_addr[IP_ADDR_LEN]; int remote_port; + char local_addr[IP_ADDR_LEN]; + int local_port; + socklen_t sock_len; time_t t_used = time(NULL); struct tm *tm_used; int ch; @@ -465,20 +475,32 @@ int bbsnet_connect(int n) log_error("setsockopt IP_TOS=%d error (%d)\n", tos, errno); } + sock_len = sizeof(sin); + if (getsockname(sock, (struct sockaddr *)&sin, &sock_len) < 0) + { + log_error("getsockname() error: %d", errno); + goto cleanup; + } + + strncpy(local_addr, inet_ntoa(sin.sin_addr), sizeof(local_addr) - 1); + local_addr[sizeof(local_addr) - 1] = '\0'; + local_port = ntohs(sin.sin_port); + prints("\033[1;31m连接成功!\033[m\r\n"); iflush(); - log_common("BBSNET connect to %s:%d\n", remote_addr, remote_port); + log_common("BBSNET connect to %s:%d from %s:%d by [%s]\n", + remote_addr, remote_port, local_addr, local_port, BBS_username); - input_cd = iconv_open(bbsnet_conf[n].charset, "UTF-8"); + input_cd = iconv_open(bbsnet_conf[n].charset, BBS_NET_DEFAULT_CHARSET); if (input_cd == (iconv_t)(-1)) { - log_error("iconv_open(UTF8->GBK) error: %d\n", errno); + log_error("iconv_open(%s->%s) error: %d\n", BBS_NET_DEFAULT_CHARSET, bbsnet_conf[n].charset, errno); goto cleanup; } - output_cd = iconv_open("UTF-8", bbsnet_conf[n].charset); + output_cd = iconv_open(BBS_NET_DEFAULT_CHARSET, bbsnet_conf[n].charset); if (input_cd == (iconv_t)(-1)) { - log_error("iconv_open(GBK->UTF-8) error: %d\n", errno); + log_error("iconv_open(%s->%s) error: %d\n", bbsnet_conf[n].charset, BBS_NET_DEFAULT_CHARSET, errno); iconv_close(input_cd); goto cleanup; }