ipop2d.c
上传用户:ycwykj01
上传日期:2007-01-04
资源大小:1819k
文件大小:19k
- /*
- * Program: IPOP2D - IMAP to POP2 conversion server
- *
- * Author: Mark Crispin
- * Networks and Distributed Computing
- * Computing & Communications
- * University of Washington
- * Administration Building, AG-44
- * Seattle, WA 98195
- * Internet: MRC@CAC.Washington.EDU
- *
- * Date: 28 October 1990
- * Last Edited: 16 November 1999
- *
- * Copyright 1999 by the University of Washington
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation for any purpose and without fee is hereby granted, provided
- * that the above copyright notice appears in all copies and that both the
- * above copyright notice and this permission notice appear in supporting
- * documentation, and that the name of the University of Washington not be
- * used in advertising or publicity pertaining to distribution of the software
- * without specific, written prior permission. This software is made
- * available "as is", and
- * THE UNIVERSITY OF WASHINGTON DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED,
- * WITH REGARD TO THIS SOFTWARE, INCLUDING WITHOUT LIMITATION ALL IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, AND IN
- * NO EVENT SHALL THE UNIVERSITY OF WASHINGTON BE LIABLE FOR ANY SPECIAL,
- * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
- * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, TORT
- * (INCLUDING NEGLIGENCE) OR STRICT LIABILITY, ARISING OUT OF OR IN CONNECTION
- * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- *
- */
- /* Parameter files */
- #include "mail.h"
- #include "osdep.h"
- #include <stdio.h>
- #include <ctype.h>
- #include <errno.h>
- extern int errno; /* just in case */
- #include <signal.h>
- #include "misc.h"
- /* Autologout timer */
- #define KODTIMEOUT 60*5
- #define LOGINTIMEOUT 60*3
- #define TIMEOUT 60*30
- /* Size of temporary buffers */
- #define TMPLEN 1024
- /* Server states */
- #define LISN 0
- #define AUTH 1
- #define MBOX 2
- #define ITEM 3
- #define NEXT 4
- #define DONE 5
- /* Global storage */
- char *version = "4.55"; /* server version */
- short state = LISN; /* server state */
- short critical = NIL; /* non-zero if in critical code */
- MAILSTREAM *stream = NIL; /* mailbox stream */
- long idletime = 0; /* time we went idle */
- unsigned long nmsgs = 0; /* number of messages */
- unsigned long current = 1; /* current message number */
- unsigned long size = 0; /* size of current message */
- char status[MAILTMPLEN]; /* space for status string */
- char *user = ""; /* user name */
- char *pass = ""; /* password */
- unsigned long *msg = NIL; /* message translation vector */
- /* Function prototypes */
- int main (int argc,char *argv[]);
- void clkint ();
- void kodint ();
- void hupint ();
- void trmint ();
- short c_helo (char *t,int argc,char *argv[]);
- short c_fold (char *t);
- short c_read (char *t);
- short c_retr (char *t);
- short c_acks (char *t);
- short c_ackd (char *t);
- short c_nack (char *t);
- /* Main program */
- int main (int argc,char *argv[])
- {
- char *s,*t;
- char cmdbuf[TMPLEN];
- #ifdef PLAINTEXT_DISABLED
- printf ("- POP2 server disabled on this system 15 12");
- fflush (stdout);
- _exit (1);
- #endif
- #include "linkage.c"
- /* initialize server */
- server_init (argv[0],"pop",NIL,"pop",clkint,kodint,hupint,trmint);
- /* There are reports of POP2 clients which get upset if anything appears
- * between the "+" and the "POP2" in the greeting.
- */
- printf ("+ POP2 %s v%s server ready 15 12",tcp_serverhost (),version);
- fflush (stdout); /* dump output buffer */
- state = AUTH; /* initial server state */
- while (state != DONE) { /* command processing loop */
- idletime = time (0); /* get a command under timeout */
- alarm ((state != AUTH) ? TIMEOUT : LOGINTIMEOUT);
- clearerr (stdin); /* clear stdin errors */
- while (!fgets (cmdbuf,TMPLEN-1,stdin)) {
- if (ferror (stdin) && (errno == EINTR)) clearerr (stdin);
- else {
- char *e = ferror (stdin) ?
- strerror (errno) : "Command stream end of file";
- alarm (0); /* disable all interrupts */
- server_init (NIL,NIL,NIL,NIL,SIG_IGN,SIG_IGN,SIG_IGN,SIG_IGN);
- syslog (LOG_INFO,"%s while reading line user=%.80s host=%.80s",
- e,user ? user : "???",tcp_clienthost ());
- state = DONE;
- mail_close (stream); /* try to close the stream gracefully */
- stream = NIL;
- _exit (1);
- }
- }
- alarm (0); /* make sure timeout disabled */
- idletime = 0; /* no longer idle */
- /* find end of line */
- if (!strchr (cmdbuf,' 12')) {
- server_init (NIL,NIL,NIL,NIL,SIG_IGN,SIG_IGN,SIG_IGN,SIG_IGN);
- fputs ("- Command line too long 15 12",stdout);
- state = DONE;
- }
- else if (!(s = strtok (cmdbuf,"