popser.c

来自「<B>Digital的Unix操作系统VAX 4.2源码</B>」· C语言 代码 · 共 2,045 行 · 第 1/3 页

C
2,045
字号
char   *file;long	pos;{    register int    i,                    msgp;    register struct drop   *pp,                           *mp;    struct drop *rp;    if (debug)	padvise (NULLCP, LOG_DEBUG, "read_map (%s, %ld)", file, pos);    if ((i = map_read (file, pos, &rp, debug)) == 0)	return 0;    m_gMsgs (i);    Msgs[0].m_last = rp -> d_start;    msgp = 1;    for (pp = rp + 1; i-- > 0; msgp++, pp++) {	mp = &Msgs[msgp].m_drop;	mp -> d_id = pp -> d_id;	mp -> d_size = pp -> d_size;	mp -> d_start = pp -> d_start;	mp -> d_stop = pp -> d_stop;    }    free ((char *) rp);    if (Msgs[0].m_last > msgp) {	if (debug)	    padvise (NULLCP, LOG_DEBUG, "lastseen adjusted from %d to %d",		Msgs[0].m_last, msgp);	Msgs[0].m_last = msgp;    }    return (msgp - 1);}/*  */static int  read_file (pos, msgp)register long	pos;register int	msgp;{    register int    i;    register struct drop   *pp,                           *mp;    struct drop *rp;    if (debug)	padvise (NULLCP, LOG_DEBUG, "read_file (%ld, %d)",		pos, msgp);    if ((i = MBX_READ (dp, pos, &rp, debug)) <= 0)	return (msgp - 1);    m_gMsgs ((msgp - 1) + i);    for (pp = rp; i-- > 0; msgp++, pp++) {	mp = &Msgs[msgp].m_drop;	mp -> d_id = 0;	mp -> d_size = pp -> d_size;	mp -> d_start = pp -> d_start;	mp -> d_stop = pp -> d_stop;    }    free ((char *) rp);    return (msgp - 1);}/*  */static m_gMsgs (n)int	n;{    if (debug)	padvise (NULLCP, LOG_DEBUG, "m_gMsgs (%d) 0x%x %d",		n, Msgs, nMsgs);    if (Msgs == NULL) {	nMsgs = n + MAXFOLDER / 2;	Msgs = (struct Msg *) calloc ((unsigned) (nMsgs + 2), sizeof *Msgs);	if (Msgs == NULL)	    padios (NULLCP, "unable to allocate Msgs structure");	return;    }    if (nMsgs >= n)	return;    nMsgs = n + MAXFOLDER / 2;    Msgs = (struct Msg *) realloc ((char *) Msgs,				(unsigned) (nMsgs + 2) * sizeof *Msgs);    if (Msgs == NULL)	padios (NULLCP, "unable to reallocate Msgs structure");}/*  */static int  pmbx_size (m)register int     m;{    register int    i;    register long   pos;    (void) fseek (dp, Msgs[m].m_start, 0);    for (i = 0, pos = Msgs[m].m_stop - Msgs[m].m_start; pos > 0; i++, pos--)	if (fgetc (dp) == '\n')	    i++;    return i;}/*  *//* ARGSUSED */static int  status (vec)char  **vec;{    return respond (OK, "%d %d", nmsgs - dmsgs, Msgs[0].m_size);}#ifdef	POP2static int  rdp2 (vec)		/* always returns OK */char  **vec;{    if (vec[1]) {	if ((pop2 = atoi (vec[1])) <= 0)	    pop2 = 0;    }    else if (pop2 == 0)	return NOTOK;		/* close 'em down */    if (pop2 <= 0 || pop2 > nmsgs) {	pop2 = 0;	return respond ('=', "0 no message");     }    if (Msgs[pop2].m_flags & MDELE) {	pop2 = 0;	return respond ('=', "0 message %d is deleted", pop2);    }    return respond ('=', "%d (message %d)", Msgs[pop2].m_size, pop2);}static int  ack2 (vec)char   **vec;{    if (strcmp (vec[0], "ackd") == 0) {	Msgs[pop2].m_flags |= MDELE;	/* ignored later if MREAD */	Msgs[0].m_size -= Msgs[pop2].m_size;	dmsgs++;    }    if (pop2) {		/* a current msg */	rmsgs++;			/* mark this one as read */	if (++pop2 > nmsgs)	    pop2 = -1;			/* let rdp2 reset */	else if (Msgs[pop2].m_flags & MDELE)	    pop2 = -1;			/* let rdp2 reset */	if (pop2 > Msgs[0].m_last)	    Msgs[0].m_last = pop2;    }    return rdp2 (vec);		/* vec = { "acks", 0 } */}static int  fold (vec)register char  **vec;{    pop2 = 0;#ifdef	notdef		/* This might work, or it might be a huge security hole.  For my purpose, * it doesn't need to work, so I'm not going to make sure it's OK. * 16Nov90/JLR */       if (quitaux (NULLVP) == NOTOK)	return respond ('#', "0 unable to close folder");        (void) sprintf (maildrop, vec[1]);    if (setupaux (access (maildrop, 2) ? 1 : 0) == NOTOK)	return respond ('#', "0 unable to read %s", maildrop);    pop2 = nmsgs > 0 ? 1 : 0;    return respond ('#', "%d message%s in %s (%d octets)",	    nmsgs, nmsgs != 1 ? "s" : "", maildrop, Msgs[0].m_size);    #endif    respond ('#', "0 unable to change folders");    return NOTOK;}#endif	POP2static int  list (vec)register char  **vec;{    register int    i;    if (vec[1]) {	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);#ifndef	BPOP	return respond (OK, "%d %d", i, Msgs[i].m_size);#else	BPOP	return respond (OK, xtnded ? "%d %d %d" : "%d %d",		i, Msgs[i].m_size, Msgs[i].m_id);#endif	BPOP    }    (void) respond (OK, "%d message%s (%d octets)",	    nmsgs - dmsgs, nmsgs - dmsgs != 1 ? "s" : "",	    Msgs[0].m_size);    for (i = 1; i <= nmsgs; i++)	if (!(Msgs[i].m_flags & MDELE))#ifndef BPOP	    multiline ("%d %d", i, Msgs[i].m_size);#else	BPOP	    multiline (xtnded ? "%d %d %d" : "%d %d",		    i, Msgs[i].m_size, Msgs[i].m_id);#endif	BPOP    multiend ();    return OK;}/*  */static int  retrieve (vec)register char  **vec;{    register int    i;    register long   pos;    register char  *cp;    char    buffer[BUFSIZ];#ifdef	POP2  if (pop2 == 0)    return NOTOK;  else if (pop2 == NOTOK) {#endif    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);    (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 = NULL;	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;    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 = NULL;	if (body) {	    if (lines++ >= j)		break;	}	else	    if (*buffer == NULL)		body++;	multiline ("%s", buffer);    }    multiend ();    return OK;}/*  */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);    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);}#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 ((dmsgs == 0 && rmsgs == 0) || (Msgs[0].m_flags & MREAD))	return OK;if(debug)padvise(NULLCP,LOG_DEBUG,"XXX: rmsgs=%d",rmsgs);    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)

⌨️ 快捷键说明

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