⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 smail.c

📁 早期freebsd实现
💻 C
📖 第 1 页 / 共 3 页
字号:
	case 501: 	    return RP_PARM;	case 550: 	case 551: 	case 552: 	case 553: 	    return RP_USER;	default: 	    return RP_RPLY;    }}/*  */int     sm_waend () {    switch (smtalk (SM_DATA, "DATA")) {	case 354: 	    sm_nl = TRUE;	    return RP_OK;	case 451: #ifdef SENDMAILBUG	    sm_nl = TRUE;	    return RP_OK;#endif /* SENDMAILBUG */	case 421: 	    return RP_NO;	case 500: 	case 501: 	case 503: 	case 554: 	    return RP_NDEL;	default: 	    return RP_RPLY;    }}/*  */int     sm_wtxt (buffer, len)register char   *buffer;register int     len;{    register int    result;    sm_alarmed = 0;    (void) alarm (SM_TEXT);    result = sm_wstream (buffer, len);    (void) alarm (0);    return (result == NOTOK ? RP_BHST : RP_OK);}/*  */int     sm_wtend () {    if (sm_wstream ((char *) NULL, 0) == NOTOK)	return RP_BHST;    switch (smtalk (SM_DOT + 3 * sm_addrs, ".")) {	case 250: 	case 251: 	    return RP_OK;	case 451: #ifdef SENDMAILBUG	    return RP_OK;#endif /* SENDMAILBUG */	case 452: 	default: 	    return RP_NO;	case 552: 	case 554: 	    return RP_NDEL;    }}/*  */int     sm_end (type)register int     type;{    register int    status;    struct smtp sm_note;#ifndef	SMTP    switch (sm_child) {	case NOTOK: 	case OK: 	    return RP_OK;	default: 	    break;    }#endif	/* not SMTP */    if (sm_rfp == NULL && sm_wfp == NULL)	return RP_OK;    switch (type) {	case OK: 	    (void) smtalk (SM_QUIT, "QUIT");	    break;	case NOTOK: 	    sm_note.code = sm_reply.code;	    (void) strncpy (sm_note.text, sm_reply.text,		    sm_note.length = sm_reply.length);/* fall */	case DONE: 	    if (smtalk (SM_RSET, "RSET") == 250 && type == DONE)		return RP_OK;#ifndef	SMTP	    (void) kill (sm_child, SIGKILL);	    discard (sm_rfp);	    discard (sm_wfp);#else	/* SMTP */	    (void) smtalk (SM_QUIT, "QUIT");#endif	/* not SMTP */	    if (type == NOTOK) {		sm_reply.code = sm_note.code;		(void) strncpy (sm_reply.text, sm_note.text,			sm_reply.length = sm_note.length);	    }	    break;    }#ifdef	MPOP#ifdef	SMTP    if (sm_ispool) {	sm_ispool = 0;	if (sm_wfp) {	    (void) unlink (sm_tmpfil);	    (void) fclose (sm_wfp);	    sm_wfp = NULL;	}    }#endif#endif /* MPOP */    if (sm_rfp != NULL) {	(void) alarm (SM_CLOS);	(void) fclose (sm_rfp);	(void) alarm (0);    }    if (sm_wfp != NULL) {	(void) alarm (SM_CLOS);	(void) fclose (sm_wfp);	(void) alarm (0);    }#ifndef	SMTP    status = pidwait (sm_child);    sm_child = NOTOK;#else	/* SMTP */    status = 0;#endif	/* SMTP */    sm_rfp = sm_wfp = NULL;    return (status ? RP_BHST : RP_OK);}/*  */#ifdef	MPOP#ifdef	SMTP#include <sys/types.h>#include <sys/stat.h>int	sm_bulk (file)char   *file;{    int	    cc,	    i,	    j,	    k,	    result;    long    pos;    register char *dp;    char   *bp,	   *cp,	    buffer[BUFSIZ],	    sender[BUFSIZ];    FILE   *fp,	   *gp;    gp = NULL;    k = strlen (file) - sizeof ".bulk";    if ((fp = fopen (file, "r")) == NULL) {	(void) sprintf (bp = sm_reply.text, "unable to read %s: ", file);	bp += strlen (bp);	if (errno > 0 && errno < sys_nerr)	    (void) sprintf (bp, "%s", sys_errlist[errno]);	else	    (void) sprintf (bp, "Error %d", errno);	sm_reply.length = strlen (sm_reply.text);	sm_reply.code = NOTOK;	return RP_BHST;    }    if (sm_debug) {	printf ("reading file %s\n", file);	(void) fflush (stdout);    }    i = j = 0;    while (fgets (buffer, sizeof buffer, fp)) {	if (j++ == 0)	    (void) strcpy (sender, buffer + sizeof "MAIL FROM:" - 1);	if (strcmp (buffer, "DATA\r\n") == 0) {	    i = 1;	    break;	}    }    if (i == 0) {	if (sm_debug) {	    printf ("no DATA...\n");	    (void) fflush (stdout);	}losing0: ;	(void) sprintf (buffer, "%s.bad", file);	(void) rename (file, buffer);	if (gp) {	    (void) sprintf (buffer, "%*.*sA.bulk", k, k, file);	    (void) unlink (buffer);	    (void) fclose (gp);	}	(void) fclose (fp);	return RP_OK;    }    if (j < 3) {	if (sm_debug) {	    printf ("no %srecipients...\n", j < 1 ? "sender or " : "");	    (void) fflush (stdout);	}	goto losing0;    }    if ((cp = malloc ((unsigned) (cc = (pos = ftell (fp)) + 1))) == NULL) {	sm_reply.length = strlen (strcpy (sm_reply.text, "out of memory"));losing1: ;	sm_reply.code = NOTOK;	(void) fclose (fp);	return RP_BHST;    }    (void) fseek (fp, 0L, 0);    for (dp = cp, i = 0; i++ < j; dp += strlen (dp))	if (fgets (dp, cc - (dp - cp), fp) == NULL) {	    sm_reply.length = strlen (strcpy (sm_reply.text, "premature eof"));losing2: ;	    free (cp);	    goto losing1;	}    *dp = NULL;    for (dp = cp, i = cc - 1; i > 0; dp += cc, i -= cc)	if ((cc = write (fileno (sm_wfp), dp, i)) == NOTOK) {losing3: ;	    (void) strcpy (bp = sm_reply.text, "error writing to server: ");	    bp += strlen (bp);	    if (errno > 0 && errno < sys_nerr)		(void) sprintf (bp, "%s", sys_errlist[errno]);	    else		(void) sprintf (bp, "Error %d", errno);	    sm_reply.length = strlen (sm_reply.text);	    goto losing2;	}	else	    if (sm_debug) {		printf ("wrote %d octets to server\n", cc);		(void) fflush (stdout);	    }    for (dp = cp, i = 0; i++ < j; dp = index (dp, '\n'), dp++) {	if (sm_debug) {	    if (bp = index (dp, '\r'))		*bp = NULL;	    printf ("=> %s\n", dp);	    (void) fflush (stdout);	    if (bp)		*bp = '\r';	}	switch (smhear () + (i == 1 ? 1000 : i != j ? 2000 : 3000)) {	    case 1000 + 250:	        sm_addrs = 0;	        result = RP_OK;		break;	    case 1000 + 500: 	    case 1000 + 501: 	    case 1000 + 552: 	    case 2000 + 500: 	    case 2000 + 501:		result = RP_PARM;		(void) smtalk (SM_RSET, "RSET");		free (cp);		goto losing0;	    case 2000 + 250:	    case 2000 + 251:		sm_addrs++;	        result = RP_OK;		break;	    case 2000 + 451: #ifdef SENDMAILBUG		sm_addrs++;		result = RP_OK;		break;#endif	    case 2000 + 421: 	    case 2000 + 450: 	    case 2000 + 452: 		result = RP_NO;		goto bad_addr;	    case 2000 + 550: 	    case 2000 + 551: 	    case 2000 + 552: 	    case 2000 + 553: 		result = RP_USER;bad_addr: ;		if (k <= 0 || strcmp (sender, "<>\r\n") == 0)		    break;		if (gp == NULL) {		    int	    l;		    (void) sprintf (buffer, "%*.*sA.bulk", k, k, file);		    if ((gp = fopen (buffer, "w+")) == NULL)			goto bad_data;		    fprintf (gp, "MAIL FROM:<>\r\nRCPT TO:%sDATA\r\n", sender);		    l = strlen (sender);		    fprintf (gp,			     "To: %*.*s\r\nSubject: Invalid addresses (%s)\r\n",			     l - 4, l - 4, sender + 1, file);		    fprintf (gp, "Date: %s\r\nFrom: Postmaster@%s\r\n\r\n",			     dtimenow (), LocalName ());		}		if (bp = index (dp, '\r'))		    *bp = NULL;		fprintf (gp, "=>        %s\r\n", dp);		if (bp)		    *bp = '\r';		fprintf (gp, "<= %s\r\n", rp_string (result));		(void) fflush (gp);		break;	    case 3000 + 354: #ifdef SENDMAILBUGok_data: ;#endif		result = RP_OK;		break;	    case 3000 + 451: #ifdef SENDMAILBUG		goto ok_data;#endif	    case 3000 + 421:		result = RP_NO;bad_data: ;		(void) smtalk (SM_RSET, "RSET");		free (cp);		if (gp) {		    (void) sprintf (buffer, "%*.*sA.bulk", k, k, file);		    (void) unlink (buffer);		    (void) fclose (gp);		}		(void) fclose (fp);		return result;	    case 3000 + 500: 	    case 3000 + 501: 	    case 3000 + 503: 	    case 3000 + 554: 		(void) smtalk (SM_RSET, "RSET");		free (cp);		goto no_dice;	    default:		result = RP_RPLY;		goto bad_data;	}    }    free (cp);    {	struct stat st;#ifdef SYS5	cc = BUFSIZ;#else	if (fstat (fileno (sm_wfp), &st) == NOTOK	        || (cc = st.st_blksize) < BUFSIZ)	    cc = BUFSIZ;#endif	if ((cp = malloc ((unsigned) cc)) == NULL) {	    (void) smtalk (SM_RSET, "RSET");	    sm_reply.length = strlen (strcpy (sm_reply.text, "out of memory"));	    goto losing1;	}    }    (void) fseek (fp, pos, 0);    for (;;) {	int	eof = 0;	for (dp = cp, i = cc; i > 0; dp += j, i -= j)	    if ((j = fread (cp, sizeof *cp, i, fp)) == OK) {		if (ferror (fp)) {		    (void) sprintf (bp = sm_reply.text,				    "error reading %s: ", file);		    bp += strlen (bp);		    if (errno > 0 && errno < sys_nerr)			(void) sprintf (bp, "%s", sys_errlist[errno]);		    else			(void) sprintf (bp, "Error %d", errno);		    sm_reply.length = strlen (sm_reply.text);		    goto losing2;		}		cc = dp - cp;		eof = 1;		break;	    }	for (dp = cp, i = cc; i > 0; dp += j, i -= j)	    if ((j = write (fileno (sm_wfp), dp, i)) == NOTOK)		goto losing3;	    else		if (sm_debug) {		    printf ("wrote %d octets to server\n", j);		    (void) fflush (stdout);		}	if (eof)	    break;    }    free (cp);    switch (smhear ()) {	case 250: 	case 251: #ifdef SENDMAILBUGok_dot: ;#endif	    result = RP_OK;	    (void) unlink (file);	    break;	case 451: #ifdef SENDMAILBUG	    goto ok_dot;#endif	case 452: 	default: 	    result = RP_NO;	    if (gp) {		(void) sprintf (buffer, "%*.*sA.bulk", k, k, file);		(void) unlink (buffer);		(void) fclose (gp);		gp = NULL;	    }	    break;	case 552: 	case 554: no_dice: ;	    result = RP_NDEL;	    if (k <= 0 || strcmp (sender, "<>\r\n") == 0) {		(void) unlink (file);		break;	    }	    if (gp) {		(void) fflush (gp);		(void) ftruncate (fileno (gp), 0L);		(void) fseek (gp, 0L, 0);	    }    	    else {		(void) sprintf (buffer, "%*.*sA.bulk", k, k, file);		if ((gp = fopen (buffer, "w")) == NULL)		    break;	    }	    fprintf (gp, "MAIL FROM:<>\r\nRCPT TO:%sDATA\r\n", sender);	    i = strlen (sender);	    fprintf (gp, "To: %*.*s\r\nSubject: Failed mail (%s)\r\n",		     i - 4, i - 4, sender + 1, file);            fprintf (gp, "Date: %s\r\nFrom: Postmaster@%s\r\n\r\n",		     dtimenow (), LocalName ());	    break;    }    if (gp) {	(void) fputs ("\r\n------- Begin Returned message\r\n\r\n", gp);	(void) fseek (fp, pos, 0);	while (fgets (buffer, sizeof buffer, fp)) {	    if (buffer[0] == '-')		(void) fputs ("- ", gp);	    if (strcmp (buffer, ".\r\n"))		(void) fputs (buffer, gp);	}	(void) fputs ("\r\n------- End Returned Message\r\n\r\n.\r\n", gp);	(void) fflush (gp);	if (!ferror (gp))	    (void) unlink (file);	(void) fclose (gp);    }    (void) fclose (fp);    return result;}#endif#endif /* MPOP */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -