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

📄 uminc.c

📁 早期freebsd实现
💻 C
字号:
/* uminc.c - uucp to mmdf inc */#ifndef	lintstatic char Id[] = "@(#)$Id: uminc.c,v 1.2 1993/08/25 17:31:30 jromine Exp $";#endif#include "mf.h"#include <stdio.h>#include "../mts/mts.h"#include <errno.h>#include <sys/types.h>#include <sys/stat.h>static int  mmdf = NOTOK;static int  uucp = NOTOK;static char mmdfbox[LINESIZ];static char uucpbox[LINESIZ];off_t    lseek ();/*  */main (argc, argv)int     argc;char   *argv[];{    int     fd,            tmp;    struct stat st1,                st2;    mts_init (*argv);    sprintf (uucpbox, "%s/%s", UUCPDIR, UUCPFIL);    if (stat (uucpbox, &st1) == NOTOK || st1.st_size == 0L)	exit (0);    if ((uucp = lkopen (uucpbox, 0)) == NOTOK)	die ("unable to lock and open %s", uucpbox);    tmp = tmp_open (&fd);    switch (fd = uucp2mmdf (uucp, fd, FALSE)) {	case MFOK: 	    break;	case MFPRM: 	    die ("internal error while filtering UUCP mail");	case MFSIO: 	    die ("no free file pointers -- you lose");	case MFERR: 	    die ("i/o error while filtering UUCP mail");	case MFROM: 	case MFHDR: 	case MFTXT: 	    fprintf (stderr, "UUCP mailbox in bad format, patched...\n");	    break;    }    sprintf (mmdfbox, "%s/%s", MAILDIR, MAILFIL);    mmdf = mbx_open (mmdfbox);    mbx_copy (tmp, mmdf);    close (tmp);    lkclose (mmdf, mmdfbox), mmdf = NOTOK;    if (stat (uucpbox, &st2) != NOTOK && st1.st_mtime != st2.st_mtime)	fprintf (stderr, "UUCP mailbox has been updated... (%s)\n",		"so it won't be removed");    else	if (unlink (uucpbox) == NOTOK)	    if ((fd = creat (uucpbox, st1.st_mode & ~S_IFMT)) != NOTOK)		close (fd);	    else		fprintf (stderr, "unable to remove or zero UUCP mailbox\n");    lkclose (uucp, uucpbox), uucp = NOTOK;    exit (0);}/*  */static int  mbx_open (file)char   *file;{    int     clear,            count,            fd;    extern int  errno;    struct stat stbuf;    for (clear = FALSE, count = 2; count > 0; count--)	if ((fd = lkopen (file, 6)) == NOTOK)	    switch (errno) {		case ENOENT: 		    mbx_create (file);		    clear++;		    break;		case ETXTBSY: 		    sleep (5);		    break;		default: 		    goto openerr;	    }	else {	    if (fstat (fd, &stbuf) == NOTOK)		die ("unable to stat MMDF mailbox '%s'", file);	    clear = stbuf.st_size == 0L;	    break;	}    if (fd == NOTOK) {openerr: 	if (errno == ETXTBSY)	    die ("your MMDF mailbox '%s' is busy", file);	else	    die ("unable to open MMDF mailbox '%s'", file);    }    if (!clear)	mbx_chk (fd, file);    return fd;}/*  */static  mbx_create (file)char   *file;{    int     fd;    if ((fd = creat (file, MBXMODE)) == NOTOK)	die ("unable to create MMDF mailbox '%s'", file);    close (fd);}static  mbx_chk (fd, file)int     fd;char   *file;{    int     count;    char    ldelim[20];    count = strlen (mmdlm2);    if (lseek (fd, (off_t) - count, 2) == (off_t) NOTOK	    || read (fd, ldelim, count) != count)	die ("error reading MMDF mailbox '%s'", file);    ldelim[count] = NULL;    if (strcmp (ldelim, mmdlm2)) {	fprintf (stderr,		"MMDF mailbox '%s' has bad delimiter, patching...\n",		file);	if (write (fd, mmdlm2, count) != count)	    die ("error writing MMDF mailbox '%s'", file);    }}/*  */static  mbx_copy (in, out)int     in,        out;{    int     i;    char    buffer[BUFSIZ];    lseek (in, (off_t)0, 0);    while ((i = read (in, buffer, sizeof buffer)) > 0)	if (write (out, buffer, i) != i)	    die ("error writing MMDF mailbox");    if (i < 0)	die ("error reading temporary file");    close (in);    close (out);}/*  */static int  tmp_open (mbx_fd)int    *mbx_fd;{    int     fd;    char    tmpfil[LINESIZ];    strcpy (tmpfil, "/tmp/umincXXXXXX");    unlink (mktemp (tmpfil));    if ((fd = creat (tmpfil, TMPMODE)) == NOTOK)	die ("unable to create temporary file '%s'", tmpfil);    close (fd);    if ((fd = open (tmpfil, 2)) == NOTOK)	die ("unable to create temporary file '%s'", tmpfil);    unlink (tmpfil);    if ((*mbx_fd = dup (fd)) == NOTOK)	die ("unable to duplicate fd for temporary file '%s'", tmpfil);    return fd;}/*  */static  die (fmt, a, b, c, d)char   *fmt,       *a,       *b,       *c,       *d;{    lkclose (mmdf, mmdfbox), mmdf = NOTOK;    lkclose (uucp, uucpbox), uucp = NOTOK;    fflush (stdout);    fprintf (stderr, fmt, a, b, c, d);    putc ('\n', stderr);    exit (1);}

⌨️ 快捷键说明

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