home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 1999 March B / SCO_CASTOR4RRT.iso / inet / root.2 / usr / lib / scoadmin / dhcp / dhcpGUI / dhcpGUI~
Text File  |  1998-08-19  |  173KB  |  5,024 lines

  1. #!/bin/osavtcl
  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_DHCP_MSGS SCO_DHCP_MSGS
  24. proc SCO_DHCP_MSGS {} {}
  25. global SCO_DHCP_MSGS
  26. set SCO_DHCP_MSGS(@catalog@) {dhcp.cat@sa 1}
  27. set SCO_DHCP_MSGS(MSG_VERSION) {1 {DHCP Server Manager %s}}
  28. set SCO_DHCP_MSGS(MSG_WAIT) {2 {Reading configuration files...}}
  29. set SCO_DHCP_MSGS(MSG_YES) {3 Yes}
  30. set SCO_DHCP_MSGS(MSG_NO) {4 No}
  31. set SCO_DHCP_MSGS(MSG_REMOTE) {5 Remote}
  32. set SCO_DHCP_MSGS(MSG_LOCAL) {6 Local}
  33. set SCO_DHCP_MSGS(MSG_CLOSE) {7 Close}
  34. set SCO_DHCP_MSGS(MSG_ADD) {8 Add}
  35. set SCO_DHCP_MSGS(MSG_OPTIONS) {9 Options}
  36. set SCO_DHCP_MSGS(MSG_DHCP_OPT_BUT) {10 Generic...}
  37. set SCO_DHCP_MSGS(MSG_IDENT) {11 Identifier:}
  38. set SCO_DHCP_MSGS(MSG_DESC) {12 Description:}
  39. set SCO_DHCP_MSGS(MSG_TYPE) {13 Type:}
  40. set SCO_DHCP_MSGS(MSG_NAME) {14 Name:}
  41. set SCO_DHCP_MSGS(MSG_VALUE) {15 Value:}
  42. set SCO_DHCP_MSGS(MSG_IP) {16 {IP address:}}
  43. set SCO_DHCP_MSGS(MSG_MODIFY) {17 Modify...}
  44. set SCO_DHCP_MSGS(MSG_DELETE) {18 Delete}
  45. set SCO_DHCP_MSGS(MSG_DELETE_ENTRY) {19 {Are you sure you want to delete this entry?\n\n %s}}
  46. set SCO_DHCP_MSGS(MSG_BLANK) {20 { }}
  47. set SCO_DHCP_MSGS(MSG_CHECK_IP) {21 {IP address}}
  48. set SCO_DHCP_MSGS(MSG_CHECK_SUBNET) {22 subnet}
  49. set SCO_DHCP_MSGS(MSG_ADDED) {23 {Successfully added %s}}
  50. set SCO_DHCP_MSGS(MSG_MODIFIED) {24 {Successfully modified %s}}
  51. set SCO_DHCP_MSGS(MSG_LIMITED) {25 Limited}
  52. set SCO_DHCP_MSGS(MSG_UNLIMITED) {26 Unlimited}
  53. set SCO_DHCP_MSGS(MSG_OPAQUE) {27 Opaque}
  54. set SCO_DHCP_MSGS(MSG_HW) {28 Hardware}
  55. set SCO_DHCP_MSGS(ERR_NO_POOL_LIST) {29 {The pool list returned from the address allocation server is empty.\n It is possible to continue with the DHCP configuration, but the names\n of any address pools cannot be validated.}}
  56. set SCO_DHCP_MSGS(ERR_BAD_OPTION_VAL) {30 {Invalid value for option type}}
  57. set SCO_DHCP_MSGS(ERR_NO_VALUE) {31 {Must specify a value}}
  58. set SCO_DHCP_MSGS(ERR_NO_IDENT) {32 {Must specify an identifier}}
  59. set SCO_DHCP_MSGS(ERR_NO_HARDWARE) {33 {Must specify a hardware address}}
  60. set SCO_DHCP_MSGS(ERR_NO_IP) {34 {Must specify an IP address}}
  61. set SCO_DHCP_MSGS(ERR_NO_HOST) {35 {Must specify a remote host name}}
  62. set SCO_DHCP_MSGS(ERR_NO_PASSWD) {36 {Must specify a remote password}}
  63. set SCO_DHCP_MSGS(ERR_NO_ITEMS_SELECTED) {37 {At lease one item must be selected}}
  64. set SCO_DHCP_MSGS(ERR_NO_NAME) {38 {A name must be specified}}
  65. set SCO_DHCP_MSGS(ERR_NO_TYPE) {39 {A data type must be specified}}
  66. set SCO_DHCP_MSGS(ERR_SELECT_ONE) {40 {Please select only one option to edit}}
  67. set SCO_DHCP_MSGS(ERR_BAD_SUBNET1) {41 {Invalid subnet value}}
  68. set SCO_DHCP_MSGS(ERR_BAD_SUBNET2) {42 {\"%s\" is not a valid subnet.\nIt must have a \".0\" host portion.}}
  69. set SCO_DHCP_MSGS(ERR_BAD_SUBNET_MASK) {43 {\"%s\" is not a valid subnet mask}}
  70. set SCO_DHCP_MSGS(ERR_BAD_IP) {44 {\"%1$s\" is a bad IP address}}
  71. set SCO_DHCP_MSGS(ERR_BAD_IDENT) {45 {\"%s\" is not a unique identifier}}
  72. set SCO_DHCP_MSGS(ERR_BAD_NAME) {46 {\"%s\" is not a unique name}}
  73. set SCO_DHCP_MSGS(ERR_BAD_HARDWARE) {47 {\"%s\" is not a unique hardware address}}
  74. set SCO_DHCP_MSGS(ERR_BAD_HARDWARE1) {48 {\"%s\" is not a valid hardware address.\nIt should be a hexadecimal number}}
  75. set SCO_DHCP_MSGS(ERR_BAD_HARDWARE2) {49 {\"%s\" is not a valid hardware address.\nIt should have an even number of digits}}
  76. set SCO_DHCP_MSGS(ERR_BAD_HARDWARE3) {50 {\"%s\" is not a valid hardware address.\nIt should be 6 bytes (12 digits) long}}
  77. set SCO_DHCP_MSGS(ERR_DEF_LEASE) {51 {Default lease time must be at least 1 hour}}
  78. set SCO_DHCP_MSGS(ERR_MAX_LEASE1) {52 {Maximum lease time must be at least 1 hour}}
  79. set SCO_DHCP_MSGS(ERR_MAX_LEASE2) {53 {Maximum lease time must be at least as long as the default}}
  80. set SCO_DHCP_MSGS(ERR_MIN_VAL) {54 {\"%s\" is not a valid minimum value}}
  81. set SCO_DHCP_MSGS(ERR_MAX_VAL1) {55 {\"%s\" is not a valid maximum value}}
  82. set SCO_DHCP_MSGS(ERR_MAX_VAL2) {56 {Maximum value must be larger than minimum value}}
  83. set SCO_DHCP_MSGS(ERR_MIN_LEN) {57 {\"%s\" is not a valid minimum length}}
  84. set SCO_DHCP_MSGS(ERR_MAX_LEN1) {58 {\"%s\" is not a valid maximum length}}
  85. set SCO_DHCP_MSGS(ERR_MAX_LEN2) {59 {Maximum length must be larger than minimum length}}
  86. set SCO_DHCP_MSGS(ERR_POOL_INFO) {60 {Unable to get pool information from the Address Allocation Server}}
  87. set SCO_DHCP_MSGS(ERR_POOL_ADDRTYPE) {61 {Address Allocation Server returned a pool with an invalid address type: %s}}
  88. set SCO_DHCP_MSGS(ERR_AAS_LOCATION) {62 {Unable to determine the location of the Address Allocation Server}}
  89. set SCO_DHCP_MSGS(ERR_GET) {63 {Unable to get %1$s definitions}}
  90. set SCO_DHCP_MSGS(ERR_DELETE) {64 {Unable to delete %1$s definition %2$s}}
  91. set SCO_DHCP_MSGS(ERR_CREATE) {65 {Unable to create %1$s definition %2$s}}
  92. set SCO_DHCP_MSGS(ERR_NO_SERVER_INFO) {66 {Unable to obtain server information.}}
  93. set SCO_DHCP_MSGS(ERR_NO_SERVER) {67 {Unable to set parameters for a remote Address Allocation Server - a remote host must be defined.}}
  94. set SCO_DHCP_MSGS(ERR_NO_PASSWORD) {68 {Unable to set parameters for a remote Address Allocation Server - a password must be defined.}}
  95. set SCO_DHCP_MSGS(ERR_AASGUI) {69 {Unable to start the Address Allocation Server: %s}}
  96. set SCO_DHCP_MSGS(MSG_TYPE_string) {70 String}
  97. set SCO_DHCP_MSGS(MSG_TYPE_boolean) {71 Boolean}
  98. set SCO_DHCP_MSGS(MSG_TYPE_binary) {72 Binary}
  99. set SCO_DHCP_MSGS(MSG_TYPE_bpmh) {73 {NetBIOS node type}}
  100. set SCO_DHCP_MSGS(MSG_TYPE_int8) {74 {8-bit integer}}
  101. set SCO_DHCP_MSGS(MSG_TYPE_uint8) {75 {Unsigned 8-bit integer}}
  102. set SCO_DHCP_MSGS(MSG_TYPE_int16) {76 {16-bit integer}}
  103. set SCO_DHCP_MSGS(MSG_TYPE_uint16) {77 {Unsigned 16-bit integer}}
  104. set SCO_DHCP_MSGS(MSG_TYPE_int32) {78 {32-bit integer}}
  105. set SCO_DHCP_MSGS(MSG_TYPE_uint32) {79 {Unsigned 32-bit integer}}
  106. set SCO_DHCP_MSGS(MSG_TYPE_ip_address) {80 {IP address}}
  107. set SCO_DHCP_MSGS(MSG_TYPE_ip_address_pair) {81 {IP address pair}}
  108. set SCO_DHCP_MSGS(MSG_TYPE_opaque) {82 Opaque}
  109. set SCO_DHCP_MSGS(MSG_TYPE_ethernet) {83 Ethernet}
  110. set SCO_DHCP_MSGS(MSG_TYPE_ieee802) {84 {IEEE 802}}
  111. set SCO_DHCP_MSGS(MSG_TYPE_other) {85 Other...}
  112. set SCO_DHCP_MSGS(MSG_EXPAND_ALL) {86 {Expand All}}
  113. set SCO_DHCP_MSGS(MSG_EXPAND_ALL_SH) {87 {Expand all entries in the main list}}
  114. set SCO_DHCP_MSGS(MSG_COLLAPSE_ALL) {88 {Collapse All}}
  115. set SCO_DHCP_MSGS(MSG_COLLAPSE_ALL_SH) {89 {Collapse all entries in the main list}}
  116. set SCO_DHCP_MSGS(MSG_EXPAND) {90 Expand}
  117. set SCO_DHCP_MSGS(MSG_EXPAND_SH) {91 {Expand the selected entry in the main list}}
  118. set SCO_DHCP_MSGS(MSG_COLLAPSE) {92 Collapse}
  119. set SCO_DHCP_MSGS(MSG_COLLAPSE_SH) {93 {Collapse the selected entry in the main list}}
  120. set SCO_DHCP_MSGS(MSG_OPT_SUBNET) {94 Subnet}
  121. set SCO_DHCP_MSGS(MSG_OPT_CLIENT) {95 Client}
  122. set SCO_DHCP_MSGS(MSG_OPT_USER) {96 {User Class}}
  123. set SCO_DHCP_MSGS(MSG_OPT_VENDOR) {97 {Vendor Class}}
  124. set SCO_DHCP_MSGS(MSG_OPT_GLOBAL) {98 Global}
  125. set SCO_DHCP_MSGS(MSG_OPT_TITLE) {99 {%s Generic Options Configuration}}
  126. set SCO_DHCP_MSGS(MSG_OPT_UNUSED) {100 Unused}
  127. set SCO_DHCP_MSGS(MSG_OPT_UNUSED_SH) {101 {List of all available options}}
  128. set SCO_DHCP_MSGS(MSG_OPT_CONFIG) {102 Configured}
  129. set SCO_DHCP_MSGS(MSG_OPT_CONFIG_SH) {103 {List of configured options}}
  130. set SCO_DHCP_MSGS(MSG_OPT_DESC_SH) {104 {Brief description of option selected}}
  131. set SCO_DHCP_MSGS(MSG_OPT_VALUE) {105 {Value summary:}}
  132. set SCO_DHCP_MSGS(MSG_OPT_VALUE_SH) {106 {Value of currently selected option}}
  133. set SCO_DHCP_MSGS(MSG_OPT_EDIT_TITLE) {107 {Edit Option}}
  134. set SCO_DHCP_MSGS(MSG_OPT_INFO) {108 {Option information}}
  135. set SCO_DHCP_MSGS(MSG_OPT_ID) {109 ID:}
  136. set SCO_DHCP_MSGS(MSG_OPT_ADD) {110 { Add -> }}
  137. set SCO_DHCP_MSGS(MSG_OPT_ADD_SH) {111 {Add option to list of configured options}}
  138. set SCO_DHCP_MSGS(MSG_OPT_REMOVE) {112 { <- Remove }}
  139. set SCO_DHCP_MSGS(MSG_OPT_REMOVE_SH) {113 {Remove option from list of configured options}}
  140. set SCO_DHCP_MSGS(MSG_OPT_EDIT) {114 { Edit value... }}
  141. set SCO_DHCP_MSGS(MSG_OPT_EDIT_SH) {115 {Edit this option's value}}
  142. set SCO_DHCP_MSGS(MSG_NEW_ELEM) {116 {New element}}
  143. set SCO_DHCP_MSGS(MSG_ELEM_ADD) {117 { Add -> }}
  144. set SCO_DHCP_MSGS(MSG_ELEM_ADD_SH) {118 {Add the selected element to the array}}
  145. set SCO_DHCP_MSGS(MSG_ELEM_DEL_SH) {119 {Delete the selected element from the array}}
  146. set SCO_DHCP_MSGS(MSG_ELEM_ARRAY) {120 {Array contents}}
  147. set SCO_DHCP_MSGS(MSG_ELEM_ARRAY_SH) {121 {Current contents of the array}}
  148. set SCO_DHCP_MSGS(MSG_VALUE_string_SH) {122 {Enter a text string for this option}}
  149. set SCO_DHCP_MSGS(MSG_VALUE_boolean_SH) {123 {Enter a boolean value for this option}}
  150. set SCO_DHCP_MSGS(MSG_VALUE_binary_SH) {124 {Enter a binary (hexadecimal) string for this option}}
  151. set SCO_DHCP_MSGS(MSG_VALUE_bpmh_SH) {125 {Enter a NetBIOS node type}}
  152. set SCO_DHCP_MSGS(MSG_VALUE_int8_SH) {126 {Enter a 8-bit integer for this option}}
  153. set SCO_DHCP_MSGS(MSG_VALUE_uint8_SH) {127 {Enter an unsigned 8-bit integer for this option}}
  154. set SCO_DHCP_MSGS(MSG_VALUE_int16_SH) {128 {Enter a 16-bit integer for this option}}
  155. set SCO_DHCP_MSGS(MSG_VALUE_uint16_SH) {129 {Enter an unsigned 16-bit integer for this option}}
  156. set SCO_DHCP_MSGS(MSG_VALUE_int32_SH) {130 {Enter a 32-bit integer for this option}}
  157. set SCO_DHCP_MSGS(MSG_VALUE_uint32_SH) {131 {Enter an unsigned 32-bit integer for this option}}
  158. set SCO_DHCP_MSGS(MSG_VALUE_ip_address_SH) {132 {Enter an IP address for this option}}
  159. set SCO_DHCP_MSGS(MSG_VALUE_ip_address1_SH) {133 {Enter the first IP address of a pair of addresses for this option}}
  160. set SCO_DHCP_MSGS(MSG_VALUE_ip_address2_SH) {134 {Enter the second IP address of a pair of addresses for this option}}
  161. set SCO_DHCP_MSGS(MSG_VALUE_YES) {135 {Yes (On)   }}
  162. set SCO_DHCP_MSGS(MSG_VALUE_YES_SH) {136 {Turn this option on}}
  163. set SCO_DHCP_MSGS(MSG_VALUE_NO) {137 {No (Off)}}
  164. set SCO_DHCP_MSGS(MSG_VALUE_NO_SH) {138 {Turn this option off}}
  165. set SCO_DHCP_MSGS(MSG_VALUE_BROADCAST) {139 Broadcast}
  166. set SCO_DHCP_MSGS(MSG_VALUE_BROADCAST_SH) {140 {Value is broadcast (See RFC 1001)}}
  167. set SCO_DHCP_MSGS(MSG_VALUE_POINT) {141 Point-to-Point}
  168. set SCO_DHCP_MSGS(MSG_VALUE_POINT_SH) {142 {Value is point-to-point (See RFC 1001)}}
  169. set SCO_DHCP_MSGS(MSG_VALUE_MIXED) {143 Mixed}
  170. set SCO_DHCP_MSGS(MSG_VALUE_MIXED_SH) {144 {Value is mixed (See RFC 1001)}}
  171. set SCO_DHCP_MSGS(MSG_VALUE_NBDD) {145 NBDD}
  172. set SCO_DHCP_MSGS(MSG_VALUE_NBDD_SH) {146 {Value is NetBIOS datagram distribution}}
  173. set SCO_DHCP_MSGS(MSG_VENDOR_ADD_TITLE) {147 {Add Vendor Class Entry}}
  174. set SCO_DHCP_MSGS(MSG_VENDOR_MOD_TITLE) {148 {Modify Vendor Class Entry}}
  175. set SCO_DHCP_MSGS(MSG_VENDOR_IDENT_SH) {149 {Identifier for vendor class}}
  176. set SCO_DHCP_MSGS(MSG_VENDOR_DESC_SH) {150 {Description of vendor class entry}}
  177. set SCO_DHCP_MSGS(MSG_VENDOR_BIN_SH) {151 {Identifier is a binary string (hexadecimal)}}
  178. set SCO_DHCP_MSGS(MSG_VENDOR_TXT_SH) {152 {Identifier is a text string}}
  179. set SCO_DHCP_MSGS(MSG_VENDOR_DHCP_SH) {153 {Configure generic options for vendor class entry}}
  180. set SCO_DHCP_MSGS(MSG_USER_ADD_TITLE) {154 {Add User Class Entry}}
  181. set SCO_DHCP_MSGS(MSG_USER_MOD_TITLE) {155 {Modify User Class Entry}}
  182. set SCO_DHCP_MSGS(MSG_USER_IDENT_SH) {156 {Identifier for user class}}
  183. set SCO_DHCP_MSGS(MSG_USER_DESC_SH) {157 {Brief description of user class entry}}
  184. set SCO_DHCP_MSGS(MSG_USER_DHCP_SH) {158 {Configure generic options for user class entry}}
  185. set SCO_DHCP_MSGS(MSG_SUBNET_ADD_TITLE) {159 {Add Subnet Entry}}
  186. set SCO_DHCP_MSGS(MSG_SUBNET_MOD_TITLE) {160 {Modify Subnet Entry}}
  187. set SCO_DHCP_MSGS(MSG_SUBNET_SUBNET) {161 Subnet:}
  188. set SCO_DHCP_MSGS(MSG_SUBNET_SUBNET_SH) {162 {Subnet IP address}}
  189. set SCO_DHCP_MSGS(MSG_SUBNET_MASK) {163 Mask:}
  190. set SCO_DHCP_MSGS(MSG_SUBNET_MASK_SH) {164 {Subnet mask}}
  191. set SCO_DHCP_MSGS(MSG_SUBNET_POOL) {165 Pool:}
  192. set SCO_DHCP_MSGS(MSG_SUBNET_POOL_SH) {166 {Name of address pool assigned to subnet}}
  193. set SCO_DHCP_MSGS(MSG_SUBNET_POOL_BUT) {167 {Address pools...}}
  194. set SCO_DHCP_MSGS(MSG_SUBNET_POOL_BUT_SH) {168 {Start the Address Allocation Manager}}
  195. set SCO_DHCP_MSGS(MSG_SUBNET_DESC_SH) {169 {Brief description of subnet}}
  196. set SCO_DHCP_MSGS(MSG_SUBNET_LEASE) {170 {Lease Options Configuration}}
  197. set SCO_DHCP_MSGS(MSG_SUBNET_LEASE_BUT) {171 Lease...}
  198. set SCO_DHCP_MSGS(MSG_SUBNET_DEF_LEASE) {172 {Default lease time:}}
  199. set SCO_DHCP_MSGS(MSG_SUBNET_MAX_LEASE) {173 {Maximum lease time:}}
  200. set SCO_DHCP_MSGS(MSG_SUBNET_RENEWAL) {174 {Renewal on (percent):}}
  201. set SCO_DHCP_MSGS(MSG_SUBNET_RENEWAL_SH) {175 {Renew lease after this percentage of lease has expired }}
  202. set SCO_DHCP_MSGS(MSG_SUBNET_REBIND) {176 {Rebind on (percent):}}
  203. set SCO_DHCP_MSGS(MSG_SUBNET_REBIND_SH) {177 {Rebind lease after this percentage of the lease has expired}}
  204. set SCO_DHCP_MSGS(MSG_SUBNET_DEF_LIM_SH) {178 {Specify default lease time for subnet}}
  205. set SCO_DHCP_MSGS(MSG_SUBNET_MAX_LIM_SH) {179 {Specify maximum lease time for subnet}}
  206. set SCO_DHCP_MSGS(MSG_SUBNET_DEF_UNLIM_SH) {180 {Set default lease time to infinite for subnet}}
  207. set SCO_DHCP_MSGS(MSG_SUBNET_MAX_UNLIM_SH) {181 {Set maximum lease time to infinite for subnet}}
  208. set SCO_DHCP_MSGS(MSG_SUBNET_DAYS) {182 Days:}
  209. set SCO_DHCP_MSGS(MSG_SUBNET_HOURS) {183 Hours:}
  210. set SCO_DHCP_MSGS(MSG_SUBNET_MINS) {184 Mins:}
  211. set SCO_DHCP_MSGS(MSG_SUBNET_DHCP_SH) {185 {Configure generic options for subnet}}
  212. set SCO_DHCP_MSGS(MSG_SUBNET_LEASE_SH) {186 {Configure lease options for subnet}}
  213. set SCO_DHCP_MSGS(MSG_CLIENT_ADD_TITLE) {187 {Add Client Entry}}
  214. set SCO_DHCP_MSGS(MSG_CLIENT_MOD_TITLE) {188 {Modify Client Entry}}
  215. set SCO_DHCP_MSGS(MSG_CLIENT_ID_TYPE) {189 {Client identifier type:}}
  216. set SCO_DHCP_MSGS(MSG_CLIENT_ID) {190 {Client identifier:}}
  217. set SCO_DHCP_MSGS(MSG_CLIENT_ID_SH) {191 {Opaque identifier for client}}
  218. set SCO_DHCP_MSGS(MSG_CLIENT_HW_TYPE) {192 {Hardware type:}}
  219. set SCO_DHCP_MSGS(MSG_CLIENT_HW_TYPE_SH) {193 {Client's network hardware type}}
  220. set SCO_DHCP_MSGS(MSG_CLIENT_HW_ADDR) {194 {Hardware address:}}
  221. set SCO_DHCP_MSGS(MSG_CLIENT_HW_ADDR_SH) {195 {Client's network hardware address}}
  222. set SCO_DHCP_MSGS(MSG_CLIENT_IP_SH) {196 {IP address to assign to client}}
  223. set SCO_DHCP_MSGS(MSG_CLIENT_DESC_SH) {197 {Brief description of client}}
  224. set SCO_DHCP_MSGS(MSG_CLIENT_OPAQUE_SH) {198 {The client identifier is an opaque string}}
  225. set SCO_DHCP_MSGS(MSG_CLIENT_HW_SH) {199 {The client identifier is a harware type and address pair}}
  226. set SCO_DHCP_MSGS(MSG_CLIENT_BIN_SH) {200 {Hardware address is a binary string}}
  227. set SCO_DHCP_MSGS(MSG_CLIENT_TXT_SH) {201 {Hardware address is a text string}}
  228. set SCO_DHCP_MSGS(MSG_CLIENT_DHCP_SH) {202 {Configure generic options for client}}
  229. set SCO_DHCP_MSGS(MSG_CLIENT_OPT_BUT) {203 Client...}
  230. set SCO_DHCP_MSGS(MSG_CLIENT_OPT_BUT_SH) {204 {Configure client options for client}}
  231. set SCO_DHCP_MSGS(MSG_CLIENT_OPT_ADD) {205 {Add Client Option Configuration}}
  232. set SCO_DHCP_MSGS(MSG_CLIENT_OPT_MOD) {206 {Modify Client Option Configuration}}
  233. set SCO_DHCP_MSGS(MSG_GLOBAL_OPT) {207 {global options}}
  234. set SCO_DHCP_MSGS(MSG_SERVER_TITLE) {208 {Edit Server Parameters}}
  235. set SCO_DHCP_MSGS(MSG_SERVER_LEASE) {209 {Initial lease reservation time:}}
  236. set SCO_DHCP_MSGS(MSG_SERVER_LEASE_SH) {210 {Initial lease reservation time in minutes (1-60)}}
  237. set SCO_DHCP_MSGS(MSG_SERVER_PADDING) {211 {Pad lease by (percent):}}
  238. set SCO_DHCP_MSGS(MSG_SERVER_PADDING_SH) {212 {Extend the lease by this percentage}}
  239. set SCO_DHCP_MSGS(MSG_SERVER_PROBE) {213 {Probe addresses:}}
  240. set SCO_DHCP_MSGS(MSG_SERVER_OVERLOAD) {214 {DHCP option overload:}}
  241. set SCO_DHCP_MSGS(MSG_SERVER_PR_YES_SH) {215 {Ping addresses before offering to client}}
  242. set SCO_DHCP_MSGS(MSG_SERVER_PR_NO_SH) {216 {Do not ping addresses before offering to client}}
  243. set SCO_DHCP_MSGS(MSG_SERVER_YES_SH) {217 {Enable option overload}}
  244. set SCO_DHCP_MSGS(MSG_SERVER_NO_SH) {218 {Disable option overload}}
  245. set SCO_DHCP_MSGS(MSG_SERVER_UPDATED) {219 {Successfully updated server parameters}}
  246. set SCO_DHCP_MSGS(MSG_SERVER_DEFAULT) {220 {The default server parameters are unchanged}}
  247. set SCO_DHCP_MSGS(MSG_ADDRESS_TITLE) {221 {Address Allocation Server Location}}
  248. set SCO_DHCP_MSGS(MSG_SERVER_LOC) {222 {Address Allocation Server location:}}
  249. set SCO_DHCP_MSGS(MSG_SERVER_HOST) {223 Host:}
  250. set SCO_DHCP_MSGS(MSG_SERVER_HOST_SH) {224 {Hostname or IP address of remote host}}
  251. set SCO_DHCP_MSGS(MSG_SERVER_PASSWORD) {225 Password:}
  252. set SCO_DHCP_MSGS(MSG_SERVER_PASSWORD_SH) {226 {Password required to access remote address server}}
  253. set SCO_DHCP_MSGS(MSG_SERVER_LOCAL_SH) {227 {AAS is running on local machine}}
  254. set SCO_DHCP_MSGS(MSG_SERVER_REMOTE_SH) {228 {AAS is running on remote host}}
  255. set SCO_DHCP_MSGS(MSG_AAS_UPDATED) {229 {Address Allocation Server location updated}}
  256. set SCO_DHCP_MSGS(MSG_USR_DEF_ADD_TITLE) {230 {Add User Defined Option}}
  257. set SCO_DHCP_MSGS(MSG_USR_DEF_MOD_TITLE) {231 {Modify User Defined Option}}
  258. set SCO_DHCP_MSGS(MSG_USR_DEF_IDENT_SH) {232 {Unique numeric identifier for this option (128-254)}}
  259. set SCO_DHCP_MSGS(MSG_USR_DEF_TYPE_SH) {233 {Select the type for option}}
  260. set SCO_DHCP_MSGS(MSG_USR_DEF_NAME_SH) {234 {String identifying user defined option}}
  261. set SCO_DHCP_MSGS(MSG_USR_DEF_DESC_SH) {235 {Brief description of option}}
  262. set SCO_DHCP_MSGS(MSG_USR_DEF_ARRAY) {236 Array}
  263. set SCO_DHCP_MSGS(MSG_USR_DEF_ARRAY_SH) {237 {Select if the option is an array}}
  264. set SCO_DHCP_MSGS(MSG_USR_DEF_MIN_VAL) {238 {Min value:}}
  265. set SCO_DHCP_MSGS(MSG_USR_DEF_MIN_VAL_SH) {239 {Minimum value for integer type}}
  266. set SCO_DHCP_MSGS(MSG_USR_DEF_MAX_VAL) {240 {Max value:}}
  267. set SCO_DHCP_MSGS(MSG_USR_DEF_MAX_VAL_SH) {241 {Maximum value for integer type}}
  268. set SCO_DHCP_MSGS(MSG_USR_DEF_MIN_LEN) {242 {Min length:}}
  269. set SCO_DHCP_MSGS(MSG_USR_DEF_MIN_LEN_SH) {243 {Minimum length for string, binary or array}}
  270. set SCO_DHCP_MSGS(MSG_USR_DEF_MAX_LEN) {244 {Max length:}}
  271. set SCO_DHCP_MSGS(MSG_USR_DEF_MAX_LEN_SH) {245 {Maximum length for string, binary or array}}
  272. set SCO_DHCP_MSGS(MSG_USR_DEF_TITLE) {246 {User Defined Options Specification}}
  273. set SCO_DHCP_MSGS(MSG_USR_DEF_LABELS) {247 {  ID   Name            Description}}
  274. set SCO_DHCP_MSGS(MSG_USR_DEF_LIST_SH) {248 {List of all user defined options}}
  275. set SCO_DHCP_MSGS(MSG_USR_DEF_ADD_SH) {249 {Add a new option to the list of user defined options}}
  276. set SCO_DHCP_MSGS(MSG_USR_DEF_DEL_SH) {250 {Delete the selected option from the list}}
  277. set SCO_DHCP_MSGS(MSG_USR_DEF_MOD_SH) {251 {Modify the selected user defined option}}
  278. set SCO_DHCP_MSGS(MSG_RETURN_DHCP) {252 {Return to DHCP Server Manager}}
  279. set SCO_DHCP_MSGS(MSG_RETURN_DHCP_MN) {253 R}
  280. set SCO_DHCP_MSGS(MSG_RETURN_DHCP_SH) {254 {Exit AAS GUI and return to DHCP Server GUI}}
  281. set SCO_DHCP_MSGS(MSG_APP_TITLE) {255 {DHCP Server Manager}}
  282. set SCO_DHCP_MSGS(MSG_TITLE) {256 {DHCP Server Manager on %s}}
  283. set SCO_DHCP_MSGS(MSG_HOST) {257 Host}
  284. set SCO_DHCP_MSGS(MSG_HOST_MN) {258 t}
  285. set SCO_DHCP_MSGS(MSG_OPEN_HOST) {259 {Open host...}}
  286. set SCO_DHCP_MSGS(MSG_OPEN_HOST_MN) {260 O}
  287. set SCO_DHCP_MSGS(MSG_OPEN_HOST_SH) {261 {Manage DHCP Server configuration on another host}}
  288. set SCO_DHCP_MSGS(MSG_EXIT) {262 Exit}
  289. set SCO_DHCP_MSGS(MSG_EXIT_MN) {263 x}
  290. set SCO_DHCP_MSGS(MSG_EXIT_SH) {264 {Exit DHCP Server Manager}}
  291. set SCO_DHCP_MSGS(MSG_SUBNET_MODE) {265 {Configured subnets on %s:}}
  292. set SCO_DHCP_MSGS(MSG_SUBNET_SH) {266 {Add a subnet entry}}
  293. set SCO_DHCP_MSGS(MSG_CLIENT_MODE) {267 {Configured clients on %s:}}
  294. set SCO_DHCP_MSGS(MSG_CLIENT_SH) {268 {Add a client entry}}
  295. set SCO_DHCP_MSGS(MSG_USER_MODE) {269 {Configured user classes on %s:}}
  296. set SCO_DHCP_MSGS(MSG_USER_SH) {270 {Add a user class entry }}
  297. set SCO_DHCP_MSGS(MSG_VENDOR_MODE) {271 {Configured vendor classes on %s:}}
  298. set SCO_DHCP_MSGS(MSG_VENDOR_SH) {272 {Add a vendor class entry}}
  299. set SCO_DHCP_MSGS(MSG_GLOBAL_MODE) {273 {Configured global options on %s:}}
  300. set SCO_DHCP_MSGS(MSG_GLOBAL_SH) {274 {Add a global option entry}}
  301. set SCO_DHCP_MSGS(MSG_OPTION_MODE) {275 {Configured user defined options on %s:}}
  302. set SCO_DHCP_MSGS(MSG_OPTION_SH) {276 {Add a user defined option entry}}
  303. set SCO_DHCP_MSGS(MSG_MENU_OBJECT) {277 Entry}
  304. set SCO_DHCP_MSGS(MSG_MENU_ADD) {278 Add...}
  305. set SCO_DHCP_MSGS(MSG_MENU_MOD_SH) {279 {Modify the selected entry}}
  306. set SCO_DHCP_MSGS(MSG_MENU_DEL_SH) {280 {Delete the selected entry}}
  307. set SCO_DHCP_MSGS(MSG_MENU_EXIT) {281 Exit}
  308. set SCO_DHCP_MSGS(MSG_MENU_EXIT_SH) {282 {Exit DHCP Configuration Manager}}
  309. set SCO_DHCP_MSGS(MSG_MENU_VIEW) {283 View}
  310. set SCO_DHCP_MSGS(MSG_MENU_SUBNETS) {284 Subnets}
  311. set SCO_DHCP_MSGS(MSG_MENU_SUBNETS_SH) {285 {View configured subnets}}
  312. set SCO_DHCP_MSGS(MSG_MENU_CLIENTS) {286 Clients}
  313. set SCO_DHCP_MSGS(MSG_MENU_CLIENTS_SH) {287 {View configured clients}}
  314. set SCO_DHCP_MSGS(MSG_MENU_USERS) {288 {User Classes}}
  315. set SCO_DHCP_MSGS(MSG_MENU_USERS_SH) {289 {View configured user classes}}
  316. set SCO_DHCP_MSGS(MSG_MENU_VENDORS) {290 {Vendor Classes}}
  317. set SCO_DHCP_MSGS(MSG_MENU_VENDORS_SH) {291 {View configured vendor classes}}
  318. set SCO_DHCP_MSGS(MSG_MENU_GLOBAL) {292 {Global Options}}
  319. set SCO_DHCP_MSGS(MSG_MENU_GLOBAL_SH) {293 {View DHCP options for all clients}}
  320. set SCO_DHCP_MSGS(MSG_MENU_USER_OPTS) {294 {User Defined Options}}
  321. set SCO_DHCP_MSGS(MSG_MENU_USER_OPTS_SH) {295 {View user defined options for all clients}}
  322. set SCO_DHCP_MSGS(MSG_MENU_SERVER) {296 Server}
  323. set SCO_DHCP_MSGS(MSG_MENU_SERVER_PARAMETERS) {297 {Edit Server Parameters...}}
  324. set SCO_DHCP_MSGS(MSG_MENU_SERVER_PARAMETERS_SH) {298 {Edit server parameters}}
  325. set SCO_DHCP_MSGS(MSG_MENU_ADDRESS) {299 {Address Allocation Server...}}
  326. set SCO_DHCP_MSGS(MSG_MENU_ADDRESS_SH) {300 {Set location of Address Allocation Server}}
  327. set SCO_DHCP_MSGS(MSG_MENU_OPTIONS) {301 Options}
  328. set SCO_DHCP_MSGS(ERR_VERSION) {302 {Unable to get Operation System version}}
  329. set SCO_DHCP_MSGS(MSG_MENU_OBJECT_MN) {303 E}
  330. set SCO_DHCP_MSGS(MSG_MENU_ADD_MN) {304 A}
  331. set SCO_DHCP_MSGS(MSG_MODIFY_MN) {305 M}
  332. set SCO_DHCP_MSGS(MSG_DELETE_MN) {306 D}
  333. set SCO_DHCP_MSGS(MSG_MENU_VIEW_MN) {307 V}
  334. set SCO_DHCP_MSGS(MSG_MENU_SUBNETS_MN) {308 S}
  335. set SCO_DHCP_MSGS(MSG_MENU_CLIENTS_MN) {309 C}
  336. set SCO_DHCP_MSGS(MSG_MENU_USERS_MN) {310 U}
  337. set SCO_DHCP_MSGS(MSG_MENU_VENDORS_MN) {311 V}
  338. set SCO_DHCP_MSGS(MSG_MENU_GLOBAL_MN) {312 G}
  339. set SCO_DHCP_MSGS(MSG_MENU_USER_OPTS_MN) {313 D}
  340. set SCO_DHCP_MSGS(MSG_MENU_SERVER_MN) {314 S}
  341. set SCO_DHCP_MSGS(MSG_MENU_SERVER_PARAMETERS_MN) {315 E}
  342. set SCO_DHCP_MSGS(MSG_MENU_ADDRESS_MN) {316 A}
  343. set SCO_DHCP_MSGS(MSG_MENU_OPTIONS_MN) {317 O}
  344. proc checkIPaddr {addr} {
  345.     if { [lempty $addr] } {
  346.     return 0
  347.     }
  348.     set match [regsub {^([0-9]+)\.([0-9]+)\.([0-9]+)\.([0-9]+)$} $addr \
  349.            {\1 \2 \3 \4} octets]
  350.     if { ! $match } {
  351.     return 0
  352.     } else {
  353.     foreach octet $octets {
  354.         if { $octet < 0 || $octet > 255 } {
  355.         return 0
  356.         }
  357.     }
  358.     }
  359.     return 1
  360. }
  361. proc checkIPwidgetCB {form cbs} {
  362.     set value  [keylget cbs value]
  363.     set widget [keylget cbs widget]
  364.     set a_addr [VxGetVar $form a_addr]
  365.     set b_addr [VxGetVar $form b_addr]
  366.     set c_addr [VxGetVar $form c_addr]
  367.     set d_addr [VxGetVar $form d_addr]
  368.     set userCheckIPwidget [VxGetVar $form userCheckIPwidget]
  369.     set skip 0
  370.     set length [string length $value]
  371.     if {$length == 0} {
  372.     return
  373.     }
  374.     if {$length >= 3} {
  375.     set skip 1
  376.     }
  377.     if {[string range $value [expr $length - 1] end] == "."} {
  378.     set skip 1
  379.     set value [string range $value 0 [expr $length - 2]]
  380.     VtSetValues $widget -value $value
  381.     }
  382.     if {![ctype digit $value]} then {
  383.     VtBeep
  384.     VtSetValues $widget -value ""
  385.     return
  386.     }
  387.     if {$value < 0 || $value > 255} then {
  388.     VtBeep
  389.     VtSetValues $widget -value ""
  390.     return
  391.     }
  392.     if {$skip} then {
  393.     if {$widget == $a_addr} {VtSetFocus $b_addr}
  394.     if {$widget == $b_addr} {VtSetFocus $c_addr}
  395.     if {$widget == $c_addr} {VtSetFocus $d_addr}
  396.     }
  397.     if {[string length $userCheckIPwidget]} {
  398.     $userCheckIPwidget $cbs
  399.     }
  400. }
  401. proc getIPwidgetValue {widget} {
  402.     set a_addr [VxGetVar $widget a_addr]
  403.     set b_addr [VxGetVar $widget b_addr]
  404.     set c_addr [VxGetVar $widget c_addr]
  405.     set d_addr [VxGetVar $widget d_addr]
  406.     set value "[VtGetValues $a_addr -value]"
  407.     append value "."
  408.     append value "[VtGetValues $b_addr -value]"
  409.     append value "."
  410.     append value "[VtGetValues $c_addr -value]"
  411.     append value "."
  412.     append value "[VtGetValues $d_addr -value]"
  413.     return $value
  414. }
  415. proc setIPwidgetValue {widget value} {
  416.     set a_addr [VxGetVar $widget a_addr]
  417.     set b_addr [VxGetVar $widget b_addr]
  418.     set c_addr [VxGetVar $widget c_addr]
  419.     set d_addr [VxGetVar $widget d_addr]
  420.     set values [split $value "."]
  421.     VtSetValues $a_addr -value [lindex $values 0]
  422.     VtSetValues $b_addr -value [lindex $values 1]
  423.     VtSetValues $c_addr -value [lindex $values 2]
  424.     VtSetValues $d_addr -value [lindex $values 3]
  425.     VtSetFocus    $a_addr
  426. }
  427. proc createIPwidget {form value shortHelp {userCheckIPwidget {}}} {
  428.     set values [split $value "."]
  429.     set a_addr [VtText $form.a -columns 3 \
  430.         -value [lindex $values 0] \
  431.         -callback "SaSetFocus next" \
  432.         -valueChangedCallback "checkIPwidgetCB $form" \
  433.         -shortHelpCallback SaShortHelpCB \
  434.         -shortHelpString "[IntlLocalizeMsg $shortHelp]" ]
  435.     set a_label [VtLabel $form.al -label "." \
  436.         -leftOffset 0 \
  437.         -leftSide $a_addr -alignTop $a_addr]
  438.     set b_addr [VtText $form.b -columns 3 \
  439.         -value [lindex $values 1] \
  440.         -callback "SaSetFocus next" \
  441.         -valueChangedCallback "checkIPwidgetCB $form" \
  442.         -leftOffset 0 \
  443.         -leftSide $a_label -alignTop $a_label \
  444.         -shortHelpCallback SaShortHelpCB \
  445.         -shortHelpString "[IntlLocalizeMsg $shortHelp]" ]
  446.     set b_label [VtLabel $form.bl -label "." \
  447.         -leftOffset 0 \
  448.         -leftSide $b_addr -alignTop $b_addr]
  449.     set c_addr [VtText $form.c -columns 3 \
  450.         -value [lindex $values 2] \
  451.         -callback "SaSetFocus next" \
  452.         -valueChangedCallback "checkIPwidgetCB $form" \
  453.         -leftOffset 0 \
  454.         -leftSide $b_label -alignTop $b_label \
  455.         -shortHelpCallback SaShortHelpCB \
  456.         -shortHelpString "[IntlLocalizeMsg $shortHelp]" ]
  457.     set c_label [VtLabel $form.cl -label "." \
  458.         -leftOffset 0 \
  459.         -leftSide $c_addr -alignTop $c_addr]
  460.     set d_addr [VtText $form.d -columns 3 \
  461.         -value [lindex $values 3] \
  462.         -callback "SaSetFocus next" \
  463.         -valueChangedCallback "checkIPwidgetCB $form" \
  464.         -leftSide $c_label -alignTop $c_label \
  465.         -leftOffset 0 \
  466.         -shortHelpCallback SaShortHelpCB \
  467.         -shortHelpString "[IntlLocalizeMsg $shortHelp]" ]
  468.     VxSetVar $form a_addr $a_addr
  469.     VxSetVar $form b_addr $b_addr
  470.     VxSetVar $form c_addr $c_addr
  471.     VxSetVar $form d_addr $d_addr
  472.     VxSetVar $form userCheckIPwidget $userCheckIPwidget
  473. }
  474. proc browser:Init {browserW {data {}}} {
  475.     global BROWSER BROWSER_DATA BROWSER_STATE
  476.     global BROWSER_NUM_COL_PARENT BROWSER_NUM_COL_CHILD
  477.     set BROWSER $browserW
  478.     if [lempty $data] {
  479.     set data { { {{ICON 1 1 5} {STRING 15} {STRING 50} {DATA} {DATA}}
  480.         {{ICON 1 1 1} {STRING 15} {STRING 40} {DATA} {DATA}} medBoldFont}
  481.       { {{ICON 2} {STRING 15 10 10} {STRING 38} {DATA} {DATA}}
  482.         {{ICON 1} {STRING 20 5 5} {STRING 40} {DATA} {DATA}} medNormalFont}
  483.     }
  484.     }
  485.     set i 0
  486.     foreach levelData $data {
  487.     incr i
  488.     set BROWSER_DATA(level_$i) $levelData
  489.     }
  490.     set col_desc_list [lindex $BROWSER_DATA(level_1) 0]
  491.     set col_desc [lindex $col_desc_list 0]
  492.     set BROWSER_NUM_COL_PARENT [llength [lindex $BROWSER_DATA(level_1) 0]] 
  493.     set BROWSER_NUM_COL_CHILD  [llength [lindex $BROWSER_DATA(level_2) 0]]
  494.     set BROWSER_STATE COLLAPSED
  495. } ;# browser:Init
  496. proc browser:MenuOpts {msgID pulldown dialog} {
  497.     set expandAll [VtPushButton $pulldown.exp_all \
  498.         -label [IntlLocalizeMsg ${msgID}_MSG_EXPAND_ALL] \
  499.         -shortHelpCallback SaShortHelpCB \
  500.         -shortHelpString [IntlLocalizeMsg ${msgID}_MSG_EXPAND_ALL_SH] \
  501.         -callback "browser:SetStateCB EXPANDED"]
  502.     set collapseAll [VtPushButton $pulldown.col_all \
  503.         -label [IntlLocalizeMsg ${msgID}_MSG_COLLAPSE_ALL] \
  504.         -shortHelpCallback SaShortHelpCB \
  505.         -shortHelpString [IntlLocalizeMsg ${msgID}_MSG_COLLAPSE_ALL_SH]\
  506.         -callback "browser:SetStateCB COLLAPSED"]
  507.     set expand [VtPushButton $pulldown.exp \
  508.         -label [IntlLocalizeMsg ${msgID}_MSG_EXPAND] \
  509.         -shortHelpCallback SaShortHelpCB \
  510.         -shortHelpString [IntlLocalizeMsg ${msgID}_MSG_EXPAND_SH] \
  511.         -autoLock browser:ExpandCollapseCB \
  512.         -callback browser:ExpandCollapseCB ]
  513.     set collapse [VtPushButton $pulldown.col \
  514.         -label [IntlLocalizeMsg ${msgID}_MSG_COLLAPSE] \
  515.         -shortHelpCallback SaShortHelpCB \
  516.         -shortHelpString [IntlLocalizeMsg ${msgID}_MSG_COLLAPSE_SH] \
  517.         -autoLock browser:ExpandCollapseCB \
  518.         -callback browser:ExpandCollapseCB ]
  519.     VxSetVar $dialog expandAll   $expandAll
  520.     VxSetVar $dialog collapseAll $collapseAll
  521.     VxSetVar $dialog expand      $expand
  522.     VxSetVar $dialog collapse    $collapse
  523. } ;# browser:MenuOpts
  524. proc browser:SetSensitivity {dialog} {
  525.     global BROWSER displayData
  526.     set expandAll   [VxGetVar $dialog expandAll]
  527.     set collapseAll [VxGetVar $dialog collapseAll]
  528.     set expand      [VxGetVar $dialog expand]
  529.     set collapse    [VxGetVar $dialog collapse]
  530.     set selected [VtDrawnListGetSelectedItem $BROWSER -byPositionList]
  531.     if {$selected == 0} {set selected {}}
  532.     if [lempty $selected] {
  533.     VtSetSensitive $expand 0
  534.     VtSetSensitive $collapse 0
  535.     VtSetSensitive $expandAll 0
  536.     VtSetSensitive $collapseAll 0
  537.     VtUnLock -once
  538.     return
  539.     } else {
  540.     VtSetSensitive $expandAll 1
  541.     VtSetSensitive $collapseAll 1
  542.     }
  543.     set selected [lindex [VtDrawnListGetSelectedItem $BROWSER -byRecordList] 0]
  544.     set type [browser:GetType $selected]
  545.     if [cequal CHILD $type] {
  546.     VtSetSensitive $expand 0
  547.     VtSetSensitive $collapse 0
  548.     VtUnLock -once
  549.     return
  550.     }
  551.     set parentId [browser:GetParentId $type $selected]
  552.     set ent $displayData($parentId)
  553.     keylget ent state state
  554.     if [cequal EXPANDED $state] {
  555.     VtSetSensitive $expand 0
  556.     VtSetSensitive $collapse 1
  557.     } else {
  558.     VtSetSensitive $expand 1
  559.     VtSetSensitive $collapse 0
  560.     }
  561. } ;# browser:SetSensitivity
  562. proc browser:ExpandCollapseCB {cbs} {
  563.     global displayData BROWSER BROWSER_DATA
  564.     if {[info exists displayData] == 0} {
  565.     VtUnLock
  566.     return
  567.     }
  568.     keylget cbs dialog dialog
  569.     set expand   [VxGetVar $dialog expand]
  570.     set collapse [VxGetVar $dialog collapse]
  571.     set pos [VtDrawnListGetSelectedItem $BROWSER -byPositionList]
  572.     set selected [lindex [VtDrawnListGetSelectedItem $BROWSER -byRecordList] 0]
  573.     set type [browser:GetType $selected]
  574.     if [cequal $type CHILD] {
  575.     if {![lempty [info commands SelectChildCB]] } {    ;#CALLOUT
  576.         SelectChildCB $cbs            ;# modify child
  577.     }
  578.     VtUnLock
  579.     return
  580.     }
  581.     set parentId [browser:GetParentId $type $selected]
  582.     set entity $displayData($parentId)
  583.     keylget entity state state
  584.     keylget entity children children
  585.     set numChildren [llength $children]
  586.     if {$numChildren == 0} {
  587.     VtUnLock -once
  588.     return
  589.     }
  590.     set levelData $BROWSER_DATA(level_2)
  591.     switch -- $state {
  592.     EXPANDED {        ;# collapse the browser
  593.         incr pos
  594.         loop i 0 $numChildren 1 {
  595.         VtDrawnListDeleteItem $BROWSER -position $pos
  596.         }
  597.         keylset entity state COLLAPSED
  598.         keylset entity displayed 1
  599.         set displayData($parentId) $entity
  600.     }
  601.     COLLAPSED {        ;# expand the browser
  602.         keylget entity children children
  603.         foreach child $children {
  604.         incr pos
  605.         VtDrawnListAddItem $BROWSER \
  606.             -position $pos \
  607.             -MOTIF_formatList [lindex $levelData 0]\
  608.             -CHARM_formatList [lindex $levelData 1]\
  609.             -overrideFont [lindex $levelData 2]\
  610.             -fieldList $child
  611.         }
  612.         keylset entity state EXPANDED
  613.         keylset entity displayed [expr $numChildren + 1]
  614.         set displayData($parentId) $entity
  615.     }
  616.     }
  617.     browser:SetSensitivity $dialog
  618.     VtUnLock -once
  619. }
  620. proc browser:SetStateCB {newState cbs} {
  621.     global displayData BROWSER_STATE
  622.     if {[info exists displayData] == 0} {
  623.     VtUnLock
  624.     return
  625.     }
  626.     set BROWSER_STATE $newState
  627.     for_array_keys parentId displayData {
  628.     set ent $displayData($parentId)
  629.     keylget ent state state
  630.     if [cequal $state $newState] {
  631.         continue
  632.     }
  633.     keylset ent state $newState
  634.     set displayData($parentId) $ent
  635.     }
  636.     browser:ReDisplay
  637.     browser:SetSensitivity [keylget cbs dialog]
  638.     VtUnLock 
  639. } ;# browser:SetStateCB
  640. proc browser:SetDisplayEntry {parentId parent subentries} {
  641.     global displayData BROWSER_STATE
  642.     set displayed 0
  643.     if {[info exists displayData] && \
  644.     ([lsearch [array names displayData] $parentId] != -1)} {
  645.     set oldEntry $displayData($parentId)
  646.     set state [keylget oldEntry state]
  647.     set displayed [keylget oldEntry displayed]
  648.     } elseif {[cequal $BROWSER_STATE EXPANDED]} {
  649.     set state EXPANDED
  650.     } else {
  651.     set state COLLAPSED
  652.     }
  653.     set children {}
  654.     foreach child $subentries {
  655.     lappend children [lappend child $parentId CHILD]
  656.     }
  657.     lappend parent $parentId PARENT
  658.     keylset newEntry data "$parent"
  659.     keylset newEntry children $children
  660.     keylset newEntry state $state
  661.     keylset newEntry displayed $displayed
  662.     set displayData($parentId) $newEntry
  663. } ;# browser:SetDisplayEntry 
  664. proc browser:SetParent {parentId data} {
  665.     global displayData
  666.     lappend data $parentId PARENT 
  667.     set entry $displayData($parentId)
  668.     keylset entry data $data
  669.     set displayData($parentId) $entry
  670. } ;# SetParent
  671. proc browser:SetChildren {parentId subentries} {
  672.     global displayData
  673.     set children {}
  674.     foreach child $subentries {
  675.     lappend children [lappend child $parentId CHILD]
  676.     }
  677.     set entry $displayData($parentId)
  678.     keylset entry children $children
  679.     set displayData($parentId) $entry
  680. } ;#SetChildren
  681. proc browser:RemDisplayEntry {parentId} {
  682.     global displayData
  683.     unset displayData($parentId)
  684. } ;# RemDisplayEntry
  685. proc browser:RenameDisplayEntry {oldParentId newParentId} {
  686.     global displayData
  687.     set entry $displayData($oldParentId)
  688.     keylget entry data data
  689.     lvarpop data end    ;# remove PARENT flag
  690.     lvarpop data end    ;# remove oldParentId 
  691.     lappend data $newParentId PARENT
  692.     keylset entry data "$data"
  693.     keylget entry children subentries 
  694.     set children {}
  695.     foreach child $subentries {
  696.         lvarpop child end    ;# remove PARENT flag
  697.         lvarpop child end    ;# remove oldParentId 
  698.     lappend children [lappend child $newParentId CHILD]
  699.     }
  700.     keylset entry children $children
  701.     set displayData($newParentId) $entry
  702.     unset displayData($oldParentId)
  703. } ;# RenameDisplayEntry
  704. proc browser:GetParent {parentId} {
  705.     global displayData
  706.     set entry $displayData($parentId) 
  707.     keylget entry data data
  708.     lvarpop data end    ;# remove PARENT flag
  709.     lvarpop data end    ;# remove parentId 
  710.     return $data
  711. } ;# GetParent
  712. proc browser:GetChildren {parentId} {
  713.     global displayData
  714.     set entry $displayData($parentId) 
  715.     keylget entry children children 
  716.     set childList {}
  717.     foreach item $children {
  718.         lvarpop item end    ;# remove CHILD flag
  719.         lvarpop item end    ;# remove parentId 
  720.     lappend childList $item 
  721.     }
  722.     return $childList
  723. } ;#GetChildren
  724. proc browser:GetParentPos {parentId} {
  725.     global displayData BROWSER BROWSER_DATA
  726.     if {! [lempty [info commands SortParentList]] } {    ;#CALLOUT
  727.     set parents [SortParentList [array names displayData]]
  728.     } else {
  729.     set parents [lsort -increasing [array names displayData]]
  730.     }
  731.     if {[lsearch $parents $parentId] == -1} {
  732.     return 0 ;# parentId is not in displayData
  733.     }
  734.     set pos 1    ;# DrawnList starts from 1
  735.     foreach parent $parents {
  736.     set entry $displayData($parent)
  737.     keylget entry displayed displayed
  738.     if {[cequal $parent $parentId]} {
  739.         break
  740.     }
  741.     if {$displayed} {
  742.         set pos [expr $pos + $displayed]
  743.     }
  744.     }
  745.     return $pos
  746. } ;# GetParentPos 
  747. proc browser:ShowDisplayEntry {parentId {highlight 0}} {
  748.     global displayData BROWSER BROWSER_DATA
  749.     set parentPos [browser:GetParentPos $parentId]
  750.     set entry $displayData($parentId)
  751.     keylget entry displayed displayed
  752.     keylget entry state state
  753.     keylget entry data data
  754.     if {$displayed} {
  755.     for {set cnt 0} {$cnt < $displayed} {incr cnt} {
  756.         VtDrawnListDeleteItem $BROWSER -position $parentPos
  757.     }
  758.     }
  759.     set levelData $BROWSER_DATA(level_1)
  760.     VtDrawnListAddItem $BROWSER -position $parentPos \
  761.     -fieldList $data \
  762.     -MOTIF_formatList [lindex $levelData 0]\
  763.     -CHARM_formatList [lindex $levelData 1]\
  764.     -overrideFont [lindex $levelData 2]
  765.     if [cequal EXPANDED $state] {
  766.         keylget entry children children
  767.     set pos $parentPos
  768.     set levelData $BROWSER_DATA(level_2)
  769.     foreach child $children {
  770.         incr pos
  771.         VtDrawnListAddItem $BROWSER \
  772.         -position $pos \
  773.         -MOTIF_formatList [lindex $levelData 0]\
  774.         -CHARM_formatList [lindex $levelData 1]\
  775.         -overrideFont [lindex $levelData 2]\
  776.         -fieldList $child
  777.     }
  778.     keylset entry displayed [expr [llength $children] + 1]
  779.     } else {
  780.     keylset entry displayed 1
  781.     }
  782.     set displayData($parentId) $entry
  783.     if {$highlight} {
  784.     browser:Highlight $parentPos
  785.     }
  786. } ;# browser:ShowDisplayEntry
  787. proc browser:HideDisplayEntry {parentId} {
  788.     global displayData BROWSER BROWSER_DATA
  789.     set parentPos [browser:GetParentPos $parentId]
  790.     set entry $displayData($parentId)
  791.     keylget entry displayed displayed
  792.     if {$displayed} {
  793.     for {set cnt 0} {$cnt < $displayed} {incr cnt} {
  794.         VtDrawnListDeleteItem $BROWSER -position $parentPos
  795.     }
  796.     keylset entry displayed 0
  797.         set displayData($parentId) $entry
  798.     }
  799. } ;# HideDisplayEntry
  800. proc browser:ReDisplay {{pos 1}} {
  801.     global displayData BROWSER BROWSER_DATA
  802.     set level1Data $BROWSER_DATA(level_1)
  803.     set level2Data $BROWSER_DATA(level_2)
  804.     VtDrawnListDeleteItem $BROWSER -all
  805.     if {[info exists displayData]} {
  806.     if {! [lempty [info commands SortParentList]] } {    ;#CALLOUT
  807.         set parentList [SortParentList [array names displayData]]
  808.     } else {
  809.         set parentList [lsort -increasing [array names displayData]]
  810.      }    
  811.     } else {
  812.     set parentList {}
  813.     }
  814.     if {[lempty $parentList]} {
  815.     return 0
  816.     } else {
  817.     foreach parentId $parentList {
  818.         set ent $displayData($parentId)
  819.         keylget ent state state
  820.         keylget ent data data
  821.         VtDrawnListAddItem $BROWSER \
  822.         -position 0 \
  823.         -MOTIF_formatList [lindex $level1Data 0]\
  824.         -CHARM_formatList [lindex $level1Data 1]\
  825.         -overrideFont [lindex $level1Data 2]\
  826.         -fieldList $data
  827.         if [cequal EXPANDED $state] {
  828.         keylget ent children children
  829.         foreach child $children {
  830.             VtDrawnListAddItem $BROWSER \
  831.             -position 0 \
  832.             -MOTIF_formatList [lindex $level2Data 0]\
  833.             -CHARM_formatList [lindex $level2Data 1]\
  834.             -overrideFont [lindex $level2Data 2]\
  835.             -fieldList $child
  836.         }
  837.         keylset ent displayed [expr [llength $children] + 1]
  838.         } else {
  839.         keylset ent displayed 1
  840.         }
  841.         set displayData($parentId) $ent
  842.     }
  843.         browser:Highlight $pos
  844.     return 1
  845.     }
  846. } ;# browser:ReDisplay
  847. proc browser:FindItemParent {pos} {
  848.     global BROWSER displayData
  849.     set selected [lindex [VtDrawnListGetItem $BROWSER -position $pos] 0]
  850.     if {[lempty $selected]} {
  851.     return {}
  852.     }
  853.     set type [browser:GetType $selected]
  854.     set parentId [browser:GetParentId $type $selected]
  855.     keylget displayData($parentId) data data
  856.     lvarpop data end    ;# remove parentId 
  857.     lvarpop data end    ;# remove PARENT flag
  858.     return $data
  859. }
  860. proc browser:FindItemParentPos {pos} {
  861.     global BROWSER
  862.     set selected [lindex [VtDrawnListGetItem $BROWSER -position $pos] 0]
  863.     if {[lempty $selected]} {
  864.     return {}
  865.     }
  866.     set type [browser:GetType $selected]
  867.     if [cequal $type CHILD] {
  868.     set all [VtDrawnListGetItem $BROWSER -all]    ;# all items
  869.     if {! [lempty [info commands FindItemParent]] } { ;#CALLOUT
  870.         set parent [FindItemParent $selected $all]
  871.     } else {
  872.         set parent [VtDrawnListGetItem $BROWSER \
  873.         -field [browser:GetParentIdIndex $type] \
  874.                [browser:GetParentId $type $selected] \
  875.         -field [browser:GetTypeIndex $type] $type
  876.         set parent [lsearch $all [join $parent]]
  877.     }
  878.     set parent [expr {($parent == -1) ? 1 : $parent + 1}]
  879.     } else {
  880.     set parent $pos
  881.     }
  882.     return $parent
  883. }
  884. proc browser:GetItemFromPos {pos} {
  885.     global BROWSER
  886.     set selected [lindex [VtDrawnListGetItem $BROWSER -position $pos] 0]
  887.     lvarpop selected end    ;# remove parentId 
  888.     lvarpop selected end    ;# remove PARENT flag
  889.     return $selected
  890. } ;# browser:GetItemFromPos
  891. proc browser:RemoveEntryFromPos {pos} {
  892.     global displayData BROWSER
  893.     set selected [lindex [VtDrawnListGetItem $BROWSER -position $pos] 0]
  894.     set type [browser:GetType $selected]
  895.     set parentId [browser:GetParentId $type $selected] 
  896.     if [cequal CHILD $type] {
  897.         set compare [lrange $selected 0 end]
  898.     set ent $displayData($parentId)
  899.     keylget ent children children
  900.     set pop [lvarpop children [lsearch $children $compare]]
  901.     if [string match $pop $compare] {
  902.         VtDrawnListDeleteItem $BROWSER -position $pos
  903.         keylset ent children $children
  904.         keylset ent displayed [expr [llength $children] + 1]
  905.         set displayData($parentId) $ent
  906.         set ret 1
  907.     } else {
  908.         set ret -1        ;# failed to remove child item
  909.     }
  910.     return $ret
  911.     }
  912.     VtDrawnListDeleteItem $BROWSER -position $pos
  913.     set ent $displayData($parentId)
  914.     keylget ent state state
  915.     if [cequal EXPANDED $state ] {
  916.     keylget ent children children
  917.     foreach child $children {
  918.         VtDrawnListDeleteItem $BROWSER -position $pos
  919.     }
  920.     }
  921.     unset displayData($parentId)
  922.     return [browser:Highlight $pos]
  923. } ;# browser:RemoveEntryFromPos
  924. proc browser:RemoveSelectedEntry {} {
  925.     global BROWSER
  926.     set pos [VtDrawnListGetSelectedItem $BROWSER -byPositionList]
  927.     return [browser:RemoveEntryFromPos $pos]
  928. }
  929. proc browser:Search {search {highlight {}}} {
  930.     global BROWSER
  931.     set numEntries [llength [VtDrawnListGetItem $BROWSER -all]]
  932.     set found 0
  933.     loop i 1 $numEntries {
  934.     set entry [lindex [VtDrawnListGetItem $BROWSER -position $i] 0]
  935.     set type [GetType $entry]
  936.     if [cequal CHILD $type] {
  937.         continue    ;# skip sub entries
  938.     }
  939.     if {[string match $search [lindex $entry 1]] ||
  940.         [string match $search [lindex $entry 2]]} {
  941.         set found $i
  942.         break
  943.     }
  944.     }
  945.     if {![lempty $highlight] && $found > 0} {
  946.     browser:Highlight $found
  947.     }
  948.     return $found
  949. }
  950. proc browser:GetSelectedItem {} {
  951.     global BROWSER
  952.     set data [lindex [VtDrawnListGetSelectedItem $BROWSER -byRecordList] 0]
  953.     lvarpop data end    ;# remove parentId 
  954.     lvarpop data end    ;# remove PARENT flag
  955.     return $data 
  956. }
  957. proc browser:GetSelectedItemPos {} {
  958.     global BROWSER
  959.     return [lindex [VtDrawnListGetSelectedItem $BROWSER -byPositionList] 0]
  960. }
  961. proc browser:Highlight {{pos 1}} {
  962.     global BROWSER
  963.     set noItems [llength [VtDrawnListGetItem $BROWSER -all]]
  964.     if {$noItems > 0} {
  965.     if {$pos > $noItems} {
  966.         VtDrawnListSelectItem $BROWSER -position $noItems
  967.     } else {
  968.         VtDrawnListSelectItem $BROWSER -position $pos
  969.     }
  970.     SaDrawnListShowSelectedItem $BROWSER
  971.     return 1
  972.     } else {
  973.     return 0
  974.     }
  975. }
  976. proc browser:IsParent {pos} {
  977.     global BROWSER
  978.     set selected [lindex [VtDrawnListGetItem $BROWSER -position $pos] 0]
  979.     set type [browser:GetType $selected]
  980.     return [cequal $type PARENT]
  981. }
  982. proc browser:DeleteAll {} {
  983.     global displayData BROWSER
  984.     catch {unset displayData}
  985.     if [info exists BROWSER] {VtDrawnListDeleteItem $BROWSER -all}
  986. }
  987. proc browser:GetParentDrawnList {} {
  988.     global BROWSER
  989.     set displayedList [VtDrawnListGetItem $BROWSER -all]
  990.     set parentList {}
  991.     foreach entry $displayedList {
  992.         if {[cequal [browser:GetType $entry] PARENT]} {
  993.         lvarpop entry end    ;# remove PARENT flag
  994.             lvarpop entry end    ;# remove parentId 
  995.         lappend parentList $entry
  996.     }
  997.     }
  998.     return $parentList
  999. }
  1000. proc browser:GetParentIdIndex {type} {
  1001.     global BROWSER_NUM_COL_PARENT BROWSER_NUM_COL_CHILD
  1002.     if {[cequal $type PARENT]} {
  1003.     return [expr $BROWSER_NUM_COL_PARENT - 2]
  1004.     } else {
  1005.     return [expr $BROWSER_NUM_COL_CHILD - 2]
  1006.     }
  1007. }
  1008. proc browser:GetTypeIndex {type} {
  1009.     global BROWSER_NUM_COL_PARENT BROWSER_NUM_COL_CHILD
  1010.     if {[cequal $type PARENT]} {
  1011.     return [expr $BROWSER_NUM_COL_PARENT - 1]
  1012.     } else {
  1013.     return [expr $BROWSER_NUM_COL_CHILD - 1]
  1014.     }
  1015. }
  1016. proc browser:GetParentId {type selected} {
  1017.     return [lindex $selected [browser:GetParentIdIndex $type]]
  1018. }
  1019. proc browser:GetType {selected} {
  1020.     return [lindex $selected end]
  1021. }
  1022. proc InitHwInfo {} {
  1023.     global hw_types
  1024.     keylset entry name    [IntlLocalizeMsg SCO_DHCP_MSG_TYPE_ethernet]
  1025.     keylset entry code    01
  1026.     keylset entry len    12
  1027.     keylset entry type    xdigit
  1028.     keylset hw_types ethernet $entry
  1029.     keylset entry name    [IntlLocalizeMsg SCO_DHCP_MSG_TYPE_ieee802]
  1030.     keylset entry code    06
  1031.     keylset entry len    12
  1032.     keylset entry type    xdigit
  1033.     keylset hw_types ieee802 $entry
  1034. } ;# InitHwInfo
  1035. proc GetHwList {} {
  1036.     global hw_types
  1037.     set hwList {}
  1038.     foreach type [keylkeys hw_types] {
  1039.     set entry [keylget hw_types $type]
  1040.     lappend hwList [keylget entry name]
  1041.     }
  1042.     return $hwList
  1043. } ;# GetHwList
  1044. proc FindHwEntry {key val} {
  1045.     global hw_types
  1046.     set found {}
  1047.     foreach type [keylkeys hw_types] {
  1048.     set entry [keylget hw_types $type]
  1049.     if {[cequal $key name]} {
  1050.         if {[cequal [keylget entry $key] $val]} {
  1051.         set found $type
  1052.         break    
  1053.         }
  1054.     } elseif {[cequal $key code]} {
  1055.         if {[keylget entry $key] == $val} {
  1056.         set found $type
  1057.         break    
  1058.         }
  1059.     }
  1060.     }
  1061.     return $found
  1062. } ;# FindHwEntry
  1063. proc GetHwInfo {type} {
  1064.     global hw_types
  1065.     set hwinfo {}
  1066.     if {[string length $type]} {
  1067.         keylget hw_types $type hwinfo
  1068.     }
  1069.     return $hwinfo
  1070. } ;# GetHwInfo
  1071. proc InitOptTypes {} {
  1072.     global opt_types
  1073.     keylset entry message  [IntlLocalizeMsg SCO_DHCP_MSG_TYPE_int8]
  1074.     keylset entry min_val -128
  1075.     keylset entry max_val  127
  1076.     keylset entry signed   1
  1077.     keylset opt_types int8 $entry
  1078.     unset entry
  1079.     keylset entry message [IntlLocalizeMsg SCO_DHCP_MSG_TYPE_uint8]
  1080.     keylset entry min_val 0 
  1081.     keylset entry max_val 255 
  1082.     keylset entry signed  0
  1083.     keylset opt_types uint8 $entry
  1084.     unset entry
  1085.     keylset entry message  [IntlLocalizeMsg SCO_DHCP_MSG_TYPE_int16]
  1086.     keylset entry min_val -32768
  1087.     keylset entry max_val  32767
  1088.     keylset entry signed   1
  1089.     keylset opt_types int16 $entry
  1090.     unset entry
  1091.     keylset entry message [IntlLocalizeMsg SCO_DHCP_MSG_TYPE_uint16]
  1092.     keylset entry min_val 0 
  1093.     keylset entry max_val 65535
  1094.     keylset entry signed  0
  1095.     keylset opt_types uint16 $entry
  1096.     unset entry
  1097.     keylset entry message  [IntlLocalizeMsg SCO_DHCP_MSG_TYPE_int32]
  1098.     keylset entry min_val -2147483648 
  1099.     keylset entry max_val  2147483647 
  1100.     keylset entry signed   1 
  1101.     keylset opt_types int32 $entry
  1102.     unset entry
  1103.     keylset entry message  [IntlLocalizeMsg SCO_DHCP_MSG_TYPE_uint32]
  1104.     keylset entry min_val  0 
  1105.     keylset entry max_val  4294967295 
  1106.     keylset entry signed   0 
  1107.     keylset opt_types uint32 $entry
  1108.     unset entry
  1109.     keylset entry message  [IntlLocalizeMsg SCO_DHCP_MSG_TYPE_boolean]
  1110.     keylset opt_types boolean $entry
  1111.     unset entry
  1112.     keylset entry message [IntlLocalizeMsg SCO_DHCP_MSG_TYPE_ip_address]
  1113.     keylset opt_types ip_address $entry 
  1114.     unset entry
  1115.     keylset entry message [IntlLocalizeMsg SCO_DHCP_MSG_TYPE_string]
  1116.     keylset opt_types string $entry
  1117.     unset entry
  1118.     keylset entry message [IntlLocalizeMsg SCO_DHCP_MSG_TYPE_binary]
  1119.     keylset opt_types binary $entry
  1120.     unset entry
  1121.     keylset entry message  [IntlLocalizeMsg SCO_DHCP_MSG_TYPE_bpmh]
  1122.     keylset opt_types bpmh $entry
  1123. } ;# InitOptTypes
  1124. proc GetOptTypeList {} {
  1125.     global opt_types
  1126.     set typeList {}
  1127.     foreach type [keylkeys opt_types] {
  1128.     if {[cequal $type bpmh]} {
  1129.         continue
  1130.     }
  1131.     keylget opt_types $type entry
  1132.     lappend typeList [keylget entry message]
  1133.     }
  1134.     return $typeList
  1135. } ;# GetOptTypeList
  1136. proc FindOptType {msg} {
  1137.     global opt_types
  1138.     set found {}
  1139.     foreach type [keylkeys opt_types] {
  1140.     keylget opt_types $type entry
  1141.     if {[cequal $msg [keylget entry message]]} {
  1142.         set found $type
  1143.         break    
  1144.     }
  1145.     }
  1146.     return $found
  1147. } ;# FindOptType
  1148. proc MakeCall {service object attrs {operation ObjectGet}} {
  1149.     set result {}
  1150.     set objcall [list $operation [list sco $service] \
  1151.     [SetInstance $object] $attrs]
  1152.     set bmipResponseList [SaMakeObjectCall $objcall]
  1153.     foreach bmip $bmipResponseList {
  1154.     if [BmipResponseErrorIsPresent bmip] {
  1155.         set errorStack [BmipResponseErrorStack bmip]
  1156.         ErrorThrow errorStack 
  1157.     }
  1158.     keylset item type [lindex [BmipResponseClass bmip] 1]
  1159.     keylset item instance [BmipResponseObjectInstance bmip]
  1160.     keylset item attrList [BmipResponseAttrValList bmip]
  1161.     lappend result $item 
  1162.     }
  1163.     return $result
  1164. }
  1165. proc GetAllCall {service attrs} {
  1166.     set result {}
  1167.     set objcall [list ObjectGet -scope 1 [list sco $service] \
  1168.     [SetInstance NULL] $attrs]
  1169.     set bmipResponseList [SaMakeObjectCall $objcall]
  1170.     foreach bmip $bmipResponseList {
  1171.     if [BmipResponseErrorIsPresent bmip] {
  1172.         set errorStack [BmipResponseErrorStack bmip]
  1173.         ErrorThrow errorStack 
  1174.     }
  1175.     keylset item type [lindex [BmipResponseClass bmip] 1]
  1176.     keylset item instance [BmipResponseObjectInstance bmip]
  1177.     keylset item attrList [BmipResponseAttrValList bmip]
  1178.     lappend result $item 
  1179.     }
  1180.     return $result
  1181. }
  1182. proc ActionCall {service object action {val {}}} {
  1183.     set objcall [list ObjectAction [list sco $service] \
  1184.         [SetInstance $object] [list $action] $val]
  1185.     set bmipResponseList [SaMakeObjectCall $objcall]
  1186.     foreach bmip $bmipResponseList {
  1187.     if [BmipResponseErrorIsPresent bmip] {
  1188.         set errorStack [BmipResponseErrorStack bmip]
  1189.         ErrorThrow errorStack 
  1190.     }
  1191.     keylset item type [lindex [BmipResponseClass bmip] 1]
  1192.     keylset item instance [BmipResponseObjectInstance bmip]
  1193.     keylset item type [BmipResponseActionType bmip]
  1194.     keylset item info [BmipResponseActionInfo bmip]
  1195.     lappend result $item
  1196.     }
  1197.     return $result
  1198. }
  1199. proc UpdateEntry {cbs type action tag opts} {
  1200.     global Main
  1201.     keylget cbs dialog dialog
  1202.     set comment ""
  1203.     keylget opts comment comment
  1204.     switch $type {
  1205.     dhcpClient {
  1206.         set name client 
  1207.     }
  1208.     dhcpOption {
  1209.         set name option
  1210.     }
  1211.     dhcpSubnet {
  1212.         set name subnet
  1213.     }
  1214.     dhcpUserClass {
  1215.         set name "user_class"
  1216.     }
  1217.     dhcpVendorClass {
  1218.         set name "vendor_class"
  1219.     }
  1220.     }
  1221.     if {[cequal $action modify]} {
  1222.     if {[ErrorCatch errStack 0 "MakeCall $type $tag \
  1223.         {} ObjectRemove" {} SCO_DHCP_ERR_DELETE \
  1224.         [list $name $tag]] != 0} {
  1225.         SaDisplayErrorStacks $dialog.err [list $errStack] NOHELP
  1226.         VtUnLock
  1227.         return
  1228.     }
  1229.     }
  1230.     keylset attrList options $opts
  1231.     if {[ErrorCatch errStack 0 "MakeCall $type $tag \
  1232.     [list $attrList] ObjectAdd" {} SCO_DHCP_ERR_CREATE \
  1233.     [list $name $tag]] != 0} {
  1234.     SaDisplayErrorStacks $dialog.err [list $errStack] NOHELP
  1235.     VtUnLock
  1236.     return
  1237.     }
  1238.     browser:SetDisplayEntry $tag [list $tag "$comment"] $opts
  1239.     browser:ShowDisplayEntry $tag 1
  1240.     SetMenuSensitivityCB [list [list dialog $Main(Dialog)]]
  1241.     VxEndFormCB $cbs
  1242.     set dialog $Main(Dialog)
  1243.     switch $action {
  1244.         add {
  1245.             set title [IntlLocalizeMsg SCO_DHCP_MSG_ADDED \
  1246.                  "\"$tag - $comment\""]
  1247.         }
  1248.         modify {
  1249.             set title [IntlLocalizeMsg SCO_DHCP_MSG_MODIFIED \
  1250.                  "\"$tag - $comment\""]
  1251.     }
  1252.     }
  1253.     VtShow [VtMessageDialog $dialog.added \
  1254.        -ok \
  1255.     -message $title]
  1256. } ;# UpdateEntryCB
  1257. proc AlignLabel {target source} {
  1258.     set lbl_base [VtGetValues $target -baseLineList]
  1259.     set text_base [VtGetValues $source -baseLineList]
  1260.     VtSetValues $target -MOTIF_topOffset [expr {$text_base - $lbl_base}]
  1261. }
  1262. proc DeleteEntryCB {cbs} {
  1263.     global Main
  1264.     set dialog Main(dialog)
  1265.     set viewSubnet [VxGetVar $Main(Dialog) subnet]
  1266.     set viewClient [VxGetVar $Main(Dialog) client]
  1267.     set viewUser   [VxGetVar $Main(Dialog) user_class]
  1268.     set viewVendor [VxGetVar $Main(Dialog) vendor_class]
  1269.     set viewGlobal [VxGetVar $Main(Dialog) global]
  1270.     set viewOption [VxGetVar $Main(Dialog) option]
  1271.     set item [browser:GetSelectedItem]
  1272.     set tag  [lindex $item 0]
  1273.     set attr {}
  1274.     if {[VtGetValues $viewSubnet -set]} { 
  1275.     set type Subnet
  1276.     } elseif {[VtGetValues $viewClient -set]} { 
  1277.     set type Client
  1278.     } elseif {[VtGetValues $viewUser -set]} {
  1279.     set type UserClass
  1280.     } elseif {[VtGetValues $viewVendor -set]} {
  1281.     set type VendorClass 
  1282.     } elseif {[VtGetValues $viewGlobal -set]} {
  1283.     set type Global
  1284.     set tag  global
  1285.     keylset opts [lindex $item 0] {}
  1286.     keylset attr options $opts
  1287.     } elseif {[VtGetValues $viewOption -set]} {
  1288.     set type Option 
  1289.     } else {
  1290.     VtUnLock
  1291.     return
  1292.     }
  1293.     set osa_type [format "dhcp%s" $type]
  1294.     if {[ErrorCatch errStack 0 "MakeCall $osa_type $tag [list $attr] \
  1295.     ObjectRemove" {} SCO_DHCP_ERR_DELETE "$type $tag"] != 0} {
  1296.         SaDisplayErrorStacks $dialog.err [list $errStack] NOHELP
  1297.     } else {
  1298.     browser:RemoveSelectedEntry
  1299.     SetMenuSensitivityCB [list [list dialog $Main(Dialog)]]
  1300.     }
  1301.     VtUnLock
  1302. } ;# DeleteEntryCB
  1303. proc DeleteCB {cbs} {
  1304.     set dialog    [keylget cbs dialog]
  1305.     set item    [browser:GetSelectedItem]
  1306.     set tag [lindex $item 0]
  1307.     set desc [lindex $item 1]
  1308.     set dlg [VtQuestionDialog $dialog.delete \
  1309.     -okCallback DeleteEntryCB \
  1310.     -autoLock DeleteEntryCB \
  1311.     -cancel \
  1312.     -message [IntlLocalizeMsg SCO_DHCP_MSG_DELETE_ENTRY "\"$tag - $desc\""]]
  1313.     VtShow $dlg
  1314.     VtUnLock
  1315. } ;# DeleteCB
  1316. proc init_global_opts {} {
  1317.     set globalOpts {}
  1318.     if {[ErrorCatch {} 1 "GetAllCall dhcpStandard [list options]" \
  1319.         entries SCO_DHCP_ERR_GET "standard"] != 0} {
  1320.     return
  1321.     }
  1322.     foreach entry $entries {
  1323.         keylget entry instance tag
  1324.     keylget entry attrList attrList
  1325.     keylget attrList options options
  1326.     keylset globalOpts $tag $options
  1327.     }
  1328.     return $globalOpts
  1329. } ;# init_global_opts
  1330. proc init_user_opts {} {
  1331.     set userOpts {}
  1332.     if {[ErrorCatch {} 1 "GetAllCall dhcpOption [list options]" \
  1333.         entries SCO_DHCP_ERR_GET "option"] != 0} {
  1334.     return
  1335.     }
  1336.     foreach entry $entries {
  1337.         keylget entry instance tag 
  1338.     keylget entry attrList attrList
  1339.     keylget attrList options options
  1340.     keylset userOpts $tag $options
  1341.     }
  1342.     return $userOpts
  1343. } ;# init_user_opts
  1344. proc OptionsSelectUnusedOptCB { cbs } {
  1345.     keylget cbs dialog dialog 
  1346.     set un_lst  [VxGetVar $dialog un_lst]
  1347.     set cf_lst  [VxGetVar $dialog cf_lst]
  1348.     set add_pb  [VxGetVar $dialog add_pb]
  1349.     set rem_pb  [VxGetVar $dialog rem_pb]
  1350.     set val_pb  [VxGetVar $dialog val_pb]
  1351.     set val     [VxGetVar $dialog desc_txt]
  1352.     set lbl     [VxGetVar $dialog tmp_lbl]
  1353.     set valList [VxGetVar $dialog valList]
  1354.     set selected [lindex [VtDrawnListGetSelectedItem $un_lst -byRecordList] 0]
  1355.     VtSetSensitive $add_pb 1
  1356.     VtSetSensitive $rem_pb 0
  1357.     VtSetSensitive $val_pb 0
  1358.     VtDrawnListDeselectItem $cf_lst -all
  1359.     set opt_type [lindex $selected 2]
  1360.     set opt_id   [lindex $selected 4]
  1361.     set opt_desc [lindex $selected 1]
  1362.     VtSetValues $val -value $opt_desc
  1363.     VtSetValues $lbl -label $opt_type
  1364.     VtDrawnListDeleteItem $valList -all
  1365.     VtUnLock -once
  1366. } ;# OptionsSelectUnusedOptCB
  1367. proc OptionsSelectCfgdOptCB { cbs } {
  1368.     keylget cbs dialog dialog
  1369.     set cf_lst  [VxGetVar $dialog cf_lst]
  1370.     set un_lst  [VxGetVar $dialog un_lst]
  1371.     set add_pb  [VxGetVar $dialog add_pb]
  1372.     set rem_pb  [VxGetVar $dialog rem_pb]
  1373.     set val_pb  [VxGetVar $dialog val_pb]
  1374.     set val     [VxGetVar $dialog desc_txt]
  1375.     set lbl     [VxGetVar $dialog tmp_lbl]
  1376.     set valList [VxGetVar $dialog valList]
  1377.     set postn [VtDrawnListGetSelectedItem $cf_lst -byPositionList]
  1378.     set selected [lindex [VtDrawnListGetSelectedItem $cf_lst -byRecordList] 0]
  1379.     VtSetSensitive $add_pb 0
  1380.     VtSetSensitive $rem_pb 1
  1381.     VtSetSensitive $val_pb 1
  1382.     VtDrawnListDeselectItem $un_lst -all
  1383.     VtDrawnListDeleteItem $valList -all
  1384.     if {[llength $postn] > 0} {
  1385.     set opt_type [lindex $selected 2]
  1386.     set opt_id   [lindex $selected 4]
  1387.     set opt_desc [lindex $selected 1]
  1388.     set opt_val  [lindex $selected 6]
  1389.     VtSetValues $val -value $opt_desc
  1390.     VtSetValues $lbl -label $opt_type
  1391.     switch $opt_type {
  1392.         ip_address {
  1393.         set formatList {{STRING 15}}
  1394.         set rec_list $opt_val
  1395.         }
  1396.         ip_address_pair {
  1397.         set formatList {{STRING 16} {STRING 15}}
  1398.         set addr1 {}
  1399.         foreach addr $opt_val {
  1400.             if {[llength $addr1] == 0} {
  1401.             set addr1 $addr
  1402.             } else {
  1403.             lappend rec_list [list $addr1 $addr]
  1404.             set addr1 {}
  1405.             }
  1406.         }
  1407.         }
  1408.         default {
  1409.         set formatList {{STRING 31}}
  1410.         set rec_list $opt_val
  1411.         }
  1412.     }
  1413.     VtDrawnListAddItem $valList -formatList $formatList \
  1414.          -recordList $rec_list
  1415.     } else {
  1416.     VtSetValues $val -value ""
  1417.     VtSetValues $lbl -label ""
  1418.     }
  1419.     VtUnLock -once
  1420. } ;# OptionsSelectCfgdOptCB
  1421. proc OptionsRemoveCB { cbs } {
  1422.     keylget cbs dialog dialog
  1423.     set cf_lst  [VxGetVar $dialog cf_lst]
  1424.     set un_lst  [VxGetVar $dialog un_lst]
  1425.     set rem_pb  [VxGetVar $dialog rem_pb]
  1426.     set val_pb  [VxGetVar $dialog val_pb]
  1427.     set val     [VxGetVar $dialog desc_txt]
  1428.     set lbl     [VxGetVar $dialog tmp_lbl]
  1429.     set valList [VxGetVar $dialog valList]
  1430.     set cf_items_2_rem [VtDrawnListGetSelectedItem $cf_lst -byRecordList]
  1431.     set cf_items_2_rem_p [VtDrawnListGetSelectedItem $cf_lst -byPositionList]
  1432.     VtDrawnListDeleteItem $cf_lst -positionList $cf_items_2_rem_p
  1433.     set pos [OptionsGetListPosition $un_lst [lindex $cf_items_2_rem 0]]
  1434.     VtDrawnListAddItem $un_lst -recordList $cf_items_2_rem -position $pos 
  1435.     VtSetSensitive  $val_pb 0
  1436.     VtSetSensitive  $rem_pb 0
  1437.     VtSetValues $val -value ""
  1438.     VtSetValues $lbl -label ""
  1439.     VtDrawnListDeleteItem $valList -all
  1440.     VtUnLock
  1441. } ;# OptionsRemoveCB
  1442. proc OptionsSaveCB { optType action cbs } {
  1443.     global Main
  1444.     keylget cbs dialog dialog 
  1445.     set cf_lst  [VxGetVar $dialog cf_lst]
  1446.     set cfgd_options [VtDrawnListGetItem $cf_lst -all]
  1447.     set options {}
  1448.     foreach entry $cfgd_options {
  1449.     set opt [lindex $entry 0]
  1450.     set val [lindex $entry 6]
  1451.     keylset options $opt $val
  1452.     }
  1453.     set parent [VxGetVar $dialog parent]
  1454.     VxSetVar $parent options $options
  1455.     set type [format "dhcp%s" $optType]
  1456.     if {[cequal $optType Global]} {
  1457.     if {[ErrorCatch errStack 0 "MakeCall $type global {} ObjectRemove" \
  1458.         {} SCO_DHCP_ERR_DELETE "global entries"] != 0} {
  1459.         SaDisplayErrorStacks $dialog.err [list $errStack] NOHELP
  1460.         VtUnLock
  1461.         return
  1462.     }
  1463.     keylset attrList options $options
  1464.     if {[ErrorCatch errStack 0 "MakeCall $type global \
  1465.         [list $attrList] ObjectAdd" {} SCO_DHCP_ERR_CREATE \
  1466.         "global parameters"] != 0} {
  1467.         SaDisplayErrorStacks $dialog.err [list $errStack] NOHELP
  1468.         VtUnLock
  1469.         return
  1470.     }
  1471.     browser:DeleteAll
  1472.     foreach opt $options { 
  1473.         set optName [lindex $opt 0]
  1474.         set optVal  [lindex $opt 1]
  1475.         browser:SetDisplayEntry $optName [list $optName "$optVal"] {}
  1476.     }
  1477.         browser:ReDisplay
  1478.         SetMenuSensitivityCB [list [list dialog $Main(Dialog)]]
  1479.     VxEndFormCB $cbs
  1480.     set dialog $Main(Dialog)
  1481.     switch $action {
  1482.         add {
  1483.         set title [IntlLocalizeMsg SCO_DHCP_MSG_ADDED \
  1484.             "\"global options\""]
  1485.         }
  1486.         modify {
  1487.         set title [IntlLocalizeMsg SCO_DHCP_MSG_MODIFIED \
  1488.             [IntlLocalizeMsg SCO_DHCP_MSG_GLOBAL_OPT]]
  1489.         }
  1490.     }
  1491.     VtShow [VtMessageDialog $dialog.added \
  1492.         -ok \
  1493.         -message $title]
  1494.     } else {
  1495.     VxEndFormCB $cbs
  1496.     }
  1497.     VtUnLock
  1498. } ;# OptionsSaveCB
  1499. proc OptionsEditArrayDelCB {cbs} {
  1500.     keylget cbs dialog dialog
  1501.     set valListW [VxGetVar $dialog valListW]
  1502.     set delBtnW       [VxGetVar $dialog del_btn]
  1503.     set position [lindex \
  1504.     [VtDrawnListGetSelectedItem $valListW -byPositionList] 0]
  1505.     VtDrawnListDeleteItem $valListW -position $position
  1506.     set noItems [llength [VtDrawnListGetItem $valListW -all]]
  1507.     if {$noItems > 0} {
  1508.         if {$position > $noItems} {
  1509.             VtDrawnListSelectItem $valListW -position $noItems
  1510.         } else {
  1511.             VtDrawnListSelectItem $valListW -position $position
  1512.         }
  1513.         SaDrawnListShowSelectedItem $valListW
  1514.     }
  1515.     OptionsEditArrayListSensitivityCB [list [list dialog $dialog]]
  1516.     VtUnLock
  1517. } ;# OptionsEditArrayDelCB
  1518. proc OptionsEditArrayAddCB {cbs} {
  1519.     keylget cbs dialog dialog
  1520.     set valueW   [VxGetVar $dialog valueW]
  1521.     set valListW [VxGetVar $dialog valListW]
  1522.     set type     [VxGetVar $dialog opt_type] 
  1523.     switch $type {
  1524.     ip_address {
  1525.         set formatList {{STRING 15}}
  1526.         set val [getIPwidgetValue $valueW]
  1527.     }
  1528.     ip_address_pair {
  1529.         set formatList {{STRING 16} {STRING 15}}
  1530.         set addr1W [VxGetVar $valueW widget1]
  1531.         set addr2W [VxGetVar $valueW widget2]
  1532.         set value1 [getIPwidgetValue $addr1W]
  1533.         set value2 [getIPwidgetValue $addr2W]
  1534.         set val [list $value1 $value2] 
  1535.     }
  1536.     default {
  1537.         set formatList {{STRING 31}}
  1538.         set    val [VtGetValues $valueW -value]
  1539.     }
  1540.     }
  1541.     if {![string length $val]} {
  1542.     VtUnLock
  1543.     return
  1544.     }
  1545.     if {![check_val $type $val 1]} {
  1546.     ErrorPush errStack 0 SCO_DHCP_ERR_BAD_OPTION_VAL
  1547.     SaDisplayErrorStacks $dialog.err [list $errStack] NOHELP
  1548.     VtUnLock
  1549.     return
  1550.     }
  1551.     set valList [VtDrawnListGetItem $valListW -all]
  1552.     set index [lsearch -exact $valList [list $val]]
  1553.     if {$index < 0} {
  1554.     set pos 0
  1555.     VtDrawnListAddItem $valListW -position $pos \
  1556.         -formatList $formatList -fieldList $val
  1557.     } else {
  1558.     set pos [expr $index + 1] 
  1559.     }
  1560.     VtDrawnListSelectItem $valListW -position $pos 
  1561.     SaDrawnListShowSelectedItem $valListW
  1562.     OptionsEditArrayListSensitivityCB [list [list dialog $dialog]]
  1563.     VtUnLock
  1564. } ;# OptionsEditArrayAddCB
  1565. proc OptionsEditArrayValueSensitivityCB {cbs} {
  1566.     keylget cbs dialog dialog
  1567.     set valListW [VxGetVar $dialog valListW]
  1568.     set valueW     [VxGetVar $dialog valueW]
  1569.     set type     [VxGetVar $dialog opt_type] 
  1570.     set addSen 0
  1571.     set delSen 0
  1572.     switch $type {
  1573.     ip_address {
  1574.         set value [getIPwidgetValue $valueW]
  1575.     }
  1576.     ip_address_pair {
  1577.         set addr1W [VxGetVar $valueW widget1]
  1578.         set addr2W [VxGetVar $valueW widget2]
  1579.         set value1 [getIPwidgetValue $addr1W]
  1580.         set value2 [getIPwidgetValue $addr2W]
  1581.         set value "$value1 $value2" 
  1582.     }
  1583.     default {
  1584.         set    value [VtGetValues $valueW -value]
  1585.     }
  1586.     }
  1587.     if {[string length $value]} {
  1588.     set addSen 1
  1589.     VtDrawnListDeselectItem $valListW -all
  1590.     } elseif {[llength [VtDrawnListGetSelectedItem $valListW]]} {
  1591.     set delSen 1
  1592.     }
  1593.     VtSetSensitive [VxGetVar $dialog add_btn] $addSen 
  1594.     VtSetSensitive [VxGetVar $dialog del_btn] $delSen 
  1595.     VtUnLock
  1596. } ;# OptionsEditArrayValueSensitivityCB
  1597. proc OptionsEditArrayListSensitivityCB {cbs} {
  1598.     keylget cbs dialog dialog
  1599.     set valListW [VxGetVar $dialog valListW]
  1600.     set valueW     [VxGetVar $dialog valueW]
  1601.     set type     [VxGetVar $dialog opt_type] 
  1602.     set addSen 0
  1603.     set delSen 0
  1604.     set selected [VtDrawnListGetSelectedItem $valListW -byPositionList]
  1605.     if {$selected == 0} {set selected {}}
  1606.     if {![lempty $selected]} {
  1607.     set delSen 1 
  1608.     switch $type {
  1609.         ip_address {
  1610.         setIPwidgetValue $valueW ""
  1611.         }
  1612.         ip_address_pair {
  1613.         set addr1W [VxGetVar $valueW widget1]
  1614.         set addr2W [VxGetVar $valueW widget2]
  1615.         setIPwidgetValue $addr1W ""
  1616.         setIPwidgetValue $addr2W ""
  1617.         }
  1618.         default {
  1619.         VtSetValues $valueW -value ""
  1620.         }
  1621.     }
  1622.     }
  1623.     VtSetSensitive [VxGetVar $dialog add_btn] $addSen 
  1624.     VtSetSensitive [VxGetVar $dialog del_btn] $delSen 
  1625.     VtUnLock
  1626. } ;# OptionsEditArrayListSensitivityCB
  1627. proc OptionsEditArray { form opt_type value} {
  1628.     set frame [VxGetVar $form info_fr]
  1629.     set elem_lbl [VtLabel $form.elem_lbl \
  1630.     -label [IntlLocalizeMsg SCO_DHCP_MSG_NEW_ELEM] \
  1631.     -leftSide FORM \
  1632.     -topSide $frame]
  1633.     switch $opt_type {
  1634.     ip_address {
  1635.         set formatList {{STRING 15}}
  1636.         set valueW [VtForm $form.valueW \
  1637.         -marginWidth 0 \
  1638.         -marginHeight 0]
  1639.             createIPwidget $valueW "" SCO_DHCP_MSG_VALUE_ip_address_SH \
  1640.         OptionsEditArrayValueSensitivityCB
  1641.         set rec_list $value
  1642.     }
  1643.     ip_address_pair {
  1644.         set formatList {{STRING 16} {STRING 15}}
  1645.         set valueW [SaAlignedForm $form.addrpair [list \
  1646.         [list SCO_DHCP_MSG_BLANK \
  1647.                [list  VtForm \
  1648.             -marginWidth 0 \
  1649.             -marginHeight 0]] \
  1650.         [list SCO_DHCP_MSG_BLANK \
  1651.                [list  VtForm \
  1652.             -marginWidth 0 \
  1653.             -marginHeight 0]] \
  1654.         ]]
  1655.         set addr1W [VxGetVar $valueW widget1]
  1656.         set addr2W [VxGetVar $valueW widget2]
  1657.             createIPwidget $addr1W "" SCO_DHCP_MSG_VALUE_ip_address1_SH \
  1658.         OptionsEditArrayValueSensitivityCB
  1659.             createIPwidget $addr2W "" SCO_DHCP_MSG_VALUE_ip_address2_SH \
  1660.         OptionsEditArrayValueSensitivityCB
  1661.         set rec_list {}
  1662.         set addr1 {}
  1663.         foreach addr $value {
  1664.         if {[llength $addr1] == 0} {
  1665.             set addr1 $addr
  1666.         } else {
  1667.             lappend rec_list [list $addr1 $addr]
  1668.             set addr1 {}
  1669.         }
  1670.         }
  1671.     }
  1672.     default {
  1673.         set formatList {{STRING 31}}
  1674.         set valueW [VtText $form.valueW \
  1675.         -columns 20 \
  1676.         -callback OptionsEditArrayAddCB \
  1677.         -valueChangedCallback \
  1678.             OptionsEditArrayValueSensitivityCB \
  1679.         -autoLock {OptionsEditArrayAddCB \
  1680.             OptionsEditArrayValueSensitivityCB} \
  1681.         -leftSide FORM \
  1682.         -topSide $elem_lbl \
  1683.         -topOffset 0 \
  1684.         -shortHelpCallback SaShortHelpCB \
  1685.         -shortHelpString \
  1686.             [IntlLocalizeMsg SCO_DHCP_MSG_VALUE_${opt_type}_SH]]
  1687.         set rec_list $value
  1688.     }
  1689.     }
  1690.     set but_rc [VtRowColumn $form.buts -packing COLUMN \
  1691.     -CHARM_spacing 1 -leftSide $valueW \
  1692.     -MOTIF_leftOffset 20 -alignTop $valueW -CHARM_topOffset 0]
  1693.     set add_btn [VtPushButton $but_rc.add_btn \
  1694.     -label [IntlLocalizeMsg SCO_DHCP_MSG_ELEM_ADD] \
  1695.     -callback OptionsEditArrayAddCB \
  1696.     -autoLock OptionsEditArrayAddCB \
  1697.     -shortHelpCallback SaShortHelpCB \
  1698.     -shortHelpString [IntlLocalizeMsg SCO_DHCP_MSG_ELEM_ADD_SH]]
  1699.     set del_btn [VtPushButton $but_rc.del_btn \
  1700.     -label " [IntlLocalizeMsg SCO_DHCP_MSG_DELETE] " \
  1701.     -callback OptionsEditArrayDelCB \
  1702.     -autoLock OptionsEditArrayDelCB \
  1703.     -shortHelpCallback SaShortHelpCB \
  1704.     -shortHelpString [IntlLocalizeMsg SCO_DHCP_MSG_ELEM_DEL_SH]]
  1705.     set arr_lbl [VtLabel $form.arr_lbl \
  1706.     -label [IntlLocalizeMsg SCO_DHCP_MSG_ELEM_ARRAY] \
  1707.     -leftSide $but_rc \
  1708.     -MOTIF_leftOffset 20 \
  1709.     -topSide $frame \
  1710.     ]
  1711.     set valListW [VtDrawnList $form.valListW \
  1712.     -rows 7 \
  1713.     -callback OptionsEditArrayListSensitivityCB \
  1714.     -autoLock OptionsEditArrayListSensitivityCB \
  1715.     -selection MULTIPLE \
  1716.     -rightSide FORM \
  1717.     -topSide $arr_lbl \
  1718.     -topOffset 0 \
  1719.     -leftSide $but_rc \
  1720.     -MOTIF_leftOffset 20 \
  1721.     -formatList $formatList \
  1722.     -recordList $rec_list \
  1723.     -shortHelpCallback SaShortHelpCB \
  1724.     -shortHelpString [IntlLocalizeMsg SCO_DHCP_MSG_ELEM_ARRAY_SH] ] 
  1725.     VxSetVar $form valListW $valListW
  1726.     VxSetVar $form valueW $valueW
  1727.     VxSetVar $form add_btn $add_btn
  1728.     VxSetVar $form del_btn $del_btn
  1729.     VtSetFocus $valueW
  1730.     VtSetSensitive $add_btn 0
  1731.     VtSetSensitive $del_btn 0
  1732. } ;# OptionsEditArray
  1733. proc OptionsEditBoolean {form value} {
  1734.     set alform [SaAlignedForm $form.align [list \
  1735.     [list SCO_DHCP_MSG_VALUE \
  1736.         [list  VtRadioBox \
  1737.         -numColumns 2 \
  1738.         -MOTIF_borderWidth 1 ] ] ] ]
  1739.     set bool_rb [VxGetVar $alform widget1]
  1740.     set on_but [VtToggleButton $bool_rb.on \
  1741.     -label [IntlLocalizeMsg SCO_DHCP_MSG_VALUE_YES] \
  1742.     -shortHelpCallback SaShortHelpCB \
  1743.     -shortHelpString [IntlLocalizeMsg SCO_DHCP_MSG_VALUE_YES_SH]]
  1744.     set off_but [VtToggleButton $bool_rb.off \
  1745.     -label [IntlLocalizeMsg SCO_DHCP_MSG_VALUE_NO] \
  1746.     -shortHelpCallback SaShortHelpCB \
  1747.     -shortHelpString [IntlLocalizeMsg SCO_DHCP_MSG_VALUE_NO_SH]]
  1748.     if {[cequal $value true]} {
  1749.     VtSetValues $bool_rb -value $on_but
  1750.     VtSetFocus $on_but
  1751.     } else {
  1752.     VtSetValues $bool_rb -value $off_but
  1753.     VtSetFocus $off_but
  1754.     }
  1755.     VtSetValues $alform -CHARM_topOffset 1 
  1756.     VxSetVar $form valueW $bool_rb 
  1757. } ;# OptionsEditBoolean
  1758. proc OptionsEditIpAddr {form value} {
  1759.     set alform [SaAlignedForm $form.align [list \
  1760.       [list  SCO_DHCP_MSG_VALUE \
  1761.         [list VtForm \
  1762.         -marginWidth 0 \
  1763.         -marginHeight 0 ] ] ] ]
  1764.     set ipAddrW [VxGetVar $alform widget1]
  1765.     createIPwidget $ipAddrW $value SCO_DHCP_MSG_VALUE_ip_address_SH
  1766.     VtSetValues $alform -CHARM_topOffset 1 
  1767.     SaSetFocusList $form [list $ipAddrW [VtGetValues $form -ok]]
  1768.     VtSetFocus $ipAddrW 
  1769.     VxSetVar $form valueW $ipAddrW 
  1770. } ;# OptionsEditIpAddr
  1771. proc OptionsEditbpmh {form value} {
  1772.     set alform [SaAlignedForm $form.align [list \
  1773.     [list  SCO_DHCP_MSG_VALUE \
  1774.         [list  VtRadioBox \
  1775.         -numColumns 2 \
  1776.         -borderWidth 1 ] ] ] ]
  1777.     set nval_rb [VxGetVar $alform widget1]
  1778.     set b [VtToggleButton $nval_rb.b \
  1779.     -label [IntlLocalizeMsg SCO_DHCP_MSG_VALUE_BROADCAST] \
  1780.     -shortHelpCallback SaShortHelpCB \
  1781.     -shortHelpString [IntlLocalizeMsg SCO_DHCP_MSG_VALUE_BROADCAST_SH]]
  1782.     set p [VtToggleButton $nval_rb.p \
  1783.     -label [IntlLocalizeMsg SCO_DHCP_MSG_VALUE_POINT] \
  1784.     -shortHelpCallback SaShortHelpCB \
  1785.     -shortHelpString [IntlLocalizeMsg SCO_DHCP_MSG_VALUE_POINT_SH]]
  1786.     set m [VtToggleButton $nval_rb.m \
  1787.     -label [IntlLocalizeMsg SCO_DHCP_MSG_VALUE_MIXED] \
  1788.     -shortHelpCallback SaShortHelpCB \
  1789.     -shortHelpString [IntlLocalizeMsg SCO_DHCP_MSG_VALUE_MIXED_SH]]
  1790.     set n [VtToggleButton $nval_rb.h \
  1791.     -label [IntlLocalizeMsg SCO_DHCP_MSG_VALUE_NBDD] \
  1792.     -shortHelpCallback SaShortHelpCB \
  1793.     -shortHelpString [IntlLocalizeMsg SCO_DHCP_MSG_VALUE_NBDD_SH]]
  1794.     if {$value == ""} {
  1795.     set value "b"
  1796.     }
  1797.     VtSetValues $alform -CHARM_topOffset 1 
  1798.     VtSetValues $nval_rb.$value -set 1
  1799.     VtSetFocus $nval_rb.$value
  1800.     VxSetVar $form valueW $nval_rb 
  1801. } ;# OptionsEditbpmh
  1802. proc OptionsEditDefault {opt_type form value} {
  1803.     set alform [SaAlignedForm $form.align [list \
  1804.       [list  SCO_DHCP_MSG_VALUE \
  1805.         [list  VtText \
  1806.         -columns 40 \
  1807.         -callback "SaSetFocus next" \
  1808.         -value $value \
  1809.         -shortHelpCallback SaShortHelpCB \
  1810.         -shortHelpString [IntlLocalizeMsg SCO_DHCP_MSG_VALUE_${opt_type}_SH]] \
  1811.     ] ] ]
  1812.     set valueW [VxGetVar $alform widget1]
  1813.     VtSetValues $alform -CHARM_topOffset 1 
  1814.     SaSetFocusList $form [list $valueW [VtGetValues $form -ok]]
  1815.     VtSetFocus $valueW 
  1816.     VxSetVar $form valueW $valueW 
  1817. } ;# OptionsEditDefault
  1818. proc OptionsEditValue { form opt_type value} {
  1819.     switch $opt_type {
  1820.     "boolean" {
  1821.         OptionsEditBoolean $form $value
  1822.     }
  1823.     "bpmh" {
  1824.         OptionsEditbpmh $form $value
  1825.     }
  1826.     "ip_address" {
  1827.         OptionsEditIpAddr $form $value
  1828.     }
  1829.     default {
  1830.         OptionsEditDefault $opt_type $form $value
  1831.     }
  1832.     }
  1833. } ;# OptionsEditValue
  1834. proc UserDefinedOptCheckIntValueCB {widgetName cbs} {
  1835.     keylget cbs dialog dialog
  1836.     set opt_typeW [VxGetVar $dialog opt_type]
  1837.     set opt_type [FindOptType [VtGetValues $opt_typeW -value]]
  1838.     set widget [VxGetVar $dialog $widgetName]
  1839.     set value  [VtGetValues $widget -value]
  1840.     switch $opt_type {
  1841.     int8   - 
  1842.     uint8  - 
  1843.     int16  - 
  1844.     uint16 -
  1845.     int32  - 
  1846.     uint32 {
  1847.         if {![check_val $opt_type $value 0]} then {
  1848.         VtBeep
  1849.         VtSetValues $widget -value ""
  1850.         return
  1851.         }
  1852.     }
  1853.     }
  1854.     VtUnLock
  1855. } ;# UserDefinedOptCheckIntValueCB
  1856. proc CheckInteger {type value final} {
  1857.     global opt_types
  1858.     if {[lsearch [keylkeys opt_types] $type] == -1} {
  1859.     return 0
  1860.     }
  1861.     keylget opt_types $type entry 
  1862.     keylget entry message message
  1863.     keylget entry signed  signed
  1864.     keylget entry min_val min_val
  1865.     keylget entry max_val max_val
  1866.     set u_value $value
  1867.     if {$signed} {
  1868.     set sign [regexp {(-)([0-9]*)} $value t_all t_sign u_value]
  1869.     if {$sign} {
  1870.         if {![llength $u_value]} {
  1871.         return [expr ! $final] 
  1872.         } 
  1873.     } 
  1874.     } else {
  1875.     set sign 0
  1876.     }
  1877.     if {![ctype digit $u_value]} {
  1878.     return 0
  1879.     }
  1880.     set len [string length $u_value]
  1881.     set u_min_val $min_val
  1882.     set min_sign [regexp {(-)([0-9]*)} $min_val t_all t_sign u_min_val]
  1883.     set min_len  [string length $u_min_val]
  1884.     if {$sign} {
  1885.     if {$len > $min_len} {
  1886.         return 0
  1887.     } elseif {$len == $min_len} {
  1888.         if {[string compare $u_value $u_min_val] == 1} {
  1889.         return 0
  1890.         }
  1891.     }
  1892.     }
  1893.     set u_max_val $max_val
  1894.     set max_sign [regexp {(-)([0-9]*)} $max_val t_all t_sign u_max_val]
  1895.     set max_len  [string length $u_max_val]
  1896.     if {!$sign} {
  1897.         if {$len > $max_len} {
  1898.         return 0
  1899.     } elseif {$len == $max_len} {
  1900.         if {[string compare $u_value $u_max_val] == 1} {
  1901.         return 0
  1902.         }
  1903.     }
  1904.     }
  1905.     return 1
  1906. } ;# CheckInteger
  1907. proc check_val {opt_type val final} {
  1908.     set valid 0
  1909.     switch $opt_type {
  1910.     int8   - 
  1911.     uint8  - 
  1912.     int16  - 
  1913.     uint16 -
  1914.     int32  - 
  1915.     uint32 {
  1916.         set valid [CheckInteger $opt_type $val $final]
  1917.     }
  1918.      ip_address { 
  1919.         set valid [checkIPaddr $val]
  1920.     }
  1921.     ip_address_pair {
  1922.         if {[llength $val] == 2} {
  1923.          set addr1 [lindex $val 0]
  1924.          set addr2 [lindex $val 1]
  1925.         if {[checkIPaddr $addr1]} {
  1926.             set valid [checkIPaddr $addr2]
  1927.         }
  1928.         }    
  1929.     }
  1930.     boolean {
  1931.         set valid [expr {[cequal $val true] || [cequal $val false]}]
  1932.     }
  1933.     default    { # don't care, or already covered 
  1934.         set valid 1
  1935.     }
  1936.     }
  1937.     return $valid
  1938. }
  1939. proc CompareValues {opt_type max min} {
  1940.     switch $opt_type {
  1941.     int8    -
  1942.     uint8    -
  1943.     int16    -
  1944.     uint16    -
  1945.     int32 {
  1946.         set cmp [expr $max > $min]
  1947.     }
  1948.     uint32 {
  1949.         set max_len [string length $max]
  1950.         set min_len [string length $min]
  1951.         if {$min_len > $max_len} {
  1952.          set cmp 0
  1953.         } elseif {$max_len > $min_len} {
  1954.         set cmp 1
  1955.         } else {
  1956.         if {[string compare $min $max] == 1} {
  1957.             set cmp 1
  1958.         } else {
  1959.             set cmp 0
  1960.         }
  1961.         }
  1962.     }
  1963.     default {
  1964.         set cmp 1
  1965.     }
  1966.     }
  1967.     return $cmp
  1968. } ;# CompareValues
  1969. proc OptionsGetListPosition {listW opt} {
  1970.     set id [lindex $opt 4]
  1971.     set pos 1
  1972.     if {$id != "-"} {
  1973.     set list [VtDrawnListGetItem $listW -all]
  1974.     lappend list $opt
  1975.     set list [lsort -command CompareID $list]
  1976.     foreach option $list {
  1977.         set tid [lindex $option 4]
  1978.         if {$id == $tid} {
  1979.         break
  1980.         }
  1981.         incr pos
  1982.     }
  1983.     }
  1984.     return $pos
  1985. } ;# OptionsGetListPosition
  1986. proc OptionsEditSaveCB { type cbs } {
  1987.     keylget cbs dialog dialog
  1988.     set parent  [VxGetVar $dialog parent]
  1989.     set cf_lst [VxGetVar $parent cf_lst]
  1990.     switch $type {
  1991.     add {
  1992.         set list [VxGetVar $parent un_lst]
  1993.     }
  1994.     modify {
  1995.         set list $cf_lst
  1996.     }
  1997.     default {
  1998.         VtUnLock
  1999.         return
  2000.     }
  2001.     }
  2002.     set selectedOpt [lindex [VtDrawnListGetSelectedItem $list \
  2003.                         -byRecordList] 0]
  2004.     set selectedOptPos [lindex [VtDrawnListGetSelectedItem $list \
  2005.                         -byPositionList] 0]
  2006.     set opt_type [lindex $selectedOpt 2]
  2007.     set arr_type [lindex $selectedOpt 3]
  2008.     set optId     [lindex $selectedOpt 4]
  2009.     if {$arr_type} {
  2010.         set valListW [VxGetVar $dialog valListW]
  2011.     set valList  [VtDrawnListGetItem $valListW -all]
  2012.     if {![llength $valList]} {
  2013.         ErrorPush errStack 0 SCO_DHCP_ERR_NO_VALUE
  2014.         SaDisplayErrorStacks $dialog.err [list $errStack] NOHELP
  2015.         VtUnLock
  2016.         return
  2017.     }
  2018.     switch $opt_type {
  2019.         "ip_address_pair" {
  2020.         set val [join $valList]
  2021.         }    
  2022.         default {
  2023.         set val $valList
  2024.         }
  2025.     }
  2026.     } else {
  2027.         set valueW   [VxGetVar $dialog valueW]
  2028.     switch $opt_type {
  2029.         "boolean" { 
  2030.         set val [VtGetValues $valueW -value]
  2031.         if {[cequal [VxGetShortName $val] on]} {
  2032.             set val true 
  2033.         } else {
  2034.             set val false 
  2035.         }
  2036.         }
  2037.         "ip_address" {
  2038.             set val [getIPwidgetValue $valueW]
  2039.         }
  2040.         "bpmh" { 
  2041.         set val [VxGetShortName [VtGetValues $valueW -value]] 
  2042.         }
  2043.         default { 
  2044.         set val [VtGetValues $valueW -value]
  2045.         }
  2046.     }
  2047.     if {![string length $val]} {
  2048.         ErrorPush errStack 0 SCO_DHCP_ERR_NO_VALUE
  2049.         SaDisplayErrorStacks $dialog.err [list $errStack] NOHELP
  2050.         VtUnLock
  2051.         return
  2052.     }
  2053.     if {![check_val $opt_type $val 1]} {
  2054.         ErrorPush errStack 0 SCO_DHCP_ERR_BAD_OPTION_VAL
  2055.         SaDisplayErrorStacks $dialog.err [list $errStack] NOHELP
  2056.         VtUnLock
  2057.         return
  2058.     }
  2059.     }
  2060.     VtDrawnListDeleteItem $list -position $selectedOptPos
  2061.     if {[cequal $type add]} {
  2062.     lappend selectedOpt $val
  2063.     set selectedOptPos [OptionsGetListPosition $cf_lst $selectedOpt]
  2064.     } else {
  2065.     set selectedOpt [lreplace $selectedOpt 6 6 $val]
  2066.     }
  2067.     VtDrawnListAddItem $cf_lst -position $selectedOptPos -fieldList $selectedOpt
  2068.     VtDrawnListSelectItem $cf_lst -position $selectedOptPos
  2069.     SaDrawnListShowSelectedItem $cf_lst
  2070.     OptionsSelectCfgdOptCB [list [list dialog $parent]]
  2071.     VxEndFormCB $cbs
  2072. } ;# OptionsEditSaveCB
  2073. proc OptionsEditCB { type  cbs } {
  2074.     set dialog [keylget cbs dialog]
  2075.     switch $type {
  2076.     add {
  2077.         set list [VxGetVar $dialog un_lst]
  2078.     }
  2079.     modify {
  2080.         set list [VxGetVar $dialog cf_lst]
  2081.     }
  2082.     default {
  2083.         VtUnLock
  2084.         return
  2085.     }
  2086.     }
  2087.     set selected [VtDrawnListGetSelectedItem $list -byRecordList]
  2088.     if {[llength $selected] == 0} {
  2089.     ErrorPush errStack 0 SCO_DHCP_ERR_NO_ITEMS_SELECTED
  2090.     SaDisplayErrorStacks $dialog.err [list $errStack] NOHELP
  2091.     VtUnLock
  2092.     return
  2093.     } elseif {[llength $selected] > 1} {
  2094.     ErrorPush errStack 0 SCO_DHCP_ERR_SELECT_ONE
  2095.     SaDisplayErrorStacks $dialog.err [list $errStack] NOHELP
  2096.     VtUnLock
  2097.     return
  2098.     } 
  2099.     set selectedOpt [lindex $selected 0]
  2100.     set opt_type [lindex $selectedOpt 2]
  2101.     set arr_type [lindex $selectedOpt 3]
  2102.     set opt_id   [lindex $selectedOpt 4]
  2103.     set opt_desc [lindex $selectedOpt 5]
  2104.     set opt_val  [lindex $selectedOpt 6]
  2105.     set form [VtFormDialog $dialog.form \
  2106.     -title [IntlLocalizeMsg SCO_DHCP_MSG_OPT_EDIT_TITLE] \
  2107.     -help \
  2108.     -resizable 0 \
  2109.     -cancelButton CANCEL \
  2110.     -autoLock OptionsEditSaveCB \
  2111.     -okCallback "OptionsEditSaveCB $type" \
  2112.     -cancelCallback VxEndFormCB \
  2113.     ]
  2114.     set info_fr [VtFrame $form.info_fr \
  2115.     -title [IntlLocalizeMsg SCO_DHCP_MSG_OPT_INFO] \
  2116.     -leftSide FORM \
  2117.     -rightSide FORM ]
  2118.     set info_form [VtForm $info_fr.form]
  2119.     set alform [SaAlignedForm $info_form.align [list \
  2120.     [list SCO_DHCP_MSG_DESC \
  2121.         [list  VtLabel -labelLeft -font medNormalFont \
  2122.         -label "$opt_desc" ] \
  2123.     ] \
  2124.     [list SCO_DHCP_MSG_OPT_ID \
  2125.         [list VtLabel -labelLeft -font medNormalFont \
  2126.         -label "$opt_id" ] \
  2127.     ] \
  2128.     [list SCO_DHCP_MSG_TYPE \
  2129.         [list VtLabel -labelLeft -font medNormalFont \
  2130.         -label " " ] \
  2131.     ]]]
  2132.     VxSetVar $form parent  $dialog
  2133.     VxSetVar $form info_fr $info_fr
  2134.     VxSetVar $form opt_lbl [VxGetVar $alform widget3]
  2135.     VxSetVar $form opt_type $opt_type
  2136.     switch $opt_type {
  2137.     "string"    -
  2138.      "boolean"    -
  2139.      "binary"    -
  2140.      "int8"        -
  2141.      "uint8"        -
  2142.      "int16"        -
  2143.      "uint16"    -
  2144.      "int32"        -
  2145.      "uint32"    -
  2146.      "ip_address"    -
  2147.     "ip_address_pair" { set opt_lbl \
  2148.                 [IntlLocalizeMsg SCO_DHCP_MSG_TYPE_$opt_type] }
  2149.      "bpmh"    { set opt_lbl [IntlLocalizeMsg SCO_DHCP_MSG_TYPE_bpmh] }
  2150.     default        { set opt_lbl "ERROR" }
  2151.     }
  2152.     VtSetValues [VxGetVar $alform widget3] -label "$opt_lbl"
  2153.     if {$arr_type} {
  2154.     OptionsEditArray $form $opt_type $opt_val
  2155.     } else {
  2156.     OptionsEditValue $form $opt_type $opt_val
  2157.     }
  2158.     set sep [VtSeparator $form.sep1 -horizontal \
  2159.            -leftSide FORM -rightSide FORM \
  2160.     -CHARM_topOffset 1 \
  2161.            -MOTIF_leftOffset -5 -MOTIF_rightOffset -5 ]
  2162.     set status [SaStatusBar $form.status 0 ]
  2163.     VtSetValues $sep -bottomSide $status -bottomOffset 0
  2164.     VtShow $form
  2165.     VtUnLock
  2166. } ;# OptionsEditCB
  2167. proc CompareID {element1 element2} {
  2168.         set value1 [lindex $element1 4]
  2169.     if {$value1 == "-"} {set value1 -1}
  2170.         set value2 [lindex $element2 4]
  2171.     if {$value2 == "-"} {set value2 -1}
  2172.         if {$value1 == $value2} {
  2173.                return 0
  2174.         } elseif {$value1 < $value2} {
  2175.                return -1
  2176.         } else {
  2177.                return 1
  2178.         }
  2179. }
  2180. proc OptionsGetGeneralList {entry} {
  2181.     if {[keylget entry comment {}]} {
  2182.     keyldel entry comment
  2183.     }
  2184.     if {[keylget entry mask {}]} {
  2185.     keyldel entry mask
  2186.     }
  2187.     if {[keylget entry pool {}]} {
  2188.     keyldel entry pool
  2189.     }
  2190.     if {[keylget entry lease_dflt {}]} {
  2191.     keyldel entry lease_dflt
  2192.     }
  2193.     if {[keylget entry lease_max {}]} {
  2194.     keyldel entry lease_max
  2195.     }
  2196.     if {[keylget entry t1 {}]} {
  2197.     keyldel entry t1
  2198.     }
  2199.     if {[keylget entry t2 {}]} {
  2200.     keyldel entry t2
  2201.     }
  2202.     if {[keylget entry ip_address {}]} {
  2203.     keyldel entry ip_address
  2204.     }
  2205.     if {[keylget entry identifier_type {}]} {
  2206.     keyldel entry identifier_type 
  2207.     }
  2208.     return $entry
  2209. } ;# OptionsGetGeneralList
  2210. proc OptionsGetLists {dialog options_var unused_list_var cfgd_list_var} {
  2211.     upvar $options_var options
  2212.     upvar $unused_list_var unused_list
  2213.     upvar $cfgd_list_var cfgd_list
  2214.     if {[ErrorCatch errStack 0 "init_global_opts" globalOpts] != 0} {
  2215.     SaDisplayErrorStacks $dialog.err [list $errStack] NOHELP
  2216.     VtUnLock
  2217.     return -1 
  2218.     }
  2219.     if {[ErrorCatch errStack 0 "init_user_opts" userOpts] != 0} {
  2220.     SaDisplayErrorStacks $dialog.err [list $errStack] NOHELP
  2221.     VtUnLock
  2222.     return -1 
  2223.     }
  2224.     set unused_list {}
  2225.     set cfgd_list {}
  2226.     set cfgd_code {}
  2227.     if [info exists options] {
  2228.     set cfgd [keylkeys options]
  2229.     } else {
  2230.     set cfgd {}
  2231.     }
  2232.     foreach key $cfgd {
  2233.     if {[regexp {option([0-9]*)} $key t_all code]} {
  2234.         lappend cfgd_code $code
  2235.     } else {
  2236.         lappend cfgd_code $key
  2237.     }
  2238.     }
  2239.     set globalKeys [keylkeys globalOpts]
  2240.     set userKeys   [keylkeys userOpts]
  2241.     set all "$globalKeys $userKeys"
  2242.     set results [intersect3 $all $cfgd_code]
  2243.     set unused [lindex $results 0]
  2244.     foreach opt $unused {
  2245.     if {[keylget globalOpts $opt entry]} {
  2246.         set name $opt
  2247.         if {![keylget entry code code]} {
  2248.         set code -
  2249.         }
  2250.     } elseif {[keylget userOpts $opt entry]} {
  2251.         if {![keylget entry name name]} {
  2252.         set name -
  2253.         } 
  2254.         set code $opt
  2255.     } else {
  2256.         continue
  2257.     }
  2258.     if {![keylget entry comment comment]} {
  2259.         set comment {}
  2260.     }
  2261.     if {![keylget entry type type]} {
  2262.         set type {}
  2263.     } else {
  2264.         if {[llength $type] == 2} {
  2265.         if {[cequal array [lindex $type 1]]} {
  2266.             set array 1
  2267.         } else {
  2268.             set array 0
  2269.         }
  2270.         lvarpop type end
  2271.         }
  2272.     }
  2273.     if {![keylget entry array array]} {
  2274.         if {![info exists array]} {
  2275.         set array 0
  2276.         }
  2277.     }
  2278.     lappend unused_list "$name [list $comment] $type $array $code \"$name\""
  2279.     }
  2280.     unset array
  2281.     foreach opt $cfgd_code {
  2282.     if {[keylget globalOpts $opt entry]} {
  2283.         set name $opt
  2284.         if {![keylget entry code code]} {
  2285.         set code -
  2286.         } 
  2287.     } elseif {[keylget userOpts $opt entry]} {
  2288.         if {![keylget entry name name]} { 
  2289.         set name -
  2290.         }
  2291.         set code $opt
  2292.     } else {
  2293.         continue
  2294.     }
  2295.     if {![keylget entry comment comment]} {
  2296.         set comment {}
  2297.     }
  2298.     if {![keylget entry type type]} {
  2299.         set type {}
  2300.     } else {
  2301.         if {[llength $type] == 2} {
  2302.         if {[cequal array [lindex $type 1]]} {
  2303.             set array 1
  2304.         } else {
  2305.             set array 0
  2306.         }
  2307.         lvarpop type end
  2308.         }
  2309.     }
  2310.     if {![keylget entry array array]} {
  2311.         if {![info exists array]} {
  2312.         set array 0
  2313.         }
  2314.     }
  2315.         set real_opt [lindex $cfgd [lsearch $cfgd_code $opt]]
  2316.     lappend cfgd_list "$name [list $comment] $type $array $code \
  2317.         \"$name\" [list [keylget options $real_opt]]"
  2318.     }
  2319.     set unused_list [lsort -command CompareID $unused_list]
  2320.     set cfgd_list   [lsort -command CompareID $cfgd_list]
  2321.     return 0
  2322. } ;# OptionsGetLists
  2323. proc OptionsBuild {form unused_options_list cfgd_options_list} {
  2324.     set un_lbl [VtLabel $form.un_lbl \
  2325.     -label [IntlLocalizeMsg SCO_DHCP_MSG_OPT_UNUSED] ]
  2326.     set un_lst [VtDrawnList $form.un_lst \
  2327.     -rows 5 \
  2328.     -columns 23 \
  2329.     -horizontalScrollBar TRUE \
  2330.     -callback OptionsSelectUnusedOptCB \
  2331.     -defaultCallback "OptionsEditCB add"  \
  2332.     -autoLock {OptionsSelectUnusedOptCB OptionsEditCB} \
  2333.     -selection BROWSE \
  2334.     -autoSelect 1 \
  2335.     -topSide $un_lbl \
  2336.     -topOffset 0 \
  2337.     -bottomSide NONE \
  2338.     -formatList {{DATA} {DATA} {DATA} {DATA} {STRING 3} {STRING 75}} \
  2339.     -recordList $unused_options_list \
  2340.     -rightSide NONE -leftSide FORM \
  2341.     -shortHelpCallback SaShortHelpCB \
  2342.     -shortHelpString [IntlLocalizeMsg SCO_DHCP_MSG_OPT_UNUSED_SH]] 
  2343.     set but_rc [VtRowColumn $form.buts -packing COLUMN \
  2344.     -CHARM_spacing 1 -leftSide $un_lst \
  2345.     -MOTIF_leftOffset 20 -alignTop $un_lst -CHARM_topOffset 1]
  2346.     set add_pb [VtPushButton $but_rc.add_pb \
  2347.     -label [IntlLocalizeMsg SCO_DHCP_MSG_OPT_ADD] \
  2348.     -labelCenter \
  2349.     -callback "OptionsEditCB add" \
  2350.     -autoLock OptionsEditCB \
  2351.     -shortHelpCallback SaShortHelpCB \
  2352.     -shortHelpString [IntlLocalizeMsg SCO_DHCP_MSG_OPT_ADD_SH]]
  2353.     set rem_pb [VtPushButton $but_rc.rem_pb \
  2354.     -label [IntlLocalizeMsg SCO_DHCP_MSG_OPT_REMOVE] \
  2355.     -labelCenter \
  2356.     -callback OptionsRemoveCB \
  2357.     -autoLock OptionsRemoveCB \
  2358.     -shortHelpCallback SaShortHelpCB \
  2359.     -shortHelpString [IntlLocalizeMsg SCO_DHCP_MSG_OPT_REMOVE_SH]]
  2360.     set val_pb [VtPushButton $but_rc.val_pb \
  2361.     -label [IntlLocalizeMsg SCO_DHCP_MSG_OPT_EDIT] \
  2362.     -labelCenter \
  2363.     -callback "OptionsEditCB modify" \
  2364.     -autoLock OptionsEditCB \
  2365.     -shortHelpCallback SaShortHelpCB \
  2366.     -shortHelpString [IntlLocalizeMsg SCO_DHCP_MSG_OPT_EDIT_SH]]
  2367.     set cf_lbl [VtLabel $form.cf_lbl \
  2368.     -label [IntlLocalizeMsg SCO_DHCP_MSG_OPT_CONFIG] \
  2369.     -MOTIF_leftOffset 20 \
  2370.     -leftSide $but_rc -alignTop $un_lbl ]
  2371.     set cf_lst [VtDrawnList $form.cf_lst \
  2372.     -rows 5 \
  2373.     -columns 23 \
  2374.     -horizontalScrollBar TRUE \
  2375.     -formatList {{DATA} {DATA} {DATA} {DATA} {STRING 3} {STRING 75} \
  2376.         {DATA}} \
  2377.     -recordList $cfgd_options_list \
  2378.     -callback OptionsSelectCfgdOptCB \
  2379.     -defaultCallback "OptionsEditCB modify" \
  2380.     -autoLock {OptionsSelectCfgdOptCB OptionsEditCB} \
  2381.     -MOTIF_leftOffset 20 \
  2382.     -selection MULTIPLE \
  2383.     -topSide $cf_lbl \
  2384.     -topOffset 0 \
  2385.     -bottomSide NONE \
  2386.     -alignLeft $cf_lbl \
  2387.     -rightSide FORM -bottomSide NONE -leftSide $rem_pb \
  2388.     -shortHelpCallback SaShortHelpCB \
  2389.     -shortHelpString [IntlLocalizeMsg SCO_DHCP_MSG_OPT_CONFIG_SH]]
  2390.     set alform [SaAlignedForm $form.align [list \
  2391.     [list SCO_DHCP_MSG_DESC \
  2392.         [list VtText \
  2393.         -readOnly \
  2394.         -shortHelpCallback SaShortHelpCB \
  2395.         -shortHelpString [IntlLocalizeMsg SCO_DHCP_MSG_OPT_DESC_SH] ] \
  2396.         ] \
  2397.         [list SCO_DHCP_MSG_OPT_VALUE \
  2398.         [list VtLabel -label "-" -labelLeft -font medNormalFont]\
  2399.         ] \
  2400.         [list SCO_DHCP_MSG_BLANK \
  2401.         [list  VtDrawnList \
  2402.             -columns 15 \
  2403.             -rows 2 \
  2404.             -shortHelpCallback SaShortHelpCB \
  2405.             -shortHelpString [IntlLocalizeMsg SCO_DHCP_MSG_OPT_VALUE_SH] ] \
  2406.     ]]]
  2407.     VtSetValues $alform -topSide $un_lst -MOTIF_topOffset 20 \
  2408.     -CHARM_topOffset 1 -leftSide FORM -rightSide FORM
  2409.     VtSetValues [VxGetVar $alform form2] -CHARM_topOffset 1
  2410.     set sep [VtSeparator $form.sep1 -horizontal \
  2411.        -leftSide FORM -rightSide FORM \
  2412.     -MOTIF_leftOffset -5 -MOTIF_rightOffset -5 \
  2413.     -topSide $alform]
  2414.     set status [SaStatusBar $form.status 0 ]
  2415.     VtSetValues $sep -bottomSide $status -bottomOffset 0
  2416.     VtSetValues $alform -rightSide FORM
  2417.     VtSetSensitive $add_pb 0
  2418.     VtSetSensitive $rem_pb 0
  2419.     VtSetSensitive $val_pb 0
  2420.     VxSetVar $form optionsDlog $form
  2421.     VxSetVar $form cf_lst $cf_lst
  2422.     VxSetVar $form desc_txt [VxGetVar $alform widget1]
  2423.     VxSetVar $form tmp_lbl [VxGetVar $alform widget2]
  2424.     VxSetVar $form val_pb $val_pb
  2425.     VxSetVar $form rem_pb $rem_pb
  2426.     VxSetVar $form add_pb $add_pb
  2427.     VxSetVar $form valList [VxGetVar $alform widget3]
  2428.     VxSetVar $form un_lst $un_lst
  2429. } ;# OptionsBuild
  2430. proc OptionsDefineCB { optType action cbs } {
  2431.     keylget cbs dialog dialog
  2432.     set selPos 0
  2433.     switch $optType {
  2434.     Subnet {
  2435.         set lbl SCO_DHCP_MSG_OPT_SUBNET
  2436.         set options [VxGetVar $dialog options]
  2437.     }
  2438.     Client {
  2439.         set lbl SCO_DHCP_MSG_OPT_CLIENT
  2440.         set options [VxGetVar $dialog options]
  2441.     }
  2442.     UserClass {
  2443.         set lbl SCO_DHCP_MSG_OPT_USER
  2444.         set options [VxGetVar $dialog options]
  2445.     }
  2446.     VendorClass {
  2447.         set lbl SCO_DHCP_MSG_OPT_VENDOR
  2448.         set options [VxGetVar $dialog options]
  2449.     }
  2450.     Global {
  2451.         set lbl SCO_DHCP_MSG_OPT_GLOBAL
  2452.         set options [browser:GetParentDrawnList]
  2453.         if {[cequal $action modify]} {
  2454.         set selPos [browser:GetSelectedItemPos]
  2455.         }
  2456.     }
  2457.     default {
  2458.         VtUnLock
  2459.         return
  2460.     }
  2461.     }
  2462.     if {[OptionsGetLists $dialog options unused_options_list \
  2463.     cfgd_options_list] < 0} {
  2464.     return
  2465.     }
  2466.     set form [VtFormDialog $dialog.optionsDlog \
  2467.     -title [IntlLocalizeMsg SCO_DHCP_MSG_OPT_TITLE \
  2468.             [IntlLocalizeMsg $lbl]] \
  2469.     -cancelButton CANCEL \
  2470.     -help \
  2471.     -okCallback "OptionsSaveCB $optType $action" \
  2472.     -autoLock OptionsSaveCB \
  2473.     -cancelCallback VxEndFormCB \
  2474.     ]
  2475.     OptionsBuild $form $unused_options_list $cfgd_options_list
  2476.     VxSetVar $form parent $dialog
  2477.     if {$selPos} {
  2478.     set cf_lst [VxGetVar $form cf_lst]
  2479.     VtDrawnListSelectItem $cf_lst -position $selPos 
  2480.     SaDrawnListShowSelectedItem $cf_lst
  2481.     OptionsSelectCfgdOptCB [list [list dialog $form]]
  2482.     VtSetFocus $cf_lst
  2483.     } else {
  2484.     set un_lst [VxGetVar $form un_lst]
  2485.     VtDrawnListSelectItem $un_lst -position 1
  2486.     SaDrawnListShowSelectedItem $un_lst
  2487.     OptionsSelectUnusedOptCB [list [list dialog $form]]
  2488.     VtSetFocus $un_lst
  2489.     }
  2490.     VtShow $form
  2491.     VtUnLock
  2492. } ;# OptionsDefineCB
  2493. proc UserDefinedOptGetFreeOpt {keys} {
  2494.     global UserOpt
  2495.     for {set i $UserOpt(start)} {$i <= $UserOpt(end)} {incr i} {
  2496.     if {[lsearch $keys $i] == -1} {
  2497.         break
  2498.     }
  2499.     }
  2500.     if {$i > $UserOpt(end)} {
  2501.     set i 0
  2502.     }
  2503.     return $i
  2504. } ;# UserDefinedOptGetFreeOpt
  2505. proc UserDefinedOptSelectTypeCB {cbs} {
  2506.     global opt_types
  2507.     keylget cbs dialog dialog
  2508.     keylget cbs value message
  2509.     set idW        [VxGetVar $dialog idW ]
  2510.     set opt_type   [VxGetVar $dialog opt_type ]
  2511.     set opt_arr    [VxGetVar $dialog opt_arr ]
  2512.     set intMinForm [VxGetVar $dialog intMinForm ]
  2513.     set intMaxForm [VxGetVar $dialog intMaxForm ]
  2514.     set strMinForm [VxGetVar $dialog strMinForm ]
  2515.     set strMaxForm [VxGetVar $dialog strMaxForm ]
  2516.     set int_min    [VxGetVar $dialog int_min ]
  2517.     set int_max    [VxGetVar $dialog int_max ]
  2518.     set str_min    [VxGetVar $dialog str_min ]
  2519.     set str_max    [VxGetVar $dialog str_max ]
  2520.     set code    [VtGet $idW -value]
  2521.     set message [VtGet $opt_type -value]
  2522.     set type [FindOptType $message]
  2523.     keylget opt_types $type entry 
  2524.     set userOpts [browser:GetParentDrawnList]
  2525.     set array 0
  2526.     if {[lsearch [keylkeys userOpts] $code] != -1} {
  2527.     set conf_entry [browser:GetChildren $code]
  2528.     if {[keylget conf_entry type conf_type]} {
  2529.         if {[llength $conf_type] == 2} {
  2530.         set conf_array [cequal [lindex $conf_type 1] array]
  2531.         lvarpop conf_type end
  2532.         }
  2533.         if {[cequal $type $conf_type]} {
  2534.         if {[info exists conf_array]} {
  2535.             set array $conf_array
  2536.         }
  2537.         set entry $conf_entry
  2538.         }
  2539.     }    
  2540.     }
  2541.     VtSet $opt_arr -value $array
  2542.     if {![keylget entry min_val intMinValue]} {
  2543.     set intMinValue "" 
  2544.     }
  2545.     if {![keylget entry max_val intMaxValue]} {
  2546.     set intMaxValue "" 
  2547.     }
  2548.     if {![keylget entry min_length strMinValue]} {
  2549.     set strMinValue "" 
  2550.     }
  2551.     if {![keylget entry max_length strMaxValue]} {
  2552.     set strMaxValue "" 
  2553.     }
  2554.     VtSet $int_min -value $intMinValue
  2555.     VtSet $int_max -value $intMaxValue
  2556.     VtSet $str_min -value $strMinValue
  2557.     VtSet $str_max -value $strMaxValue
  2558.     UserDefinedOptSensitivityCB [list [list dialog $dialog]]
  2559.     VtUnLock
  2560. } ;# UserDefinedOptSelectTypeCB
  2561. proc UserDefinedOptSensitivityCB {cbs} {
  2562.     global opt_types
  2563.     keylget cbs dialog dialog
  2564.     set opt_type   [VxGetVar $dialog opt_type ]
  2565.     set opt_arr    [VxGetVar $dialog opt_arr ]
  2566.     set intMinForm [VxGetVar $dialog intMinForm ]
  2567.     set intMaxForm [VxGetVar $dialog intMaxForm ]
  2568.     set strMinForm [VxGetVar $dialog strMinForm ]
  2569.     set strMaxForm [VxGetVar $dialog strMaxForm ]
  2570.     set message [VtGet $opt_type -value]
  2571.     set type [FindOptType $message]
  2572.     set array [VtGet $opt_arr -value]
  2573.     switch $type {
  2574.     int8   -
  2575.     uint8  -
  2576.     int16  -
  2577.     uint16 -
  2578.     int32  -
  2579.     uint32 {
  2580.         set intMinSen 1
  2581.         set intMaxSen 1
  2582.         set strMinSen $array 
  2583.         set strMaxSen $array 
  2584.         set arrSen 1
  2585.     }
  2586.     string -
  2587.     binary {
  2588.         set intMinSen 0
  2589.         set intMaxSen 0
  2590.         set strMinSen 1
  2591.         set strMaxSen 1
  2592.         set arrSen 0
  2593.     }
  2594.     boolean -
  2595.     ip_address { 
  2596.         set intMinSen 0
  2597.         set intMaxSen 0
  2598.         set strMinSen $array 
  2599.         set strMaxSen $array 
  2600.         set arrSen 1
  2601.     }
  2602.     }
  2603.     VtSet $intMinForm -sensitive $intMinSen 
  2604.     VtSet $intMaxForm -sensitive $intMaxSen 
  2605.     VtSet $strMinForm -sensitive $strMinSen 
  2606.     VtSet $strMaxForm -sensitive $strMaxSen
  2607.     VtSet $opt_arr    -sensitive $arrSen
  2608.     VtUnLock
  2609. } ;# UserDefinedOptSensitivityCB
  2610. proc UserDefinedOptSave {action cbs} {
  2611.     global Main
  2612.     keylget cbs dialog dialog
  2613.     set idW      [VxGetVar $dialog idW]
  2614.     set nameW    [VxGetVar $dialog nameW]
  2615.     set commentW [VxGetVar $dialog commentW]
  2616.     set opt_type [VxGetVar $dialog opt_type]
  2617.     set opt_arr  [VxGetVar $dialog opt_arr]
  2618.     set int_minW [VxGetVar $dialog int_min]
  2619.     set int_maxW [VxGetVar $dialog int_max]
  2620.     set str_minW [VxGetVar $dialog str_min]
  2621.     set str_maxW [VxGetVar $dialog str_max]
  2622.     set tag   [VtGetValues $idW   -value]    
  2623.     set name [VtGetValues $nameW -value]    
  2624.     keylset opts name $name
  2625.     if {![string length $name]} {
  2626.     ErrorPush errStack 0 SCO_DHCP_ERR_NO_NAME
  2627.     SaDisplayErrorStacks $dialog.err [list $errStack] NOHELP
  2628.     VtUnLock
  2629.     return
  2630.     }
  2631.     set userOpts [browser:GetParentDrawnList]
  2632.     if {[lsearch [keylkeys userOpts] $tag] == -1} {
  2633.     set action add
  2634.     if {[ErrorCatch errStack 0 "init_global_opts" globalOpts] != 0} {
  2635.         SaDisplayErrorStacks $dialog.err [list $errStack] NOHELP
  2636.         VtUnLock
  2637.         return -1 
  2638.     }
  2639.     if {[lsearch [keylkeys globalOpts] $tag] != -1} {
  2640.         ErrorPush errStack 0 SCO_DHCP_ERR_BAD_IDENT "$tag"
  2641.         SaDisplayErrorStacks $dialog.err [list $errStack] NOHELP
  2642.         VtUnLock
  2643.         return
  2644.     }
  2645.     } else {
  2646.     set action modify
  2647.     }
  2648.     set comment [VtGetValues $commentW -value]    
  2649.     if {[string length $comment]} {
  2650.     keylset opts comment $comment
  2651.     }
  2652.     set type [FindOptType [VtGetValues $opt_type -value]]
  2653.     if {![string length $type]} {
  2654.     ErrorPush errStack 0 SCO_DHCP_ERR_NO_TYPE
  2655.     SaDisplayErrorStacks $dialog.err [list $errStack] NOHELP
  2656.     VtUnLock
  2657.     return
  2658.     }
  2659.     set arr  [VtGetValues $opt_arr -set]
  2660.     if {$arr} {
  2661.     keylset opts type "$type array"
  2662.     } else {
  2663.     keylset opts type "$type"
  2664.     }
  2665.     set int_min [VtGetValues $int_minW -value]
  2666.     if {[string length $int_min]} {
  2667.     if {! [check_val $type $int_min 1]} {
  2668.         ErrorPush errStack 0 SCO_DHCP_ERR_MIN_VAL "$int_min"
  2669.         SaDisplayErrorStacks $dialog.err [list $errStack] NOHELP
  2670.         VtUnLock
  2671.         return
  2672.     }
  2673.     keylset opts min_val $int_min
  2674.     }
  2675.     set int_max [VtGetValues $int_maxW -value]
  2676.     if {[string length $int_max]} {
  2677.     if {! [check_val $type $int_max 1]} {
  2678.         ErrorPush errStack 0 SCO_DHCP_ERR_MAX_VAL1 "$int_max"
  2679.         SaDisplayErrorStacks $dialog.err [list $errStack] NOHELP
  2680.         VtUnLock
  2681.         return
  2682.     }
  2683.     if {[string length $int_min] && \
  2684.         ![CompareValues $type $int_max $int_min]} {
  2685.         ErrorPush errStack 0 SCO_DHCP_ERR_MAX_VAL2
  2686.         SaDisplayErrorStacks $dialog.err [list $errStack] NOHELP
  2687.         VtUnLock
  2688.         return
  2689.     }
  2690.     keylset opts max_val $int_max
  2691.     }
  2692.     set str_min [VtGetValues $str_minW -value]
  2693.     if {[string length $str_min]} {
  2694.     if {! [ctype digit $str_min]} {
  2695.         ErrorPush errStack 0 SCO_DHCP_ERR_MIN_LEN "$str_min"
  2696.         SaDisplayErrorStacks $dialog.err [list $errStack] NOHELP
  2697.         VtUnLock
  2698.         return
  2699.     }
  2700.     keylset opts min_length $str_min
  2701.     }
  2702.     set str_max [VtGetValues $str_maxW -value]
  2703.     if {[string length $str_max]} {
  2704.     if {! [ctype digit $str_max]} {
  2705.         ErrorPush errStack 0 SCO_DHCP_ERR_MAX_LEN1 "$str_max"
  2706.         SaDisplayErrorStacks $dialog.err [list $errStack] NOHELP
  2707.         VtUnLock
  2708.         return
  2709.     }
  2710.     if {[string length $str_min] && ($str_max < $str_min)} {
  2711.         ErrorPush errStack 0 SCO_DHCP_ERR_MAX_LEN2
  2712.         SaDisplayErrorStacks $dialog.err [list $errStack] NOHELP
  2713.         VtUnLock
  2714.         return
  2715.     }
  2716.     keylset opts max_length $str_max
  2717.     }
  2718.     UpdateEntry $cbs dhcpOption $action $tag $opts 
  2719.     VtUnLock
  2720. } ;# UserDefinedOptSave
  2721. proc UserDefinedOptIdCB {cbs} {
  2722.     global opt_types
  2723.     keylget cbs dialog dialog
  2724.     keylget cbs value code 
  2725.     set name [format "option%s" $code]
  2726.     VtSetValues [VxGetVar $dialog nameW] -value $name
  2727.     set commentW    [VxGetVar $dialog commentW]
  2728.     set opt_type    [VxGetVar $dialog opt_type]
  2729.     set opt_arr     [VxGetVar $dialog opt_arr]
  2730.     set userOpts [browser:GetParentDrawnList]
  2731.     if {[lsearch [keylkeys userOpts] $code] != -1} {
  2732.     set title [IntlLocalizeMsg SCO_DHCP_MSG_USR_DEF_MOD_TITLE]
  2733.     set entry [browser:GetChildren $code]
  2734.     } else {
  2735.     set title [IntlLocalizeMsg SCO_DHCP_MSG_USR_DEF_ADD_TITLE]
  2736.     keylset entry comment {}
  2737.     keylset entry type [lindex [keylkeys opt_types] 0]
  2738.     }
  2739.     VtSet $dialog -title $title
  2740.     if {[keylget entry comment comment]} {
  2741.     VtSet $commentW -value $comment
  2742.     }
  2743.     if {[keylget entry type type]} {
  2744.     set len [llength $type]
  2745.     if {$len > 0} {
  2746.         set array 0
  2747.         if {$len == 2} {
  2748.         set array [cequal [lindex $type 1] array]
  2749.         lvarpop type end
  2750.         }
  2751.         VtSet $opt_arr -value $array
  2752.         if {[keylget opt_types $type type_entry]} {
  2753.         if {[keylget type_entry message message]} {
  2754.             VtSet $opt_type -value $message 
  2755.         }
  2756.         }
  2757.     }
  2758.     }
  2759.     VtUnLock
  2760. } ;# UserDefinedOptIdCB
  2761. proc UserDefinedOptBuild {form action code} {
  2762.     global UserOpt
  2763.     set alform [SaAlignedForm $form.align [list \
  2764.     [list SCO_DHCP_MSG_IDENT \
  2765.         [ list VxSpinButton 4 $UserOpt(start) {} $UserOpt(end) {} \
  2766.         1 $code {} "" ] \
  2767.     ] \
  2768.     [list SCO_DHCP_MSG_NAME \
  2769.         [list VtText \
  2770.         -readOnly \
  2771.         -callback "SaSetFocus next" \
  2772.         -columns 15 \
  2773.         -shortHelpCallback SaShortHelpCB \
  2774.         -shortHelpString \
  2775.             [IntlLocalizeMsg SCO_DHCP_MSG_USR_DEF_NAME_SH]] \
  2776.     ] \
  2777.     [list SCO_DHCP_MSG_DESC \
  2778.         [list VtText \
  2779.         -callback "SaSetFocus next" \
  2780.         -columns 40 \
  2781.         -shortHelpCallback SaShortHelpCB \
  2782.         -shortHelpString \
  2783.             [IntlLocalizeMsg SCO_DHCP_MSG_USR_DEF_DESC_SH]] \
  2784.     ] \
  2785.     [list SCO_DHCP_MSG_TYPE \
  2786.         [list VtForm -marginWidth 0 -marginHeight 0] \
  2787.     ] \
  2788.     [list SCO_DHCP_MSG_BLANK \
  2789.         [list VtForm -marginWidth 0 -marginHeight 0] \
  2790.     ] \
  2791.     ]] 
  2792.     set idW      [VxGetVar $alform widget1]
  2793.     set idF      [VxGetVar $alform form1]
  2794.     set idL      [VxGetVar $alform label1]
  2795.     set nameW    [VxGetVar $alform widget2]
  2796.     set nameF    [VxGetVar $alform form2]
  2797.     set nameL    [VxGetVar $alform label2]
  2798.     set commentW [VxGetVar $alform widget3]
  2799.     set commentF [VxGetVar $alform form3]
  2800.     set commentL [VxGetVar $alform label3]
  2801.     set typeW    [VxGetVar $alform widget4]
  2802.     set typeF    [VxGetVar $alform form4]
  2803.     set typeL    [VxGetVar $alform label4]
  2804.     set attrW    [VxGetVar $alform widget5]
  2805.     set attrF    [VxGetVar $alform form5]
  2806.     VtSetValues $alform -leftSide FORM -rightSide FORM
  2807.     VtSetValues $idW   -rightSide NONE
  2808.     VtSetValues $nameW -rightSide NONE
  2809.     VtSetValues $nameF    -CHARM_topOffset 1 
  2810.     VtSetValues $commentF -CHARM_topOffset 1 
  2811.     VtSetValues $typeF    -CHARM_topOffset 1 
  2812.     VtSetValues [VxGetVar $idW text] \
  2813.         -callback "SaSetFocus next" \
  2814.         -valueChangedCallback UserDefinedOptIdCB \
  2815.         -autoLock UserDefinedOptIdCB \
  2816.         -shortHelpCallback SaShortHelpCB  \
  2817.         -shortHelpString [IntlLocalizeMsg SCO_DHCP_MSG_USR_DEF_IDENT_SH]
  2818.     set opt_type [VtComboBox $typeW.opt_type \
  2819.     -columns 23 \
  2820.     -rows 10 \
  2821.     -callback "SaSetFocus next" \
  2822.     -valueChangedCallback UserDefinedOptSelectTypeCB \
  2823.     -autoLock UserDefinedOptSelectTypeCB \
  2824.     -itemList [GetOptTypeList] \
  2825.     -readOnly \
  2826.     -shortHelpCallback SaShortHelpCB \
  2827.     -shortHelpString [IntlLocalizeMsg SCO_DHCP_MSG_USR_DEF_TYPE_SH]]
  2828.     set opt_arr [VtToggleButton $typeW.opt_arr \
  2829.     -label [IntlLocalizeMsg SCO_DHCP_MSG_USR_DEF_ARRAY] \
  2830.     -leftSide $opt_type \
  2831.     -MOTIF_leftOffset 20 \
  2832.     -callback UserDefinedOptSensitivityCB \
  2833.     -autoLock UserDefinedOptSensitivityCB \
  2834.     -alignTop $opt_type \
  2835.     -CHARM_topOffset 1 \
  2836.     -shortHelpCallback SaShortHelpCB \
  2837.     -shortHelpString [IntlLocalizeMsg SCO_DHCP_MSG_USR_DEF_ARRAY_SH]]
  2838.     set alform2 [SaAlignedForm $attrW.min [list \
  2839.     [list SCO_DHCP_MSG_USR_DEF_MIN_VAL \
  2840.         [list VtText \
  2841.         -callback "SaSetFocus next" \
  2842.         -valueChangedCallback "UserDefinedOptCheckIntValueCB int_min" \
  2843.         -autoLock UserDefinedOptCheckIntValueCB \
  2844.         -columns 10 \
  2845.         -shortHelpCallback SaShortHelpCB \
  2846.         -shortHelpString \
  2847.             [IntlLocalizeMsg SCO_DHCP_MSG_USR_DEF_MIN_VAL_SH]] \
  2848.     ] \
  2849.     [list SCO_DHCP_MSG_USR_DEF_MIN_LEN \
  2850.         [list VtText \
  2851.         -callback "SaSetFocus next" \
  2852.         -columns 10 \
  2853.         -shortHelpCallback SaShortHelpCB \
  2854.         -shortHelpString \
  2855.             [IntlLocalizeMsg SCO_DHCP_MSG_USR_DEF_MIN_LEN_SH]] \
  2856.     ] \
  2857.     ]] 
  2858.     set alform3 [SaAlignedForm $attrW.max [list \
  2859.     [list SCO_DHCP_MSG_USR_DEF_MAX_VAL \
  2860.         [list VtText \
  2861.         -callback "SaSetFocus next" \
  2862.         -valueChangedCallback "UserDefinedOptCheckIntValueCB int_max" \
  2863.         -autoLock UserDefinedOptCheckIntValueCB \
  2864.         -columns 10 \
  2865.         -shortHelpCallback SaShortHelpCB \
  2866.         -shortHelpString \
  2867.             [IntlLocalizeMsg SCO_DHCP_MSG_USR_DEF_MAX_VAL_SH]] \
  2868.     ] \
  2869.     [list SCO_DHCP_MSG_USR_DEF_MAX_LEN \
  2870.         [list VtText \
  2871.         -callback "SaSetFocus next" \
  2872.         -columns 10 \
  2873.         -shortHelpCallback SaShortHelpCB \
  2874.         -shortHelpString \
  2875.             [IntlLocalizeMsg SCO_DHCP_MSG_USR_DEF_MAX_LEN_SH]] \
  2876.     ] \
  2877.     ]] 
  2878.     VtSetValues $alform3 -leftSide $alform2 -topSide FORM
  2879.     set sep [VtSeparator $form.sep1 -horizontal \
  2880.            -leftSide FORM -rightSide FORM \
  2881.            -MOTIF_leftOffset -5 -MOTIF_rightOffset -5 \
  2882.            -topSide $alform]
  2883.     set status [SaStatusBar $form.status 0 ]
  2884.     VtSetValues $sep -bottomSide $status -bottomOffset 0
  2885.     VxSetVar $form idW         [VxGetVar $idW text]
  2886.     VxSetVar $form nameW       $nameW
  2887.     VxSetVar $form commentW    $commentW 
  2888.     VxSetVar $form opt_type    $opt_type
  2889.     VxSetVar $form opt_arr     $opt_arr
  2890.     VxSetVar $form intMinForm  [VxGetVar $alform2 form1]
  2891.     VxSetVar $form intMaxForm  [VxGetVar $alform3 form1]
  2892.     VxSetVar $form int_min     [VxGetVar $alform2 widget1]
  2893.     VxSetVar $form int_max     [VxGetVar $alform3 widget1]
  2894.     VxSetVar $form strMinForm  [VxGetVar $alform2 form2]
  2895.     VxSetVar $form strMaxForm  [VxGetVar $alform3 form2]
  2896.     VxSetVar $form str_min     [VxGetVar $alform2 widget2]
  2897.     VxSetVar $form str_max     [VxGetVar $alform3 widget2]
  2898. } ;# UserDefinedOptBuild
  2899. proc UserDefinedOptDefine {action cbs} {
  2900.     global UserOpt opt_types
  2901.     set UserOpt(start) 128
  2902.     set UserOpt(end)   254
  2903.     keylget cbs dialog dialog
  2904.     switch $action {
  2905.     add {
  2906.         set title [IntlLocalizeMsg SCO_DHCP_MSG_USR_DEF_ADD_TITLE]
  2907.             set userOpts [browser:GetParentDrawnList]
  2908.         set codes [lsort -increasing [keylkeys userOpts]]
  2909.         set code [UserDefinedOptGetFreeOpt $codes]
  2910.     } 
  2911.     modify {
  2912.         set title [IntlLocalizeMsg SCO_DHCP_MSG_USR_DEF_MOD_TITLE]
  2913.         set selPos [browser:GetSelectedItemPos]
  2914.         set selItem [browser:FindItemParent $selPos]
  2915.         set code [lindex $selItem 0]
  2916.     }
  2917.     default {
  2918.         VtUnLock
  2919.         return
  2920.     }
  2921.     }
  2922.     set form [VtFormDialog $dialog.addOpt \
  2923.     -title $title \
  2924.     -okCallback "UserDefinedOptSave $action" \
  2925.     -autoLock UserDefinedOptSave \
  2926.     -cancelCallback VxEndFormCB \
  2927.     -help \
  2928.     ]
  2929.     UserDefinedOptBuild $form $action $code
  2930.     set idW         [VxGetVar $form idW]
  2931.     set nameW       [VxGetVar $form nameW]
  2932.     set commentW    [VxGetVar $form commentW]
  2933.     set opt_type    [VxGetVar $form opt_type]
  2934.     set opt_arr     [VxGetVar $form opt_arr]
  2935.     set initMinForm [VxGetVar $form intMinForm]
  2936.     set initMaxForm [VxGetVar $form intMaxForm]
  2937.     set int_min     [VxGetVar $form int_min]
  2938.     set int_max     [VxGetVar $form int_max]
  2939.     set strMinForm  [VxGetVar $form strMinForm]
  2940.     set strMaxForm  [VxGetVar $form strMaxForm]
  2941.     set str_min     [VxGetVar $form str_min]
  2942.     set str_max     [VxGetVar $form str_max]
  2943.     VxSetVar form parent dialog
  2944.     VtSet $idW -value $code
  2945.     set focusList [list $idW $commentW  $opt_type $opt_arr \
  2946.             $int_min $int_max $str_min $str_max]
  2947.     SaSetFocusList $form "$focusList [VtGetValues $form -ok]"
  2948.     SaSetTabGroups $form $focusList
  2949.     VtShow $form
  2950.     VtSetFocus $idW 
  2951.     VtUnLock
  2952. } ;# UserDefinedOptDefine
  2953. proc VendorIdSensitivityCB {cbs} {
  2954.     keylget cbs dialog dialog
  2955.     set idW       [VxGetVar $dialog idW]
  2956.     set commentW  [VxGetVar $dialog commentW]
  2957.     set commentL  [VxGetVar $dialog commentL]
  2958.     set dhcpOptsW [VxGetVar $dialog dhcpOptsW]
  2959.     if {[string length [VtGetValues $idW -value]]} {
  2960.     set idSen 1
  2961.     } else {
  2962.     set idSen 0
  2963.     }
  2964.     VtSetSensitive $commentW  $idSen 
  2965.     VtSetSensitive $commentL  $idSen
  2966.     VtSetSensitive $dhcpOptsW $idSen
  2967. } ;# VendorIdSensitivity
  2968. proc VendorSaveCB {action cbs} {
  2969.     global Main
  2970.     switch $action {
  2971.     add -
  2972.     modify {}
  2973.     default {
  2974.         VtUnLock
  2975.         return
  2976.     }
  2977.     }
  2978.     keylget cbs dialog dialog
  2979.     set idW  [VxGetVar $dialog idW]
  2980.     set commentW [VxGetVar $dialog commentW]
  2981.     set tag     [VtGetValues $idW -value]
  2982.     set comment [VtGetValues $commentW -value]
  2983.     set options [VxGetVar $dialog options]
  2984.     if {![string length $tag]} {
  2985.     ErrorPush errStack 0 SCO_DHCP_ERR_NO_IDENT
  2986.     SaDisplayErrorStacks $dialog.err [list $errStack] NOHELP
  2987.     VtUnLock
  2988.     return
  2989.     }
  2990.     set opts [list [list comment "$comment"]]
  2991.     foreach opt [keylkeys options] {
  2992.     keylget options $opt value
  2993.     lappend opts [list $opt $value]
  2994.     }
  2995.     UpdateEntry $cbs dhcpVendorClass $action $tag $opts 
  2996.    VtUnLock
  2997. } ;# VendorSaveCB
  2998. proc VendorBuild {form action} {
  2999.     set alform [SaAlignedForm $form.align [list \
  3000.     [list SCO_DHCP_MSG_IDENT \
  3001.         [list VtText -columns 20 \
  3002.         -callback "SaSetFocus next" \
  3003.         -valueChangedCallback VendorIdSensitivityCB \
  3004.         -shortHelpCallback SaShortHelpCB \
  3005.         -shortHelpString \
  3006.             [IntlLocalizeMsg SCO_DHCP_MSG_VENDOR_IDENT_SH] ] \
  3007.     ] \
  3008.     [list SCO_DHCP_MSG_DESC \
  3009.         [list VtText \
  3010.         -columns 40 \
  3011.         -callback "SaSetFocus next" \
  3012.         -shortHelpCallback SaShortHelpCB \
  3013.         -shortHelpString \
  3014.             [IntlLocalizeMsg SCO_DHCP_MSG_VENDOR_DESC_SH] ] \
  3015.     ] \
  3016.     ]]
  3017.     set idW      [VxGetVar $alform widget1]
  3018.     set idF      [VxGetVar $alform form1]
  3019.     set idL      [VxGetVar $alform label1]
  3020.     set commentW [VxGetVar $alform widget2]
  3021.     set commentF [VxGetVar $alform form2]
  3022.     set commentL [VxGetVar $alform label2]
  3023.     set optionsF [VtFrame $form.optionsF \
  3024.     -topSide $alform \
  3025.     -MOTIF_topOffset 20 \
  3026.     -CHARM_topOffset 1 \
  3027.     -leftSide FORM \
  3028.     -title [IntlLocalizeMsg SCO_DHCP_MSG_OPTIONS]]
  3029.     set optionsForm [VtForm $optionsF.optionsForm]
  3030.     set dhcpOptsW [VtPushButton $optionsForm.dhcpOpts \
  3031.     -label [IntlLocalizeMsg SCO_DHCP_MSG_DHCP_OPT_BUT] \
  3032.     -autoLock OptionsDefineCB \
  3033.     -callback "OptionsDefineCB VendorClass $action" \
  3034.     -shortHelpCallback SaShortHelpCB \
  3035.     -shortHelpString [IntlLocalizeMsg SCO_DHCP_MSG_VENDOR_DHCP_SH]]
  3036.     set sep [VtSeparator $form.sep1 -horizontal \
  3037.            -leftSide FORM -rightSide FORM \
  3038.            -MOTIF_leftOffset -5 -MOTIF_rightOffset -5 \
  3039.            -topSide $optionsForm]
  3040.     set status [SaStatusBar $form.status 0 ]
  3041.     VtSetValues $sep -bottomSide $status -bottomOffset 0
  3042.     VtSetValues $idF      -CHARM_topOffset 1
  3043.     VtSetValues $commentF -CHARM_topOffset 1
  3044.     VtSetValues $idW -rightSide NONE
  3045.     VxSetVar $form idW $idW
  3046.     VxSetVar $form idL $idL
  3047.     VxSetVar $form commentW $commentW
  3048.     VxSetVar $form commentL $commentL
  3049.     VxSetVar $form dhcpOptsW $dhcpOptsW
  3050. } ;# VendorBuild
  3051. proc VendorDefine { action cbs } {
  3052.     switch $action {
  3053.     add {
  3054.         set title [IntlLocalizeMsg SCO_DHCP_MSG_VENDOR_ADD_TITLE] \
  3055.     }
  3056.     modify {
  3057.         set title [IntlLocalizeMsg SCO_DHCP_MSG_VENDOR_MOD_TITLE] \
  3058.     }
  3059.     default {
  3060.         VtUnLock
  3061.         return
  3062.     }
  3063.     }
  3064.     keylget cbs dialog dialog
  3065.     set form [VtFormDialog $dialog.vndrDlog \
  3066.     -title $title \
  3067.     -okCallback "VendorSaveCB $action" \
  3068.     -autoLock VendorSaveCB \
  3069.     -cancelCallback VxEndFormCB  \
  3070.     -help \
  3071.     ]
  3072.     VendorBuild $form $action
  3073.     set idW       [VxGetVar $form idW]
  3074.     set idL       [VxGetVar $form idL]
  3075.     set commentW  [VxGetVar $form commentW]
  3076.     set commentL  [VxGetVar $form commentL]
  3077.     set dhcpOptsW [VxGetVar $form dhcpOptsW]
  3078.     if {[cequal $action modify]} {
  3079.         set selPos   [browser:GetSelectedItemPos]
  3080.         set selItem  [browser:FindItemParent $selPos]
  3081.         set id       [lindex $selItem 0]
  3082.     set comment  [lindex $selItem 1]
  3083.         set entry    [browser:GetChildren $id] 
  3084.     VtSetValues $idW -value $id
  3085.     VtSetValues $commentW -value $comment
  3086.     set options [OptionsGetGeneralList $entry]
  3087.     VtSetSensitive $idL 0
  3088.     VtSetSensitive $idW 0
  3089.     } else {
  3090.     set options {}
  3091.     }
  3092.     VxSetVar $form options $options
  3093.     VxSetVar $form parent  $dialog
  3094.     VendorIdSensitivityCB [list [list dialog $form]]
  3095.     SaSetFocusList $form [list $idW $commentW $dhcpOptsW]
  3096.     VtShow $form
  3097.     VtSetFocus $idW 
  3098.     VtUnLock
  3099. } ;# VendorDefine
  3100. proc GlobalDefine {action cbs} {
  3101.     OptionsDefineCB Global $action $cbs
  3102. } ;# GlobalDefine
  3103. proc UserIdSensitivityCB {cbs} {
  3104.     keylget cbs dialog dialog
  3105.     set uIdW [VxGetVar $dialog uIdW]
  3106.     if {[string length [VtGetValues $uIdW -value]]} {
  3107.     set uIdSen 1
  3108.     } else {
  3109.     set uIdSen 0
  3110.     }
  3111.     VtSetSensitive [VxGetVar $dialog commentW]  $uIdSen
  3112.     VtSetSensitive [VxGetVar $dialog commentL]  $uIdSen
  3113.     VtSetSensitive [VxGetVar $dialog dhcpOptsW] $uIdSen
  3114. } ;# UserIdSensitivityCB
  3115. proc UserSaveCB {action cbs} {
  3116.     global Main
  3117.     switch $action {
  3118.     add -
  3119.     modify {}
  3120.     default {
  3121.         VtUnLock
  3122.         return
  3123.     }
  3124.     }
  3125.     keylget cbs dialog dialog
  3126.     set uIdW     [VxGetVar $dialog uIdW]
  3127.     set commentW [VxGetVar $dialog commentW]
  3128.     set tag [VtGetValues $uIdW -value]
  3129.     set comment [VtGetValues $commentW -value]
  3130.     set options  [VxGetVar $dialog options] 
  3131.     if {![string length $tag]} {
  3132.     ErrorPush errStack 0 SCO_DHCP_ERR_NO_IDENT
  3133.     SaDisplayErrorStacks $dialog.err [list $errStack] NOHELP
  3134.     VtUnLock
  3135.     return
  3136.     }
  3137.     set opts [list [list comment "$comment"]]
  3138.     foreach opt [keylkeys options] {
  3139.     keylget options $opt value
  3140.     lappend opts [list $opt $value]
  3141.     }
  3142.     UpdateEntry $cbs dhcpUserClass $action $tag $opts 
  3143.     VtUnLock
  3144. } ;# UserSaveCB
  3145. proc UserBuild { form action } {
  3146.     set alform [SaAlignedForm $form.align [list \
  3147.     [list SCO_DHCP_MSG_IDENT \
  3148.         [list VtText  \
  3149.         -columns 20 \
  3150.         -callback "SaSetFocus next" \
  3151.         -valueChangedCallback UserIdSensitivityCB \
  3152.         -shortHelpCallback SaShortHelpCB \
  3153.         -shortHelpString [IntlLocalizeMsg SCO_DHCP_MSG_USER_IDENT_SH]] \
  3154.     ] \
  3155.     [list SCO_DHCP_MSG_DESC \
  3156.         [list VtText \
  3157.         -columns 40 \
  3158.         -callback "SaSetFocus next" \
  3159.         -shortHelpCallback SaShortHelpCB \
  3160.         -shortHelpString [IntlLocalizeMsg SCO_DHCP_MSG_USER_DESC_SH]] \
  3161.     ] \
  3162.     ]]
  3163.     set uIdW     [VxGetVar $alform widget1]
  3164.     set uIdF     [VxGetVar $alform form1]
  3165.     set uIdL     [VxGetVar $alform label1]
  3166.     set commentW [VxGetVar $alform widget2]
  3167.     set commentF [VxGetVar $alform form2]
  3168.     set commentL [VxGetVar $alform label2]
  3169.     set optionsF [VtFrame $form.optionsF \
  3170.         -topSide $alform \
  3171.         -MOTIF_topOffset 20 \
  3172.         -CHARM_topOffset 1 \
  3173.         -leftSide FORM \
  3174.         -title [IntlLocalizeMsg SCO_DHCP_MSG_OPTIONS]]
  3175.     set optionsForm [VtForm $optionsF.optionsForm]
  3176.     set dhcpOptsW [VtPushButton $optionsForm.dhcpOpts \
  3177.     -label [IntlLocalizeMsg SCO_DHCP_MSG_DHCP_OPT_BUT] \
  3178.     -autoLock OptionsDefineCB \
  3179.     -callback "OptionsDefineCB UserClass $action" \
  3180.     -shortHelpCallback SaShortHelpCB \
  3181.     -shortHelpString [IntlLocalizeMsg SCO_DHCP_MSG_USER_DHCP_SH]]
  3182.     set sep [VtSeparator $form.sep1 -horizontal \
  3183.            -leftSide FORM -rightSide FORM \
  3184.           -MOTIF_leftOffset -5 -MOTIF_rightOffset -5 \
  3185.            -topSide $optionsForm]
  3186.     set status [SaStatusBar $form.status 0 ]
  3187.     VtSetValues $sep -bottomSide $status -bottomOffset 0
  3188.     VtSetValues $uIdW -rightSide NONE
  3189.     VtSetValues $uIdF  -CHARM_topOffset 1
  3190.     VtSetValues $commentF -CHARM_topOffset 1
  3191.     VxSetVar $form uIdW $uIdW
  3192.     VxSetVar $form uIdL $uIdL
  3193.     VxSetVar $form commentW $commentW
  3194.     VxSetVar $form commentL $commentL
  3195.     VxSetVar $form dhcpOptsW $dhcpOptsW
  3196. } ;# UserBuild
  3197. proc UserDefine { action cbs } {
  3198.     switch $action {
  3199.     add {
  3200.         set title [IntlLocalizeMsg SCO_DHCP_MSG_USER_ADD_TITLE]
  3201.     }
  3202.     modify {
  3203.         set title [IntlLocalizeMsg SCO_DHCP_MSG_USER_MOD_TITLE]
  3204.     }
  3205.     default {
  3206.         VtUnLock
  3207.         return
  3208.     }
  3209.     }
  3210.     keylget cbs dialog dialog
  3211.     set form [VtFormDialog $dialog.userDlog \
  3212.     -title $title \
  3213.     -okCallback "UserSaveCB $action" \
  3214.     -autoLock UserSaveCB \
  3215.     -cancelCallback VxEndFormCB \
  3216.     -help \
  3217.     ]
  3218.     UserBuild $form $action
  3219.     set uIdW      [VxGetVar $form uIdW]
  3220.     set uIdL      [VxGetVar $form uIdL]
  3221.     set commentW  [VxGetVar $form commentW]
  3222.     set commentL  [VxGetVar $form commentL]
  3223.     set dhcpOptsW [VxGetVar $form dhcpOptsW]
  3224.     if {[cequal $action modify]} {
  3225.         set selPos  [browser:GetSelectedItemPos]
  3226.         set selItem [browser:FindItemParent $selPos]
  3227.         set tag     [lindex $selItem 0]
  3228.     set comment [lindex $selItem 1]
  3229.         set entry   [browser:GetChildren $tag]    
  3230.     VtSetValues $uIdW -value $tag
  3231.     VtSetValues $commentW -value $comment
  3232.     set options [OptionsGetGeneralList $entry]
  3233.     VtSetSensitive $uIdW 0
  3234.     VtSetSensitive $uIdL 0
  3235.     } else {
  3236.     set options {}
  3237.     }
  3238.     VxSetVar $form options $options
  3239.     VxSetVar $form parent $dialog
  3240.     UserIdSensitivityCB [list [list dialog $form]]
  3241.     SaSetFocusList $form [list $uIdW $commentW $dhcpOptsW]
  3242.     VtShow $form
  3243.     VtSetFocus $uIdW
  3244.     VtUnLock
  3245. } ;# UserDefine
  3246. proc SubnetCheck {subnet} {
  3247.     if {![checkIPaddr $subnet]} {
  3248.         ErrorPush {} 1 SCO_DHCP_ERR_BAD_SUBNET1
  3249.     return 1
  3250.     }
  3251.     regexp {([0-9]+)\.([0-9]+)\.([0-9]+)\.([0-9]+)} $subnet addr \
  3252.     a_addr b_addr c_addr d_addr    
  3253.     if {[expr {$d_addr & 0xF}] != 0} {
  3254.         ErrorPush {} 1 SCO_DHCP_ERR_BAD_SUBNET2 "$subnet"
  3255.     return 1 
  3256.     }
  3257.     return 0
  3258. } ;# SubnetCheck   
  3259. proc SubnetSaveCB {action cbs} {
  3260.     global Main
  3261.     switch $action {
  3262.     add - 
  3263.     modify {}
  3264.     default {
  3265.         VtUnLock
  3266.         return
  3267.     }
  3268.     }
  3269.     keylget cbs dialog dialog
  3270.     set subnetW   [VxGetVar $dialog subnetW]
  3271.     set maskW     [VxGetVar $dialog maskW]
  3272.     set poolNameW [VxGetVar $dialog poolNameW]
  3273.     set commentW  [VxGetVar $dialog commentW]
  3274.     set tag [getIPwidgetValue $subnetW]
  3275.     if {[ErrorCatch errStack 0 "SubnetCheck $tag" {}] != 0} {
  3276.     SaDisplayErrorStacks $dialog.err [list $errStack] NOHELP
  3277.     VtUnLock
  3278.     return
  3279.     }
  3280.     set mask [getIPwidgetValue $maskW]
  3281.     if {![checkIPaddr $mask]} {
  3282.     ErrorPush errStack 0 SCO_DHCP_ERR_BAD_SUBNET_MASK $mask
  3283.     SaDisplayErrorStacks $dialog.err [list $errStack] NOHELP
  3284.     VtUnLock
  3285.     return
  3286.     }
  3287.     set poolName [VtGetValues $poolNameW -value]
  3288.     set comment [VtGetValues $commentW -value]
  3289.     set lease   [VxGetVar $dialog lease]
  3290.     set options [VxGetVar $dialog options]
  3291.     set cfgd_opts [keylkeys options]
  3292.     set opts [list [list comment "$comment"] \
  3293.     [list mask "$mask"] \
  3294.     [list pool "$poolName"] \
  3295.     [list lease_dflt [keylget lease lease_dflt]] \
  3296.     [list lease_max  [keylget lease lease_max]] \
  3297.     [list t1 [keylget lease t1]] \
  3298.     [list t2 [keylget lease t2]]]
  3299.     foreach opt $cfgd_opts {
  3300.     lappend opts [list $opt [keylget options $opt]]
  3301.     }
  3302.     UpdateEntry $cbs dhcpSubnet $action $tag $opts 
  3303.    VtUnLock
  3304. } ;# SubnetSaveCB
  3305. proc SubnetBuild {form action} {
  3306.     set alform [SaAlignedForm $form.align [list \
  3307.     [list SCO_DHCP_MSG_SUBNET_SUBNET \
  3308.         [list VtForm -marginWidth 0 -marginHeight 0 ]
  3309.     ] \
  3310.     [list SCO_DHCP_MSG_SUBNET_MASK \
  3311.         [list VtForm -marginWidth 0 -marginHeight 0 ]
  3312.     ] \
  3313.     [list SCO_DHCP_MSG_SUBNET_POOL \
  3314.         [list VtComboBox \
  3315.         -callback "SaSetFocus next" \
  3316.         -columns 20 \
  3317.         -shortHelpCallback SaShortHelpCB \
  3318.         -shortHelpString [IntlLocalizeMsg SCO_DHCP_MSG_SUBNET_POOL_SH] \
  3319.         ] \
  3320.     ] \
  3321.     [list SCO_DHCP_MSG_DESC \
  3322.         [list VtText \
  3323.         -callback "SaSetFocus next" \
  3324.         -shortHelpCallback SaShortHelpCB \
  3325.         -shortHelpString [IntlLocalizeMsg SCO_DHCP_MSG_SUBNET_DESC_SH]] \
  3326.     ]]]
  3327.     set subnetW   [VxGetVar $alform widget1]
  3328.     set maskW     [VxGetVar $alform widget2]
  3329.     set poolNameW [VxGetVar $alform widget3]
  3330.     set commentW  [VxGetVar $alform widget4]
  3331.     set commentF  [VxGetVar $alform form4]
  3332.     createIPwidget $subnetW "" SCO_DHCP_MSG_SUBNET_SUBNET_SH
  3333.     createIPwidget $maskW "" SCO_DHCP_MSG_SUBNET_MASK_SH
  3334.     VtSetValues $subnetW -rightSide NONE
  3335.     VtSetValues $maskW -rightSide NONE
  3336.     VtSetValues $commentF -CHARM_topOffset 1
  3337.     VtSetValues $alform -rightSide FORM
  3338.     set optionsF [VtFrame $form.optionsF \
  3339.     -topSide $alform \
  3340.     -MOTIF_topOffset 20 \
  3341.     -CHARM_topOffset 1 \
  3342.     -leftSide FORM \
  3343.     -title [IntlLocalizeMsg SCO_DHCP_MSG_OPTIONS]]
  3344.     set optionsForm [VtForm $optionsF.optionsForm]
  3345.     set leaseOptsW [VtPushButton $optionsForm.leaseOptsW \
  3346.     -label [IntlLocalizeMsg SCO_DHCP_MSG_SUBNET_LEASE_BUT] \
  3347.     -topSide FORM \
  3348.     -leftSide FORM \
  3349.     -autoLock LeaseOptsDefineCB \
  3350.     -callback "LeaseOptsDefineCB $action" \
  3351.     -shortHelpCallback SaShortHelpCB \
  3352.     -shortHelpString [IntlLocalizeMsg SCO_DHCP_MSG_SUBNET_LEASE_SH]]
  3353.     set dhcpOptsW [VtPushButton $optionsForm.dhcpOptsW \
  3354.     -label [IntlLocalizeMsg SCO_DHCP_MSG_DHCP_OPT_BUT] \
  3355.     -topSide FORM \
  3356.     -leftSide $leaseOptsW \
  3357.     -alignTop $leaseOptsW \
  3358.     -autoLock OptionsDefineCB \
  3359.     -callback "OptionsDefineCB Subnet $action" \
  3360.     -shortHelpCallback SaShortHelpCB \
  3361.     -shortHelpString [IntlLocalizeMsg SCO_DHCP_MSG_SUBNET_DHCP_SH]]
  3362.     set poolConfW [VtPushButton $optionsForm.poolBut \
  3363.     -label [IntlLocalizeMsg SCO_DHCP_MSG_SUBNET_POOL_BUT] \
  3364.     -topSide FORM \
  3365.     -leftSide $dhcpOptsW \
  3366.     -alignTop $leaseOptsW \
  3367.     -autoLock PoolConfCB \
  3368.     -callback PoolConfCB \
  3369.     -shortHelpCallback SaShortHelpCB \
  3370.     -shortHelpString [IntlLocalizeMsg SCO_DHCP_MSG_SUBNET_POOL_BUT_SH]]
  3371.     set sep [VtSeparator $form.sep1 -horizontal \
  3372.            -leftSide FORM -rightSide FORM \
  3373.            -MOTIF_leftOffset -5 -MOTIF_rightOffset -5 \
  3374.            -topSide $optionsF]
  3375.     set status [SaStatusBar $form.status 0 ]
  3376.     VtSetValues $sep -bottomSide $status -bottomOffset 0
  3377.     VxSetVar $form subnetW    $subnetW
  3378.     VxSetVar $form maskW      $maskW
  3379.     VxSetVar $form poolNameW  $poolNameW
  3380.     VxSetVar $form commentW   $commentW
  3381.     VxSetVar $form dhcpOptsW  $dhcpOptsW
  3382.     VxSetVar $form leaseOptsW $leaseOptsW
  3383.     VxSetVar $form poolConfW  $poolConfW
  3384. } ;# SubnetBuild
  3385. proc convNetmask {netmask} {
  3386.     regexp (..)(..)(..)(..)(..) $netmask {} type a_addr b_addr \
  3387.     c_addr d_addr
  3388.     if {[cequal type "0x"]} {
  3389.         set a_addr [format "%d" [format "%s%s" $type $a_addr]]
  3390.     set b_addr [format "%d" [format "%s%s" $type $b_addr]]
  3391.     set c_addr [format "%d" [format "%s%s" $type $c_addr]]
  3392.     set d_addr [format "%d" [format "%s%s" $type $d_addr]]
  3393.     set netmask [format "%d.%d.%d.%d" $a_addr $b_addr $c_addr $d_addr]
  3394.     }
  3395.     return $netmask 
  3396. } ;# convNetmask 
  3397. proc GetPoolList {} {
  3398.    if {[ErrorCatch {} 1 "GetAllCall aasPool addressList" \
  3399.     infoList SCO_DHCP_ERR_POOL_INFO] != 0} {
  3400.     return {}
  3401.     }
  3402.     set poolList {}
  3403.     foreach info $infoList {
  3404.     keylget info instance poolTag
  3405.     if {![regexp -nocase {(.*):(INET)} $poolTag tmp poolName \
  3406.         addrType]} {
  3407.         ErrorPush {} 1 SCO_DHCP_ERR_POOL_ADDRTYPE "$addrType"
  3408.         return {}
  3409.     }
  3410.     lappend poolList $poolName
  3411.     }
  3412.     set poolList [lsort -increasing $poolList]
  3413.     return $poolList
  3414. } ;# GetPoolList
  3415. proc SubnetDefine { action cbs } {
  3416.     set dialog [keylget cbs dialog]
  3417.     switch $action {
  3418.     add {    
  3419.         set title [IntlLocalizeMsg SCO_DHCP_MSG_SUBNET_ADD_TITLE]
  3420.     }
  3421.     modify {
  3422.         set title [IntlLocalizeMsg SCO_DHCP_MSG_SUBNET_MOD_TITLE]
  3423.     }
  3424.     default {
  3425.         VtUnLock
  3426.         return
  3427.     }
  3428.     }
  3429.     set form [VtFormDialog $dialog.subnetDlog \
  3430.     -title $title \
  3431.     -autoLock SubnetSaveCB \
  3432.     -okCallback "SubnetSaveCB $action" \
  3433.     -cancelCallback VxEndFormCB \
  3434.     -help \
  3435.     ]
  3436.     SubnetBuild $form $action
  3437.     set subnetW    [VxGetVar $form subnetW]
  3438.     set maskW      [VxGetVar $form maskW]
  3439.     set poolNameW   [VxGetVar $form poolNameW]
  3440.     set commentW   [VxGetVar $form commentW]
  3441.     set dhcpOptsW  [VxGetVar $form dhcpOptsW]
  3442.     set leaseOptsW [VxGetVar $form leaseOptsW]
  3443.     if {[ErrorCatch errStack 0 "GetPoolList" poolList] != 0} {
  3444.     set noPoolW [VtWarningDialog $dialog.warn \
  3445.         -message [IntlLocalizeMsg SCO_DHCP_ERR_NO_POOL_LIST]]
  3446.     set poolList {}
  3447.     }
  3448.     if {![lempty $poolList]} {
  3449.     VtSetValues $poolNameW -itemList $poolList
  3450.     } 
  3451.     if {[cequal $action modify]} {
  3452.     set selPos [browser:GetSelectedItemPos]
  3453.     set selItem [browser:FindItemParent $selPos]
  3454.         set tag [lindex $selItem 0]
  3455.     set comment [lindex $selItem 1]
  3456.         set entry [browser:GetChildren $tag] 
  3457.     setIPwidgetValue $subnetW $tag
  3458.     VtSetSensitive $subnetW 0
  3459.     if {[keylget entry mask mask]} {
  3460.         set mask [convNetmask $mask]
  3461.         setIPwidgetValue $maskW $mask
  3462.     }
  3463.     if {[keylget entry pool pool]} {
  3464.         VtSetValues $poolNameW -value $pool
  3465.     }
  3466.     if {[llength $comment]} {
  3467.         VtSetValues $commentW -value $comment
  3468.     }
  3469.         set lease [LeaseOptsGetLease $entry]
  3470.     set options [OptionsGetGeneralList $entry]
  3471.     } else {
  3472.     set lease [LeaseOptsDefault]
  3473.     set options {}
  3474.     }
  3475.     VxSetVar $form lease $lease 
  3476.     VxSetVar $form options $options
  3477.     VxSetVar $form parent $dialog
  3478.     set focusList [list $subnetW \
  3479.     $maskW \
  3480.     $poolNameW \
  3481.     $commentW \
  3482.     $dhcpOptsW \
  3483.     $leaseOptsW]
  3484.     VtShow $form
  3485.     if {[info exists noPoolW]} {
  3486.     VtShow $noPoolW
  3487.     } 
  3488.     SaSetFocusList $form "$focusList"
  3489.     SaSetTabGroups $form "$focusList"
  3490.     VtSetFocus $subnetW 
  3491.     VtUnLock
  3492. } ;# SubnetDefine
  3493. proc LeaseWidgetSensitivityCB {name cbs} {
  3494.     keylget cbs dialog dialog
  3495.     set widgetName [VxGetShortName [keylget cbs selectedWidget]]
  3496.     set dayLabel  [VxGetVar $dialog [format "%s_dayLabel" $name]]
  3497.     set days      [VxGetVar $dialog [format "%s_days" $name]]
  3498.     set hourLabel [VxGetVar $dialog [format "%s_hourLabel" $name]]
  3499.     set hours     [VxGetVar $dialog [format "%s_hours" $name]]
  3500.     set minLabel  [VxGetVar $dialog [format "%s_minLabel" $name]]
  3501.     set mins      [VxGetVar $dialog [format "%s_mins" $name]]
  3502.     if {[cequal $widgetName unlimited]} {
  3503.     set sensitivity 0
  3504.     } else {
  3505.     set sensitivity 1
  3506.     }
  3507.     VtSetSensitive $dayLabel  $sensitivity
  3508.     VtSetSensitive $days      $sensitivity
  3509.     VtSetSensitive $hourLabel $sensitivity
  3510.     VtSetSensitive $hours     $sensitivity
  3511.     VtSetSensitive $minLabel  $sensitivity
  3512.     VtSetSensitive $mins      $sensitivity
  3513.     VtUnLock
  3514. } ;# LeaseWidgetSensitivityCB
  3515. proc LeaseWidgetBuild {form form1W form2W name} {
  3516.     set selectRb [VtRadioBox $form1W.selectRb \
  3517.     -autoLock LeaseWidgetSensitivityCB \
  3518.     -callback "LeaseWidgetSensitivityCB $name" \
  3519.     -rightSide NONE \
  3520.     -numColumns 2 ]
  3521.     set limited [VtToggleButton $selectRb.limited \
  3522.     -label [IntlLocalizeMsg SCO_DHCP_MSG_LIMITED] \
  3523.     -value 1]
  3524.     set unlimited [VtToggleButton $selectRb.unlimited \
  3525.     -label [IntlLocalizeMsg SCO_DHCP_MSG_UNLIMITED]]
  3526.     set dayLabel [VtLabel $form2W.dayLabel \
  3527.     -label [IntlLocalizeMsg SCO_DHCP_MSG_SUBNET_DAYS] \
  3528.     -font medNormalFont]
  3529.     set days [VxSpinButton $form2W.days \
  3530.     3 0 "" 13140 "" 1 {} \
  3531.     "" \
  3532.     "-leftSide $dayLabel -topSide FORM -rightSide NONE"]
  3533.     AlignLabel $dayLabel [VxGetVar $days text]
  3534.     set hourLabel [VtLabel $form2W.hourLabel \
  3535.     -label [IntlLocalizeMsg SCO_DHCP_MSG_SUBNET_HOURS] \
  3536.     -font medNormalFont \
  3537.     -leftSide $days \
  3538.     -MOTIF_leftOffset 15 \
  3539.     -CHARM_leftOffset 2 \
  3540.     -alignTop $dayLabel]
  3541.     set hours [VxSpinButton $form2W.hours \
  3542.     2 0 "" 23 "" 1 {} \
  3543.     {} \
  3544.     "-leftSide $hourLabel -topSide FORM" ]
  3545.     set minLabel [VtLabel $form2W.minLabel \
  3546.     -label [IntlLocalizeMsg SCO_DHCP_MSG_SUBNET_MINS] \
  3547.     -font medNormalFont \
  3548.     -leftSide $hours \
  3549.     -MOTIF_leftOffset 15 \
  3550.     -CHARM_leftOffset 2 \
  3551.     -alignTop $dayLabel]
  3552.     set mins [VxSpinButton $form2W.mins \
  3553.     2 0 "" 59 "" 1 {} \
  3554.     "" \
  3555.     "-leftSide $minLabel -topSide FORM" ]
  3556.     VxSetVar $form [format "%s_selectRb" $name]  $selectRb
  3557.     VxSetVar $form [format "%s_limited" $name]   $limited
  3558.     VxSetVar $form [format "%s_unlimited" $name] $unlimited
  3559.     VxSetVar $form [format "%s_dayLabel" $name]  $dayLabel
  3560.     VxSetVar $form [format "%s_days" $name]      $days
  3561.     VxSetVar $form [format "%s_hourLabel" $name] $hourLabel
  3562.     VxSetVar $form [format "%s_hours" $name]     $hours
  3563.     VxSetVar $form [format "%s_minLabel" $name]  $minLabel
  3564.     VxSetVar $form [format "%s_mins" $name]      $mins
  3565. }
  3566. proc LeaseOptsBuild {form} {
  3567.     set alform [SaAlignedForm $form.align [list \
  3568.     [list SCO_DHCP_MSG_SUBNET_DEF_LEASE \
  3569.         [list VtForm -marginHeight 0 -marginWidth 0] \
  3570.     ] \
  3571.     [list SCO_DHCP_MSG_BLANK \
  3572.         [list VtForm -marginHeight 0 -marginWidth 0] \
  3573.     ] \
  3574.     [list SCO_DHCP_MSG_SUBNET_MAX_LEASE \
  3575.         [list VtForm -marginHeight 0 -marginWidth 0] \
  3576.     ] \
  3577.     [list SCO_DHCP_MSG_BLANK \
  3578.         [list VtForm -marginHeight 0 -marginWidth 0] \
  3579.     ] \
  3580.     [list SCO_DHCP_MSG_SUBNET_RENEWAL \
  3581.         [list VxSpinButton 5 0 "" 100 "" 5 50 {} ""] \
  3582.     ] \
  3583.     [list SCO_DHCP_MSG_SUBNET_REBIND \
  3584.         [list VxSpinButton 5 0 "" 100 "" 5 90 {} ""] \
  3585.     ]]]
  3586.     set leaseDef1W [VxGetVar $alform widget1]
  3587.     set leaseDef2W [VxGetVar $alform widget2]
  3588.     set leaseMax1W [VxGetVar $alform widget3]
  3589.     set leaseMax2W [VxGetVar $alform widget4]
  3590.     set leaseRenewSpinW  [VxGetVar $alform widget5]
  3591.     set leaseRebindSpinW [VxGetVar $alform widget6]
  3592.     set leaseDef1F [VxGetVar $alform form1]
  3593.     set leaseDef2F [VxGetVar $alform form2]
  3594.     set leaseMax1F [VxGetVar $alform form3]
  3595.     set leaseMax2F [VxGetVar $alform form4]
  3596.     set leaseRenewSpinF  [VxGetVar $alform form5]
  3597.     set leaseRebindSpinF [VxGetVar $alform form6]
  3598.     set renewW [VxGetVar $leaseRenewSpinW text]
  3599.     VtSetValues $renewW \
  3600.         -callback "SaSetFocus next" \
  3601.     -shortHelpCallback SaShortHelpCB \
  3602.     -shortHelpString [IntlLocalizeMsg SCO_DHCP_MSG_SUBNET_RENEWAL_SH]
  3603.     set rebindW [VxGetVar $leaseRebindSpinW text]
  3604.     VtSetValues $rebindW \
  3605.         -callback "SaSetFocus next" \
  3606.     -shortHelpCallback SaShortHelpCB \
  3607.     -shortHelpString [IntlLocalizeMsg SCO_DHCP_MSG_SUBNET_REBIND_SH]
  3608.     VtSetValues $leaseRenewSpinW -rightSide NONE
  3609.     VtSetValues $leaseRebindSpinW -rightSide NONE
  3610.     VtSetValues $leaseDef2W -topOffset 0
  3611.     VtSetValues $leaseMax1F -CHARM_topOffset 1
  3612.     VtSetValues $leaseMax2F -topOffset 0
  3613.     VtSetValues $leaseRenewSpinF -CHARM_topOffset 1
  3614.     VtSetValues $leaseRebindSpinF -CHARM_topOffset 1
  3615.     LeaseWidgetBuild $form $leaseDef1W $leaseDef2W def
  3616.     set def_limited   [VxGetVar $form def_limited]
  3617.     set def_unlimited [VxGetVar $form def_unlimited]
  3618.     VtSetValues $def_limited \
  3619.     -shortHelpCallback SaShortHelpCB
  3620.     VtSetValues $def_limited \
  3621.     -shortHelpString [IntlLocalizeMsg SCO_DHCP_MSG_SUBNET_DEF_LIM_SH]
  3622.     VtSetValues $def_unlimited \
  3623.     -shortHelpCallback SaShortHelpCB
  3624.     VtSetValues $def_unlimited \
  3625.     -shortHelpString [IntlLocalizeMsg SCO_DHCP_MSG_SUBNET_DEF_UNLIM_SH]
  3626.     LeaseWidgetBuild $form $leaseMax1W $leaseMax2W max 
  3627.     set max_limited   [VxGetVar $form max_limited]
  3628.     set max_unlimited [VxGetVar $form max_unlimited]
  3629.     VtSetValues $max_limited \
  3630.     -shortHelpCallback SaShortHelpCB 
  3631.     VtSetValues $max_limited \
  3632.     -shortHelpString [IntlLocalizeMsg SCO_DHCP_MSG_SUBNET_MAX_LIM_SH]
  3633.     VtSetValues $max_unlimited \
  3634.     -shortHelpCallback SaShortHelpCB
  3635.     VtSetValues $max_unlimited \
  3636.     -shortHelpString [IntlLocalizeMsg SCO_DHCP_MSG_SUBNET_MAX_UNLIM_SH]
  3637.     set sep [VtSeparator $form.sep1 -horizontal \
  3638.            -leftSide FORM -rightSide FORM \
  3639.            -MOTIF_leftOffset -5 -MOTIF_rightOffset -5 \
  3640.            -topSide $alform]
  3641.     set status [SaStatusBar $form.status 0 ]
  3642.         VtSetValues $sep -bottomSide $status -bottomOffset 0
  3643.     VxSetVar $form renewW $renewW
  3644.     VxSetVar $form rebindW  $rebindW
  3645. } ;# LeaseOptsBuild
  3646. proc LeaseOptsSaveCB {cbs} {
  3647.     set dialog [keylget cbs dialog]
  3648.     set def_selectRb  [VxGetVar $dialog def_selectRb]
  3649.     set def_days      [VxGetVar $dialog def_days]
  3650.     set def_hours     [VxGetVar $dialog def_hours]
  3651.     set def_mins      [VxGetVar $dialog def_mins]
  3652.     set max_selectRb  [VxGetVar $dialog max_selectRb]
  3653.     set max_days      [VxGetVar $dialog max_days]
  3654.     set max_hours     [VxGetVar $dialog max_hours]
  3655.     set max_mins      [VxGetVar $dialog max_mins]
  3656.     set renewW          [VxGetVar $dialog renewW]
  3657.     set rebindW       [VxGetVar $dialog rebindW]
  3658.     set widgetName [VxGetShortName [VtGetValues $def_selectRb -value]]
  3659.     if {[cequal $widgetName unlimited]} {
  3660.     set lease_dflt infinite
  3661.     } else {
  3662.     keylset time days  [VtGetValues [VxGetVar $def_days text]  -value]
  3663.     keylset time hours [VtGetValues [VxGetVar $def_hours text] -value]
  3664.     keylset time mins  [VtGetValues [VxGetVar $def_mins text]  -value]
  3665.     set lease_dflt [SetTime $time]
  3666.     }
  3667.     if {$lease_dflt  < 3600} {
  3668.     ErrorPush errStack 0 SCO_DHCP_ERR_DEF_LEASE
  3669.     SaDisplayErrorStacks $dialog.err [list $errStack] NOHELP
  3670.     VtUnLock
  3671.     return
  3672.     } else {
  3673.     keylset lease lease_dflt $lease_dflt
  3674.     }
  3675.     set widgetName [VxGetShortName [VtGetValues $max_selectRb -value]]
  3676.     if {[cequal $widgetName unlimited]} {
  3677.     set lease_max infinite
  3678.     } else {
  3679.     keylset time days  [VtGetValues [VxGetVar $max_days text]  -value]
  3680.     keylset time hours [VtGetValues [VxGetVar $max_hours text] -value]
  3681.     keylset time mins  [VtGetValues [VxGetVar $max_mins text]  -value]
  3682.     set lease_max [SetTime $time]
  3683.     }
  3684.     if {$lease_max < 3600} {
  3685.     ErrorPush errStack 0 SCO_DHCP_ERR_MAX_LEASE1
  3686.     SaDisplayErrorStacks $dialog.err [list $errStack] NOHELP
  3687.     VtUnLock
  3688.     return
  3689.     } elseif {$lease_max < $lease_dflt} {
  3690.     ErrorPush errStack 0 SCO_DHCP_ERR_MAX_LEASE2
  3691.     SaDisplayErrorStacks $dialog.err [list $errStack] NOHELP
  3692.     VtUnLock
  3693.     return
  3694.     } else {
  3695.     keylset lease lease_max $lease_max
  3696.     }
  3697.     keylset lease t1 [expr [VtGetValues $renewW -value] * 10]
  3698.     keylset lease t2 [expr [VtGetValues $rebindW -value] * 10]
  3699.     set parent [VxGetVar $dialog parent]
  3700.     VxSetVar $parent lease $lease
  3701.     VxEndFormCB $cbs 
  3702.     VtUnLock
  3703. } ;# LeaseOptsSaveCB
  3704. proc GetTime {value} {
  3705.     if {$value == "infinite"} {
  3706.     set time {}
  3707.     } else {
  3708.     set days  [expr abs($value / (24 * 60 * 60))]
  3709.     set value [expr {$value - ($days * 24 * 60 * 60)}]
  3710.     set hours [expr abs($value / (60 * 60))]
  3711.     set value [expr {$value - ($hours * 60 * 60)}]
  3712.     set mins  [expr abs($value / 60)]
  3713.     keylset time days  $days 
  3714.     keylset time hours $hours 
  3715.     keylset time mins  $mins
  3716.     }
  3717.     return $time
  3718. }
  3719. proc SetTime {time} {
  3720.     set days  [keylget time days]
  3721.     if {![ctype digit $days]} {
  3722.     set days 0
  3723.     }
  3724.     set hours [keylget time hours]
  3725.     if {![ctype digit $hours]} {
  3726.     set hours 0
  3727.     }
  3728.     set mins  [keylget time mins]
  3729.     if {![ctype digit $mins]} {
  3730.     set mins 0
  3731.     }
  3732.     return [expr {($days * 24 * 60 * 60) \
  3733.     + ($hours * 60 * 60) + ($mins * 60)}]
  3734. }
  3735. proc LeaseOptsDefault {} {
  3736.     keylset lease lease_dflt 3600 
  3737.     keylset lease lease_max  infinite 
  3738.     keylset lease t1         750
  3739.     keylset lease t2         900
  3740.     return $lease
  3741. }
  3742. proc LeaseOptsGetLease {entry} {
  3743.     set leaseDefault [LeaseOptsDefault]
  3744.     if {![keylget entry lease_dflt lease_dflt]} {
  3745.     keylget leaseDefault lease_dflt lease_dflt
  3746.     }
  3747.     keylset lease lease_dflt $lease_dflt
  3748.     if {![keylget entry lease_max lease_max]} {
  3749.     keylget leaseDefault lease_max lease_max
  3750.     }
  3751.     keylset lease lease_max $lease_max
  3752.     if {![keylget entry t1 t1]} {
  3753.     keylget leaseDefault t1 t1
  3754.     }
  3755.     keylset lease t1 $t1
  3756.     if {![keylget entry t2 t2]} {
  3757.     keylget leaseDefault t2 t2
  3758.     }
  3759.     keylset lease t2 $t2
  3760.     return $lease
  3761. } ;# LeaseOptsGetLease
  3762. proc LeaseOptsDefineCB {action cbs} {
  3763.     set dialog [keylget cbs dialog]
  3764.     switch $action {
  3765.     add    - 
  3766.     modify     {}
  3767.     default {
  3768.         VtUnLock
  3769.         return
  3770.     }
  3771.     }
  3772.     set form [VtFormDialog $dialog.subnetDlog \
  3773.     -title [IntlLocalizeMsg SCO_DHCP_MSG_SUBNET_LEASE] \
  3774.     -autoLock LeaseOptsSaveCB \
  3775.     -okCallback LeaseOptsSaveCB \
  3776.     -cancelCallback VxEndFormCB \
  3777.     -help \
  3778.     ]
  3779.     LeaseOptsBuild $form
  3780.     set def_selectRb  [VxGetVar $form def_selectRb]
  3781.     set def_limited   [VxGetVar $form def_limited]
  3782.     set def_unlimited [VxGetVar $form def_unlimited]
  3783.     set def_dayLabel  [VxGetVar $form def_dayLabel]
  3784.     set def_days      [VxGetVar $form def_days]
  3785.     set def_hourLabel [VxGetVar $form def_hourLabel]
  3786.     set def_hours     [VxGetVar $form def_hours]
  3787.     set def_minLabel  [VxGetVar $form def_minLabel]
  3788.     set def_mins      [VxGetVar $form def_mins]
  3789.     set max_selectRb  [VxGetVar $form max_selectRb]
  3790.     set max_limited   [VxGetVar $form max_limited]
  3791.     set max_unlimited [VxGetVar $form max_unlimited]
  3792.     set max_dayLabel  [VxGetVar $form max_dayLabel]
  3793.     set max_days      [VxGetVar $form max_days]
  3794.     set max_hourLabel [VxGetVar $form max_hourLabel]
  3795.     set max_hours     [VxGetVar $form max_hours]
  3796.     set max_minLabel  [VxGetVar $form max_minLabel]
  3797.     set max_mins      [VxGetVar $form max_mins]
  3798.     set renewW  [VxGetVar $form renewW]
  3799.     set rebindW   [VxGetVar $form rebindW]
  3800.     set lease [VxGetVar $dialog lease]
  3801.     if {[keylget lease lease_dflt lease_dflt]} {
  3802.     set time [GetTime $lease_dflt]
  3803.     if {[string length $time] == 0} {
  3804.         VtSetValues $def_selectRb  -value $def_unlimited 
  3805.     } else {
  3806.         VtSetValues $def_selectRb  -value $def_limited 
  3807.         VtSetValues [VxGetVar $def_days text] \
  3808.         -value [keylget time days]
  3809.         VtSetValues [VxGetVar $def_hours text] \
  3810.         -value [keylget time hours]
  3811.         VtSetValues [VxGetVar $def_mins text] \
  3812.         -value [keylget time mins]
  3813.     }
  3814.     }
  3815.     if {[keylget lease lease_max lease_max]} {
  3816.     set time [GetTime $lease_max]
  3817.     if  {[string length $time] == 0} {
  3818.         VtSetValues $max_selectRb  -value $max_unlimited 
  3819.     } else {
  3820.         VtSetValues $max_selectRb  -value $max_limited 
  3821.         VtSetValues [VxGetVar $max_days text] \
  3822.         -value [keylget time days]
  3823.         VtSetValues [VxGetVar $max_hours text] \
  3824.         -value [keylget time hours]
  3825.         VtSetValues [VxGetVar $max_mins text] \
  3826.         -value [keylget time mins]
  3827.     }
  3828.     if {[keylget lease t1 t1]} {
  3829.         VtSetValues $renewW -value [expr $t1 / 10]
  3830.     }
  3831.     if {[keylget lease t2 t2]} {
  3832.         VtSetValues $rebindW -value [expr $t2 / 10]
  3833.     }
  3834.     }
  3835.     VtSetValues [VxGetVar $def_days  text] -callback "SaSetFocus next" 
  3836.     VtSetValues [VxGetVar $def_hours text] -callback "SaSetFocus next" 
  3837.     VtSetValues [VxGetVar $def_mins  text] -callback "SaSetFocus next" 
  3838.     VtSetValues [VxGetVar $max_days  text] -callback "SaSetFocus next" 
  3839.     VtSetValues [VxGetVar $max_hours text] -callback "SaSetFocus next" 
  3840.     VtSetValues [VxGetVar $max_mins  text] -callback "SaSetFocus next" 
  3841.     set focusList [list $def_selectRb \
  3842.                 [VxGetVar $def_days text] \
  3843.                 [VxGetVar $def_hours text] \
  3844.                 [VxGetVar $def_mins text] \
  3845.                 $max_selectRb \
  3846.                 [VxGetVar $max_days text] \
  3847.                 [VxGetVar $max_hours text] \
  3848.                 [VxGetVar $max_mins text] \
  3849.                 $renewW \
  3850.                 $rebindW]
  3851.     VxSetVar $form parent $dialog    ;# store parent dialog 
  3852.     VtShow $form
  3853.     SaSetFocusList $form $focusList
  3854.     SaSetTabGroups $form $focusList
  3855.     VtSetFocus $def_selectRb 
  3856.     VtUnLock
  3857. } ;# LeaseOptsDefineCB
  3858. proc PoolConfCB {cbs} {
  3859.     global managedHost NETROOT
  3860.     keylget cbs dialog dialog
  3861.     set parent [VxGetVar $dialog parent]
  3862.     if {[ErrorCatch errStack 0 "MakeCall aasLocation NULL {}" infoList \
  3863.     SCO_DHCP_ERR_AAS_LOCATION] != 0} {
  3864.     SaDisplayErrorStacks $dialog.err [list $errStack] NOHELP
  3865.     VtUnLock
  3866.     return
  3867.     }
  3868.     set info [lindex $infoList 0]
  3869.     keylget info attrList aasInfo
  3870.     set host $managedHost
  3871.     if {[keylget aasInfo aas_remote aas_remote]} {
  3872.     if {$aas_remote} {
  3873.         if {[keylget aasInfo aas_server aas_server] && \
  3874.         [string length $aas_server]} {
  3875.         set host $aas_server
  3876.         }
  3877.     }
  3878.     }
  3879.     set poolNameW [VxGetVar $dialog poolNameW]
  3880.     set poolName  [VtGetValues $poolNameW -value]
  3881.     set exitLabel [IntlLocalizeMsg SCO_DHCP_MSG_RETURN_DHCP]
  3882.     set exitSH    [IntlLocalizeMsg SCO_DHCP_MSG_RETURN_DHCP_SH]
  3883.     set exitMN    [IntlLocalizeMsg SCO_DHCP_MSG_RETURN_DHCP_MN]
  3884.     if {[catch {eval exec $NETROOT/aas/aasGUI -t [list $poolName] -o \
  3885.     -l [list $exitLabel] -h [list $exitSH] -m [list $exitMN] $host} res]} {
  3886.     ErrorPush errStack 0 SCO_DHCP_ERR_AASGUI [list $res]
  3887.     SaDisplayErrorStacks $dialog.err [list $errStack] NOHELP
  3888.     VtUnLock
  3889.     return
  3890.     }
  3891.     if {[string length $res]} {
  3892.     lassign [split $res "\n"] exit pool
  3893.     if {[string length $pool]} {
  3894.         VtSetValues $poolNameW -value $pool
  3895.     }
  3896.     }
  3897.     VtUnLock
  3898. } ;# PoolConfCB
  3899. proc enter_hw_type {} {
  3900. }
  3901. proc MaskSetDefaultCB {cbs} {
  3902.     keylget cbs dialog dialog
  3903.     set subnetW [VxGetVar $dialog subnet ]
  3904.     set maskW [VxGetVar $dialog mask ]
  3905.     set subnet [getIPwidgetValue $subnetW]
  3906.     if {![checkIPaddr $subnet]} {
  3907.     VtUnLock -once
  3908.     return
  3909.     }
  3910.     regexp {([0-9]+)\.([0-9]+)\.([0-9]+)\.([0-9]+)} $subnet addr \
  3911.     a_addr b_addr c_addr d_addr    
  3912.     if {$a_addr != 0} {set a_addr 0xFF}
  3913.     if {$b_addr != 0} {set b_addr 0xFF}
  3914.     if {$c_addr != 0} {set c_addr 0xFF}
  3915.     if {$a_addr != 0} {
  3916.     VtUnLock -once
  3917.     return
  3918.     }
  3919.     set mask [format "%s.%s.%s.%s" $a_addr $b_addr $c_addr $d_addr]
  3920.     setIPwidgetValue $maskW $mask
  3921.     VtUnLock -once
  3922. } ;# MaskSetDefaultCB
  3923. proc ClientSaveCB {action cbs} {
  3924.     global Main
  3925.     switch $action {
  3926.     add -
  3927.     modify {}
  3928.     default {
  3929.         VtUnLock
  3930.         return
  3931.     }
  3932.     }
  3933.     keylget cbs dialog dialog
  3934.     set cIdTypeL    [VxGetVar $dialog cIdTypeL]
  3935.     set cIdTypeW    [VxGetVar $dialog cIdTypeW]
  3936.     set cIdTypeRb   [VxGetVar $dialog cIdTypeRb]
  3937.     set cIdW        [VxGetVar $dialog cIdW]
  3938.     set hwTypeW     [VxGetVar $dialog hwTypeW]
  3939.     set hwAddrW     [VxGetVar $dialog hwAddrW]
  3940.     set commentW    [VxGetVar $dialog commentW] 
  3941.     set clientOptsW [VxGetVar $dialog clientOptsW]
  3942.     set dhcpOptsW   [VxGetVar $dialog dhcpOptsW]
  3943.     set clientOpts [VxGetVar $dialog clientOpts]
  3944.     set options    [VxGetVar $dialog options]
  3945.     set widget [VxGetShortName [VtGetValues $cIdTypeRb -value]]
  3946.     if {[cequal $widget opaque]} {
  3947.     set tag [VtGetValues $cIdW -value]
  3948.     set idType opaque
  3949.     } else {
  3950.     set hwAddr [VtGetValues $hwAddrW -value]
  3951.     set len    [string length $hwAddr]
  3952.     if {$len == 0} {
  3953.         ErrorPush errStack 0 SCO_DHCP_ERR_NO_HARDWARE
  3954.         SaDisplayErrorStacks $dialog.err [list $errStack] NOHELP
  3955.         VtUnLock
  3956.         return
  3957.     }
  3958.     set hwTypeName [VtGetValues $hwTypeW -value]
  3959.     set hwType [FindHwEntry name $hwTypeName]
  3960.     set entry  [GetHwInfo $hwType]
  3961.     if {[string length $entry]} {
  3962.         set hwLen  [keylget entry len]
  3963.         set hwType [keylget entry type]
  3964.         set hwCode [keylget entry code]
  3965.         if {$len != $hwLen} {
  3966.         ErrorPush errStack 0 SCO_DHCP_ERR_BAD_HARDWARE3 "$hwAddr"
  3967.         SaDisplayErrorStacks $dialog.err [list $errStack] NOHELP
  3968.         VtUnLock
  3969.         return
  3970.         }
  3971.         if {![ctype $hwType $hwAddr]} {
  3972.         ErrorPush errStack 0 SCO_DHCP_ERR_BAD_HARDWARE1 "$hwAddr"
  3973.         SaDisplayErrorStacks $dialog.err [list $errStack] NOHELP
  3974.         VtUnLock
  3975.         return
  3976.         }
  3977.     } else {
  3978.         if {![scan $hwTypeName {%d} hwCode]} {
  3979.         ErrorPush errStack 0 SCO_DHCP_ERR_BAD_HARDWARE1 "$hwTypeName"
  3980.         SaDisplayErrorStacks $dialog.err [list $errStack] NOHELP
  3981.         VtUnLock
  3982.         return
  3983.         }
  3984.         if {![ctype xdigit $hwAddr]} {
  3985.         ErrorPush errStack 0 SCO_DHCP_ERR_BAD_HARDWARE2 "$hwAddr"
  3986.         SaDisplayErrorStacks $dialog.err [list $errStack] NOHELP
  3987.         VtUnLock
  3988.         return
  3989.         }
  3990.     }
  3991.     set tag [format "%s_%s" $hwCode $hwAddr]
  3992.     set idType hardware 
  3993.     }
  3994.     set comment [VtGetValues $commentW -value]
  3995.     set opts [list [list comment "$comment"] \
  3996.     [list identifier_type $idType]] 
  3997.     foreach opt [keylkeys clientOpts] {
  3998.     keylget clientOpts $opt value
  3999.     lappend opts [list $opt $value]      
  4000.     }
  4001.     foreach opt [keylkeys options] {
  4002.     keylget options $opt value
  4003.     lappend opts [list $opt $value]      
  4004.     }
  4005.     UpdateEntry $cbs dhcpClient $action $tag $opts 
  4006.     VtUnLock
  4007. } ;# ClientSaveCB
  4008. proc ClientOptSaveCB {cbs} {
  4009.     keylget cbs dialog dialog 
  4010.     set ipAddrW [VxGetVar $dialog ipAddrW]
  4011.     set ipAddr [getIPwidgetValue $ipAddrW]
  4012.     if {[checkIPaddr $ipAddr]} {
  4013.     keylset clientOpts ip_address $ipAddr
  4014.     set parent [VxGetVar $dialog parent]
  4015.     VxSetVar $parent clientOpts $clientOpts
  4016.     VxEndFormCB $cbs
  4017.     } else {
  4018.     ErrorPush errStack 0 SCO_DHCP_ERR_BAD_IP "$ipAddr"
  4019.     SaDisplayErrorStacks $dialog.err [list $errStack] NOHELP
  4020.     }
  4021.     VtUnLock
  4022. } ;# ClientOptSaveCB
  4023. proc ClientOptBuild {form value} {
  4024.     set alform [SaAlignedForm $form.align [list \
  4025.       [list  SCO_DHCP_MSG_IP \
  4026.         [list VtForm \
  4027.         -marginWidth 0 \
  4028.         -marginHeight 0 ] ] ] ]
  4029.     set ipAddrW [VxGetVar $alform widget1]
  4030.     createIPwidget $ipAddrW $value SCO_DHCP_MSG_CLIENT_IP_SH
  4031.     VtSetValues $alform -CHARM_topOffset 1 
  4032.     set sep [VtSeparator $form.sep1 -horizontal \
  4033.            -leftSide FORM -rightSide FORM \
  4034.            -MOTIF_leftOffset -5 -MOTIF_rightOffset -5 \
  4035.            -topSide $alform]
  4036.     set status [SaStatusBar $form.status 0 ]
  4037.     VtSetValues $sep -bottomSide $status -bottomOffset 0
  4038.     VxSetVar $form ipAddrW $ipAddrW 
  4039.     SaSetFocusList $form [list $ipAddrW [VtGetValues $form -ok]]
  4040.     VtSetFocus $ipAddrW 
  4041. } ;# ClientOptBuild
  4042. proc ClientOptCB {action cbs} {
  4043.     keylget cbs dialog dialog
  4044.     set value {}
  4045.     switch $action {
  4046.     add {
  4047.         set title [IntlLocalizeMsg SCO_DHCP_MSG_CLIENT_OPT_ADD]
  4048.     }
  4049.     modify {
  4050.         set title [IntlLocalizeMsg SCO_DHCP_MSG_CLIENT_OPT_MOD]
  4051.         if {[cequal $action modify]} {
  4052.         set clientOpts [VxGetVar $dialog clientOpts]
  4053.         keylget clientOpts ip_address value
  4054.         }
  4055.     }
  4056.     default {
  4057.         VtUnLock
  4058.         return
  4059.     }
  4060.     }
  4061.     set form [VtFormDialog $dialog.clntDlog \
  4062.     -title $title \
  4063.     -okCallback "ClientOptSaveCB" \
  4064.     -autoLock ClientOptSaveCB \
  4065.     -cancelCallback VxEndFormCB \
  4066.     -help \
  4067.     ]
  4068.     if {[cequal $action modify]} {
  4069.     set clientOpts [VxGetVar $dialog clientOpts]
  4070.     keylget clientOpts value value
  4071.     }
  4072.     ClientOptBuild $form $value
  4073.     VxSetVar $form parent $dialog
  4074.     VtShow $form
  4075.     VtUnLock
  4076. } ;# ClientOptCB
  4077. proc ClientIdTypeSensitivityCB {cbs} {
  4078.     keylget cbs dialog dialog
  4079.     set widgetName [VxGetShortName [keylget cbs widget]]
  4080.     if {[cequal $widgetName opaque]} {
  4081.     set opaqueSen 1
  4082.     set hwSen 0
  4083.     } else {
  4084.     set opaqueSen 0
  4085.     set hwSen 1
  4086.     }
  4087.     VtSetSensitive [VxGetVar $dialog cIdL]    $opaqueSen 
  4088.     VtSetSensitive [VxGetVar $dialog cIdW]    $opaqueSen 
  4089.     VtSetSensitive [VxGetVar $dialog hwTypeL] $hwSen
  4090.     VtSetSensitive [VxGetVar $dialog hwTypeW] $hwSen
  4091.     VtSetSensitive [VxGetVar $dialog hwAddrL] $hwSen
  4092.     VtSetSensitive [VxGetVar $dialog hwAddrW] $hwSen
  4093. } ;# ClientIdTypeSensitivity
  4094. proc ClientBuild { form action } {
  4095.     set alform [SaAlignedForm $form.align [list \
  4096.     [list SCO_DHCP_MSG_CLIENT_ID_TYPE \
  4097.         [list VtForm -marginHeight 0 -marginWidth 0] \
  4098.     ] \
  4099.     [list SCO_DHCP_MSG_CLIENT_ID \
  4100.         [list VtText \
  4101.         -callback "SaSetFocus next" \
  4102.         -shortHelpCallback SaShortHelpCB \
  4103.         -shortHelpString \
  4104.             [IntlLocalizeMsg SCO_DHCP_MSG_CLIENT_ID_SH] ] \
  4105.     ] \
  4106.     [list SCO_DHCP_MSG_CLIENT_HW_TYPE \
  4107.         [list VtComboBox \
  4108.         -callback "SaSetFocus next" \
  4109.         -columns 17 \
  4110.         -rows 10 \
  4111.         -readOnly \
  4112.         -itemList [GetHwList] \
  4113.         -shortHelpCallback SaShortHelpCB \
  4114.         -shortHelpString \
  4115.             [IntlLocalizeMsg SCO_DHCP_MSG_CLIENT_HW_TYPE_SH] ] \
  4116.     ] \
  4117.     [list SCO_DHCP_MSG_CLIENT_HW_ADDR \
  4118.         [list VtText \
  4119.         -columns 20 \
  4120.         -callback "SaSetFocus next" \
  4121.         -shortHelpCallback SaShortHelpCB \
  4122.         -shortHelpString \
  4123.             [IntlLocalizeMsg SCO_DHCP_MSG_CLIENT_HW_ADDR_SH]]
  4124.     ] \
  4125.     [list SCO_DHCP_MSG_DESC \
  4126.         [list VtText \
  4127.         -callback "SaSetFocus next" \
  4128.         -shortHelpCallback SaShortHelpCB \
  4129.         -shortHelpString \
  4130.             [IntlLocalizeMsg SCO_DHCP_MSG_CLIENT_DESC_SH] ] \
  4131.     ] \
  4132.     ]]
  4133.     set cIdTypeW [VxGetVar $alform widget1]
  4134.     set cIdTypeL [VxGetVar $alform label1]
  4135.     set cIdW     [VxGetVar $alform widget2]
  4136.     set cIdL     [VxGetVar $alform label2]
  4137.     set hwTypeW  [VxGetVar $alform widget3]
  4138.     set hwTypeL  [VxGetVar $alform label3]
  4139.     set hwAddrW  [VxGetVar $alform widget4]
  4140.     set hwAddrL  [VxGetVar $alform label4]
  4141.     set hwAddrF  [VxGetVar $alform form4]
  4142.     set commentW [VxGetVar $alform widget5]
  4143.     set commentF [VxGetVar $alform form5]
  4144.     set commentL [VxGetVar $alform label5]
  4145.     set cIdTypeRb [VtRadioBox $cIdTypeW.cIdTypeRb  \
  4146.     -numColumns 2 \
  4147.     -rightSide FORM]
  4148.     set opaqueTb [VtToggleButton $cIdTypeRb.opaque \
  4149.     -label [IntlLocalizeMsg SCO_DHCP_MSG_OPAQUE] \
  4150.     -shortHelpCallback SaShortHelpCB \
  4151.     -shortHelpString [IntlLocalizeMsg SCO_DHCP_MSG_CLIENT_OPAQUE_SH]]
  4152.     set hardwareTb [VtToggleButton $cIdTypeRb.hardware \
  4153.     -label [IntlLocalizeMsg SCO_DHCP_MSG_HW] \
  4154.     -set 1 \
  4155.     -shortHelpCallback SaShortHelpCB \
  4156.     -shortHelpString [IntlLocalizeMsg SCO_DHCP_MSG_CLIENT_HW_SH]]
  4157.     if {[cequal $action add]} {
  4158.     VtSetValues $opaqueTb   -callback ClientIdTypeSensitivityCB
  4159.     VtSetValues $hardwareTb -callback ClientIdTypeSensitivityCB
  4160.     }
  4161.     set optionsF [VtFrame $form.optionsF \
  4162.     -topSide $alform \
  4163.     -MOTIF_topOffset 20 \
  4164.     -CHARM_topOffset 1 \
  4165.     -leftSide FORM \
  4166.     -title [IntlLocalizeMsg SCO_DHCP_MSG_OPTIONS]]
  4167.     set optionsForm [VtForm $optionsF.optionsForm]
  4168.     set clientOptsW [VtPushButton $optionsForm.clientOptsW \
  4169.         -label [IntlLocalizeMsg SCO_DHCP_MSG_CLIENT_OPT_BUT] \
  4170.         -topSide FORM \
  4171.         -leftSide FORM \
  4172.         -autoLock ClientOptCB \
  4173.         -callback "ClientOptCB $action" \
  4174.         -shortHelpCallback SaShortHelpCB \
  4175.         -shortHelpString [IntlLocalizeMsg SCO_DHCP_MSG_CLIENT_OPT_BUT_SH]]
  4176.     set dhcpOptsW [VtPushButton $optionsForm.dhcpOptsW \
  4177.         -label [IntlLocalizeMsg SCO_DHCP_MSG_DHCP_OPT_BUT] \
  4178.         -topSide FORM \
  4179.         -leftSide $clientOptsW \
  4180.         -alignTop $clientOptsW \
  4181.         -autoLock OptionsDefineCB \
  4182.         -callback "OptionsDefineCB Client $action" \
  4183.         -shortHelpCallback SaShortHelpCB \
  4184.         -shortHelpString [IntlLocalizeMsg SCO_DHCP_MSG_CLIENT_DHCP_SH]]
  4185.     set sep [VtSeparator $form.sep1 -horizontal \
  4186.            -leftSide FORM -rightSide FORM \
  4187.            -MOTIF_leftOffset -5 -MOTIF_rightOffset -5 \
  4188.            -topSide $optionsForm]
  4189.     set status [SaStatusBar $form.status 0 ]
  4190.     VtSetValues $sep -bottomSide $status -bottomOffset 0
  4191.     VtSetValues $hwTypeW  -rightSide NONE
  4192.     VtSetValues $hwAddrF  -CHARM_topOffset 1
  4193.     VtSetValues $commentF -CHARM_topOffset 1
  4194.     VxSetVar $form cIdTypeW    $cIdTypeW
  4195.     VxSetVar $form cIdTypeRb   $cIdTypeRb
  4196.     VxSetVar $form cIdTypeL    $cIdTypeL
  4197.     VxSetVar $form cIdW           $cIdW
  4198.     VxSetVar $form cIdL           $cIdL
  4199.     VxSetVar $form hwTypeW     $hwTypeW
  4200.     VxSetVar $form hwTypeL     $hwTypeL
  4201.     VxSetVar $form hwAddrW     $hwAddrW
  4202.     VxSetVar $form hwAddrL     $hwAddrL
  4203.     VxSetVar $form commentW    $commentW
  4204.     VxSetVar $form commentL    $commentL
  4205.     VxSetVar $form clientOptsW $clientOptsW 
  4206.     VxSetVar $form dhcpOptsW   $dhcpOptsW 
  4207. } ;# ClientBuild
  4208. proc ClientDefine { action cbs } {
  4209.     set dialog [keylget cbs dialog]
  4210.     switch $action {
  4211.     add {
  4212.         set title [IntlLocalizeMsg SCO_DHCP_MSG_CLIENT_ADD_TITLE]
  4213.     }
  4214.     modify {
  4215.         set title [IntlLocalizeMsg SCO_DHCP_MSG_CLIENT_MOD_TITLE]
  4216.     }
  4217.     default {
  4218.         VtUnLock
  4219.         return
  4220.     }
  4221.     }
  4222.     set form [VtFormDialog $dialog.clntDlog \
  4223.     -title $title \
  4224.     -okCallback "ClientSaveCB $action" \
  4225.     -autoLock ClientSaveCB \
  4226.     -cancelCallback VxEndFormCB \
  4227.     -help \
  4228.     ]
  4229.     ClientBuild $form $action
  4230.     set cIdTypeL    [VxGetVar $form cIdTypeL]
  4231.     set cIdTypeW    [VxGetVar $form cIdTypeW]
  4232.     set cIdTypeRb   [VxGetVar $form cIdTypeRb]
  4233.     set cIdW        [VxGetVar $form cIdW]
  4234.     set hwTypeW     [VxGetVar $form hwTypeW]
  4235.     set hwAddrW     [VxGetVar $form hwAddrW]
  4236.     set commentW    [VxGetVar $form commentW] 
  4237.     set clientOptsW [VxGetVar $form clientOptsW]
  4238.     set dhcpOptsW   [VxGetVar $form dhcpOptsW]
  4239.     if {[cequal $action modify]} {
  4240.         set selPos  [browser:GetSelectedItemPos]
  4241.         set selItem [browser:FindItemParent $selPos]
  4242.     set tag     [lindex $selItem 0]
  4243.     set comment [lindex $selItem 1]
  4244.     set entry   [browser:GetChildren $tag]
  4245.     if {[keylget entry identifier_type identifier_type]} {
  4246.         if {[cequal $identifier_type opaque]} {
  4247.         set widget opaque
  4248.         } else {
  4249.         set widget hardware
  4250.         }
  4251.     } else {
  4252.        set widget hardware
  4253.     }
  4254.     VtSetValues $cIdTypeRb -noCallback -value $widget
  4255.     if {[cequal $widget opaque]} {
  4256.         VtSetValues $cIdW -value $tag
  4257.         VtSetValues $hwTypeW -value {} 
  4258.     } else {
  4259.         lassign [split $tag _] hwCode hwAddr 
  4260.         set hwType [FindHwEntry code $hwCode]
  4261.         set hwInfo [GetHwInfo $hwType] 
  4262.         if {[string length $hwInfo]} {
  4263.         VtSetValues $hwTypeW -value [keylget hwInfo name]
  4264.         } else {
  4265.         VtSetValues $hwTypeW -value $hwCode
  4266.         }
  4267.         VtSetValues $hwAddrW -value $hwAddr
  4268.     }
  4269.     VtSetValues $commentW -value $comment
  4270.     if {[keylget entry ip_address ip_address]} {
  4271.         keylset clientOpts ip_address $ip_address
  4272.     } else {
  4273.         set clientOpts {}
  4274.     }
  4275.     set options [OptionsGetGeneralList $entry] 
  4276.     VtSetSensitive [VxGetVar $form cIdTypeL]   0 
  4277.     VtSetSensitive [VxGetVar $form cIdTypeW]   0 
  4278.     VtSetSensitive [VxGetVar $form cIdL]       0 
  4279.     VtSetSensitive [VxGetVar $form cIdW]       0 
  4280.     VtSetSensitive [VxGetVar $form hwTypeL]    0
  4281.     VtSetSensitive [VxGetVar $form hwTypeW]    0
  4282.     VtSetSensitive [VxGetVar $form hwAddrL]    0
  4283.     VtSetSensitive [VxGetVar $form hwAddrW]    0
  4284.     } else {
  4285.     set clientOpts {}
  4286.     set options {}
  4287.     ClientIdTypeSensitivityCB [list [list dialog $form] \
  4288.         [list widget hardware]]
  4289.     }
  4290.     VxSetVar $form clientOpts $clientOpts
  4291.     VxSetVar $form options $options
  4292.     set focusList [list $cIdW \
  4293.     $hwTypeW \
  4294.     $hwAddrW \
  4295.     $commentW \
  4296.     $clientOptsW \
  4297.     $dhcpOptsW]
  4298.     SaSetFocusList $form $focusList
  4299.     SaSetTabGroups $form $focusList
  4300.     VtShow $form
  4301.     VtSetFocus $cIdW 
  4302.     VtUnLock
  4303. } ;# ClientDefine
  4304. proc ServerSaveCB {cbs} {
  4305.     global Main
  4306.     keylget cbs dialog dialog
  4307.     set lease_timeW      [VxGetVar $dialog lease_timeW]
  4308.     set lease_padW       [VxGetVar $dialog pad_timeW]
  4309.     set address_probeW   [VxGetVar $dialog address_probeW]
  4310.     set option_overloadW [VxGetVar $dialog option_overloadW]
  4311.     set lease_res [VtGetValues $lease_timeW -value]
  4312.     if {[string length  $lease_res] == 0} {
  4313.     set lease_res 1
  4314.     }
  4315.     set lease_res [expr {$lease_res * 60}]
  4316.     set lease_pad [expr [VtGetValues $lease_padW -value] * 10]
  4317.     if {[string length $lease_pad] == 0} {
  4318.     set lease_pad 1
  4319.     }
  4320.     set probe [VxGetShortName [VtGetValues $address_probeW -value]]
  4321.     if {[cequal $probe "yes"]} {
  4322.     set address_probe true 
  4323.     } else {
  4324.     set address_probe false 
  4325.     }
  4326.     set overload [VxGetShortName [VtGetValues $option_overloadW -value]]
  4327.     if {[cequal $overload "yes"]} {
  4328.     set option_overload true 
  4329.     } else {
  4330.     set option_overload false 
  4331.     }
  4332.     keylset serverInfo lease_res $lease_res
  4333.     keylset serverInfo lease_pad $lease_pad
  4334.     keylset serverInfo address_probe $address_probe
  4335.     keylset serverInfo option_overload $option_overload
  4336.     keylset attrList options {}
  4337.     if {[ErrorCatch errStack 0 "MakeCall dhcpServer server \
  4338.     [list $attrList] ObjectRemove" {} SCO_DHCP_ERR_DELETE \
  4339.     "server parameters"] != 0} {
  4340.     SaDisplayErrorStacks $dialog.err [list $errStack] NOHELP
  4341.     VtUnLock
  4342.     return
  4343.     }
  4344.     keylset attrList options $serverInfo 
  4345.     if {[ErrorCatch errStack 0 "MakeCall dhcpServer server \
  4346.     [list $attrList] ObjectAdd" ret SCO_DHCP_ERR_CREATE \
  4347.     "server parameters"] != 0} {
  4348.     SaDisplayErrorStacks $dialog.err [list $errStack] NOHELP
  4349.     VtUnLock
  4350.     return
  4351.     }
  4352.     set ret [lindex $ret 0]
  4353.     SetMenuSensitivityCB [list [list dialog $Main(Dialog)]]
  4354.     VxEndFormCB $cbs
  4355.     set dialog $Main(Dialog)
  4356.     if {[keylget ret attrList attrList] && ($attrList == 1)} {
  4357.         set title [IntlLocalizeMsg SCO_DHCP_MSG_SERVER_UPDATED]
  4358.     } else {
  4359.         set title [IntlLocalizeMsg SCO_DHCP_MSG_SERVER_DEFAULT]
  4360.     }
  4361.     VtShow [VtMessageDialog $dialog.modified \
  4362.         -ok \
  4363.         -message $title]
  4364.     VtUnLock
  4365. } ;# ServerSaveCB
  4366. proc ServerBuild { form serverInfo } {
  4367.     set lease_time [expr [keylget serverInfo lease_res] / 60]
  4368.     set lease_pad  [expr [keylget serverInfo lease_pad] / 10]
  4369.     set alform [SaAlignedForm $form.align [list \
  4370.     [list SCO_DHCP_MSG_SERVER_LEASE \
  4371.         [list VxSpinButton 5 1 "" 60 "" 1 $lease_time {} "" ] \
  4372.     ] \
  4373.     [list SCO_DHCP_MSG_SERVER_PADDING \
  4374.         [list VxSpinButton 5 0 "" 100 "" 5 $lease_pad {} "" ] \
  4375.     ] \
  4376.     [list SCO_DHCP_MSG_SERVER_PROBE \
  4377.         [list VtRadioBox -horizontal \
  4378.         -callback "SaSetFocus next" ]
  4379.     ] \
  4380.     [list SCO_DHCP_MSG_SERVER_OVERLOAD \
  4381.         [list VtRadioBox -horizontal \
  4382.              -callback "SaSetFocus next" ]
  4383.     ] ] ] 
  4384.     VtSetValues $alform -rightSide FORM
  4385.     VtSetValues [VxGetVar $alform form2] -CHARM_topOffset 1
  4386.     VtSetValues [VxGetVar $alform form3] -CHARM_topOffset 1
  4387.     VtSetValues [VxGetVar $alform widget1] -rightSide NONE
  4388.     VtSetValues [VxGetVar $alform widget2] -rightSide NONE
  4389.     set lease_timeW [VxGetVar [VxGetVar $alform widget1] text]
  4390.     VtSetValues $lease_timeW \
  4391.     -callback "SaSetFocus next" \
  4392.     -shortHelpCallback SaShortHelpCB \
  4393.     -shortHelpString [IntlLocalizeMsg SCO_DHCP_MSG_SERVER_LEASE_SH]
  4394.     set pad_timeW [VxGetVar [VxGetVar $alform widget2] text]
  4395.     VtSetValues $pad_timeW \
  4396.     -callback "SaSetFocus next" \
  4397.     -shortHelpCallback SaShortHelpCB \
  4398.     -shortHelpString [IntlLocalizeMsg SCO_DHCP_MSG_SERVER_PADDING_SH]
  4399.     set address_probeW [VxGetVar $alform widget3]
  4400.     set probe_yes [VtToggleButton $address_probeW.yes \
  4401.     -label [IntlLocalizeMsg SCO_DHCP_MSG_YES] \
  4402.     -shortHelpCallback SaShortHelpCB \
  4403.     -shortHelpString [IntlLocalizeMsg SCO_DHCP_MSG_SERVER_PR_YES_SH]]
  4404.     set probe_no [VtToggleButton $address_probeW.no \
  4405.     -label [IntlLocalizeMsg SCO_DHCP_MSG_NO] \
  4406.     -shortHelpCallback SaShortHelpCB \
  4407.     -shortHelpString [IntlLocalizeMsg SCO_DHCP_MSG_SERVER_PR_NO_SH]]
  4408.     set option_overloadW [VxGetVar $alform widget4]
  4409.     set opt_yes [VtToggleButton $option_overloadW.yes \
  4410.     -label [IntlLocalizeMsg SCO_DHCP_MSG_YES] \
  4411.     -shortHelpCallback SaShortHelpCB \
  4412.     -shortHelpString [IntlLocalizeMsg SCO_DHCP_MSG_SERVER_YES_SH]]
  4413.     set opt_no [VtToggleButton $option_overloadW.no \
  4414.     -label [IntlLocalizeMsg SCO_DHCP_MSG_NO] \
  4415.     -shortHelpCallback SaShortHelpCB \
  4416.     -shortHelpString [IntlLocalizeMsg SCO_DHCP_MSG_SERVER_NO_SH]]
  4417.     set sep [VtSeparator $form.sep1 -horizontal \
  4418.            -leftSide FORM -rightSide FORM \
  4419.            -MOTIF_leftOffset -5 -MOTIF_rightOffset -5 \
  4420.            -topSide $alform -MOTIF_topOffset 20 ]
  4421.     set status [SaStatusBar $form.status 0 ]
  4422.     VtSetValues $sep -bottomSide $status -bottomOffset 0
  4423.     VxSetVar $form lease_timeW      $lease_timeW
  4424.     VxSetVar $form pad_timeW        $pad_timeW
  4425.     VxSetVar $form address_probeW   $address_probeW
  4426.     VxSetVar $form option_overloadW $option_overloadW
  4427. } ;# ServerBuild
  4428. proc ServerCB { cbs } {
  4429.     keylget cbs dialog dialog
  4430.     if {[ErrorCatch errStack 0 "GetAllCall dhcpServer [list options]" \
  4431.         entries SCO_DHCP_ERR_GET "server"] != 0} {
  4432.     SaDisplayErrorStacks $dialog.err [list $errStack] NOHELP
  4433.     VtUnLock
  4434.     return
  4435.     }
  4436.     if {[llength $entries]} {
  4437.     set entry [lindex $entries 0]
  4438.     keylget entry instance tag
  4439.     keylget entry attrList attrList
  4440.     keylget attrList options serverInfo
  4441.     } else {
  4442.     set serverInfo {}
  4443.     }
  4444.     if {![llength $serverInfo]} {
  4445.     ErrorPush errStack 0 SCO_DHCP_ERR_NO_SERVER_INFO
  4446.     SaDisplayErrorStacks $dialog.err [list $errStack] NOHELP
  4447.     VtUnLock
  4448.     return
  4449.     }
  4450.     set form [VtFormDialog $dialog.server_Dlog \
  4451.     -title [IntlLocalizeMsg SCO_DHCP_MSG_SERVER_TITLE] \
  4452.     -okCallback ServerSaveCB \
  4453.     -autoLock ServerSaveCB \
  4454.     -cancelCallback VxEndFormCB \
  4455.     -help \
  4456.     ]
  4457.     ServerBuild $form $serverInfo
  4458.     set lease_timeW      [VxGetVar $form lease_timeW]
  4459.     set lease_padW       [VxGetVar $form pad_timeW]
  4460.     set address_probeW   [VxGetVar $form address_probeW]
  4461.     set option_overloadW [VxGetVar $form option_overloadW]
  4462.     if {[cequal [keylget serverInfo address_probe] true]} {
  4463.     VtSetValues $address_probeW -value yes 
  4464.     } else {
  4465.     VtSetValues $address_probeW -value no
  4466.     }
  4467.     if {[cequal [keylget serverInfo option_overload] true]} {
  4468.     VtSetValues $option_overloadW -value $option_overloadW.yes
  4469.     } else {
  4470.     VtSetValues $option_overloadW -value $option_overloadW.no
  4471.     }
  4472.     set focusList [list $lease_timeW $lease_padW \
  4473.        $address_probeW $option_overloadW] 
  4474.     SaSetFocusList $form "$focusList [VtGetValues $form -ok]"
  4475.     SaSetTabGroups $form $focusList
  4476.     VtShow $form
  4477.     VtUnLock
  4478. } ;# ServerCB
  4479. proc AddressSensitivityCB {cbs} {
  4480.     keylget cbs dialog dialog
  4481.     set widgetName [VxGetShortName [keylget cbs widget]]
  4482.     set aasLocationRbW [VxGetVar $dialog aasLocationRbW]
  4483.     set aasHostW       [VxGetVar $dialog aasHostW]
  4484.     set aasHostL       [VxGetVar $dialog aasHostL]
  4485.     set aasPasswordW   [VxGetVar $dialog aasPasswordW]
  4486.     set aasPasswordL   [VxGetVar $dialog aasPasswordL]
  4487.     if {[cequal $widgetName remote]} {
  4488.     set sen 1
  4489.     } else {
  4490.     set sen 0
  4491.     }
  4492.     VtSet $aasHostW     -sensitive $sen
  4493.     VtSet $aasHostL     -sensitive $sen
  4494.     VtSet $aasPasswordW -sensitive $sen
  4495.     VtSet $aasPasswordL -sensitive $sen 
  4496.     VtUnLock
  4497. } ;# AddressSensitivity
  4498. proc AddressSaveCB {cbs} {
  4499.     global Main
  4500.     keylget cbs dialog dialog    
  4501.     set aasLocationRbW [VxGetVar $dialog aasLocationRbW]
  4502.     set aasHostW       [VxGetVar $dialog aasHostW]
  4503.     set aasPasswordW   [VxGetVar $dialog aasPasswordW]
  4504.     set location [VxGetShortName [VtGet $aasLocationRbW -value]]
  4505.     if {[cequal $location remote]} {
  4506.     set aas_remote     1
  4507.     set aas_server   [VtGet $aasHostW -value]
  4508.     set aas_password [VtGet $aasPasswordW -value]
  4509.     } else {
  4510.     set aas_remote     0
  4511.     set aas_server   "" 
  4512.     set aas_password "" 
  4513.     }
  4514.     keylset entry aas_remote    $aas_remote
  4515.     keylset entry aas_server    $aas_server 
  4516.     keylset entry aas_password    $aas_password 
  4517.     if {$aas_remote} {
  4518.     if {![string length $aas_server]} {
  4519.         ErrorPush errStack 0 SCO_DHCP_ERR_NO_SERVER
  4520.         SaDisplayErrorStacks $dialog.err [list $errStack] NOHELP
  4521.         VtUnLock
  4522.         return
  4523.     }
  4524.     if {![string length $aas_password]} {
  4525.         ErrorPush errStack 0 SCO_DHCP_ERR_NO_PASSWORD
  4526.         SaDisplayErrorStacks $dialog.err [list $errStack] NOHELP
  4527.         VtUnLock
  4528.         return
  4529.     }
  4530.     }
  4531.     if {[ErrorCatch errStack 0 "MakeCall aasLocation NULL \
  4532.     {} ObjectDelete" {} SCO_DHCP_ERR_DELETE \
  4533.     [list {Address Allocation Server Location} parameters]] != 0} {
  4534.     SaDisplayErrorStacks $dialog.err [list $errStack] NOHELP
  4535.     VtUnLock
  4536.     return
  4537.     }
  4538.     if {$aas_remote} {
  4539.     if {[ErrorCatch errStack 0 "MakeCall aasLocation NULL \
  4540.         [list $entry] ObjectCreate" {} SCO_DHCP_ERR_CREATE \
  4541.         [list {Address Allocation Server Location} parameters]] != 0} {
  4542.         SaDisplayErrorStacks $dialog.err [list $errStack] NOHELP
  4543.         VtUnLock
  4544.         return
  4545.     }
  4546.     }
  4547.     SetMenuSensitivityCB [list [list dialog $Main(Dialog)]]
  4548.     VxEndFormCB $cbs
  4549.     set dialog $Main(Dialog)
  4550.     VtShow [VtMessageDialog $dialog.modified \
  4551.         -ok \
  4552.         -message [IntlLocalizeMsg SCO_DHCP_MSG_AAS_UPDATED]]
  4553.     VtUnLock
  4554. } ;# AddressSaveCB
  4555. proc AddressBuild { form } {
  4556.     set alform [SaAlignedForm $form.align [list \
  4557.     [list SCO_DHCP_MSG_SERVER_LOC \
  4558.         [list VtRadioBox \
  4559.         -horizontal] \
  4560.     ] \
  4561.     [list SCO_DHCP_MSG_SERVER_HOST \
  4562.         [list VtText \
  4563.         -callback "SaSetFocus next" \
  4564.         -columns 18 \
  4565.         -shortHelpCallback SaShortHelpCB \
  4566.         -shortHelpString \
  4567.             [IntlLocalizeMsg SCO_DHCP_MSG_SERVER_HOST_SH]] \
  4568.     ] \
  4569.     [list SCO_DHCP_MSG_SERVER_PASSWORD \
  4570.         [list VtText \
  4571.         -callback "SaSetFocus next" \
  4572.         -columns 10 \
  4573.         -noEcho \
  4574.         -shortHelpCallback SaShortHelpCB \
  4575.         -shortHelpString \
  4576.             [IntlLocalizeMsg SCO_DHCP_MSG_SERVER_PASSWORD_SH] ] \
  4577.     ] \
  4578.     ]]
  4579.     VtSetValues $alform -rightSide FORM
  4580.     set aasLocationRbW [VxGetVar $alform widget1]
  4581.     set aasHostW       [VxGetVar $alform widget2]
  4582.     set aasHostL       [VxGetVar $alform label2]
  4583.     set aasPasswordW   [VxGetVar $alform widget3]
  4584.     set aasPasswordL   [VxGetVar $alform label3]
  4585.     VtToggleButton $aasLocationRbW.local \
  4586.     -label [IntlLocalizeMsg SCO_DHCP_MSG_LOCAL] \
  4587.     -callback AddressSensitivityCB \
  4588.     -shortHelpCallback SaShortHelpCB \
  4589.     -shortHelpString [IntlLocalizeMsg SCO_DHCP_MSG_SERVER_LOCAL_SH]
  4590.     VtToggleButton $aasLocationRbW.remote \
  4591.     -label [IntlLocalizeMsg SCO_DHCP_MSG_REMOTE] \
  4592.     -callback AddressSensitivityCB \
  4593.     -shortHelpCallback SaShortHelpCB \
  4594.     -shortHelpString [IntlLocalizeMsg SCO_DHCP_MSG_SERVER_REMOTE_SH]
  4595.     VxSetVar $form aasLocationRbW $aasLocationRbW
  4596.     VxSetVar $form aasHostW       $aasHostW
  4597.     VxSetVar $form aasHostL       $aasHostL
  4598.     VxSetVar $form aasPasswordW   $aasPasswordW
  4599.     VxSetVar $form aasPasswordL   $aasPasswordL
  4600.     set sep [VtSeparator $form.sep1 -horizontal \
  4601.     -leftSide FORM -rightSide FORM \
  4602.     -MOTIF_leftOffset -5 -MOTIF_rightOffset -5 \
  4603.     -topSide $alform -MOTIF_topOffset 20 ]
  4604.     set status [SaStatusBar $form.status 0 ]
  4605.     VtSetValues $sep -bottomSide $status -bottomOffset 0
  4606. } ;# AddressBuild
  4607. proc AddressCB { cbs } {
  4608.     keylget cbs dialog dialog
  4609.     if {[ErrorCatch errStack 0 "MakeCall aasLocation NULL {}" infoList \
  4610.     SCO_DHCP_ERR_AAS_LOCATION] != 0} {
  4611.     SaDisplayErrorStacks $dialog.err [list $errStack] NOHELP
  4612.     VtUnLock
  4613.     return
  4614.     }
  4615.     set info [lindex $infoList 0]
  4616.     keylget info attrList aasInfo
  4617.     set form [VtFormDialog $dialog.server_Dlog \
  4618.     -title [IntlLocalizeMsg SCO_DHCP_MSG_ADDRESS_TITLE] \
  4619.     -okCallback AddressSaveCB \
  4620.     -autoLock AddressSaveCB \
  4621.     -cancelCallback VxEndFormCB \
  4622.     -help \
  4623.     ]
  4624.     AddressBuild $form
  4625.     set aasLocationRbW [VxGetVar $form aasLocationRbW]
  4626.     set aasHostW       [VxGetVar $form aasHostW]
  4627.     set aasPasswordW   [VxGetVar $form aasPasswordW]
  4628.     if {[keylget aasInfo aas_remote aas_remote]} {
  4629.     if {$aas_remote} {
  4630.         VtSetValues $aasLocationRbW -value remote
  4631.     } else {
  4632.         VtSetValues $aasLocationRbW -value local
  4633.     } 
  4634.     } else {
  4635.     VtSetValues $aasLocationRbW -value local
  4636.     }
  4637.     if {[keylget aasInfo aas_server aas_server]} {
  4638.     VtSetValues $aasHostW -value $aas_server
  4639.     } else {
  4640.     VtSetValues $aasHostW -value "" 
  4641.     }
  4642.     if {[keylget aasInfo aas_password aas_password]} {
  4643.     VtSetValues $aasPasswordW -value $aas_password
  4644.     } else {
  4645.     VtSetValues $aasPasswordW -value "" 
  4646.     }
  4647.     set focusList [list $aasLocationRbW $aasHostW $aasPasswordW]
  4648.     SaSetFocusList $form "$focusList [VtGetValues $form -ok]"
  4649.     SaSetTabGroups $form $focusList
  4650.     VtShow $form
  4651.     VtUnLock
  4652. } ;# AddressCB
  4653. proc addmodCB { action cbs } {
  4654.     switch $action {
  4655.     add - 
  4656.     modify {}
  4657.     default {
  4658.         VtUnLock
  4659.         return
  4660.     }
  4661.     }
  4662.     keylget cbs dialog dialog
  4663.     set viewSubnet [VxGetVar $dialog subnet]
  4664.     set viewClient [VxGetVar $dialog client]
  4665.     set viewUser   [VxGetVar $dialog user_class]
  4666.     set viewVendor [VxGetVar $dialog vendor_class]
  4667.     set viewGlobal [VxGetVar $dialog global]
  4668.     set viewOption [VxGetVar $dialog option]
  4669.     if {[VtGetValues $viewSubnet -set]} { 
  4670.     SubnetDefine $action $cbs 
  4671.     } elseif {[VtGetValues $viewClient -set]} { 
  4672.     ClientDefine $action $cbs 
  4673.     } elseif {[VtGetValues $viewUser -set]} { 
  4674.     UserDefine $action $cbs 
  4675.     } elseif {[VtGetValues $viewVendor -set]} { 
  4676.     VendorDefine $action $cbs 
  4677.     } elseif {[VtGetValues $viewGlobal -set]} {
  4678.     GlobalDefine $action $cbs
  4679.     } elseif {[VtGetValues $viewOption -set]} {
  4680.     UserDefinedOptDefine $action $cbs
  4681.     } else {
  4682.     VtUnLock
  4683.     }
  4684. } ;# addmodCB
  4685. proc ViewCB { type cbs } {
  4686.     global Main managedHost
  4687.     keylget cbs dialog dialog    ;# dialog is Main(Dialog)
  4688.     set mainListW   [VxGetVar $dialog mainListW]
  4689.     set viewSubnet [VxGetVar $dialog subnet]
  4690.     set viewClient [VxGetVar $dialog client]
  4691.     set viewUser   [VxGetVar $dialog user_class]
  4692.     set viewVendor [VxGetVar $dialog vendor_class]
  4693.     set viewGlobal [VxGetVar $dialog global]
  4694.     set viewOption [VxGetVar $dialog option]
  4695.     set modeWidget  [VxGetVar $dialog modeWidget]
  4696.     set objAdd      [VxGetVar $dialog add]
  4697.     VtSetValues $viewSubnet -set 0
  4698.     VtSetValues $viewClient -set 0
  4699.     VtSetValues $viewUser   -set 0
  4700.     VtSetValues $viewVendor -set 0
  4701.     VtSetValues $viewGlobal -set 0
  4702.     VtSetValues $viewOption -set 0
  4703.     set data {
  4704.     {{{STRING 20} {STRING 55} {DATA} {DATA}} 
  4705.      {{STRING 20} {STRING 55} {DATA} {DATA}} 
  4706.      monoBoldFont 
  4707.     }
  4708.     {{{STRING 20 60 10} {STRING 55} {DATA} {DATA}} 
  4709.      {{STRING 20 5 5} {STRING 55} {DATA} {DATA}} 
  4710.      monoNormalFont
  4711.     }
  4712.     }
  4713.     browser:DeleteAll
  4714.     browser:Init $mainListW $data
  4715.     switch $type {
  4716.     Subnet { 
  4717.         VtSetValues $viewSubnet -set 1
  4718.         VtSetValues $modeWidget \
  4719.         -label [IntlLocalizeMsg SCO_DHCP_MSG_SUBNET_MODE \
  4720.         $managedHost]
  4721.         VtSetValues $objAdd \
  4722.         -shortHelpString [IntlLocalizeMsg SCO_DHCP_MSG_SUBNET_SH]
  4723.     }
  4724.     Client { 
  4725.         VtSetValues $viewClient -set 1
  4726.         VtSetValues $modeWidget \
  4727.         -label [IntlLocalizeMsg SCO_DHCP_MSG_CLIENT_MODE \
  4728.         $managedHost]
  4729.         VtSetValues $objAdd \
  4730.         -shortHelpString [IntlLocalizeMsg SCO_DHCP_MSG_CLIENT_SH]
  4731.     }
  4732.     UserClass {
  4733.         VtSetValues $viewUser -set 1
  4734.         VtSetValues $modeWidget \
  4735.         -label [IntlLocalizeMsg SCO_DHCP_MSG_USER_MODE $managedHost]
  4736.         VtSetValues $objAdd \
  4737.         -shortHelpString [IntlLocalizeMsg SCO_DHCP_MSG_USER_SH]
  4738.     }
  4739.     VendorClass {
  4740.         VtSetValues $viewVendor -set 1
  4741.         VtSetValues $modeWidget \
  4742.         -label [IntlLocalizeMsg SCO_DHCP_MSG_VENDOR_MODE \
  4743.         $managedHost]
  4744.         VtSetValues $objAdd \
  4745.         -shortHelpString [IntlLocalizeMsg SCO_DHCP_MSG_VENDOR_SH]
  4746.     }
  4747.     Global {
  4748.         VtSetValues $viewGlobal -set 1
  4749.         VtSetValues $modeWidget \
  4750.         -label [IntlLocalizeMsg SCO_DHCP_MSG_GLOBAL_MODE \
  4751.         $managedHost]
  4752.         VtSetValues $objAdd \
  4753.         -shortHelpString [IntlLocalizeMsg SCO_DHCP_MSG_GLOBAL_SH]
  4754.     }
  4755.     Option {
  4756.         VtSetValues $viewOption -set 1
  4757.         VtSetValues $modeWidget \
  4758.         -label [IntlLocalizeMsg SCO_DHCP_MSG_OPTION_MODE \
  4759.         $managedHost]
  4760.         VtSetValues $objAdd \
  4761.         -shortHelpString [IntlLocalizeMsg SCO_DHCP_MSG_OPTION_SH]
  4762.     }
  4763.     default {
  4764.         VtUnLock
  4765.         return
  4766.     }
  4767.     }
  4768.     set osa_type [format "dhcp%s" $type]
  4769.     if {[ErrorCatch errStack 0 "GetAllCall $osa_type [list options]" \
  4770.         entries SCO_DHCP_ERR_GET "$type"] != 0} {
  4771.     SaDisplayErrorStacks $dialog.err [list $errStack] NOHELP
  4772.     VtUnLock
  4773.     return
  4774.     }
  4775.     foreach entry $entries {
  4776.     keylget entry instance tag
  4777.     keylget entry attrList attrList
  4778.     keylget attrList options options
  4779.     if {[cequal $type Global]} {
  4780.         foreach key [keylkeys options] {
  4781.         keylget options $key val
  4782.         browser:SetDisplayEntry $key [list $key "$val"] {} 
  4783.         }
  4784.     } else {
  4785.         set comment {}
  4786.         keylget options comment comment
  4787.         browser:SetDisplayEntry $tag [list $tag "$comment"] $options
  4788.     }
  4789.     }
  4790.     browser:ReDisplay
  4791.     SetMenuSensitivityCB $cbs
  4792.     VtUnLock
  4793. } ;# ViewCB
  4794. proc SetMenuSensitivityCB {cbs} {
  4795.     set dialog [keylget cbs dialog]    ;# dialog is Main(Dialog)
  4796.     set objMod  [VxGetVar $dialog modify]
  4797.     set objDel  [VxGetVar $dialog delete]
  4798.     set pos [browser:GetSelectedItemPos]
  4799.     if {$pos == 0} {
  4800.     VtSetSensitive $objMod 0
  4801.     VtSetSensitive $objDel 0
  4802.     } else {
  4803.     VtSetSensitive $objMod 1
  4804.     VtSetSensitive $objDel 1
  4805.     }
  4806.     browser:SetSensitivity $dialog
  4807.     VtUnLock -once
  4808. }
  4809. proc BuildMenu {} {
  4810.     global Main managedHost NO_OPEN
  4811.     set UpperMenu [VtMenuBar $Main(Dialog).uppermenu \
  4812.     -helpMenuItemList [SaHelpGetOptionsList] \
  4813.     ]
  4814.     set hostMenu [VtPulldown $UpperMenu.hostMenu \
  4815.        -label [IntlLocalizeMsg SCO_DHCP_MSG_HOST] \
  4816.     -mnemonic [IntlLocalizeMsg SCO_DHCP_MSG_HOST_MN]]
  4817.     if {! [info exists NO_OPEN]} {
  4818.     VtPushButton $hostMenu.openHost \
  4819.         -mnemonic [IntlLocalizeMsg SCO_DHCP_MSG_OPEN_HOST_MN] \
  4820.         -label [IntlLocalizeMsg SCO_DHCP_MSG_OPEN_HOST] \
  4821.         -shortHelpString  [IntlLocalizeMsg SCO_DHCP_MSG_OPEN_HOST_SH] \
  4822.         -shortHelpCallback SaShortHelpCB \
  4823.         -callback SaOpenHostCB -autoLock SaOpenHostCB
  4824.     VtSeparator $hostMenu.separator
  4825.     }
  4826.     VtPushButton $hostMenu.exit \
  4827.     -label [IntlLocalizeMsg SCO_DHCP_MSG_EXIT] \
  4828.     -mnemonic [IntlLocalizeMsg SCO_DHCP_MSG_EXIT_MN] \
  4829.     -shortHelpCallback SaShortHelpCB \
  4830.     -shortHelpString [IntlLocalizeMsg SCO_DHCP_MSG_EXIT_SH] \
  4831.     -callback ClosePrgCB
  4832.     set objMenu [VtPulldown $UpperMenu.objMenu \
  4833.     -label [IntlLocalizeMsg SCO_DHCP_MSG_MENU_OBJECT] \
  4834.     -mnemonic [IntlLocalizeMsg SCO_DHCP_MSG_MENU_OBJECT_MN]]
  4835.     set objAdd [VtPushButton $objMenu.oadd \
  4836.     -label [IntlLocalizeMsg SCO_DHCP_MSG_MENU_ADD] \
  4837.     -mnemonic [IntlLocalizeMsg SCO_DHCP_MSG_MENU_ADD_MN] \
  4838.     -shortHelpString [IntlLocalizeMsg SCO_DHCP_MSG_SUBNET_SH] \
  4839.     -shortHelpCallback SaShortHelpCB \
  4840.     -autoLock addmodCB \
  4841.     -callback "addmodCB add" ]
  4842.     set objModify [VtPushButton $objMenu.modify \
  4843.     -label [IntlLocalizeMsg SCO_DHCP_MSG_MODIFY] \
  4844.     -mnemonic [IntlLocalizeMsg SCO_DHCP_MSG_MODIFY_MN] \
  4845.     -shortHelpCallback SaShortHelpCB \
  4846.     -shortHelpString [IntlLocalizeMsg SCO_DHCP_MSG_MENU_MOD_SH] \
  4847.     -autoLock addmodCB \
  4848.     -callback "addmodCB modify"]
  4849.     set objDelete [VtPushButton $objMenu.delete \
  4850.     -label [IntlLocalizeMsg SCO_DHCP_MSG_DELETE] \
  4851.     -mnemonic [IntlLocalizeMsg SCO_DHCP_MSG_DELETE_MN] \
  4852.     -shortHelpCallback SaShortHelpCB \
  4853.     -shortHelpString [IntlLocalizeMsg SCO_DHCP_MSG_MENU_DEL_SH] \
  4854.     -callback DeleteCB \
  4855.     -autoLock DeleteCB ]
  4856.     set viewMenu [VtPulldown $UpperMenu.viewMenu \
  4857.     -label [IntlLocalizeMsg SCO_DHCP_MSG_MENU_VIEW] \
  4858.     -mnemonic [IntlLocalizeMsg SCO_DHCP_MSG_MENU_VIEW_MN]]
  4859.     set viewSubnet [VtToggleButton $viewMenu.subnet \
  4860.     -label [IntlLocalizeMsg SCO_DHCP_MSG_MENU_SUBNETS] \
  4861.     -mnemonic [IntlLocalizeMsg SCO_DHCP_MSG_MENU_SUBNETS_MN] \
  4862.     -set 1 \
  4863.     -shortHelpString [IntlLocalizeMsg SCO_DHCP_MSG_MENU_SUBNETS_SH]\
  4864.     -shortHelpCallback SaShortHelpCB \
  4865.     -autoLock ViewCB \
  4866.     -callback "ViewCB Subnet"]
  4867.     set viewClient [VtToggleButton $viewMenu.client \
  4868.     -label [IntlLocalizeMsg SCO_DHCP_MSG_MENU_CLIENTS] \
  4869.     -mnemonic [IntlLocalizeMsg SCO_DHCP_MSG_MENU_CLIENTS_MN] \
  4870.     -shortHelpString [IntlLocalizeMsg SCO_DHCP_MSG_MENU_CLIENTS_SH]\
  4871.     -shortHelpCallback SaShortHelpCB \
  4872.     -autoLock ViewCB \
  4873.     -callback "ViewCB Client"]
  4874.     set viewUser [VtToggleButton $viewMenu.user \
  4875.     -label [IntlLocalizeMsg SCO_DHCP_MSG_MENU_USERS] \
  4876.     -mnemonic [IntlLocalizeMsg SCO_DHCP_MSG_MENU_USERS_MN] \
  4877.     -shortHelpString [IntlLocalizeMsg SCO_DHCP_MSG_MENU_USERS_SH] \
  4878.     -shortHelpCallback SaShortHelpCB \
  4879.     -autoLock ViewCB \
  4880.     -callback "ViewCB UserClass"]
  4881.     set viewVendor [VtToggleButton $viewMenu.vendor \
  4882.     -label [IntlLocalizeMsg SCO_DHCP_MSG_MENU_VENDORS] \
  4883.     -mnemonic [IntlLocalizeMsg SCO_DHCP_MSG_MENU_VENDORS_MN] \
  4884.     -shortHelpString [IntlLocalizeMsg SCO_DHCP_MSG_MENU_VENDORS_SH]\
  4885.     -shortHelpCallback SaShortHelpCB \
  4886.     -autoLock ViewCB \
  4887.     -callback "ViewCB VendorClass"]
  4888.     VtSeparator $viewMenu.sep1
  4889.     set viewGlobal [VtToggleButton $viewMenu.global \
  4890.     -label [IntlLocalizeMsg SCO_DHCP_MSG_MENU_GLOBAL] \
  4891.     -mnemonic [IntlLocalizeMsg SCO_DHCP_MSG_MENU_GLOBAL_MN] \
  4892.     -shortHelpCallback SaShortHelpCB \
  4893.     -shortHelpString [IntlLocalizeMsg SCO_DHCP_MSG_MENU_GLOBAL_SH] \
  4894.     -autoLock ViewCB \
  4895.     -callback "ViewCB Global"]
  4896.     set viewOption [VtToggleButton $viewMenu.option \
  4897.     -label [IntlLocalizeMsg SCO_DHCP_MSG_MENU_USER_OPTS] \
  4898.     -mnemonic [IntlLocalizeMsg SCO_DHCP_MSG_MENU_USER_OPTS_MN] \
  4899.     -shortHelpCallback SaShortHelpCB \
  4900.     -shortHelpString [IntlLocalizeMsg SCO_DHCP_MSG_MENU_USER_OPTS_SH] \
  4901.     -autoLock ViewCB \
  4902.     -callback "ViewCB Option"]
  4903.     VtSeparator $viewMenu.sep2
  4904.     browser:MenuOpts "SCO_DHCP" $viewMenu $Main(Dialog)
  4905.     set serverMenu [VtPulldown $UpperMenu.serverMenu \
  4906.     -label [IntlLocalizeMsg SCO_DHCP_MSG_MENU_SERVER] \
  4907.     -mnemonic [IntlLocalizeMsg SCO_DHCP_MSG_MENU_SERVER_MN]]
  4908.     set optServer [VtPushButton $serverMenu.server \
  4909.     -label [IntlLocalizeMsg SCO_DHCP_MSG_MENU_SERVER_PARAMETERS] \
  4910.     -mnemonic [IntlLocalizeMsg SCO_DHCP_MSG_MENU_SERVER_PARAMETERS_MN] \
  4911.     -shortHelpCallback SaShortHelpCB \
  4912.     -shortHelpString \
  4913.         [IntlLocalizeMsg SCO_DHCP_MSG_MENU_SERVER_PARAMETERS_SH] \
  4914.     -autoLock ServerCB \
  4915.      -callback ServerCB]
  4916.     set optAddress [VtPushButton $serverMenu.address \
  4917.     -label [IntlLocalizeMsg SCO_DHCP_MSG_MENU_ADDRESS] \
  4918.     -mnemonic [IntlLocalizeMsg SCO_DHCP_MSG_MENU_ADDRESS_MN] \
  4919.     -shortHelpCallback SaShortHelpCB \
  4920.     -shortHelpString [IntlLocalizeMsg SCO_DHCP_MSG_MENU_ADDRESS_SH]\
  4921.     -autoLock AddressCB \
  4922.      -callback AddressCB ]
  4923.     set optionsMenu [VtPulldown $UpperMenu.optionsMenu \
  4924.     -label [IntlLocalizeMsg SCO_DHCP_MSG_MENU_OPTIONS] \
  4925.     -mnemonic [IntlLocalizeMsg SCO_DHCP_MSG_MENU_OPTIONS_MN]]
  4926.     set pointHelp [SaShortHelpMenuOptions $optionsMenu]
  4927.     set modeWidget [VtLabel $Main(Dialog).mode \
  4928.     -MOTIF_leftOffset 4 -MOTIF_topOffset 20 \
  4929.     -label [IntlLocalizeMsg SCO_DHCP_MSG_SUBNET_MODE "$managedHost"]]
  4930.     VxSetVar $Main(Dialog) subnet       $viewSubnet
  4931.     VxSetVar $Main(Dialog) client       $viewClient
  4932.     VxSetVar $Main(Dialog) user_class   $viewUser
  4933.     VxSetVar $Main(Dialog) vendor_class $viewVendor
  4934.     VxSetVar $Main(Dialog) global       $viewGlobal
  4935.     VxSetVar $Main(Dialog) option       $viewOption
  4936.     VxSetVar $Main(Dialog) add      $objAdd
  4937.     VxSetVar $Main(Dialog) modify   $objModify
  4938.     VxSetVar $Main(Dialog) delete   $objDelete
  4939.     VxSetVar $Main(Dialog) modeWidget    $modeWidget
  4940. } ;# BuildMenu
  4941. proc BuildMainList {} {
  4942.     global Main
  4943.     set mainListW [VtDrawnList $Main(Dialog).list \
  4944.     -horizontalScrollBar TRUE \
  4945.     -rows 13 \
  4946.     -selection SINGLE \
  4947.     -MOTIF_leftOffset 4 -MOTIF_rightOffset 4 \
  4948.     -CHARM_rows 12 \
  4949.     -formatList {{STRING 20} {STRING 55}} \
  4950.     -callback SetMenuSensitivityCB \
  4951.     -defaultCallback browser:ExpandCollapseCB \
  4952.     -autoLock {SetMenuSensitivityCB browser:ExpandCollapseCB} \
  4953.     -leftSide FORM -rightSide FORM]
  4954.     VxSetVar $Main(Dialog) mainListW $mainListW
  4955.     set statusBarW [SaStatusBar $Main(Dialog).statusBar 1]
  4956.     VtSetValues $mainListW -bottomSide $statusBarW
  4957. } ;# BuildMainList
  4958. proc ClosePrgCB {cbs} {
  4959.     VtUnLock
  4960.     VtClose
  4961.     exit 0
  4962. }
  4963. proc dhcpGUI {} {
  4964.     global Main managedHost
  4965.     set dhcpConf [VtOpen dhcpConf dhcpGUI]
  4966.     InitHwInfo
  4967.     InitOptTypes
  4968.     VtSetAppValues $dhcpConf \
  4969.     -versionString [IntlLocalizeMsg SCO_DHCP_MSG_VERSION \
  4970.     $Main(versionNumber)]
  4971.     set shortHostname [SaHostExtractSystemName $managedHost]
  4972.     set Main(Dialog) [VtFormDialog $dhcpConf.mainD \
  4973.     -title [IntlLocalizeMsg SCO_DHCP_MSG_TITLE "$shortHostname"] \
  4974.     -wmShadowThickness 0 \
  4975.     -wmCloseCallback ClosePrgCB \
  4976.     -marginHeight 0 -marginWidth 0]
  4977.     VtLock
  4978.     BuildMenu
  4979.     BuildMainList
  4980.     SaCharmSetMaxFormDimensions $Main(Dialog)
  4981.     VtShow $Main(Dialog)
  4982.     if {[id userid] != 0 && !([isOwner] && [isOwner -host $managedHost])} then {
  4983.     SaDisplayNoAuths $Main(Dialog).noAuthBox \
  4984.         [IntlLocalizeMsg SCO_DHCP_MSG_APP_TITLE] \
  4985.         ClosePrgCB $managedHost
  4986.     }
  4987.     set statusBar [VxGetVar $Main(Dialog) statusBar]
  4988.     SaStatusBarSet $statusBar [IntlLocalizeMsg SCO_DHCP_MSG_WAIT]
  4989.     ViewCB Subnet [list [list dialog $Main(Dialog)]]
  4990.     SaStatusBarClear $statusBar
  4991.     VtUnLock
  4992. } ;# dhcpGUI
  4993. while {! [lempty $argv]} {
  4994.     set arg [lvarpop argv]
  4995.     if {! [lempty $arg]} {
  4996.     switch -- $arg {
  4997.         -n      { set NO_OPEN 1 }
  4998.         default { lvarpush argv $arg
  4999.         break
  5000.         }
  5001.     }
  5002.     }
  5003. }
  5004. if {[catch {exec /bin/uname -r} OS]} {
  5005.     set OS 4
  5006. }
  5007. switch -exact $OS {
  5008.     3.2 {
  5009.     set SA_LIB_DIR /etc/sysadm.d/lib
  5010.     set patchArea {__SSO_ID_ST@SCO:Unix:5.0.4Eb            @SSO_ID_END__}
  5011.     set NETROOT [SSO_GetSegmentRootPath SHARED $patchArea]/sa
  5012.     }
  5013.     default {
  5014.     set SA_LIB_DIR /usr/lib
  5015.     set patchArea {}
  5016.     set NETROOT    /usr/lib/scoadmin
  5017.     }
  5018. loadlibindex ${SA_LIB_DIR}/sysadm.tlib
  5019. set Main(versionNumber) [SaGetSSOVersion $patchArea] 
  5020. set managedHost [GetManagedHost]
  5021. ErrorTopLevelCatch dhcpGUI [IntlLocalizeMsg SCO_DHCP_MSG_APP_TITLE]
  5022. VtMainLoop
  5023.