home *** CD-ROM | disk | FTP | other *** search
/ The CDPD Public Domain Collection for CDTV 4 / CDPD_IV.bin / networking / uucp / amigauucpsrc / bms / main.c < prev    next >
C/C++ Source or Header  |  1994-06-29  |  12KB  |  511 lines

  1.  
  2. /*
  3.  *  MAIN.C
  4.  *
  5.  *  BMS [destinations...] keywords/options
  6.  */
  7.  
  8. #include "defs.h"
  9. #include <config.h>
  10. #include <version.h>
  11. #include <lib_protos.h>
  12. #include <owndevunit.h>
  13.  
  14. Prototype void ResolveDestList(void);
  15. Prototype void PrintHelp(void);
  16. Prototype void InstallBMS(void);
  17. Prototype void CleanupBMS(void);
  18. Prototype void myexit(void);
  19.  
  20. Prototype long    HelpOpt;
  21. Prototype long    InstallOpt;
  22. Prototype long    BatchOpt;
  23. Prototype char *RegisterOpt;
  24. Prototype char *PathOpt;
  25. Prototype char *AliasOpt;
  26. Prototype char *RenameOpt;
  27. Prototype char *ToOpt;
  28. Prototype long    StatusOpt;
  29. Prototype long    VerboseOpt;
  30. Prototype long    AllOpt;
  31. Prototype long    FilesOpt;
  32. Prototype long    StatsOpt;
  33. Prototype long    ActiveOpt;
  34. Prototype long    VarsOpt;
  35. Prototype long    CleanupOpt;
  36. Prototype long    DebugOpt;
  37. Prototype char *DequeueOpt;
  38. Prototype char *MessageOpt;
  39. Prototype char *StopOpt;
  40. Prototype char *StartOpt;
  41. Prototype char *DestroyOpt;
  42. Prototype char *RetryOpt;
  43. Prototype char *GetOpt;
  44. Prototype char *PutOpt;
  45. Prototype char *ListOpt;
  46. Prototype char *AddFileAccOpt;
  47. Prototype char *RemFileAccOpt;
  48. Prototype char *ResFileAccOpt;
  49.  
  50. Prototype long    MaxRxBpd;
  51. Prototype long    MaxTxBpd;
  52. Prototype long    MaxRxBpw;
  53. Prototype long    MaxTxBpw;
  54. Prototype long    MaxRxMail;
  55. Prototype long    MaxTxMail;
  56. Prototype long    MinMail;
  57. Prototype long    MirRxBpd;
  58. Prototype long    MirTxBpd;
  59. Prototype long    CacBwPerc;
  60. Prototype long    ReqSwamp;
  61. Prototype long    MirSwamp;
  62.  
  63. Prototype long    ExitCode;
  64. Prototype List    DestList;
  65. Prototype List    RegList;
  66. Prototype char    TmpBuf1[512];
  67. Prototype char    TmpBuf2[512];
  68. Prototype DBHan *Db;
  69. Prototype RegNode *DefRN;
  70.  
  71. long    HelpOpt;
  72. long    InstallOpt;
  73. long    BatchOpt;
  74. char    *RegisterOpt;
  75. char    *PathOpt;
  76. char    *AliasOpt;
  77. char    *RenameOpt;
  78. char    *ToOpt;
  79. long    StatusOpt;
  80. long    VerboseOpt;
  81. long    AllOpt;
  82. long    FilesOpt;    /*  status files    */
  83. long    StatsOpt;    /*  statistics        */
  84. long    ActiveOpt;    /*  statistics        */
  85. long    VarsOpt;    /*  status variables    */
  86. long    CleanupOpt;
  87. long    DebugOpt;
  88. char    *DequeueOpt;
  89. char    *MessageOpt;
  90. char    *StopOpt;
  91. char    *StartOpt;
  92. char    *RetryOpt;
  93. char    *DestroyOpt;
  94. char    *GetOpt;
  95. char    *PutOpt;
  96. char    *ListOpt;
  97. char    *AddFileAccOpt;
  98. char    *RemFileAccOpt;
  99. char    *ResFileAccOpt;
  100.  
  101. long    MaxRxBpd;
  102. long    MaxTxBpd;
  103. long    MaxRxBpw;
  104. long    MaxTxBpw;
  105. long    MaxRxMail;
  106. long    MaxTxMail;
  107. long    MinMail;
  108. long    MirRxBpd;
  109. long    MirTxBpd;
  110. long    CacBwPerc;
  111. long    ReqSwamp;
  112. long    MirSwamp;
  113.  
  114. long    ExitCode;
  115. List    DestList;
  116. List    RegList;
  117. char    TmpBuf1[512];
  118. char    TmpBuf2[512];
  119. DBHan    *Db;
  120. RegNode *DefRN;
  121.  
  122. IDENT(".01");
  123.  
  124. struct Library *OwnDevUnitBase;
  125.  
  126. typedef struct CmdTable {
  127.     char    *ct_Name;
  128.     short   ct_Args;
  129.     short   ct_Int;
  130.     short   ct_IsCmd;
  131.     void    *ct_Data;
  132. } CmdTable;
  133.  
  134. CmdTable    CmdAry[] = {
  135.     "help",         0,  0,  1,  &HelpOpt,
  136.     "install",      0,  0,  1,  &InstallOpt,
  137.     "batch",        0,  0,  1,  &BatchOpt,
  138.     "register",     1,  0,  1,  &RegisterOpt,
  139.     "retpath",      1,  0,  0,  &PathOpt,
  140.     "alias",        1,  0,  1,  &AliasOpt,
  141.     "rename",       1,  0,  1,  &RenameOpt,
  142.     "to",           1,  0,  0,  &ToOpt,
  143.     "status",       0,  0,  1,  &StatusOpt,
  144.     "vars",         0,  0,  0,  &VarsOpt,
  145.     "files",        0,  0,  0,  &FilesOpt,
  146.     "stats",        0,  0,  0,  &StatsOpt,
  147.     "active",       0,  0,  0,  &ActiveOpt,
  148.     "all",          0,  0,  0,  &AllOpt,
  149.     "debug",        0,  0,  0,  &DebugOpt,
  150.     "verbose",      0,  0,  0,  &VerboseOpt,
  151.     "cleanup",      0,  0,  1,  &CleanupOpt,
  152.     "dequeue",      1,  0,  1,  &DequeueOpt,
  153.     "message",      1,  0,  0,  &MessageOpt,
  154.     "stop",         1,  0,  1,  &StopOpt,
  155.     "start",        1,  0,  1,  &StartOpt,
  156.     "retry",        1,  0,  1,  &RetryOpt,
  157.     "destroy",      1,  0,  1,  &DestroyOpt,
  158.     "get",          1,  0,  1,  &GetOpt,
  159.     "put",          1,  0,  1,  &PutOpt,
  160.     "list",         1,  0,  1,  &ListOpt,
  161.     "addfile",      1,  0,  1,  &AddFileAccOpt,
  162.     "remfile",      1,  0,  1,  &RemFileAccOpt,
  163.     "restrict",     1,  0,  1,  &ResFileAccOpt,
  164.     "MAXRXBPD",     1,  1,  1,  &MaxRxBpd,
  165.     "MAXTXBPD",     1,  1,  1,  &MaxTxBpd,
  166.     "MAXRXBPW",     1,  1,  1,  &MaxRxBpw,
  167.     "MAXTXBPW",     1,  1,  1,  &MaxTxBpw,
  168.     "MAXRXMAIL",    1,  1,  1,  &MaxRxMail,
  169.     "MAXTXMAIL",    1,  1,  1,  &MaxTxMail,
  170.     "MINMAIL",      1,  1,  1,  &MinMail,
  171.     "MIRRXBPD",     1,  1,  1,  &MirRxBpd,
  172.     "MIRTXBPD",     1,  1,  1,  &MirTxBpd,
  173.     "CACBWPERC",    1,  1,  1,  &CacBwPerc,
  174.     "REQSWAMP",     1,  1,  1,  &ReqSwamp,
  175.     "MIRSWAMP",     1,  1,  1,  &MirSwamp
  176. };
  177.  
  178. main(ac, av)
  179. char *av[];
  180. {
  181.     short i;
  182.  
  183.     NewList(&DestList);
  184.     NewList(&RegList);
  185.  
  186.     StatusOpt = 99;
  187.  
  188.     for (i = 1; i < ac; ++i) {
  189.     char *ptr = av[i];
  190.     CmdTable *ct;
  191.  
  192.     if (strnicmp(ptr, "D=", 2) == 0) {
  193.         AddTail(&DestList, MakeNode(ptr + 2));
  194.         continue;
  195.     }
  196.     for (ct = CmdAry; ct < CmdAry + arysize(CmdAry); ++ct) {
  197.         if (stricmp(ptr, ct->ct_Name) == 0) {
  198.         break;
  199.         }
  200.     }
  201.     if (ct == CmdAry + arysize(CmdAry)) {
  202.         bmslog("Main", "Unrecognized Keyword: %s", ptr);
  203.         continue;
  204.     }
  205.     if (ct->ct_IsCmd && StatusOpt == 99)
  206.         StatusOpt = 0;
  207.     if (ct->ct_Args) {
  208.         if ((ptr = av[++i]) == NULL) {
  209.         bmslog("Main", "Expected argument for %s", av[i-1]);
  210.         --i;
  211.         continue;
  212.         }
  213.         if (ct->ct_Int)
  214.         *(long *)ct->ct_Data = strtol(ptr, NULL, 0);
  215.         else
  216.         *(char **)ct->ct_Data = ptr;
  217.     } else {
  218.         ++*(long *)ct->ct_Data;
  219.     }
  220.     }
  221.  
  222.     atexit(myexit);
  223.  
  224.     if ((OwnDevUnitBase = OpenLibrary(ODU_NAME, 0)) == NULL) {
  225.     printf("Unable to open %s\n", ODU_NAME);
  226.     exit(20);
  227.     }
  228.  
  229.     /*
  230.      *    Handle special options (before database is setup)
  231.      */
  232.  
  233.     if (HelpOpt)
  234.     PrintHelp();
  235.     if (InstallOpt)
  236.     InstallBMS();
  237.     if (CleanupOpt)
  238.     CleanupBMS();
  239.  
  240.     LoadBMSTopLevel();
  241.     ResolveDestList();
  242.  
  243.     /*
  244.      *    Initialize state machine table
  245.      */
  246.  
  247.     InitGet();
  248.     InitPut();
  249.     InitList();
  250.     InitRegister();
  251.     InitDequeue();
  252.     InitStop();
  253.     InitStart();
  254.     InitMirror();
  255.  
  256.     /*
  257.      *    Handle normal options
  258.      */
  259.  
  260.     if (BatchOpt)
  261.     BatchBMS();
  262.     if (RegisterOpt) {
  263.     RegisterBMS(RegisterOpt, PathOpt, AliasOpt);
  264.     AliasOpt = NULL;
  265.     PathOpt = NULL;
  266.     }
  267.     if (AliasOpt)
  268.     AliasBMS(AliasOpt);
  269.     if (RenameOpt) {
  270.     RenameBMS(RenameOpt, ToOpt);
  271.     ToOpt = NULL;
  272.     }
  273.     if (GetOpt) {
  274.     GetBMS(GetOpt, ToOpt);  /*  XXX remove ToOpt get crash */
  275.     ToOpt = NULL;
  276.     }
  277.     if (PutOpt) {
  278.     PutBMS(PutOpt, ToOpt);
  279.     ToOpt = NULL;
  280.     }
  281.     if (ListOpt)
  282.     ListBMS(ListOpt);
  283.     if (AddFileAccOpt)
  284.     AddFileBMS(AddFileAccOpt);
  285.     if (RemFileAccOpt)
  286.     RemFileBMS(RemFileAccOpt);
  287.     if (ResFileAccOpt)
  288.     ResFileBMS(ResFileAccOpt);
  289.     if (StatusOpt)
  290.     StatusBMS();
  291.     if (DequeueOpt) {
  292.     DequeueBMS(DequeueOpt, MessageOpt);
  293.     MessageOpt = NULL;
  294.     }
  295.     if (StopOpt)
  296.     StopBMS(StopOpt);
  297.     if (StartOpt)
  298.     StartBMS(StartOpt);
  299.     if (DestroyOpt)
  300.     DestroyBMS(DestroyOpt);
  301.     if (RetryOpt)
  302.     RetryBMS(RetryOpt);
  303.     ModifyVariables();
  304.  
  305.     if (ToOpt)
  306.     bmslog("Main", "TO option does not apply");
  307.     if (MessageOpt)
  308.     bmslog("Main", "MESSAGE option does not apply");
  309.     return(ExitCode);
  310. }
  311.  
  312. void
  313. myexit(void)
  314. {
  315.     if (Db) {
  316.     SaveBMSDataBase();
  317.     CloseDataBase(Db);
  318.     Db = NULL;
  319.     }
  320.     dbc_atexit();
  321.  
  322.     UnLockFiles();
  323.  
  324.     if (OwnDevUnitBase) {
  325.     CloseLibrary(OwnDevUnitBase);
  326.     OwnDevUnitBase = NULL;
  327.     }
  328. }
  329.  
  330.  
  331. /*
  332.  *  Resolve DestList.  DestList contains simple Node structures,
  333.  *  find RegNode references and flag.  If no nodes in DestList then
  334.  *  flag default RegNode.
  335.  *
  336.  *  For a destination of * (D=*), all nodes except the default are
  337.  *  modified
  338.  */
  339.  
  340. void
  341. ResolveDestList(void)
  342. {
  343.     Node *node;
  344.     RegNode *rn;
  345.  
  346.  
  347.     for (rn = GetHead(&RegList); rn; rn = GetSucc(&rn->rn_Node)) {
  348.     if (rn->rn_Node.ln_Name == NULL)
  349.         break;
  350.     }
  351.     if ((DefRN = rn) == NULL) {
  352.     bmslog("ResolveDest", "DEFAULTS NOT FOUND!");
  353.     exit(10);
  354.     }
  355.  
  356.     for (node = GetHead(&DestList); node; node = GetSucc(node)) {
  357.     for (rn = GetHead(&RegList); rn; rn = GetSucc(&rn->rn_Node)) {
  358.         if ((rn->rn_Flags & GF_NODISP) && AllOpt == 0)
  359.         continue;
  360.         if (rn->rn_Node.ln_Name && stricmp(node->ln_Name, rn->rn_Node.ln_Name) == 0) {
  361.         rn->rn_Flags |= GF_MARKED;
  362.         break;
  363.         }
  364.         if (rn->rn_Alias && stricmp(node->ln_Name, rn->rn_Alias) == 0) {
  365.         rn->rn_Flags |= GF_MARKED;
  366.         break;
  367.         }
  368.         if (rn->rn_Node.ln_Name && stricmp(node->ln_Name, "*") == 0)
  369.         rn->rn_Flags |= GF_MARKED;
  370.     }
  371.     for (rn = GetHead(&RegList); rn; rn = GetSucc(&rn->rn_Node)) {
  372.         if (rn->rn_Flags & GF_MARKED)
  373.         break;
  374.     }
  375.     if (rn) {
  376.         rn->rn_Flags |= GF_MARKED;
  377.     } else {
  378.         bmslog("ResolveDest", "Node '%s' not found", node->ln_Name);
  379.         exit(10);
  380.     }
  381.     }
  382.     if (GetHead(&DestList) == NULL)
  383.     DefRN->rn_Flags |= GF_MARKED;
  384. }
  385.  
  386.  
  387. /*
  388.  *  Display some form of help
  389.  */
  390.  
  391. void
  392. PrintHelp()
  393. {
  394.     srand(time(NULL));
  395.     if ((rand() & 63) == 0) {
  396.     puts("Help!  I'm being held hostage on a hard disk platter!");
  397.     return;
  398.     }
  399.     printf(
  400.     "BMS RELEASE %s\n"
  401.     "See documentation for operation\n\n"
  402.     "BMS STATUS [VARS] [FILES] [STATS] [ACTIVE] [ALL] [DEBUG]\n"
  403.     "BMS HELP\n"
  404.     "BMS INSTALL\n"
  405.     "BMS BATCH\n",
  406.  
  407.     Ident
  408.     );
  409.     printf(
  410.     "BMS REGISTER dest_path RETPATH ret_path [ALIAS alias]\n"
  411.     "BMS D=dest ALIAS newalias\n"
  412.     "BMS RENAME dest TO new_dest_path\n"
  413.     "BMS CLEANUP\n"
  414.     );
  415.     printf(
  416.     "BMS DEQUEUE <id> MESSAGE \"message\"\n"
  417.     "BMS DESTROY <id>\n"
  418.     "BMS STOP <id>\n"
  419.     "BMS START <id>\n"
  420.     "BMS RETRY <id>\n"
  421.     );
  422.     printf(
  423.     "BMS D=dest GET remote_file TO local_file\n"
  424.     "BMS D=dest PUT local_file TO remote_file\n"
  425.     "BMS D=dest LIST <directory/ALL>\n"
  426.     "BMS [D=dest] ADDFILE file/dir_name\n"
  427.     "BMS [D=dest] REMFILE file/dir_name\n"
  428.     "BMS [D=dest] RESTRICT file/dir_name\n"
  429.     );
  430.     printf(
  431.     "BMS [D=dest] <VARIABLE> value\n"
  432.     "   MAXRXBPD    MAXTXBPD  MAXRXBPW  MAXTXBPW\n"
  433.     "   MAXRXMAIL   MAXTXMAIL MINMAIL\n"
  434.     "   MIRRXBPD    MIRTXBPD  CACBWPERC\n"
  435.     "   REQSWAMP    MIRSWAMP\n"
  436.     );
  437. }
  438.  
  439. /*
  440.  *  Install the BMS system
  441.  */
  442.  
  443. void
  444. InstallBMS()
  445. {
  446.     RegNode *rn;
  447.  
  448.     bmslog("Install", "Begin Install");
  449.     mkdir("BMS:Tmp");
  450.     mkdir("BMS:Pub");
  451.     if (Db = OpenDataBase("BMS:BMS.DB", "r")) {
  452.     CloseDataBase(Db);
  453.     Db = NULL;
  454.     if (getyn("BMS Database Exists! delete it?", NO) == NO)
  455.         return;
  456.     remove("BMS:BMS.DB");
  457.     }
  458.     Db = OpenDataBase("BMS:BMS.DB", "w");
  459.     if (Db == NULL) {
  460.     bmslog("Install", "Unable to create BMS:BMS.DB");
  461.     return;
  462.     }
  463.  
  464.     /*
  465.      *    Create a dummy entry to hold global defaults.  This is a
  466.      *    registration node with ln_Name = NULL
  467.      */
  468.  
  469.     rn = AllocRegNode();
  470.     rn->rn_Alias = zstrdup("default");
  471.     rn->rn_Comm.com_Flags = GF_MODIFIED;
  472.     rn->rn_Comm.com_TOTime = -1;
  473.  
  474.     /*
  475.      *    Inititalize default parameters
  476.      */
  477.  
  478.     rn->rn_Param.pm_MaxRxBpd = 100000;        /*    receive bytes per day        */
  479.     rn->rn_Param.pm_MaxTxBpd = 100000;        /*    transmit bytes per day        */
  480.     rn->rn_Param.pm_MaxRxBpw = 400000;        /*    receive bytes per week        */
  481.     rn->rn_Param.pm_MaxTxBpw = 400000;        /*    transmit bytes per week     */
  482.     rn->rn_Param.pm_MaxRxMail= 56000;        /*    rx mail message size        */
  483.     rn->rn_Param.pm_MaxTxMail= 56000;        /*    tx mail message size        */
  484.     rn->rn_Param.pm_MinMail  = 15000;        /*    worst case breakdown        */
  485.     rn->rn_Param.pm_MirRxBpd = 30000;        /*    mirror bandwidth receive    */
  486.     rn->rn_Param.pm_MirTxBpd = 50000;        /*    mirror bandwidth transmit   */
  487.     rn->rn_Param.pm_CacBwPerc= 10;        /*    10% of bandwidth        */
  488.     rn->rn_Param.pm_ReqSwamp = 10;        /*    swamp factor            */
  489.     rn->rn_Param.pm_MirSwamp = 20;        /*    swamp factor            */
  490.     rn->rn_Param.pm_Flags = GF_MODIFIED;
  491.  
  492.     AllocFileAccess(rn, "UUPUB:");
  493.     AllocFileAccess(rn, "BMS:PUB");
  494.  
  495.     SaveBMSDataBase();
  496.     UnLoadBMSDataBase();
  497.  
  498.     bmslog("Install", "End Install");
  499.     CloseDataBase(Db);
  500.     Db = NULL;
  501. }
  502.  
  503. void
  504. CleanupBMS()
  505. {
  506.     bmslog("Cleanup", "Begin");
  507.     CleanDataBase("BMS:BMS.DB");
  508.     bmslog("Cleanup", "End");
  509. }
  510.  
  511.