home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 1999 March B / SCO_CASTOR4RRT.iso / inet / root.2 / usr / lib / scoadmin / netosa / dnsOsa / dnsOsa~
Text File  |  1998-08-19  |  123KB  |  4,721 lines

  1.  
  2. # Copyright (c) 1992-1998 The Santa Cruz Operation, Inc.. All Rights Reserved. 
  3. #                                                                         
  4. #        THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF THE               
  5. #                   SANTA CRUZ OPERATION INC.                             
  6. #                                                                         
  7. #   The copyright notice above does not evidence any actual or intended   
  8. #   publication of such source code.                                      
  9.  
  10. #******************************************************************************
  11. #
  12. #    Copyright (C) 1992-1998 The Santa Cruz Operation, Inc.
  13. #        All Rights Reserved.
  14. #
  15. #    The information in this file is provided for the exclusive use of
  16. #    the licensees of The Santa Cruz Operation, Inc.  Such users have the
  17. #    right to use, modify, and incorporate this code into other products
  18. #    for purposes authorized by the license agreement provided they include
  19. #    this notice and the associated copyright notice with any such product.
  20. #    The information in this file is provided "AS IS" without warranty.
  21. #
  22. #===============================================================================
  23. #@package: SCO_DNSOSA_MSGS SCO_DNSOSA_MSGS
  24. proc SCO_DNSOSA_MSGS {} {}
  25. global SCO_DNSOSA_MSGS
  26. set SCO_DNSOSA_MSGS(@catalog@) {dnsOsa.cat@sa 1}
  27. set SCO_DNSOSA_MSGS(MSG_HELPBOOK) {1 NetAdminG}
  28. set SCO_DNSOSA_MSGS(ERR_UNIX) {2 %s}
  29. set SCO_DNSOSA_MSGS(ERR_ATTRIBUTE) {3 {Attribute %1$s must be specified for operation %2$s}}
  30. set SCO_DNSOSA_MSGS(ERR_FMT_BAD_LINE) {4 {file format: %1$s: bad line %2$s}}
  31. set SCO_DNSOSA_MSGS(ERR_FMT_BAD_DIR) {5 {file format: bad directory %s}}
  32. set SCO_DNSOSA_MSGS(ERR_FMT_BAD_CACHE) {6 {file format: bad cache line %s}}
  33. set SCO_DNSOSA_MSGS(ERR_MV) {7 {could not move %1$s to %2$s}}
  34. set SCO_DNSOSA_MSGS(ERR_CP) {8 {could not copy %1$s to %2$s}}
  35. set SCO_DNSOSA_MSGS(ERR_ILLEGAL) {9 {%1$s: bad index %2$s}}
  36. set SCO_DNSOSA_MSGS(ERR_BAD_ADDR) {10 { bad address %s}}
  37. set SCO_DNSOSA_MSGS(ERR_NO_CACHE) {11 {no cache defined in named.boot}}
  38. set SCO_DNSOSA_MSGS(ERR_OPEN_WR) {12 {cannot open write to file %s}}
  39. set SCO_DNSOSA_MSGS(ERR_OPEN_RD) {13 {cannot open read from file %s}}
  40. set SCO_DNSOSA_MSGS(ERR_MULT_SOA) {14 {%s: multiple SOA records!}}
  41. set SCO_DNSOSA_MSGS(ERR_BAD_SOA) {15 {%s: bad SOA record}}
  42. set SCO_DNSOSA_MSGS(ERR_BAD_LINE) {16 {bad line %s}}
  43. set SCO_DNSOSA_MSGS(ERR_RM_LAST_ADDR) {17 {%s: cannot remove last address}}
  44. set SCO_DNSOSA_MSGS(ERR_NO_ADDR) {18 {no address %1$s for %2$s}}
  45. set SCO_DNSOSA_MSGS(ERR_NO_ALIAS) {19 {no alias %1$s for %2$s}}
  46. set SCO_DNSOSA_MSGS(ERR_NO_MX) {20 {no mx record %1$s for %2$s}}
  47. set SCO_DNSOSA_MSGS(ERR_NO_RP) {21 {no rp record %1$s for %2$s}}
  48. set SCO_DNSOSA_MSGS(ERR_NO_TXT) {22 {no txt record %1$s for %2$s}}
  49. set SCO_DNSOSA_MSGS(ERR_NO_HINFO) {23 {no hinfo record %1$s for %2$s}}
  50. set SCO_DNSOSA_MSGS(ERR_HOSTS) {24 {hosts file supports one address per entry}}
  51. set SCO_DNSOSA_MSGS(ERR_NO_HOST) {25 {host was not specified}}
  52. set SCO_DNSOSA_MSGS(ERR_FILE) {26 {no such file %s}}
  53. set SCO_DNSOSA_MSGS(ERR_DOMAIN) {27 {no such domain %s}}
  54. set SCO_DNSOSA_MSGS(ERR_INVALID_ATTR) {28 {invalid naming attribute: %s}}
  55. set SCO_DNSOSA_MSGS(ERR_BAD_VAL) {29 {bad value %1$s for parameter %2$s}}
  56. set SCO_DNSOSA_MSGS(ERR_NO_PARAM) {30 {missing required parameter %s}}
  57. set SCO_DNSOSA_MSGS(ERR_SCOPE) {31 {scope type $s is not supported}}
  58. set SCO_DNSOSA_MSGS(MSG_TIME) {32 {year week day hour minute second}}
  59. set SCO_DNSOSA_MSGS(MSG_TIMES) {33 {years weeks days hours minutes seconds}}
  60. set sco_hostTabEntry_CDT(attributes) {
  61.     {
  62.         name
  63.         {
  64.             { validOperations {get} }
  65.             { validFilters {} }
  66.             { dataType {single} }
  67.         }
  68.     }
  69.     {
  70.         aliasList
  71.         {
  72.             { validOperations {get add remove replace} }
  73.             { validFilters {} }
  74.             { dataType {set} }
  75.         }
  76.     }
  77.     {
  78.         addrList
  79.         {
  80.             { validOperations {get add remove replace} }
  81.             { validFilters {} }
  82.             { dataType {set} }
  83.         }
  84.     }
  85.     {
  86.         comment
  87.         {
  88.             { validOperations {get replace} }
  89.             { validFilters {} }
  90.             { dataType {single} }
  91.         }
  92.     }
  93.     {
  94.         mxList
  95.         {
  96.             { validOperations {get replace add remove} }
  97.             { validFilters {} }
  98.             { dataType set }
  99.             { description {list of MX records per host} }
  100.         }
  101.     }
  102.     {
  103.         rpList
  104.         {
  105.             { validOperations {get replace add remove} }
  106.             { validFilters {} }
  107.             { dataType set }
  108.             { description {list of RP records per host} }
  109.         }
  110.     }
  111.     {
  112.         txtList
  113.         {
  114.             { validOperations {get replace add remove} }
  115.             { validFilters {} }
  116.             { dataType set }
  117.             { description {list of TXT records per host} }
  118.         }
  119.     }
  120.     {
  121.         hinfoList
  122.         {
  123.             { validOperations {get replace add remove} }
  124.             { validFilters {} }
  125.             { dataType set }
  126.             { description {list of HINFO records per host} }
  127.         }
  128.     }
  129. }
  130. set sco_hostTabEntry_CDT(groups) {}
  131. set sco_hostTabEntry_CDT(operations) {
  132.     {
  133.         get
  134.         {
  135.             { function {hostTabEntry_get} }
  136.             { granularity {perAttribute} }
  137.         }
  138.     }
  139.     {
  140.         replace
  141.         {
  142.             { function {hostTabEntry_replace} }
  143.             { granularity {perAttribute} }
  144.         }
  145.     }
  146.     {
  147.         add
  148.         {
  149.             { function {hostTabEntry_add} }
  150.             { granularity {perAttribute} }
  151.         }
  152.     }
  153.     {
  154.         remove
  155.         {
  156.             { function {hostTabEntry_remove} }
  157.             { granularity {perAttribute} }
  158.         }
  159.     }
  160.     {
  161.         create
  162.         {
  163.             { function {hostTabEntry_create} }
  164.             { granularity {perObject} }
  165.         }
  166.     }
  167.     {
  168.         delete
  169.         {
  170.             { function {hostTabEntry_delete} }
  171.             { granularity {perObject} }
  172.         }
  173.     }
  174.     {
  175.         list
  176.         {
  177.             { function {hostTabEntry_list} }
  178.             { granularity {perObject} }
  179.         }
  180.     }
  181. }
  182. set sco_hostTabEntry_CDT(class) {sco hostTabEntry}
  183. set sco_hostTabEntry_CDT(superior) {sco hostTab}
  184. set sco_hostTabEntry_CDT(subordinates) {}
  185. set sco_dNSystem_CDT(attributes) {
  186.     {
  187.         name
  188.         {
  189.             { validOperations {get} }
  190.             { validFilters {} }
  191.             { dataType {single} }
  192.         }
  193.     }
  194.     {
  195.         dNSMode
  196.         {
  197.             { validOperations {get replace} }
  198.             { validFilters {} }
  199.             { dataType {single} }
  200.         }
  201.     }
  202.     {
  203.         dNSForwarders
  204.         {
  205.             { validOperations {get add remove replace} }
  206.             { validFilters {} }
  207.             { dataType {set} }
  208.             { description {forwarders entries
  209. from named.boot} }
  210.         }
  211.     }
  212.     {
  213.         dNSBogusns
  214.         {
  215.             { validOperations {get add remove replace} }
  216.             { validFilters {} }
  217.             { dataType {set} }
  218.             { description {bogusns entries from named.boot} }
  219.         }
  220.     }
  221.     {
  222.         dNSXfrnets
  223.         {
  224.             { validOperations {get add remove replace} }
  225.             { validFilters {} }
  226.             { dataType {set} }
  227.             { description {xfrnets entries from named.boot} }
  228.         }
  229.     }
  230.     {
  231.         dNSSortlist
  232.         {
  233.             { validOperations {get add remove replace} }
  234.             { validFilters {} }
  235.             { dataType {set} }
  236.             { description {sortlist entries from named.boot} }
  237.         }
  238.     }
  239.     {
  240.         slave
  241.         {
  242.             { validOperations {get replace} }
  243.             { validFilters {} }
  244.             { dataType {single} }
  245.             { description {slave entry from named.boot -- options forward-only} }
  246.         }
  247.     }
  248.     {
  249.         OptsNoRecursion
  250.         {
  251.             { validOperations {get replace} }
  252.             { validFilters {} }
  253.             { dataType {single} }
  254.             { description {options no-recursion entry from named.boot} }
  255.         }
  256.     }
  257.     {
  258.         OptsQueryLog
  259.         {
  260.             { validOperations {get replace} }
  261.             { validFilters {} }
  262.             { dataType {single} }
  263.             { description {options query-log entry from named.boot} }
  264.         }
  265.     }
  266.     {
  267.         OptsFetchGlue
  268.         {
  269.             { validOperations {get replace} }
  270.             { validFilters {} }
  271.             { dataType {single} }
  272.             { description {options no-fetch-glue entry from named.boot} }
  273.         }
  274.     }
  275.     {
  276.         XferIn
  277.         {
  278.             { validOperations {get replace} }
  279.             { validFilters {} }
  280.             { dataType {single} }
  281.             { description {limits transfers-in entry from named.boot} }
  282.         }
  283.     }
  284.     {
  285.         XferPerNs
  286.         {
  287.             { validOperations {get replace} }
  288.             { validFilters {} }
  289.             { dataType {single} }
  290.             { description {limits transfers-per ns entry from named.boot} }
  291.         }
  292.     }
  293.     {
  294.         XferDatasize
  295.         {
  296.             { validOperations {get replace} }
  297.             { validFilters {} }
  298.             { dataType {single} }
  299.             { description {limits transfers-datasize entry from named.boot} }
  300.         }
  301.     }
  302.     {
  303.         dNSResolvers
  304.         {
  305.             { validOperations {get add remove replace} }
  306.             { validFilters {} }
  307.             { dataType {set} }
  308.             { description {nameserver entries from resolv.conf} }
  309.         }
  310.     }
  311.     {
  312.         domain
  313.         {
  314.             { validOperations {get replace} }
  315.             { validFilters {} }
  316.             { dataType single }
  317.             { description {local domain name
  318. from resolv.conf} }
  319.         }
  320.     }
  321.     {
  322.         hostresorder
  323.         {
  324.             { validOperations {get replace} }
  325.             { validFilters {} }
  326.             { dataType single }
  327.             { description {hostresorder from
  328. resolv.conf} }
  329.         }
  330.     }
  331.     {
  332.         search
  333.         {
  334.             { validOperations {get replace} }
  335.             { validFilters {} }
  336.             { dataType single }
  337.             { description {search list for hostname lookup from resolv.conf} }
  338.         }
  339.     }
  340.     {
  341.         resSortlist
  342.         {
  343.             { validOperations {get replace} }
  344.             { validFilters {} }
  345.             { dataType single }
  346.             { description {sortlist from resolv.conf} }
  347.         }
  348.     }
  349. }
  350. set sco_dNSystem_CDT(groups) {}
  351. set sco_dNSystem_CDT(operations) {
  352.     {
  353.         get
  354.         {
  355.             { function {dNSystem_get} }
  356.             { granularity {perAttribute} }
  357.         }
  358.     }
  359.     {
  360.         replace
  361.         {
  362.             { function {dNSystem_replace} }
  363.             { granularity {perAttribute} }
  364.         }
  365.     }
  366.     {
  367.         add
  368.         {
  369.             { function {dNSystem_add} }
  370.             { granularity {perAttribute} }
  371.         }
  372.     }
  373.     {
  374.         remove
  375.         {
  376.             { function {dNSystem_remove} }
  377.             { granularity {perAttribute} }
  378.         }
  379.     }
  380.     {
  381.         action
  382.         {
  383.             { function dNSystem_action }
  384.             { granularity perObject }
  385.         }
  386.     }
  387. }
  388. set sco_dNSystem_CDT(class) {sco dNSystem}
  389. set sco_dNSystem_CDT(superior) {}
  390. set sco_dNSystem_CDT(subordinates) {{sco dNSPrimary} {sco dNSSecondary} {sco dNSStub} {sco dNSHint}}
  391. set sco_hostTabs_CDT(attributes) {
  392.     {
  393.         name
  394.         {
  395.             { validOperations {get} }
  396.             { validFilters {} }
  397.             { dataType {single} }
  398.         }
  399.     }
  400. }
  401. set sco_hostTabs_CDT(groups) {}
  402. set sco_hostTabs_CDT(operations) {
  403.     {
  404.         get
  405.         {
  406.             { function {hostTabs_get} }
  407.             { granularity {perAttribute} }
  408.         }
  409.     }
  410. }
  411. set sco_hostTabs_CDT(class) {sco hostTabs}
  412. set sco_hostTabs_CDT(superior) {}
  413. set sco_hostTabs_CDT(subordinates) {{sco hostTab}}
  414. set sco_dNSStub_CDT(attributes) {
  415.     {
  416.         name
  417.         {
  418.             { validOperations {get} }
  419.             { validFilters {} }
  420.             { dataType {single} }
  421.         }
  422.     }
  423.     {
  424.         serverList
  425.         {
  426.             { validOperations {get add remove replace} }
  427.             { validFilters {} }
  428.             { dataType {set} }
  429.         }
  430.     }
  431.     {
  432.         file
  433.         {
  434.             { validOperations {get replace} }
  435.             { validFilters {} }
  436.             { dataType {single} }
  437.         }
  438.     }
  439. }
  440. set sco_dNSStub_CDT(groups) {}
  441. set sco_dNSStub_CDT(operations) {
  442.     {
  443.         get
  444.         {
  445.             { function {dNSStub_get} }
  446.             { granularity {perAttribute} }
  447.         }
  448.     }
  449.     {
  450.         add
  451.         {
  452.             { function {dNSStub_add} }
  453.             { granularity {perAttribute} }
  454.         }
  455.     }
  456.     {
  457.         replace
  458.         {
  459.             { function {dNSStub_replace} }
  460.             { granularity {perAttribute} }
  461.         }
  462.     }
  463.     {
  464.         remove
  465.         {
  466.             { function {dNSStub_remove} }
  467.             { granularity {perAttribute} }
  468.         }
  469.     }
  470.     {
  471.         create
  472.         {
  473.             { function {dNSStub_create} }
  474.             { granularity {perObject} }
  475.         }
  476.     }
  477.     {
  478.         delete
  479.         {
  480.             { function {dNSStub_delete} }
  481.             { granularity {perObject} }
  482.         }
  483.     }
  484.     {
  485.         list
  486.         {
  487.             { function {dNSStub_list} }
  488.             { granularity {perObject} }
  489.         }
  490.     }
  491. }
  492. set sco_dNSStub_CDT(class) {sco dNSStub}
  493. set sco_dNSStub_CDT(superior) {sco dNSystem}
  494. set sco_dNSStub_CDT(subordinates) {}
  495. set sco_hostTab_CDT(attributes) {
  496.     {
  497.         name
  498.         {
  499.             { validOperations {get} }
  500.             { validFilters {} }
  501.             { dataType {single} }
  502.         }
  503.     }
  504. }
  505. set sco_hostTab_CDT(groups) {}
  506. set sco_hostTab_CDT(operations) {
  507.     {
  508.         get
  509.         {
  510.             { function {hostTab_get} }
  511.             { granularity {perAttribute} }
  512.         }
  513.     }
  514.     {
  515.         list
  516.         {
  517.             { function {hostTab_list} }
  518.             { granularity {perObject} }
  519.         }
  520.     }
  521. }
  522. set sco_hostTab_CDT(class) {sco hostTab}
  523. set sco_hostTab_CDT(superior) {sco hostTabs}
  524. set sco_hostTab_CDT(subordinates) {{sco hostTabEntry}}
  525. set sco_dNSSecondary_CDT(attributes) {
  526.     {
  527.         name
  528.         {
  529.             { validOperations {get} }
  530.             { validFilters {} }
  531.             { dataType {single} }
  532.         }
  533.     }
  534.     {
  535.         serverList
  536.         {
  537.             { validOperations {get add remove replace} }
  538.             { validFilters {} }
  539.             { dataType {set} }
  540.         }
  541.     }
  542.     {
  543.         file
  544.         {
  545.             { validOperations {get replace} }
  546.             { validFilters {} }
  547.             { dataType {single} }
  548.         }
  549.     }
  550. }
  551. set sco_dNSSecondary_CDT(groups) {}
  552. set sco_dNSSecondary_CDT(operations) {
  553.     {
  554.         get
  555.         {
  556.             { function {dNSSecondary_get} }
  557.             { granularity {perAttribute} }
  558.         }
  559.     }
  560.     {
  561.         add
  562.         {
  563.             { function {dNSSecondary_add} }
  564.             { granularity {perAttribute} }
  565.         }
  566.     }
  567.     {
  568.         replace
  569.         {
  570.             { function {dNSSecondary_replace} }
  571.             { granularity {perAttribute} }
  572.         }
  573.     }
  574.     {
  575.         remove
  576.         {
  577.             { function {dNSSecondary_remove} }
  578.             { granularity {perAttribute} }
  579.         }
  580.     }
  581.     {
  582.         create
  583.         {
  584.             { function {dNSSecondary_create} }
  585.             { granularity {perObject} }
  586.         }
  587.     }
  588.     {
  589.         delete
  590.         {
  591.             { function {dNSSecondary_delete} }
  592.             { granularity {perObject} }
  593.         }
  594.     }
  595.     {
  596.         list
  597.         {
  598.             { function {dNSSecondary_list} }
  599.             { granularity {perObject} }
  600.         }
  601.     }
  602. }
  603. set sco_dNSSecondary_CDT(class) {sco dNSSecondary}
  604. set sco_dNSSecondary_CDT(superior) {sco dNSystem}
  605. set sco_dNSSecondary_CDT(subordinates) {}
  606. set sco_dNSHint_CDT(attributes) {
  607.     {
  608.         name
  609.         {
  610.             { validOperations {get} }
  611.             { validFilters {} }
  612.             { dataType {single} }
  613.         }
  614.     }
  615.     {
  616.         addrList
  617.         {
  618.             { validOperations {get add remove replace} }
  619.             { validFilters {} }
  620.             { dataType {set} }
  621.         }
  622.     }
  623.     {
  624.         comment
  625.         {
  626.             { validOperations {get replace} }
  627.             { validFilters {} }
  628.             { dataType {single} }
  629.         }
  630.     }
  631. }
  632. set sco_dNSHint_CDT(groups) {}
  633. set sco_dNSHint_CDT(operations) {
  634.     {
  635.         get
  636.         {
  637.             { function {dNSHint_get} }
  638.             { granularity {perAttribute} }
  639.         }
  640.     }
  641.     {
  642.         replace
  643.         {
  644.             { function {dNSHint_replace} }
  645.             { granularity {perAttribute} }
  646.         }
  647.     }
  648.     {
  649.         create
  650.         {
  651.             { function {dNSHint_create} }
  652.             { granularity {perObject} }
  653.         }
  654.     }
  655.     {
  656.         delete
  657.         {
  658.             { function {dNSHint_delete} }
  659.             { granularity {perObject} }
  660.         }
  661.     }
  662.     {
  663.         add
  664.         {
  665.             { function {dNHint_add} }
  666.             { granularity {perAttribute} }
  667.         }
  668.     }
  669.     {
  670.         remove
  671.         {
  672.             { function {dNHint_remove} }
  673.             { granularity {perAttribute} }
  674.         }
  675.     }
  676.     {
  677.         list
  678.         {
  679.             { function {dNSHint_list} }
  680.             { granularity {perObject} }
  681.         }
  682.     }
  683. }
  684. set sco_dNSHint_CDT(class) {sco dNSHint}
  685. set sco_dNSHint_CDT(superior) {sco dNSystem}
  686. set sco_dNSHint_CDT(subordinates) {}
  687. set sco_dNSPrimary_CDT(attributes) {
  688.     {
  689.         name
  690.         {
  691.             { validOperations {get} }
  692.             { validFilters {} }
  693.             { dataType {single} }
  694.         }
  695.     }
  696.     {
  697.         file
  698.         {
  699.             { validOperations {get replace} }
  700.             { validFilters {} }
  701.             { dataType {single} }
  702.         }
  703.     }
  704.     {
  705.         mailbox
  706.         {
  707.             { validOperations {get replace} }
  708.             { validFilters {} }
  709.             { dataType {single} }
  710.         }
  711.     }
  712.     {
  713.         serial
  714.         {
  715.             { validOperations {get replace} }
  716.             { validFilters {} }
  717.             { dataType single }
  718.             { description {Serial number for zone} }
  719.         }
  720.     }
  721.     {
  722.         refresh
  723.         {
  724.             { validOperations {get replace} }
  725.             { validFilters {} }
  726.             { dataType {single} }
  727.         }
  728.     }
  729.     {
  730.         retry
  731.         {
  732.             { validOperations {get replace} }
  733.             { validFilters {} }
  734.             { dataType {single} }
  735.         }
  736.     }
  737.     {
  738.         expire
  739.         {
  740.             { validOperations {get replace} }
  741.             { validFilters {} }
  742.             { dataType {single} }
  743.         }
  744.     }
  745.     {
  746.         minimum
  747.         {
  748.             { validOperations {get replace} }
  749.             { validFilters {} }
  750.             { dataType {single} }
  751.         }
  752.     }
  753.     {
  754.         serverList
  755.         {
  756.             { validOperations {get replace add remove} }
  757.             { validFilters {} }
  758.             { dataType set }
  759.         }
  760.     }
  761. }
  762. set sco_dNSPrimary_CDT(groups) {}
  763. set sco_dNSPrimary_CDT(operations) {
  764.     {
  765.         get
  766.         {
  767.             { function {dNSPrimary_get} }
  768.             { granularity {perAttribute} }
  769.         }
  770.     }
  771.     {
  772.         replace
  773.         {
  774.             { function {dNSPrimary_replace} }
  775.             { granularity {perAttribute} }
  776.         }
  777.     }
  778.     {
  779.         create
  780.         {
  781.             { function {dNSPrimary_create} }
  782.             { granularity {perObject} }
  783.         }
  784.     }
  785.     {
  786.         delete
  787.         {
  788.             { function {dNSPrimary_delete} }
  789.             { granularity {perObject} }
  790.         }
  791.     }
  792.     {
  793.         list
  794.         {
  795.             { function {dNSPrimary_list} }
  796.             { granularity {perObject} }
  797.         }
  798.     }
  799.     {
  800.         add
  801.         {
  802.             { granularity perObject }
  803.             { function dNSPrimary_add }
  804.         }
  805.     }
  806.     {
  807.         remove
  808.         {
  809.             { granularity perObject }
  810.             { function dNSPrimary_remove }
  811.         }
  812.     }
  813. }
  814. set sco_dNSPrimary_CDT(class) {sco dNSPrimary}
  815. set sco_dNSPrimary_CDT(superior) {sco dNSystem}
  816. set sco_dNSPrimary_CDT(subordinates) {}
  817. proc Resolv:CreateScancontext {} {
  818.     global resolv_scontext
  819.     set resolv_scontext [scancontext create]
  820.     scanmatch $resolv_scontext {^} {
  821.         global resolv_lines resolv_lineindexes
  822.         set lineindex $matchInfo(handle).$matchInfo(linenum)
  823.         lappend resolv_lineindexes $lineindex
  824.         set resolv_lines($lineindex) $matchInfo(line)
  825.     }
  826.     scanmatch $resolv_scontext {(^[     ]*;)|(^[     ]*$)} {
  827.         continue
  828.     }
  829.     scanmatch -nocase $resolv_scontext {^[     ]*nameserver[     ]} {
  830.         global resolv_servers
  831.         if { ! [regsub {;.*$} $matchInfo(line) {} line]} {
  832.             set line $matchInfo(line)
  833.         }
  834.         if {[llength $line] != 2} {
  835.             ErrorPush {} 1 SCO_DNSOSA_ERR_FMT_BAD_LINE \
  836.                 [list $filename $line]
  837.         } else {
  838.             set resolv_servers($lineindex) [lindex $line 1]
  839.         }
  840.         continue
  841.     }
  842.     scanmatch -nocase $resolv_scontext {^[     ]*domain[     ]} {
  843.         global resolv_domain
  844.         if { ! [regsub {;.*$} $matchInfo(line) {} line]} {
  845.             set line $matchInfo(line)
  846.         }
  847.         if {[llength $line] != 2} {
  848.             ErrorPush {} 1 SCO_DNSOSA_ERR_FMT_BAD_LINE \
  849.                 [list $filename $line]
  850.         } else {
  851.             set resolv_domain($lineindex) [lindex $line 1]
  852.         }
  853.         continue
  854.     }
  855.     scanmatch -nocase $resolv_scontext {^[     ]*hostresorder[     ]} {
  856.         global resolv_hostresorder
  857.         if { ! [regsub {;.*$} $matchInfo(line) {} line]} {
  858.             set line $matchInfo(line)
  859.         }
  860.         if {[llength $line] < 2} {
  861.             ErrorPush {} 1 SCO_DNSOSA_ERR_FMT_BAD_LINE \
  862.                 [list $filename $line]
  863.         } else {
  864.             set resolv_hostresorder($lineindex) [lrange $line 1 end]
  865.         }
  866.         continue
  867.     }
  868.     scanmatch -nocase $resolv_scontext {^[     ]*search[     ]} {
  869.         global resolv_search
  870.         if { ! [regsub {;.*$} $matchInfo(line) {} line]} {
  871.             set line $matchInfo(line)
  872.         }
  873.         if {[llength $line] < 2} {
  874.             ErrorPush {} 1 SCO_DNSOSA_ERR_FMT_BAD_LINE \
  875.                 [list $filename $line]
  876.         } else {
  877.             set resolv_search($lineindex) [lrange $line 1 end]
  878.         }
  879.         continue
  880.     }
  881.     scanmatch -nocase $resolv_scontext {^[     ]*sortlist[     ]} {
  882.         global resolv_sortlist
  883.         if { ! [regsub {;.*$} $matchInfo(line) {} line]} {
  884.             set line $matchInfo(line)
  885.         }
  886.         if {[llength $line] < 2} {
  887.             ErrorPush {} 1 SCO_DNSOSA_ERR_FMT_BAD_LINE \
  888.                 [list $filename $line]
  889.         } else {
  890.             set resolv_sortlist($lineindex) [lrange $line 1 end]
  891.         }
  892.         continue
  893.     }
  894. }
  895. proc resolv_addline {before line} {
  896.     global resolv_lines resolv_lineindexes resolv_newindex resolv_modified
  897.     if {$before == "end"} {
  898.         set index [llength $resolv_lineindexes]
  899.     } else {
  900.         if {[set index [lsearch $resolv_lineindexes $before]] == -1} {
  901.             ErrorPush {} 1 SCO_DNSOSA_ERR_ILLEGAL \
  902.             [list "resolv_addline" $before]
  903.         }
  904.     }
  905.     set newindex new.$resolv_newindex
  906.     set resolv_lineindexes [linsert $resolv_lineindexes $index $newindex]
  907.     set resolv_lines($newindex) $line
  908.     incr resolv_newindex
  909.     set resolv_modified 1
  910.     return $newindex
  911. }
  912. proc resolv_rmline {line} {
  913.     global resolv_lineindexes resolv_modified
  914.     if {[set index [lsearch -exact $resolv_lineindexes $line]] == -1} {
  915.         ErrorPush {} 1 SCO_DNSOSA_ERR_ILLEGAL [list "resolv_rmline" $line]
  916.     }
  917.     lvarpop resolv_lineindexes $index
  918.     set resolv_modified 1
  919. }
  920. proc list_resolvers {} {
  921.     global resolv_servers
  922.     if [catch {array names resolv_servers} linelist] {
  923.         return {}
  924.     }
  925.     set result {}
  926.     foreach line [lsort -command SortByLineNum $linelist] {
  927.         lappend result $resolv_servers($line)
  928.     }
  929.     return $result
  930. }
  931. proc rm_resolver {addr} {
  932.     global resolv_servers
  933.     if [catch {array names resolv_servers} linelist] {
  934.         return {}
  935.     }
  936.     foreach line $linelist {
  937.         if [addrmatch $addr $resolv_servers($line)] {
  938.             unset resolv_servers($line)
  939.             resolv_rmline $line
  940.         }
  941.     }
  942. }
  943. proc add_resolver {addr} {
  944.     global resolv_servers
  945.     set index [resolv_addline end "nameserver $addr"]
  946.     set resolv_servers($index) $addr
  947. }
  948. proc get_domain {} {
  949.     global resolv_domain
  950.     if [catch {array names resolv_domain} linelist] {
  951.         return {}
  952.     }
  953.     set result {}
  954.     foreach line $linelist {
  955.         lappend result $resolv_domain($line)
  956.     }
  957.     return $result
  958. }
  959. proc rm_domain {} {
  960.     global resolv_domain
  961.     if [catch {array names resolv_domain} linelist] {
  962.         return {}
  963.     }
  964.     foreach line $linelist {
  965.         unset resolv_domain($line)
  966.         resolv_rmline $line
  967.     }
  968. }
  969. proc set_domain {domain} {
  970.     global resolv_domain
  971.     set index [resolv_addline end "domain $domain"]
  972.     set resolv_domain($index) $domain
  973. }
  974. proc get_hostresorder {} {
  975.     global resolv_hostresorder
  976.     if [catch {array names resolv_hostresorder} linelist] {
  977.         return {}
  978.     }
  979.     set result {}
  980.     foreach line $linelist {
  981.         lappend result $resolv_hostresorder($line)
  982.     }
  983.     return $result
  984. }
  985. proc rm_hostresorder {} {
  986.     global resolv_hostresorder
  987.     if [catch {array names resolv_hostresorder} linelist] {
  988.         return {}
  989.     }
  990.     foreach line $linelist {
  991.         unset resolv_hostresorder($line)
  992.         resolv_rmline $line
  993.     }
  994. }
  995. proc set_hostresorder {hostresorder} {
  996.     global resolv_hostresorder
  997.     set index [resolv_addline end "hostresorder $hostresorder"]
  998.     set resolv_hostresorder($index) $hostresorder
  999. }
  1000. proc get_searchorder {} {
  1001.     global resolv_search
  1002.     if [catch {array names resolv_search} linelist] {
  1003.         return {}
  1004.     }
  1005.     set result {}
  1006.     foreach line $linelist {
  1007.         lappend result $resolv_search($line)
  1008.     }
  1009.     return $result
  1010. }
  1011. proc rm_searchorder {} {
  1012.     global resolv_search
  1013.     if [catch {array names resolv_search} linelist] {
  1014.         return {}
  1015.     }
  1016.     foreach line $linelist {
  1017.         unset resolv_search($line)
  1018.         resolv_rmline $line
  1019.     }
  1020. }
  1021. proc set_searchorder {searchorder} {
  1022.     global resolv_search
  1023.     set index [resolv_addline end "search $searchorder"]
  1024.     set resolv_search($index) $searchorder
  1025. }
  1026. proc get_resSortlist {} {
  1027.     global resolv_sortlist
  1028.     if [catch {array names resolv_sortlist} linelist] {
  1029.         return {}
  1030.     }
  1031.     set result {}
  1032.     foreach line $linelist {
  1033.         lappend result $resolv_sortlist($line)
  1034.     }
  1035.     return $result
  1036. }
  1037. proc rm_resSortlist {} {
  1038.     global resolv_sortlist
  1039.     if [catch {array names resolv_sortlist} linelist] {
  1040.         return {}
  1041.     }
  1042.     foreach line $linelist {
  1043.         unset resolv_sortlist($line)
  1044.         resolv_rmline $line
  1045.     }
  1046. }
  1047. proc set_resSortlist {sortlist} {
  1048.     global resolv_sortlist
  1049.     set index [resolv_addline end "sortlist $sortlist"]
  1050.     set resolv_sortlist($index) $sortlist
  1051. }
  1052. proc ResolverActive {} {
  1053.     global resolv_file 
  1054.     if {[owner file isfile $resolv_file]} {
  1055.         return 1
  1056.     } else {
  1057.         return 0
  1058.     }
  1059. }
  1060. proc resolv_writemode {} {
  1061.     global dns_selectedmode
  1062.     global resolv_file resolv_save resolv_modified
  1063.     case $dns_selectedmode {
  1064.         remote {
  1065.             if $resolv_modified {
  1066.                 resolv_writefile $resolv_file
  1067.                 backup_file $resolv_save
  1068.             } else {
  1069.                 if { ! [owner file isfile $resolv_file]} {
  1070.                     if [owner file isfile $resolv_save] {
  1071.                         move_file $resolv_save $resolv_file
  1072.                     } else {
  1073.                         user_error "no resolver file"
  1074.                     }
  1075.                 }
  1076.             }
  1077.         }
  1078.         delresolv {
  1079.             owner unlink -nocomplain $resolv_file
  1080.         }
  1081.         {off master caching} {
  1082.             if $resolv_modified {
  1083.                 resolv_writefile $resolv_save
  1084.             } else {
  1085.             }
  1086.         }
  1087.     }
  1088. }
  1089. proc resolv_readfile {filename} {
  1090.     global resolv_scontext resolv_modified resolv_newindex
  1091.     global resolv_lines resolv_lineindexes
  1092.     set infile [ownerOpen readfile $filename]
  1093.     if {$infile != -1} {
  1094.         scanfile $resolv_scontext $infile
  1095.         close $infile
  1096.     }
  1097.     set resolv_modified 0
  1098.     if [catch {set resolv_lineindexes}] {
  1099.         lappend resolv_lineindexes new.0
  1100.         set resolv_lines(new.0) ""
  1101.         set resolv_newindex 1
  1102.     } else {
  1103.         set resolv_newindex 0
  1104.     }
  1105. }
  1106. proc resolv_writefile {file} {
  1107.     global resolv_modified resolv_lines resolv_lineindexes
  1108.     if { ! $resolv_modified} {
  1109.         return
  1110.     }
  1111.     backup_file $file
  1112.     set outfile [ownerOpen writefile $file]
  1113.     if {$outfile == -1} {
  1114.         ErrorPush {} 1 SCO_DNSOSA_ERR_OPEN_WR $file
  1115.     }
  1116.     foreach line $resolv_lineindexes {
  1117.         puts $outfile $resolv_lines($line)
  1118.     }
  1119.     close $outfile
  1120. }
  1121. proc resolv_init {} {
  1122.     global IPAddrMap_ConfigDir
  1123.     global resolv_file resolv_save
  1124.     set resolv_file /etc/resolv.conf
  1125.     set resolv_save /etc/resolv.save
  1126.     Resolv:CreateScancontext
  1127.     if {[owner file isfile $resolv_file]} {
  1128.         resolv_readfile $resolv_file
  1129.     } else {
  1130.         resolv_readfile $resolv_save
  1131.     }
  1132. }
  1133. proc setup_boot_scancontexts {} {
  1134.     global boot_scontext
  1135.     set boot_scontext [scancontext create]
  1136.     scanmatch $boot_scontext {^} {
  1137.         global boot_lines boot_lineindexes
  1138.         set lineindex $matchInfo(handle).$matchInfo(linenum)
  1139.         lappend boot_lineindexes $lineindex
  1140.         set boot_lines($lineindex) $matchInfo(line)
  1141.     }
  1142.     scanmatch $boot_scontext {(^[     ]*;)|(^[     ]*$)} {
  1143.         continue
  1144.     }
  1145.     scanmatch -nocase $boot_scontext {^[     ]*directory[     ]} {
  1146.         global boot_directory
  1147.         if {[llength $matchInfo(line)] < 2} {
  1148.             ErrorPush {} 1 SCO_DNSOSA_ERR_FMT_BAD_DIR $matchInfo(line)
  1149.         } else {
  1150.             set boot_directory [lindex $matchInfo(line) 1]
  1151.         }
  1152.         continue
  1153.     }
  1154.     scanmatch -nocase $boot_scontext {^[     ]*cache[     ]} {
  1155.         global boot_caches
  1156.         if {([llength $matchInfo(line)] < 3)
  1157.             || (([lindex $matchInfo(line) 1] != ".")
  1158.             && ([lindex $matchInfo(line) 1] != ".."))} {
  1159.                 ErrorPush {} 1 SCO_DNSOSA_ERR_FMT_BAD_CACHE \
  1160.                     $matchInfo(line)
  1161.         }
  1162.         set boot_caches($lineindex) [lindex $matchInfo(line) 2]
  1163.         continue
  1164.     }
  1165.     scanmatch -nocase $boot_scontext {^[     ]*primary[     ]} {
  1166.         global boot_primaries boot_localhost
  1167.         if { ! [regsub {;.*$} $matchInfo(line) {} line]} {
  1168.             set line $matchInfo(line)
  1169.         }
  1170.         if {[llength $line] < 3} {
  1171.             ErrorPush {} 1 SCO_DNSOSA_ERR_BAD_LINE $matchInfo(line)
  1172.         }
  1173.         if [cequal [lindex $line 1] "0.0.127.in-addr.arpa"] {
  1174.             set boot_localhost $lineindex
  1175.         } else {
  1176.             set boot_primaries($lineindex) [lrange $line 1 2]
  1177.         }
  1178.         continue
  1179.     }
  1180.     scanmatch -nocase $boot_scontext {^[     ]*secondary[     ]} {
  1181.         global boot_secondaries
  1182.         if { ! [regsub {;.*$} $matchInfo(line) {} line]} {
  1183.             set line $matchInfo(line)
  1184.         }
  1185.         if {[llength $line] < 4} {
  1186.             ErrorPush {} 1 SCO_DNSOSA_ERR_BAD_LINE $line
  1187.         }
  1188.         set addrs {}
  1189.         set file {}
  1190.         foreach j [lrange $line 2 end] {
  1191.             if [string match {[0-9]*} $j] {
  1192.                 lappend addrs $j
  1193.             } else {
  1194.                 set file $j
  1195.             }
  1196.         }
  1197.         if { $addrs == {} } {
  1198.             ErrorPush {} 1 SCO_DNSOSA_ERR_BAD_LINE $matchInfo(line)
  1199.         }
  1200.         set boot_secondaries($lineindex) [list [lindex $line 1] $addrs $file]
  1201.         continue
  1202.     }
  1203.     scanmatch -nocase $boot_scontext {^[     ]*forwarders[     ]} {
  1204.         global boot_forwarders
  1205.         if [regsub {;.*$} $matchInfo(line) {} line] {
  1206.             set boot_forwarders($lineindex) [lrange $line 1 end]
  1207.         } else {
  1208.             set boot_forwarders($lineindex) [lrange $matchInfo(line) 1 end]
  1209.         }
  1210.         continue
  1211.     }
  1212.     scanmatch -nocase $boot_scontext {^[     ]*slave[     ]} {
  1213.         global boot_slave
  1214.         set boot_slave $lineindex
  1215.     }
  1216.     scanmatch -nocase $boot_scontext {^[     ]*sortlist[     ]} {
  1217.         global boot_sortlist
  1218.         if [regsub {;.*$} $matchInfo(line) {} line] {
  1219.             set boot_sortlist($lineindex) [lrange $line 1 end]
  1220.         } else {
  1221.             set boot_sortlist($lineindex) [lrange $matchInfo(line) 1 end]
  1222.         }
  1223.         continue
  1224.     }
  1225.     scanmatch -nocase $boot_scontext {^[     ]*xfrnets[     ]} {
  1226.         global boot_xfrnets
  1227.         if [regsub {;.*$} $matchInfo(line) {} line] {
  1228.             set boot_xfrnets($lineindex) [lrange $line 1 end]
  1229.         } else {
  1230.             set boot_xfrnets($lineindex) [lrange $matchInfo(line) 1 end]
  1231.         }
  1232.         continue
  1233.     }
  1234.     scanmatch -nocase $boot_scontext {^[     ]*bogusns[     ]} {
  1235.         global boot_bogusns
  1236.         if [regsub {;.*$} $matchInfo(line) {} line] {
  1237.             set boot_bogusns($lineindex) [lrange $line 1 end]
  1238.         } else {
  1239.             set boot_bogusns($lineindex) [lrange $matchInfo(line) 1 end]
  1240.         }
  1241.         continue
  1242.     }
  1243.     scanmatch -nocase $boot_scontext {^[     ]*options[     ]} {
  1244.         if [regsub -nocase {no-recursion} $matchInfo(line) {} line] {
  1245.         global boot_optsnorecursion
  1246.         set boot_optsnorecursion $lineindex
  1247.         } elseif [regsub -nocase {query-log} $matchInfo(line) {} line] {
  1248.         global boot_optsquerylog
  1249.         set boot_optsquerylog $lineindex
  1250.         } elseif [regsub -nocase {forward-only} $matchInfo(line) {} line] {
  1251.         global boot_slave
  1252.         set boot_slave $lineindex
  1253.         } elseif [regsub -nocase {no-fetch-glue} $matchInfo(line) {} line] {
  1254.         global boot_optsfetchglue
  1255.         set boot_optsfetchglue $lineindex
  1256.         }
  1257.     }
  1258.     scanmatch -nocase $boot_scontext {^[     ]*limits[     ]} {
  1259.         if [cequal [lindex $matchInfo(line) 1] transfers-in] {
  1260.         global boot_xferin
  1261.         set boot_xferin($lineindex) [lindex $matchInfo(line) end]
  1262.         } elseif [cequal [lindex $matchInfo(line) 1] transfers-per-ns] {
  1263.         global boot_xferperns
  1264.         set boot_xferperns($lineindex) [lindex $matchInfo(line) end]
  1265.         } elseif [cequal [lindex $matchInfo(line) 1] transfers-datasize] {
  1266.         global boot_xferdatasize
  1267.         set res [lindex $matchInfo(line) end]
  1268.         set boot_xferdatasize($lineindex) [string trimright $res mk]
  1269.         }
  1270.     }
  1271.     scanmatch -nocase $boot_scontext {^[     ]*stub[     ]} {
  1272.         global boot_stubs
  1273.         if { ! [regsub {;.*$} $matchInfo(line) {} line]} {
  1274.             set line $matchInfo(line)
  1275.         }
  1276.         if {[llength $line] < 3} {
  1277.             ErrorPush {} 1 SCO_DNSOSA_ERR_BAD_LINE $matchInfo(line)
  1278.         }
  1279.         set addrs {}
  1280.         set file {}
  1281.         foreach j [lrange $line 2 end] {
  1282.             if [string match {[0-9]*} $j] {
  1283.                 lappend addrs $j
  1284.             } else {
  1285.                 set file $j
  1286.             }
  1287.         }
  1288.         if { $addrs == {} } {
  1289.             ErrorPush {} 1 SCO_DNSOSA_ERR_BAD_LINE $matchInfo(line)
  1290.         }
  1291.         set boot_stubs($lineindex) [list [lindex $line 1] $addrs $file]
  1292.         continue
  1293.     }
  1294. }
  1295. proc boot_addline {before line} {
  1296.     global boot_lines boot_lineindexes boot_newindex boot_modified
  1297.     if {$before == "end"} {
  1298.         set index [llength $boot_lineindexes]
  1299.     } else {
  1300.         if {[set index [lsearch $boot_lineindexes $before]] == -1} {
  1301.             ErrorPush {} 1 SCO_DNSOSA_ERR_ILLEGAL \
  1302.             [list "boot_addline" $before]
  1303.         }
  1304.     }
  1305.     set newindex new.$boot_newindex
  1306.     set boot_lineindexes [linsert $boot_lineindexes $index $newindex]
  1307.     set boot_lines($newindex) $line
  1308.     incr boot_newindex
  1309.     set boot_modified 1
  1310.     return $newindex
  1311. }
  1312. proc boot_rmline {line} {
  1313.     global boot_lineindexes boot_modified
  1314.     if {[set index [lsearch -exact $boot_lineindexes $line]] == -1} {
  1315.         ErrorPush {} 1 SCO_DNSOSA_ERR_ILLEGAL \
  1316.         [list "boot_rmline" $line]
  1317.     }
  1318.     lvarpop boot_lineindexes $index
  1319.     set boot_modified 1
  1320. }
  1321. proc list_primaries {} {
  1322.     global boot_primaries
  1323.     set result {}
  1324.     if [catch {array names boot_primaries} linelist] {
  1325.         return {}
  1326.     }
  1327.     foreach line [lsort -command SortByLineNum $linelist] {
  1328.         lappend result [lindex $boot_primaries($line) 0]
  1329.     }
  1330.     return $result
  1331. }
  1332. proc find_primary {name} {
  1333.     global boot_primaries
  1334.     if [catch {array names boot_primaries} linelist] {
  1335.         return {}
  1336.     }
  1337.     foreach line $linelist {
  1338.         if {[lindex $boot_primaries($line) 0] == $name} {
  1339.             return $line
  1340.         }
  1341.     }
  1342.     return {}
  1343. }
  1344. proc get_rrfile {domname} {
  1345.     global boot_primaries
  1346.     if {[set line [find_primary $domname]] == {} } {
  1347.         return {}
  1348.     }
  1349.     return [dns_locate [lindex $boot_primaries($line) 1]]
  1350. }
  1351. proc rm_primary {name} {
  1352.     global boot_primaries
  1353.     if {[set line [find_primary $name]] == {} } {
  1354.         ErrorPush {} 1 SCO_OSA_ERR_NO_SUCH_OBJECT_INSTANCE "$name"
  1355.     }
  1356.     set fpath [get_rrfile $name]
  1357.     unset boot_primaries($line)
  1358.     boot_rmline $line
  1359.     if {[owner file exists $fpath]} {
  1360.         owner unlink -nocomplain $fpath
  1361.     }
  1362. }
  1363. proc add_primary {name filename serverList mailbox serial refresh retry expire minimum} {
  1364.     global boot_primaries
  1365.     if {([find_primary $name] != {}) || ([find_secondary $name] != {})\
  1366.          || ([find_stub $name] != {}) } {
  1367.          ErrorPush {} 1 SCO_OSA_ERR_DUPLICATE_MANAGED_OBJECT_INSTANCE "$name"
  1368.     }
  1369.     set line "primary    $name    $filename"
  1370.     set index [boot_addline end $line]
  1371.     set boot_primaries($index) [lrange $line 1 2]
  1372.     dns_makefile $filename $mailbox $serial $refresh $retry $expire $minimum
  1373.     dns_readfile $name $filename
  1374.     foreach server $serverList {
  1375.         dns_addserver $name [lindex $server 0] [lindex $server 1] {}
  1376.     }
  1377.     dns_writefile
  1378. }
  1379. proc change_rrfile {domname newname} {
  1380.     global boot_primaries boot_lines boot_modified
  1381.     if {[set line [find_primary $domname]] == {} } {
  1382.         return {}
  1383.     }
  1384.     set boot_primaries($line) [lreplace $boot_primaries($line) 1 1 $newname]
  1385.     set boot_lines($line) [lreplace $boot_lines($line) 2 2 $newname]
  1386.     set boot_modified 1
  1387. }
  1388. proc list_secondaries {} {
  1389.     global boot_secondaries
  1390.     set result {}
  1391.     if [catch {array names boot_secondaries} linelist] {
  1392.         return {}
  1393.     }
  1394.     foreach line [lsort -command SortByLineNum $linelist] {
  1395.         lappend result [lindex $boot_secondaries($line) 0]
  1396.     }
  1397.     return $result
  1398. }
  1399. proc find_secondary {name} {
  1400.     global boot_secondaries
  1401.     if [catch {array names boot_secondaries} linelist] {
  1402.         return {}
  1403.     }
  1404.     foreach line $linelist {
  1405.         if {[lindex $boot_secondaries($line) 0] == $name} {
  1406.             return $line
  1407.         }
  1408.     }
  1409.     return {}
  1410. }
  1411. proc get_secondary {name} {
  1412.     global boot_secondaries
  1413.     if {[set line [find_secondary $name]] == {} } {
  1414.         ErrorPush {} 1 SCO_OSA_ERR_NO_SUCH_OBJECT_INSTANCE "$name"
  1415.     }
  1416.     return [lrange $boot_secondaries($line) 1 end]
  1417. }
  1418. proc add_secondary {name servers backup} {
  1419.     global boot_secondaries
  1420.     if {([find_primary $name] != {}) || ([find_secondary $name] != {})\
  1421.          || ([find_stub $name] != {}) } {
  1422.          ErrorPush {} 1 SCO_OSA_ERR_DUPLICATE_MANAGED_OBJECT_INSTANCE "$name"
  1423.     }
  1424.     if {$backup != {}} {
  1425.         set index [boot_addline end "secondary    $name    $servers    $backup"]
  1426.     } else {
  1427.         set index [boot_addline end "secondary    $name    $servers"]
  1428.     }
  1429.     set boot_secondaries($index) [list $name $servers $backup]
  1430. }
  1431. proc rm_secondary {name} {
  1432.     global boot_secondaries
  1433.     if {[set line [find_secondary $name]] == {} } {
  1434.         ErrorPush {} 1 SCO_OSA_ERR_NO_SUCH_OBJECT_INSTANCE "$name"
  1435.     }
  1436.     dns_del_file [lindex $boot_secondaries($line) end]
  1437.     boot_rmline $line
  1438.     unset boot_secondaries($line)
  1439. }
  1440. proc dns_del_file {file} {
  1441.     global boot_directory
  1442.     set fpath [format "%s/%s" $boot_directory $file]
  1443.     if {[owner file exists $fpath]} {
  1444.         owner unlink -nocomplain $fpath
  1445.     }
  1446. }
  1447. proc sec_addserver {name addr} {
  1448.     global boot_secondaries boot_modified boot_lines
  1449.     if {[set line [find_secondary $name]] == {} } {
  1450.         ErrorPush {} 1 SCO_OSA_ERR_NO_SUCH_OBJECT_INSTANCE "$name"
  1451.     }
  1452.     set addrlist [lindex $boot_secondaries($line) 1]
  1453.     foreach j $addrlist {
  1454.         if [addrmatch $j $addr] {
  1455.             return
  1456.         }
  1457.     }
  1458.     set addrlist [concat $addr $addrlist]
  1459.     set boot_secondaries($line) [lreplace $boot_secondaries($line) 1 1 $addrlist]
  1460.     set boot_lines($line) [linsert $boot_lines($line) 2 $addr]
  1461.     set boot_modified 1
  1462. }
  1463. proc sec_rmserver {name addr} {
  1464.     global boot_secondaries boot_modified boot_lines
  1465.     if {[set line [find_secondary $name]] == {} } {
  1466.         ErrorPush {} 1 SCO_OSA_ERR_NO_SUCH_OBJECT_INSTANCE "$name"
  1467.     }
  1468.     set addrlist [lindex $boot_secondaries($line) 1]
  1469.     loop index 0 [llength $addrlist] {
  1470.         if [addrmatch [lindex $addrlist $index] $addr] {
  1471.             break
  1472.         }
  1473.     }
  1474.     if { $index == [llength $addrlist] } {
  1475.         return
  1476.     }
  1477.     lvarpop addrlist $index
  1478.     set boot_secondaries($line) [lreplace $boot_secondaries($line) 1 1 $addrlist]
  1479.     incr index 2
  1480.     lvarpop boot_lines($line) $index
  1481.     set boot_modified 1
  1482. }
  1483. proc sec_setbackup {name file} {
  1484.     global boot_secondaries boot_modified boot_lines
  1485.     if {[set line [find_secondary $name]] == {} } {
  1486.         ErrorPush {} 1 SCO_OSA_ERR_NO_SUCH_OBJECT_INSTANCE "$name"
  1487.     }
  1488.     set numaddrs [llength [lindex $boot_secondaries($line) 1]]
  1489.     incr numaddrs 2
  1490.     if {[lindex $boot_secondaries($line) 2] == {} } {
  1491.         set boot_lines($line) [linsert $boot_lines($line) $numaddrs $file]
  1492.     } else {
  1493.         set boot_lines($line) [lreplace $boot_lines($line) $numaddrs $numaddrs $file]
  1494.     }
  1495.     set boot_secondaries($line) [lreplace $boot_secondaries($line) 2 2 $file]
  1496.     set boot_modified 1
  1497. }
  1498. proc list_stubs {} {
  1499.     global boot_stubs
  1500.     set result {}
  1501.     if [catch {array names boot_stubs} linelist] {
  1502.         return {}
  1503.     }
  1504.     foreach line [lsort -command SortByLineNum $linelist] {
  1505.         lappend result [lindex $boot_stubs($line) 0]
  1506.     }
  1507.     return $result
  1508. }
  1509. proc find_stub {name} {
  1510.     global boot_stubs
  1511.     if [catch {array names boot_stubs} linelist] {
  1512.         return {}
  1513.     }
  1514.     foreach line $linelist {
  1515.         if {[lindex $boot_stubs($line) 0] == $name} {
  1516.             return $line
  1517.         }
  1518.     }
  1519.     return {}
  1520. }
  1521. proc get_stub {name} {
  1522.     global boot_stubs
  1523.     if {[set line [find_stub $name]] == {} } {
  1524.         ErrorPush {} 1 SCO_OSA_ERR_NO_SUCH_OBJECT_INSTANCE "$name"
  1525.     }
  1526.     return [lrange $boot_stubs($line) 1 end]
  1527. }
  1528. proc add_stub {name servers backup} {
  1529.     global boot_stubs
  1530.     if {([find_primary $name] != {}) || ([find_secondary $name] != {})\
  1531.          || ([find_stub $name] != {}) } {
  1532.          ErrorPush {} 1 SCO_OSA_ERR_DUPLICATE_MANAGED_OBJECT_INSTANCE "$name"
  1533.     }
  1534.     if {$backup != {}} {
  1535.         set index [boot_addline end "stub    $name    $servers    $backup"]
  1536.     } else {
  1537.         set index [boot_addline end "stub    $name    $servers"]
  1538.     }
  1539.     set boot_stubs($index) [list $name $servers $backup]
  1540. }
  1541. proc rm_stub {name} {
  1542.     global boot_stubs
  1543.     if {[set line [find_stub $name]] == {} } {
  1544.         ErrorPush {} 1 SCO_OSA_ERR_NO_SUCH_OBJECT_INSTANCE "$name"
  1545.     }
  1546.     boot_rmline $line
  1547.     unset boot_stubs($line)
  1548. }
  1549. proc stub_addserver {name addr} {
  1550.     global boot_stubs boot_modified boot_lines
  1551.     if {[set line [find_stub $name]] == {} } {
  1552.         ErrorPush {} 1 SCO_OSA_ERR_NO_SUCH_OBJECT_INSTANCE "$name"
  1553.     }
  1554.     set addrlist [lindex $boot_stubs($line) 1]
  1555.     foreach j $addrlist {
  1556.         if [addrmatch $j $addr] {
  1557.             return
  1558.         }
  1559.     }
  1560.     set addrlist [concat $addr $addrlist]
  1561.     set boot_stubs($line) [lreplace $boot_stubs($line) 1 1 $addrlist]
  1562.     set boot_lines($line) [linsert $boot_lines($line) 2 $addr]
  1563.     set boot_modified 1
  1564. }
  1565. proc stub_rmserver {name addr} {
  1566.     global boot_stubs boot_modified boot_lines
  1567.     if {[set line [find_stub $name]] == {} } {
  1568.         ErrorPush {} 1 SCO_OSA_ERR_NO_SUCH_OBJECT_INSTANCE "$name"
  1569.     }
  1570.     set addrlist [lindex $boot_stubs($line) 1]
  1571.     loop index 0 [llength $addrlist] {
  1572.         if [addrmatch [lindex $addrlist $index] $addr] {
  1573.             break
  1574.         }
  1575.     }
  1576.     if { $index == [llength $addrlist] } {
  1577.         return
  1578.     }
  1579.     lvarpop addrlist $index
  1580.     set boot_stubs($line) [lreplace $stubs($line) 1 1 $addrlist]
  1581.     incr index 2
  1582.     lvarpop boot_lines($line) $index
  1583.     set boot_modified 1
  1584. }
  1585. proc stub_setbackup {name file} {
  1586.     global boot_stubs boot_modified boot_lines
  1587.     if {[set line [find_stub $name]] == {} } {
  1588.         ErrorPush {} 1 SCO_OSA_ERR_NO_SUCH_OBJECT_INSTANCE "$name"
  1589.     }
  1590.     set numaddrs [llength [lindex $boot_stubs($line) 1]]
  1591.     incr numaddrs 2
  1592.     if {[lindex $boot_stubs($line) 2] == {} } {
  1593.         set boot_lines($line) [linsert $boot_lines($line) $numaddrs $file]
  1594.     } else {
  1595.         set boot_lines($line) [lreplace $boot_lines($line) $numaddrs $numaddrs $file]
  1596.     }
  1597.     set boot_stubs($line) [lreplace $boot_stubs($line) 2 2 $file]
  1598.     set boot_modified 1
  1599. }
  1600. proc list_forwarders {} {
  1601.     global boot_forwarders
  1602.     if [catch {array names boot_forwarders} linelist] {
  1603.         return {}
  1604.     }
  1605.     set result {}
  1606.     foreach line [lsort -command SortByLineNum $linelist] {
  1607.         set result [concat $result $boot_forwarders($line)]
  1608.     }
  1609.     return $result
  1610. }
  1611. proc rm_forwarder {addr} {
  1612.     global boot_forwarders boot_lines boot_modified
  1613.     if [catch {array names boot_forwarders} linelist] {
  1614.         ErrorPush {} 1 SCO_OSA_ERR_NO_SUCH_OBJECT_INSTANCE "$addr"
  1615.     }
  1616.     foreach line $linelist {
  1617.         set addrlist $boot_forwarders($line)
  1618.         loop index 0 [llength $addrlist] {
  1619.             if [addrmatch [lindex $addrlist $index] $addr] {
  1620.                 break
  1621.             }
  1622.         }
  1623.         if { ! [addrmatch [lindex $addrlist $index] $addr]} {
  1624.             continue
  1625.         }
  1626.         if {[llength $addrlist] == 1} {
  1627.             unset boot_forwarders($line)
  1628.             boot_rmline $line
  1629.         } else {
  1630.             lvarpop boot_forwarders($line) $index
  1631.             incr index
  1632.             lvarpop boot_lines($line) $index
  1633.             set boot_modified 1
  1634.         }
  1635.     }
  1636. }
  1637. proc add_forwarder {addr} {
  1638.     global boot_forwarders
  1639.     set index [boot_addline end "forwarders $addr"]
  1640.     set boot_forwarders($index) $addr
  1641. }
  1642. proc list_sortlist {} {
  1643.     global boot_sortlist
  1644.     if [catch {array names boot_sortlist} linelist] {
  1645.         return {}
  1646.     }
  1647.     set result {}
  1648.     foreach line [lsort -command SortByLineNum $linelist] {
  1649.         set result [concat $result $boot_sortlist($line)]
  1650.     }
  1651.     return $result
  1652. }
  1653. proc rm_sortlist {addr} {
  1654.     global boot_sortlist boot_lines boot_modified
  1655.     if [catch {array names boot_sortlist} linelist] {
  1656.         ErrorPush {} 1 SCO_OSA_ERR_NO_SUCH_OBJECT_INSTANCE "$addr"
  1657.     }
  1658.     foreach line $linelist {
  1659.         set addrlist $boot_sortlist($line)
  1660.         loop index 0 [llength $addrlist] {
  1661.             if [addrmatch [lindex $addrlist $index] $addr] {
  1662.                 break
  1663.             }
  1664.         }
  1665.         if { ! [addrmatch [lindex $addrlist $index] $addr]} {
  1666.             continue
  1667.         }
  1668.         if {[llength $addrlist] == 1} {
  1669.             unset boot_sortlist($line)
  1670.             boot_rmline $line
  1671.         } else {
  1672.             lvarpop boot_sortlist($line) $index
  1673.             incr index
  1674.             lvarpop boot_lines($line) $index
  1675.             set boot_modified 1
  1676.         }
  1677.     }
  1678. }
  1679. proc add_sortlist {addr} {
  1680.     global boot_sortlist
  1681.     set index [boot_addline end "sortlist $addr"]
  1682.     set boot_sortlist($index) $addr
  1683. }
  1684. proc list_xfrnets {} {
  1685.     global boot_xfrnets
  1686.     if [catch {array names boot_xfrnets} linelist] {
  1687.         return {}
  1688.     }
  1689.     set result {}
  1690.     foreach line [lsort -command SortByLineNum $linelist] {
  1691.         set result [concat $result $boot_xfrnets($line)]
  1692.     }
  1693.     return $result
  1694. }
  1695. proc rm_xfrnets {addr} {
  1696.     global boot_xfrnets boot_lines boot_modified
  1697.     if [catch {array names boot_xfrnets} linelist] {
  1698.         ErrorPush {} 1 SCO_OSA_ERR_NO_SUCH_OBJECT_INSTANCE "$addr"
  1699.     }
  1700.     foreach line $linelist {
  1701.         set addrlist $boot_xfrnets($line)
  1702.         loop index 0 [llength $addrlist] {
  1703.             if [addrmatch [lindex $addrlist $index] $addr] {
  1704.                 break
  1705.             }
  1706.         }
  1707.         if { ! [addrmatch [lindex $addrlist $index] $addr]} {
  1708.             continue
  1709.         }
  1710.         if {[llength $addrlist] == 1} {
  1711.             unset boot_xfrnets($line)
  1712.             boot_rmline $line
  1713.         } else {
  1714.             lvarpop boot_xfrnets($line) $index
  1715.             incr index
  1716.             lvarpop boot_lines($line) $index
  1717.             set boot_modified 1
  1718.         }
  1719.     }
  1720. }
  1721. proc add_xfrnets {addr} {
  1722.     global boot_xfrnets
  1723.     set index [boot_addline end "xfrnets $addr"]
  1724.     set boot_xfrnets($index) $addr
  1725. }
  1726. proc list_bogusns {} {
  1727.     global boot_bogusns
  1728.     if [catch {array names boot_bogusns} linelist] {
  1729.         return {}
  1730.     }
  1731.     set result {}
  1732.     foreach line [lsort -command SortByLineNum $linelist] {
  1733.         set result [concat $result $boot_bogusns($line)]
  1734.     }
  1735.     return $result
  1736. }
  1737. proc rm_bogusns {addr} {
  1738.     global boot_bogusns boot_lines boot_modified
  1739.     if [catch {array names boot_bogusns} linelist] {
  1740.         ErrorPush {} 1 SCO_OSA_ERR_NO_SUCH_OBJECT_INSTANCE "$addr"
  1741.     }
  1742.     foreach line $linelist {
  1743.         set addrlist $boot_bogusns($line)
  1744.         loop index 0 [llength $addrlist] {
  1745.             if [addrmatch [lindex $addrlist $index] $addr] {
  1746.                 break
  1747.             }
  1748.         }
  1749.         if { ! [addrmatch [lindex $addrlist $index] $addr]} {
  1750.             continue
  1751.         }
  1752.         if {[llength $addrlist] == 1} {
  1753.             unset boot_bogusns($line)
  1754.             boot_rmline $line
  1755.         } else {
  1756.             lvarpop boot_bogusns($line) $index
  1757.             incr index
  1758.             lvarpop boot_lines($line) $index
  1759.             set boot_modified 1
  1760.         }
  1761.     }
  1762. }
  1763. proc add_bogusns {addr} {
  1764.     global boot_bogusns
  1765.     set index [boot_addline end "bogusns $addr"]
  1766.     set boot_bogusns($index) $addr
  1767. }
  1768. proc get_slaveflag {} {
  1769.     global boot_slave
  1770.     return [expr {$boot_slave != ""}]
  1771. }
  1772. proc set_slaveflag {value} {
  1773.     global boot_slave
  1774.     if {($boot_slave == "") && ($value == 1)} {
  1775.         set index [boot_addline end "options forward-only"]
  1776.         set boot_slave $index
  1777.         } elseif {($boot_slave != "") && ($value == 0)} {
  1778.         boot_rmline $boot_slave
  1779.         set boot_slave ""
  1780.         }
  1781.     return 1
  1782. }
  1783. proc get_norecursionflag {} {
  1784.     global boot_optsnorecursion
  1785.     return [expr {$boot_optsnorecursion != ""}]
  1786. }
  1787. proc set_norecursionflag {value} {
  1788.     global boot_optsnorecursion
  1789.     if {($boot_optsnorecursion == "") && ($value == 1)} {
  1790.         set index [boot_addline end "options no-recursion"]
  1791.         set boot_optsnorecursion $index
  1792.         } elseif {($boot_optsnorecursion != "") && ($value == 0)} {
  1793.         boot_rmline $boot_optsnorecursion
  1794.         set boot_optsnorecursion ""
  1795.         }
  1796.     return 1
  1797. }
  1798. proc get_querylogflag {} {
  1799.     global boot_optsquerylog
  1800.     return [expr {$boot_optsquerylog != ""}]
  1801. }
  1802. proc set_querylogflag  {value} {
  1803.     global boot_optsquerylog
  1804.     if {($boot_optsquerylog == "") && ($value == 1)} {
  1805.         set index [boot_addline end "options query-log"]
  1806.         set boot_optsquerylog $index
  1807.         } elseif {($boot_optsquerylog != "") && ($value == 0)} {
  1808.         boot_rmline $boot_optsquerylog
  1809.         set boot_optsquerylog ""
  1810.         }
  1811.     return 1
  1812. }
  1813. proc get_fetchglueflag {} {
  1814.     global boot_optsfetchglue
  1815.     return [expr {$boot_optsfetchglue != ""}]
  1816. }
  1817. proc set_fetchglueflag  {value} {
  1818.     global boot_optsfetchglue
  1819.     if {($boot_optsfetchglue == "") && ($value == 1)} {
  1820.         set index [boot_addline end "options no-fetch-glue"]
  1821.         set boot_optsfetchglue $index
  1822.         } elseif {($boot_optsfetchglue != "") && ($value == 0)} {
  1823.         boot_rmline $boot_optsfetchglue
  1824.         set boot_optsfetchglue ""
  1825.         }
  1826.     return 1
  1827. }
  1828. proc get_xferinlimit {} {
  1829.     global boot_xferin
  1830.     if ![info exists boot_xferin] {
  1831.     return {}
  1832.     }
  1833.     set result {}
  1834.     for_array_keys ind boot_xferin {
  1835.     lappend result $boot_xferin($ind)
  1836.     }
  1837.     return $result
  1838. }
  1839. proc set_xferinlimit {{value {}}} {
  1840.     global boot_xferin
  1841.     set exists [info exists boot_xferin]
  1842.     if {$exists} {
  1843.     for_array_keys ind boot_xferin {
  1844.         boot_rmline $ind
  1845.     }
  1846.     unset boot_xferin
  1847.     }
  1848.     if ![lempty $value] {
  1849.     set replace [format "limits transfers-in %d" $value]
  1850.     set index [boot_addline end $replace]
  1851.     set boot_xferin($index) $value
  1852.     }
  1853.     return 1
  1854. }
  1855. proc get_xferpernslimit {} {
  1856.     global boot_xferperns
  1857.     if ![info exists boot_xferperns] {
  1858.     return {}
  1859.     }
  1860.     set result {}
  1861.     for_array_keys ind boot_xferperns {
  1862.     lappend result $boot_xferperns($ind)
  1863.     }
  1864.     return $result
  1865. }
  1866. proc set_xferpernslimit {{value {}}} {
  1867.     global boot_xferperns
  1868.     set exists [info exists boot_xferperns]
  1869.     if {$exists} {
  1870.     for_array_keys ind boot_xferperns {
  1871.         boot_rmline $ind
  1872.     }
  1873.     unset boot_xferperns
  1874.     }
  1875.     if ![lempty $value] {
  1876.     set replace [format "limits transfers-per-ns %d" $value]
  1877.     set index [boot_addline end $replace]
  1878.     set boot_xferperns($index) $value
  1879.     }
  1880.     return 1
  1881. }
  1882. proc get_xferdatasize {} {
  1883.     global boot_xferdatasize
  1884.     if ![info exists boot_xferdatasize] {
  1885.     return {}
  1886.     }
  1887.     set result {}
  1888.     for_array_keys ind boot_xferdatasize {
  1889.     lappend result $boot_xferdatasize($ind)
  1890.     }
  1891.     return $result
  1892. }
  1893. proc set_xferdatasize {{value {}}} {
  1894.     global boot_xferdatasize
  1895.     set exists [info exists boot_xferdatasize]
  1896.     if {$exists} {
  1897.     for_array_keys ind boot_xferdatasize {
  1898.         boot_rmline $ind
  1899.     }
  1900.     unset boot_xferdatasize
  1901.     }
  1902.     if ![lempty $value] {
  1903.     set replace [format "limits transfers-datasize %dm" $value]
  1904.     set index [boot_addline end $replace]
  1905.     set boot_xferdatasize($index) $value
  1906.     }
  1907.     return 1
  1908. }
  1909. proc dns_readhints {} {
  1910.     global boot_caches dns_domain
  1911.     if {$dns_domain == "."} {
  1912.         return
  1913.     }
  1914.     dns_writefile
  1915.     if [catch {array names boot_caches} linelist] {
  1916.         return
  1917.     }
  1918.     foreach line $linelist {
  1919.         dns_readfile . $boot_caches($line)
  1920.     }
  1921. }
  1922. proc dns_gethintnames {} {
  1923.     dns_readhints
  1924.     if [catch {dns_getdatabyname . ns} result] {
  1925.         if [catch {dns_getdatabyname .. ns} result] {
  1926.             set result {}
  1927.         }
  1928.     }
  1929.     return $result
  1930. }
  1931. proc dns_addhint {name addrs comment} {
  1932.     dns_readhints
  1933.     dns_addserver . $name $addrs $comment
  1934. }
  1935. proc dns_rmhint {name} {
  1936.     dns_readhints
  1937.     if [catch {dns_rmserver . $name}] {
  1938.         if [catch {dns_rmserver .. $name}] {
  1939.             ErrorPush {} 1 SCO_OSA_ERR_NO_SUCH_OBJECT_INSTANCE "$name"
  1940.         }
  1941.     }
  1942. }
  1943. proc dns_findptr {addr} {
  1944.     set addr [split $addr .]
  1945.     if {[llength $addr] != 4} {
  1946.         ErrorPush {} 1 SCO_DNSOSA_ERR_BAD_ADDR $addr]
  1947.     }
  1948.     foreach prim [list_primaries] {
  1949.         set prim [string tolower $prim]
  1950.         if [regsub -nocase {^([0-9.]*)(\.in-addr\.arpa)$} $prim {\1} dom] {
  1951.         set dom [lreverse [split $dom .]]
  1952.         if {[lmatch $dom $addr] == [llength $dom]} {
  1953.             return $prim
  1954.         }
  1955.         }
  1956.     }
  1957.     return {}
  1958. }
  1959. proc dns_getmode {} {
  1960.     global boot_file boot_primaries boot_secondaries
  1961.     if [ResolverActive] {
  1962.         return "remote"
  1963.     }
  1964.     if { ! [owner file isfile $boot_file]} {
  1965.         return "off"
  1966.     }
  1967.     if { ! [catch {array size boot_secondaries}]} {
  1968.         return "master"
  1969.     }
  1970.     if [catch {array names boot_primaries} linelist] {
  1971.         return "caching"
  1972.     }
  1973.     foreach line $linelist {
  1974.         if {[string tolower [lindex $boot_primaries($line) 0]] != "0.0.127.in-addr.arpa"} {
  1975.             return "master"
  1976.         }
  1977.     }
  1978.     return "caching"
  1979. }
  1980. proc boot_writemode {} {
  1981.     global dns_selectedmode dns_currentmode boot_file boot_modified
  1982.     global boot_file boot_save boot_master
  1983.     case $dns_selectedmode {
  1984.         off {
  1985.             if $boot_modified {
  1986.                 boot_writefile all $boot_save
  1987.                 backup_file $boot_file
  1988.                 backup_file $boot_master
  1989.             } else {
  1990.                 move_file $boot_file $boot_save
  1991.                 backup_file $boot_master
  1992.             }
  1993.         }
  1994.         caching {
  1995.             if {$boot_modified || ($dns_currentmode != "caching")} {
  1996.                 boot_writefile all $boot_file
  1997.             }
  1998.         }
  1999.         master {
  2000.             if {$boot_modified || ($dns_currentmode != "master")} {
  2001.                 boot_writefile all $boot_file
  2002.                 backup_file $boot_master
  2003.             }
  2004.         }
  2005.     }
  2006. }
  2007. proc dns_locate {file} {
  2008.     global boot_directory
  2009.     if [string match {/*} $file] {
  2010.         return $file
  2011.     }
  2012.     return "$boot_directory/$file"
  2013. }
  2014. proc boot_readfile {filename} {
  2015.     global boot_scontext boot_modified boot_newindex
  2016.     if {! [owner file exists $filename] || \
  2017.     [owner file size $filename] == 0} {
  2018.     set fp [ownerOpen writefile $filename]
  2019.     if {$fp != -1} {
  2020.         puts $fp "; [owner file tail $filename]"
  2021.         close $fp
  2022.     }
  2023.     }
  2024.     set infile [ownerOpen readfile $filename]
  2025.     if {$infile != -1} {
  2026.     scanfile $boot_scontext $infile
  2027.     close $infile
  2028.     }
  2029.     set boot_modified 0
  2030.     set boot_newindex 0
  2031. }
  2032. proc boot_writefile {mode file} {
  2033.     global boot_modified boot_lines boot_lineindexes
  2034.     global boot_primaries boot_secondaries
  2035.     global restart_server
  2036.     if {! $boot_modified} {
  2037.         return
  2038.     }
  2039.     backup_file $file
  2040.     set outfile [ownerOpen writefile $file]
  2041.     if {$outfile == -1} {
  2042.        ErrorPush {} 1 SCO_DNSOSA_ERR_OPEN_WR $file
  2043.     }
  2044.     foreach line $boot_lineindexes {
  2045.         set linetype nomaster
  2046.         if { ! [catch {set pline $boot_primaries($line)}]} {
  2047.             if {[string tolower [lindex $pline 0]]
  2048.                         != "0.0.127.in-addr.arpa"} {
  2049.                 set linetype master
  2050.             }
  2051.         }
  2052.         if { ! [catch {set pline $boot_secondaries($line)}]} {
  2053.             set linetype master
  2054.         }
  2055.         if {($mode == "all") || ($mode == $linetype)} {
  2056.             puts $outfile $boot_lines($line)
  2057.         }
  2058.     }
  2059.     close $outfile
  2060.     set restart_server 1
  2061.     set boot_modified 0
  2062. }
  2063. proc boot_minimal_config {} {
  2064.     global boot_directory boot_caches
  2065.     global boot_localhost
  2066.     global IPAddrMap_ConfigDir
  2067.     if ![info exists boot_directory] {
  2068.     set boot_directory [format "%s/named.d" $IPAddrMap_ConfigDir]
  2069.     if ![owner file isdirectory $boot_directory] {
  2070.         owner mkdir -path $boot_directory
  2071.     }
  2072.     set addline [format "directory\t%s" $boot_directory]
  2073.     set index [boot_addline end $addline]
  2074.     }
  2075.     if ![info exists boot_caches] {
  2076.     set addline [format "cache\t.\t\t\t%s" "db.cache"]
  2077.     set index [boot_addline end $addline]
  2078.     set boot_caches($index) "db.cache"
  2079.     set fpath [format "%s/db.cache" $boot_directory]
  2080.     if {![owner file exists $fpath]} {
  2081.         set outfile [ownerOpen writefile $fpath]
  2082.         if {$outfile == -1} {
  2083.         ErrorPush {} 1 SCO_DNSOSA_ERR_OPEN_WR $fpath
  2084.         } else {
  2085.         close $outfile
  2086.         }
  2087.     }
  2088.     }
  2089.     if ![info exists boot_localhost] {
  2090.     set boot_localhost "db.local"
  2091.     set addline [format "primary\t0.0.127.in-addr.arpa\t%s" $boot_localhost]
  2092.     set index [boot_addline end $addline]
  2093.     set fpath [format "%s/%s" $boot_directory $boot_localhost]
  2094.     set fp [ownerOpen writefile $fpath]
  2095.     if {$fp == -1} {
  2096.        ErrorPush {} 1 SCO_DNSOSA_ERR_OPEN_WR $fpath
  2097.     } else {
  2098.        puts $fp [makeSOA "@       IN      SOA" [exec /usr/ucb/hostname]. \
  2099.         root.localhost [SetSerial 1 noincr] \
  2100.         [list 10800 1800 14000000 86400]]
  2101.        puts $fp [format "\tIN\tNS\t%s." [exec /usr/ucb/hostname]]
  2102.        puts $fp "1\tIN\tPTR\tlocalhost."
  2103.        close $fp
  2104.     }
  2105.     }
  2106. }
  2107. proc boot_init {} {
  2108.     global IPAddrMap_ConfigDir
  2109.     global boot_file boot_master boot_save boot_slave
  2110.     global named_pid_file
  2111.     global boot_optsnorecursion boot_optsquerylog boot_optsfetchglue
  2112.     global boot_xferin boot_xferperns boot_xferdatasize
  2113.     global dns_currentmode dns_selectedmode
  2114.     setup_boot_scancontexts
  2115.     set boot_file $IPAddrMap_ConfigDir/named.boot
  2116.     set boot_master $IPAddrMap_ConfigDir/named.master
  2117.     set boot_save $IPAddrMap_ConfigDir/named.save
  2118.     set named_pid_file /etc/named.pid
  2119.     set boot_slave ""
  2120.     set boot_optsnorecursion {}
  2121.     set boot_optsquerylog {}
  2122.     set boot_optsfetchglue {}
  2123.     boot_readfile $boot_file
  2124.     set dns_currentmode [dns_getmode]
  2125.     set dns_selectedmode $dns_currentmode
  2126.     boot_minimal_config
  2127. }
  2128. proc SortByLineNum {el1 el2} {
  2129.     set e1 [lindex [split $el1 .] end]
  2130.     set e2 [lindex [split $el2 .] end]
  2131.     if [cequal $e1 $e2] { return 0 }
  2132.     return [expr {($e1 < $e2) ? -1 : 1}]
  2133. }
  2134. proc dns_fixname {name} {
  2135.     global dns_origin
  2136.     set name [string tolower $name]
  2137.     if [string match {*.} $name] {
  2138.         if {$name != "."} {
  2139.             set name [string trimright $name .]
  2140.         }
  2141.     } else {
  2142.         if {$name == "@"} {
  2143.             set name $dns_origin
  2144.         }
  2145.     }
  2146.     return $name
  2147. }
  2148. proc storeRR {lineindex name ttl typeoff} {
  2149.     global dns_namelines dns_cnames dns_records dns_lastname
  2150.     global dns_lines dns_origin dns_soa dns_filename
  2151.     global dns_hinfo dns_rp dns_mx dns_txt
  2152.     set dns_lastname $name
  2153.     set name [dns_fixname $name]
  2154.     set line $dns_lines($lineindex)
  2155.     set type [string toupper [lindex $line $typeoff]]
  2156.     set dataoff [expr $typeoff+1]
  2157.     case $type in {
  2158.         SOA {
  2159.             if [lempty $dns_soa] {
  2160.                 parseSOA $line $dataoff $lineindex
  2161.             } else {
  2162.                 ErrorPush {} 1 SCO_DNSOSA_ERR_MULT_SOA $dns_filename
  2163.             }
  2164.             append dns_mx($name) ""
  2165.             append dns_rp($name) ""
  2166.             append dns_hinfo($name) ""
  2167.             append dns_txt($name) ""
  2168.             append dns_ns($name) ""
  2169.             lappend dns_namelines($name) $lineindex
  2170.         }
  2171.         NS {
  2172.             lappend dns_ns($name) [lrange $line $dataoff end]
  2173.             lappend dns_namelines($name) $lineindex
  2174.         }
  2175.         HINFO {
  2176.             lappend dns_hinfo($name) [lrange $line $dataoff end]
  2177.             lappend dns_namelines($name) $lineindex
  2178.         }
  2179.         MX {
  2180.             lappend dns_mx($name) [lrange $line $dataoff end]
  2181.             lappend dns_namelines($name) $lineindex
  2182.         }
  2183.         TXT {
  2184.             lappend dns_txt($name) [lrange $line $dataoff end]
  2185.             lappend dns_namelines($name) $lineindex
  2186.         }
  2187.         RP {
  2188.             lappend dns_rp($name) [lrange $line $dataoff end]
  2189.             lappend dns_namelines($name) $lineindex
  2190.         }
  2191.         CNAME {
  2192.             set official [dns_fixname [lindex $line $dataoff]]
  2193.             lappend dns_cnames($official) $name
  2194.             lappend dns_namelines($name) $lineindex
  2195.         }
  2196.         default {
  2197.             append dns_cnames($name) ""
  2198.             append dns_mx($name) ""
  2199.             append dns_rp($name) ""
  2200.             append dns_hinfo($name) ""
  2201.             append dns_txt($name) ""
  2202.             lappend dns_namelines($name) $lineindex
  2203.         }
  2204.     }
  2205.     set dns_records($lineindex) "$dataoff $name $ttl $type $dns_origin"
  2206. }
  2207. proc parseSOA {line dataoff lineindex} {
  2208.     global dns_soa dns_filename
  2209.     if { ! [regsub -all "(;\[^\n\]*($|\n))|\\\(|\\\)" $line "" dns_soa]} {
  2210.         set dns_soa $line
  2211.     }
  2212.     set dns_soa [lrange $dns_soa $dataoff end]
  2213.     lappend dns_soa $lineindex $dataoff
  2214.     if {[llength $dns_soa] != 9} {
  2215.         set dns_soa ""
  2216.         ErrorPush {} 1 SCO_DNSOSA_ERR_BAD_SOA $dns_filename
  2217.     }
  2218.     if [string match {*.*} [lindex $dns_soa 2]] {
  2219.         set foo [split [lindex $dns_soa 2] "."]
  2220.         set dns_soa [lreplace $dns_soa 2 2 [lindex $foo 0]000[lindex $foo 1]]
  2221.     }
  2222. }
  2223. proc balanceparens {init string} {
  2224.     set opens [llength [split $string "("]]
  2225.     set closes [llength [split $string ")"]]
  2226.     return [expr "$init + ($opens - $closes)"]
  2227. }
  2228. proc setup_RR_scancontexts {} {
  2229.     global dns_innercontext dns_outercontext
  2230.     set nullstart {^[     ]+}
  2231.     set rrstart {^[     ]*[^     ]+[     ]+}
  2232.     set ttl {[0-9]+[     ]+}
  2233.     set proto {in[     ]+}
  2234.     set type {(a|cname|hinfo|mb|md|mf|minfo|mr|mx|ns|null|ptr|soa|txt|wks|afsdb|isdn|rp|rt|x25)[     ]+}
  2235.     set dns_innercontext [scancontext create]
  2236.     scanmatch $dns_innercontext {\)} {
  2237.         append longline \n$matchInfo(line)
  2238.         if {[set parens [balanceparens $parens $matchInfo(line)]]==0} {
  2239.             return
  2240.         }
  2241.     }
  2242.     scanmatch $dns_innercontext {
  2243.         append longline \n$matchInfo(line)
  2244.         set parens [balanceparens $parens $matchInfo(line)]
  2245.     }
  2246.     set dns_outercontext [scancontext create]
  2247.     scanmatch $dns_outercontext {^} {
  2248.         global dns_lines dns_lineindexes
  2249.         set lineindex $matchInfo(handle).$matchInfo(linenum)
  2250.         lappend dns_lineindexes $lineindex
  2251.         set dns_lines($lineindex) $matchInfo(line)
  2252.     }
  2253.     scanmatch $dns_outercontext {(^[     ]*;)|(^[     ]*$)} {
  2254.         continue
  2255.     }
  2256.     scanmatch -nocase $dns_outercontext {^\$origin} {
  2257.         global dns_origin
  2258.         set tmporg [string tolower [lindex $matchInfo(line) 1]]
  2259.         if [string match {*.} $tmporg] {
  2260.             set dns_origin [string trimright $tmporg .]
  2261.         } else {
  2262.             set dns_origin $tmporg.$dns_origin
  2263.         }
  2264.         continue
  2265.     }
  2266.     scanmatch -nocase $dns_outercontext {^\$include} {
  2267.         global dns_outercontext dns_openfiles dns_origin dns_filename
  2268.         set oldfilename $dns_filename
  2269.         set oldorigin $dns_origin
  2270.         set dns_filename [dns_locate [lindex $matchInfo(line) 1]]
  2271.         if { ! [string match {;*} [lindex $matchInfo(line) 2]]} {
  2272.             set dns_origin [lindex $matchInfo(line) 2]
  2273.         }
  2274.         set infile [ownerOpen readfile $dns_filename]
  2275.         if {$infile == -1} {
  2276.             ErrorPush {} 1 SCO_DNSOSA_ERR_NO_FILE $dns_filename
  2277.         }
  2278.         keylset dns_openfiles($infile) name $dns_filename modified 0
  2279.         scanfile $dns_outercontext $infile
  2280.         set dns_filename $oldfilename
  2281.         set dns_origin $oldorigin
  2282.         continue
  2283.     }
  2284.     scanmatch -nocase $dns_outercontext "$rrstart$ttl$proto$type.*\\\(" {
  2285.         global dns_innercontext dns_lines
  2286.         set longline $matchInfo(line)
  2287.         set parens [balanceparens 0 $matchInfo(line)]
  2288.         scanfile $dns_innercontext $matchInfo(handle)
  2289.         set dns_lines($lineindex) $longline
  2290.         storeRR $lineindex [lindex $longline 0] [lindex $longline 1] 3
  2291.         continue
  2292.     }
  2293.     scanmatch -nocase $dns_outercontext "$rrstart$proto$ttl$type.*\\\(" {
  2294.         global dns_innercontext dns_lines
  2295.         set longline $matchInfo(line)
  2296.         set parens [balanceparens 0 $matchInfo(line)]
  2297.         scanfile $dns_innercontext $matchInfo(handle)
  2298.         set dns_lines($lineindex) $longline
  2299.         storeRR $lineindex [lindex $longline 0] [lindex $longline 2] 3
  2300.         continue
  2301.     }
  2302.     scanmatch -nocase $dns_outercontext "$rrstart$ttl$type.*\\\(" {
  2303.         global dns_innercontext dns_lines
  2304.         set longline $matchInfo(line)
  2305.         set parens [balanceparens 0 $matchInfo(line)]
  2306.         scanfile $dns_innercontext $matchInfo(handle)
  2307.         set dns_lines($lineindex) $longline
  2308.         storeRR $lineindex [lindex $longline 0] [lindex $longline 1] 2
  2309.         continue
  2310.     }
  2311.     scanmatch -nocase $dns_outercontext "$rrstart$proto$type.*\\\(" {
  2312.         global dns_innercontext dns_lines
  2313.         set longline $matchInfo(line)
  2314.         set parens [balanceparens 0 $matchInfo(line)]
  2315.         scanfile $dns_innercontext $matchInfo(handle)
  2316.         set dns_lines($lineindex) $longline
  2317.         storeRR $lineindex [lindex $longline 0] 0 2
  2318.         continue
  2319.     }
  2320.     scanmatch -nocase $dns_outercontext "$rrstart$type.*\\\(" {
  2321.         global dns_innercontext dns_lines
  2322.         set longline $matchInfo(line)
  2323.         set parens [balanceparens 0 $matchInfo(line)]
  2324.         scanfile $dns_innercontext $matchInfo(handle)
  2325.         set dns_lines($lineindex) $longline
  2326.         storeRR $lineindex [lindex $longline 0] 0 1
  2327.         continue
  2328.     }
  2329.     scanmatch -nocase $dns_outercontext "$nullstart$ttl$proto$type" {
  2330.         global dns_lastname
  2331.         storeRR $lineindex $dns_lastname [lindex $matchInfo(line) 0] 2
  2332.         continue
  2333.     }
  2334.     scanmatch -nocase $dns_outercontext "$nullstart$proto$ttl$type" {
  2335.         global dns_lastname
  2336.         storeRR $lineindex $dns_lastname [lindex $matchInfo(line) 1] 2
  2337.         continue
  2338.     }
  2339.     scanmatch -nocase $dns_outercontext "$nullstart$ttl$type" {
  2340.         global dns_lastname
  2341.         storeRR $lineindex $dns_lastname [lindex $matchInfo(line) 0] 1
  2342.         continue
  2343.     }
  2344.     scanmatch -nocase $dns_outercontext "$nullstart$proto$type" {
  2345.         global dns_lastname
  2346.         storeRR $lineindex $dns_lastname 0 1
  2347.         continue
  2348.     }
  2349.     scanmatch -nocase $dns_outercontext "$nullstart$type" {
  2350.         global dns_lastname
  2351.         storeRR $lineindex $dns_lastname 0 0
  2352.         continue
  2353.     }
  2354.     scanmatch -nocase $dns_outercontext "$rrstart$ttl$proto$type" {
  2355.         storeRR $lineindex [lindex $matchInfo(line) 0] [lindex $matchInfo(line) 1] 3
  2356.         continue
  2357.     }
  2358.     scanmatch -nocase $dns_outercontext "$rrstart$proto$ttl$type" {
  2359.         storeRR $lineindex [lindex $matchInfo(line) 0] [lindex $matchInfo(line) 2] 3
  2360.         continue
  2361.     }
  2362.     scanmatch -nocase $dns_outercontext "$rrstart$ttl$type" {
  2363.         storeRR $lineindex [lindex $matchInfo(line) 0] [lindex $matchInfo(line) 1] 2
  2364.         continue
  2365.     }
  2366.     scanmatch -nocase $dns_outercontext "$rrstart$proto$type" {
  2367.         storeRR $lineindex [lindex $matchInfo(line) 0] 0 2
  2368.         continue
  2369.     }
  2370.     scanmatch -nocase $dns_outercontext "$rrstart$type" {
  2371.         storeRR $lineindex [lindex $matchInfo(line) 0] 0 1
  2372.         continue
  2373.     }
  2374.     scanmatch $dns_outercontext "^" {
  2375.         global dns_filename
  2376.         ErrorPush {} 1 SCO_DNSOSA_ERR_BAD_LINE $matchInfo(line)
  2377.     }
  2378. }
  2379. proc makeSOA {start host mailbox serial rest} {
  2380.     set result "$start\t$host\t$mailbox\t(\n"
  2381.     append result "\t\t\t$serial    ; serial number \[[fmtclock [getclock] "%D %T"]\]\n"
  2382.     append result "\t\t\t[lindex $rest 0]    ; refresh[cvtsecs [lindex $rest 0]]\n"
  2383.     append result "\t\t\t[lindex $rest 1]    ; retry[cvtsecs [lindex $rest 1]]\n"
  2384.     append result "\t\t\t[lindex $rest 2]    ; expire[cvtsecs [lindex $rest 2]]\n"
  2385.     append result "\t\t\t[lindex $rest 3] )    ; minimum ttl[cvtsecs [lindex $rest 3]]"
  2386.     return $result
  2387. }
  2388. proc storeSOA {} {
  2389.     global dns_soa dns_lines dns_domain
  2390.     if {($dns_domain == ".") || ($dns_domain == "..")} {
  2391.         return
  2392.     }
  2393.     set serial    [SetSerial [lindex $dns_soa 2]]
  2394.     set lineindex [lindex $dns_soa 7]
  2395.     set dataoff   [lindex $dns_soa 8]
  2396.     set start     [lrange $dns_lines($lineindex) 0 [expr $dataoff-1]]
  2397.     set host      [lindex $dns_soa 0]
  2398.     set mailbox   [lindex $dns_soa 1]
  2399.     set dns_lines($lineindex) [makeSOA $start $host $mailbox $serial [lrange $dns_soa 3 6]]
  2400.     dns_markmodified $lineindex
  2401. }
  2402. proc SetSerial {serial {noincr {}}} {
  2403.     set today [fmtclock [getclock] \%Y\%m\%d]
  2404.     if {[clength $serial] > 8} {
  2405.     scan $serial "%8d%d" date index
  2406.     if [cequal $today $date] {
  2407.        if [lempty $noincr] {
  2408.         incr index
  2409.        }
  2410.     } else {
  2411.        set index 1
  2412.     }
  2413.     } else {
  2414.     set index 1
  2415.     }
  2416.     if {$index < 10} {
  2417.     return [format "%s0%s" $today $index]
  2418.     } else {
  2419.     return [format "%s%s" $today $index]
  2420.     }
  2421. }
  2422. proc dns_makefile {filename mailbox serial refresh retry expire minimum} {
  2423.     global boot_directory
  2424.     set fpath [format "%s/%s" $boot_directory $filename]
  2425.     set outfile [ownerOpen writefile $fpath w+]
  2426.     if {$outfile == -1} {
  2427.         ErrorPush {} 1 SCO_DNSOSA_ERR_OPEN_WR $fpath
  2428.     }
  2429.     puts $outfile [makeSOA "@    IN    SOA" [exec /usr/ucb/hostname]. $mailbox $serial [list $refresh $retry $expire $minimum]]
  2430.     close $outfile
  2431. }
  2432. proc dns_addline {before name ttl type data comment} {
  2433.     global dns_lines dns_lineindexes dns_newindex dns_addhandle
  2434.     if {$before == "end"} {
  2435.         set index [llength $dns_lineindexes]
  2436.     } else {
  2437.         if {[set index [lsearch $dns_lineindexes $before]] == -1} {
  2438.             ErrorPush {} 1 SCO_DNSOSA_ERR_ILLEGAL \
  2439.                 [list "dns_addline" $before]
  2440.         }
  2441.     }
  2442.     set oldname ""
  2443.     set previndex [expr {$index - 1}]
  2444.     while {($oldname == "") && ($previndex >= 0)} {
  2445.         set oldindex [lindex $dns_lineindexes $previndex]
  2446.         set oldline $dns_lines($oldindex)
  2447.         if [string match {[     ]*} $oldline] {
  2448.             set oldname ""
  2449.         } else {
  2450.             set oldname [lindex $oldline 0]
  2451.         }
  2452.         incr previndex -1
  2453.     }
  2454.     if {$oldname == $name} {
  2455.         set line "    "
  2456.         set typeoff 0
  2457.     } else {
  2458.         set line "$name    "
  2459.         set typeoff 1
  2460.     }
  2461.     if {$ttl} {
  2462.         append line "$ttl    IN    $type    $data"
  2463.         incr typeoff 2
  2464.     } else {
  2465.         append line "IN    $type    $data"
  2466.         incr typeoff
  2467.     }
  2468.     if {$comment != {}} {
  2469.         append line "\t; $comment"
  2470.     }
  2471.     set newindex $dns_addhandle.new$dns_newindex
  2472.     incr dns_newindex
  2473.     dns_markmodified $newindex
  2474.     set dns_lineindexes [linsert $dns_lineindexes $index $newindex]
  2475.     set dns_lines($newindex) $line
  2476.     storeRR $newindex $name $ttl $typeoff
  2477.     return $newindex
  2478. }
  2479. proc dns_rmline {line} {
  2480.     global dns_lineindexes dns_records dns_namelines dns_lines
  2481.     if {[set index [lsearch -exact $dns_lineindexes $line]] == -1} {
  2482.         ErrorPush {} 1 SCO_DNSOSA_ERR_ILLEGAL \
  2483.         [list "dns_rmline" $line]
  2484.     }
  2485.     lvarpop dns_lineindexes $index
  2486.     dns_markmodified $line
  2487.     if [catch {lindex $dns_records($line) 1} name] {
  2488.         return
  2489.     }
  2490.     unset dns_records($line)
  2491.     if {[set i [lsearch $dns_namelines($name) $line]] != -1} {
  2492.         lvarpop dns_namelines($name) $i
  2493.     }
  2494.     if [string match {[     ]*} $dns_lines($line)] {
  2495.         unset dns_lines($line)
  2496.         return
  2497.     }
  2498.     set name [lindex $dns_lines($line) 0]
  2499.     unset dns_lines($line)
  2500.     foreach line [lrange $dns_lineindexes $index end] {
  2501.         if { ! [catch {set record $dns_records($line)}]} {
  2502.             if [string match {[     ]*} $dns_lines($line)] {
  2503.                 set dns_lines($line) "$name$dns_lines($line)"
  2504.                 set record $dns_records($line)
  2505.                 set dataoff [lindex $record 0]
  2506.                 incr dataoff
  2507.                 set record [lreplace $record 0 0 $dataoff]
  2508.                 set dns_records($line) $record
  2509.             }
  2510.             break
  2511.         }
  2512.     }
  2513.     return
  2514. }
  2515. proc dns_getlinesbyname {name type} {
  2516.     global dns_namelines dns_records
  2517.     set type [string toupper $type]
  2518.     set name [string tolower $name]
  2519.     set result {}
  2520.     if [catch {set linelist $dns_namelines($name)}] {
  2521.         ErrorPush {} 1 SCO_OSA_ERR_NO_SUCH_OBJECT_INSTANCE "$name"
  2522.     }
  2523.     set result {}
  2524.     foreach line $linelist {
  2525.         if {[lindex $dns_records($line) 3] == $type} {
  2526.             lappend result $line
  2527.         }
  2528.     }
  2529.     return $result
  2530. }
  2531. proc dns_getlinebydata {name type test} {
  2532.     global dns_lines dns_records
  2533.     set result {}
  2534.     set test [string tolower $test]
  2535.     foreach line [dns_getlinesbyname $name $type] {
  2536.         set record $dns_records($line)
  2537.         set dataoff [lindex $record 0]
  2538.         set data [lrange $dns_lines($line) $dataoff end]
  2539.         set data [string tolower $data]
  2540.         case $type {
  2541.             {NS CNAME PTR} {
  2542.             if [string match {*.} $data] {
  2543.                 set data [string trimright $data .]
  2544.             } else {
  2545.                 set data $data.[lindex $record 4]
  2546.             }
  2547.             if {$data == $test} {
  2548.                 return $line
  2549.             }
  2550.             }
  2551.             {A} {
  2552.             if [addrmatch $data $test] {
  2553.                 return $line
  2554.             }
  2555.             }
  2556.             {MX RP HINFO} {
  2557.             regsub -all "\"" $data "" data
  2558.             regsub -all "\"" $test "" test
  2559.             if {([lindex $data 0] == [lindex $test 0]) && \
  2560.                 ([lindex $data 1] == [lindex $test 1])} {
  2561.                 return $line
  2562.             }
  2563.             }
  2564.             {TXT} {
  2565.             regsub -all "\"" $data "" data
  2566.             regsub -all "\"" $test "" test
  2567.             if {$data == $test} {
  2568.                 return $line
  2569.             }
  2570.             }
  2571.             default {
  2572.             if {$data == $test} {
  2573.                 return $line
  2574.             }
  2575.             }
  2576.         }
  2577.     }
  2578.     return {}
  2579. }
  2580. proc dns_getdatabyname {name type} {
  2581.     global dns_lines dns_records
  2582.     set type [string toupper $type]
  2583.     set result {}
  2584.     foreach line [dns_getlinesbyname $name $type] {
  2585.         set record $dns_records($line)
  2586.         set dataoff [lindex $record 0]
  2587.         set data [lindex $dns_lines($line) $dataoff]
  2588.         case $type {
  2589.             {NS CNAME PTR} {
  2590.             if [string match {*.} $data] {
  2591.                 set data [string trimright $data .]
  2592.             } 
  2593.             }
  2594.         }
  2595.         lappend result $data
  2596.     }
  2597.     return $result
  2598. }
  2599. proc dns_getnamesbytype {type} {
  2600.     global dns_namelines dns_records
  2601.     set type [string toupper $type]
  2602.     set result {}
  2603.     foreach name [array names dns_namelines] {
  2604.         foreach line $dns_namelines($name) {
  2605.             set record $dns_records($line)
  2606.             if {[lindex $record 3] == $type} {
  2607.                 lappend result $name
  2608.                 break
  2609.             }
  2610.         }
  2611.     }
  2612.     return [lsort $result]
  2613. }
  2614. proc dns_getservers {name} {
  2615.     set serverList {}
  2616.     set servers [dns_getdatabyname $name ns]
  2617.     foreach server $servers {
  2618.           set addrs [dns_getaddrs $server]
  2619.         lappend serverList [list $server $addrs]
  2620.     }
  2621.     return $serverList
  2622. }
  2623. proc MakeFQDN {host} {
  2624.     if ![cequal [cindex $host end ] "."] {
  2625.     return [format "%s." $host]
  2626.     } else {
  2627.     return $host
  2628.     }
  2629. }
  2630. proc dns_addserver {dname hname addrs comment} {
  2631.     dns_addline end [MakeFQDN $dname] 0 NS $hname $comment
  2632.     foreach addr $addrs {
  2633.     dns_addline end $hname 0 A $addr {}
  2634.     }
  2635. }
  2636. proc dns_rmserver {dname {hname {}}} {
  2637.     global dns_namelines dns_records dns_lines dns_lineindexes
  2638.     set dname [string tolower $dname]
  2639.     set hname [string tolower $hname]
  2640.     if [catch {set linelist $dns_namelines($dname)}] {
  2641.         ErrorPush {} 1 SCO_OSA_ERR_NO_SUCH_OBJECT_INSTANCE "$dname"
  2642.     }
  2643.     foreach line $linelist {
  2644.         set record $dns_records($line)
  2645.         if {[lindex $record 3] == "NS"} {
  2646.         set dataoff [lindex $record 0]
  2647.         set data [string tolower [lindex $dns_lines($line) $dataoff]]
  2648.         if [string match {*.} $data] {
  2649.             set data [string trimright $data .]
  2650.         }
  2651.         if {$hname != {}} {
  2652.             if {$data == $hname} {
  2653.             dns_rmline $line
  2654.             dns_rmhost $data
  2655.             return
  2656.             }
  2657.         } else {
  2658.             dns_rmline $line
  2659.             dns_rmhost $data
  2660.         }
  2661.         }
  2662.     }
  2663. }
  2664. proc dns_addhost {name addrs aliases mxs rps txts hinfos comment} {
  2665.     global dns_namelines
  2666.     if {($name == {}) || ($addrs == {})} {
  2667.         ErrorPush {} 1 SCO_DNSOSA_ERR_NO_HOST
  2668.     }
  2669.     if { ! [catch {set linelist $dns_namelines($name)}]} {
  2670.          ErrorPush {} 1 SCO_OSA_ERR_DUPLICATE_MANAGED_OBJECT_INSTANCE "host"
  2671.     }
  2672.     foreach addr $addrs {
  2673.         dns_addaddr $name $addr $comment
  2674.         set comment {}
  2675.     }
  2676.     foreach txt $txts {
  2677.         dns_addtxt $name $txt
  2678.     }
  2679.     foreach rp $rps {
  2680.         dns_addrp $name $rp
  2681.     }
  2682.     foreach mx $mxs {
  2683.         dns_addmx $name $mx
  2684.     }
  2685.     foreach hinfo $hinfos {
  2686.         dns_addhinfo $name $hinfo
  2687.     }
  2688.     foreach alias $aliases {
  2689.         dns_addalias $name $alias
  2690.     }
  2691. }
  2692. proc dns_rmhost {name} {
  2693.     global dns_namelines dns_cnames dns_mx dns_rp dns_hinfo dns_txt
  2694.     if [catch {set linelist $dns_namelines($name)}] {
  2695.         ErrorPush {} 1 SCO_OSA_ERR_NO_SUCH_OBJECT_INSTANCE "$name"
  2696.     }
  2697.     foreach line $linelist {
  2698.         dns_rmline $line
  2699.     }
  2700.     unset dns_namelines($name)
  2701.     foreach alias $dns_cnames($name) {
  2702.         foreach line $dns_namelines($alias) {
  2703.             dns_rmline $line
  2704.         }
  2705.         unset dns_namelines($alias)
  2706.     }
  2707.     unset dns_cnames($name)
  2708.     unset dns_mx($name)
  2709.     unset dns_rp($name)
  2710.     unset dns_hinfo($name)
  2711.     unset dns_txt($name)
  2712. }
  2713. proc dns_getaddrs {name} {
  2714.     return [dns_getdatabyname $name a]
  2715. }
  2716. proc dns_setaddrs {name addrList} {
  2717.     set curaddrs [dns_getaddrs $name]
  2718.     set newaddrs [lsubtract $addrList $curaddrs addrmatch]
  2719.     set rmaddrs [lsubtract $curaddrs $addrList addrmatch]
  2720.     set comment [dns_getcomment $name]
  2721.     foreach addr $newaddrs {
  2722.         dns_addaddr $name $addr $comment
  2723.         set comment {}
  2724.     }
  2725.     foreach addr $rmaddrs {
  2726.         dns_rmaddr $name $addr
  2727.     }
  2728. }
  2729. proc dns_addaddrs {name addrList comment} {
  2730.     set curaddrs [dns_getaddrs $name]
  2731.     set newaddrs [lsubtract $addrList $curaddrs addrmatch]
  2732.     foreach addr $newaddrs {
  2733.         dns_addaddr $name $addr $comment
  2734.         set comment {}
  2735.     }
  2736. }
  2737. proc dns_rmaddrs {name addrList} {
  2738.     set curaddrs [dns_getaddrs $name]
  2739.     set rmaddrs [lsubtract $curaddrs $addrList addrmatch]
  2740.     if [lempty $rmaddrs] {
  2741.         ErrorPush {} 1 SCO_DNSOSA_ERR_RM_LAST_ADDR $name
  2742.     }
  2743.     foreach addr $addrList {
  2744.         dns_rmaddr $name $addr
  2745.     }
  2746. }
  2747. proc dns_addaddr {name addr comment} {
  2748.     dns_addline end $name 0 A $addr $comment
  2749. }
  2750. proc dns_rmaddr {name addr} {
  2751.     if {[set line [dns_getlinebydata $name A $addr]] == {} } {
  2752.         ErrorPush {} 1 SCO_DNSOSA_ERR_NO_ADDR [list $addr $name]
  2753.     }
  2754.     dns_rmline $line
  2755. }
  2756. proc dns_getaliases {name} {
  2757.     global dns_cnames
  2758.     if [catch {set result $dns_cnames($name)}] {
  2759.         ErrorPush {} 1 SCO_OSA_ERR_NO_SUCH_OBJECT_INSTANCE "$name"
  2760.     }
  2761.     return $result
  2762. }
  2763. proc dns_setaliases {name aliases} {
  2764.     global dns_cnames
  2765.     set curaliases [dns_getaliases $name]
  2766.     set newaliases [lsubtract $aliases $curaliases]
  2767.     set rmaliases [lsubtract $curaliases $aliases]
  2768.     foreach alias $rmaliases {
  2769.         dns_rmalias $name $alias
  2770.     }
  2771.     foreach alias $newaliases {
  2772.         dns_addalias $name $alias
  2773.     }
  2774.     set dns_cnames($name) $aliases
  2775. }
  2776. proc dns_addaliases {name aliases} {
  2777.     set curaliases [dns_getaliases $name]
  2778.     set newaliases [lsubtract $aliases $curaliases]
  2779.     foreach alias $newaliases {
  2780.         dns_addalias $name $alias
  2781.     }
  2782. }
  2783. proc dns_addalias {name alias} {
  2784.     dns_addline end $alias 0 CNAME $name {}
  2785. }
  2786. proc dns_rmaliases {name aliases} {
  2787.     global dns_cnames
  2788.     set curaliases [dns_getaliases $name]
  2789.     set rmaliases [lsubtract $curaliases $aliases]
  2790.     foreach alias $aliases {
  2791.         dns_rmalias $name $alias
  2792.     }
  2793.     set dns_cnames($name) $rmaliases
  2794. }
  2795. proc dns_rmalias {name alias} {
  2796.     if {[set line [dns_getlinebydata $alias CNAME $name]] == {} } {
  2797.         ErrorPush {} 1 SCO_DNSOSA_ERR_NO_ALIAS [list $alias $name]
  2798.     }
  2799.     dns_rmline $line
  2800. }
  2801. proc dns_getmxs {name} {
  2802.     global dns_mx
  2803.     if [catch {set result $dns_mx($name)}] {
  2804.         ErrorPush {} 1 SCO_OSA_ERR_NO_SUCH_OBJECT_INSTANCE "$name"
  2805.     }
  2806.     return $result
  2807. }
  2808. proc dns_setmxs {name mxs} {
  2809.     global dns_mx
  2810.     set curmxs [dns_getmxs $name]
  2811.     set newmxs [lsubtract $mxs $curmxs]
  2812.     set rmmxs [lsubtract $curmxs $mxs]
  2813.     foreach mx $rmmxs {
  2814.         dns_rmmx $name $mx
  2815.     }
  2816.     foreach mx $newmxs {
  2817.         dns_addmx $name $mx
  2818.     }
  2819.     set dns_mx($name) $mxs
  2820. }
  2821. proc dns_addmxs {name mxs} {
  2822.     set curmxs [dns_getmxs $name]
  2823.     set newmxs [lsubtract $mxs $curmxs]
  2824.     foreach mx $newmxs {
  2825.         dns_addmx $name $mx
  2826.     }
  2827. }
  2828. proc dns_addmx {name mx} {
  2829.     dns_addline end $name 0 MX $mx {}
  2830. }
  2831. proc dns_rmmxs {name mxs} {
  2832.     global dns_mx
  2833.     set curmxs [dns_getmxs $name]
  2834.     set rmmxs [lsubtract $curmxs $mxs]
  2835.     foreach mx $mxs {
  2836.         dns_rmmx $name "$mx"
  2837.     }
  2838.     set dns_mx($name) $rmmxs
  2839. }
  2840. proc dns_rmmx {name mx} {
  2841.     if {[set line [dns_getlinebydata $name MX $mx]] == {} } {
  2842.         ErrorPush {} 1 SCO_DNSOSA_ERR_NO_MX [list $mx $name]
  2843.     }
  2844.     dns_rmline $line
  2845. }
  2846. proc dns_getrps {name} {
  2847.     global dns_rp
  2848.     if [catch {set result $dns_rp($name)}] {
  2849.         ErrorPush {} 1 SCO_OSA_ERR_NO_SUCH_OBJECT_INSTANCE "$name"
  2850.     }
  2851.     return $result
  2852. }
  2853. proc dns_setrps {name rps} {
  2854.         global dns_rp
  2855.     set currps [dns_getrps $name]
  2856.     set newrps [lsubtract $rps $currps]
  2857.     set rmrps [lsubtract $currps $rps]
  2858.     foreach rp $rmrps {
  2859.         dns_rmrp $name $rp
  2860.     }
  2861.     foreach rp $newrps {
  2862.         dns_addrp $name $rp
  2863.     }
  2864.     set dns_rp($name) $rps
  2865. }
  2866. proc dns_addrps {name rps} {
  2867.     set currps [dns_getrps $name]
  2868.     set newrps [lsubtract $rps $currps]
  2869.     foreach rp $newrps {
  2870.         dns_addrp $name $rp
  2871.     }
  2872. }
  2873. proc dns_addrp {name rp} {
  2874.     dns_addline end $name 0 RP $rp {}
  2875. }
  2876. proc dns_rmrps {name rps} {
  2877.         global dns_rp
  2878.     set currps [dns_getrps $name]
  2879.     set rmrps [lsubtract $currps $rps]
  2880.     foreach rp $rps {
  2881.         dns_rmrp $name $rp
  2882.     }
  2883.     set dns_rp($name) $rmrps
  2884. }
  2885. proc dns_rmrp {name rp} {
  2886.     if {[set line [dns_getlinebydata $name RP $rp]] == {} } {
  2887.         ErrorPush {} 1 SCO_DNSOSA_ERR_NO_RP [list $rp $name]
  2888.     }
  2889.     dns_rmline $line
  2890. }
  2891. proc dns_gettxts {name} {
  2892.     global dns_txt
  2893.     if [catch {set result $dns_txt($name)}] {
  2894.         ErrorPush {} 1 SCO_OSA_ERR_NO_SUCH_OBJECT_INSTANCE "$name"
  2895.     }
  2896.     regsub -all "\"" $result "" result
  2897.     return $result
  2898. }
  2899. proc dns_settxts {name txts} {
  2900.         global dns_txt
  2901.     set curtxts [dns_gettxts $name]
  2902.     set newtxts [lsubtract $txts $curtxts]
  2903.     set rmtxts [lsubtract $curtxts $txts]
  2904.     foreach txt $rmtxts {
  2905.         dns_rmtxt $name $txt
  2906.     }
  2907.     foreach txt $newtxts {
  2908.         dns_addtxt $name $txt
  2909.     }
  2910.     set dns_txt($name) $txts
  2911. }
  2912. proc dns_addtxts {name txts} {
  2913.     set curtxts [dns_gettxts $name]
  2914.     set newtxts [lsubtract $txts $curtxts]
  2915.     foreach txt $newtxts {
  2916.         dns_addtxt $name $txt
  2917.     }
  2918. }
  2919. proc dns_addtxt {name txt} {
  2920.     dns_addline end $name 0 TXT "\"$txt\"" {}
  2921. }
  2922. proc dns_rmtxts {name txts} {
  2923.         global dns_txt
  2924.     set curtxts [dns_gettxts $name]
  2925.     set rmtxts [lsubtract $curtxts $txts]
  2926.     foreach txt $txts {
  2927.         dns_rmtxt $name $txt
  2928.     }
  2929.     set dns_txt($name) $rmtxts
  2930. }
  2931. proc dns_rmtxt {name txt} {
  2932.     if {[set line [dns_getlinebydata $name TXT $txt]] == {} } {
  2933.         ErrorPush {} 1 SCO_DNSOSA_ERR_NO_TXT [list $txt $name]
  2934.     }
  2935.     dns_rmline $line
  2936. }
  2937. proc dns_gethinfos {name} {
  2938.     global dns_hinfo
  2939.     if [catch {set result $dns_hinfo($name)}] {
  2940.         ErrorPush {} 1 SCO_OSA_ERR_NO_SUCH_OBJECT_INSTANCE "$name"
  2941.     }
  2942.     return $result
  2943. }
  2944. proc dns_sethinfos {name hinfos} {
  2945.         global dns_hinfo
  2946.     set curhinfos [dns_gethinfos $name]
  2947.     set newhinfos [lsubtract $hinfos $curhinfos]
  2948.     set rmhinfos [lsubtract $curhinfos $hinfos]
  2949.     foreach hinfo $rmhinfos {
  2950.         dns_rmhinfo $name $hinfo
  2951.     }
  2952.     foreach hinfo $newhinfos {
  2953.         dns_addhinfo $name $hinfo
  2954.     }
  2955.     set hinfos [lindex $hinfos 0]
  2956.     keylget hinfos hw hw
  2957.     keylget hinfos os os
  2958.     set dns_hinfo($name) [list [format "%s %s" $hw $os]]
  2959. }
  2960. proc dns_addhinfos {name hinfos} {
  2961.     set curhinfos [dns_gethinfos $name]
  2962.     set newhinfos [lsubtract $hinfos $curhinfos]
  2963.     foreach hinfo $newhinfos {
  2964.         dns_addhinfo $name $hinfo
  2965.     }
  2966. }
  2967. proc dns_addhinfo {name hinfo} {
  2968.     set hw {}
  2969.     set os {}
  2970.     keylget hinfo hw hw
  2971.     keylget hinfo os os
  2972.     if {[llength $hw] > 1} {
  2973.         set hw "\"$hw\""
  2974.     }
  2975.     if {[llength $os] > 1} {
  2976.         set os "\"$os\""
  2977.     }
  2978.     if {[lempty $hw] || [lempty $os]} {
  2979.         return
  2980.     }
  2981.     dns_addline end $name 0 HINFO "$hw $os" {}
  2982. }
  2983. proc dns_rmhinfos {name hinfos} {
  2984.         global dns_hinfo
  2985.     set curhinfos [dns_gethinfos $name]
  2986.     set rmhinfos [lsubtract $curhinfos $hinfos]
  2987.     foreach hinfo $hinfos {
  2988.         dns_rmhinfo $name $hinfo
  2989.     }
  2990.     set dns_hinfo($name) $rmhinfos
  2991. }
  2992. proc dns_rmhinfo {name hinfo} {
  2993.     if {[set line [dns_getlinebydata $name HINFO $hinfo]] == {} } {
  2994.         ErrorPush {} 1 SCO_DNSOSA_ERR_NO_HINFO [list $hinfo $name]
  2995.     }
  2996.     dns_rmline $line
  2997. }
  2998. proc dns_getcomment {name} {
  2999.     global dns_namelines dns_lines
  3000.     if [catch {set linelist $dns_namelines($name)}] {
  3001.         ErrorPush {} 1 SCO_OSA_ERR_NO_SUCH_OBJECT_INSTANCE "$name"
  3002.     }
  3003.     foreach line $linelist {
  3004.         if [regsub {([^;]*);(.*$)} $dns_lines($line) {\2} foo] {
  3005.             return $foo
  3006.         }
  3007.     }
  3008.     return {}
  3009. }
  3010. proc dns_setcomment {name comment} {
  3011.     global dns_namelines dns_lines
  3012.     if [catch {set linelist $dns_namelines($name)}] {
  3013.         ErrorPush {} 1 SCO_OSA_ERR_NO_SUCH_OBJECT_INSTANCE "$name"
  3014.     }
  3015.     if {$comment == {}} {
  3016.         return
  3017.     }
  3018.     foreach line $linelist {
  3019.         if [regsub {([^;]*);(.*$)} $dns_lines($line) {\1} foo] {
  3020.             set $dns_lines($line) "$foo ; $comment"
  3021.             dns_markmodified $line
  3022.             return
  3023.         }
  3024.     }
  3025.     append dns_lines([lindex $linelist 0]) " ; $comment"
  3026.     dns_markmodified [lindex $linelist 0]
  3027.     return
  3028. }
  3029. proc dns_markmodified {index} {
  3030.     global dns_openfiles dns_modified
  3031.     set handle [lindex [split $index .] 0]
  3032.     keylset dns_openfiles($handle) modified 1
  3033.     set dns_modified 1
  3034.     return
  3035. }
  3036. proc dns_readdomain {domain} {
  3037.     global dns_domain
  3038.     if {$dns_domain == $domain} {
  3039.         return
  3040.     }
  3041.     if {[set file [get_rrfile $domain]] == ""} {
  3042.         ErrorPush {} 1 SCO_DNSOSA_ERR_DOMAIN $domain
  3043.     }
  3044.     dns_readfile $domain $file
  3045. }
  3046. proc dns_readfile {domain file} {
  3047.     global dns_outercontext
  3048.     global dns_openfiles dns_filename dns_addhandle
  3049.     global dns_origin dns_lastname dns_soa dns_domain dns_newindex
  3050.     global dns_lineindexes dns_lines dns_records dns_cnames dns_namelines
  3051.     global dns_hinfo dns_rp dns_mx dns_txt
  3052.     if {$dns_domain == $domain} {
  3053.         return
  3054.     }
  3055.     dns_writefile
  3056.     catch {unset dns_lines}
  3057.     catch {unset dns_lineindexes}
  3058.     catch {unset dns_records}
  3059.     catch {unset dns_cnames}
  3060.     catch {unset dns_hinfo}
  3061.     catch {unset dns_rp}
  3062.     catch {unset dns_mx}
  3063.     catch {unset dns_txt}
  3064.     catch {unset dns_namelines}
  3065.     catch {unset dns_openfiles}
  3066.     set dns_origin $domain
  3067.     set dns_domain $domain
  3068.     set dns_lastname {??}
  3069.     set dns_soa ""
  3070.     set dns_filename [dns_locate $file]
  3071.     set infile [ownerOpen readfile $dns_filename]
  3072.     if {$infile == -1} {
  3073.         ErrorPush {} 1 SCO_DNSOSA_ERR_OPEN_RD $dns_filename
  3074.     }
  3075.     keylset dns_openfiles($infile) name $dns_filename modified 0
  3076.     scanfile $dns_outercontext $infile
  3077.     foreach handle [array names dns_openfiles] {
  3078.         close $handle
  3079.     }
  3080.     set dns_addhandle $infile
  3081.     set dns_newindex 0
  3082. }
  3083. proc dns_writefile {} {
  3084.     global dns_modified dns_lineindexes dns_lines dns_openfiles
  3085.     global restart_server
  3086.     if {$dns_modified} {
  3087.         storeSOA
  3088.         foreach handle [array names dns_openfiles] {
  3089.             set fdata $dns_openfiles($handle)
  3090.             if {[keylget fdata modified]} {
  3091.                 set fname [keylget fdata name]
  3092.                 backup_file $fname
  3093.                 set outhandle [ownerOpen writefile $fname]
  3094.                 if {$outhandle == -1} {
  3095.                     ErrorPush {} 1 SCO_DNSOSA_ERR_NO_FILE $fname
  3096.                 }
  3097.                 keylset dns_openfiles($handle) outhandle $outhandle
  3098.             }
  3099.         }
  3100.         foreach line $dns_lineindexes {
  3101.             set inhandle [lindex [split $line .] 0]
  3102.             if [keylget dns_openfiles($inhandle) outhandle outhandle] {
  3103.                 puts $outhandle $dns_lines($line)
  3104.             }
  3105.         }
  3106.         foreach handle [array names dns_openfiles] {
  3107.             if [keylget dns_openfiles($handle) outhandle outhandle] {
  3108.                 close $outhandle
  3109.             }
  3110.         }
  3111.         set restart_server 1
  3112.     }
  3113.     set dns_modified 0
  3114. }
  3115. proc dns_init {} {
  3116.     global dns_domain dns_modified
  3117.     setup_RR_scancontexts
  3118.     set dns_domain ""
  3119.     set dns_modified 0
  3120. }
  3121. proc ht_getaddr line {
  3122.     return [lindex $line 0]
  3123. }
  3124. proc ht_getaliases line {
  3125.     return [lrange [lindex [split $line #] 0] 1 end]
  3126. }
  3127. proc ht_getcomment line {
  3128.     set foo [split $line #]
  3129.     if {[llength $foo] == 1} {
  3130.         return {}
  3131.     }
  3132.     return [string trim [lindex $foo 1]]
  3133. }
  3134. proc setup_host_scancontext {} {
  3135.     global host_scontext
  3136.     set host_scontext [scancontext create]
  3137.     scanmatch $host_scontext {^} {
  3138.         global host_lines host_lineindexes
  3139.         set lineindex $matchInfo(linenum)
  3140.         set host_lines($lineindex) $matchInfo(line)
  3141.         lappend host_lineindexes $lineindex
  3142.     }
  3143.     scanmatch $host_scontext {(^[     ]*#)|(^[     ]*$)} {
  3144.         continue
  3145.     }
  3146.     scanmatch $host_scontext {^[     ]*[0-9.]+[     ]+[^     #]+} {
  3147.         global host_byaddr host_byname
  3148.         set host_byaddr($lineindex) [ht_getaddr $matchInfo(line)]
  3149.         set host_byname($lineindex) [ht_getaliases $matchInfo(line)]
  3150.         continue
  3151.     }
  3152.     scanmatch $host_scontext "^" {
  3153.         ErrorPush {} 1 SCO_DNSOSA_ERR_BAD_LINE $matchInfo(line)
  3154.     }
  3155. }
  3156. proc host_list {} {
  3157.     global host_byname
  3158.     if [catch {array names host_byname} result] {
  3159.         set result {}
  3160.     }
  3161.     return [lrmdups $result]
  3162. }
  3163. proc host_addhost {name addr aliases comment} {
  3164.     global host_lines host_lineindexes host_newindex host_modified
  3165.     global host_byaddr host_byname
  3166.     if {($aliases == {}) || ($addr == {})} {
  3167.         ErrorPush {} 1 SCO_DNSOSA_ERR_NO_HOST
  3168.     }
  3169.     if {[lempty $comment]} {
  3170.         set line "$addr    $aliases"
  3171.     } else {
  3172.         set line "$addr    $aliases    # $comment"
  3173.     }
  3174.     set lineindex [format "new_%s" $host_newindex]
  3175.     incr host_newindex
  3176.     set host_lines($lineindex) $line
  3177.     lappend host_lineindexes $lineindex
  3178.     set host_byaddr($lineindex) $addr
  3179.     set host_byname($lineindex) $aliases
  3180.     set host_modified 1
  3181.     return $lineindex
  3182. }
  3183. proc host_rmhost {lineindex} {
  3184.     global host_lineindexes host_byname host_byaddr
  3185.     global host_modified host_lines
  3186.     if {![info exists host_byname($lineindex)]} {
  3187.         ErrorPush {} 1 SCO_OSA_ERR_NO_SUCH_OBJECT_INSTANCE "$lineindex"
  3188.     }
  3189.     set line $host_lines($lineindex)
  3190.     if {[set index [lsearch $host_lineindexes $lineindex]] == -1} {
  3191.         ErrorPush {} 1 SCO_DNSOSA_ERR_ILLEGAL \
  3192.         [list "host_rmline" $lineindex]
  3193.     }
  3194.     lvarpop host_lineindexes $index
  3195.     unset host_lines($lineindex)
  3196.     unset host_byaddr($lineindex)
  3197.     unset host_byname($lineindex)
  3198.     set host_modified 1
  3199. }
  3200. proc host_getindex {lineindex} {
  3201.     global host_byname
  3202.     if {! [info exists host_byname($lineindex)]} {
  3203.         ErrorPush {} 1 SCO_OSA_ERR_NO_SUCH_OBJECT_INSTANCE "$lineindex"
  3204.     }
  3205.     return $lineindex
  3206. }
  3207. proc host_getname {lineindex} {
  3208.     global host_byname
  3209.     return $host_byname([host_getindex $lineindex])
  3210. }
  3211. proc host_getaddr {lineindex} {
  3212.     global host_byname host_lines
  3213.     if {! [info exists host_byname($lineindex)]} {
  3214.         ErrorPush {} 1 SCO_OSA_ERR_NO_SUCH_OBJECT_INSTANCE "$lineindex"
  3215.     }
  3216.     return [ht_getaddr $host_lines($lineindex)]
  3217. }
  3218. proc host_setaddrs {lineindex addr} {
  3219.     global host_byname host_lines host_byaddr host_modified
  3220.     if {[llength $addr] != 1} {
  3221.         ErrorPush {} 1 SCO_DNSOSA_ERR_HOSTS
  3222.     }
  3223.     if {! [info exists host_byname($lineindex)]} {
  3224.         ErrorPush {} 1 SCO_OSA_ERR_NO_SUCH_OBJECT_INSTANCE "$lineindex"
  3225.     }
  3226.     set oldaddr [ht_getaddr $host_lines($lineindex)]
  3227.     unset host_byaddr($lineindex)
  3228.     set host_byaddr($lineindex) $addr
  3229.     set host_lines($lineindex) [lreplace $host_lines($lineindex) 0 0 $addr]
  3230.     set host_modified 1
  3231. }
  3232. proc host_addaddr {name addr} {
  3233.     ErrorPush {} 1 SCO_DNSOSA_ERR_HOSTS
  3234. }
  3235. proc host_rmaddr {name addr} {
  3236.     ErrorPush {} 1 SCO_DNSOSA_ERR_HOSTS
  3237. }
  3238. proc host_getaliases {lineindex} {
  3239.     global host_byname host_lines
  3240.     if {! [info exists host_byname($lineindex)]} {
  3241.         ErrorPush {} 1 SCO_OSA_ERR_NO_SUCH_OBJECT_INSTANCE "$lineindex"
  3242.     }
  3243.     return [ht_getaliases $host_lines($lineindex)]
  3244. }
  3245. proc host_setaliases {lineindex aliases} {
  3246.     global host_byname host_lines host_modified
  3247.     if {! [info exists host_byname($lineindex)]} {
  3248.         ErrorPush {} 1 SCO_OSA_ERR_NO_SUCH_OBJECT_INSTANCE "$lineindex"
  3249.     }
  3250.     set line $host_lines($lineindex)
  3251.     set addr [ht_getaddr $line]
  3252.     set comment [ht_getcomment $line]
  3253.     if {[lempty $comment]} {
  3254.         set host_lines($lineindex) "$addr    $aliases"
  3255.     } else {
  3256.         set host_lines($lineindex) "$addr    $aliases    # $comment"
  3257.     }
  3258.     set host_modified 1
  3259. }
  3260. proc host_addalias {name alias} {
  3261.     global host_byname host_lines
  3262.     if [catch {set lineindex $host_byname($name)}] {
  3263.         ErrorPush {} 1 SCO_OSA_ERR_NO_SUCH_OBJECT_INSTANCE "$name"
  3264.     }
  3265.     set aliases [ht_getaliases $host_lines($lineindex)]
  3266.     lappend aliases $alias
  3267.     host_setaliases $name $aliases
  3268. }
  3269. proc host_rmalias {name alias} {
  3270.     global host_byname host_lines
  3271.     if [catch {set lineindex $host_byname($name)}] {
  3272.         ErrorPush {} 1 SCO_OSA_ERR_NO_SUCH_OBJECT_INSTANCE "$name"
  3273.     }
  3274.     set aliases [ht_getaliases $host_lines($lineindex)]
  3275.     if {[set index [lsearch $aliases $alias]] == -1} {
  3276.         ErrorPush {} 1 SCO_DNSOSA_ERR_NOT_ALIAS [list $alias {}]
  3277.     }
  3278.     lvarpop aliases $index
  3279.     host_setaliases $name $aliases
  3280. }
  3281. proc host_getcomment {lineindex} {
  3282.     global host_byname host_lines
  3283.     if {! [info exists host_byname($lineindex)]} {
  3284.         ErrorPush {} 1 SCO_OSA_ERR_NO_SUCH_OBJECT_INSTANCE "$lineindex"
  3285.     }
  3286.     return [ht_getcomment $host_lines($lineindex)]
  3287. }
  3288. proc host_setcomment {lineindex comment} {
  3289.     global host_byname host_lines host_modified
  3290.     if {! [info exists host_byname($lineindex)]} {
  3291.     ErrorPush {} 1 SCO_OSA_ERR_NO_SUCH_OBJECT_INSTANCE "$lineindex"
  3292.     }
  3293.     set line $host_lines($lineindex)
  3294.     if {[lempty $comment]} {
  3295.     set host_lines($lineindex) "[lindex [split $line #] 0]"
  3296.     } else {
  3297.     set host_lines($lineindex) "[lindex [split $line #] 0]    # $comment"
  3298.     }
  3299.     set host_modified 1
  3300. }
  3301. proc host_readfile {} {
  3302.     global host_scontext host_file host_read host_newindex
  3303.     if {$host_read} {
  3304.         return
  3305.     }
  3306.     set host_read 1
  3307.     set infile [ownerOpen readfile $host_file]
  3308.     if {$infile == -1} {
  3309.         ErrorPush {} 1 SCO_DNSOSA_ERR_OPEN_RD $host_file
  3310.     }
  3311.     scanfile $host_scontext $infile
  3312.     close $infile
  3313.     set host_newindex 0
  3314. }
  3315. proc host_writefile {} {
  3316.     global host_file host_modified host_lineindexes host_lines
  3317.     global host_read restart_server
  3318.     if {$host_read && $host_modified} {
  3319.         set outfile [ownerOpen writefile $host_file]
  3320.         if {$outfile == -1} {
  3321.             ErrorPush {} 1 SCO_DNSOSA_ERR_OPEN_WR $host_file
  3322.         }
  3323.         foreach line $host_lineindexes {
  3324.             if {![lempty $host_lines($line)]} {
  3325.             puts $outfile $host_lines($line)
  3326.             }
  3327.         }
  3328.         close $outfile
  3329.         set restart_server 1
  3330.     }
  3331.     set host_modified 0
  3332. }
  3333. proc host_init {} {
  3334.     global IPAddrMap_ConfigDir
  3335.     global host_file host_read host_modified
  3336.     setup_host_scancontext
  3337.     set host_file /etc/hosts
  3338.     set host_read 0
  3339.     set host_modified 0
  3340. }
  3341. proc GetObjectId {instance attrName depth} {
  3342.         if {[llength $instance] < [expr "$depth + 1"]} {
  3343.         ErrorPush {} 1 SCO_OSA_ERR_NO_SUCH_OBJECT_INSTANCE "$instance"
  3344.         }
  3345.         set objectString [lindex $instance $depth]
  3346.         if {[llength $objectString] == 1} {
  3347.                 return $objectString
  3348.         }
  3349.         if {[llength $objectString] != 2} {
  3350.         ErrorPush {} 1 SCO_OSA_ERR_NO_SUCH_OBJECT_INSTANCE "$objectString"
  3351.         }
  3352.         if {[lindex $objectString 0] != $attrName} {
  3353.         ErrorPush {} 1 SCO_DNSOSA_ERR_INVALID_ATTR \
  3354.             [lindex $objectString 0]
  3355.         }
  3356.         return [lindex $objectString 1]
  3357. }
  3358. proc CheckEnums {pList eList} {
  3359.     upvar $pList paramList
  3360.     upvar $eList enumList
  3361.     foreach enum $enumList {
  3362.         set arg [lindex $enum 0]
  3363.         if { ! [keylget paramList $arg value]} {
  3364.             continue
  3365.         }
  3366.         set allowed [lindex $enum 1]
  3367.         if {[lsearch $allowed $value] == -1} {
  3368.             ErrorPush {} 1 SCO_DNSOSA_ERR_BAD_VAL [list $value $arg]
  3369.         }
  3370.     }
  3371. }
  3372. proc GetValueList {pList nameList} {
  3373.     upvar $pList paramList
  3374.     set result {}
  3375.     foreach name $nameList {
  3376.         if {! [keylget paramList [lindex $name 0] value]} {
  3377.         if {[llength $name] == 2} {
  3378.             lappend result [lindex $name 1]
  3379.         } else {
  3380.             ErrorPush {} 1 SCO_DNSOSA_ERR_NO_PARAM $name
  3381.         }
  3382.         } else {
  3383.         lappend result $value
  3384.         }
  3385.     }
  3386.     return $result
  3387. }
  3388. proc GetRequiredValue {pList name} {
  3389.     upvar $pList paramList
  3390.     if {! [keylget paramList $name value]} {
  3391.         ErrorPush {} 1 SCO_DNSOSA_ERR_NO_PARAM $name
  3392.     }
  3393.     return $value
  3394. }
  3395. proc GetFilterClass {filter} {
  3396.     if {([llength $filter] != 3)
  3397.         || ([lindex $filter 0] != "objectClass")
  3398.         || ([lindex $filter 1] != "eq")} {
  3399.             error "only class filters supported: $filter"
  3400.     }
  3401.     return [lindex $filter 2]
  3402. }
  3403. proc MakeResponseList {invokeId class instance nameList} {
  3404.     set result {}
  3405.     foreach name $nameList {
  3406.         if {$instance != {}} {
  3407.             set iname [list [concat $instance $name]]
  3408.         } else {
  3409.             set iname $name
  3410.         }
  3411.         lappend result [list {operation get} \
  3412.             "invokeId $invokeId" {linkedId 1} \
  3413.             "objectClass {$class}" "objectInstance $iname" \
  3414.             "attributeList {{name $name}}" \
  3415.             {actionType {}} {actionInfo {}} {errorParameter {}}]
  3416.     }
  3417.     return $result
  3418. }
  3419. proc HandleScopedRequest {scope osaData sessionId bmipRequest} {
  3420.     global contained
  3421.     if {$scope != "firstLevelOnly"} {
  3422.         ErrorPush {} 1 SCO_DNSOSA_ERR_SCOPE $scope
  3423.     }
  3424.         set class [keylget bmipRequest objectClass]
  3425.     set invokeId [keylget bmipRequest invokeId]
  3426.         set objectList [keylget bmipRequest objectInstance]
  3427. if {$objectList == {}} {set objectList {{}}}
  3428.     set filter [keylget bmipRequest filter]
  3429.     if {$filter != {}} {
  3430.         set filterClass [GetFilterClass $filter]
  3431.     } else {
  3432.         set filterClass {}
  3433.     }
  3434.     if [catch {set classList $contained($class)}] {
  3435.         error "class $class not a container"
  3436.     }
  3437.     set heldResp {}
  3438.     foreach classData $classList {
  3439.         set containedClass [lindex $classData 0]
  3440.         if {$filterClass != {} && $filterClass != $containedClass} {
  3441.         continue
  3442.         }
  3443.         set listCommand [lindex $classData 1]
  3444.         foreach object $objectList {
  3445.         set sublist [eval $listCommand $object]
  3446.         foreach resp [MakeResponseList $invokeId $containedClass \
  3447.                             $object $sublist] {
  3448.             if {$heldResp != {}} {
  3449.             OFReturnBmipResponse $sessionId heldResp TRUE
  3450.             }
  3451.             set heldResp $resp
  3452.         }
  3453.         }
  3454.         }
  3455.     if {$heldResp != {}} {
  3456.         OFReturnBmipResponse $sessionId heldResp FALSE
  3457.     }
  3458. }
  3459. proc ValidationRoutine {osaData sessionId bmipRequest} {
  3460.     set scope [keylget bmipRequest scope]
  3461.     if {$scope != {}} {
  3462.         HandleScopedRequest $scope $osaData $sessionId $bmipRequest
  3463.         return
  3464.     }
  3465.         set class [keylget bmipRequest objectClass]
  3466.         set objectList [keylget bmipRequest objectInstance]
  3467. if {$objectList == {}} { set objectList {{}}}
  3468.         set listLength [llength $objectList]
  3469.         foreach object $objectList {
  3470.                 set bmipResponse [OFEvaluateOperation $sessionId $object]
  3471.                 incr listLength -1
  3472.                 if "($listLength < 1)" {
  3473.                         set continue FALSE
  3474.                 } {
  3475.                         set continue TRUE
  3476.                 }
  3477.                 OFReturnBmipResponse $sessionId bmipResponse $continue
  3478.         }
  3479. }
  3480. proc _keylget {var match} {
  3481.     upvar $var klist
  3482.     foreach i $klist {
  3483.     lassign $i key val
  3484.     if {[cequal $match $key]} {
  3485.         return $val
  3486.     }
  3487.     }
  3488.     return {}
  3489. }
  3490. proc named_boot_path {} {
  3491.      global IPAddrMap_ConfigDir
  3492.      return [format "%s/named.boot" $IPAddrMap_ConfigDir]
  3493. }
  3494. proc get_named_boot {} {
  3495.     set fpath [named_boot_path]
  3496.     if {[owner file exists $fpath]} {
  3497.     set res {}
  3498.     net:for_file line $fpath {
  3499.         if {[regexp {^[ |    ]*;} $line] || \
  3500.         [regexp {^[ |    ]*$} $line]} {
  3501.         continue
  3502.         }
  3503.         append res $line "\n"
  3504.     }
  3505.     return $res
  3506.     } else {
  3507.     return {}
  3508.     }
  3509. }
  3510. proc deconfig_named_boot {} {
  3511.      set fpath [named_boot_path]
  3512.      if {[owner file exists $fpath]} {
  3513.     owner unlink -nocomplain $fpath
  3514.      }
  3515. }
  3516. proc get_pid {} {
  3517.     global named_pid_file
  3518.     set ret [catch {exec /bin/ps -e | grep in.named | grep -v grep} res]
  3519.     if {(! $ret) && (! [lempty $res])}  {
  3520.     return [lindex $res 0]
  3521.     }
  3522.     return {}
  3523. }
  3524. proc restart_named {} {
  3525.     set pid [get_pid]
  3526.     if {![lempty $pid]} {
  3527.     catch {owner kill SIGHUP $pid}
  3528.     }
  3529.     return $pid
  3530. }
  3531. proc get_status {} {
  3532.     if {[lempty [get_pid]]} {
  3533.     return 0
  3534.     } else {
  3535.     return 1
  3536.     }
  3537. }
  3538. proc enable_named {} {
  3539.     if {[lempty [restart_named]]} {
  3540.     if {[id userid] == 0} {
  3541.         catch {exec /usr/sbin/in.named}
  3542.     } else {
  3543.         catch {exec /sbin/tfadmin swUser root /usr/sbin/in.named}
  3544.     }
  3545.     }
  3546. }
  3547. proc disable_named {} {
  3548.     global named_pid_file
  3549.     set pid [get_pid]
  3550.     if ![lempty $pid] {
  3551.         ;# try and kill named gracefully
  3552.     catch {owner kill SIGTERM $pid}
  3553.     catch {owner kill SIGKILL $pid}
  3554.     owner unlink -nocomplain $named_pid_file
  3555.     }
  3556. }
  3557. proc isdotteddec {string} {
  3558.     return [regexp {[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+} $string]
  3559. }
  3560. proc addrmatch {addr1 addr2} {
  3561.     if { ! ( [isdotteddec $addr1] && [isdotteddec $addr2] )} {
  3562.         return 0
  3563.     }
  3564.     set list1 [split $addr1 "."]
  3565.     set list2 [split $addr2 "."]
  3566.     loop i 0 4 {
  3567.         if {[lindex $list1 $i] != [lindex $list2 $i]} {
  3568.             return 0
  3569.         }
  3570.     }
  3571.     return 1
  3572. }
  3573. proc cvtsecs secs {
  3574.     set nums "31557600 604800 86400 3600 60 1"
  3575.     set names [IntlLocalizeMsg SCO_DNSOSA_MSG_TIME]
  3576.     set plural [IntlLocalizeMsg SCO_DNSOSA_MSG_TIMES]
  3577.     set result ""
  3578.     loop i 0 [llength $nums] {
  3579.         if {[set num [expr $secs/[lindex $nums $i]]] != 0} {
  3580.             if {$num == 1} {
  3581.                 append result " $num [lindex $names $i]"
  3582.             } else {
  3583.                 append result " $num [lindex $plural $i]"
  3584.             }
  3585.             set secs [expr "$secs % [lindex $nums $i]"]
  3586.         }
  3587.     }
  3588.     return $result
  3589. }
  3590. proc move_file {oldname newname} {
  3591.     if { ! [owner file isfile $oldname]} {
  3592.         return 0
  3593.     }
  3594.     if [catch {
  3595.         owner unlink -nocomplain $newname
  3596.         owner link $oldname $newname
  3597.         owner unlink $oldname
  3598.     }] {
  3599.         ErrorPush {} 1 SCO_DNSOSA_ERR_MV [list $oldname $newname]
  3600.     }
  3601.     return 0
  3602. }
  3603. proc backup_file {name} {
  3604.     move_file $name $name-
  3605. }
  3606. proc compare_files {f1 f2} {
  3607.     if {[id userid] == 0} {
  3608.         return [catch {exec /bin/cmp $f1 $f2}]
  3609.     } else {
  3610.         return [catch {exec /sbin/tfadmin swUser root /bin/cmp $f1 $f2}]
  3611.     }
  3612. }
  3613. proc copy_file {f1 f2} {
  3614.     if { ! [owner file isfile $f1]} {
  3615.         return 0
  3616.     }
  3617.     if {[id userid] == 0} {
  3618.         set ret [catch {exec /bin/cp -f $f1 $f2}]
  3619.     } else {
  3620.         set ret [catch {exec /sbin/tfadmin cpfile $f1 $f2}]
  3621.     }
  3622.     if {$ret} {
  3623.         ErrorPush {} 1 SCO_DNSOSA_ERR_CP [list $f1 $f2]
  3624.     }
  3625. }
  3626. proc lsubtract {list1 list2 {matcher {}}} {
  3627.     set list1 [lrmdups $list1]
  3628.     set list2 [lrmdups $list2]
  3629.     set result {}
  3630.     while {! ([lempty $list1] || [lempty $list2])} {
  3631.         set element1 [lindex $list1 0]
  3632.         set element2 [lindex $list2 0]
  3633.         if {$matcher != {}} {
  3634.             if [$matcher $element1 $element2] {
  3635.                 lvarpop list1
  3636.                 lvarpop list2
  3637.                 continue
  3638.             }
  3639.         }
  3640.         if {$element1 < $element2} {
  3641.             lappend result [lvarpop list1]
  3642.             continue
  3643.         }
  3644.         if {$element2 < $element1} {
  3645.             lvarpop list2
  3646.             continue
  3647.         }
  3648.         lvarpop list1
  3649.         lvarpop list2
  3650.     }
  3651.     if { ! [lempty $list1]} {
  3652.         set result [concat $result $list1]
  3653.     }
  3654.     return $result
  3655. }
  3656. proc lmatch {list1 list2} {
  3657.     set count 0
  3658.     while { ( ! [lempty $list1]) && ( ! [lempty $list2])} {
  3659.         if {[lvarpop list1] != [lvarpop list2]} {
  3660.             return $count
  3661.         }
  3662.         incr count
  3663.     }
  3664.     return $count
  3665. }
  3666. proc lreverse {list} {
  3667.     set len [llength $list]
  3668.     set result {}
  3669.     while {$len} {
  3670.         incr len -1
  3671.         lappend result [lindex $list $len]
  3672.     }
  3673.     return $result
  3674. }
  3675. proc BuildCacheFile {} {
  3676.     global boot_caches boot_directory
  3677.     set output [CallNonStdCmd /usr/sbin/dig ". ns" \
  3678.                 SCO_DNS_ERR_UNIX errStack]
  3679.     if [catch {array names boot_caches} linelist] {
  3680.     ErrorPush {} 1 SCO_DNSOSA_ERR_NO_CACHE
  3681.     } else {
  3682.     set cache $boot_caches([lindex $linelist 0])
  3683.     }
  3684.     if {[lempty $output] || ! [lempty $errStack]} {
  3685.     return
  3686.     }
  3687.     set fpath [format "%s/%s" $boot_directory $cache]
  3688.     set fd [ownerOpen writefile $fpath]
  3689.     if {$fd == -1} {
  3690.     ErrorPush {} 1 SCO_DNSOSA_ERR_OPEN_WR $fpath
  3691.     }
  3692.     puts $fd $output
  3693.     close $fd
  3694. }
  3695. proc BuildReverseFile {zone networks} {
  3696.     global dns_soa dns_origin boot_directory
  3697.     dns_readdomain $zone
  3698.     lassign $dns_soa ign mailbox serial refresh retry expire minimum
  3699.     set serial [SetSerial $serial noincr]
  3700.     set fpath [format "%s/db.local" $boot_directory]
  3701.     set fp [ownerOpen writefile $fpath]
  3702.     if {$fp == -1} {
  3703.         ErrorPush {} 1 SCO_DNSOSA_ERR_OPEN_WR $fpath
  3704.     }
  3705.     foreach network $networks {
  3706.     set file    [lindex $network 1]
  3707.     set fd($file) [ownerOpen writefile $file w+]
  3708.     if {$fd($file) == -1} {
  3709.         catch {unset fd($file)}
  3710.         ErrorPush {} 1 SCO_DNSOSA_ERR_OPEN_WR $file
  3711.         }
  3712.     puts $fd($file) [makeSOA "@       IN      SOA" [exec /usr/ucb/hostname]. $mailbox $serial [list $refresh $retry $expire $minimum]]
  3713.     puts $fd($file) [format "\tIN\tNS\t%s." [exec /usr/ucb/hostname]]
  3714.     }
  3715.     puts $fp [makeSOA "@       IN      SOA" [exec /usr/ucb/hostname]. $mailbox $serial [list $refresh $retry $expire $minimum]]
  3716.     puts $fp [format "\tIN\tNS\t%s." [exec /usr/ucb/hostname]]
  3717.     set hosts [lrmdups [dns_getnamesbytype A]]
  3718.     foreach host $hosts {
  3719.     set addrs [dns_getdatabyname $host a]
  3720.     foreach addr $addrs {
  3721.         foreach network $networks {
  3722.             set netaddr [lindex $network 0]
  3723.             if {[string first $netaddr $addr] > -1} {
  3724.                 set file [lindex $network 1]
  3725.                 set ptr [split $addr "."]
  3726.                 set ptr [lreverse $ptr]
  3727.                 set ptr [join $ptr "."]
  3728.                 set ptr "${ptr}.in-addr.arpa."
  3729.                     set host [string tolower $host]
  3730.                     if {! [string match {*.} $host]} {
  3731.                                 set host "${host}.${dns_origin}."
  3732.                 }
  3733.                     puts $fd($file) "$ptr    IN    PTR    $host"
  3734.                 break
  3735.             }
  3736.         }
  3737.     }
  3738.     }
  3739.     foreach file [array names fd] {
  3740.     close $fd($file)
  3741.     }
  3742.     puts $fp "1\tIN\tPTR\tlocalhost."     ;# add localhost entry
  3743.     close $fp                ;# close db.local
  3744. }
  3745. proc hostTab_open {
  3746.   class object objectRef operation subOperation filterData attribute attrValueList
  3747. handle} {
  3748.     set table [GetObjectId $object hostTabName 0]
  3749.     if {$table == "/etc/hosts"} {
  3750.         host_readfile
  3751.     } else {
  3752.         dns_readdomain $table
  3753.     }
  3754. }
  3755. proc dNSystem_get {class object refObject op subOp data attr attrValueList osaData} {
  3756.     global dns_currentmode
  3757.     case $attr {
  3758.         dNSMode {
  3759.             set result $dns_currentmode
  3760.             return [list [list $attr $result]]
  3761.         }
  3762.         dNSForwarders {
  3763.             set result [list_forwarders]
  3764.             return [list [list $attr $result]]
  3765.         }
  3766.         dNSBogusns {
  3767.             set result [list_bogusns]
  3768.             return [list [list $attr $result]]
  3769.         }
  3770.         dNSXfrnets {
  3771.             set result [list_xfrnets]
  3772.             return [list [list $attr $result]]
  3773.         }
  3774.         dNSSortlist {
  3775.             set result [list_sortlist]
  3776.             return [list [list $attr $result]]
  3777.         }
  3778.         dNSResolvers {
  3779.             set result [list_resolvers]
  3780.             return [list [list $attr $result]]
  3781.         }
  3782.         slave {
  3783.             set result [get_slaveflag]
  3784.             return [list [list $attr $result]]
  3785.         }
  3786.         OptsNoRecursion {
  3787.             set result [get_norecursionflag]
  3788.             return [list [list $attr $result]]
  3789.         }
  3790.         OptsQueryLog {
  3791.             set result [get_querylogflag]
  3792.             return [list [list $attr $result]]
  3793.         }
  3794.         OptsFetchGlue {
  3795.             set result [get_fetchglueflag]
  3796.             return [list [list $attr $result]]
  3797.         }
  3798.         XferIn {
  3799.             set result [get_xferinlimit]
  3800.             return [list [list $attr $result]]
  3801.         }
  3802.         XferPerNs {
  3803.             set result [get_xferpernslimit]
  3804.             return [list [list $attr $result]]
  3805.         }
  3806.         XferDatasize {
  3807.             set result [get_xferdatasize]
  3808.             return [list [list $attr $result]]
  3809.         }
  3810.         domain {
  3811.             set result [get_domain]
  3812.             return [list [list $attr $result]]
  3813.         }
  3814.         hostresorder {
  3815.             set result [get_hostresorder]
  3816.             return [list [list $attr $result]]
  3817.         }
  3818.         search {
  3819.             set result [get_searchorder]
  3820.             return [list [list $attr $result]]
  3821.         }
  3822.         resSortlist {
  3823.             set result [get_resSortlist]
  3824.             return [list [list $attr $result]]
  3825.         }
  3826.         name {
  3827.             return [list [list $attr dummy]]
  3828.         }
  3829.         default {
  3830.             ErrorPush {} 1 SCO_OSA_ERR_NO_SUCH_ATTRIBUTE "$attr $class"
  3831.         }
  3832.     }
  3833. }
  3834. proc dNSystem_replace {class object refObject op subOp data attr attrValueList osaData} {
  3835.     global dns_selectedmode
  3836.     set value [keylget attrValueList $attr]
  3837.     case $attr {
  3838.         dNSMode {
  3839.             set dns_selectedmode $value
  3840.             dns_done
  3841.             return 1
  3842.         }
  3843.         dNSForwarders {
  3844.             foreach forw [list_forwarders] {
  3845.                 rm_forwarder $forw
  3846.             }
  3847.             foreach forw $value {
  3848.                 add_forwarder $forw
  3849.             }
  3850.             return 1
  3851.         }
  3852.         dNSBogusns {
  3853.             foreach bogusns [list_bogusns] {
  3854.                 rm_bogusns $bogusns
  3855.             }
  3856.             foreach bogusns $value {
  3857.                 add_bogusns $bogusns
  3858.             }
  3859.             return 1
  3860.         }
  3861.         dNSXfrnets {
  3862.             foreach xfrnet [list_xfrnets] {
  3863.                 rm_xfrnets $xfrnet
  3864.             }
  3865.             foreach xfrnet $value {
  3866.                 add_xfrnets $xfrnet
  3867.             }
  3868.             return 1
  3869.         }
  3870.         dNSSortlist {
  3871.             foreach network [list_sortlist] {
  3872.                 rm_sortlist $network
  3873.             }
  3874.             foreach network $value {
  3875.                 add_sortlist $network
  3876.             }
  3877.             return 1
  3878.         }
  3879.         dNSResolvers {
  3880.             foreach res [list_resolvers] {
  3881.                 rm_resolver $res
  3882.             }
  3883.             foreach res $value {
  3884.                 add_resolver $res
  3885.             }
  3886.             return 1
  3887.         }
  3888.         domain {
  3889.             rm_domain 
  3890.             if ![lempty $value] {
  3891.                 set_domain $value
  3892.             }
  3893.             return 1
  3894.         }
  3895.         hostresorder {
  3896.             rm_hostresorder 
  3897.             set_hostresorder $value
  3898.             return 1
  3899.         }
  3900.         search {
  3901.             rm_searchorder 
  3902.             if ![lempty $value] {
  3903.                 set_searchorder $value
  3904.             }
  3905.             return 1
  3906.         }
  3907.         resSortlist {
  3908.             rm_resSortlist 
  3909.             set_resSortlist $value
  3910.             return 1
  3911.         }
  3912.         slave {
  3913.             return [set_slaveflag $value]
  3914.         }
  3915.         OptsNoRecursion {
  3916.             return [set_norecursionflag $value]
  3917.         }
  3918.         OptsQueryLog {
  3919.             return [set_querylogflag $value]
  3920.         }
  3921.         OptsFetchGlue {
  3922.             return [set_fetchglueflag $value]
  3923.         }
  3924.         XferIn {
  3925.             return [set_xferinlimit $value]
  3926.         }
  3927.         XferPerNs {
  3928.             return [set_xferpernslimit $value]
  3929.         }
  3930.         XferDatasize {
  3931.             return [set_xferdatasize $value]
  3932.         }
  3933.         default {
  3934.             ErrorPush {} 1 SCO_OSA_ERR_NO_SUCH_ATTRIBUTE "$attr $class"
  3935.         }
  3936.     }
  3937. }
  3938. proc dNSystem_add {class object refObject op subOp data attr attrValueList osaData} {
  3939.     set value [keylget attrValueList $attr]
  3940.     case $attr {
  3941.         dNSForwarders {
  3942.             foreach forw $value {
  3943.                 add_forwarder $forw
  3944.             }
  3945.         }
  3946.         dNSBogusns {
  3947.             foreach bogusns $value {
  3948.                 add_bogusns $bogusns
  3949.             }
  3950.         }
  3951.         dNSXfrnets {
  3952.             foreach xfrnet $value {
  3953.                 add_xfrnets $xfrnet
  3954.             }
  3955.         }
  3956.         dNSSortlist {
  3957.             foreach network $value {
  3958.                 add_sortlist $network
  3959.             }
  3960.         }
  3961.         dNSResolvers {
  3962.             foreach res $value {
  3963.                 add_resolver $res
  3964.             }
  3965.         }
  3966.         default {
  3967.             ErrorPush {} 1 SCO_OSA_ERR_NO_SUCH_ATTRIBUTE "$attr $class"
  3968.         }
  3969.     }
  3970. }
  3971. proc dNSystem_remove {class object refObject op subOp data attr attrValueList osaData} {
  3972.     set value [keylget attrValueList $attr]
  3973.     case $attr {
  3974.         dNSForwarders {
  3975.             foreach forw $value {
  3976.                 rm_forwarder $forw
  3977.             }
  3978.         }
  3979.         dNSBogusns {
  3980.             foreach bogusns $value {
  3981.                 rm_bogusns $bogusns
  3982.             }
  3983.         }
  3984.         dNSXfrnets {
  3985.             foreach xfrnet $value {
  3986.                 rm_xfrnets $xfrnet
  3987.             }
  3988.         }
  3989.         dNSSortlist {
  3990.             foreach network $value {
  3991.                 rm_sortlist $network
  3992.             }
  3993.         }
  3994.         dNSResolvers {
  3995.             foreach res $value {
  3996.                 rm_resolver $res
  3997.             }
  3998.         }
  3999.         default {
  4000.             ErrorPush {} 1 SCO_OSA_ERR_NO_SUCH_ATTRIBUTE "$attr $class"
  4001.         }
  4002.     }
  4003. }
  4004. proc dNSystem_action {class object refObject op subOp data attr attrValueList osaData} {
  4005.     global dns_soa
  4006.     switch $subOp {
  4007.       deconfig    { return [deconfig_named_boot]
  4008.           }
  4009.       configured  { return [get_named_boot]
  4010.           }
  4011.       enable      { return [enable_named]
  4012.                   }
  4013.       disable     { return [disable_named]
  4014.                   }
  4015.       status      { return [get_status]
  4016.           }
  4017.       restart      { return [restart_named]
  4018.           }
  4019.       ip          { set output [CallNonStdCmd /usr/sbin/host "$data" \
  4020.                 SCO_DNS_ERR_UNIX errStack]
  4021.                 if {[string length $errStack]!=0} then {
  4022.                 set output [ErrorText errStack]
  4023.                 }
  4024.             return [lindex $output end]
  4025.           }
  4026.       test        { set output [CallNonStdCmd /usr/sbin/host "-v $data" \
  4027.                 SCO_DNS_ERR_UNIX errStack]
  4028.                 if {[string length $errStack]!=0} then {
  4029.                 set output [ErrorText errStack]
  4030.                 }
  4031.             return $output
  4032.                   }
  4033.       create_root { BuildCacheFile
  4034.             return 
  4035.                   }
  4036.       create_ptr  { 
  4037.             lassign $data zone networks
  4038.             BuildReverseFile $zone $networks
  4039.             return
  4040.                   }
  4041.       default     { ErrorPush {} 1 SCO_OSA_ERR_NO_SUCH_ACTION "$subOp"
  4042.                   }
  4043.     }
  4044. }
  4045. proc hostTabEntry_get {class object refObject op subOp data attr attrValueList osaData} {
  4046.     set table [GetObjectId $object name 0]
  4047.     set entry [GetObjectId $object name 1]
  4048.     if {$table == "/etc/hosts"} {
  4049.         host_readfile
  4050.         case $attr {
  4051.             name {
  4052.                 set result [host_getindex $entry]
  4053.                 return [list [list $attr $result]]
  4054.             }
  4055.             aliasList {
  4056.                 set result [host_getaliases $entry]
  4057.                 return [list [list $attr $result]]
  4058.             }
  4059.             addrList {
  4060.                 set result [host_getaddr $entry]
  4061.                 return [list [list $attr $result]]
  4062.             }
  4063.             comment {
  4064.                 set result [host_getcomment $entry]
  4065.                 return [list [list $attr $result]]
  4066.             }
  4067.             default {
  4068.                 ErrorPush {} 1 SCO_OSA_ERR_NO_SUCH_ATTRIBUTE "$attr $class"
  4069.             }
  4070.         }
  4071.     } else {
  4072.         dns_readdomain $table
  4073.         case $attr {
  4074.             name {
  4075.                 set result $entry
  4076.                 return [list [list $attr $result]]
  4077.             }
  4078.             aliasList {
  4079.                 set result [dns_getaliases $entry]
  4080.                 return [list [list $attr $result]]
  4081.             }
  4082.             addrList {
  4083.                 set result [dns_getaddrs $entry]
  4084.                 return [list [list $attr $result]]
  4085.             }
  4086.             mxList {
  4087.                 set result [dns_getmxs $entry]
  4088.                 return [list [list $attr $result]]
  4089.             }
  4090.             rpList {
  4091.                 set result [dns_getrps $entry]
  4092.                 return [list [list $attr $result]]
  4093.             }
  4094.             txtList {
  4095.                 set result [dns_gettxts $entry]
  4096.                 return [list [list $attr $result]]
  4097.             }
  4098.             hinfoList {
  4099.                 set result [dns_gethinfos $entry]
  4100.                 lassign [lindex $result 0] hw os
  4101.                 keylset hinfo hw $hw
  4102.                 keylset hinfo os $os
  4103.                 return [list [list $attr $hinfo]]
  4104.             }
  4105.             comment {
  4106.                 set result [dns_getcomment $entry]
  4107.                 return [list [list $attr $result]]
  4108.             }
  4109.             default {
  4110.                 ErrorPush {} 1 SCO_OSA_ERR_NO_SUCH_ATTRIBUTE "$attr $class"
  4111.             }
  4112.         }
  4113.     }
  4114. }
  4115. proc hostTabEntry_replace {class object refObject op subOp data attr attrValueList osaData} {
  4116.     global dns_modified 
  4117.     set table [GetObjectId $object name 0]
  4118.     set entry [GetObjectId $object name 1]
  4119.     set value [keylget attrValueList $attr]
  4120.     if {$table == "/etc/hosts"} {
  4121.         host_readfile
  4122.         case $attr {
  4123.             aliasList {
  4124.                 set result [host_setaliases $entry $value]
  4125.             }
  4126.             addrList {
  4127.                 set result [host_setaddrs $entry $value]
  4128.             }
  4129.             comment {
  4130.                 set result [host_setcomment $entry $value]
  4131.             }
  4132.             default {
  4133.                 ErrorPush {} 1 SCO_OSA_ERR_NO_SUCH_ATTRIBUTE "$attr $class"
  4134.             }
  4135.         }
  4136.         host_writefile
  4137.     } else {
  4138.         dns_readdomain $table
  4139.         case $attr {
  4140.             aliasList {
  4141.                 set result [dns_setaliases $entry $value]
  4142.             }
  4143.             addrList {
  4144.                 set result [dns_setaddrs $entry $value]
  4145.             }
  4146.             mxList {
  4147.                 set result [dns_setmxs $entry $value]
  4148.             }
  4149.             rpList {
  4150.                 set result [dns_setrps $entry $value]
  4151.             }
  4152.             txtList {
  4153.                 set result [dns_settxts $entry $value]
  4154.             }
  4155.             hinfoList {
  4156.                 set result [dns_sethinfos $entry $value]
  4157.             }
  4158.             comment {
  4159.                 set result [dns_setcomment $entry $value]
  4160.             }
  4161.             default {
  4162.                 ErrorPush {} 1 SCO_OSA_ERR_NO_SUCH_ATTRIBUTE "$attr"
  4163.             }
  4164.         }
  4165.         set dns_modified 1
  4166.         dns_writefile
  4167.     }
  4168.     return $result
  4169. }
  4170. proc hostTabEntry_add {class object refObject op subOp data attr attrValueList osaData} {
  4171.     set table [GetObjectId $object name 0]
  4172.     set entry [GetObjectId $object name 1]
  4173.     set value [keylget attrValueList $attr]
  4174.     if {$table == "/etc/hosts"} {
  4175.         host_readfile
  4176.         case $attr {
  4177.             aliasList {
  4178.                 foreach alias $value {
  4179.                     host_addalias $entry $alias
  4180.                 }    
  4181.                 return 1
  4182.             }
  4183.             addrList {
  4184.                 return [host_addaddr $entry $value]
  4185.             }
  4186.             default {
  4187.                 ErrorPush {} 1 SCO_OSA_ERR_NO_SUCH_ATTRIBUTE "$attr"
  4188.             }
  4189.         }
  4190.         host_writefile
  4191.     } else {
  4192.         dns_readdomain $table
  4193.         case $attr {
  4194.             addrList {
  4195.                 return [dns_addaddrs $entry $value {}]
  4196.             }
  4197.             aliasList {
  4198.                 return [dns_addaliases $entry $value]
  4199.             }
  4200.             mxList {
  4201.                 return [dns_addmxs $entry $value]
  4202.             }
  4203.             rpList {
  4204.                 return [dns_addrps $entry $value]
  4205.             }
  4206.             txtList {
  4207.                 return [dns_addtxts $entry $value]
  4208.             }
  4209.             hinfoList {
  4210.                 return [dns_addhinfos $entry $value]
  4211.             }
  4212.             default {
  4213.                 ErrorPush {} 1 SCO_OSA_ERR_NO_SUCH_ATTRIBUTE "$attr"
  4214.             }
  4215.         }
  4216.     }
  4217. }
  4218. proc hostTabEntry_remove {class object refObject op subOp data attr attrValueList osaData} {
  4219.     global dns_modified
  4220.     set table [GetObjectId $object name 0]
  4221.     set entry [GetObjectId $object name 1]
  4222.     set value [keylget attrValueList $attr]
  4223.     if {$table == "/etc/hosts"} {
  4224.         host_readfile
  4225.         case $attr {
  4226.             aliasList {
  4227.                 set result [host_rmalias $entry $value]
  4228.             }
  4229.             addrList {
  4230.                 set result [host_rmaddr $entry $value]
  4231.             }
  4232.             default {
  4233.                 ErrorPush {} 1 SCO_OSA_ERR_NO_SUCH_ATTRIBUTE "$attr"
  4234.             }
  4235.         }
  4236.         host_writefile
  4237.     } else {
  4238.         dns_readdomain $table
  4239.         case $attr {
  4240.             aliasList {
  4241.                 set result [dns_rmaliases $entry $value]
  4242.             }
  4243.             addrList {
  4244.                 set result [dns_rmaddrs $entry $value]
  4245.             }
  4246.             mxList {
  4247.                 set result [dns_rmmxs $entry $value]
  4248.             }
  4249.             rpList {
  4250.                 set result [dns_rmrps $entry $value]
  4251.             }
  4252.             txtList {
  4253.                 set result [dns_rmtxts $entry $value]
  4254.             }
  4255.             hinfoList {
  4256.                 set result [dns_rmhinfos $entry $value]
  4257.             }
  4258.             default {
  4259.                 ErrorPush {} 1 SCO_OSA_ERR_NO_SUCH_ATTRIBUTE "$attr"
  4260.             }
  4261.         }
  4262.         set dns_modified 1
  4263.         dns_writefile
  4264.     }
  4265.     return $result
  4266. }
  4267. proc hostTabEntry_create {class object refObject op subOp data attr attrValueList osaData} {
  4268.     global dns_modified
  4269.     set ret 0
  4270.     set table [GetObjectId $object name 0]
  4271.     set entry [GetObjectId $object name 1]
  4272.     if {$table == "/etc/hosts"} {
  4273.         host_readfile
  4274.         set vlist [GetValueList attrValueList {addrList {aliasList {}} {comment {}}}]
  4275.         set ret [eval host_addhost $entry $vlist]
  4276.         host_writefile
  4277.     } else {
  4278.         dns_readdomain $table
  4279.         set vlist [GetValueList attrValueList {addrList {aliasList {}} {mxList {}} {rpList {}} {txtList {}} {hinfoList {}} {comment {}}}]
  4280.         eval dns_addhost $entry $vlist
  4281.         set dns_modified 1
  4282.         dns_writefile
  4283.     }
  4284.     return $ret
  4285. }
  4286. proc hostTabEntry_delete {class object refObject op subOp data attr attrValueList osaData} {
  4287.     set table [GetObjectId $object name 0]
  4288.     set entry [GetObjectId $object name 1]
  4289.     if {$table == "/etc/hosts"} {
  4290.         host_readfile
  4291.         host_rmhost $entry
  4292.         host_writefile
  4293.     } else {
  4294.         dns_readdomain $table
  4295.         dns_rmhost $entry
  4296.     }
  4297. }
  4298. proc hostTabEntry_list {class object refObject op subOp data attr attrValueList osaData} {
  4299.     set table [GetObjectId $object name 0]
  4300.     if {$table == "/etc/hosts"} {
  4301.         host_readfile
  4302.         set objects [host_list]
  4303.     } else {
  4304.         dns_readdomain $table
  4305.         set objects [lrmdups [dns_getnamesbytype A]]
  4306.     }
  4307.     set results {}
  4308.         foreach object $objects {
  4309.         lappend results [list $table $object]
  4310.     }
  4311.     return $results
  4312. }
  4313. proc hostTabs_get {class object refObject op subOp data attr attrValueList osaData} {
  4314.     case $attr {
  4315.         name {
  4316.             return [list [list $attr dummy]]
  4317.         }
  4318.         default {
  4319.             ErrorPush {} 1 SCO_OSA_ERR_NO_SUCH_ATTRIBUTE "$attr"
  4320.         }
  4321.     }
  4322. }
  4323. proc dNSSecondary_get {class object refObject op subOp data attr attrValueList osaData} {
  4324.     set domain [GetObjectId $object name 0]
  4325.     case $attr {
  4326.         name {
  4327.             set result $domain
  4328.             return [list [list $attr $result]]
  4329.         }
  4330.         serverList {
  4331.             set result [lindex [get_secondary $domain] 0]
  4332.             return [list [list $attr $result]]
  4333.         }
  4334.         file {
  4335.             set result [lindex [get_secondary $domain] 1]
  4336.             return [list [list $attr $result]]
  4337.         }
  4338.         default {
  4339.             ErrorPush {} 1 SCO_OSA_ERR_NO_SUCH_ATTRIBUTE "$attr"
  4340.         }
  4341.     }
  4342. }
  4343. proc dNSSecondary_add {class object refObject op subOp data attr attrValueList osaData} {
  4344.     set domain [GetObjectId $object name 0]
  4345.     set value [keylget attrValueList $attr]
  4346.     case $attr {
  4347.         serverList {
  4348.             foreach serv $value {
  4349.                 sec_addserver $domain $serv
  4350.             }
  4351.             return
  4352.         }
  4353.         default {
  4354.             ErrorPush {} 1 SCO_OSA_ERR_NO_SUCH_ATTRIBUTE "$attr"
  4355.         }
  4356.     }
  4357. }
  4358. proc dNSSecondary_replace {class object refObject op subOp data attr attrValueList osaData} {
  4359.     set domain [GetObjectId $object name 0]
  4360.     set value [keylget attrValueList $attr]
  4361.     case $attr {
  4362.         serverList {
  4363.             set curlist [lindex [get_secondary $domain] 0]
  4364.                 set newlist [lsubtract $value $curlist]
  4365.                 set rmlist  [lsubtract $curlist $value]
  4366.                 foreach serv $rmlist {
  4367.                 sec_rmserver $domain $serv
  4368.                 }
  4369.                 foreach serv $newlist {
  4370.                 sec_addserver $domain $serv
  4371.                 }
  4372.         }
  4373.         file {
  4374.             return [sec_setbackup $domain $value]
  4375.         }
  4376.         default {
  4377.             ErrorPush {} 1 SCO_OSA_ERR_NO_SUCH_ATTRIBUTE "$attr"
  4378.         }
  4379.     }
  4380. }
  4381. proc dNSSecondary_remove {class object refObject op subOp data attr attrValueList osaData} {
  4382.     set domain [GetObjectId $object name 0]
  4383.     set value [keylget attrValueList $attr]
  4384.     case $attr {
  4385.         serverList {
  4386.             foreach serv $value {
  4387.                 sec_rmserver $domain $serv
  4388.             }
  4389.             return
  4390.         }
  4391.         default {
  4392.             ErrorPush {} 1 SCO_OSA_ERR_NO_SUCH_ATTRIBUTE "$attr"
  4393.         }
  4394.     }
  4395. }
  4396. proc dNSSecondary_create {class object refObject op subOp data attr attrValueList osaData} {
  4397.     set domain [GetObjectId $object name 0]
  4398.     set vlist [GetValueList attrValueList {serverList {file {}}}]
  4399.     return [eval add_secondary $domain $vlist]
  4400. }
  4401. proc dNSSecondary_delete {class object refObject op subOp data attr attrValueList osaData} {
  4402.     set domain [GetObjectId $object name 0]
  4403.     return [rm_secondary $domain]
  4404. }
  4405. proc dNSSecondary_list {class object refObject op subOp data attr attrValueList osaData} {
  4406.     return [list_secondaries]
  4407. }
  4408. proc hostTab_get {class object refObject op subOp data attr attrValueList osaData} {
  4409.     set table [GetObjectId $object name 0]
  4410.     case $attr {
  4411.         name {
  4412.             set result $table
  4413.             return [list [list $attr $result]]
  4414.         }
  4415.         default {
  4416.             ErrorPush {} 1 SCO_OSA_ERR_NO_SUCH_ATTRIBUTE "$attr"
  4417.         }
  4418.     }
  4419. }
  4420. proc hostTab_list {class object refObject op subOp data attr attrValueList osaData} {
  4421.     return [concat /etc/hosts [list_primaries] [list_secondaries] [list_stubs]]
  4422. }
  4423. proc dNSHint_get {class object refObject op subOp data attr attrValueList osaData} {
  4424.     set name [GetObjectId $object name 0]
  4425.     dns_readhints
  4426.     case $attr {
  4427.         name {
  4428.             set result $name
  4429.             return [list [list $attr $result]]
  4430.         }
  4431.         addrList {
  4432.             set result [dns_getaddrs $name]
  4433.             return [list [list $attr $result]]
  4434.         }
  4435.         comment {
  4436.             set result [dns_getcomment $name]
  4437.             return [list [list $attr $result]]
  4438.         }
  4439.         default {
  4440.             ErrorPush {} 1 SCO_OSA_ERR_NO_SUCH_ATTRIBUTE "$attr"
  4441.         }
  4442.     }
  4443. }
  4444. proc dNSHint_replace {class object refObject op subOp data attr attrValueList osaData} {
  4445.     set name [GetObjectId $object name 0]
  4446.     set value [keylget attrValueList $attr]
  4447.     dns_readhints
  4448.     case $attr {
  4449.         addrList {
  4450.             return [dns_setaddrs $name $value]
  4451.         }
  4452.         comment {
  4453.             return [dns_setcomment $name $value]
  4454.         }
  4455.         default {
  4456.             ErrorPush {} 1 SCO_OSA_ERR_NO_SUCH_ATTRIBUTE "$attr"
  4457.         }
  4458.     }
  4459. }
  4460. proc dNSHint_create {class object refObject op subOp data attr attrValueList osaData} {
  4461.     set name [GetObjectId $object name 0]
  4462.     set vlist [GetValueList attrValueList {addrList {comment {}}}]
  4463.     return [eval dns_addhint $name $vlist]
  4464. }
  4465. proc dNSHint_delete {class object refObject op subOp data attr attrValueList osaData} {
  4466.     set name [GetObjectId $object name 0]
  4467.     return [dns_rmhint $name]
  4468. }
  4469. proc dNSHint_add {class object refObject op subOp data attr attrValueList osaData} {
  4470.     set name [GetObjectId $object name 0]
  4471.     set value [keylget attrValueList $attr]
  4472.     case $attr {
  4473.         addrList {
  4474.             dns_readhints
  4475.             return [dns_addaddrs $name $value {}]
  4476.         }
  4477.         default {
  4478.             ErrorPush {} 1 SCO_OSA_ERR_NO_SUCH_ATTRIBUTE "$attr"
  4479.         }
  4480.     }
  4481. }
  4482. proc dNSHint_remove {class object refObject op subOp data attr attrValueList osaData} {
  4483.     set name [GetObjectId $object name 0]
  4484.     set value [keylget attrValueList $attr]
  4485.     case $attr {
  4486.         addrList {
  4487.             dns_readhints
  4488.             return [dns_rmaddrs $name $value]
  4489.         }
  4490.         default {
  4491.             ErrorPush {} 1 SCO_OSA_ERR_NO_SUCH_ATTRIBUTE "$attr"
  4492.         }
  4493.     }
  4494. }
  4495. proc dNSHint_list {class object refObject op subOp data attr attrValueList osaData} {
  4496.     return [dns_gethintnames]
  4497. }
  4498. proc dNSPrimary_get {class object refObject op subOp data attr attrValueList osaData} {
  4499.     global dns_soa
  4500.     set domain [GetObjectId $object name 0]
  4501.     dns_readdomain $domain
  4502.     case $attr {
  4503.         name {
  4504.             set result $domain
  4505.             return [list [list $attr $result]]
  4506.         }
  4507.         serverList {
  4508.             set result [dns_getservers $domain]
  4509.             return [list [list $attr $result]]
  4510.         }
  4511.         file {
  4512.             set result [get_rrfile $object]
  4513.             return [list [list $attr $result]]
  4514.         }
  4515.         mailbox {
  4516.             return [list [list $attr [lindex $dns_soa 1]]]
  4517.         }
  4518.         serial {
  4519.             return [list [list $attr [lindex $dns_soa 2]]]
  4520.         }
  4521.         refresh {
  4522.             return [list [list $attr [lindex $dns_soa 3]]]
  4523.         }
  4524.         retry {
  4525.             return [list [list $attr [lindex $dns_soa 4]]]
  4526.         }
  4527.         expire {
  4528.             return [list [list $attr [lindex $dns_soa 5]]]
  4529.         }
  4530.         minimum {
  4531.             return [list [list $attr [lindex $dns_soa 6]]]
  4532.         }
  4533.         default {
  4534.             ErrorPush {} 1 SCO_OSA_ERR_NO_SUCH_ATTRIBUTE "$attr"
  4535.         }
  4536.     }
  4537. }
  4538. proc dNSPrimary_replace {class object refObject op subOp data attr attrValueList osaData} {
  4539.     global dns_soa dns_modified
  4540.     set value [keylget attrValueList $attr]
  4541.     set domain [GetObjectId $object name 0]
  4542.     dns_readdomain $domain
  4543.     case $attr {
  4544.         file {
  4545.             return [change_rrfile $object $value]
  4546.         }
  4547.         serverList {
  4548.             set curlist [dns_getservers $domain]
  4549.             if [lempty $value] {
  4550.                 set newlist ""
  4551.                 set rmlist $curlist
  4552.                 set addlist ""
  4553.             } else {
  4554.                 set newlist [keylkeys value]
  4555.                     set rmlist  [lsubtract $curlist $newlist]
  4556.                     set addlist [lsubtract $newlist $curlist]
  4557.             }
  4558.                 foreach serv [keylkeys rmlist] {
  4559.                 dns_rmserver $domain $serv
  4560.                 }
  4561.                 foreach serv [keylkeys addlist] {
  4562.                 dns_addserver $domain $serv \
  4563.                     [_keylget value $serv] {}
  4564.                 }
  4565.         }
  4566.         mailbox {
  4567.             set dns_soa [lreplace $dns_soa 1 1 $value]
  4568.             storeSOA
  4569.         }
  4570.         serial {
  4571.             set dns_soa [lreplace $dns_soa 2 2 $value]
  4572.             storeSOA
  4573.         }
  4574.         refresh {
  4575.             set dns_soa [lreplace $dns_soa 3 3 $value]
  4576.             storeSOA
  4577.         }
  4578.         retry {
  4579.             set dns_soa [lreplace $dns_soa 4 4 $value]
  4580.             storeSOA
  4581.         }
  4582.         expire {
  4583.             set dns_soa [lreplace $dns_soa 5 5 $value]
  4584.             storeSOA
  4585.         }
  4586.         minimum {
  4587.             set dns_soa [lreplace $dns_soa 6 6 $value]
  4588.             storeSOA
  4589.         }
  4590.         default {
  4591.             ErrorPush {} 1 SCO_OSA_ERR_NO_SUCH_ATTRIBUTE "$attr"
  4592.         }
  4593.     }
  4594.     set dns_modified 1
  4595.     dns_writefile
  4596.     return 1
  4597. }
  4598. proc dNSPrimary_create {class object refObject op subOp data attr attrValueList osaData} {
  4599.     set name [GetObjectId $object name 0]
  4600.     set vlist [GetValueList attrValueList \
  4601.             {file serverList mailbox \
  4602.              {serial 1} {refresh 21600} {retry 900} \
  4603.              {expire 604800} {minimum 3600}}]
  4604.     return [eval add_primary $name $vlist]
  4605. }
  4606. proc dNSPrimary_delete {class object refObject op subOp data attr attrValueList osaData} {
  4607.     set name [GetObjectId $object name 0]
  4608.     return [rm_primary $name]
  4609. }
  4610. proc dNSPrimary_list {class object refObject op subOp data attr attrValueList osaData} {
  4611.     return [list_primaries]
  4612. }
  4613. proc dNSStub_get {class object refObject op subOp data attr attrValueList osaData} {
  4614.     set domain [GetObjectId $object name 0]
  4615.     case $attr {
  4616.         name {
  4617.             set result $domain
  4618.             return [list [list $attr $result]]
  4619.         }
  4620.         serverList {
  4621.             set result [lindex [get_stub $domain] 0]
  4622.             return [list [list $attr $result]]
  4623.         }
  4624.         file {
  4625.             set result [lindex [get_stub $domain] 1]
  4626.             return [list [list $attr $result]]
  4627.         }
  4628.         default {
  4629.             ErrorPush {} 1 SCO_OSA_ERR_NO_SUCH_ATTRIBUTE "$attr"
  4630.         }
  4631.     }
  4632. }
  4633. proc dNSStub_add {class object refObject op subOp data attr attrValueList osaData} {
  4634.     set domain [GetObjectId $object name 0]
  4635.     set value [keylget attrValueList $attr]
  4636.     case $attr {
  4637.         serverList {
  4638.             foreach serv $value {
  4639.                 stub_addserver $domain $serv
  4640.             }
  4641.             return
  4642.         }
  4643.         default {
  4644.             ErrorPush {} 1 SCO_OSA_ERR_NO_SUCH_ATTRIBUTE "$attr"
  4645.         }
  4646.     }
  4647. }
  4648. proc dNSStub_replace {class object refObject op subOp data attr attrValueList osaData} {
  4649.     set domain [GetObjectId $object name 0]
  4650.     set value [keylget attrValueList $attr]
  4651.     case $attr {
  4652.         serverList {
  4653.             set curlist [lindex [get_stub $domain] 0]
  4654.                 set newlist [lsubtract $value $curlist]
  4655.                 set rmlist  [lsubtract $curlist $value]
  4656.                 foreach serv $rmlist {
  4657.                 stub_rmserver $domain $serv
  4658.                 }
  4659.                 foreach serv $newlist {
  4660.                 stub_addserver $domain $serv
  4661.                 }
  4662.         }
  4663.         file {
  4664.             return [stub_setbackup $domain $value]
  4665.         }
  4666.         default {
  4667.             ErrorPush {} 1 SCO_OSA_ERR_NO_SUCH_ATTRIBUTE "$attr"
  4668.         }
  4669.     }
  4670. }
  4671. proc dNSStub_remove {class object refObject op subOp data attr attrValueList osaData} {
  4672.     set domain [GetObjectId $object name 0]
  4673.     set value [keylget attrValueList $attr]
  4674.     case $attr {
  4675.         serverList {
  4676.             foreach serv $value {
  4677.                 stub_rmserver $domain $serv
  4678.             }
  4679.             return
  4680.         }
  4681.         default {
  4682.             ErrorPush {} 1 SCO_OSA_ERR_NO_SUCH_ATTRIBUTE "$attr"
  4683.         }
  4684.     }
  4685. }
  4686. proc dNSStub_create {class object refObject op subOp data attr attrValueList osaData} {
  4687.     set domain [GetObjectId $object name 0]
  4688.     set vlist [GetValueList attrValueList {serverList {file {}}}]
  4689.     return [eval add_stub $domain $vlist]
  4690. }
  4691. proc dNSStub_delete {class object refObject op subOp data attr attrValueList osaData} {
  4692.     set domain [GetObjectId $object name 0]
  4693.     return [rm_stub $domain]
  4694. }
  4695. proc dNSStub_list {class object refObject op subOp data attr attrValueList osaData} {
  4696.     return [list_stubs]
  4697. }
  4698. proc dns_done {} {
  4699.     global restart_server
  4700.     dns_writefile
  4701.     resolv_writemode
  4702.     boot_writemode
  4703.     if {$restart_server} {
  4704.     enable_named
  4705.     }
  4706. }
  4707. set restart_server 0
  4708. set IPAddrMap_ConfigDir /etc/inet
  4709. resolv_init
  4710. boot_init
  4711. host_init
  4712. dns_init
  4713. OFBinding sco_dNSystem_CDT
  4714. OFBinding sco_hostTabEntry_CDT
  4715. OFBinding sco_hostTabs_CDT
  4716. OFBinding sco_hostTab_CDT
  4717. OFBinding sco_dNSHint_CDT
  4718. OFBinding sco_dNSPrimary_CDT
  4719. OFBinding sco_dNSSecondary_CDT
  4720. OFBinding sco_dNSStub_CDT
  4721.