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

📄 popser.c

📁 早期freebsd实现
💻 C
📖 第 1 页 / 共 4 页
字号:
    (void) respond (OK, "%d octets", Msgs[i].m_size);#ifdef	POP2  }  else		/* if called by pop2, vec = { "retr", 0 } */    i = pop2;#endif    for ((void) fseek (dp, pos = Msgs[i].m_start, 0);	    fgets (buffer, sizeof buffer, dp) != NULL && pos < Msgs[i].m_stop;	    pos += (long) (cp - buffer + 1)) {	if (*(cp = buffer + strlen (buffer) - 1) == '\n')	    *cp = 0;	multiline ("%s", buffer);    }#ifdef	POP2  if (pop2 == NOTOK) {		/* then multiend */#endif    multiend ();    if (i > Msgs[0].m_last) {	Msgs[0].m_last = i; 	rmsgs++;    }#ifdef	POP2  }#endif    return OK;}/*  */static int  delete (vec)register char   **vec;{    register int    i;    if (Msgs[0].m_flags & MREAD)	return respond (NOTOK, "maildrop is read-only");    if ((i = atoi (vec[1])) <= 0 || i > nmsgs)	return respond (NOTOK, "no such message: \"%s\"", vec[1]);    if (Msgs[i].m_flags & MDELE)	return respond (NOTOK, "message %d is deleted", i);    Msgs[i].m_flags |= MDELE;    Msgs[0].m_size -= Msgs[i].m_size;    dmsgs++;    if (i > Msgs[0].m_last)	Msgs[0].m_last = i;    return respond (OK, "message %d deleted (%d octets)", i, Msgs[i].m_size);}static int  reset (vec)char   **vec;{    register int    i;    for (i = 1; i <= nmsgs; i++)	if (Msgs[i].m_flags & MDELE) {	    Msgs[i].m_flags &= ~MDELE;	    Msgs[0].m_size += Msgs[i].m_size;	    dmsgs--;	}    Msgs[0].m_last = lastseen;#ifdef	MPOP#ifdef	BPOP    if (nfs) {	if (scanl)	    free (scanl), scanl = NULL;	free (nfs), nfs = NULL;    }#endif#endif /* MPOP */    return status (vec);}/*  */static int  top (vec)register char  **vec;{    register int    i,                    j,                    body,                    lines;    register long   pos;    register char  *cp;    char    buffer[BUFSIZ];    if ((i = atoi (vec[1])) <= 0 || i > nmsgs)	return respond (NOTOK, "no such message: \"%s\"", vec[1]);    if (Msgs[i].m_flags & MDELE)	return respond (NOTOK, "message %d is deleted", i);    if ((j = atoi (vec[2])) < 0)	return respond (NOTOK, "bad number: \"%s\"", vec[2]);    (void) respond (OK, vec[0]);    body = lines = 0;    for ((void) fseek (dp, pos = Msgs[i].m_start, 0);	    fgets (buffer, sizeof buffer, dp) != NULL && pos < Msgs[i].m_stop;	    pos += (long) (cp - buffer + 1)) {	if (*(cp = buffer + strlen (buffer) - 1) == '\n')	    *cp = 0;	if (body) {	    if (lines++ >= j)		break;	}	else	    if (*buffer == 0)		body++;	multiline ("%s", buffer);    }    multiend ();    return OK;}/*  *//* ARGSUSED */static int  last (vec)  char  **vec;{    return respond (OK, "%d is the last msg seen", Msgs[0].m_last);}/*  */#ifdef	BPOPstatic int  xtnd (vec)register char    **vec;{    make_lower (vec[1], vec[1]);    if (strcmp (vec[1], "bboards") == 0 || strcmp (vec[1], "archive") == 0)	return xtnd1 (vec);    if (strcmp (vec[1], "x-bboards") == 0)	return xtnd2 (vec);#ifdef	MPOP    if (strcmp (vec[1], "scan") == 0)	return xtnd3 (vec);#endif /* MPOP */    return respond (NOTOK, "unknown XTND command: \"%s\"", vec[1]);}static int  xtnd1 (vec)register char    **vec;{    register struct bboard *bb;    if (vec[2]) {	make_lower (vec[2], vec[2]);	if ((bb = getbbaux (vec[2])) == NULL)	    return respond (NOTOK, "unknown BBoard: \"%s\"", vec[2]);	if (quitaux (NULLVP) == NOTOK)	    return NOTOK;	(void) strcpy (maildrop,		strcmp (vec[1], "bboards") ? bb -> bb_archive : bb -> bb_file);	if (setupaux (TRUE) == NOTOK)	    return NOTOK;	xtnded++;	(void) respond (OK, "%s", vec[1]);	multiline ("%s %d", bb -> bb_name, bb -> bb_maxima);    }    else {	if (strcmp (vec[1], "bboards"))	    return respond (NOTOK, "too few arguments to XTND \"%s\"", vec[1]);	(void) respond (OK, "%s", vec[1]);	for (bb = BBhead; bb; bb = bb -> bb_next) {	    getbbmax (bb);	    if (!(bb -> bb_flags & BB_INVIS))		multiline ("%s %d", bb -> bb_name, bb -> bb_maxima);	}	while (bb = getbbaux (NULLCP))	    if (!(bb -> bb_flags & BB_INVIS))		multiline ("%s %d", bb -> bb_name, bb -> bb_maxima);    }    multiend ();    return OK;}/*  */static int  xtnd2 (vec)register char     **vec;{    register char  *cp,                  **ap;    char    buffer[BUFSIZ];    register struct bboard *bb;    if (vec[2] == NULL)	return respond (NOTOK, "too few arguments to XTND \"%s\"", vec[1]);    make_lower (vec[2], vec[2]);    if ((bb = getbbaux (vec[2])) == NULL)	return respond (NOTOK, "unknown BBoard: \"%s\"", vec[2]);    (void) respond (OK, "%s", vec[1]);    multiline ("%s", bb -> bb_name);    cp = buffer;    for (ap = bb -> bb_aka; *ap; ap++) {	(void) sprintf (cp, cp != buffer ? " %s" : "%s", *ap);	cp += strlen (cp);    }    multiline ("%s", buffer);    multiline ("%s", bb -> bb_file);    multiline ("%s", bb -> bb_archive);    multiline ("%s", bb -> bb_info);    multiline ("%s", bb -> bb_map);    multiline ("%s", bb -> bb_passwd);    cp = buffer;    for (ap = bb -> bb_leader; *ap; ap++) {	(void) sprintf (cp, cp != buffer ? " %s" : "%s", *ap);	cp += strlen (cp);    }    multiline ("%s", buffer);    multiline ("%s", bb -> bb_addr);    multiline ("%s", bb -> bb_request);    multiline ("%s", bb -> bb_relay);    cp = buffer;    for (ap = bb -> bb_dist; *ap; ap++) {	(void) sprintf (cp, cp != buffer ? " %s" : "%s", *ap);	cp += strlen (cp);    }    multiline ("%s", buffer);    getbbmax (bb);    multiline ("0%o %d", bb -> bb_flags, bb -> bb_maxima);    multiline ("%s", bb -> bb_date);    multiend ();    return OK;}/*  */static struct bboard *getbbaux (s)register char   *s;{    register struct bboard *bb;    struct stat st;    if (BBhead == NULL)	if (setbbinfo (BBOARDS, BBDB, 1))	    BBtime = getbbtime ();	else	    return NULL;    if (s != NULLCP)	for (bb = BBhead; bb; bb = bb -> bb_next)	    if (strcmp (bb -> bb_name, s) == 0) {		if (debug)		    padvise (NULLCP, LOG_DEBUG, "getbbaux: \"%s\" from cache",			    bb -> bb_name);		getbbmax (bb);		return bb;	    }    while (bb = getbbent ()) {	if ((bb = getbbcpy (bb)) == NULL)	    return NULL;	if (access (bb -> bb_file, 04) == NOTOK && errno == EACCES)	    bb -> bb_flags |= BB_INVIS;	bb -> bb_mtime = stat (bb -> bb_info, &st) != NOTOK ? st.st_mtime : 0L;	if (BBtail != NULL)	    BBtail -> bb_next = bb;	if (BBhead == NULL)	    BBhead = bb;	BBtail = bb;	if (s == NULL || strcmp (bb -> bb_name, s) == 0) {	    if (s && debug)		padvise (NULLCP, LOG_DEBUG, "getbbaux: \"%s\" from scratch",			bb -> bb_name);	    return bb;	}    }    return NULL;}/*  */static  getbbmax (bb)register struct bboard *bb;{    int     i;    register char  *cp;    char    buffer[BUFSIZ];    struct stat st;    register    FILE * fp;    if (debug)	padvise (NULLCP, LOG_DEBUG, "getbbmax: \"%s\", 0%o, %d, %s",		bb -> bb_name, bb -> bb_flags, bb -> bb_maxima, bb -> bb_date);    if (!(bb -> bb_flags & BB_INVIS)	    && access (bb -> bb_file, 04) == NOTOK && errno == EACCES)	bb -> bb_flags |= BB_INVIS;    if (stat (bb -> bb_info, &st) == NOTOK	    || bb -> bb_mtime == st.st_mtime	    || (fp = fopen (bb -> bb_info, "r")) == NULL)	return;    bb -> bb_mtime = st.st_mtime;    if (fgets (buffer, sizeof buffer, fp) && (i = atoi (buffer)) > 0)	bb -> bb_maxima = i;    if (!feof (fp) && fgets (buffer, sizeof buffer, fp)) {	if (bb -> bb_date)	    free (bb -> bb_date);	if (cp = index (buffer, '\n'))	    *cp = NULL;	bb -> bb_date = getcpy (buffer);    }    (void) fclose (fp);    if (debug)	padvise (NULLCP, LOG_DEBUG, "updated: \"%s\", 0%o, %d, %s",		bb -> bb_name, bb -> bb_flags, bb -> bb_maxima, bb -> bb_date);}/*  */#ifdef	MPOPstatic int xtnd3 (vec)register char **vec;{    if (vec[2] == NULL)	return respond (NOTOK, "too few arguments to XTND \"%s\"", vec[1]);    if ((_sc_width = atoi (vec[2])) < WIDTH / 2)	_sc_width = WIDTH / 2;    nfs = new_fs (NULLCP, vec[3], FORMAT);    if (scanl)	(void) free (scanl), scanl = NULL;    return respond (OK, vec[1]);}int	sc_width () { return _sc_width; }#endif /* MPOP */#endif	/* BPOP *//*  */static int  quit (vec)char   **vec;{    int     d,            n;    d = dmsgs, n = nmsgs;    if (quitaux (vec) == NOTOK)	return NOTOK;#ifdef	BPOP    if (xtnded)	return respond (OK, "%s signing off", server);#endif	/* BPOP */    if (n == d)	return respond (OK, "%s signing off (maildrop empty)", server);    return respond (OK,	    n ? "%s signing off (%d message%s, %d octets left)"	    : "%s signing off (maildrop empty)",	    server, n - d, n - d != 1 ? "s" : "", Msgs[0].m_size);}static int  quitaux (vec)char   **vec;{    int     i;    if (dp == NULL)	return OK;    i = quitfile (vec);    nmsgs = dmsgs = rmsgs = 0;    (void) lkfclose (dp, maildrop);    dp = NULL;    return i;}/*  *//* ARGSUSED */static int  quitfile (vec)char   **vec;{    register int    i,		    j,		    tmpDR,                    md;    char    tmpfil[BUFSIZ],            map1[BUFSIZ],            map2[BUFSIZ];    struct stat st;if(debug)padvise(NULLCP,LOG_DEBUG,"XXX: dmsgs=%d rmsgs=%d readonly=%d",		 dmsgs, rmsgs, Msgs[0].m_flags & MREAD);    if (dmsgs == 0 || (Msgs[0].m_flags & MREAD))	return OK;    if (fstat (fileno (dp), &st) == NOTOK)	return respond (NOTOK, "unable to stat file");    if (mtime != st.st_mtime)	return respond (NOTOK, "new messages have arrived, no update");    mode = (int) (st.st_mode & 0777);    if (nmsgs == dmsgs) {#ifndef	SYS5	i = truncate (maildrop, 0);#else	/* SYS5 */	i = open (maildrop, O_WRONLY | O_TRUNC);	if (i != NOTOK) (void) close (i);#endif	/* SYS5 */	(void) unlink (map_name (maildrop));/* XXX */	if (i == NOTOK)	    return respond (NOTOK, "unable to zero %s", maildrop);	return OK;    }    (void) strcpy (tmpfil, m_backup (maildrop));    if ((md = mbx_open (tmpfil, st.st_uid, st.st_gid, mode)) == NOTOK)	  { char msgbuf0[256];	    sprintf(msgbuf0,"unable to create temporary file (%s)",tmpfil);	    return respond (NOTOK, msgbuf0);          }    j = 0, tmpDR = Msgs[0].m_last;if(debug)padvise(NULLCP,LOG_DEBUG,"XXX: last=%d",Msgs[0].m_last);    for (i = 1; i <= nmsgs; i++) {	if (!(Msgs[i].m_flags & MDELE))	    j++;	if (i == tmpDR)	    Msgs[0].m_last = j;    }if(debug)padvise(NULLCP,LOG_DEBUG,"XXX: last=%d",Msgs[0].m_last);    for (i = 1; i <= nmsgs; i++)	if (!(Msgs[i].m_flags & MDELE)	    &&  mbx_write (tmpfil, md, dp, Msgs[i].m_id, Msgs[0].m_last,			Msgs[i].m_start, Msgs[i].m_stop, TRUE, debug)				== NOTOK) {	    (void) mbx_close (tmpfil, md);	    (void) unlink (tmpfil);	    return respond (NOTOK, "error writing temporary file");	}    (void) mbx_close (tmpfil, md);    if ((i = rename (tmpfil, maildrop)) == OK) {	(void) strcpy (map1, map_name (tmpfil));	(void) strcpy (map2, map_name (maildrop));	if (rename (map1, map2) == NOTOK) {	    (void) unlink (map1);	    (void) unlink (map2);	}    }    if (i == NOTOK)	return respond (NOTOK, "unable to rename maildrop");    return OK;}/*  */static struct vector   *getvector (bp, vec)register char   *bp,	      **vec;{    register int    i;    register struct vector *v;    for (i = 0; i < NVEC; i++) {	while (isspace (*bp))	    *bp++ = 0;	if (*bp == 0) {	    vec[i] = NULL;	    break;	}	if (*bp == '"') {	    for (vec[i] = ++bp; *bp != '\0' && *bp != '"'; bp++)		if (*bp == '\\') {		    switch (*++bp) {			case 'n':			    (void) strcpy (bp, bp + 1);			    *--bp = '\n';			    break;			case '\\':			case '"':			    (void) strcpy (bp - 1, bp);			    /* and fall... */			default:			    bp--;			    break;		    }		}	    if (*bp == '"')		*bp++ = '\0';	    continue;	}		vec[i] = bp;	while (!isspace (*bp))	    bp++;    }    i--;    vec[NVEC] = NULL;    if (*bp != 0) {	(void) respond (NOTOK, "too many arguments");	return NULL;    }    if (*vec[0] == 0) {	(void) respond (NOTOK, "null command");	return NULL;    }    make_lower (vec[0], vec[0]);    for (v = vectors; v -> v_cmd; v++)	if (strcmp (v -> v_cmd, vec[0]) == 0 && v -> v_valid == mystate) {	    if (i < v -> v_min || v -> v_max < i) {		(void) respond (NOTOK, "too %s arguments to \"%s\"",			i < v -> v_min ? "few" : "many", vec[0]);		return NULL;	    }	    else		return v;	}    (void) respond (NOTOK, "unknown command: \"%s\"", vec[0]);    return NULL;}/*  *//* VARARGS2 */static int  respond (code, fmt, a, b, c, d)char   *fmt,       *a,       *b,       *c,       *d;int     code;{    register char  *bp;    char    buffer[BUFSIZ];    bp = buffer;#ifndef	POP2    (void) sprintf (bp, "%s%s", code == OK ? "+OK" : "-ERR", fmt ? " " : "");

⌨️ 快捷键说明

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