/* Copyright (C) 2012-2020, Dirk Krause SPDX-License-Identifier: BSD-3-Clause */ /* WARNING: This file was generated by the dkct program (see http://dktools.sourceforge.net/ for details). 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 */ /** @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", /* 40 */ "# ##### ITADMIN_RANGE_BEGIN ", /* 41 */ "# ##### ITADMIN_RANGE_DATA ", /* 42 */ "# ##### ITADMIN_RANGE_END ", /* 43 */ "shared-network ", /* 44 */ "dhcpnet", /* 45 */ "subnet ", /* 46 */ "pool ", /* 47 */ "group ", /* 48 */ "host ", NULL #line 190 "itadhcp.ctr" }; /** Option names requiring special treatment. */ static char const * const itadmin_dhcp_option_names[] = { /* 0 */ "authorative", NULL #line 201 "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 fipo Output file. @param i_o Options storage iterator. @param indent Indent level. */ static void itadmin_dhcp_write_options( FILE *fipo, dk3_sto_it_t *i_o, int indent ) { itadmin_dhcp_option *opt; char const *p1; size_t sl; int is_option; #line 242 "itadhcp.ctr" dk3sto_it_reset(i_o); while(NULL != (opt = (itadmin_dhcp_option *)dk3sto_it_next(i_o))) { #line 244 "itadhcp.ctr" is_option = 0; if(opt->k) { #line 246 "itadhcp.ctr" p1 = dk3str_c8_start(opt->k, NULL); if(p1) { #line 248 "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 256 "itadhcp.ctr" } if(p1) { #line 258 "itadhcp.ctr" if(is_option) { #line 259 "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 269 "itadhcp.ctr" switch(dk3str_c8_array_index(itadmin_dhcp_option_names, p1, 0)) { case 0: { #line 271 "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 286 "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 298 "itadhcp.ctr" } } else { #line 300 "itadhcp.ctr" } } #line 302 "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 321 "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 344 "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 367 "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 405 "itadhcp.ctr" return back; } /** Link DHCP classes to networks. @param job Job structure. @param i_nw Storage iterator for the networks. */ static 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 427 "itadhcp.ctr" dk3sto_it_reset(i_nw); while(NULL != (nw = (itadmin_network *)dk3sto_it_next(i_nw))) { #line 429 "itadhcp.ctr" if(nw->i_p) { #line 430 "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 434 "itadhcp.ctr" if(dp->duc) { #line 435 "itadhcp.ctr" if(dp->acl) { #line 436 "itadhcp.ctr" dc = dp->acl; #line 437 "itadhcp.ctr" if(!(dc->dhcpn)) { #line 438 "itadhcp.ctr" dc->dhcpn = nw; if(!(nw->s_dc)) { #line 440 "itadhcp.ctr" nw->s_dc = dk3sto_open_app(job->app); if(nw->s_dc) { #line 442 "itadhcp.ctr" dk3sto_set_comp(nw->s_dc, itadmin_comp_dhcp_class, 0); } else { back = 0; #line 445 "itadhcp.ctr" } } if(!(nw->i_dc)) { #line 448 "itadhcp.ctr" if(nw->s_dc) { #line 449 "itadhcp.ctr" nw->i_dc = dk3sto_it_open(nw->s_dc); } else { #line 451 "itadhcp.ctr" back = 0; } } if((nw->s_dc) && (nw->i_dc)) { #line 455 "itadhcp.ctr" if(!(dk3sto_it_find_like(nw->i_dc, (void *)dc, 0))) { #line 457 "itadhcp.ctr" if(!(dk3sto_add(nw->s_dc, (void *)dc))) { back = 0; #line 459 "itadhcp.ctr" } } } else { #line 462 "itadhcp.ctr" back = 0; /* ERROR: Memory */ } } else { #line 466 "itadhcp.ctr" if(((dc->dhcpn)->ip4) != (nw->ip4)) { back = 0; #line 468 "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 476 "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 488 "itadhcp.ctr" } } else { #line 490 "itadhcp.ctr" } } } else { #line 493 "itadhcp.ctr" } } #line 495 "itadhcp.ctr" return back; } /** Write marker for named object. @param fipo Output file. @param mi Marker index in itadmin_dhcp_c8_kw array. @param ti Type index in itadmin_dhcp_c8_kw array. @param name Host or group name. @param indent Indent level (number of spaces at start of line). */ static void itadmin_dhcp_marker_name( FILE *fipo, size_t mi, size_t ti, const char *name, int indent ) { while (0 < indent--) fputc(' ', fipo); fputs(itadmin_dhcp_c8_kw[mi], fipo); fputs(itadmin_dhcp_c8_kw[ti], fipo); if (NULL != name) { fputs(name, fipo); } fputc('\n', fipo); } /** Write marker for object identified by IPv4 address. @param fipo Output file. @param mi Marker index in itadmin_dhcp_c8_kw array. @param ti Type index in itadmin_dhcp_c8_kw array. @param ip4 IPv4 address. @param indent Indent level (number of spaces at start of line). */ static void itadmin_dhcp_marker_ip( FILE *fipo, size_t mi, size_t ti, unsigned long ip4, int indent ) { char buffer[32]; #if DK3_HAVE__SNPRINTF_S _snprintf_s( buffer, sizeof(buffer), (sizeof(buffer) - 1), "%lu.%lu.%lu.%lu", ((ip4 >> 24) & 0x000000FFUL), ((ip4 >> 16) & 0x000000FFUL), ((ip4 >> 8) & 0x000000FFUL), ((ip4 ) & 0x000000FFUL) ); #else #if DK3_HAVE_SNPRINTF snprintf( buffer, sizeof(buffer), "%lu.%lu.%lu.%lu", ((ip4 >> 24) & 0x000000FFUL), ((ip4 >> 16) & 0x000000FFUL), ((ip4 >> 8) & 0x000000FFUL), ((ip4 ) & 0x000000FFUL) ); #else #if DK3_HAVE__SNPRINTF _snprintf( buffer, sizeof(buffer), "%lu.%lu.%lu.%lu", ((ip4 >> 24) & 0x000000FFUL), ((ip4 >> 16) & 0x000000FFUL), ((ip4 >> 8) & 0x000000FFUL), ((ip4 ) & 0x000000FFUL) ); #else sprintf( buffer, "%lu.%lu.%lu.%lu", ((ip4 >> 24) & 0x000000FFUL), ((ip4 >> 16) & 0x000000FFUL), ((ip4 >> 8) & 0x000000FFUL), ((ip4 ) & 0x000000FFUL) ); #endif #endif #endif itadmin_dhcp_marker_name(fipo, mi, ti, buffer, indent); } /** 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 603 "itadhcp.ctr" dk3sto_it_reset(job->i_dc); while(NULL != (dc = (itadmin_dhcp_class *)dk3sto_it_next(job->i_dc))) { #line 606 "itadhcp.ctr" if((dc->sn) && (dc->dhcpn)) { #line 607 "itadhcp.ctr" is_first = 1; if(dc->i_ho) { #line 609 "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 631 "itadhcp.ctr" } else { #line 632 "itadhcp.ctr" } } } #line 635 "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 656 "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); } } /* ITADMIN_RANGE_BEGIN pool _IP_ */ if (0 != job->m_po) { itadmin_dhcp_marker_ip(fipo, 40, 46, dp->ip4s, (indent+1)); } /* POOL OPTIONS */ if(dp->i_do) { itadmin_dhcp_write_options(fipo, dp->i_do, (indent+1)); } /* ITADMIN_RANGE_DATA pool _IP_ */ if (0 != job->m_po) { itadmin_dhcp_marker_ip(fipo, 41, 46, dp->ip4s, (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_RANGE_END pool _IP_ */ if (0 != job->m_po) { itadmin_dhcp_marker_ip(fipo, 42, 46, dp->ip4s, (indent+1)); } itadmin_dhcp_indent(fipo, indent); fputs(itadmin_dhcp_c8_kw[14], fipo); fputc('\n', fipo); #line 732 "itadhcp.ctr" } /** Write one host in group. @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 751 "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); /* Host name */ 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_RANGE_BEGIN host _name_ */ if (0 != job->m_ho) { itadmin_dhcp_marker_name(fipo, 40, 48, ho->sn, (ind+1)); } /* Added 2013-09-14: Must write host options too. */ if((ho->s_do) && (ho->i_do)) { itadmin_dhcp_write_options(fipo, ho->i_do, (ind+1)); } /* ITADMIN_RANGE_DATA host _name_ */ if (0 != job->m_ho) { itadmin_dhcp_marker_name(fipo, 41, 48, ho->sn, (ind+1)); } /* hardware ethernet */ 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); /* fixed-address */ 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); } /* ITADMIN_RANGE_END host _name_ */ if (0 != job->m_ho) { itadmin_dhcp_marker_name(fipo, 42, 48, ho->sn, (ind+1)); } itadmin_dhcp_indent(fipo, ind); fputs(itadmin_dhcp_c8_kw[14], fipo); fputc('\n', fipo); } #line 807 "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 831 "itadhcp.ctr" if(gr) { #line 832 "itadhcp.ctr" } else { #line 833 "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) { /* ITADMIN_RANGE_BEGIN group _name_ */ if (0 != job->m_gr) { itadmin_dhcp_marker_name(fipo, 40, 47, gr->sn, (ind+1)); } if(gr->i_do) { itadmin_dhcp_write_options(fipo, gr->i_do, (ind+1)); fputc('\n', fipo); } /* ITADMIN_RANGE_DATA group _name_ */ if (0 != job->m_gr) { itadmin_dhcp_marker_name(fipo, 41, 47, gr->sn, (ind+1)); } } } 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) { /* ITADMIN_RANGE_BEGIN group _name_ */ if (0 != job->m_gr) { itadmin_dhcp_marker_name(fipo, 40, 47, gr->sn, (ind+1)); } if(gr->i_do) { itadmin_dhcp_write_options(fipo,gr->i_do,(ind + 1)); fputc('\n', fipo); } /* ITADMIN_RANGE_DATA group _name_ */ if (0 != job->m_gr) { itadmin_dhcp_marker_name(fipo, 41, 47, gr->sn, (ind+1)); } } } is_first = 0; itadmin_dhcp_write_one_host(job, fipo, ho, (ind + 1)); } } } } } } if(!(is_first)) { if (NULL != gr) { /* ITADMIN_RANGE_END group _name_ */ if (0 != job->m_gr) { itadmin_dhcp_marker_name(fipo, 42, 47, gr->sn, (ind+1)); } } itadmin_dhcp_indent(fipo, ind); fputs(itadmin_dhcp_c8_kw[14], fipo); fputc('\n', fipo); } #line 927 "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 949 "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_RANGE_BEGIN subnet _IP_ */ if (0 != job->m_sn) { itadmin_dhcp_marker_ip(fipo, 40, 45, nw->ip4, (indent+1)); } 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(fipo, nw->i_do, (indent+1)); fputc('\n', fipo); } /* ITADMIN_RANGE_DATA subnet _IP_ */ if (0 != job->m_sn) { itadmin_dhcp_marker_ip(fipo, 41, 45, nw->ip4, (indent+1)); } /* 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_RANGE_END subnet _IP_ */ if (0 != job->m_sn) { itadmin_dhcp_marker_ip(fipo, 42, 45, nw->ip4, (indent+1)); } itadmin_dhcp_indent(fipo, indent); fputs(itadmin_dhcp_c8_kw[14], fipo); fputc('\n', fipo); #line 1014 "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 1033 "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 1037 "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 1059 "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); /* ITADMIN_RANGE_BEGIN shared-network dhcpnet */ if (0 != job->m_vl) { itadmin_dhcp_marker_name(fipo,40,43,itadmin_dhcp_c8_kw[44],1); } if(i_do) { itadmin_dhcp_write_options(fipo, i_do, 1); } /* ITADMIN_RANGE_DATA shared-network dhcpnet */ if (0 != job->m_vl) { itadmin_dhcp_marker_name(fipo,41,43,itadmin_dhcp_c8_kw[44],1); } itadmin_dhcp_write_networks(job, fipo, i_nw); /* ITADMIN_RANGE_END shared-network dhcpnet */ if (0 != job->m_vl) { itadmin_dhcp_marker_name(fipo,42,43,itadmin_dhcp_c8_kw[44],1); } 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 1104 "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 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, dk3_sto_it_t *i_nw, dk3_sto_it_t *i_do ) { FILE *fipo; int back = 0; #line 1144 "itadhcp.ctr" if(itadmin_dhcp_link_classes(job, i_nw)) { #line 1145 "itadhcp.ctr" fipo = dk3sf_c8_fopen_app( itadmin_dhcp_c8_kw[0], itadmin_dhcp_c8_kw[5], job->app ); if(fipo) { #line 1149 "itadhcp.ctr" itadmin_dhcp_write_options(fipo, job->i_do, 0); fputc('\n', fipo); itadmin_dhcp_declare_msft_options(job, fipo); if (0 != job->m_p) { fputs(itadmin_dhcp_c8_kw[32], fipo); } itadmin_dhcp_write_classes(job, fipo); fputc('\n', fipo); if (0 != job->m_p) { 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 1172 "itadhcp.ctr" /* ERROR: Failed to open file. */ } } else { #line 1175 "itadhcp.ctr" } #line 1176 "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 1189 "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->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, job->i_nw, NULL); } #line 1208 "itadhcp.ctr" return back; }