home *** CD-ROM | disk | FTP | other *** search
/ World of Ham Radio 1994 January / AMSOFT_1994.iso / packet / pbbs / cbbs / prog / mbcmd.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-12-31  |  8.2 KB  |  336 lines

  1.  
  2. /*
  3.  *  MBCMD.C - 7/10/88 - Command parser and dispatch.
  4.  */
  5.  
  6. #include "mb.h"
  7.  
  8. docmd()
  9. {
  10.   typedef struct
  11.   {
  12.     char  n1, n2;    /* The two command letters        */
  13.     byte  args;      /* Number of arguments required   */
  14.     word  mode;      /* Bitmask of allowed port modes  */
  15.     int   (*fp)();   /* Pointer to function return int */
  16.   } CMDDEF;
  17.  
  18.   register CMDDEF *cp;
  19.   register int status;
  20.  
  21. /*
  22.  *  The functions that do the commands.
  23.  */
  24.  
  25.   extern int w_lock();
  26.   extern int all_fwd();
  27.   extern int klmult();
  28.   extern int klmsg();
  29.   extern int lstmsg();
  30.   extern int rdmsg();
  31.   extern int sndmlt();
  32.   extern int sndmsg();
  33.   extern int fwdcmd();
  34.   extern int done();
  35.   extern int help();
  36.   extern int klmsgm();
  37.   extern int mkrem();
  38.   extern int mksys();
  39.   extern int makmlt();
  40.   extern int makmsg();
  41.   extern int dupmsg();
  42.   extern int filmsg();
  43.   extern int setunt();
  44.   extern int edmsg();
  45.   extern int edtfc();
  46.   extern int copfil();
  47.   extern int renfil();
  48.   extern int kilfil();
  49.   extern int uloadl();
  50.   extern int uloadr();
  51.   extern int dloads();
  52.   extern int dloadi();
  53.   extern int dloadl();
  54.   extern int dloadr();
  55.   extern int bye();
  56.   extern int lterm();
  57.   extern int setime();
  58.   extern int chguser();
  59.   extern int chgparam();
  60.   extern int utalk();
  61.   extern int rdmsgm();
  62.   extern int duser();
  63.   extern int dwuser();
  64.   extern int edport();
  65.   extern int eduser();
  66.   extern int edusera();
  67.   extern int puser();
  68.   extern int sfwd();
  69.   extern int newfwd();
  70.   extern int prthrd();
  71.   extern int connuser();
  72.   extern int ctncv();
  73.   extern int mtncv();
  74.   extern int utncv();
  75.   extern int prtdir();
  76.   extern int prtver();
  77. #if nncmd
  78.   extern int donet();
  79. #endif
  80.   extern int dosys();
  81.  
  82. /*
  83.  *  Command char 1, char 2, # args, modes allowed, function
  84.  */
  85.  
  86. static CMDDEF cmds[] =
  87. {
  88.  
  89.   '!', ' ', 2, local,          dosys,
  90.   '!', ' ', 3, local,          dosys,
  91.   '!', ' ', 4, local,          dosys,
  92.   '!', ' ', 5, local,          dosys,
  93.  
  94.   '@', ' ', 1, remote,         mksys,
  95.   '@', ' ', 1, sysop,          mkrem,
  96.  
  97.   '?', ' ', 1, all,            help,
  98.   '?', ' ', 2, all,            help,
  99.  
  100.   'A', ' ', 1, ops,            all_fwd,
  101.   'A', 'I', 1, ops,            all_fwd,
  102.   'A', 'H', 1, ops,            w_lock,
  103.   'B', ' ', 1, all,            bye,
  104.  
  105.   'C', ' ', 3, ops,            setime,
  106.   'C', ' ', 2, all,            connuser,
  107.   'C', 'M', 3, ops,            dupmsg,
  108.   'C', 'M', 5, ops,            dupmsg,
  109.   'C', 'M', 7, ops,            dupmsg,
  110.   'C', '*', 1, remote,         utncv,
  111.   'C', '*', 2, remote,         ctncv,
  112.   'C', '*', 4, remote,         ctncv,
  113.  
  114.   'D', 'L', 1, ops,            duser,
  115.   'D', 'L', 2, ops,            duser,
  116.   'D', 'M', 1, ops,            duser,
  117.   'D', 'M', 2, ops,            duser,
  118.   'D', 'S', 1, ops,            duser,
  119.   'D', 'S', 2, ops,            duser,
  120.   'D', 'U', 1, ops,            duser,
  121.   'D', 'U', 2, ops,            duser,
  122.   'D', 'W', 1, ops,            dwuser,
  123.   'D', 'W', 2, ops,            dwuser,
  124.   'D', 'X', 1, ops,            duser,
  125.   'D', 'X', 2, ops,            duser,
  126.   'D', '*', 2, local,          dloadl,
  127.   'D', '*', 2, remote,         dloadr,
  128.   'D', '*', 2, sysop,          dloads,
  129.  
  130.   'E', ' ', 2, ops,            edmsg,
  131.   'E', 'P', 2, ops,            edport,
  132.   'E', 'S', 1, ops,            chgparam,
  133.   'E', 'T', 2, all,            edtfc,
  134.   'E', 'U', 1, ops,            edusera,
  135.   'E', 'U', 2, ops,            eduser,
  136.  
  137.   'F', '>', 1, remote,         fwdcmd,
  138.   'F', '*', 3, ops,            filmsg,
  139.   'F', '*', 4, ops,            filmsg,
  140.  
  141.   'G', 'M', 1, ops,            setunt,
  142.   'G', 'R', 1, ops,            setunt,
  143.   'G', 'R', 2, ops,            setunt,
  144.   'G', 'U', 1, ops,            setunt,
  145.  
  146.   'H', ' ', 1, all,            help,
  147.   'H', ' ', 2, all,            help,
  148.  
  149.   'I', ' ', 1, all,            dloadi,
  150.  
  151.   'J', '*', 1, all,            prthrd,
  152.  
  153.   'K', ' ', 2, all,            klmsg,
  154.   'K', ' ', 3, ops,            klmult,
  155.   'K', ' ', 4, ops,            klmult,
  156.   'K', ' ', 5, ops,            klmult,
  157.   'K', 'A', 2, ops,            klmsg,
  158.   'K', 'F', 1, ops,            klmsgm,
  159.   'K', 'F', 2, ops,            klmsgm,
  160.   'K', 'M', 1, all,            klmsgm,
  161.   'K', 'O', 1, ops,            klmsgm,
  162.   'K', 'O', 2, ops,            klmsgm,
  163.   'K', 'T', 2, all,            klmsg,
  164.   'K', 'Y', 1, ops,            klmsgm,
  165.   'K', 'Y', 2, ops,            klmsgm,
  166.  
  167.   'L', '*', 1, all,            lstmsg,
  168.   'L', '*', 2, all,            lstmsg,
  169.   'L', '*', 3, all,            lstmsg,
  170.  
  171.   'M', 'M', 3, ops,            makmlt,
  172.   'M', 'M', 4, ops,            makmlt,
  173.   'M', '*', 3, ops,            makmsg,
  174.   'M', '*', 4, ops,            makmsg,
  175.   'M', '*', 5, ops,            makmsg,
  176.   'M', '*', 6, ops,            makmsg,
  177.   'M', '*', 7, ops,            makmsg,
  178.   'M', '*', 8, ops,            makmsg,
  179.   'M', '*', 1, remote,         mtncv,
  180.  
  181.   'N', ' ', 2, all,            chguser,
  182.   'N', ' ', 3, ops,            renfil,
  183.   'N', 'E', 1, all,            chguser,
  184.   'N', 'H', 2, all,            chguser,
  185. #if nncmd
  186.   'N', 'N', 5, ops,            donet,
  187. #endif
  188.   'N', 'Z', 2, all,            chguser,
  189.  
  190.   'P', ' ', 2, all,            puser,
  191.  
  192.   'Q', ' ', 1, local,          done,
  193.  
  194.   'R', ' ', 2, all,            rdmsg,
  195.   'R', 'H', 2, all,            rdmsg,
  196.   'R', 'M', 1, all,            rdmsgm,
  197.  
  198.   'S', 'M', 2, ops,            sndmlt,
  199.   'S', 'M', 3, ops,            sndmlt,
  200.   'S', '*', 2, all,            sndmsg,
  201.   'S', '*', 3, all,            sndmsg,
  202.   'S', '*', 4, all,            sndmsg,
  203.   'S', '*', 5, all,            sndmsg,
  204.   'S', '*', 6, all,            sndmsg,
  205.   'S', '*', 7, all,            sndmsg,
  206.  
  207.   'T', ' ', 1, remote,         utalk,
  208.   'T', '*', 1, local,          lterm,
  209.   'T', '*', 2, local,          lterm,
  210.  
  211.   'U', '*', 2, ops,            uloadl,
  212.   'U', '*', 2, remote,         uloadr,
  213.  
  214.   'V', ' ', 1, all,            prtver,
  215.   'V', ' ', 3, ops,            copfil,
  216.  
  217.   'W', '*', 1, all,            prtdir,
  218.   'W', '*', 2, all,            prtdir,
  219.  
  220.   'X', ' ', 1, ops,            sfwd,
  221.   'X', ' ', 2, ops,            sfwd,
  222.   'X', 'I', 1, ops,            sfwd,
  223.   'X', 'I', 2, ops,            sfwd,
  224.  
  225.   'Y', 'F', 1, ops,            newfwd,
  226.   'Y', 'F', 2, ops,            newfwd,
  227.  
  228.   'Z', '*', 2, ops,            kilfil,
  229.  
  230.   '\0', ' ', 0, 0, 0, 0
  231. };
  232.  
  233.   port->cmdcnt++;
  234.   pgst(NULL);
  235.  
  236.   if (strlen(port->fld[0]) < 3)
  237.     for (cp = cmds; cp->n1; cp++)
  238.     if (port->mode & cp->mode)
  239.     if (port->opt1 is cp->n1)
  240.     if ((port->opt2 is cp->n2) or (cp->n2 is '*'))
  241.     if (port->flds is cp->args) { status = (*cp->fp)(); return; }
  242.  
  243.   if ((port->opt1 is '[') and (port->cmdcnt is 1)) { isbid(); return;}
  244.  
  245.   port->msg = mwhat;
  246.   port->errors++;
  247. }
  248.  
  249. /*
  250.  *  User wants to log out.
  251.  *  Set the flag so they will be logged out.
  252.  */
  253.  
  254. bye()
  255. {
  256.   pt_flag = 0;
  257.   port->mode = logout;
  258. }
  259.  
  260. /*
  261.  *  User done being remote sysop.
  262.  *  Make them normal user again.
  263.  */
  264.  
  265. mkrem()
  266. {
  267.   port->flags clrbit p_clrsys;
  268.   port->mode = remote;
  269.   if (!port->tmode)
  270.   {
  271.      cmdtnc();
  272.      onetnc("cr on\n");
  273.      onetnc("cp of\n");
  274.      onetnc("se $0d\n");
  275.      convtnc();
  276.   }
  277. }
  278.  
  279. /*
  280.  *  User wants to be remote sysop.
  281.  *  Let them, if they are allowed to.
  282.  */
  283.  
  284. mksys()
  285. {
  286.   if (!(port->priv & p_sysop) or !(port->user->options & u_sysop)or!(pass()))
  287.     { port->msg = mwhat; return; }
  288.  
  289.   port->flags setbit p_clrsys;
  290.   port->mode = sysop;
  291.   if (!port->tmode)
  292.   {
  293.      cmdtnc();
  294.      onetnc("cr of\n");
  295.      onetnc("cp on\n");
  296.      onetnc("se $7f\n");
  297.      convtnc();
  298.   }
  299. }
  300.  
  301. pass()
  302. {
  303.   int count,psn,lpsn;
  304.   char temp[4], pword[5];
  305.   for (count = 0, lpsn = 0; count < 4; count++)
  306.     {
  307.       while ((psn=(rand()/512))== lpsn);
  308.       sprintf (temp, "%3u", psn+1);
  309.       outstr(temp);
  310.       pword[count] = *(keylst+psn);
  311.       lpsn = psn;
  312.     }
  313.     outstr("\n");
  314.     getdat();
  315.     if (matchn(port->line, pword, 4)) return true;
  316.     return false;
  317.  }
  318.  
  319. /*
  320.  *  Lock up the current window for no more than 180 seconds.
  321.  */
  322.  
  323. w_lock()
  324. {
  325.   long l;
  326.   if (!(s_flag & s_dv)) return;
  327.   outstr("\nWindow locked");
  328.   while (true)
  329.   {
  330.     getcomd(); if (port->opt2 isnt 'H') break;
  331.     switchw();
  332.   }
  333.   outstr("-unLOCKED\n");
  334.   return;
  335. }
  336.