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

📄 slocal.c

📁 <B>Digital的Unix操作系统VAX 4.2源码</B>
💻 C
📖 第 1 页 / 共 2 页
字号:
	p -> p_value = getcpy (addr);    for (i = 0, state = FLD;;) {	switch (state = m_getfld (state, name, field, sizeof field, in)) {	    case FLD: 	    case FLDEOF: 	    case FLDPLUS: 		lp = add (field, NULLCP);		while (state == FLDPLUS) {		    state = m_getfld (state, name, field, sizeof field, in);		    lp = add (field, lp);		}		for (p = hdrs; p -> p_name; p++)		    if (uleq (p -> p_name, name)) {			if (!(p -> p_flags & P_HID)) {			    if (cp = p -> p_value)				if (p -> p_flags & P_ADR) {				    dp = cp + strlen (cp) - 1;				    if (*dp == '\n')					*dp = NULL;				    cp = add (",\n\t", cp);				}				else				    cp = add ("\t", cp);			    p -> p_value = add (lp, cp);			}			free (lp);			break;		    }		if (p -> p_name == NULL && i < NVEC) {		    p -> p_name = getcpy (name);		    p -> p_value = lp;		    p -> p_flags = P_NIL;		    p++, i++;		    p -> p_name = NULL;		}		if (state != FLDEOF)		    continue;		break;	    case BODY: 	    case BODYEOF: 	    case FILEEOF: 		break;	    case LENERR: 	    case FMTERR: 		advise (NULLCP, "format error in message");		break;	    default: 		advise (NULLCP, "internal error");		(void) fclose (in);		return NOTOK;	}	break;    }    (void) fclose (in);    if (p = lookup (vars, "reply-to")) {	if ((q = lookup (hdrs, "reply-to")) == NULL || q -> p_value == NULL)	    q = lookup (hdrs, "from");	p -> p_value = getcpy (q ? q -> p_value : "");	p -> p_flags &= ~P_CHK;	if (debug)	    fprintf (stderr, "vars[%d]: name=\"%s\" value=\"%s\"\n",		    p - vars, p -> p_name, p -> p_value);    }    if (debug)	for (p = hdrs; p -> p_name; p++)	    fprintf (stderr, "hdrs[%d]: name=\"%s\" value=\"%s\"\n",		p - hdrs, p -> p_name, p -> p_value);    return OK;}/*  */#define	LPAREN	'('#define	RPAREN	')'static  expand (s1, s2, fd)register char  *s1,               *s2;int	fd;{    register char   c,                   *cp;    register struct pair   *p;    if (!globbed)	glob (fd);    while (c = *s2++)	if (c != '$' || *s2 != LPAREN)	    *s1++ = c;	else {	    for (cp = ++s2; *s2 && *s2 != RPAREN; s2++)		continue;	    if (*s2 != RPAREN) {		s2 = --cp;		continue;	    }	    *s2++ = NULL;	    if (p = lookup (vars, cp)) {		if (!parsed && (p -> p_flags & P_CHK))		    (void) parse (fd);		(void) strcpy (s1, p -> p_value);		s1 += strlen (s1);	    }	}    *s1 = NULL;}/*  */static	glob (fd)register int  fd;{    char buffer[BUFSIZ];    struct stat st;    register struct pair   *p;    if (globbed++)	return;    if (p = lookup (vars, "sender"))	p -> p_value = getcpy (sender);    if (p = lookup (vars, "address"))	p -> p_value = getcpy (addr);    if (p = lookup (vars, "size")) {	(void) sprintf (buffer, "%d",		fstat (fd, &st) != NOTOK ? (int) st.st_size : 0);	p -> p_value = getcpy (buffer);    }    if (p = lookup (vars, "info"))	p -> p_value = getcpy (info);    if (debug)	for (p = vars; p -> p_name; p++)	    fprintf (stderr, "vars[%d]: name=\"%s\" value=\"%s\"\n",		    p - vars, p -> p_name, p -> p_value);}/*  */static struct pair *lookup (pairs, key)register struct pair   *pairs;register char  *key;{    register char  *cp;    for (; cp = pairs -> p_name; pairs++)	if (uleq (cp, key))	    return pairs;    return NULL;}/*  */static int  logged_in () {    struct utmp ut;    register FILE  *uf;    if (utmped)	return utmped;    if ((uf = fopen ("/etc/utmp", "r")) == NULL)	return NOTOK;    while (fread ((char *) &ut, sizeof ut, 1, uf) == 1)	if (ut.ut_name[0] != NULL		&& strncmp (user, ut.ut_name, sizeof ut.ut_name) == 0) {	    if (debug)		continue;	    (void) fclose (uf);	    return (utmped = DONE);	}    (void) fclose (uf);    return (utmped = NOTOK);}static int  timely (t1, t2)char   *t1,       *t2;{#define	check(t,a,b)		if (t < a || t > b) return NOTOK#define	cmpar(h1,m1,h2,m2)	if (h1 < h2 || (h1 == h2 && m1 < m2)) return OK    int     t1hours,            t1mins,            t2hours,            t2mins;    if (sscanf (t1, "%d:%d", &t1hours, &t1mins) != 2)	return NOTOK;    check (t1hours, 0, 23);    check (t1mins, 0, 59);    if (sscanf (t2, "%d:%d", &t2hours, &t2mins) != 2)	return NOTOK;    check (t2hours, 0, 23);    check (t2mins, 0, 59);    cmpar (now -> tw_hour, now -> tw_min, t1hours, t1mins);    cmpar (t2hours, t2mins, now -> tw_hour, now -> tw_min);    return NOTOK;}/*  */static int  usr_file (fd, mailbox, from)int     fd;char   *mailbox,       *from;{    int	    md,	    mapping;    register char  *bp;    char    buffer[BUFSIZ];    if (verbose)	printf ("\tdelivering to file \"%s\"", mailbox);    if (from && *from) {	(void) mbx_uucp ();	if (verbose)	    printf (" (uucp style)");	(void) sprintf (buffer, "%s%s", from, ddate);	bp = buffer;	mapping = 0;    }    else {	bp = ddate;	mapping = 1;    }    if (verbose)	(void) fflush (stdout);    if ((md = mbx_open (mailbox, pw -> pw_uid, pw -> pw_gid, m_gmprot ()))	    == NOTOK) {	adorn ("", "unable to open:");	return NOTOK;    }    (void) lseek (fd, 0L, 0);    if (mbx_copy (mailbox, md, fd, mapping, bp, verbose) == NOTOK) {	adorn ("", "error writing to:");	return NOTOK;    }    (void) mbx_close (mailbox, md);    if (verbose) {	printf (", done.\n");	(void) fflush (stdout);    }    return OK;}/*  */#ifdef	notdefstatic int  usr_hook (fd, mailbox)int     fd;char   *mailbox;{    int     i,            vecp;    char    receive[BUFSIZ],            tmpfil[BUFSIZ],           *vec[NVEC];    if ((fd = copyfile (fd, tmpfil, 0)) == NOTOK) {	if (verbose)	    adorn ("unable to copy message; skipping hook\n");	return NOTOK;    }    (void) chown (tmpfil, pw -> pw_uid, pw -> pw_gid);    vecp = 1;    (void) sprintf (receive, "%s/.mh_receive", pw -> pw_dir);    switch (access (receive, 01)) {	case NOTOK: 	    (void) sprintf (receive, "%s/bin/rcvmail", pw -> pw_dir);	    if (access (receive, 01) == NOTOK) {		(void) unlink (tmpfil);		if (verbose) {		    printf ("\tnot present\n");		    (void) fflush (stdout);		}		return NOTOK;	    }	    vec[vecp++] = addr;	    vec[vecp++] = tmpfil;	    vec[vecp++] = sender;	    break;	default: 	    vec[vecp++] = tmpfil;	    vec[vecp++] = mailbox;	    vec[vecp++] = home;	    vec[vecp++] = addr;	    vec[vecp++] = sender;	    break;    }    vec[0] = r1bindex (receive, '/');    vec[vecp] = NULL;    i = usr_pipe (fd, "rcvmail", receive, vec);    (void) unlink (tmpfil);    return i;}#endif	notdef/*  */static int  usr_pipe (fd, cmd, pgm, vec)int     fd;char   *cmd,       *pgm,      **vec;{    int     bytes,	    i,            child_id,            status;    struct stat st;    if (verbose) {	printf ("\tdelivering to pipe \"%s\"", cmd);	(void) fflush (stdout);    }    (void) lseek (fd, 0L, 0);    for (i = 0; (child_id = fork ()) == NOTOK && i < 5; i++)	sleep (5);    switch (child_id) {	case NOTOK: 	    adorn ("fork", "unable to");	    return NOTOK;	case OK: 	    if (fd != 0)		(void) dup2 (fd, 0);	    (void) freopen ("/dev/null", "w", stdout);	    (void) freopen ("/dev/null", "w", stderr);	    if (fd != 3)		(void) dup2 (fd, 3);	    closefds (4);#ifdef	TIOCNOTTY	    if ((fd = open ("/dev/tty", 2)) != NOTOK) {		(void) ioctl (fd, TIOCNOTTY, NULLCP);		(void) close (fd);	    }#endif	TIOCNOTTY#ifdef	BSD42	    (void) setpgrp (0, getpid ());#endif	BSD42	    *environ = NULL;	    (void) putenv ("USER", pw -> pw_name);	    (void) putenv ("HOME", pw -> pw_dir);	    (void) putenv ("SHELL", pw -> pw_shell);	    execvp (pgm, vec);	    _exit (-1);	default: 	    switch (setjmp (myctx)) {		case OK: 		    (void) signal (SIGALRM, alrmser);		    bytes = fstat (fd, &st) != NOTOK ? (int) st.st_size : 100;		    if (bytes <= 0)			bytes = 100;		    (void) alarm ((unsigned) (bytes * 60 + 300));		    status = pidwait (child_id, OK);		    (void) alarm (0);#ifdef	MMDFI		    if (status == RP_MOK || status == RP_OK)			status = 0;#endif	MMDFI		    if (verbose) {			if (status == 0)			    printf (", wins.\n");			else			    if ((status & 0xff00) == 0xff00)				printf (", system error\n");			    else				(void) pidstatus (status, stdout, ", loses");			(void) fflush (stdout);		    }		    return (status == 0 ? OK : NOTOK);		default: #ifndef	BSD42		    (void) kill (child_id, SIGKILL);#else	BSD42		    (void) killpg (child_id, SIGKILL);#endif	BSD42		    if (verbose) {			printf (", timed-out; terminated\n");			(void) fflush (stdout);		    }		    return NOTOK;	    }    }}/*  *//* ARGSUSED */static	int alrmser (i)int     i;{    longjmp (myctx, DONE);}/*  */static	copyinfo (fp, from)register FILE   *fp;char	*from;{    int     i;    register char  *cp;    static char buffer[BUFSIZ];    if (unixfrom)	/* interface from copyfile */	strcpy (from, unixfrom);    else if (fgets (from, BUFSIZ, fp) == NULL)	adios (NULLCP, "no message");    if (strncmp (from, "From ", i = strlen ("From "))) {	rewind (fp);	*from = NULL;	return;    }    (void) strcpy (buffer, from + i);    if (cp = index (buffer, '\n')) {	*cp = NULL;	cp -= 24;	if (cp < buffer)	    cp = buffer;    }    else	cp = buffer;    *cp = NULL;    for (cp = buffer + strlen (buffer) - 1; cp >= buffer; cp--)	if (isspace (*cp))	    *cp = NULL;	else	    break;    sender = buffer;    rewind (fp);}/*  */static int  copyfile (qd, tmpfil, fold)int     qd,	fold;register char   *tmpfil;{    register int    i,		    first = 0,                    fd1,                    fd2;    char    buffer[BUFSIZ];    register FILE  *qfp,		   *ffp;    (void) strcpy (tmpfil, m_tmpfil (invo_name));    if ((fd1 = creat (tmpfil, 0600)) == NOTOK)	return NOTOK;    (void) close (fd1);    if ((fd1 = open (tmpfil, 2)) == NOTOK)	return NOTOK;    if (!fold) {	while ((i = read (qd, buffer, sizeof buffer)) > 0)	    if (write (fd1, buffer, i) != i) {you_lose: ;		(void) close (fd1);		(void) unlink (tmpfil);		return NOTOK;	    }	if (i == NOTOK)	    goto you_lose;	(void) lseek (fd1, 0L, 0);	return fd1;    }    if ((fd2 = dup (qd)) == NOTOK) {	(void) close (fd1);	return NOTOK;    }    if ((qfp = fdopen (fd2, "r")) == NULL) {	(void) close (fd1);	(void) close (fd2);	return NOTOK;    }    if ((fd2 = dup (fd1)) == NOTOK) {	(void) close (fd1);	(void) fclose (qfp);	return NOTOK;    }    if ((ffp = fdopen (fd2, "r+")) == NULL) {	(void) close (fd1);	(void) close (fd2);	(void) fclose (qfp);	return NOTOK;    }    i = strlen ("From ");    while (fgets (buffer, sizeof buffer, qfp)) {	if (!strncmp (buffer, "From ", i))	    if (first == 0) {#ifdef  RPATHS		register char *fp, *cp, *hp, *ep;#endif		unixfrom = getcpy (buffer);     /* save for later */#ifndef RPATHS		continue;                       /* but don't put in file */#else		hp = cp = index (fp = unixfrom + i, ' ');		while (hp = index (++hp, 'r'))		    if (uprf (hp, "remote from")) {			hp = rindex (hp, ' ');			break;		    }		if (hp) {		    ep = rindex (++hp, '\n');		    sprintf (buffer, "Return-Path: %.*s!%.*s\n",			    ep - hp, hp,			    cp - fp, fp);		}		else		    sprintf (buffer, "Return-Path: %.*s\n",			    cp - fp, fp);#endif	    }	    else		putc ('>', ffp);	first++;	fputs (buffer, ffp);	if (ferror (ffp)) {	    (void) close (fd1);	    (void) fclose (ffp);	    (void) fclose (qfp);	    return NOTOK;	}    }    (void) fclose (ffp);    if (ferror (qfp)) {	(void) close (fd1);	(void) fclose (qfp);	return NOTOK;    }    (void) fclose (qfp);    (void) lseek (fd1, 0L, 0);    return fd1;}/*  *//* VARARGS2 */static void  adorn (what, fmt, a, b, c, d, e, f)char   *what,       *fmt,       *a,       *b,       *c,       *d,       *e,       *f;{    char   *cp = invo_name;    if (!verbose)	return;    printf (", ");    invo_name = NULL;    advise (what, fmt, a, b, c, d, e, f);    invo_name = cp;}

⌨️ 快捷键说明

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