static void do_list(const char *msgnum) { unsigned i; char buf[NUMBUFSIZE]; if (msgnum) { if ((i=getmsgnum(msgnum)) != 0) { printed(printf("+OK %u %s\r\n", i, libmail_str_off_t(msglist_a[i-1]->size, buf))); fflush(stdout); } return; } printed(printf("+OK POP3 clients that break here, they violate STD53.\r\n")); for (i=0; i<msglist_cnt; i++) { if (msglist_a[i]->isdeleted) continue; printed(printf("%u %s\r\n", i+1, libmail_str_off_t(msglist_a[i]->size, buf))); } printed(printf(".\r\n")); fflush(stdout); }
static void do_uidl(const char *msgnum) { unsigned i; if (msgnum) { if ((i=getmsgnum(msgnum)) != 0) { printed(printf("+OK %u ", i)); print_uidl(i-1); fflush(stdout); } return; } printed(printf("+OK\r\n")); for (i=0; i<msglist_cnt; i++) { if (msglist_a[i]->isdeleted) continue; printed(printf("%u ", i+1)); print_uidl(i); } printed(printf(".\r\n")); fflush(stdout); }
static void loop() { char buf[BUFSIZ]; char *p; int c; signal(SIGALRM, bye); while (alarm(300), fgets(buf, sizeof(buf), stdin)) { bytes_received_count += strlen(buf); alarm(0); if ((p=strchr(buf, '\n')) != 0) *p=0; else while ((c=getc(stdin)) >= 0 && c != '\n') ; p=strtok(buf, " \t\r"); if (!p) p=""; mkupper(p); if (strcmp(p, "QUIT") == 0) { printed(printf("+OK Bye-bye.\r\n")); fflush(stdout); cleanup(); acctout("INFO: LOGOUT"); return; } if (strcmp(p, "STAT") == 0) { do_stat(); continue; } if (strcmp(p, "LIST") == 0) { do_list(strtok(NULL, " \t\r")); continue; } if (strcmp(p, "RETR") == 0) { unsigned i; if ((i=getmsgnum(strtok(NULL, " \t\r"))) == 0) continue; do_retr(i-1, 0); continue; } if (strcmp(p, "CAPA") == 0) { pop3dcapa(); continue; } if (strcmp(p, "DELE") == 0) { unsigned i; if ((i=getmsgnum(strtok(NULL, " \t\r"))) == 0) continue; msglist_a[i-1]->isdeleted=1; printed(printf("+OK Deleted.\r\n")); fflush(stdout); continue; } if (strcmp(p, "NOOP") == 0) { printed(printf("+OK Yup.\r\n")); fflush(stdout); continue; } if (strcmp(p, "RSET") == 0) { unsigned i; for (i=0; i<msglist_cnt; i++) msglist_a[i]->isdeleted=0; printed(printf("+OK Resurrected.\r\n")); fflush(stdout); continue; } if (strcmp(p, "TOP") == 0) { unsigned i, j; const char *q; if ((i=getmsgnum(strtok(NULL, " \t\r"))) == 0) continue; q=strtok(NULL, " \t\r"); if (!q) goto error; j=atoi(q); do_retr(i-1, &j); continue; } if (strcmp(p, "UIDL") == 0) { do_uidl(strtok(NULL, " \t\r")); continue; } error: printed(printf("-ERR Invalid command.\r\n")); fflush(stdout); } acctout("INFO: DISCONNECTED"); }
void sbbs_t::new_scan_ptr_cfg() { uint i,j; long s; uint32_t l; time_t t; while(online) { bputs(text[CfgGrpLstHdr]); for(i=0;i<usrgrps && !msgabort();i++) { checkline(); if(i<9) outchar(' '); if(i<99) outchar(' '); bprintf(text[CfgGrpLstFmt],i+1,cfg.grp[usrgrp[i]]->lname); } SYNC; mnemonics(text[WhichOrAll]); s=getkeys("AQ",usrgrps); if(!s || s==-1 || s=='Q') break; if(s=='A') { mnemonics("\r\nEnter number of messages from end, ~Date, ~Quit, or" " [Last Message]: "); s=getkeys("DLQ",9999); if(s==-1 || s=='Q') continue; if(s=='D') { t=time(NULL); if(inputnstime(&t) && !(sys_status&SS_ABORT)) { bputs(text[LoadingMsgPtrs]); for(i=0;i<usrgrps && online;i++) for(j=0;j<usrsubs[i] && online;j++) { checkline(); subscan[usrsub[i][j]].ptr=getmsgnum(usrsub[i][j],t); } } continue; } if(s=='L') s=0; if(s) s&=~0x80000000L; bputs(text[LoadingMsgPtrs]); for(i=0;i<usrgrps;i++) for(j=0;j<usrsubs[i] && online;j++) { checkline(); getlastmsg(usrsub[i][j],&l,0); if(s>(long)l) subscan[usrsub[i][j]].ptr=0; else subscan[usrsub[i][j]].ptr=l-s; } continue; } i=(s&~0x80000000L)-1; while(online) { l=0; bprintf(text[CfgSubLstHdr],cfg.grp[usrgrp[i]]->lname); for(j=0;j<usrsubs[i] && !msgabort();j++) { checkline(); if(j<9) outchar(' '); if(j<99) outchar(' '); t=getmsgtime(usrsub[i][j],subscan[usrsub[i][j]].ptr); if(t>(long)l) l=(uint32_t)t; bprintf(text[SubPtrLstFmt],j+1,cfg.sub[usrsub[i][j]]->lname ,timestr(t),nulstr); } SYNC; mnemonics(text[WhichOrAll]); s=getkeys("AQ",usrsubs[i]); if(sys_status&SS_ABORT) { lncntr=0; return; } if(s==-1 || !s || s=='Q') break; if(s=='A') { /* The entire group */ mnemonics("\r\nEnter number of messages from end, ~Date, ~Quit, or" " [Last Message]: "); s=getkeys("DLQ",9999); if(s==-1 || s=='Q') continue; if(s=='D') { t=l; if(inputnstime(&t) && !(sys_status&SS_ABORT)) { bputs(text[LoadingMsgPtrs]); for(j=0;j<usrsubs[i] && online;j++) { checkline(); subscan[usrsub[i][j]].ptr=getmsgnum(usrsub[i][j],t); } } continue; } if(s=='L') s=0; if(s) s&=~0x80000000L; bputs(text[LoadingMsgPtrs]); for(j=0;j<usrsubs[i] && online;j++) { checkline(); getlastmsg(usrsub[i][j],&l,0); if(s>(long)l) subscan[usrsub[i][j]].ptr=0; else subscan[usrsub[i][j]].ptr=l-s; } continue; } else { j=(s&~0x80000000L)-1; mnemonics("\r\nEnter number of messages from end, ~Date, ~Quit, or" " [Last Message]: "); s=getkeys("DLQ",9999); if(s==-1 || s=='Q') continue; if(s=='D') { t=getmsgtime(usrsub[i][j],subscan[usrsub[i][j]].ptr); if(inputnstime(&t) && !(sys_status&SS_ABORT)) { bputs(text[LoadingMsgPtrs]); subscan[usrsub[i][j]].ptr=getmsgnum(usrsub[i][j],t); } continue; } if(s=='L') s=0; if(s) s&=~0x80000000L; getlastmsg(usrsub[i][j],&l,0); if(s>(long)l) subscan[usrsub[i][j]].ptr=0; else subscan[usrsub[i][j]].ptr=l-s; } } } }