summaryrefslogtreecommitdiffstats
path: root/daemon/bpop3d
diff options
context:
space:
mode:
authorwens <wens@63ad8ddf-47c3-0310-b6dd-a9e9d9715204>2008-08-21 15:12:57 +0800
committerwens <wens@63ad8ddf-47c3-0310-b6dd-a9e9d9715204>2008-08-21 15:12:57 +0800
commit7c3fc822492d4281893d1becd20b39ccb3890ecf (patch)
tree4b14a48a1a3384eb27d05d7b1c417a730277fd46 /daemon/bpop3d
parent0abcade983fca58880c8ee0f98883ac3e0de4b39 (diff)
downloadpttbbs-7c3fc822492d4281893d1becd20b39ccb3890ecf.tar
pttbbs-7c3fc822492d4281893d1becd20b39ccb3890ecf.tar.gz
pttbbs-7c3fc822492d4281893d1becd20b39ccb3890ecf.tar.bz2
pttbbs-7c3fc822492d4281893d1becd20b39ccb3890ecf.tar.lz
pttbbs-7c3fc822492d4281893d1becd20b39ccb3890ecf.tar.xz
pttbbs-7c3fc822492d4281893d1becd20b39ccb3890ecf.tar.zst
pttbbs-7c3fc822492d4281893d1becd20b39ccb3890ecf.zip
Fix POP3 error response
Add daemonize flag Fix hanging connection git-svn-id: http://opensvn.csie.org/pttbbs/trunk/pttbbs@4405 63ad8ddf-47c3-0310-b6dd-a9e9d9715204
Diffstat (limited to 'daemon/bpop3d')
-rw-r--r--daemon/bpop3d/bpop3d.c31
1 files changed, 17 insertions, 14 deletions
diff --git a/daemon/bpop3d/bpop3d.c b/daemon/bpop3d/bpop3d.c
index 47811730..777c8e3f 100644
--- a/daemon/bpop3d/bpop3d.c
+++ b/daemon/bpop3d/bpop3d.c
@@ -44,7 +44,7 @@ typedef struct {
void
cmd_unknown(struct client_state *cs, const char * arg)
{
- evbuffer_add_printf(cs->evb_write, "+ERR unknown command\r\n");
+ evbuffer_add_printf(cs->evb_write, "-ERR unknown command\r\n");
}
void
@@ -58,7 +58,7 @@ cmd_user(struct client_state *cs, const char * arg)
{
cs->uid = searchuser(arg, cs->userid);
if (cs->uid < 1 || cs->uid > MAX_USERS)
- evbuffer_add_printf(cs->evb_write, "+ERR user not found\r\n");
+ evbuffer_add_printf(cs->evb_write, "-ERR user not found\r\n");
else
evbuffer_add_printf(cs->evb_write, "+OK\r\n");
}
@@ -70,7 +70,7 @@ cmd_pass(struct client_state *cs, const char * arg)
char * pw;
if (passwd_query(cs->uid, &cuser) < 0) {
- evbuffer_add_printf(cs->evb_write, "+ERR user not found\r\n");
+ evbuffer_add_printf(cs->evb_write, "-ERR user not found\r\n");
return;
}
@@ -80,7 +80,7 @@ cmd_pass(struct client_state *cs, const char * arg)
cs->pop3_state = POP3_TRANS;
}
else
- evbuffer_add_printf(cs->evb_write, "+ERR password incorrect \r\n");
+ evbuffer_add_printf(cs->evb_write, "-ERR password incorrect \r\n");
}
void
@@ -113,7 +113,7 @@ void
cmd_list(struct client_state *cs, const char * arg)
{
if (*arg)
- evbuffer_add_printf(cs->evb_write, "+ERR no such message\r\n");
+ evbuffer_add_printf(cs->evb_write, "-ERR no such message\r\n");
else
evbuffer_add_printf(cs->evb_write, "+OK\r\n.\r\n");
}
@@ -121,13 +121,13 @@ cmd_list(struct client_state *cs, const char * arg)
void
cmd_retr(struct client_state *cs, const char * arg)
{
- evbuffer_add_printf(cs->evb_write, "+ERR no such message\r\n");
+ evbuffer_add_printf(cs->evb_write, "-ERR no such message\r\n");
}
void
cmd_dele(struct client_state *cs, const char * arg)
{
- evbuffer_add_printf(cs->evb_write, "+ERR no such message\r\n");
+ evbuffer_add_printf(cs->evb_write, "-ERR no such message\r\n");
}
void
@@ -166,11 +166,11 @@ cb_client(int cfd, short event, void *arg)
cs->pop3_state = POP3_CLEANUP;
if (event & EV_READ)
- if (evbuffer_read(cs->evb_read, cfd, READ_BLOCK) < 0)
+ if (evbuffer_read(cs->evb_read, cfd, READ_BLOCK) <= 0)
cs->pop3_state = POP3_CLEANUP;
if (event & EV_WRITE)
- if (evbuffer_write(cs->evb_write, cfd) < 0)
+ if (evbuffer_write(cs->evb_write, cfd) <= 0)
cs->pop3_state = POP3_CLEANUP;
if ((line = evbuffer_readline(cs->evb_read)) == NULL)
@@ -192,6 +192,7 @@ cb_client(int cfd, short event, void *arg)
(trans_cmdlist[i].func)(cs, p);
}
+out:
evbuffer_write(cs->evb_write, cfd);
if (cs->pop3_state == POP3_UPDATE) {
@@ -209,7 +210,6 @@ cb_client(int cfd, short event, void *arg)
return;
}
-out:
if (EVBUFFER_LENGTH(cs->evb_write) > 0)
event_set(&cs->ev, cfd, EV_WRITE, (void *) cb_client, cs);
else
@@ -253,12 +253,15 @@ cb_listen(int fd, short event, void *arg)
int main(int argc, char *argv[])
{
- int ch, sfd, inetd = 0;
+ int ch, sfd, inetd = 0, daemon = 1;
char *iface_ip = "127.0.0.1:5140";
Signal(SIGPIPE, SIG_IGN);
- while ((ch = getopt(argc, argv, "il:h")) != -1)
+ while ((ch = getopt(argc, argv, "Dil:h")) != -1)
switch (ch) {
+ case 'D':
+ daemon = 0;
+ break;
case 'i':
inetd = 1;
break;
@@ -267,7 +270,7 @@ int main(int argc, char *argv[])
break;
case 'h':
default:
- fprintf(stderr, "usage: bpop3d [-i [interface_ip]:port]\n");
+ fprintf(stderr, "usage: bpop3d [-D] [-i] [-l [interface_ip]:port]\n");
return 1;
}
@@ -281,7 +284,7 @@ int main(int argc, char *argv[])
srandom(getpid() + time(NULL));
attach_SHM();
- if (!inetd)
+ if (daemon)
daemonize(BBSHOME "/run/bpop3d.pid", NULL);
event_init();