📄 parser.c++
字号:
tm.tm_min = twodigits(cp+10, 60); tm.tm_hour = twodigits(cp+8, 24); tm.tm_mday = twodigits(cp+6, 31); tm.tm_mon = twodigits(cp+4, 12) -1; tm.tm_year = fourdigits(cp+0) - 1900; shutCmd(tm, reason); return (true); } else syntaxError("bad time specification"); } break; case T_VRFY: // verify server to use for destination if (string_param(s, "dialstring")) { // XXX at least support a static file... reply(200, "%s (%s)" , (const char*) hostname , (const char*) hostaddr ); return (true); } break; } return (false);}/* * Site-specific protocol commands (one line). */boolHylaFAXServer::site_cmd(Token t){ fxStr s; switch (t) { case T_ADDUSER: if (checkadmin(T_ADDUSER) && SPACE() && STRING(s, "user-spec")) { fxStr pass; if (opt_CRLF()) { addUserCmd(s, "", ""); return (true); } else if (SPACE() && STRING(pass, "password")) { fxStr apass; if (opt_CRLF()) { addUserCmd(s, pass, ""); return (true); } else if (string_param(apass, "admin-password")) { addUserCmd(s, pass, apass); return (true); } } } break; case T_DELUSER: if (checkadmin(T_DELUSER) && string_param(s, "user-spec")) { delUserCmd(s); return (true); } break; case T_DELMODEM: if (checkadmin(T_DELMODEM) && string_param(s, "modem")) { delModemCmd(s); return (true); } break; case T_ADDMODEM: if (checkadmin(T_ADDMODEM) && string_param(s, "modem")) { addModemCmd(s); return (true); } break; case T_CONFIG: if (checkadmin(T_CONFIG) && SPACE() && STRING(s, "modem")) { fxStr config; if (opt_CRLF()) { configQueryCmd(s); return (true); } else if (SPACE() && multi_STRING(config)) { configCmd(s, config); return (true); } } break; case T_TRIGGER: if (string_param(s, "trigger-spec")) { logcmd(t, "%s", (const char*)s); triggerCmd("%s", (const char*) s); return (true); } break; case T_HELP: // return help if (opt_CRLF()) { helpCmd(sitetab, (char*) NULL); return (true); } else if (string_param(s, "command name")) { logcmd(T_SITE, "HELP %s", (const char*) s); s.raisecase(); helpCmd(sitetab, s); return (true); } break; } return (false);}boolHylaFAXServer::param_cmd(Token t){ fxStr s; long n; time_t ticks; bool b; switch (t) { case T_SENDTIME: // time to send job if (opt_CRLF()) { replyJobParamValue(*curJob, 213, t); return (true); } else if (SPACE() && getToken(T_STRING, "time specification")) { tokenBody.raisecase(); if (tokenBody == "NOW") { if (CRLF() && setJobParameter(*curJob, t, (time_t) 0)) { reply(213, "%s set to NOW.", parmToken(t)); return (true); } } else { pushToken(T_STRING); // XXX if (TIMESPEC(12, ticks) && CRLF() && setJobParameter(*curJob, t, ticks)) { if (ticks != 0) { const struct tm* tm = cvtTime(ticks); // XXX should response include seconds? reply(213, "%s set to %4d%02d%02d%02d%02d%02d." , parmToken(t) , tm->tm_year+1900 , tm->tm_mon+1 , tm->tm_mday , tm->tm_hour , tm->tm_min , tm->tm_sec ); } else reply(213, "%s set to NOW.", parmToken(t)); return (true); } } } break; case T_LASTTIME: // time to kill job if (opt_CRLF()) { replyJobParamValue(*curJob, 213, t); return (true); } else if (timespec_param(6, ticks) && setJobParameter(*curJob, t, ticks)) { reply(213, "%s set to %02d%02d%02d." , parmToken(t) , ticks/(24*60*60) , (ticks/(60*60))%24 , (ticks/60)%60 ); return (true); } break; case T_RETRYTIME: // retry interval for job if (opt_CRLF()) { replyJobParamValue(*curJob, 213, t); return (true); } else if (timespec_param(4, ticks) && setJobParameter(*curJob, t, ticks)) { reply(213, "%s set to %02d%02d." , parmToken(t) , ticks/60 , ticks%60 ); return (true); } break; case T_MAXDIALS: case T_MAXTRIES: case T_VRES: case T_PAGEWIDTH: case T_PAGELENGTH: case T_MINBR: case T_BEGBR: case T_BEGST: case T_MAXPAGES: case T_SCHEDPRI: case T_NPAGES: case T_TOTPAGES: case T_NTRIES: case T_TOTTRIES: case T_NDIALS: case T_TOTDIALS: if (opt_CRLF()) { replyJobParamValue(*curJob, 213, t); return (true); } else if (number_param(n) && setJobParameter(*curJob, t, (u_short) n)) { reply(213, "%s set to %u.", parmToken(t), n); return (true); } break; case T_NOTIFYADDR: case T_NOTIFY: case T_MODEM: case T_DIALSTRING: case T_EXTERNAL: case T_SUBADDR: case T_DATAFORMAT: case T_TO_USER: case T_TO_LOCATION: case T_TO_COMPANY: case T_TO_VOICE: case T_FROM_USER: case T_FROM_LOCATION: case T_FROM_COMPANY: case T_FROM_VOICE: case T_USRKEY: case T_PASSWD: case T_CLIENT: case T_PAGECHOP: case T_TAGLINE: case T_GROUPID: case T_JOBID: case T_JOBINFO: case T_OWNER: case T_STATE: case T_STATUS: case T_DONEOP: case T_COMMID: case T_REGARDING: case T_COMMENTS: case T_FAXNUMBER: case T_TSI: if (opt_CRLF()) { replyJobParamValue(*curJob, 213, t); return (true); } else if (SPACE() && multi_STRING(s) && CRLF() && setJobParameter(*curJob, t, s)) { reply(213, "%s set to \"%s\".", parmToken(t), (const char*) s); return (true); } break; case T_USE_ECM: case T_USE_TAGLINE: case T_USE_CONTCOVER: if (opt_CRLF()) { replyJobParamValue(*curJob, 213, t); return (true); } else if (boolean_param(b) && setJobParameter(*curJob, t, b)) { reply(213, "%s set to %s.", parmToken(t), b ? "YES" : "NO"); return (true); } break; case T_USE_XVRES: if (opt_CRLF()) { replyJobParamValue(*curJob, 213, t); return (true); } else if (boolean_param(b) && setJobParameter(*curJob, t, b)) { reply(213, "%s set to %s.", parmToken(t), b ? "YES" : "NO"); return (true); } break; case T_CHOPTHRESH: if (opt_CRLF()) { replyJobParamValue(*curJob, 213, t); return (true); } else if (string_param(s, "floating point number") && setJobParameter(*curJob, t, (float) atof(s))) { reply(213, "%s set to %g.", parmToken(t), (float) atof(s)); return (true); } break; case T_COVER: // specify/query cover page document if (opt_CRLF()) { replyJobParamValue(*curJob, 213, t); return (true); } else if (pathname_param(s)) { addCoverDocument(*curJob, s); return (true); } break; case T_DOCUMENT: // specify/query normal document if (opt_CRLF()) { replyJobParamValue(*curJob, 213, t); return (true); } else if (pathname_param(s)) { addDocument(*curJob, s); return (true); } break; case T_POLL: // specify/query poll operation if (opt_CRLF()) { replyJobParamValue(*curJob, 213, t); return (true); } else if (SPACE() && STRING(s, "polling selector")) { fxStr pwd; if (opt_CRLF()) { addPollOp(*curJob, s, ""); // sep but no pwd return (true); } else if (SPACE() && pwd_param(pwd) && CRLF()) { addPollOp(*curJob, s, pwd); // sep & pwd return (true); } } break; case T_HELP: // return help if (opt_CRLF()) { helpCmd(parmtab, (char*) NULL); return (true); } else if (string_param(s, "parameter name")) { s.raisecase(); logcmd(T_JPARM, "HELP %s", (const char*) s); helpCmd(parmtab, s); return (true); } break; } return (false);}/* * Collect a single string parameter. */boolHylaFAXServer::string_param(fxStr& s, const char* what){ return SPACE() && STRING(s, what) && CRLF();}/* * Collect a single number parameter. */boolHylaFAXServer::number_param(long& n){ return SPACE() && NUMBER(n) && CRLF();}/* * Collect a single boolean parameter. */boolHylaFAXServer::boolean_param(bool& b){ return SPACE() && BOOLEAN(b) && CRLF();}/* * Collect a single time parameter. */boolHylaFAXServer::timespec_param(int ndigits, time_t& t){ return SPACE() && TIMESPEC(ndigits, t) && CRLF();}/* * File manipulation command. */boolHylaFAXServer::pathname_param(fxStr& s){ return SPACE() && pathname(s) && CRLF();}/* * Job control commands. */boolHylaFAXServer::job_param(fxStr& jid){ if (opt_CRLF()) { jid = curJob->jobid; return (true); } else if (SPACE() && STRING(jid, "job identifer") && CRLF()) { jid.lowercase(); return (true); } return (false);}/* * Job group control commands. */boolHylaFAXServer::jgrp_param(fxStr& jgid){ if (opt_CRLF()) { jgid = curJob->groupid; return (true); } else if (SPACE() && STRING(jgid, "job group identifier") && CRLF()) { jgid.lowercase(); return (true); } return (false);}boolHylaFAXServer::pwd_param(fxStr& s){ return STRING(s, "polling password");}boolHylaFAXServer::pathname(fxStr& s){ return STRING(s, "pathname");}boolHylaFAXServer::TIMESPEC(u_int len, time_t& result){ if (getToken(T_STRING, "time specification")) { if (tokenBody.length() == len) { if (checkNUMBER(tokenBody)) { const char* cp = tokenBody; if (len == 12) { // YYYYMMDDHHMM struct tm tm; tm.tm_sec = 0; tm.tm_min = twodigits(cp+10, 60); tm.tm_hour = twodigits(cp+8, 24); tm.tm_mday = twodigits(cp+6, 32); tm.tm_mon = twodigits(cp+4, 13) - 1; tm.tm_year = fourdigits(cp+0) - 1900; tm.tm_isdst= -1; // XXX not sure about this??? /* * Client specifies time relative to GMT * and mktime returns locally adjusted * time so we need to adjust the result * here to get things in the right timezone. */ result = mktime(&tm) - gmtoff; } else if (len == 6) { // DDHHMM result = 24*60*60*twodigits(cp, 100) + 60*60*twodigits(cp+2, 24) + 60*twodigits(cp+4, 60); } else { // MMSS result = 60*twodigits(cp, 60) + twodigits(cp+2, 60); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -