use XDELE
git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@6797 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 1997, 1998, 1999 Kungliga Tekniska H<>gskolan
|
* Copyright (c) 1997-1999 Kungliga Tekniska H<>gskolan
|
||||||
* (Royal Institute of Technology, Stockholm, Sweden).
|
* (Royal Institute of Technology, Stockholm, Sweden).
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
@@ -144,7 +144,7 @@ do_connect (const char *hostname, int port, int nodelay)
|
|||||||
}
|
}
|
||||||
|
|
||||||
typedef enum { INIT = 0, GREET, USER, PASS, STAT, RETR, TOP,
|
typedef enum { INIT = 0, GREET, USER, PASS, STAT, RETR, TOP,
|
||||||
DELE, QUIT } pop_state;
|
DELE, XDELE, QUIT} pop_state;
|
||||||
|
|
||||||
#define PUSH_BUFSIZ 65536
|
#define PUSH_BUFSIZ 65536
|
||||||
|
|
||||||
@@ -228,6 +228,7 @@ doit(int s,
|
|||||||
pop_state state = INIT;
|
pop_state state = INIT;
|
||||||
unsigned count, bytes;
|
unsigned count, bytes;
|
||||||
unsigned asked_for = 0, retrieved = 0, asked_deleted = 0, deleted = 0;
|
unsigned asked_for = 0, retrieved = 0, asked_deleted = 0, deleted = 0;
|
||||||
|
unsigned sent_xdele = 0;
|
||||||
int out_fd;
|
int out_fd;
|
||||||
char from_line[128];
|
char from_line[128];
|
||||||
size_t from_line_length;
|
size_t from_line_length;
|
||||||
@@ -269,6 +270,7 @@ doit(int s,
|
|||||||
FD_SET(s,&readset);
|
FD_SET(s,&readset);
|
||||||
if (((state == STAT || state == RETR || state == TOP)
|
if (((state == STAT || state == RETR || state == TOP)
|
||||||
&& asked_for < count)
|
&& asked_for < count)
|
||||||
|
|| (state == XDELE && !sent_xdele)
|
||||||
|| (state == DELE && asked_deleted < count))
|
|| (state == DELE && asked_deleted < count))
|
||||||
FD_SET(s,&writeset);
|
FD_SET(s,&writeset);
|
||||||
ret = select (s + 1, &readset, &writeset, NULL, NULL);
|
ret = select (s + 1, &readset, &writeset, NULL, NULL);
|
||||||
@@ -351,7 +353,7 @@ doit(int s,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
state = DELE;
|
state = XDELE;
|
||||||
if (verbose)
|
if (verbose)
|
||||||
fprintf (stderr, "deleting... ");
|
fprintf (stderr, "deleting... ");
|
||||||
}
|
}
|
||||||
@@ -378,6 +380,12 @@ doit(int s,
|
|||||||
state = TOP;
|
state = TOP;
|
||||||
else
|
else
|
||||||
state = RETR;
|
state = RETR;
|
||||||
|
} else if (state == XDELE) {
|
||||||
|
state = QUIT;
|
||||||
|
net_write (s, "QUIT\r\n", 6);
|
||||||
|
if (verbose > 1)
|
||||||
|
net_write (STDERR_FILENO, "QUIT\r\n", 6);
|
||||||
|
break;
|
||||||
} else if (state == DELE) {
|
} else if (state == DELE) {
|
||||||
if (++deleted == count) {
|
if (++deleted == count) {
|
||||||
state = QUIT;
|
state = QUIT;
|
||||||
@@ -404,9 +412,13 @@ doit(int s,
|
|||||||
|
|
||||||
rem -= p - beg + 2;
|
rem -= p - beg + 2;
|
||||||
beg = p + 2;
|
beg = p + 2;
|
||||||
} else
|
} else {
|
||||||
|
if(state == XDELE)
|
||||||
|
state = DELE;
|
||||||
|
else
|
||||||
errx (1, "Bad response: %.*s", (int)(p - beg), beg);
|
errx (1, "Bad response: %.*s", (int)(p - beg), beg);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
if (!do_from)
|
if (!do_from)
|
||||||
write_state_flush (&write_state);
|
write_state_flush (&write_state);
|
||||||
|
|
||||||
@@ -421,6 +433,11 @@ doit(int s,
|
|||||||
else if ((state == STAT && do_from) || state == TOP)
|
else if ((state == STAT && do_from) || state == TOP)
|
||||||
out_len = snprintf (out_buf, sizeof(out_buf),
|
out_len = snprintf (out_buf, sizeof(out_buf),
|
||||||
"TOP %u 0\r\n", ++asked_for);
|
"TOP %u 0\r\n", ++asked_for);
|
||||||
|
else if(state == XDELE) {
|
||||||
|
out_len = snprintf(out_buf, sizeof(out_buf),
|
||||||
|
"XDELE %u %u\r\n", 1, count);
|
||||||
|
sent_xdele++;
|
||||||
|
}
|
||||||
else if(state == DELE)
|
else if(state == DELE)
|
||||||
out_len = snprintf (out_buf, sizeof(out_buf),
|
out_len = snprintf (out_buf, sizeof(out_buf),
|
||||||
"DELE %u\r\n", ++asked_deleted);
|
"DELE %u\r\n", ++asked_deleted);
|
||||||
@@ -634,10 +651,13 @@ parse_pobox (char *a0, const char **host, const char **user)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* if the specification starts with po:, remember this information */
|
||||||
if(strncmp(a0, "po:", 3) == 0) {
|
if(strncmp(a0, "po:", 3) == 0) {
|
||||||
a0 += 3;
|
a0 += 3;
|
||||||
po++;
|
po++;
|
||||||
}
|
}
|
||||||
|
/* if there is an `@', the hostname is after it, otherwise at the
|
||||||
|
beginning of the string */
|
||||||
p = strchr(a0, '@');
|
p = strchr(a0, '@');
|
||||||
if(p != NULL) {
|
if(p != NULL) {
|
||||||
*p++ = '\0';
|
*p++ = '\0';
|
||||||
@@ -645,6 +665,8 @@ parse_pobox (char *a0, const char **host, const char **user)
|
|||||||
} else {
|
} else {
|
||||||
h = a0;
|
h = a0;
|
||||||
}
|
}
|
||||||
|
/* if there is a `:', the username comes before it, otherwise at
|
||||||
|
the beginning of the string */
|
||||||
p = strchr(a0, ':');
|
p = strchr(a0, ':');
|
||||||
if(p != NULL) {
|
if(p != NULL) {
|
||||||
*p++ = '\0';
|
*p++ = '\0';
|
||||||
|
Reference in New Issue
Block a user