diff options
author | Alain Magloire <alainm@gnu.org> | 2001-05-04 03:58:27 +0000 |
---|---|---|
committer | Alain Magloire <alainm@gnu.org> | 2001-05-04 03:58:27 +0000 |
commit | e94e8805cc5b73ef8710f58892fbce83d074b084 (patch) | |
tree | 3e7f59d660e545cfa5fb56c81ab558fd054d727f | |
parent | e73d4524f0675ee2050d6dc0c932f7deb83f29af (diff) | |
download | mailutils-e94e8805cc5b73ef8710f58892fbce83d074b084.tar.gz mailutils-e94e8805cc5b73ef8710f58892fbce83d074b084.tar.bz2 |
Patches from Sergey, se Changelog for details:
2001-04-23 Sergey Poznyakoff
-rw-r--r-- | ChangeLog | 47 | ||||
-rw-r--r-- | argp/argp-help.c | 9 | ||||
-rw-r--r-- | argp/argp-parse.c | 7 | ||||
-rw-r--r-- | imap4d/login.c | 2 | ||||
-rw-r--r-- | imap4d/rename.c | 4 | ||||
-rw-r--r-- | imap4d/util.c | 45 | ||||
-rw-r--r-- | lib/snprintf.c | 66 | ||||
-rw-r--r-- | lib/snprintf.h | 26 | ||||
-rw-r--r-- | mail/mail.c | 7 | ||||
-rw-r--r-- | mail/mail.h | 10 | ||||
-rw-r--r-- | mail/pipe.c | 2 | ||||
-rw-r--r-- | mail/print.c | 2 | ||||
-rw-r--r-- | mail/top.c | 2 | ||||
-rw-r--r-- | mail/write.c | 2 | ||||
-rw-r--r-- | mailbox/folder_imap.c | 3 | ||||
-rw-r--r-- | pop3d/apop.c | 4 | ||||
-rw-r--r-- | pop3d/extra.c | 94 | ||||
-rw-r--r-- | pop3d/pop3d.c | 12 | ||||
-rw-r--r-- | pop3d/pop3d.h | 5 | ||||
-rw-r--r-- | pop3d/user.c | 13 |
20 files changed, 218 insertions, 144 deletions
@@ -1,3 +1,50 @@ +2001-05-03 Alain Magloire + + * argp/argp-help.c (hol_entry_help): Some compiler like Watcomm + can not initialize a local structure struct .. = { .. }. Do it + explicitely field by field. + * argp/arpg-parse.c: Watcomm choke on N_() macro. + (parser_init): Watcomm does not like operation on a void * pointer. + + * imap4d/login.c: Cast the return of crypt(), since some platforms + do not provide a prototype in <unistd.h> + + * pop3d/user.c: Cast the return of crypt(), since in may not be + declare in <unistd.h>. + + * lib/snprintf.c: Use only __STDC__ to detect <stdar.h> + * lib/snprintf.h: Use only __STDC__. + + * mail/mail.h: The global variable should be declare extern. + * mail/pipe.c: Use 512 buffer instead of BUFSIZ, go easy on the stack. + * mail/print.c: Use 512 buffer instead of BUFSIZ, go easy on the stack. + * mail/write.c: Use 512 buffer instead of BUFSIZ, go easy on the stack. + + * mailbox/folder_imap.c: Declare strtock_r (). + +2001-05-03 Sergey Poznyakoff + + * pop3d/user.c: Misplace parentheses around the mailbox_xx() calls. + Do not free (buf) since it is now static storage. Unfortunately most + of the pam modules do openlog() on their own, thus after + authentication all logging output flows to where the last pam module + has directed it, which is usually `auth' facility. + Put back closelog()/openlog(). + * pop3d/pop3d.h: ifile is now FILE *. + pop3d_realine () take FILE * as a prototype. + * pop3d/pop3d.c (pop3d_mainloop): Refresh lock, pop3d_touchlock(). + Register SIGALRM in the child. + Do not free (buf) since it is now static storage. + * pop3d/extra.c (pop3d_readline): Change to use + fgets () and alarm (). + With small modification from Alain. + (pop3d_signal): ofile will be NULL in the *child* process: + whereas in the parent one, ofile will always be NULL, since it lives + in the BSS (FILE *ofile;) and gets initialized only in the child + process. Thus, when the parent receives any signal, SIGTERM for + example, it does pop3d_abquit(ERR_SIGNAL) and dies doing + fprintf(ofile, ...) + 2001-05-02 Alain Magloire Some of the Makefile.am contain gcc specific options diff --git a/argp/argp-help.c b/argp/argp-help.c index 942b72db3..c8b2c8f71 100644 --- a/argp/argp-help.c +++ b/argp/argp-help.c @@ -1054,7 +1054,14 @@ hol_entry_help (struct hol_entry *entry, const struct argp_state *state, int old_wm = __argp_fmtstream_wmargin (stream); /* PEST is a state block holding some of our variables that we'd like to share with helper functions. */ - struct pentry_state pest = { entry, stream, hhstate, 1, state }; + /* Some loosing compiler can not handle this ... lets play nice. */ + /* struct pentry_state pest = { entry, stream, hhstate, 1, state }; */ + struct pentry_state pest; + pest.entry = entry; + pest.stream = stream; + pest.hhstate = hhstate; + pest.first = 1; + pest.state = state; if (! odoc (real)) for (opt = real, num = entry->num; num > 0; opt++, num--) diff --git a/argp/argp-parse.c b/argp/argp-parse.c index f04537cba..116f58d71 100644 --- a/argp/argp-parse.c +++ b/argp/argp-parse.c @@ -43,7 +43,7 @@ # endif #endif #ifndef N_ -# define N_(msgid) (msgid) +# define N_(msgid) msgid #endif #if _LIBC - 0 @@ -525,9 +525,14 @@ parser_init (struct parser *parser, const struct argp *argp, return ENOMEM; parser->groups = parser->storage; + /* To please Watcom CC parser->child_inputs = parser->storage + GLEN; parser->long_opts = parser->storage + GLEN + CLEN; parser->short_opts = parser->storage + GLEN + CLEN + LLEN; + */ + parser->child_inputs = (char *)(parser->storage) + GLEN; + parser->long_opts = (char *)(parser->storage) + GLEN + CLEN; + parser->short_opts = (char *)(parser->storage) + GLEN + CLEN + LLEN; memset (parser->child_inputs, 0, szs.num_child_inputs * sizeof (void *)); parser_convert (parser, argp, flags); diff --git a/imap4d/login.c b/imap4d/login.c index f461a8021..df1ca76b6 100644 --- a/imap4d/login.c +++ b/imap4d/login.c @@ -100,7 +100,7 @@ imap4d_login (struct imap4d_command *command, char *arg) #ifndef USE_LIBPAM if (pw == NULL || pw->pw_uid < 1) return util_finish (command, RESP_NO, "User name or passwd rejected"); - if (strcmp (pw->pw_passwd, crypt (pass, pw->pw_passwd))) + if (strcmp (pw->pw_passwd, (char *)crypt (pass, pw->pw_passwd))) { #ifdef HAVE_SHADOW_H struct spwd *spw; diff --git a/imap4d/rename.c b/imap4d/rename.c index f1afbed43..e327de59a 100644 --- a/imap4d/rename.c +++ b/imap4d/rename.c @@ -18,8 +18,8 @@ #include "imap4d.h" /* - * - */ + FIXME: Renaming a mailbox we must change the UIDVALIDITY + of the mailbox. */ int imap4d_rename (struct imap4d_command *command, char *arg) diff --git a/imap4d/util.c b/imap4d/util.c index fb4941b55..34a922d0d 100644 --- a/imap4d/util.c +++ b/imap4d/util.c @@ -340,6 +340,51 @@ util_finish (struct imap4d_command *command, int rc, const char *format, ...) return status; } +#if 0 +/* Need a replacement for readline that can support literals. */ +char * +imap4d_readline (FILE *fp) +{ + char buffer[512]; + char *line; + size_t len; + + alarm (timeout); + line = fgets (buffer, sizeof (buffer), fp); + alarm (0); + if (!line) + util_quit (1); + line = strdup (buffer); + len = strlen (buffer); + if (len > 2) + { + len--; /* C arrays are 0-based. */ + if (line[len] == '\n' && line[len - 1] == '}') + { + while (len && line[len] != '{') len--; + if (line [len] == '{') + { + char *sp = NULL; + long number = strtoul (line + len + 1, &sp, 10); + if (*sp != '+') + util_send ("+ GO AHEAD\r\n"); + line[len] = '\0'; + while (number > 0) + { + char *literal = imap4d_readline (fd); + size_t n = strlen (literal); + line = realloc (line, strlen (line) + n + 1); + strcat (line, literal); + number -= n; + free (literal); + } + } + } + } + return line; +} +#endif + char * imap4d_readline (int fd) { diff --git a/lib/snprintf.c b/lib/snprintf.c index 9ea33b099..9e039120a 100644 --- a/lib/snprintf.c +++ b/lib/snprintf.c @@ -2,21 +2,21 @@ /* Unix snprintf implementation. Version 1.3 - + This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. - + This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. - + You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - + Revision History: 1.3: @@ -55,7 +55,7 @@ pow_10(int n) pow_10(n) int n; #endif -{ +{ int i; double P; @@ -67,7 +67,7 @@ int n; } /* - * Find the integral part of the log in base 10 + * Find the integral part of the log in base 10 * Note: this not a real log10() I just need and approximation(integerpart) of x in: 10^x ~= r @@ -81,7 +81,7 @@ log_10(double r) log_10(r) double r; #endif -{ +{ int i = 0; double result = 1.; @@ -110,7 +110,7 @@ integral(real, ip) double real; double * ip; #endif -{ +{ int j; double i, s, p; double real_integral = 0.; @@ -144,11 +144,11 @@ double * ip; } #define PRECISION 1.e-6 -/* +/* * return an ascii representation of the integral part of the number * and set fract to be an ascii representation of the fraction part * the container for the fraction and the integral part or staticly - * declare with fix size + * declare with fix size */ PRIVATE char * #ifdef __STDC__ @@ -171,7 +171,7 @@ char ** fract; int ch; /* taking care of the obvious case: 0.0 */ - if (number == 0.) { + if (number == 0.) { integral_part[0] = '0'; integral_part[1] = '\0'; fraction_part[0] = '0'; @@ -183,7 +183,7 @@ char ** fract; if ((sign = number) < 0.) { number = -number; digits--; /* sign consume one digit */ - } + } fraction = integral(number, &ip); number = ip; @@ -198,11 +198,11 @@ char ** fract; ch = (int)((fp + PRECISION)*base); /* force to round */ integral_part[i] = (ch <= 9) ? ch + '0' : ch + 'a' - 10; if (! isxdigit(integral_part[i])) /* bail out overflow !! */ - break; + break; number = ip; } } - + /* Oh No !! out of bound, ho well fill it up ! */ if (number != 0.) for (i = 0; i < digits; ++i) @@ -216,7 +216,7 @@ char ** fract; /* reverse every thing */ for ( i--, j = 0; j < i; j++, i--) - SWAP_INT(integral_part[i], integral_part[j]); + SWAP_INT(integral_part[i], integral_part[j]); /* the fractionnal part */ for (i=0, fp=fraction; precision > 0 && i < MAX_FRACT ; i++, precision-- ) { @@ -354,7 +354,7 @@ double d; ((d > 0. && p->justify == RIGHT) ? 1:0) - ((p->space == FOUND) ? 1:0) - strlen(tmp) - p->precision - 1; - PAD_RIGHT(p); + PAD_RIGHT(p); PUT_PLUS(d, p); PUT_SPACE(d, p); while (*tmp) { /* the integral */ @@ -365,12 +365,12 @@ double d; PUT_CHAR('.', p); /* put the '.' */ if (*p->pf == 'g' || *p->pf == 'G') /* smash the trailing zeros */ for (i = strlen(tmp2) - 1; i >= 0 && tmp2[i] == '0'; i--) - tmp2[i] = '\0'; + tmp2[i] = '\0'; for (; *tmp2; tmp2++) PUT_CHAR(*tmp2, p); /* the fraction */ - + PAD_LEFT(p); -} +} /* %e %E %g exponent representation */ PRIVATE void @@ -388,12 +388,12 @@ double d; DEF_PREC(p); j = log_10(d); d = d / pow_10(j); /* get the Mantissa */ - d = ROUND(d, p); + d = ROUND(d, p); tmp = dtoa(d, p->precision, &tmp2); /* 1 for unit, 1 for the '.', 1 for 'e|E', * 1 for '+|-', 3 for 'exp' */ /* calculate how much padding need */ - p->width = p->width - + p->width = p->width - ((d > 0. && p->justify == RIGHT) ? 1:0) - ((p->space == FOUND) ? 1:0) - p->precision - 7; PAD_RIGHT(p); @@ -407,7 +407,7 @@ double d; PUT_CHAR('.', p); /* the '.' */ if (*p->pf == 'g' || *p->pf == 'G') /* smash the trailing zeros */ for (i = strlen(tmp2) - 1; i >= 0 && tmp2[i] == '0'; i--) - tmp2[i] = '\0'; + tmp2[i] = '\0'; for (; *tmp2; tmp2++) PUT_CHAR(*tmp2, p); /* the fraction */ @@ -470,7 +470,7 @@ struct DATA * p; case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': /* gob all the digits */ - for (i = 0; isdigit(*s); i++, s++) + for (i = 0; isdigit(*s); i++, s++) if (i < MAX_FIELD/2 - 1) number[i] = *s; number[i] = '\0'; @@ -524,10 +524,10 @@ va_list args; case 'f': /* float, double */ STAR_ARGS(&data); d = va_arg(args, double); - floating(&data, d); + floating(&data, d); state = 0; break; - case 'g': + case 'g': case 'G': STAR_ARGS(&data); DEF_PREC(&data); @@ -559,7 +559,7 @@ va_list args; d = va_arg(args, unsigned int); decimal(&data, d); state = 0; - break; + break; case 'd': /* decimal */ STAR_ARGS(&data); if (data.a_long == FOUND) @@ -578,7 +578,7 @@ va_list args; octal(&data, d); state = 0; break; - case 'x': + case 'x': case 'X': /* hexadecimal */ STAR_ARGS(&data); if (data.a_long == FOUND) @@ -612,11 +612,11 @@ va_list args; state = 0; break; case '#': case ' ': case '+': case '*': - case '-': case '.': case '0': case '1': + case '-': case '.': case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': /* initialize width and precision */ - for (i = 0; isflag(*data.pf); i++, data.pf++) + for (i = 0; isflag(*data.pf); i++, data.pf++) if (i < MAX_FIELD - 1) conv_field[i] = *data.pf; conv_field[i] = '\0'; @@ -642,7 +642,7 @@ va_list args; #ifndef HAVE_SNPRINTF PUBLIC int -#if defined(HAVE_STDARG_H) && defined(__STDC__) && __STDC__ +#if __STDC__ snprintf(char *string, size_t length, const char * format, ...) #else snprintf(string, length, format, va_alist) @@ -655,7 +655,7 @@ va_dcl int rval; va_list args; -#if defined(HAVE_STDARG_H) && defined(__STDC__) && __STDC__ +#if __STDC__ va_start(args, format); #else va_start(args); @@ -808,7 +808,7 @@ void main() printf("abc%n", &i); printf("%d\n", i); snprintf(holder, sizeof holder, "abc%n", &i); printf("%s", holder); printf("%d\n\n", i); - + printf("%%*.*s --> 10.10\n"); snprintf(holder, sizeof holder, "%*.*s\n", 10, 10, BLURB); printf("%*.*s\n", 10, 10, BLURB); @@ -821,7 +821,7 @@ void main() #define BIG "Hello this is a too big string for the buffer" /* printf("A buffer to small of 10, trying to put this:\n");*/ - printf("<%%>, %s\n", BIG); + printf("<%%>, %s\n", BIG); i = snprintf(holder, 10, "%s\n", BIG); printf("<%s>\n", BIG); printf("<%s>\n", holder); diff --git a/lib/snprintf.h b/lib/snprintf.h index 9193c77f0..16db7cf3c 100644 --- a/lib/snprintf.h +++ b/lib/snprintf.h @@ -1,21 +1,21 @@ /* Unix snprintf implementation. Version 1.3 - + This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. - + This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. - + You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - + Revision History: see header of snprintf.c. @@ -39,7 +39,7 @@ Alain Magloire: alainm@rcsm.ee.mcgill.ca #include <config.h> #endif -#if defined(HAVE_STDARG_H) && defined(__STDC__) && __STDC__ +#if __STDC__ #include <stdarg.h> #else #include <varargs.h> @@ -49,7 +49,7 @@ Alain Magloire: alainm@rcsm.ee.mcgill.ca #include <ctype.h> -/* +/* * For the FLOATING POINT FORMAT : * the challenge was finding a way to * manipulate the Real numbers without having @@ -65,24 +65,24 @@ Alain Magloire: alainm@rcsm.ee.mcgill.ca fraction = b(1)*10^-1 + b(2)*10^-2 + ... where: - 0 <= a(i) => 9 - 0 <= b(i) => 9 - + 0 <= a(i) => 9 + 0 <= b(i) => 9 + from then it was simple math */ /* * size of the buffer for the integral part - * and the fraction part + * and the fraction part */ #define MAX_INT 99 + 1 /* 1 for the null */ #define MAX_FRACT 29 + 1 -/* +/* * numtoa() uses PRIVATE buffers to store the results, * So this function is not reentrant */ -#define itoa(n) numtoa(n, 10, 0, (char **)0) +#define itoa(n) numtoa(n, 10, 0, (char **)0) #define otoa(n) numtoa(n, 8, 0, (char **)0) #define htoa(n) numtoa(n, 16, 0, (char **)0) #define dtoa(n, p, f) numtoa(n, 10, p, f) @@ -182,7 +182,7 @@ struct DATA { if ((p)->space == FOUND && (d) > 0.) \ PUT_CHAR(' ', p) -/* pad right */ +/* pad right */ #define PAD_RIGHT(p) \ if ((p)->width > 0 && (p)->justify != LEFT) \ for (; (p)->width > 0; (p)->width--) \ diff --git a/mail/mail.c b/mail/mail.c index f569845ad..e907ebcca 100644 --- a/mail/mail.c +++ b/mail/mail.c @@ -17,6 +17,13 @@ #include "mail.h" +/* Global variables and constants*/ +mailbox_t mbox; +unsigned int cursor; +unsigned int realcursor; +unsigned int total; +FILE *ofile; + const char *argp_program_version = "mail (" PACKAGE ") " VERSION; const char *argp_program_bug_address = "<bug-mailutils@gnu.org>"; static char doc[] = "GNU mail -- the standard /bin/mail interface"; diff --git a/mail/mail.h b/mail/mail.h index c682bd7a6..833e035c4 100644 --- a/mail/mail.h +++ b/mail/mail.h @@ -83,11 +83,11 @@ struct mail_env_entry { }; /* Global variables and constants*/ -mailbox_t mbox; -unsigned int cursor; -unsigned int realcursor; -unsigned int total; -FILE *ofile; +extern mailbox_t mbox; +extern unsigned int cursor; +extern unsigned int realcursor; +extern unsigned int total; +extern FILE *ofile; extern const struct mail_command_entry mail_command_table[]; /* Functions */ diff --git a/mail/pipe.c b/mail/pipe.c index 0fc4c6800..1b3347362 100644 --- a/mail/pipe.c +++ b/mail/pipe.c @@ -30,7 +30,7 @@ mail_pipe (int argc, char **argv) char *cmd; FILE *pipe; int *list, num = 0; - char buffer[BUFSIZ]; + char buffer[512]; off_t off = 0; size_t n = 0; diff --git a/mail/print.c b/mail/print.c index e626df7d3..138a8c8f2 100644 --- a/mail/print.c +++ b/mail/print.c @@ -36,7 +36,7 @@ mail_print (int argc, char **argv) header_t hdr; body_t body; stream_t stream; - char buffer[BUFSIZ]; + char buffer[512]; off_t off = 0; size_t n = 0, lines = 0; FILE *out = ofile; diff --git a/mail/top.c b/mail/top.c index 916a20ebe..11a24eac3 100644 --- a/mail/top.c +++ b/mail/top.c @@ -30,7 +30,7 @@ mail_top (int argc, char **argv) { message_t msg; stream_t stream; - char buf[BUFSIZ]; + char buf[512]; size_t n; off_t off; int lines = strtol ((util_find_env("toplines"))->value, NULL, 10); diff --git a/mail/write.c b/mail/write.c index d3f07247d..dd0e4e147 100644 --- a/mail/write.c +++ b/mail/write.c @@ -35,7 +35,7 @@ mail_write (int argc, char **argv) stream_t stream; FILE *output; char *filename = NULL; - char buffer[BUFSIZ]; + char buffer[512]; off_t off = 0; size_t n = 0; int *msglist = NULL; diff --git a/mailbox/folder_imap.c b/mailbox/folder_imap.c index d2c2f759a..a8e6d9ce0 100644 --- a/mailbox/folder_imap.c +++ b/mailbox/folder_imap.c @@ -58,6 +58,9 @@ static struct _record _imap_record = via the register entry/record. */ record_t imap_record = &_imap_record; +#ifndef HAVE_STRTOK_R +char *strtok_r __P ((char *, const char *, char **)); +#endif /* Concrete IMAP implementation. */ static int folder_imap_open __P ((folder_t, int)); static int folder_imap_create __P ((folder_t)); diff --git a/pop3d/apop.c b/pop3d/apop.c index 761e210be..6d73f1395 100644 --- a/pop3d/apop.c +++ b/pop3d/apop.c @@ -69,8 +69,8 @@ pop3d_apopuser (const char *user) return NULL; } - memset (&key, 0, sizeof (DBT)); - memset (&data, 0, sizeof (DBT)); + memset (&key, 0, sizeof DBT); + memset (&data, 0, sizeof DBT); strncpy (buf, user, sizeof buf); /* strncpy () is lame and does not NULL terminate. */ diff --git a/pop3d/extra.c b/pop3d/extra.c index 17bbbabd6..182d50f30 100644 --- a/pop3d/extra.c +++ b/pop3d/extra.c @@ -154,81 +154,35 @@ pop3d_usage (char *argv0) RETSIGTYPE pop3d_signal (int signo) { - (void)signo; syslog (LOG_CRIT, "got signal %d", signo); + /* Master process. */ + if (!ofile) + { + syslog(LOG_CRIT, "MASTER: exiting on signal"); + exit (1); /* abort(); */ + } + + if (signo == SIGALRM) + pop3d_abquit (ERR_TIMEOUT); pop3d_abquit (ERR_SIGNAL); } -/* Gets a line of input from the client */ -/* We can also implement PIPELINING by keeping a static buffer. - Implementing this cost an extra allocation with more uglier code. - Is it worth it? How many clients actually use PIPELINING? - */ +/* Gets a line of input from the client, caller should free() */ char * -pop3d_readline (int fd) +pop3d_readline (FILE *fp) { - static char *buffer = NULL; /* Note: This buffer is never free()d. */ - static size_t total = 0; - char *nl; - char *line; - size_t len; - - nl = memchr (buffer, '\n', total); - if (!nl) - { - /* Need to refill the buffer. */ - do - { - char buf[512]; - int nread; - - if (timeout) - { - int available; - fd_set rfds; - struct timeval tv; - - FD_ZERO (&rfds); - FD_SET (fd, &rfds); - tv.tv_sec = timeout; - tv.tv_usec = 0; - - available = select (fd + 1, &rfds, NULL, NULL, &tv); - if (!available) - pop3d_abquit (ERR_TIMEOUT); - else if (available == -1) - { - if (errno == EINTR) - continue; - pop3d_abquit (ERR_NO_OFILE); - } - } - - errno = 0; - nread = read (fd, buf, sizeof (buf) - 1); - if (nread < 1) - { - if (errno == EINTR) - continue; - pop3d_abquit (ERR_NO_OFILE); - } - buf[nread] = '\0'; - - buffer = realloc (buffer, (total + nread + 1) * sizeof (*buffer)); - if (buffer == NULL) - pop3d_abquit (ERR_NO_MEM); - memcpy (buffer + total, buf, nread + 1); /* copy the null too. */ - total += nread; - } - while ((nl = memchr (buffer, '\n', total)) == NULL); - } + static char buffer[512]; + char *ptr; + + alarm (timeout); + ptr = fgets (buffer, sizeof (buffer), fp); + alarm (0); + + /* We should probably check ferror() too, but if ptr is null we + are done anyway; if (!ptr && ferror(fp)) */ + if (!ptr) + pop3d_abquit (ERR_NO_OFILE); - nl++; - len = nl - buffer; - line = calloc (len + 1, sizeof (*line)); - memcpy (line, buffer, len); /* copy the newline too. */ - line[len] = '\0'; - total -= len; - memmove (buffer, nl, total); - return line; + /* Caller should not free () this ... should we strdup() then? */ + return ptr; } diff --git a/pop3d/pop3d.c b/pop3d/pop3d.c index 35a9e73ee..9606585c4 100644 --- a/pop3d/pop3d.c +++ b/pop3d/pop3d.c @@ -21,7 +21,7 @@ mailbox_t mbox; size_t timeout; int state; char *username; -int ifile; +FILE *ifile; FILE *ofile; char *md5shared; /* Number of child processes. */ @@ -224,10 +224,12 @@ pop3d_mainloop (int infile, int outfile) /* Reset hup to exit. */ signal (SIGHUP, pop3d_signal); + /* Timeout alarm. */ + signal (SIGALRM, pop3d_signal); - ifile = infile; + ifile = fdopen (infile, "r"); ofile = fdopen (outfile, "w"); - if (ofile == NULL) + if (!ofile || !ofile) pop3d_abquit (ERR_NO_OFILE); state = AUTHORIZATION; @@ -303,6 +305,9 @@ pop3d_mainloop (int infile, int outfile) pop3d_abquit (ERR_MBOX_SYNC); /* Out of sync, Bail out. */ } + /* Refresh the Lock. */ + pop3d_touchlock (); + if (strlen (arg) > POP_MAXCMDLEN || strlen (cmd) > POP_MAXCMDLEN) status = ERR_TOO_LONG; else if (strlen (cmd) > 4) @@ -361,7 +366,6 @@ pop3d_mainloop (int infile, int outfile) else fprintf (ofile, "-ERR unknown error\r\n"); - free (buf); free (cmd); free (arg); } diff --git a/pop3d/pop3d.h b/pop3d/pop3d.h index 335cfa531..967b281b2 100644 --- a/pop3d/pop3d.h +++ b/pop3d/pop3d.h @@ -167,11 +167,10 @@ #endif /* __P */ extern mailbox_t mbox; - extern unsigned int timeout; extern int state; extern char *username; -extern int ifile; +extern FILE *ifile; extern FILE *ofile; extern char *md5shared; extern volatile size_t children; @@ -202,5 +201,5 @@ extern RETSIGTYPE pop3d_signal __P ((int)); extern RETSIGTYPE pop3d_sigchld __P ((int)); extern void pop3d_daemon_init __P ((void)); extern char *pop3d_apopuser __P ((const char *)); -extern char *pop3d_readline __P ((int)); +extern char *pop3d_readline __P ((FILE *)); #endif /* _POP3D_H */ diff --git a/pop3d/user.c b/pop3d/user.c index 203478abc..58adf9d64 100644 --- a/pop3d/user.c +++ b/pop3d/user.c @@ -96,7 +96,6 @@ pop3d_user (const char *arg) buf = pop3d_readline (ifile); cmd = pop3d_cmd (buf); tmp = pop3d_args (buf); - free (buf); if (strlen (tmp) > POP_MAXCMDLEN) { @@ -137,12 +136,13 @@ pop3d_user (const char *arg) #ifndef USE_LIBPAM if (pw == NULL || pw->pw_uid < 1) return ERR_BAD_LOGIN; - if (strcmp (pw->pw_passwd, crypt (pass, pw->pw_passwd))) + if (strcmp (pw->pw_passwd, (char *)crypt (pass, pw->pw_passwd))) { #ifdef HAVE_SHADOW_H struct spwd *spw; spw = getspnam ((char *)arg); - if (spw == NULL || strcmp (spw->sp_pwdp, crypt (pass, spw->sp_pwdp))) + if (spw == NULL || strcmp (spw->sp_pwdp, + (char *)crypt (pass, spw->sp_pwdp))) #endif /* HAVE_SHADOW_H */ { syslog (LOG_INFO, "User '%s': authentication failed", arg); @@ -155,6 +155,8 @@ pop3d_user (const char *arg) int pamerror; _user = (char *) arg; _pwd = pass; + /* libpam doesn't log to LOG_MAIL */ + closelog (); pamerror = pam_start ("gnu-pop3d", arg, &PAM_conversation, &pamh); PAM_ERROR; pamerror = pam_authenticate (pamh, 0); @@ -165,6 +167,7 @@ pop3d_user (const char *arg) PAM_ERROR; pam_errlab: pam_end (pamh, PAM_SUCCESS); + openlog ("gnu-pop3d", LOG_PID, LOG_FACILITY); if (pamerror != PAM_SUCCESS) { syslog (LOG_INFO, "User '%s': authentication failed", _user); @@ -176,8 +179,8 @@ pop3d_user (const char *arg) if (pw != NULL && pw->pw_uid > 1) setuid (pw->pw_uid); - if ((status = mailbox_create_default (&mbox, arg) != 0) - || (status = mailbox_open (mbox, MU_STREAM_RDWR) != 0)) + if ((status = mailbox_create_default (&mbox, arg)) != 0 + || (status = mailbox_open (mbox, MU_STREAM_RDWR)) != 0) { mailbox_destroy (&mbox); /* For non existent mailbox, we fake. */ |