summaryrefslogtreecommitdiff
path: root/support/dktools/itadhcp.c
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /support/dktools/itadhcp.c
Initial commit
Diffstat (limited to 'support/dktools/itadhcp.c')
-rw-r--r--support/dktools/itadhcp.c1161
1 files changed, 1161 insertions, 0 deletions
diff --git a/support/dktools/itadhcp.c b/support/dktools/itadhcp.c
new file mode 100644
index 0000000000..45e6ca8ba5
--- /dev/null
+++ b/support/dktools/itadhcp.c
@@ -0,0 +1,1161 @@
+/*
+ WARNING: This file was generated by dkct.
+ Changes you make here will be lost if dkct is run again!
+ You should modify the original source and run dkct on it.
+ Original source: itadhcp.ctr
+*/
+
+/*
+Copyright (C) 2012-2017, Dirk Krause
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+* Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the above opyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of the author nor the names of contributors may be used
+ to endorse or promote products derived from this software without specific
+ prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS''
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED.
+IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/** @file itadhcp.c The itadhcp module.
+*/
+
+
+#line 10 "itadhcp.ctr"
+
+#include "dk3all.h"
+#include "itadmin.h"
+
+
+
+
+#line 16 "itadhcp.ctr"
+
+
+
+/** Keywords used by the module.
+*/
+static char const * const itadmin_dhcp_c8_kw[] = {
+/* 0 */
+"dhcpd.conf",
+
+/* 1 */
+" ",
+
+/* 2 */
+"option:",
+
+/* 3 */
+"option ",
+
+/* 4 */
+"not ",
+
+/* 5 */
+"w",
+
+/* 6 */
+"class \"",
+
+/* 7 */
+"\" { match hardware; }",
+
+/* 8 */
+"subclass \"",
+
+/* 9 */
+"\" 1:",
+
+/* 10 */
+";",
+
+/* 11 */
+"# ",
+
+/* 12 */
+"shared-network dhcpnet",
+
+/* 13 */
+"{",
+
+/* 14 */
+"}",
+
+/* 15 */
+"subnet ",
+
+/* 16 */
+" netmask ",
+
+/* 17 */
+"option routers\t\t",
+
+/* 18 */
+"option subnet-mask\t\t",
+
+/* 19 */
+"option broadcast-address\t",
+
+/* 20 */
+"pool",
+
+/* 21 */
+"range ",
+
+/* 22 */
+"allow unknown clients;",
+
+/* 23 */
+"deny unknown clients;",
+
+/* 24 */
+"allow members of \"",
+
+/* 25 */
+"deny members of \"",
+
+/* 26 */
+"\";",
+
+/* 27 */
+"group",
+
+/* 28 */
+"host ",
+
+/* 29 */
+"option host-name\t\"",
+
+/* 30 */
+"hardware ethernet\t",
+
+/* 31 */
+"fixed-address\t",
+
+/* 32 */
+"\n# ##### ITADMIN_POINT_1: After options, before classes\n\n",
+
+/* 33 */
+"\n# ##### ITADMIN_POINT_2: After classes, before VLAN\n\n",
+
+/* 34 */
+"option space MSFT;\n",
+
+/* 35 */
+"option MSFT.release-dhcp-lease-on-shutdown code 2 = unsigned integer 32;\n\n",
+
+/* 36 */
+"if substring (option vendor-class-identifier, 0, 4) = \"MSFT\" {\n",
+
+/* 37 */
+" option MSFT.release-dhcp-lease-on-shutdown 1;\n",
+
+/* 38 */
+" vendor-option-space MSFT;\n",
+
+/* 39 */
+"}\n",
+
+NULL
+
+
+#line 172 "itadhcp.ctr"
+};
+
+
+
+
+/** Option names requiring special treatment.
+*/
+static char const * const itadmin_dhcp_option_names[] = {
+/* 0 */
+"authorative",
+
+NULL
+
+
+#line 183 "itadhcp.ctr"
+};
+
+
+
+
+
+/** Indent line.
+ @param fipo Output file.
+ @param ind Indent level.
+*/
+static
+void
+itadmin_dhcp_indent(FILE *fipo, int ind)
+{
+ int i;
+ for(i = 0; i < ind; i++) {
+ fputs(itadmin_dhcp_c8_kw[1], fipo);
+ }
+}
+
+
+
+/** Write DHCP options.
+ @param job Job structure.
+ @param fipo Output file.
+ @param i_o Options storage iterator.
+ @param objtype Object type (ignored).
+ @param indent Indent level.
+
+*/
+static
+void
+itadmin_dhcp_write_options(
+ itadmin_job *job,
+ FILE *fipo,
+ dk3_sto_it_t *i_o,
+ int objtype,
+ int indent
+)
+{
+ itadmin_dhcp_option *opt;
+ char const *p1;
+ size_t sl;
+ int is_option;
+
+
+#line 228 "itadhcp.ctr"
+ dk3sto_it_reset(i_o);
+ while(NULL != (opt = (itadmin_dhcp_option *)dk3sto_it_next(i_o))) {
+
+#line 230 "itadhcp.ctr"
+ is_option = 0;
+ if(opt->k) {
+
+#line 232 "itadhcp.ctr"
+ p1 = dk3str_c8_start(opt->k, NULL);
+ if(p1) {
+
+#line 234 "itadhcp.ctr"
+ sl = strlen(itadmin_dhcp_c8_kw[2]);
+ if(dk3str_c8_len(p1) >= sl) {
+ if(dk3str_c8_ncmp(p1, itadmin_dhcp_c8_kw[2], sl) == 0) {
+ is_option = 1;
+ p1 = dk3str_c8_start(&(p1[7]), NULL);
+ }
+ }
+ } else {
+
+#line 242 "itadhcp.ctr"
+ }
+ if(p1) {
+
+#line 244 "itadhcp.ctr"
+ if(is_option) {
+
+#line 245 "itadhcp.ctr"
+ itadmin_dhcp_indent(fipo, indent);
+ fputs(itadmin_dhcp_c8_kw[3], fipo);
+ fputs(p1, fipo);
+ if(opt->v) {
+ fputc('\t', fipo);
+ fputs(opt->v, fipo);
+ }
+ fputc(';', fipo);
+ fputc('\n', fipo);
+ } else {
+
+#line 255 "itadhcp.ctr"
+ switch(dk3str_c8_array_index(itadmin_dhcp_option_names, p1, 0)) {
+ case 0: {
+
+#line 257 "itadhcp.ctr"
+ is_option = 1;
+ if(opt->v) {
+ if(dk3str_c8_is_bool(opt->v)) {
+ is_option = ((dk3str_c8_is_on(opt->v)) ? 1 : 0);
+ }
+ }
+ itadmin_dhcp_indent(fipo, indent);
+ if(!is_option) {
+ fputs(itadmin_dhcp_c8_kw[4], fipo);
+ }
+ fputs(p1, fipo);
+ fputc(';', fipo);
+ fputc('\n', fipo);
+ } break;
+ default: {
+
+#line 272 "itadhcp.ctr"
+ itadmin_dhcp_indent(fipo, indent);
+ fputs(p1, fipo);
+ if(opt->v) {
+ fputc('\t', fipo);
+ fputs(opt->v, fipo);
+ fputc(';', fipo);
+ fputc('\n', fipo);
+ }
+ } break;
+ }
+ }
+ } else {
+
+#line 284 "itadhcp.ctr"
+ }
+ } else {
+
+#line 286 "itadhcp.ctr"
+ }
+ }
+
+#line 288 "itadhcp.ctr"
+}
+
+
+
+/** Check DHCP pool for correct settings.
+ @param job Job structure.
+ @param dp Pool to check.
+ @return 1 on success, 0 on error.
+*/
+static
+int
+itadmin_dhcp_check_pool(
+ itadmin_job *job,
+ itadmin_dhcp_pool *dp
+)
+{
+ int back = 0;
+ char buffer[128];
+
+
+#line 307 "itadhcp.ctr"
+ if(dp->auc) {
+ if(!(dp->duc)) {
+ back = 1;
+ }
+ } else {
+ if(dp->duc) {
+ if(dp->acl) {
+ back = 1;
+ }
+ }
+ }
+ if(!(back)) {
+ /* ERROR: Inconsistent DHCP pool setup! */
+ sprintf(
+ buffer,
+ "%lu.%lu.%lu.%lu",
+ (((dp->ip4s) >> 24) & 0x000000FFUL),
+ (((dp->ip4s) >> 16) & 0x000000FFUL),
+ (((dp->ip4s) >> 8) & 0x000000FFUL),
+ ((dp->ip4s) & 0x000000FFUL)
+ );
+ itadmin_tool_log_utf8_3(job, DK3_LL_ERROR, 134, 135, buffer);
+ }
+
+#line 330 "itadhcp.ctr"
+ return back;
+}
+
+
+
+/** Register DHCP group for all hosts in a class with a network.
+ @param job Job structure.
+ @param nw Network.
+ @param dc DHCP class.
+ @return 1 on success, 0 on error.
+*/
+static
+int
+itadmin_dhcp_register_class_groups(
+ itadmin_job *job,
+ itadmin_network *nw,
+ itadmin_dhcp_class *dc
+)
+{
+ itadmin_host *ho;
+ itadmin_dhcp_ginw *ginw;
+ int back = 1;
+
+
+#line 353 "itadhcp.ctr"
+ if(dc->i_ho) {
+ dk3sto_it_reset(dc->i_ho);
+ while(NULL != (ho = (itadmin_host *)dk3sto_it_next(dc->i_ho))) {
+ if(ho->dg) {
+ if(!(nw->s_dg)) {
+ nw->s_dg = dk3sto_open_app(job->app);
+ if(nw->s_dg) {
+ dk3sto_set_comp(nw->s_dg, itadmin_comp_dhcp_ginw, 0);
+ }
+ }
+ if(!(nw->i_dg)) {
+ if(nw->s_dg) {
+ nw->i_dg = dk3sto_it_open(nw->s_dg);
+ }
+ }
+ if((nw->s_dg) && (nw->i_dg)) {
+ ginw = (itadmin_dhcp_ginw *)dk3sto_it_find_like(
+ nw->i_dg, (void *)((ho->dg)->sn), 1
+ );
+ if(!(ginw)) {
+ ginw = itadmin_mem_dhcp_ginw_new(job, ho->dg);
+ if(ginw) {
+ if(!dk3sto_add(nw->s_dg, (void *)ginw)) {
+ /* ERROR: Failed to add! */
+ back = 0;
+ itadmin_mem_dhcp_ginw_del(ginw);
+ }
+ } else {
+ back = 0;
+ /* ERROR: Memory! */
+ }
+ }
+ } else {
+ back = 0;
+ }
+ }
+ }
+ }
+
+#line 391 "itadhcp.ctr"
+ return back;
+}
+
+
+
+/** Link DHCP classes to networks.
+ @param job Job structure.
+ @param i_nw Storage iterator for the networks.
+*/
+int
+itadmin_dhcp_link_classes(
+ itadmin_job *job,
+ dk3_sto_it_t *i_nw
+)
+{
+ char buffer[128];
+ itadmin_network *nw;
+ itadmin_dhcp_pool *dp;
+ itadmin_dhcp_class *dc;
+ int back = 1;
+
+
+#line 412 "itadhcp.ctr"
+ dk3sto_it_reset(i_nw);
+ while(NULL != (nw = (itadmin_network *)dk3sto_it_next(i_nw))) {
+
+#line 414 "itadhcp.ctr"
+ if(nw->i_p) {
+
+#line 415 "itadhcp.ctr"
+ dk3sto_it_reset(nw->i_p);
+ while(NULL != (dp = (itadmin_dhcp_pool *)dk3sto_it_next(nw->i_p))) {
+ if(!itadmin_dhcp_check_pool(job, dp)) { back = 0; }
+ if(!(dp->auc)) {
+
+#line 419 "itadhcp.ctr"
+ if(dp->duc) {
+
+#line 420 "itadhcp.ctr"
+ if(dp->acl) {
+
+#line 421 "itadhcp.ctr"
+ dc = dp->acl;
+
+#line 422 "itadhcp.ctr"
+ if(!(dc->dhcpn)) {
+
+#line 423 "itadhcp.ctr"
+ dc->dhcpn = nw;
+ if(!(nw->s_dc)) {
+
+#line 425 "itadhcp.ctr"
+ nw->s_dc = dk3sto_open_app(job->app);
+ if(nw->s_dc) {
+
+#line 427 "itadhcp.ctr"
+ dk3sto_set_comp(nw->s_dc, itadmin_comp_dhcp_class, 0);
+ } else {
+ back = 0;
+
+#line 430 "itadhcp.ctr"
+ }
+ }
+ if(!(nw->i_dc)) {
+
+#line 433 "itadhcp.ctr"
+ if(nw->s_dc) {
+
+#line 434 "itadhcp.ctr"
+ nw->i_dc = dk3sto_it_open(nw->s_dc);
+ } else {
+
+#line 436 "itadhcp.ctr"
+ back = 0;
+ }
+ }
+ if((nw->s_dc) && (nw->i_dc)) {
+
+#line 440 "itadhcp.ctr"
+ if(!(dk3sto_it_find_like(nw->i_dc, (void *)dc, 0))) {
+
+
+#line 442 "itadhcp.ctr"
+ if(!(dk3sto_add(nw->s_dc, (void *)dc))) {
+ back = 0;
+
+#line 444 "itadhcp.ctr"
+ }
+ }
+ } else {
+
+#line 447 "itadhcp.ctr"
+ back = 0;
+ /* ERROR: Memory */
+ }
+ } else {
+
+#line 451 "itadhcp.ctr"
+ if(((dc->dhcpn)->ip4) != (nw->ip4)) {
+ back = 0;
+
+#line 453 "itadhcp.ctr"
+ /* ERROR: Class assigned to pools in different nets! */
+ itadmin_tool_log_utf8_3(job, DK3_LL_ERROR, 136, 137, dc->sn);
+ }
+ }
+ if(!itadmin_dhcp_register_class_groups(job, nw, dc)) {
+ back = 0;
+ }
+ } else {
+
+#line 461 "itadhcp.ctr"
+ /* ERROR: No allowed class specified! */
+ sprintf(
+ buffer,
+ "%lu.%lu.%lu.%lu",
+ (((dp->ip4s) >> 24) & 0x000000FFUL),
+ (((dp->ip4s) >> 16) & 0x000000FFUL),
+ (((dp->ip4s) >> 8) & 0x000000FFUL),
+ ((dp->ip4s) & 0x000000FFUL)
+ );
+ itadmin_tool_log_utf8_3(job, DK3_LL_ERROR, 134, 138, buffer);
+ }
+ } else {
+
+#line 473 "itadhcp.ctr"
+ }
+ } else {
+
+#line 475 "itadhcp.ctr"
+ }
+ }
+ } else {
+
+#line 478 "itadhcp.ctr"
+ }
+ }
+
+#line 480 "itadhcp.ctr"
+ return back;
+}
+
+
+
+/** Write DHCP classes to output file.
+ @param job Job structure.
+ @param fipo output file.
+*/
+static
+void
+itadmin_dhcp_write_classes(itadmin_job *job, FILE *fipo)
+{
+ itadmin_dhcp_class *dc;
+ itadmin_host *ho;
+ int is_first;
+
+
+#line 497 "itadhcp.ctr"
+ dk3sto_it_reset(job->i_dc);
+ while(NULL != (dc = (itadmin_dhcp_class *)dk3sto_it_next(job->i_dc))) {
+
+
+#line 500 "itadhcp.ctr"
+ if((dc->sn) && (dc->dhcpn)) {
+
+#line 501 "itadhcp.ctr"
+ is_first = 1;
+ if(dc->i_ho) {
+
+#line 503 "itadhcp.ctr"
+ dk3sto_it_reset(dc->i_ho);
+ while(NULL != (ho = (itadmin_host *)dk3sto_it_next(dc->i_ho))) {
+ if((ho->sn) && (ho->maca) && (!(ho->ipv4))) {
+ if(is_first) {
+ fputc('\n', fipo);
+ fputs(itadmin_dhcp_c8_kw[6], fipo);
+ fputs(dc->sn, fipo);
+ fputs(itadmin_dhcp_c8_kw[7], fipo);
+ fputc('\n', fipo);
+ }
+ is_first = 0;
+ fputs(itadmin_dhcp_c8_kw[11], fipo);
+ fputs(ho->sn, fipo);
+ fputc('\n', fipo);
+ fputs(itadmin_dhcp_c8_kw[8], fipo);
+ fputs(dc->sn, fipo);
+ fputs(itadmin_dhcp_c8_kw[9], fipo);
+ fputs(ho->maca, fipo);
+ fputs(itadmin_dhcp_c8_kw[10], fipo);
+ fputc('\n', fipo);
+ }
+ }
+
+#line 525 "itadhcp.ctr"
+ } else {
+
+#line 526 "itadhcp.ctr"
+ }
+ }
+ }
+
+#line 529 "itadhcp.ctr"
+}
+
+
+
+/** Write one DHCP pool to output.
+ @param job Job structure.
+ @param fipo Output file.
+ @param dp Pool to write.
+ @param indent Line indent level.
+*/
+static
+void
+itadmin_dhcp_write_pool(
+ itadmin_job *job,
+ FILE *fipo,
+ itadmin_dhcp_pool *dp,
+ int indent
+)
+{
+ itadmin_dhcp_class *dc;
+
+
+#line 550 "itadhcp.ctr"
+ itadmin_dhcp_indent(fipo, indent);
+ fputs(itadmin_dhcp_c8_kw[20], fipo);
+ fputc('\n', fipo);
+ itadmin_dhcp_indent(fipo, indent);
+ fputs(itadmin_dhcp_c8_kw[13], fipo);
+ fputc('\n', fipo);
+ itadmin_dhcp_indent(fipo, (indent + 1));
+ fputs(itadmin_dhcp_c8_kw[21], fipo);
+ itadmin_tool_write_ip(fipo, dp->ip4s);
+ fputc('\t', fipo);
+ itadmin_tool_write_ip(fipo, dp->ip4e);
+ fputc(';', fipo);
+ fputc('\n', fipo);
+ if(dp->auc) {
+ itadmin_dhcp_indent(fipo, (indent + 1));
+ fputs(itadmin_dhcp_c8_kw[22], fipo);
+ fputc('\n', fipo);
+ /* Fuer alle Klassen verbieten */
+ if(job->i_dc) {
+ dk3sto_it_reset(job->i_dc);
+ while(NULL != (dc = (itadmin_dhcp_class *)dk3sto_it_next(job->i_dc))) {
+ itadmin_dhcp_indent(fipo, (indent + 1));
+ fputs(itadmin_dhcp_c8_kw[25], fipo);
+ fputs(dc->sn, fipo);
+ fputs(itadmin_dhcp_c8_kw[26], fipo);
+ fputc('\n', fipo);
+ }
+ }
+ } else {
+ itadmin_dhcp_indent(fipo, (indent + 1));
+ fputs(itadmin_dhcp_c8_kw[23], fipo);
+ fputc('\n', fipo);
+ if(dp->acl) {
+ itadmin_dhcp_indent(fipo, (indent + 1));
+ fputs(itadmin_dhcp_c8_kw[24], fipo);
+ fputs((dp->acl)->sn, fipo);
+ fputs(itadmin_dhcp_c8_kw[26], fipo);
+ fputc('\n', fipo);
+ }
+ }
+ /* POOL OPTIONS */
+ if(dp->i_do) {
+ itadmin_dhcp_write_options(job, fipo, dp->i_do, 4, (indent+1));
+ }
+ /* Release leases on shutdown for pool */
+ if (1 == job->rel) {
+ itadmin_dhcp_indent(fipo, (indent+1));
+ fputs(itadmin_dhcp_c8_kw[36], fipo);
+ itadmin_dhcp_indent(fipo, (indent+1));
+ fputs(itadmin_dhcp_c8_kw[37], fipo);
+ itadmin_dhcp_indent(fipo, (indent+1));
+ fputs(itadmin_dhcp_c8_kw[38], fipo);
+ itadmin_dhcp_indent(fipo, (indent+1));
+ fputs(itadmin_dhcp_c8_kw[39], fipo);
+ }
+ itadmin_dhcp_indent(fipo, indent);
+ fputs(itadmin_dhcp_c8_kw[14], fipo);
+ fputc('\n', fipo);
+
+#line 608 "itadhcp.ctr"
+}
+
+
+
+/** Write one host in group.
+ @param job Job structure.
+ @param fipo Output file.
+ @param ho Host to write.
+ @param ind Indent level at beginning of line.
+*/
+static
+void
+itadmin_dhcp_write_one_host(
+ itadmin_job *job,
+ FILE *fipo,
+ itadmin_host *ho,
+ int ind
+)
+{
+
+
+#line 628 "itadhcp.ctr"
+ if((ho->sn) && (ho->maca)) {
+ itadmin_dhcp_indent(fipo, ind);
+ fputs(itadmin_dhcp_c8_kw[28], fipo);
+ fputs(ho->sn, fipo);
+ fputc('\n', fipo);
+ itadmin_dhcp_indent(fipo, ind);
+ fputs(itadmin_dhcp_c8_kw[13], fipo);
+ fputc('\n', fipo);
+
+ itadmin_dhcp_indent(fipo, (ind + 1));
+ fputs(itadmin_dhcp_c8_kw[29], fipo);
+ fputs(ho->sn, fipo);
+ fputs(itadmin_dhcp_c8_kw[26], fipo);
+ fputc('\n', fipo);
+
+ itadmin_dhcp_indent(fipo, (ind + 1));
+ fputs(itadmin_dhcp_c8_kw[30], fipo);
+ fputs(ho->maca, fipo);
+ fputs(itadmin_dhcp_c8_kw[10], fipo);
+ fputc('\n', fipo);
+
+ if(ho->ipv4) {
+ itadmin_dhcp_indent(fipo, (ind + 1));
+ fputs(itadmin_dhcp_c8_kw[31], fipo);
+ itadmin_tool_write_ip(fipo, ho->ipv4);
+ fputs(itadmin_dhcp_c8_kw[10], fipo);
+ fputc('\n', fipo);
+ }
+
+ /* Added 2013-09-14: Must write host options too. */
+ if((ho->s_do) && (ho->i_do)) {
+ itadmin_dhcp_write_options(job, fipo, ho->i_do, 3, (ind+1));
+ }
+
+ itadmin_dhcp_indent(fipo, ind);
+ fputs(itadmin_dhcp_c8_kw[14], fipo);
+ fputc('\n', fipo);
+ }
+
+#line 666 "itadhcp.ctr"
+}
+
+
+
+/** Write hosts of one group for a network.
+
+*/
+static
+void
+itadmin_dhcp_write_group(
+ itadmin_job *job,
+ FILE *fipo,
+ itadmin_network *nw,
+ dk3_sto_it_t *i_ho,
+ itadmin_dhcp_group *gr,
+ int ind
+
+)
+{
+ itadmin_host *ho;
+ itadmin_dhcp_class *dc;
+ int is_first;
+ int is_in_group;
+
+
+#line 690 "itadhcp.ctr"
+ if(gr) {
+
+#line 691 "itadhcp.ctr"
+ } else {
+
+#line 692 "itadhcp.ctr"
+ }
+ is_first = 1;
+ if(i_ho) {
+ dk3sto_it_reset(i_ho);
+ while(NULL != (ho = (itadmin_host *)dk3sto_it_next(i_ho))) {
+ if((ho->sn) && (ho->maca)) {
+ if(is_first) {
+ itadmin_dhcp_indent(fipo, ind);
+ fputs(itadmin_dhcp_c8_kw[27], fipo);
+ fputc('\n', fipo);
+ itadmin_dhcp_indent(fipo, ind);
+ fputs(itadmin_dhcp_c8_kw[13], fipo);
+ fputc('\n', fipo);
+ if(gr) {
+ if(gr->i_do) {
+ itadmin_dhcp_write_options(job, fipo, gr->i_do, 3, (ind+1));
+ fputc('\n', fipo);
+ }
+ }
+ } is_first = 0;
+ itadmin_dhcp_write_one_host(job, fipo, ho, (ind + 1));
+ }
+ }
+ }
+ if(nw) {
+ if(nw->i_dc) {
+ dk3sto_it_reset(nw->i_dc);
+ while(NULL != (dc = (itadmin_dhcp_class *)dk3sto_it_next(nw->i_dc))) {
+ if(dc->i_ho) {
+ dk3sto_it_reset(dc->i_ho);
+ while(NULL != (ho = (itadmin_host *)dk3sto_it_next(dc->i_ho))) {
+ is_in_group = 0;
+ if(ho->dg) {
+ if(gr) {
+ if(itadmin_comp_dhcp_group((void *)(ho->dg),(void *)gr,0) == 0)
+ {
+ is_in_group = 1;
+ }
+ }
+ } else {
+ if(!(gr)) {
+ is_in_group = 1;
+ }
+ }
+ if(is_in_group) {
+ if(is_first) {
+ itadmin_dhcp_indent(fipo, ind);
+ fputs(itadmin_dhcp_c8_kw[27], fipo);
+ fputc('\n', fipo);
+ itadmin_dhcp_indent(fipo, ind);
+ fputs(itadmin_dhcp_c8_kw[13], fipo);
+ fputc('\n', fipo);
+ if(gr) {
+ if(gr->i_do) {
+ itadmin_dhcp_write_options(job,fipo,gr->i_do,3,(ind + 1));
+ fputc('\n', fipo);
+ }
+ }
+ } is_first = 0;
+ itadmin_dhcp_write_one_host(job, fipo, ho, (ind + 1));
+ }
+ }
+ }
+ }
+ }
+ }
+ if(!(is_first)) {
+ itadmin_dhcp_indent(fipo, ind);
+ fputs(itadmin_dhcp_c8_kw[14], fipo);
+ fputc('\n', fipo);
+ }
+
+
+#line 764 "itadhcp.ctr"
+}
+
+
+
+/** Write one network to output file.
+ @param job Job structure.
+ @param fipo Output file.
+ @param nw Network to write.
+ @param indent Indent at start of file.
+*/
+static
+void
+itadmin_dhcp_write_one_network(
+ itadmin_job *job,
+ FILE *fipo,
+ itadmin_network *nw,
+ int indent
+)
+{
+ itadmin_dhcp_pool *dp;
+ itadmin_dhcp_ginw *ginw;
+
+
+#line 786 "itadhcp.ctr"
+ itadmin_dhcp_indent(fipo, indent);
+ fputs(itadmin_dhcp_c8_kw[15], fipo);
+ itadmin_tool_write_ip(fipo, nw->ip4);
+ fputs(itadmin_dhcp_c8_kw[16], fipo);
+ itadmin_tool_write_ip(fipo, nw->ma4);
+ fputc('\n', fipo);
+ itadmin_dhcp_indent(fipo, indent);
+ fputs(itadmin_dhcp_c8_kw[13], fipo);
+ fputc('\n', fipo);
+ itadmin_dhcp_indent(fipo, (indent + 1));
+ fputs(itadmin_dhcp_c8_kw[17], fipo);
+ itadmin_tool_write_ip(fipo, nw->gw4);
+ fputc(';', fipo);
+ fputc('\n', fipo);
+ itadmin_dhcp_indent(fipo, (indent + 1));
+ fputs(itadmin_dhcp_c8_kw[18], fipo);
+ itadmin_tool_write_ip(fipo, nw->ma4);
+ fputc(';', fipo);
+ fputc('\n', fipo);
+ itadmin_dhcp_indent(fipo, (indent + 1));
+ fputs(itadmin_dhcp_c8_kw[19], fipo);
+ itadmin_tool_write_ip(fipo, nw->bc4);
+ fputc(';', fipo);
+ fputc('\n', fipo);
+ /* DHCP options */
+ if(nw->i_do) {
+ itadmin_dhcp_write_options(job, fipo, nw->i_do, 2, (indent+1));
+ fputc('\n', fipo);
+ }
+ /* Pools */
+ if(nw->i_p) {
+ dk3sto_it_reset(nw->i_p);
+ while(NULL != (dp = (itadmin_dhcp_pool *)dk3sto_it_next(nw->i_p))) {
+ itadmin_dhcp_write_pool(job, fipo, dp, (indent + 1));
+ }
+ }
+ /* Groups, direct for network and in DHCP classes */
+ if(nw->i_dg) {
+ dk3sto_it_reset(nw->i_dg);
+ while(NULL != (ginw = (itadmin_dhcp_ginw *)dk3sto_it_next(nw->i_dg))) {
+ itadmin_dhcp_write_group(job,fipo,nw,ginw->i_h,ginw->gr,(indent + 1));
+ }
+ }
+ /* Hosts without groups, direct for network and in DHCP classes */
+ itadmin_dhcp_write_group(job, fipo, nw, nw->i_hoi, NULL, (indent + 1));
+ itadmin_dhcp_indent(fipo, indent);
+ fputs(itadmin_dhcp_c8_kw[14], fipo);
+ fputc('\n', fipo);
+
+#line 834 "itadhcp.ctr"
+}
+
+
+
+/** Write DHCP networks.
+ @param job Job structure.
+ @param fipo Output file.
+ @param i_nw Iterator for networks storage.
+*/
+static
+void
+itadmin_dhcp_write_networks(
+ itadmin_job *job,
+ FILE *fipo,
+ dk3_sto_it_t *i_nw
+)
+{
+ itadmin_network *nw;
+
+
+#line 853 "itadhcp.ctr"
+ dk3sto_it_reset(i_nw);
+ while(NULL != (nw = (itadmin_network *)dk3sto_it_next(i_nw))) {
+ itadmin_dhcp_write_one_network(job, fipo, nw, 1);
+ }
+
+#line 857 "itadhcp.ctr"
+}
+
+
+
+/** Write data for one VLAN to output.
+ @param job Job structure.
+ @param fipo Output file.
+ @param i_nw Networks iterator.
+ @param i_do DHCP options storage iterator.
+*/
+static
+void
+itadmin_dhcp_write_vlan(
+ itadmin_job *job,
+ FILE *fipo,
+ dk3_sto_it_t *i_nw,
+ dk3_sto_it_t *i_do
+)
+{
+ itadmin_network *nw;
+ int num_networks;
+
+
+#line 879 "itadhcp.ctr"
+ num_networks = 0;
+ if(i_nw) {
+ dk3sto_it_reset(i_nw);
+ while(NULL != dk3sto_it_next(i_nw)) { num_networks++; }
+ if(num_networks > 0) {
+ dk3sto_it_reset(i_nw);
+ if((num_networks > 1) || (i_do)) {
+ fputs(itadmin_dhcp_c8_kw[12], fipo);
+ fputc('\n', fipo);
+ fputs(itadmin_dhcp_c8_kw[13], fipo);
+ fputc('\n', fipo);
+ if(i_do) {
+ itadmin_dhcp_write_options(job, fipo, i_do, 1, 1);
+ }
+ itadmin_dhcp_write_networks(job, fipo, i_nw);
+ fputs(itadmin_dhcp_c8_kw[14], fipo);
+ fputc('\n', fipo);
+ } else {
+ nw = (itadmin_network *)dk3sto_it_next(i_nw);
+ if(nw) {
+ itadmin_dhcp_write_one_network(job, fipo, nw, 0);
+ }
+ }
+ }
+ }
+
+#line 904 "itadhcp.ctr"
+}
+
+
+
+static
+void
+itadmin_dhcp_declare_msft_options(itadmin_job *job, FILE *fipo)
+{
+ if (0 < job->rel) {
+ fputs(itadmin_dhcp_c8_kw[34], fipo);
+ fputs(itadmin_dhcp_c8_kw[35], fipo);
+ }
+ if (2 == job->rel) {
+ fputs(itadmin_dhcp_c8_kw[36], fipo);
+ fputs(itadmin_dhcp_c8_kw[37], fipo);
+ fputs(itadmin_dhcp_c8_kw[38], fipo);
+ fputs(itadmin_dhcp_c8_kw[39], fipo);
+ fputc('\n', fipo);
+ }
+}
+
+
+
+/** Write output file for a VLAN or all networks.
+ @param job Job structure.
+ @param vlanname Name of VLAN (NULL if not specified).
+ @param i_nw Iterator for all networks.
+ @param i_do Iterator for VLAN DHCP options (may be NULL).
+ @return 1 on success, 0 on error.
+*/
+static
+int
+itadmin_dhcpd_output(
+ itadmin_job *job,
+ dkChar const *vlanname,
+ dk3_sto_it_t *i_nw,
+ dk3_sto_it_t *i_do
+)
+{
+ FILE *fipo;
+ int back = 0;
+
+
+#line 946 "itadhcp.ctr"
+ if(itadmin_dhcp_link_classes(job, i_nw)) {
+
+#line 947 "itadhcp.ctr"
+ fipo = dk3sf_c8_fopen_app(
+ itadmin_dhcp_c8_kw[0], itadmin_dhcp_c8_kw[5], job->app
+ );
+ if(fipo) {
+
+#line 951 "itadhcp.ctr"
+ itadmin_dhcp_write_options(job, fipo, job->i_do, 0, 0);
+ fputc('\n', fipo);
+ itadmin_dhcp_declare_msft_options(job, fipo);
+ fputs(itadmin_dhcp_c8_kw[32], fipo);
+ itadmin_dhcp_write_classes(job, fipo);
+ fputc('\n', fipo);
+ fputs(itadmin_dhcp_c8_kw[33], fipo);
+ itadmin_dhcp_write_vlan(job, fipo, i_nw, i_do);
+ back = 1;
+#if DK3_CHAR_SIZE == 1
+ if(!dk3sf_fclose_fn_app(fipo, itadmin_dhcp_c8_kw[0], job->app)) {
+ back = 0;
+ }
+#else
+ if(!dk3sf_fclose_fn_app(fipo, NULL, job->app)) {
+ back = 0;
+ }
+#endif
+ } else {
+
+#line 970 "itadhcp.ctr"
+ /* ERROR: Failed to open file. */
+ }
+ } else {
+
+#line 973 "itadhcp.ctr"
+ }
+
+#line 974 "itadhcp.ctr"
+ return back;
+}
+
+
+
+int
+itadmin_dhcpd_conf_output(itadmin_job *job)
+{
+ char vlname[ITADMIN_CONFIG_LINE_SIZE];
+ itadmin_vlan *dhcpvl;
+ int back = 0;
+ int res;
+
+
+#line 987 "itadhcp.ctr"
+ if(job->vlan) {
+ res = dk3str_str_to_c8u_app(
+ vlname, sizeof(vlname), job->vlan,
+ dk3app_get_encoding(job->app), job->app
+ );
+ if(res) {
+ dhcpvl =
+ (itadmin_vlan *)dk3sto_it_find_like(job->i_vl, (void *)vlname, 1);
+ if(dhcpvl) {
+ back = itadmin_dhcpd_output(job, dhcpvl->s, dhcpvl->i_nw, dhcpvl->i_do);
+ } else {
+ dk3app_log_3(job->app, DK3_LL_ERROR, job->msg, 139, 140, job->vlan);
+ }
+ } else {
+ /* ERROR: Failed to convert VLAN name! */
+ }
+ } else {
+ back = itadmin_dhcpd_output(job, NULL, job->i_nw, NULL);
+ }
+
+#line 1006 "itadhcp.ctr"
+ return back;
+}
+