📄 popser.c
字号:
(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 + -