diff options
author | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
commit | e0c6872cf40896c7be36b11dcc744620f10adf1d (patch) | |
tree | 60335e10d2f4354b0674ec22d7b53f0f8abee672 /support/dktools/itadhcp.c |
Initial commit
Diffstat (limited to 'support/dktools/itadhcp.c')
-rw-r--r-- | support/dktools/itadhcp.c | 1161 |
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; +} + |