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 + -
显示快捷键?