summaryrefslogtreecommitdiffstats
path: root/mbbsd
diff options
context:
space:
mode:
Diffstat (limited to 'mbbsd')
-rw-r--r--mbbsd/convert.c94
-rw-r--r--mbbsd/io.c39
-rw-r--r--mbbsd/mbbsd.c18
3 files changed, 60 insertions, 91 deletions
diff --git a/mbbsd/convert.c b/mbbsd/convert.c
index 141548d1..75480ab1 100644
--- a/mbbsd/convert.c
+++ b/mbbsd/convert.c
@@ -4,74 +4,58 @@
* The following code is copied and modified from "autoconvert" with GPL.
*/
-#ifdef GB_CONVERT
+#ifdef CONVERT
-#include "convert.h"
+extern read_write_type write_type;
+extern read_write_type read_type;
-char *hzconvert(char *, int *, char *, void (*dbcvrt)());
-
-extern const unsigned char GtoB[], BtoG[];
-
-#define c1 (unsigned char)(s[0])
-#define c2 (unsigned char)(s[1])
-
-static void g2b(char *s)
+static int gb_read(int fd, void *buf, size_t count)
{
- unsigned int i;
-
- if ((c1 >= 0x81) && (c1 <= 0xfe) && (c2 >= 0x40) && (c2 <= 0xfe) && (c2 != 0x7f)) {
- /*
- * c1c2 in the table
- */
- if (c2 < 0x7f)
- i = ((c1 - 0x81) * 190 + (c2 - 0x40)) * 2;
- else
- i = ((c1 - 0x81) * 190 + (c2 - 0x41)) * 2;
- s[0] = GtoB[i++];
- s[1] = GtoB[i];
- } else { /* c1c2 not in the table */
- if ((char) s[1] >= 0) /* half HANZI-character */
- s[0] = '?';
- else { /* invalid gbk-character */
- s[0] = GtoB_bad1;
- s[1] = GtoB_bad2;
- }
- }
+ int len = read(fd, buf, count);
+ if (len > 0)
+ gb2big(buf, len);
+ return len;
}
-static void b2g(char *s)
+static int gb_write(int fd, void *buf, size_t count)
{
- unsigned int i;
+ big2gb(buf, count);
+ return write(fd, buf, count);
+}
- if ((c1 >= 0x81) && (c1 <= 0xfe) && (c2 >= 0x40) && (c2 <= 0xfe) && (c2 != 0x7f)) {
- /*
- * c1c2 in the table
- */
- if (c2 < 0x7f)
- i = ((c1 - 0x81) * 190 + (c2 - 0x40)) * 2;
- else
- i = ((c1 - 0x81) * 190 + (c2 - 0x41)) * 2;
- s[0] = BtoG[i++];
- s[1] = BtoG[i];
- } else { /* c1c2 not in the table */
- if ((char) s[1] >= 0) /* half HANZI-character */
- s[0] = '?';
- else { /* invalid big5-character */
- s[0] = BtoG_bad1;
- s[1] = BtoG_bad2;
- }
+static int utf8_read(int fd, void *buf, size_t count)
+{
+ count = read(fd, buf, count);
+ if (count > 0) {
+ strcpy(buf, utf8_uni(buf, &count, 0));
+ uni2big(buf, &count, 0);
+ ((char *)buf)[count] = 0;
}
+ return count;
}
-unsigned char *gb2big(unsigned char *s, int plen)
+static int utf8_write(int fd, void *buf, size_t count)
{
- unsigned char c = 0;
- return hzconvert(s, &plen, &c, g2b);
+ strcpy(buf, big2uni(buf, &count, 0));
+ uni_utf8(buf, &count, 0);
+ ((char *)buf)[count] = 0;
+ return write(fd, buf, count);
}
-unsigned char *big2gb(unsigned char *s, int plen)
+void set_converting_type(int which)
{
- unsigned char c = 0;
- return hzconvert(s, &plen, &c, b2g);
+ if (which == CONV_NORMAL) {
+ read_type = read;
+ write_type = (read_write_type)write;
+ }
+ else if (which == CONV_GB) {
+ read_type = gb_read;
+ write_type = gb_write;
+ }
+ else if (which == CONV_UTF8) {
+ read_type = utf8_read;
+ write_type = utf8_write;
+ }
}
+
#endif
diff --git a/mbbsd/io.c b/mbbsd/io.c
index 41ce6813..97ddb35d 100644
--- a/mbbsd/io.c
+++ b/mbbsd/io.c
@@ -17,37 +17,10 @@ static int icurrchar = 0;
/* ----------------------------------------------------- */
/* convert routines */
/* ----------------------------------------------------- */
-#ifdef GB_CONVERT
+#ifdef CONVERT
-typedef int (* read_write_type)(int, void *, size_t);
-static read_write_type write_type = (read_write_type)write;
-static read_write_type read_type = read;
-
-int converting_read(int fd, void *buf, size_t count)
-{
- int len = read(fd, buf, count);
- if (len >= 0)
- gb2big(buf, len);
- return len;
-}
-
-int converting_write(int fd, void *buf, size_t count)
-{
- big2gb(buf, count);
- return write(fd, buf, count);
-}
-
-void set_converting_type(int which)
-{
- if (which == 0) {
- read_type = read;
- write_type = (read_write_type)write;
- }
- else if (which == 1) {
- read_type = converting_read;
- write_type = converting_write;
- }
-}
+read_write_type write_type = (read_write_type)write;
+read_write_type read_type = read;
inline static int read_wrapper(int fd, void *buf, size_t count) {
return (*read_type)(fd, buf, count);
@@ -65,7 +38,7 @@ void
oflush()
{
if (obufsize) {
-#ifdef GB_CONVERT
+#ifdef CONVERT
write_wrapper(1, outbuf, obufsize);
#else
write(1, outbuf, obufsize);
@@ -87,7 +60,7 @@ output(char *s, int len)
assert(len<OBUFSIZE);
if (obufsize + len > OBUFSIZE) {
-#ifdef GB_CONVERT
+#ifdef CONVERT
write_wrapper(1, outbuf, obufsize);
#else
write(1, outbuf, obufsize);
@@ -193,7 +166,7 @@ dogetch()
do{
#endif
-#ifdef GB_CONVERT
+#ifdef CONVERT
while ((len = read_wrapper(0, inbuf, IBUFSIZE)) <= 0) {
#else
while ((len = read(0, inbuf, IBUFSIZE)) <= 0) {
diff --git a/mbbsd/mbbsd.c b/mbbsd/mbbsd.c
index 425406f1..5bd1185b 100644
--- a/mbbsd/mbbsd.c
+++ b/mbbsd/mbbsd.c
@@ -512,7 +512,7 @@ inline static void mkuserdir(char *userid)
static void
login_query()
{
-#ifdef GB_CONVERT
+#ifdef CONVERT
/* uid 加一位, for gb login */
char uid[IDLEN + 2], passbuf[PASSLEN];
int attempts, len;
@@ -547,11 +547,15 @@ login_query()
getdata(20, 0, "請輸入代號,或以[guest]參觀,以[new]註冊:",
uid, sizeof(uid), DOECHO);
-#ifdef GB_CONVERT
+#ifdef CONVERT
/* switch to gb mode if uid end with '.' */
len = strlen(uid);
if (uid[0] && uid[len - 1] == '.') {
- set_converting_type(1);
+ set_converting_type(CONV_GB);
+ uid[len - 1] = 0;
+ }
+ else if (uid[0] && uid[len - 1] == ',') {
+ set_converting_type(CONV_UTF8);
uid[len - 1] = 0;
}
else if (len >= IDLEN + 1)
@@ -1337,6 +1341,14 @@ daemon_login(int argc, char *argv[], char *envp[])
setuid(BBSUID);
chdir(BBSHOME);
+ /* It's better to do something before fork */
+#ifdef CONVERT
+ big2gb_init();
+ gb2big_init();
+ big2uni_init();
+ uni2big_init();
+#endif
+
#ifndef NO_FORK
#ifdef PRE_FORK
if( listen_port == 23 ){ // only pre-fork in port 23