📄 parser.c++
字号:
case T_TYPE: // data transfer type if (string_param(s, "transfer type")) { logcmd(t, "%s", (const char*) s); typeCmd(s); return (true); } break; case T_RETP: // retrieve next page of document/file if (pathname_param(s)) { logcmd(t, "%s", (const char*) s); retrievePageCmd(s); return (true); } break; case T_RETR: // retrieve document/file if (pathname_param(s)) { logcmd(t, "%s", (const char*) s); retrieveCmd(s); return (true); } break; case T_STOR: // store document/file if (pathname_param(s)) { logcmd(t, "%s", (const char*) s); // XXX file must exist if not admin, check for bad chars in pathname storeCmd(s, "w"); return (true); } break; case T_APPE: // append to document/file if (pathname_param(s)) { logcmd(t, "%s", (const char*) s); storeCmd(s, "a"); return (true); } break; case T_STOT: // store uniquely named document/file if (CRLF()) { logcmd(t); storeUniqueCmd(true); return (true); } break; case T_STOU: // store uniquely named document/file if (CRLF()) { logcmd(t); storeUniqueCmd(false); return (true); } break; case T_LIST: // list directory/file case T_NLST: // list directory/file names if (opt_CRLF()) { logcmd(t); if (t == T_LIST) listCmd("."); else nlstCmd("."); return (true); } else if (pathname_param(s)) { logcmd(t, "%s", (const char*) s); if (t == T_LIST) listCmd(s); else nlstCmd(s); return (true); } break; case T_CWD: // change working directory if (opt_CRLF()) { logcmd(t); cwdCmd("/"); return (true); } else if (pathname_param(s)) { logcmd(t, "%s", (const char*) s); cwdCmd(s); return (true); } break; case T_CDUP: // CWD .. logcmd(t); cwdCmd(".."); return (true); case T_PWD: // print working directory if (CRLF()) { logcmd(t); pwdCmd(); return (true); } break; case T_STAT: // stat file/server status if (opt_CRLF()) { logcmd(t); statusCmd(); return (true); } else if (checklogin(T_STAT) && pathname_param(s)) { logcmd(t, "%s", (const char*) s); statFileCmd(s); return (true); } break; case T_SIZE: // return file size if (pathname_param(s)) { logcmd(t, "%s", (const char*) s); struct stat sb; if (Sys::stat(s, sb) < 0 || (sb.st_mode&S_IFMT) != S_IFREG) reply(550, "%s: not a plain file.", (const char*) s); else reply(213, "%lu", (u_long) sb.st_size); return (true); } break; case T_CHMOD: // set file protection if (SPACE() && STRING(s, "filename") && SPACE() && NUMBER(n)) { chmodCmd(s, (u_int) n); return (true); } break; case T_MDTM: // return file last modification time if (pathname_param(s)) { logcmd(t, "%s", (const char*) s); mdtmCmd(s); return (true); } break; case T_DELE: // delete file/document if (pathname_param(s)) { logcmd(t, "%s", (const char*) s); deleCmd(s); return (true); } break; case T_ABOR: // abort active command/incoming call if (opt_CRLF()) { logcmd(t); ack(225, cmdToken(t)); return (true); } else if (checkadmin(T_ABOR) && string_param(s, "modem")) { abortCallCmd(s); return (true); } break; case T_HELP: // return help if (opt_CRLF()) { logcmd(t); helpCmd(cmdtab, (char*) NULL); return (true); } else if (string_param(s, "command name")) { logcmd(t, "%s", (const char*) s); s.raisecase(); if (s == "SITE") helpCmd(sitetab, NULL); else if (s == "JPARM" || s == "JGPARM") helpCmd(parmtab, NULL); else helpCmd(cmdtab, s); return (true); } break; case T_JNEW: // create new job if (CRLF()) { newJobCmd(); return (true); } break; case T_JOB: // select current job if (job_param(s)) { setCurrentJob(s); return (true); } break; case T_JREST: // reset job state if (job_param(s)) { resetJob(s); return (true); } break; case T_JDELE: // delete job if (job_param(s)) { deleteJob(s); return (true); } break; case T_JINTR: // interrupt job if (job_param(s)) { interruptJob(s); return (true); } break; case T_JKILL: // kill job if (job_param(s)) { killJob(s); return (true); } break; case T_JSUSP: // suspend job if (job_param(s)) { suspendJob(s); return (true); } break; case T_JSUB: // submit job if (job_param(s)) { submitJob(s); return (true); } break; case T_JWAIT: // wait for job if (job_param(s)) { waitForJob(s); return (true); } break; case T_JGNEW: // create job group if (CRLF()) { curJob->groupid = curJob->jobid; ack(200, cmdToken(t)); return (true); } break; case T_JGREST: // reset current job group state if (CRLF()) { return (true); } break; case T_JGRP: // select current job group if (jgrp_param(s)) { return (true); } break; case T_JGDELE: // delete job group if (jgrp_param(s)) { return (true); } break; case T_JGINTR: // interrupt job group if (jgrp_param(s)) { return (true); } break; case T_JGKILL: // kill job group if (jgrp_param(s)) { return (true); } break; case T_JGSUSP: // suspend job group if (jgrp_param(s)) { return (true); } break; case T_JGSUB: // submit job group if (jgrp_param(s)) { return (true); } break; case T_JGWAIT: // wait for job group if (jgrp_param(s)) { return (true); } break; case T_NOOP: // no-op if (CRLF()) { logcmd(t); ack(200, cmdToken(t)); return (true); } break; case T_IDLE: // set/query idle timeout if (opt_CRLF()) { logcmd(t); reply(213, "%u seconds.", idleTimeout); return (true); } else if (number_param(n)) { logcmd(t, "%lu", n); if ((unsigned)n > maxIdleTimeout && !IS(PRIVILEGED)) { idleTimeout = maxIdleTimeout; reply(213, "%lu: Idle timeout too large, set to %u.", n, maxIdleTimeout); } else { idleTimeout = (int) n; reply(213, "Idle timeout set to %u.", idleTimeout); } return (true); } break; case T_QUIT: // terminate session if (CRLF()) { logcmd(t); reply(221, "Goodbye."); dologout(0); return (true); } break; case T_TZONE: // set/query timezone usage if (opt_CRLF()) { reply(200, "Time values are handled in %s.", IS(USEGMT) ? "GMT" : tzname[0]); return (true); } else if (string_param(s, "timezone specification")) { logcmd(t, "%s", (const char*) s); s.raisecase(); if (s == "GMT") { state |= S_USEGMT; reply(200, "Using time values in GMT."); } else if (s == "LOCAL") { state &= ~S_USEGMT; reply(200, "Using time values in %s.", tzname[0]); } else { reply(503, "Unknown timezone specification %s.", (const char*) s); } return (true); } break; case T_JOBFMT: // query/specify job format string case T_RCVFMT: // query/specify recvq format string case T_MODEMFMT: // query/specify modem format string case T_FILEFMT: // query/specify file format string if (opt_CRLF()) { reply(200, "%s", t == T_JOBFMT ? (const char*) jobFormat : t == T_RCVFMT ? (const char*) recvFormat: t == T_MODEMFMT ? (const char*) modemFormat : (const char*) fileFormat ); return (true); } else if (string_param(s, "format-string")) { if (t == T_JOBFMT) jobFormat = s; else if (t == T_RCVFMT) recvFormat = s; else if (t == T_MODEMFMT) modemFormat = s; else if (t == T_FILEFMT) fileFormat = s; ack(200, cmdToken(t)); return (true); } break; case T_JPARM: // set/query job parameter if (opt_CRLF()) { logcmd(T_JPARM); if (checkJobState(curJob)) jstatCmd(*curJob); return (true); } else if (SPACE() && getToken(T_STRING, "parameter name")) { tokenBody.raisecase(); const tab* p = lookup(parmtab, N(parmtab), tokenBody); if (p == NULL) { reply(500, "JPARM %s: Parameter not recognized.", (const char*) tokenBody); } else if (!p->implemented) reply(502, "JPARM %s: Parameter not implemented.", p->name); else return (param_cmd(p->token)); } break; case T_JGPARM: // set/query job group parameter if (SPACE() && getToken(T_STRING, "parameter name")) { tokenBody.raisecase(); const tab* p = lookup(parmtab, N(parmtab), tokenBody); if (p == NULL) { reply(500, "JPARM %s: Parameter not recognized.", (const char*) tokenBody); } else if (!p->implemented) reply(502, "JPARM %s: Parameter not implemented.", p->name); else return (param_cmd(p->token)); } break; case T_SITE: // site-specific command if (SPACE() && getToken(T_STRING, "site command")) { tokenBody.raisecase(); const tab* p = lookup(sitetab, N(sitetab), tokenBody); if (p == NULL) { reply(500, "SITE %s: Command not recognized.", (const char*) tokenBody); } else if (!p->implemented) reply(502, "SITE %s: Command not implemented.", p->name); else return (site_cmd(p->token)); } break; case T_ANSWER: // answer phone on specific line if (checkadmin(T_ANSWER) && SPACE() && STRING(s, "modem")) { fxStr how; if (opt_CRLF()) how = "any"; else if (!string_param(how, "answer-how")) break; answerCallCmd(s, how); return (true); } break; case T_CHOWN: // assign file ownership if (checkadmin(T_CHOWN) && SPACE() && STRING(s, "filename")) { fxStr who; if (string_param(who, "user")) { chownCmd(s, who); return (true); } } break; case T_DISABLE: // disable outbound-usage of modem if (checkadmin(T_DISABLE) && SPACE() && STRING(s, "modem")) { fxStr reason; if (opt_CRLF()) reason = "<unspecified reason>"; else if (!SPACE() || !multi_STRING(reason)) break; disableModemCmd(s, reason); return (true); } break; case T_ENABLE: // enable outbound-usage of modem if (checkadmin(T_ENABLE) && string_param(s, "modem")) { enableModemCmd(s); return (true); } break; case T_SHUT: // shutdown server if (checkadmin(T_SHUT) && SPACE() && STRING(s, "shutdown-time")) { fxStr reason; if (opt_CRLF()) reason = "<unspecified reason>"; else if (!SPACE() || !multi_STRING(reason)) break; const char* cp = s; if (s.length() == 3 && strcasecmp(cp, "NOW") == 0) { time_t t = Sys::now(); shutCmd(*localtime(&t), reason); return (true); } else if (s.length() == 4 && checkNUMBER(cp)) { time_t t = Sys::now(); struct tm tm = *localtime(&t); tm.tm_hour = 60*60*twodigits(cp, 60); tm.tm_min = 60*twodigits(cp+2, 60); shutCmd(tm, reason); return (true); } else if (s.length() == 12 && checkNUMBER(cp)) { struct tm tm; tm.tm_sec = 0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -