home *** CD-ROM | disk | FTP | other *** search
/ rtsi.com / 2014.01.www.rtsi.com.tar / www.rtsi.com / OS9 / OSK / TELECOM / stg_v4.lzh / stg_net.c < prev    next >
C/C++ Source or Header  |  1994-11-11  |  16KB  |  786 lines

  1. #define TREVNICK
  2.  
  3. #ifdef _OSK
  4. #include <module.h>
  5. #endif
  6.  
  7. #include "stgnet.h"
  8. #include "db9.h"
  9. #include "key.h"
  10.  
  11. #include "nodes.h"
  12.  
  13. #include "node.h"
  14.  
  15. char *apcMsg[]=
  16. {
  17.     "",
  18.     "StG-Net System Configuration",
  19.     "============================",
  20.     "",
  21.     "If you have not done so already, please register",
  22.     "your system name with StG-Net administration and",
  23.     "obtain a Network Password.  If the administrator",
  24.     "for your area is not listed in the documentation",
  25.     "please contact the sales office where you bought",
  26.     "this package.",
  27.     "",
  28.     "You must have a valid registered system name and",
  29.     "password to complete this installation.  This is",
  30.     "necessary to connect with other systems.",
  31.     "",
  32.     0
  33. };
  34.  
  35. int hSTG;
  36. int hSeek;
  37.  
  38. #ifdef _OSK
  39. mod_dev *psStG;
  40. mod_dev *modlink();
  41. mod_dev *modloadp();
  42.  
  43. mod_dev *make_module();
  44. /* mod_dev *psDesc; */
  45.  
  46. #endif
  47.  
  48. char acPass[32];
  49. char acName[32];
  50.  
  51. struct sNODE sNODE;
  52.  
  53. struct sFld_Block sFld;
  54.  
  55. char acO_ALPHANUM[]={FO_ALPHA,FO_NUM,0};
  56. char acO_NUM[]={FO_NUM,0}; /* no right */
  57.  
  58. extern int _edtchg;
  59.  
  60. struct sNode sNode;
  61.  
  62. get_stg()
  63. {
  64.     int cKey;
  65.     char **ppcList;
  66.     int iCheck;
  67.  
  68.     ppcList=apcMsg;
  69.     while (*ppcList)
  70.     {
  71.         strcpy(b,*ppcList++);
  72.         strcat(b,"\n");
  73.         writeln(1,b,80);
  74.     }
  75.  
  76. bad_entry:
  77.     sFld.oFld_Len=20;
  78.     sFld.cFld_Type=FT_ASCII;
  79.     strcpy(sFld.acFld_Opts,acO_ALPHANUM);
  80.     strcat(sFld.acFld_Opts,"'_");
  81.     strcpy(sFld.acFld_Mask,"Enter System Name : ________");
  82.  
  83. #ifdef _UNIX
  84.     gethostname(acName,sFld.oFld_Len);
  85. #endif
  86.  
  87. edt_name:
  88.     cKey=_Edt(&sFld,acName);
  89.     if (cKey==KY_ESC)
  90.     {
  91.         _Dsp(0,0);
  92.         return(ERR);
  93.     }
  94.  
  95.     if (cKey!=KY_ENTER)
  96.         goto edt_name;
  97.  
  98.     _Dsp(0,0);
  99.     if (!*acName)
  100.         return(ERR);
  101.  
  102.     writeln(1,"\n",1);
  103.  
  104.     sFld.oFld_Len=14;
  105.     sFld.cFld_Type=FT_ASCII;
  106.     strcpy(sFld.acFld_Opts,acO_NUM);
  107.     strcpy(sFld.acFld_Mask,"Enter Net Password: ______________");
  108.  
  109. edt_pass:
  110.     cKey=_Edt(&sFld,acPass);
  111.     if (cKey==KY_ESC)
  112.     {
  113.         _Dsp(0,0);
  114.         return(ERR);
  115.     }
  116.  
  117.     if (cKey!=KY_ENTER)
  118.         goto edt_pass;
  119.  
  120.     _Dsp(0,0);
  121.     if (!*acPass)
  122.         return(ERR);
  123.  
  124.     if (strlen(acPass)!=14)
  125.         goto edt_pass;
  126.  
  127.     writeln(1,"\n",1);
  128.  
  129.     memset(&sNODE,0,sizeof(sNODE));
  130.     strncpy(sNODE.acPass,acPass,10);
  131.     strcpy(sNODE.acName,acName);
  132.  
  133.     iCheck=-1;
  134.     crc(sNODE.acName,strlen(sNODE.acName),&iCheck);
  135.     crc(sNODE.acPass,strlen(sNODE.acPass),&iCheck);
  136.     iCheck=~iCheck;
  137.     iCheck&=0x00FFFFFF;
  138.     iCheck=iCheck%10000;
  139.  
  140.     if (iCheck!=atoi(acPass+10))
  141.     {
  142.         writeln(1,"\n",1);
  143.         writeln(1,"ERROR IN ENTRY - PLEASE CHECK YOUR SYS NAME AND PASSWORD AND TRY AGAIN\n",80);
  144.         writeln(1,"\n",1);
  145.         goto bad_entry;
  146.     }
  147.  
  148.     set_node(&sNODE);
  149. }
  150.  
  151. editnode(psNode)
  152. struct sNode *psNode;
  153. {
  154.     int cKey;
  155.     int i;
  156.     char *p;
  157.     int n;
  158.  
  159.     stringf(b,"Parameters for node %s:\n",psNode->acN_Name);
  160.     writeln(1,b,80);
  161.  
  162.     writeln(1,"\n",1);
  163.     writeln(1,"Status codes: 0 = Permantly Dead\n",80);
  164.     writeln(1,"              1 = Online & accepting new users\n",80);
  165.     writeln(1,"              2 = Online but restricted access (semi-private)\n",80);
  166.     writeln(1,"              3 = No dial-in (private system/offline reader)\n",80);
  167.     writeln(1,"              4 = Temporarily down (mail will be held)\n",80);
  168.     writeln(1,"\n",1);
  169.  
  170.     sFld.oFld_Len=1;
  171.     sFld.cFld_Type=FT_UINT;
  172.     strcpy(sFld.acFld_Opts,acO_NUM);
  173.     strcpy(sFld.acFld_Mask,"System Status: _");
  174.  
  175.     cKey=0;
  176.     while (cKey!=KY_ENTER)
  177.     {
  178.         cKey=_Edt(&sFld,&(psNode->bN_Status));
  179. if (cKey==KY_ESC) goto escape;
  180. }
  181.     if (_edtchg) psNode->bN_Update|=NU_STATUS;
  182.  
  183.     _Dsp(0,0);
  184.     writeln(1,"\n",1);
  185.  
  186. #ifdef TREVNICK
  187.     writeln(1,"Machine Codes: 1=OSK, 2=OS9K, 3=6809, 4=Unix\n",80);
  188.     writeln(1,"               5=MSDOS, 6=MSWIN, 7=WIN-NT, 8=OS/2\n",80);
  189.  
  190.     sFld.oFld_Len=1;
  191.     sFld.cFld_Type=FT_UINT;
  192.     strcpy(sFld.acFld_Opts,acO_NUM);
  193.     strcpy(sFld.acFld_Mask,"Machine Type : ___");
  194.  
  195.     cKey=0;
  196.     while (cKey!=KY_ENTER)
  197.     {
  198.         cKey=_Edt(&sFld,&(psNode->bN_MType));
  199. if (cKey==KY_ESC) goto escape;
  200. }    if (_edtchg) psNode->bN_Update|=NU_STATUS;
  201.  
  202.     _Dsp(0,0);
  203.     writeln(1,"\n",1);
  204.  
  205. #else
  206.  
  207.     i=0;
  208. #ifdef _OSK
  209.     i=MT_OSK;
  210. #endif
  211. #ifdef _OS9000
  212.     i=MT_OS9K;
  213. #endif
  214. #ifdef _6809
  215.     i=MT_6809;
  216. #endif
  217. #ifdef _UNIX
  218.     i=MT_UNIX;
  219. #endif
  220. #ifdef _MSDOS
  221.     i=MT_MSDOS;
  222. #endif
  223. #ifdef _MSWIN
  224.     i=MT_MSWIN;
  225. #endif
  226.     if (psNode->bN_MType!=i)
  227.     {
  228.         psNode->bN_MType=i;
  229.         psNode->bN_Update|=NU_STATUS;
  230.     }
  231. #endif
  232.  
  233.     writeln(1,"\n",1);
  234.     if (psNode->bN_Status==NS_NONE)
  235.         writeln(1,"Phone, ISDN, and INET address will not be shown to the public.\n",80);
  236.  
  237.     sFld.oFld_Len=11;
  238.     sFld.cFld_Type=FT_ASCII;
  239.     strcpy(sFld.acFld_Opts,acO_NUM);
  240.     strcpy(sFld.acFld_Mask,"Phone Number : ___-___-____ (leave blank if no modem access)");
  241.  
  242.     cKey=0;
  243.     while (cKey!=KY_ENTER)
  244.     {
  245.         cKey=_Edt(&sFld,psNode->acN_Phone);
  246. if (cKey==KY_ESC) goto escape;
  247. }    if (_edtchg) psNode->bN_Update|=NU_PHONE;
  248.  
  249.     _Dsp(0,0);
  250.     writeln(1,"\n",1);
  251.  
  252. if (!*psNode->acN_Phone) goto skip_baud;
  253.  
  254.     sFld.oFld_Len=2;
  255.     sFld.cFld_Type=FT_UINT;
  256.     *sFld.acFld_Opts=0;
  257.     strcpy(sFld.acFld_Mask,"Highest Baud : ____00");
  258.  
  259.     cKey=0;
  260.     while (cKey!=KY_ENTER)
  261.     {
  262.         cKey=_Edt(&sFld,&(psNode->wN_Speed));
  263. if (cKey==KY_ESC) goto escape;
  264. }    if (_edtchg) psNode->bN_Update|=NU_PHONE;
  265.  
  266.     _Dsp(0,0);
  267.     writeln(1,"\n",1);
  268.  
  269. skip_baud:
  270.     sFld.oFld_Len=11;
  271.     sFld.cFld_Type=FT_ASCII;
  272.     strcpy(sFld.acFld_Opts,acO_NUM);
  273.     strcpy(sFld.acFld_Mask,"ISDN Address : ___-___-____ (leave blank if no ISDN access)");
  274.  
  275.     cKey=0;
  276.     while (cKey!=KY_ENTER)
  277.     {
  278.         cKey=_Edt(&sFld,psNode->acN_ISDN);
  279. if (cKey==KY_ESC) goto escape;
  280. }    if (_edtchg) psNode->bN_Update|=NU_PHONE;
  281.  
  282.     _Dsp(0,0);
  283.     writeln(1,"\n",1);
  284.  
  285.     sFld.oFld_Len=4;
  286.     sFld.cFld_Type=FT_INET;
  287.     strcpy(sFld.acFld_Opts,acO_NUM);
  288.     strcpy(sFld.acFld_Mask,"INET Address : ___.___.___.___ (leave zero if no Internet access)");
  289.  
  290.     cKey=0;
  291.     while (cKey!=KY_ENTER)
  292.     {
  293.         cKey=_Edt(&sFld,psNode->abN_INET);
  294. if (cKey==KY_ESC) goto escape;
  295. }    if (_edtchg) psNode->bN_Update|=NU_PHONE;
  296.  
  297.     _Dsp(0,0);
  298.     writeln(1,"\n",1);
  299.  
  300.     writeln(1,"\n",1);
  301.     writeln(1,"    Time Zone                     UTC Offset     Daylight Savings\n",80);
  302.     writeln(1,"    --------------------------    ----------     ----------------\n",80);
  303.     writeln(1,"    Eastern Standard Time          -5             -4\n",80);
  304.     writeln(1,"    Central Standard Time          -6             -5\n",80);
  305.     writeln(1,"    Mountain Standard Time         -7             -6\n",80);
  306.     writeln(1,"    Pacific Standard Time          -8             -7\n",80);
  307.     writeln(1,"\n",1);
  308.  
  309.     sFld.oFld_Len=1;
  310.     sFld.cFld_Type=FT_SINT;
  311.     *sFld.acFld_Opts=0;
  312.     strcpy(sFld.acFld_Mask,"Time Zone    : ____ (offset from UTC/GMT)");
  313.  
  314.     cKey=0;
  315.     while (cKey!=KY_ENTER)
  316.     {
  317.         cKey=_Edt(&sFld,&psNode->cN_UTC);
  318. if (cKey==KY_ESC) goto escape;
  319. }    if (_edtchg) psNode->bN_Update|=NU_TIME;
  320.  
  321.     _Dsp(0,0);
  322.     writeln(1,"\n",1);
  323.  
  324.     sFld.oFld_Len=2;
  325.     sFld.cFld_Type=FT_DATE;
  326.     strcpy(sFld.acFld_Opts,acO_NUM);
  327.     strcpy(sFld.acFld_Mask,"Weekday Hours: __:00 - __:00 (0=24 hrs)");
  328.  
  329.     cKey=0;
  330.     while (cKey!=KY_ENTER)
  331.     {
  332.         cKey=_Edt(&sFld,psNode->abN_WkdHrs);
  333. if (cKey==KY_ESC) goto escape;
  334. }    if (_edtchg) psNode->bN_Update|=NU_TIME;
  335.  
  336.     _Dsp(0,0);
  337.     writeln(1,"\n",1);
  338.  
  339.     strcpy(sFld.acFld_Mask,"Weekend Hours: __:00 - __:00 (0=24 hrs)");
  340.  
  341.     cKey=0;
  342.     while (cKey!=KY_ENTER)
  343.     {
  344.         cKey=_Edt(&sFld,psNode->abN_WkeHrs);
  345. if (cKey==KY_ESC) goto escape;
  346. }    if (_edtchg) psNode->bN_Update|=NU_TIME;
  347.  
  348.     _Dsp(0,0);
  349.     writeln(1,"\n",1);
  350.  
  351.     strcpy(sFld.acFld_Mask,"Network Hours: __:00 - __:00 (0=24 hrs)");
  352.  
  353.     cKey=0;
  354.     while (cKey!=KY_ENTER)
  355.     {
  356.         cKey=_Edt(&sFld,psNode->abN_NetHrs);
  357. if (cKey==KY_ESC) goto escape;
  358. }    if (_edtchg) psNode->bN_Update|=NU_TIME;
  359.  
  360.     _Dsp(0,0);
  361.     writeln(1,"\n",1);
  362.  
  363.     sFld.oFld_Len=28;
  364.     sFld.cFld_Type=FT_ASCII;
  365.     *sFld.acFld_Opts=0;
  366.     strcpy(sFld.acFld_Mask,"Description  : _______________________________");
  367.  
  368.     cKey=0;
  369.     while (cKey!=KY_ENTER)
  370.     {
  371.         cKey=_Edt(&sFld,psNode->acN_Desc);
  372. if (cKey==KY_ESC) goto escape;
  373. }    if (_edtchg) psNode->bN_Update|=NU_DESC;
  374.  
  375.     _Dsp(0,0);
  376.     writeln(1,"\n",1);
  377.  
  378.     sFld.oFld_Len=24;
  379.     sFld.cFld_Type=FT_ASCII;
  380.     *sFld.acFld_Opts=0;
  381.     strcpy(sFld.acFld_Mask,"Sysop Name   : _______________________");
  382.  
  383.     cKey=0;
  384.     while (cKey!=KY_ENTER)
  385.     {
  386.         cKey=_Edt(&sFld,psNode->acN_Sysop);
  387. if (cKey==KY_ESC) goto escape;
  388. }    if (_edtchg) psNode->bN_Update|=NU_OPER;
  389.  
  390.     _Dsp(0,0);
  391.     writeln(1,"\n",1);
  392.  
  393.     sFld.oFld_Len=32;
  394.     sFld.cFld_Type=FT_ASCII;
  395.     *sFld.acFld_Opts=0;
  396.     strcpy(sFld.acFld_Mask,"Node Address : ________________________________");
  397.  
  398.     cKey=0;
  399.     while (cKey!=KY_ENTER)
  400.     {
  401.         cKey=_Edt(&sFld,psNode->acN_Addr);
  402. if (cKey==KY_ESC) goto escape;
  403. }    if (_edtchg) psNode->bN_Update|=NU_ADDR;
  404.  
  405.     _Dsp(0,0);
  406.     writeln(1,"\n",1);
  407.  
  408.     sFld.oFld_Len=24;
  409.     sFld.cFld_Type=FT_ASCII;
  410.     *sFld.acFld_Opts=0;
  411.     strcpy(sFld.acFld_Mask,"     City    : _______________________");
  412.  
  413.     cKey=0;
  414.     while (cKey!=KY_ENTER)
  415.     {
  416.         cKey=_Edt(&sFld,psNode->acN_City);
  417. if (cKey==KY_ESC) goto escape;
  418. }    if (_edtchg) psNode->bN_Update|=NU_ADDR;
  419.  
  420.     _Dsp(0,0);
  421.     writeln(1,"\n",1);
  422.  
  423.     sFld.oFld_Len=24;
  424.     sFld.cFld_Type=FT_ASCII;
  425.     *sFld.acFld_Opts=0;
  426.     strcpy(sFld.acFld_Mask,"     State   : _______________________");
  427.  
  428.     cKey=0;
  429.     while (cKey!=KY_ENTER)
  430.     {
  431.         cKey=_Edt(&sFld,psNode->acN_State);
  432. if (cKey==KY_ESC) goto escape;
  433. }    if (_edtchg) psNode->bN_Update|=NU_ADDR;
  434.  
  435.     _Dsp(0,0);
  436.     writeln(1,"\n",1);
  437.  
  438.     sFld.oFld_Len=16;
  439.     sFld.cFld_Type=FT_ASCII;
  440.     *sFld.acFld_Opts=0;
  441.     strcpy(sFld.acFld_Mask,"     Zip     : _______________");
  442.  
  443.     cKey=0;
  444.     while (cKey!=KY_ENTER)
  445.     {
  446.         cKey=_Edt(&sFld,psNode->acN_Zip);
  447. if (cKey==KY_ESC) goto escape;
  448. }    if (_edtchg) psNode->bN_Update|=NU_ADDR;
  449.  
  450.     _Dsp(0,0);
  451.     writeln(1,"\n",1);
  452.  
  453.     if (!*psNode->acN_Country)
  454.         strcpy(psNode->acN_Country,"USA");
  455.  
  456.     sFld.oFld_Len=24;
  457.     sFld.cFld_Type=FT_ASCII;
  458.     *sFld.acFld_Opts=0;
  459.     strcpy(sFld.acFld_Mask,"     Country : _______________________");
  460.  
  461.     cKey=0;
  462.     while (cKey!=KY_ENTER)
  463.     {
  464.         cKey=_Edt(&sFld,psNode->acN_Country);
  465. if (cKey==KY_ESC) goto escape;
  466. }    if (_edtchg) psNode->bN_Update|=NU_ADDR;
  467.  
  468.     _Dsp(0,0);
  469.     writeln(1,"\n",1);
  470.  
  471.     sFld.oFld_Len=11;
  472.     sFld.cFld_Type=FT_ASCII;
  473.     strcpy(sFld.acFld_Opts,acO_NUM);
  474.     strcpy(sFld.acFld_Mask,"Sysop's Phone: ___-___-____");
  475.  
  476.     cKey=0;
  477.     while (cKey!=KY_ENTER)
  478.     {
  479.         cKey=_Edt(&sFld,psNode->acN_SPhone);
  480. if (cKey==KY_ESC) goto escape;
  481. }    if (_edtchg) psNode->bN_Update|=NU_OPER;
  482.  
  483.     _Dsp(0,0);
  484.     writeln(1,"\n",1);
  485.  
  486.     i=0;
  487.     while (i<4)
  488.     {
  489.         writeln(1,"\n",1);
  490.         stringf(b,"Network feed selection #%d:\n",i+1);
  491.         writeln(1,b,80);
  492.  
  493.         sFld.oFld_Len=28;
  494.         sFld.cFld_Type=FT_ASCII;
  495.         *sFld.acFld_Opts=0;
  496.         strcpy(sFld.acFld_Mask,"Node Name    : ________________");
  497.  
  498. renode:
  499.         cKey=0;
  500.         while (cKey!=KY_ENTER)
  501.         {
  502.             cKey=_Edt(&sFld,psNode->asNode2[i].acN2_Name);
  503. if (cKey==KY_ESC) goto escape;
  504. }        p=psNode->asNode2[i].acN2_Name;
  505.         if (*p)
  506.         {
  507.             n=_db9(DB_SEEK,hSeek,p,strlen(p)+1);
  508.             if (n==ERR)
  509.                 exit(syserr("DB9 seek %s: %m",p));
  510.             if (!n)
  511.             {
  512.                 write(1,"\7",1);
  513.                 goto renode;
  514.             }
  515.         }
  516.  
  517.         if (_edtchg) psNode->bN_Update|=NU_ROUTE;
  518.  
  519.         _Dsp(0,0);
  520.         writeln(1,"\n",1);
  521.  
  522.         if (!*psNode->asNode2[i].acN2_Name)
  523.         {
  524.             psNode->asNode2[i].bN2_MaxAge=0;
  525.             psNode->asNode2[i].bN2_MinAge=0;
  526.             psNode->asNode2[i].bN2_MaxSize=0;
  527.             psNode->asNode2[i].bN2_MaxSize=0;
  528.  
  529.             i++;
  530.             continue;
  531.         }
  532.  
  533.         sFld.oFld_Len=1;
  534.         sFld.cFld_Type=FT_UINT;
  535.         *sFld.acFld_Opts=0;
  536.         strcpy(sFld.acFld_Mask,"Maximum Age  : ___ hours (0=immediate, 72 or less recomended)");
  537.  
  538.         cKey=0;
  539.         while (cKey!=KY_ENTER)
  540.         {
  541.             cKey=_Edt(&sFld,&(psNode->asNode2[i].bN2_MaxAge));
  542. if (cKey==KY_ESC) goto escape;
  543. }        if (_edtchg) psNode->bN_Update|=NU_ROUTE;
  544.  
  545.         _Dsp(0,0);
  546.         writeln(1,"\n",1);
  547.  
  548.         sFld.oFld_Len=1;
  549.         sFld.cFld_Type=FT_UINT;
  550.         *sFld.acFld_Opts=0;
  551.         strcpy(sFld.acFld_Mask,"Minimum Age  : ___ hours (0=no minimum)");
  552.  
  553.         cKey=0;
  554.         while (cKey!=KY_ENTER)
  555.         {
  556.             cKey=_Edt(&sFld,&(psNode->asNode2[i].bN2_MinAge));
  557. if (cKey==KY_ESC) goto escape;
  558. }        if (_edtchg) psNode->bN_Update|=NU_ROUTE;
  559.  
  560.         _Dsp(0,0);
  561.         writeln(1,"\n",1);
  562.  
  563.         sFld.oFld_Len=1;
  564.         sFld.cFld_Type=FT_UINT;
  565.         *sFld.acFld_Opts=0;
  566.         strcpy(sFld.acFld_Mask,"Maximum Size : ___ K bytes (0=no maximum)");
  567.  
  568.         cKey=0;
  569.         while (cKey!=KY_ENTER)
  570.         {
  571.             cKey=_Edt(&sFld,&(psNode->asNode2[i].bN2_MaxSize));
  572. if (cKey==KY_ESC) goto escape;
  573. }        if (_edtchg) psNode->bN_Update|=NU_ROUTE;
  574.  
  575.         _Dsp(0,0);
  576.         writeln(1,"\n",1);
  577.  
  578.         sFld.oFld_Len=1;
  579.         sFld.cFld_Type=FT_UINT;
  580.         *sFld.acFld_Opts=0;
  581.         strcpy(sFld.acFld_Mask,"Minimum Size : ___ K bytes (0=no minimum)");
  582.  
  583.         cKey=0;
  584.         while (cKey!=KY_ENTER)
  585.         {
  586.             cKey=_Edt(&sFld,&(psNode->asNode2[i].bN2_MinSize));
  587. if (cKey==KY_ESC) goto escape;
  588. }        if (_edtchg) psNode->bN_Update|=NU_ROUTE;
  589.  
  590.         _Dsp(0,0);
  591.         writeln(1,"\n",1);
  592.  
  593.         i++;
  594.     }
  595.     return;
  596.  
  597. escape:
  598.     _Dsp(0,0);
  599.     wstringf(2,"\nUpdate cancelled\n");
  600.     exit(1);
  601. }
  602.  
  603. void
  604. checknet(pcName,iUpdate)
  605. char *pcName;
  606. int iUpdate;
  607. {
  608.     int iFound;
  609.  
  610.     if (_db9(DB_OPEN,hSTG,"nodes",6)==ERR)
  611.         exit(errno);
  612.  
  613.     if (_db9(DB_MATCH,hSTG,-1,0)==ERR)
  614.         exit(errno);
  615.  
  616.     iFound=_db9(DB_SEEK,hSTG,pcName,strlen(pcName)+1);
  617.     if (iFound==ERR)
  618.         exit(errno);
  619.  
  620.     if (iFound)
  621.     {
  622.         if (_db9(DB_READ,hSTG,&sNode,sizeof(sNode))==ERR)
  623.             exit(errno);
  624.     }
  625.     else
  626.     {
  627.         memset(&sNode,0,sizeof(sNode));
  628.         strcpy(sNode.acN_Name,pcName);
  629.         sNode.bN_Update=-1;
  630.         iUpdate=3;
  631.     }
  632.  
  633.     if (!iUpdate)
  634.         return;
  635.  
  636.     if (iUpdate&1)
  637.         editnode(&sNode);
  638.  
  639.     if (iUpdate&2)
  640.         ;
  641.  
  642.     if (iFound)
  643.     {
  644.         if (_db9(DB_WRITE,hSTG,&sNode,sizeof(sNode))==ERR)
  645.             exit(errno);
  646.     }
  647.     else
  648.     {
  649.         if (_db9(DB_ADD,hSTG,&sNode,sizeof(sNode))==ERR)
  650.             exit(errno);
  651.     }
  652. }
  653.  
  654. main(argc,argv)
  655. char **argv;
  656. {
  657.     int hFile;
  658.     int iUpdate=0;
  659.     int iBoot=0;
  660.     char *args[3];
  661.  
  662.     openerr(*argv,0,LOG_STGNET);
  663.  
  664.     dash(argv)
  665.     {
  666.     case '#':
  667.         wstringf(2,"stg_net: %s\n",STG_VER);
  668.         exit(0);
  669.  
  670.     case '?':
  671.         writeln(2,"stg_net {-bsu}  - initialize/update StG-Net\n",80);
  672.         writeln(2,"\n");
  673.         writeln(2," -b   - boot the network\n",80);
  674.         writeln(2," -s   - shutdown the network\n",80);
  675.         writeln(2," -u   - update system configuration\n",80);
  676.         STGVER;
  677.         exit(0);
  678.  
  679.     case 'b':
  680.         iBoot=1;
  681.         break;
  682.  
  683.     case 's':
  684.         writeln(2,"shutdown option has not been implimented yet\n",80);
  685.         exit(1);
  686.  
  687.     case 'u':
  688.         iUpdate|=1;
  689.         break;
  690.  
  691.     default:
  692.         stringf(b,"stg_net: invalid option: %s\n",--*argv);
  693.         writeln(2,b,80);
  694.         exit(1);
  695.     }
  696.  
  697.     if (sizeof(sNode)!=508)
  698.         exit(syserr("node structure is %d",sizeof(sNode)));
  699.  
  700. /*
  701.     if (_Trm(getenv("TERM"))==ERR)
  702.         exit(errno);
  703.  
  704.     if (!_Trm_CM || !_Trm_CO || !_Trm_LI)
  705.         exit(DE_TERMNC);
  706.  
  707. */
  708.     hSTG=open(STG_FILE,O_RDWR);
  709.     if (hSTG==ERR)
  710.         exit(syserr("open %s: %m",STG_FILE));
  711.  
  712.     hSeek=open(STG_FILE,O_RDONLY);
  713.     if (hSeek==ERR)
  714.         exit(syserr("open %s: %m",STG_FILE));
  715.  
  716.     if (_db9(DB_OPEN,hSeek,"nodes",6)==ERR)
  717.         exit(syserr("DB9 open nodes: %m"));
  718.  
  719.     /* select case insensitive seek */
  720.     if (_db9(DB_MATCH,hSeek,-1,0)==ERR)
  721.         exit(syserr("DB9 match c-i: %m"));
  722.  
  723.     /* get node info */
  724.     if (!get_node(&sNODE))
  725.     {
  726.         if (get_stg()==ERR)
  727.         {
  728.             writeln(2,"stg_net: system not configured\n",80);
  729.             exit(1);
  730.         }
  731.         iUpdate|=1;
  732.     }
  733.  
  734. #ifdef TREVNICK
  735.     if (*argv)
  736.         checknet(*argv,iUpdate|1);
  737.     else
  738. #endif
  739.  
  740.     /* loads sNode */
  741.     checknet(sNODE.acName,iUpdate);
  742.  
  743.     if (iBoot)
  744.     {
  745.         syslog(LOG_INFO,"system booted");
  746.  
  747.         writeln(1,"Starting smon(s)...\n",80);
  748.         args[0]="@smon";
  749.         args[1]=0;
  750.         if (_fork(*args+1,args,environ)==ERR)
  751.             exit(syserr("fork %s: %m",*args+1));
  752.  
  753.         sleep(3);
  754. /*
  755.         if (*sNode.acN_ISDN)
  756.         {
  757.             writeln(1,"Starting ISDN daemon...\n",80);
  758.             args[0]="@stgisdn";
  759.             args[1]=0;
  760.             if (_fork(*args+1,args,environ)==ERR)
  761.                 exit(syserr("fork %s: %m",*args+1));
  762.  
  763.             sleep(3);
  764.         }
  765. */
  766.         if (sNode.abN_INET[0])
  767.         {
  768.             writeln(1,"Starting Internet daemon...\n",80);
  769.             args[0]="@stginet";
  770.             args[1]=0;
  771.             if (_fork(*args+1,args,environ)==ERR)
  772.                 exit(syserr("fork %s: %m",*args+1));
  773.  
  774.             sleep(3);
  775.         }
  776.  
  777.         writeln(1,"Starting postman...\n",80);
  778.         args[0]="@postman";
  779.         args[1]=0;
  780.         if (_fork(*args+1,args,environ)==ERR)
  781.             exit(syserr("fork %s: %m",*args+1));
  782.  
  783.         sleep(3);
  784.     }
  785. }
  786.