From nobody Tue Apr 23 19:28:24 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 216.205.24.124 as permitted sender) client-ip=216.205.24.124; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-delivery-124.mimecast.com; Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of redhat.com designates 216.205.24.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1619076770; cv=none; d=zohomail.com; s=zohoarc; b=FQXcWnIZmLe+GSNI74KeD8cqobIPP6SkLNkrYtrK4zXsAsG+jwKsy+7U+A3ZtWtwbmhnsqIefrQs8g2Iny/tD4RzcmFqjc3OrKZpeGLqWTTIySTxDxIfpRUQBBkaNKRjaId0mQnIZb/hBWOIogZtsyMgTB/bU2X87IdDj+KqvFU= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1619076770; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=Q+StA8VdVDHnmLcAXL1xzi4HSsK+qHvh8uuNN1ANVE8=; b=Ttmosg4Nuvf9+LOZx6L4APuDQm6FCL67R1+vL5fSAJW+2P56nybQRxzbztZwasQxHZTfA6noLinsxPkFYT+xtmHbZV6I1DnF4ghCS+dAPomoWmixfJkMnVZRzziPGDvDXLrAaL3MCn/liJzwb0hfPslUC1EQ7uu66NEtFQ48fcE= ARC-Authentication-Results: i=1; mx.zohomail.com; spf=pass (zohomail.com: domain of redhat.com designates 216.205.24.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [216.205.24.124]) by mx.zohomail.com with SMTPS id 1619076770567164.96538913275333; Thu, 22 Apr 2021 00:32:50 -0700 (PDT) Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-295-2Mrg0ZO9P_CCo5vwwiOfPw-1; Thu, 22 Apr 2021 03:32:46 -0400 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 76A22343A0; Thu, 22 Apr 2021 07:32:40 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.21]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 50F235944F; Thu, 22 Apr 2021 07:32:40 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id 1964544A69; Thu, 22 Apr 2021 07:32:40 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.rdu2.redhat.com [10.11.54.6]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id 13M7WI3O023968 for ; Thu, 22 Apr 2021 03:32:19 -0400 Received: by smtp.corp.redhat.com (Postfix) id BC38720BDB2E; Thu, 22 Apr 2021 07:32:18 +0000 (UTC) Received: from mimecast-mx02.redhat.com (mimecast02.extmail.prod.ext.rdu2.redhat.com [10.11.55.18]) by smtp.corp.redhat.com (Postfix) with ESMTPS id B5B9D20BDB2F for ; Thu, 22 Apr 2021 07:32:18 +0000 (UTC) Received: from us-smtp-1.mimecast.com (us-smtp-2.mimecast.com [207.211.31.81]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 0DFE9A28814 for ; Thu, 22 Apr 2021 07:32:18 +0000 (UTC) Received: from m97136.mail.qiye.163.com (m97136.mail.qiye.163.com [220.181.97.136]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-477-Jac26QenMTqhb-hfHOvDCQ-1; Thu, 22 Apr 2021 03:32:14 -0400 Received: from localhost.localdomain (unknown [58.56.27.130]) by smtp2 (Coremail) with SMTP id iOCowAA3HLYJJYFgMwTJAQ--.5876S3; Thu, 22 Apr 2021 15:26:03 +0800 (CST) X-MC-Unique: 2Mrg0ZO9P_CCo5vwwiOfPw-1 X-MC-Unique: Jac26QenMTqhb-hfHOvDCQ-1 From: Shi Lei To: libvir-list@redhat.com Subject: [RFCv3 01/25] scripts: Add a tool to generate xml parse/format functions Date: Thu, 22 Apr 2021 15:25:09 +0800 Message-Id: <20210422072533.312211-2-shi_lei@massclouds.com> In-Reply-To: <20210422072533.312211-1-shi_lei@massclouds.com> References: <20210422072533.312211-1-shi_lei@massclouds.com> MIME-Version: 1.0 X-CM-TRANSID: iOCowAA3HLYJJYFgMwTJAQ--.5876S3 X-Coremail-Antispam: 1Uf129KBjvAXoWfKw1xuF4xKrW3tw4kXrWUurg_yoW7ZF4DWo WfK3W8tF1rur43KrykKF95Wr1kZrZ0gr47J3s3Gry5WanFqrW3u3WrZa1Yqa90vr4UCr90 vr1xXa43JF4kAFyfn29KB7ZKAUJUUUU8529EdanIXcx71UUUUU7v73VFW2AGmfu7bjvjm3 AaLaJ3UbIYCTnIWIevJa73UjIFyTuYvjfUL8p5UUUUU X-Originating-IP: [58.56.27.130] X-CM-SenderInfo: pvklsz1hl6ztxvvfz0xxgvhudrp/1tbifgx8T1rpO2KmjgAAsD X-Mimecast-Impersonation-Protect: Policy=CLT - Impersonation Protection Definition; Similar Internal Domain=false; Similar Monitored External Domain=false; Custom External Domain=false; Mimecast External Domain=false; Newly Observed Domain=false; Internal User Name=false; Custom Display Name List=false; Reply-to Address Mismatch=false; Targeted Threat Dictionary=false; Mimecast Threat Dictionary=false; Custom Threat Dictionary=false X-Scanned-By: MIMEDefang 2.78 on 10.11.54.6 X-loop: libvir-list@redhat.com Cc: Shi Lei X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=libvir-list-bounces@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" This tool is used to generate parsexml/formatbuf/clear functions. It is based on libclang and its python-binding. Some directives (such as genparse, xmlattr, etc.) need to be added on the declarations of structs to direct the tool. Signed-off-by: Shi Lei --- po/POTFILES.in | 1 + scripts/xmlgen/directive.py | 1192 +++++++++++++++++++++++++++++++++++ scripts/xmlgen/go | 29 + scripts/xmlgen/main.py | 534 ++++++++++++++++ scripts/xmlgen/utils.py | 121 ++++ 5 files changed, 1877 insertions(+) create mode 100644 scripts/xmlgen/directive.py create mode 100755 scripts/xmlgen/go create mode 100755 scripts/xmlgen/main.py create mode 100644 scripts/xmlgen/utils.py diff --git a/po/POTFILES.in b/po/POTFILES.in index 413783ee..9740bb2b 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -5,6 +5,7 @@ @BUILDDIR@src/admin/admin_server_dispatch_stubs.h @BUILDDIR@src/remote/remote_client_bodies.h @BUILDDIR@src/remote/remote_daemon_dispatch_stubs.h +@SRCDIR@scripts/xmlgen/directive.py @SRCDIR@src/access/viraccessdriverpolkit.c @SRCDIR@src/access/viraccessmanager.c @SRCDIR@src/admin/admin_server.c diff --git a/scripts/xmlgen/directive.py b/scripts/xmlgen/directive.py new file mode 100644 index 00000000..cc8fb5aa --- /dev/null +++ b/scripts/xmlgen/directive.py @@ -0,0 +1,1192 @@ +# +# Copyright (C) 2021 Shandong Massclouds Co.,Ltd. +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library. If not, see +# . +# + +import json +from collections import OrderedDict +from utils import singleton, dedup, Block, Terms, render + +BUILTIN_TYPES =3D { + 'String': {}, + 'Bool': { + 'conv': 'virStrToBoolYesNo(${mdvar}, &def->${name})' + }, + 'BoolYesNo': { + 'conv': 'virStrToBoolYesNo(${mdvar}, &def->${name})' + }, + 'BoolOnOff': { + 'conv': 'virStrToBoolOnOff(${mdvar}, &def->${name})' + }, + 'BoolTrueFalse': { + 'conv': 'virStrToBoolTrueFalse(${mdvar}, &def->${name})' + }, + 'Chars': { + 'conv': 'virStrcpyStatic(def->${name}, ${name}Str)' + }, + 'UChars': { + 'conv': 'virStrcpyStatic((char *)def->${name}, ${mdvar})' + }, + 'Int': { + 'fmt': '%d', + 'conv': 'virStrToLong_i(${mdvar}, NULL, 0, &def->${name})' + }, + 'UInt': { + 'fmt': '%u', + 'conv': 'virStrToLong_uip(${mdvar}, NULL, 0, &def->${name})' + }, + 'ULong': { + 'fmt': '%lu', + 'conv': 'virStrToLong_ulp(${mdvar}, NULL, 0, &def->${name})' + }, + 'ULongLong': { + 'fmt': '%llu', + 'conv': 'virStrToLong_ullp(${mdvar}, NULL, 0, &def->${name})' + }, + 'U8': { + 'fmt': '%u', + 'conv': 'virStrToLong_u8p(${mdvar}, NULL, 0, &def->${name})' + }, + 'U32': { + 'fmt': '%u', + 'conv': 'virStrToLong_uip(${mdvar}, NULL, 0, &def->${name})' + }, + 'Time': { + 'conv': 'virStrToTime(${mdvar}, &def->${name})' + }, +} + + +@singleton +class TypeTable(OrderedDict): + def __init__(self): + OrderedDict.__init__(self) + for name, kvs in BUILTIN_TYPES.items(): + kvs['name'] =3D name + kvs['meta'] =3D 'Builtin' + self[name] =3D kvs + + def register(self, kvs): + name =3D kvs['name'] + if name not in self: + self[name] =3D kvs + return name + + def get(self, name): + if name in self: + return self[name] + return {'meta': 'Struct', 'name': name, 'external': True} + + def check(self, name): + return name in self + + +T_NAMESPACE_PARSE =3D [ + 'if (xmlopt)', + ' def->ns =3D xmlopt->ns;', + 'if (def->ns.parse) {', + ' if (virXMLNamespaceRegister(ctxt, &def->ns) < 0)', + ' goto error;', + ' if ((def->ns.parse)(ctxt, &def->namespaceData) < 0)', + ' goto error;', + '}' +] + +T_NAMESPACE_FORMAT_BEGIN =3D [ + 'if (def->namespaceData && def->ns.format)', + ' virXMLNamespaceFormatNS(buf, &def->ns);' +] + +T_NAMESPACE_FORMAT_END =3D [ + 'if (def->namespaceData && def->ns.format) {', + ' if ((def->ns.format)(buf, def->namespaceData) < 0)', + ' return -1;', + '}' +] + + +def funcSignature(rtype, name, args, semicolon=3D''): + alignment =3D ' ' * (len(name) + 1) + connector =3D ',\n' + alignment + + ret =3D [] + ret.append(rtype) + ret.append('%s(%s)%s' % (name, connector.join(args), semicolon)) + return Block(ret) + + +def counterName(member): + if isinstance(member['array'], bool): + return 'n' + member['name'] + return member['array'] + + +def loop(count, block, condition=3DNone): + assert isinstance(block, list) and len(block) > 0 + lp =3D ' {' if len(block) > 1 else '' + condition =3D condition if condition else count + + ret =3D Block() + ret.format('if (${condition}) {', condition=3Dcondition) + ret.format(' size_t i;') + ret.format(' for (i =3D 0; i < ${count}; i++)${lp}', count=3Dcount,= lp=3Dlp) + ret.mapfmt(' ${_each_line_}', block) + ret.format(' }' if lp else None) + ret.format('}') + return ret + + +def ispointer(member): + mtype =3D TypeTable().get(member['type']) + return member['pointer'] and not mtype.get('external') + + +def clearMember(member, pre_name=3DNone): + if not member.get('xmlattr') and not member.get('xmlelem') \ + and not member.get('xmlgroup') and not member.get('xmlswitch'): + return None + + # Callback for make_switch + def _switch_clear_cb(child, switch, _): + return clearMember(child, switch['name']) + + if member.get('xmlswitch'): + return makeSwitch(member, _switch_clear_cb, None) + + mtype =3D TypeTable().get(member['type']) + + if pre_name: + ref =3D 'def->%s.%s' % (pre_name, member['name']) + else: + ref =3D 'def->%s' % member['name'] + + if member.get('array'): + ref +=3D '[i]' + + ret =3D Block() + if mtype['meta'] =3D=3D 'Struct': + if ispointer(member): + ret.format('${tname}Clear(${ref});', tname=3Dmtype['name'], re= f=3Dref) + ret.format('g_free(${ref});', ref=3Dref) + ret.format('${ref} =3D NULL;', ref=3Dref) + else: + ret.format('${tname}Clear(&${ref});', tname=3Dmtype['name'], r= ef=3Dref) + elif mtype['name'] =3D=3D 'String': + ret.format('g_free(${ref});', ref=3Dref) + ret.format('${ref} =3D NULL;', ref=3Dref) + elif mtype['name'] in ['Chars', 'UChars']: + ret.format('memset(${ref}, 0, sizeof(${ref}));', ref=3Dref) + elif not member.get('array'): + ret.format('${ref} =3D 0;', ref=3Dref) + + if member.get('specified'): + assert not member.get('array'), "'specified' can't come with 'arra= y'." + sname, managed =3D member['specified'] + if managed: + ret.format('def->${sname} =3D false;', sname=3Dsname) + + if member.get('array') and len(ret) > 0: + count =3D 'def->' + counterName(member) + ret =3D loop(count, ret) + ret.format('g_free(def->${name});', name=3Dmember['name']) + ret.format('def->${name} =3D NULL;', name=3Dmember['name']) + ret.format('${count} =3D 0;', count=3Dcount) + + return ret + + +def makeClearFunc(writer, atype): + if 'genparse' not in atype: + return + + args =3D ['%s *def' % atype['name']] + signature =3D funcSignature('void', atype['name'] + 'Clear', args) + writer.write(atype, 'clearfunc', '.h', signature.output() + ';') + + ret =3D Block() + ret.extend(signature) + ret.format('{') + ret.format(' if (!def)') + ret.format(' return;') + ret.newline() + + delay_members =3D [] + for member in atype['members']: + if member.get('delay_clear'): + delay_members.append(member) + continue + + code =3D clearMember(member) + if code: + ret.mapfmt(' ${_each_line_}', code) + ret.newline() + + for member in delay_members: + code =3D clearMember(member) + if code: + ret.mapfmt(' ${_each_line_}', code) + ret.newline() + + if 'namespace' in atype: + ret.format(' if (def->namespaceData && def->ns.free)') + ret.format(' (def->ns.free)(def->namespaceData);') + else: + ret.pop() # Remove last newline + + ret.format('}') + writer.write(atype, 'clearfunc', '.c', ret.output()) + + +def reportInvalid(tname, mdvar): + ret =3D Block() + ret.append('virReportError(VIR_ERR_XML_ERROR,') + ret.append(" _(\"Invalid '%s' setting '%s' in '%s'\"),") + ret.format(' "${tname}", ${mdvar}, instname);', + tname=3Dtname, mdvar=3Dmdvar) + return ret + + +def reportMissing(tname): + ret =3D Block() + ret.append('virReportError(VIR_ERR_XML_ERROR,') + ret.append(" _(\"Missing '%s' setting in '%s'\"),") + ret.format(' "${tname}", instname);', tname=3Dtname) + return ret + + +def checkError(kind, cond, tname, mdvar): + if kind =3D=3D 'Invalid': + report =3D reportInvalid(tname, mdvar) + elif kind =3D=3D 'Missing': + report =3D reportMissing(tname) + else: + assert False, '%s is unsupported.' % kind + + ret =3D Block() + ret.format('if (${cond}) {', cond=3Dcond) + ret.mapfmt(' ${_each_line_}', report) + ret.append(' goto error;') + ret.append('}') + return ret + + +def parseMember(member, parent, tmpvars, pre_name=3DNone): + mtype =3D TypeTable().get(member['type']) + + # + # Helper functions + # + def _middle_var(member): + ret =3D member['name'].replace('.', '_') + if member.get('xmlgroup'): + ret =3D 'node' + elif mtype['name'] =3D=3D 'String': + ret =3D 'def->' + ret + elif member.get('xmlattr') or \ + member.get('xmltext') or mtype['meta'] !=3D 'Struct': + ret +=3D 'Str' + else: + ret +=3D 'Node' + return ret + + def _read_xml_func(mdvar, tname): + tagname =3D tname + if member.get('xmlattr'): + if '/' in tname: + funcname =3D 'virXMLChildPropString' + else: + funcname =3D 'virXMLPropString' + elif member.get('xmlelem'): + if not member.get('xmltext') and mtype['meta'] =3D=3D 'Struct': + funcname =3D 'virXMLChildNode' + else: + funcname =3D 'virXMLChildNodeContent' + else: + return None + + return render('${mdvar} =3D ${funcname}(node, "${tname}");', + mdvar=3Dmdvar, funcname=3Dfuncname, tname=3Dtagname) + + def _assign_struct(name, member, mdvar): + ret =3D Block() + if ispointer(member): + ret.format('def->${name} =3D g_new0(typeof(*def->${name}), 1);= ', + name=3Dname) + + func =3D mtype['name'] + 'ParseXML' + amp =3D '' if ispointer(member) else '&' + tmpl =3D '${func}(${mdvar}, ${amp}def->${name}, instname, ' \ + 'arg_parent, arg_opaque)' + fn =3D render(tmpl, func=3Dfunc, mdvar=3Dmdvar, amp=3Damp, name=3D= name) + ret.extend(if_cond(fn + ' < 0', ['goto error;'])) + return ret + + def _assign_non_struct(name, member, mdvar): + if mtype['meta'] =3D=3D 'Enum': + typename =3D mtype['name'] + if not typename.endswith('Type'): + typename +=3D 'Type' + expr =3D render('(def->${name} =3D ${typename}FromString(${mdv= ar}))', + name=3Dname, typename=3Dtypename, mdvar=3Dmdvar) + if mtype['with_default']: + expr +=3D ' <=3D 0' + else: + expr +=3D ' < 0' + else: + builtin =3D BUILTIN_TYPES.get(mtype['name']) + assert builtin, mtype['name'] + tmpl =3D builtin.get('conv', None) + if tmpl: + expr =3D render(tmpl, name=3Dname, mdvar=3Dmdvar, tname=3D= tname) + expr +=3D ' < 0' + else: + return None + + return checkError('Invalid', expr, tname, mdvar) + + def _parse_array(name, member, tname): + num =3D 'n%sNodes' % Terms.upperInitial(tname) + tmpvars.append(num) + tmpvars.append('nodes') + count =3D counterName(member) + + if mtype['meta'] =3D=3D 'Struct' and not member.get('xmltext'): + item =3D _assign_struct(name + '[i]', member, 'tnode') + else: + item =3D ['def->%s[i] =3D virXMLNodeContentString(tnode);' % n= ame] + + ret =3D Block() + ret.format('${num} =3D virXMLChildNodeSet(node, "${tname}", &nodes= );', + num=3Dnum, tname=3Dtname) + ret.format('if (${num} > 0) {', num=3Dnum) + ret.format(' size_t i;') + ret.newline() + ret.format(' def->${name} =3D g_new0(typeof(*def->${name}), ${n= um});', + name=3Dname, num=3Dnum) + ret.format(' for (i =3D 0; i < ${num}; i++) {', num=3Dnum) + ret.format(' xmlNodePtr tnode =3D nodes[i];') + ret.mapfmt(' ${_each_line_}', item) + ret.format(' }') + ret.format(' def->${count} =3D ${num};', count=3Dcount, num=3Dn= um) + ret.format(' g_free(nodes);') + ret.format(' nodes =3D NULL;') + ret.format('} else if (${num} < 0) {', num=3Dnum) + ret.format(' virReportError(VIR_ERR_XML_ERROR,') + ret.format(' _("Invalid %s element found."),') + ret.format(' "${tname}");', tname=3Dtname) + ret.format(' goto error;') + + if member.get('required'): + ret.append('} else {') + ret.mapfmt(' ${_each_line_}', reportMissing(tname)) + ret.append(' goto error;') + + ret.append('}') + return ret + + def getTag(member): + if member.get('xmlattr'): + return member['xmlattr'] + elif member.get('xmlelem'): + return member['xmlelem'] + else: + return None + + # + # Main routine + # + + if member.get('skipparse'): + return None + + tname =3D getTag(member) + if not tname and not member.get('xmlgroup'): + return None + + if pre_name: + name =3D pre_name + '.' + member['name'] + else: + name =3D member['name'] + + # For array member + if member.get('array'): + return _parse_array(name, member, tname) + + # For common member + mdvar =3D _middle_var(member) + if mdvar.endswith('Str') or mdvar.endswith('Node'): + tmpvars.append(mdvar) + + block =3D Block() + if tname: + block.append(_read_xml_func(mdvar, tname)) + if member.get('required'): + cond =3D render('${mdvar} =3D=3D NULL', mdvar=3Dmdvar) + block.extend(checkError('Missing', cond, tname, mdvar)) + + if mtype['meta'] =3D=3D 'Struct': + assignment =3D _assign_struct(name, member, mdvar) + else: + assignment =3D _assign_non_struct(name, member, mdvar) + if not assignment: + return block + + if member.get('specified'): + sname, managed =3D member['specified'] + if managed: + assignment.format('def->${sname} =3D true;', sname=3Dsname) + + if tname: + block.extend(if_cond(mdvar, assignment)) + else: + block.extend(assignment) + + return block + + +def makeParseFunc(writer, atype): + + # + # Helper functions + # + def _switch_parse_cb(child, switch, tmpvars): + return parseMember(child, atype, tmpvars, switch['name']) + + def _members_block(tmpvars): + block =3D Block() + for member in atype['members']: + if member.get('xmlswitch'): + code =3D makeSwitch(member, _switch_parse_cb, tmpvars) + else: + code =3D parseMember(member, atype, tmpvars) + + if code: + block.extend(code) + block.newline() + return block + + def _post_hook(tmpvars): + args =3D ['node', 'def', 'instname', 'parent', 'opaque'] + if 'namespace' in atype: + args.append('ctxt') + args.append('xmlopt') + + args.extend(tmpvars) + if 'nodes' in args: + args.remove('nodes') + + funcname =3D atype['name'] + 'ParseHook' + cond =3D '%s(%s) < 0' % (funcname, ', '.join(args)) + return if_cond(cond, ['goto error;']) + + def _handle_tmpvars(tmpvars): + args, heads, tails =3D [], [], [] + for var in tmpvars: + if var =3D=3D 'nodes': + heads.append('xmlNodePtr *nodes =3D NULL;') + tails.append('g_free(nodes);') + tails.append('nodes =3D NULL;') + elif var.endswith('Str'): + heads.append('g_autofree char *%s =3D NULL;' % var) + args.append('const char *%s' % var) + elif var.endswith('Node'): + heads.append('xmlNodePtr %s =3D NULL;' % var) + args.append('xmlNodePtr %s' % var) + else: + assert var.endswith('Nodes') and var.startswith('n') + heads.append('int %s =3D 0;' % var) + args.append('int %s' % var) + + heads.append('void *arg_parent G_GNUC_UNUSED =3D def;') + heads.append('void *arg_opaque G_GNUC_UNUSED =3D opaque;') + heads.append('') + + heads.append('if (!def)') + heads.append(' goto error;') + tails.append('%sClear(def);' % atype['name']) + return args, heads, tails + + # + # Composite + # + if 'genparse' not in atype: + return + + typename =3D atype['name'] + funcname =3D typename + 'ParseXML' + + # Declare virXXXParseXML + args =3D Block([ + 'xmlNodePtr node', + '%s *def' % typename, + 'const char *instname', + 'void *parent', + 'void *opaque' + ]) + + if 'namespace' in atype: + args.append('xmlXPathContextPtr ctxt') + args.append('virNetworkXMLOption *xmlopt') + + signature =3D funcSignature('int', funcname, args) + writer.write(atype, 'parsefunc', '.h', signature.output() + ';') + + # Prepare for implementation + tmpvars =3D [] + parseblock =3D _members_block(tmpvars) + tmpvars =3D dedup(tmpvars) + tmpargs, headlines, cleanup =3D _handle_tmpvars(tmpvars) + posthook =3D _post_hook(tmpvars) + + # Declare virXXXParseXMLHook + macro =3D 'ENABLE_' + Terms.allcaps(typename) + '_PARSE_HOOK' + signature =3D funcSignature('int', typename + 'ParseHook', + args + tmpargs, ';') + + hook_decl =3D Block() + hook_decl.format('#ifdef ${macro}', macro=3Dmacro) + hook_decl.newline() + hook_decl.extend(signature) + hook_decl.newline() + hook_decl.format('#endif') + writer.write(atype, 'parsefunc', '.h', hook_decl.output()) + + setargs_args =3D ['xmlNodePtr node', 'void *parent', + 'void **pparent', 'void **popaque'] + setargs_signature =3D funcSignature('void', funcname + 'SetArgs', + setargs_args, ';') + + setargs_decl =3D Block() + setargs_decl.format('#ifdef ${macro}_SET_ARGS', macro=3Dmacro) + setargs_decl.newline() + setargs_decl.extend(setargs_signature) + setargs_decl.newline() + setargs_decl.format('#endif') + writer.write(atype, 'parsefunc', '.h', setargs_decl.output()) + + # Implement virXXXParseXML + args[2] +=3D ' G_GNUC_UNUSED' + args[3] +=3D ' G_GNUC_UNUSED' + args[4] +=3D ' G_GNUC_UNUSED' + + impl =3D funcSignature('int', funcname, args) + impl.format('{') + impl.mapfmt(' ${_each_line_}', headlines) + + impl.newline() + impl.format('#ifdef ${macro}_SET_ARGS', macro=3Dmacro) + impl.format(' ${funcname}(node, parent, &arg_parent, &arg_opaque);', + funcname=3D(funcname + 'SetArgs')) + impl.format('#endif') + impl.newline() + + impl.mapfmt(' ${_each_line_}', parseblock) + + impl.format('#ifdef ${macro}', macro=3Dmacro) + impl.mapfmt(' ${_each_line_}', posthook) + impl.format('#endif') + impl.newline() + + if 'namespace' in atype: + impl.mapfmt(' ${_each_line_}', T_NAMESPACE_PARSE) + + impl.format(' return 0;') + impl.newline() + impl.format(' error:') + impl.mapfmt(' ${_each_line_}', cleanup) + impl.format(' return -1;') + impl.format('}') + + writer.write(atype, 'parsefunc', '.c', impl.output()) + + +def if_cond(condition, block): + assert isinstance(block, list) and len(block) > 0 + lp =3D ' {' if len(block) > 1 else '' + + ret =3D Block() + ret.format('if (${condition})${lp}', condition=3Dcondition, lp=3Dlp) + ret.mapfmt(' ${_each_line_}', block) + ret.format('}' if lp else None) + return ret + + +def formatMember(member, parent): + mtype =3D TypeTable().get(member['type']) + + # + # Helper functions. + # + def _checkOnCondition(var): + ret =3D None + if ispointer(member): + ret =3D var + elif member.get('specified'): + sname, _ =3D member['specified'] + ret =3D 'def->' + sname + if ret.startswith('&'): + ret =3D ret[1:] + elif mtype['meta'] =3D=3D 'Struct': + ret =3D '%sCheck(&%s, def, opaque)' % (mtype['name'], var) + elif mtype['meta'] =3D=3D 'Enum': + if mtype['with_default']: + ret =3D var + ' > 0' + else: + ret =3D var + ' >=3D 0' + elif mtype['meta'] =3D=3D 'Builtin': + if mtype['name'] in ['Chars', 'UChars']: + ret =3D var + '[0]' + else: + ret =3D var + + return ret + + def _format(layout, var): + if member.get('array'): + buf =3D 'buf' + elif member.get('wrap'): + buf =3D '&%s_%sBuf' % (member['wrap'], member['xmlattr']) + else: + buf =3D '&' + member['name'].replace('.', '_') + 'Buf' + + if mtype['meta'] =3D=3D 'Struct': + if not ispointer(member): + var =3D '&' + var + + fname =3D mtype['name'] + 'FormatBuf' + cond =3D '%s(%s, "%s", %s, def, opaque) < 0' % \ + (fname, buf, layout, var) + return if_cond(cond, ['return -1;']) + elif mtype['meta'] =3D=3D 'Enum': + name =3D mtype['name'] + if not name.endswith('Type'): + name +=3D 'Type' + + ret =3D Block() + ret.format('const char *str =3D ${name}ToString(${var});', + name=3Dname, var=3Dvar) + ret.format('if (!str) {') + ret.format(' virReportError(VIR_ERR_INTERNAL_ERROR,') + ret.format(' _("Unknown %s type %d"),') + ret.format(' "${tname}", ${var});', + tname=3Dmember['xmlattr'], var=3Dvar) + ret.format(' return -1;') + ret.format('}') + ret.format('virBufferAsprintf(${buf}, "${layout}", str);', + buf=3Dbuf, layout=3Dlayout) + return ret + elif mtype['name'] in ['Bool', 'BoolYesNo']: + var =3D '%s ? "yes" : "no"' % var + return ['virBufferEscapeString(%s, "%s", %s);' % (buf, layout,= var)] + elif mtype['name'] =3D=3D 'BoolOnOff': + var =3D '%s ? "on" : "off"' % var + return ['virBufferEscapeString(%s, "%s", %s);' % (buf, layout,= var)] + elif mtype['name'] =3D=3D 'BoolTrueFalse': + var =3D '%s ? "true" : "false"' % var + return ['virBufferEscapeString(%s, "%s", %s);' % (buf, layout,= var)] + elif mtype['name'] =3D=3D 'String': + return ['virBufferEscapeString(%s, "%s", %s);' % (buf, layout,= var)] + elif mtype['name'] =3D=3D 'Time': + return ['virTimeFormatBuf(%s, "%s", %s);' % (buf, layout, var)] + else: + return ['virBufferAsprintf(%s, "%s", %s);' % (buf, layout, var= )] + + def _handleAttr(tagname, var): + if 'xmlattr' not in member: + return None + + fmt =3D '%s' + if mtype['meta'] =3D=3D 'Builtin': + fmt =3D BUILTIN_TYPES[mtype['name']].get('fmt', '%s') + + if tagname: + layout =3D " %s=3D'%s'" % (tagname, fmt) + else: + layout =3D "%s" + return _format(layout, var) + + def _handleElem(tagname, var): + if 'xmlattr' in member: + return None + + if member.get('xmltext') or mtype['meta'] !=3D 'Struct': + layout =3D '<%s>%%s\\n' % (tagname, tagname) + else: + layout =3D tagname + + code =3D _format(layout, var) + return code + + # + # Main routine + # + name =3D member['name'] + if member.get('array'): + name =3D name + '[i]' + var =3D 'def->' + name + + ret =3D None + if 'xmlattr' in member: + tagname =3D member['xmlattr'] + ret =3D _handleAttr(tagname, var) + else: + tagname =3D member['xmlelem'] + ret =3D _handleElem(tagname, var) + + if not ret: + return None, None + + if member.get('wrap'): + hookbuf =3D '%s_%sBuf' % (member['wrap'], member['xmlattr']) + else: + hookbuf =3D member['name'].replace('.', '_') + 'Buf' + + checks =3D '!virBufferTouched(&%s)' % (hookbuf) + + # For array + if member.get('array'): + counter =3D 'def->' + counterName(member) + cond =3D checks + ' && ' + counter + code =3D Block() + code.format('virBufferInheritIndent(&${hbuf}, buf);', hbuf=3Dhookb= uf) + code.extend(loop(counter, ret, cond)) + code.format('virBufferAddBuffer(buf, &${hbuf});', hbuf=3Dhookbuf) + return code, counter + + # Not array + check =3D _checkOnCondition(var) + if check and not member.get('required'): + if '&&' in check or '||' in check: + check =3D '(%s)' % check + checks =3D checks + ' && ' + check + + code =3D Block() + code.format('virBufferInheritIndent(&${hbuf}, buf);', hbuf=3Dhookbuf) + code.extend(if_cond(checks, ret)) + code.format('virBufferAddBuffer(buf, &${hbuf});', hbuf=3Dhookbuf) + return code, check + + +def makeSwitch(switch, callback, opaque=3DNone): + assert switch.get('xmlswitch', None) and switch.get('switch_type', Non= e) + + captype =3D Terms.allcaps(switch['switch_type']) + block =3D Block() + block.format('switch (def->${etype}) {', etype=3Dswitch['xmlswitch']) + block.newline() + for child in switch['members']: + value =3D captype + '_' + Terms.allcaps(child['name']) + block.format('case ${value}:', value=3Dvalue) + block.mapfmt(' ${_each_line_}', callback(child, switch, opaque)) + block.format(' break;') + block.newline() + + enum =3D TypeTable().get(switch['switch_type']) + if enum['with_default']: + block.format('case ${captype}_NONE:', captype=3Dcaptype) + + block.format('case ${captype}_LAST:', captype=3Dcaptype) + block.format(' break;') + block.format('}') + return block + + +def makeFormatFunc(writer, atype): + if 'genformat' not in atype: + return + + # + # Helper functions and classes. + # + def _handleHeads(tmpvars): + tmpvars =3D dedup(tmpvars) + heads =3D Block() + heads.format('virTristateBool empty G_GNUC_UNUSED =3D ' + 'VIR_TRISTATE_BOOL_ABSENT;') + heads.format('virTristateBool shortcut G_GNUC_UNUSED =3D ' + 'VIR_TRISTATE_BOOL_ABSENT;') + heads.mapfmt( + 'g_auto(virBuffer) ${_each_line_} =3D VIR_BUFFER_INITIALIZER;', + tmpvars + ) + heads.newline() + + heads.format('if (!def || !buf)') + heads.format(' return 0;') + return '\n'.join(heads) + + def _handleHook(tmpvars, typename, kind=3D''): + funcname =3D typename + 'Format' + kind + 'Hook' + macro =3D 'ENABLE_' + Terms.allcaps(funcname) + + tmpvars =3D dedup(tmpvars) + args =3D Block(['def', 'parent', 'opaque']) + if not kind: + args.append('&empty') + args.append('&shortcut') + args.mapfmt('&${_each_line_}', tmpvars) + + heads =3D Block() + heads.format('if (%s(%s) < 0)' % (funcname, ', '.join(args))) + heads.format(' return -1;') + + args =3D Block([ + 'const %s *def' % typename, + 'const void *parent', + 'const void *opaque' + ]) + if not kind: + args.append('virTristateBool *empty') + args.append('virTristateBool *shortcut') + args.mapfmt('virBuffer *${_each_line_}', tmpvars) + + fmt_signature =3D funcSignature('int', funcname, args, ';') + + hook_decl =3D Block() + hook_decl.format('#ifdef ${macro}', macro=3Dmacro) + hook_decl.newline() + hook_decl.extend(fmt_signature) + hook_decl.newline() + hook_decl.format('#endif /* ${macro} */', macro=3Dmacro) + writer.write(atype, 'formatfunc', '.h', hook_decl.output()) + return '\n'.join(heads) + + def _handle_check_func(checks, kind=3D''): + # Declare virXXXCheck[Attr|Elem] + typename =3D atype['name'] + funcname =3D typename + 'Check' + kind + args =3D [ + 'const %s *def' % typename, + 'const void *parent', + 'void *opaque' + ] + signature =3D funcSignature('bool', funcname, args) + writer.write(atype, 'formatfunc', '.h', signature.output() + ';') + + # Implement virXXXFormat[Attr|Elem] + check =3D ' || '.join(checks) if checks else 'false' + + args[1] +=3D ' G_GNUC_UNUSED' + args[2] +=3D ' G_GNUC_UNUSED' + + macro =3D 'RESET_' + Terms.allcaps(funcname) + + impl =3D Block() + impl.format('#ifndef ${macro}', macro=3Dmacro) + impl.newline() + impl.extend(funcSignature('bool', funcname, args)) + impl.format('{') + impl.format(' if (!def)') + impl.format(' return false;') + impl.newline() + impl.format(' return ${check};', check=3Dcheck) + impl.format('}') + impl.newline() + impl.format('#endif /* ${macro} */', macro=3Dmacro) + writer.write(atype, 'formatfunc', '.c', impl.output()) + + def _format_group(child, switch, kind): + kind =3D kind if kind else '' + prefix =3D (switch['name'] + '.') if switch else '' + mtype =3D TypeTable().get(child['type']) + funcname =3D '%sFormat%s' % (mtype['name'], kind) + var =3D 'def->%s%s' % (prefix, child['name']) + if not ispointer(child): + var =3D '&' + var + r_check =3D '%sCheck%s(%s, def, opaque)' % (mtype['name'], kind, v= ar) + cond =3D '%s(buf, %s, def, opaque) < 0' % (funcname, var) + return if_cond(cond, ['return -1;']), r_check + + def _switch_format_cb(child, switch, kind): + return _format_group(child, switch, kind)[0] + + def _handle_wrap_attr(member): + member['wrap'], member['xmlattr'] =3D member['xmlattr'].split('/') + if member['xmlattr'] =3D=3D '.': + member['xmlattr'] =3D '' + ret, check =3D formatMember(member, atype) + return ret, check + + def _switch_check_cb(child, switch, kind): + return ['ret =3D %s;' % _format_group(child, switch, kind)[1]] + + def _prepare_member(member, atype): + attr, attr_chk, elem, elem_chk =3D None, None, None, None + if member.get('xmlswitch'): + attr =3D makeSwitch(member, _switch_format_cb, 'Attr') + elem =3D makeSwitch(member, _switch_format_cb, 'Elem') + basename =3D atype['name'] + Terms.upperInitial(member['name']) + attr_chk =3D '%sCheckAttr(def, opaque)' % basename + elem_chk =3D '%sCheckElem(def, opaque)' % basename + + # Declare virXXXCheck[Attr|Elem] for switch. + for kind in ['Attr', 'Elem']: + args =3D ['const %s *def' % atype['name'], 'void *opaque'] + funcname =3D basename + 'Check' + kind + decl =3D funcSignature('bool', funcname, args) + writer.write(atype, 'formatfunc', '.h', decl.output() + ';= ') + + # Implement virXXXCheck[Attr|Elem] for switch. + checks =3D makeSwitch(member, _switch_check_cb, kind) + + args[1] +=3D ' G_GNUC_UNUSED' + macro =3D 'RESET_' + Terms.allcaps(funcname) + + impl =3D Block() + impl.format('#ifndef ${macro}', macro=3Dmacro) + impl.newline() + impl.extend(funcSignature('bool', funcname, args)) + impl.format('{') + impl.format(' bool ret =3D false;') + impl.format(' if (!def)') + impl.format(' return false;') + impl.newline() + impl.mapfmt(' ${_each_line_}', checks) + impl.newline() + impl.format(' return ret;') + impl.format('}') + impl.newline() + impl.format('#endif /* ${macro} */', macro=3Dmacro) + writer.write(atype, 'formatfunc', '.c', impl.output()) + + elif member.get('xmlattr'): + if '/' in member['xmlattr']: + attr, attr_chk =3D _handle_wrap_attr(member) + else: + attr, attr_chk =3D formatMember(member, atype) + elif member.get('xmlelem'): + elem, elem_chk =3D formatMember(member, atype) + elif member.get('xmlgroup'): + attr, attr_chk =3D _format_group(member, None, 'Attr') + elem, elem_chk =3D _format_group(member, None, 'Elem') + return attr, attr_chk, elem, elem_chk + + class _WrapItem: + def __init__(self): + self.attrs =3D Block() + self.checks =3D [] + self.hchecks =3D Block() + self.optional =3D True + self.pos =3D 0 + + def _prepare(): + attrs =3D Block() + elems =3D Block() + attr_checks =3D [] + elem_checks =3D [] + attr_hook_vars =3D [] + elem_hook_vars =3D [] + wraps =3D OrderedDict() + for member in atype['members']: + attr, attr_chk, elem, elem_chk =3D _prepare_member(member, aty= pe) + if member.get('wrap'): + item =3D wraps.setdefault(member['wrap'], _WrapItem()) + item.pos =3D len(elems) + if member['xmlattr']: + item.attrs.extend(attr) + item.attrs.newline() + item.checks.append(attr_chk) + if member.get('required'): + item.optional =3D False + wrap_var =3D '%s_%sBuf' % (member['wrap'], member['xmlattr= ']) + elem_hook_vars.append(wrap_var) + item.hchecks.format('virBufferUse(&${buf})', buf=3Dwrap_va= r) + continue + + attrs.extend(attr) + attrs.newline(attr) + elems.extend(elem) + elems.newline(elem) + if attr_chk: + attr_checks.append(attr_chk) + if elem_chk: + elem_checks.append(elem_chk) + if member.get('xmlattr'): + attr_hook_vars.append(member['name'].replace('.', '_') + '= Buf') + elif member.get('xmlelem'): + elem_hook_vars.append(member['name'].replace('.', '_') + '= Buf') + + while wraps: + wrap, item =3D wraps.popitem() + lines =3D Block() + lines.format('virBufferAddLit(buf, "<${name}");', name=3Dwrap) + if item.attrs: + lines.newline() + lines.extend(item.attrs) + lines.format('virBufferAddLit(buf, "/>\\n");') + + checks =3D item.hchecks + if item.optional: + checks.extend(item.checks) + elem_checks.extend(item.checks) + + if checks: + lines =3D if_cond(' || '.join(checks), lines) + lines.newline() + + for line in reversed(lines): + elems.insert(item.pos, line) + + attr_checks =3D dedup(attr_checks) + elem_checks =3D dedup(elem_checks) + return (attrs, attr_checks, attr_hook_vars, + elems, elem_checks, elem_hook_vars) + + def _compose_full(attrs, attr_checks, attr_hook_vars, + elems, elem_checks, elem_hook_vars): + typename =3D atype['name'] + + # Declare virXXXFormatBuf + args =3D [ + 'virBuffer *buf', + 'const char *name', + 'const %s *def' % typename, + 'const void *parent', + 'void *opaque' + ] + signature =3D funcSignature('int', typename + 'FormatBuf', args) + writer.write(atype, 'formatfunc', '.h', signature.output() + ';') + + # Implement virXXXFormatBuf + headlines =3D _handleHeads(attr_hook_vars + elem_hook_vars) + hooklines =3D _handleHook(attr_hook_vars + elem_hook_vars, typenam= e) + + args[3] +=3D ' G_GNUC_UNUSED' + args[4] +=3D ' G_GNUC_UNUSED' + + macro =3D 'ENABLE_' + Terms.allcaps(typename) + '_FORMAT_HOOK' + + impl =3D funcSignature('int', typename + 'FormatBuf', args) + impl.format('{') + impl.mapfmt(' ${_each_line_}', headlines.split('\n')) + impl.newline() + impl.format('#ifdef ${macro}', macro=3Dmacro) + impl.mapfmt(' ${_each_line_}', hooklines.split('\n')) + impl.format('#endif /* ${macro} */', macro=3Dmacro) + impl.newline() + + empty_checks =3D '' + if attr_checks or elem_checks: + empty_checks =3D ' || !(%s)' % ' || '.join(attr_checks + elem_= checks) + + impl.format(' if (empty !=3D VIR_TRISTATE_BOOL_NO)') + impl.format(' if (empty${checks})', checks=3Dempty_checks) + impl.format(' return 0;') + impl.newline() + impl.format(' virBufferAsprintf(buf, "<%s", name);') + impl.newline() + + if 'namespace' in atype: + impl.mapfmt(' ${_each_line_}', T_NAMESPACE_FORMAT_BEGIN) + + impl.mapfmt(' ${_each_line_}', attrs) + + if elems: + if attrs: + + shortcut_checks =3D '' + if elem_checks: + shortcut_checks =3D ' || !(%s)' % ' || '.join(elem_che= cks) + + impl.format(' if (shortcut !=3D VIR_TRISTATE_BOOL_NO) {= ') + impl.format(' if (shortcut${checks}) {', + checks=3Dshortcut_checks) + impl.format(' virBufferAddLit(buf, "/>\\n");') + impl.format(' return 0;') + impl.format(' }') + impl.format(' }') + impl.newline() + + impl.format(' virBufferAddLit(buf, ">\\n");') + impl.newline() + impl.format(' virBufferAdjustIndent(buf, 2);') + impl.newline() + impl.mapfmt(' ${_each_line_}', elems) + + if 'namespace' in atype: + impl.mapfmt(' ${_each_line_}', T_NAMESPACE_FORMAT_END) + impl.newline() + + impl.format(' virBufferAdjustIndent(buf, -2);') + impl.format(' virBufferAsprintf(buf, "\\n", name);') + else: + impl.format(' virBufferAddLit(buf, "/>\\n");') + + impl.newline() + impl.format(' return 0;') + impl.format('}') + writer.write(atype, 'formatfunc', '.c', impl.output()) + + # Construct check function + _handle_check_func(attr_checks + elem_checks) + + def _compose_part(kind, block, checks, hook_vars): + typename =3D atype['name'] + funcname =3D typename + 'Format' + kind + headlines =3D _handleHeads(hook_vars) + hooklines =3D _handleHook(hook_vars, atype['name'], kind) + if not block: + block =3D ['/* no code */', ''] + + # Declare virXXXFormat[Attr|Elem] + args =3D [ + 'virBuffer *buf', + 'const %s *def' % typename, + 'const void *parent', + 'void *opaque' + ] + signature =3D funcSignature('int', funcname, args) + writer.write(atype, 'formatfunc', '.h', signature.output() + ';') + + # Implement virXXXFormat[Attr|Elem] + args[2] +=3D ' G_GNUC_UNUSED' + args[3] +=3D ' G_GNUC_UNUSED' + + macro =3D 'ENABLE_' + Terms.allcaps(typename + 'Format' + kind) + = '_HOOK' + + impl =3D funcSignature('int', funcname, args) + impl.format('{') + impl.mapfmt(' ${_each_line_}', headlines.split('\n')) + impl.newline() + impl.format('#ifdef ${macro}', macro=3Dmacro) + impl.mapfmt(' ${_each_line_}', hooklines.split('\n')) + impl.format('#endif /* ${macro} */', macro=3Dmacro) + impl.newline() + impl.mapfmt(' ${_each_line_}', block) + impl.format(' return 0;') + impl.format('}') + writer.write(atype, 'formatfunc', '.c', impl.output()) + + # Construct check function + _handle_check_func(checks, kind) + + # + # Main routine of formating. + # + (attrs, attr_checks, attr_hook_vars, + elems, elem_checks, elem_hook_vars) =3D _prepare() + + if atype['genformat'] in ['separate']: + _compose_part('Attr', attrs, attr_checks, attr_hook_vars) + _compose_part('Elem', elems, elem_checks, elem_hook_vars) + else: + _compose_full(attrs, attr_checks, attr_hook_vars, + elems, elem_checks, elem_hook_vars,) + + +def showDirective(atype): + print('\n[Directive]\n') + print(json.dumps(atype, indent=3D4) + '\n') diff --git a/scripts/xmlgen/go b/scripts/xmlgen/go new file mode 100755 index 00000000..6c4abe7a --- /dev/null +++ b/scripts/xmlgen/go @@ -0,0 +1,29 @@ +# This is a command-line tool +# +# Copyright (C) 2021 Shandong Massclouds Co.,Ltd. +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library. If not, see +# . +# + +DIR=3D"src" +if [ ${FOR_TEST} ]; then + DIR=3D"tests/xmlgenin" +fi + +export PYTHONDONTWRITEBYTECODE=3D1 +WORK_DIR=3D$(cd $(dirname $0); pwd) +SRCDIR=3D"${WORK_DIR}/../../${DIR}" +BUILDDIR=3D"${WORK_DIR}/../../build/${DIR}" +${WORK_DIR}/main.py -s ${SRCDIR} -b ${BUILDDIR} $@ diff --git a/scripts/xmlgen/main.py b/scripts/xmlgen/main.py new file mode 100755 index 00000000..48c94984 --- /dev/null +++ b/scripts/xmlgen/main.py @@ -0,0 +1,534 @@ +#!/usr/bin/env python3 +# +# Copyright (C) 2021 Shandong Massclouds Co.,Ltd. +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library. If not, see +# . +# + +import os +import re +import sys +import argparse +from clang.cindex import Index, CursorKind +from clang.cindex import SourceLocation, SourceRange, TokenKind +from datetime import datetime +from directive import TypeTable, showDirective +from directive import makeClearFunc, makeParseFunc, makeFormatFunc +from utils import Terms, Block + +TOOL_DESC =3D ''' +Generate xml parse/format functions based on directives. + +Subcommand:\n + list: List types. By default, only list structs tagged by + 'genparse'/'genformat'. When the option '-a' is specified, + list all types discovered by this tool.\n + show: Show the target type's directives and its code for preview. + Specify target type by its name. + The option '-k' can be used to filter output.\n + generate: Generate code. To be called by Makefile. + The option '-k' can be used to filter output. + +Option:\n + -k: Specify kinds to filter code output. More than one kind can be + specified, 'p' for parsefunc and 'f' for formatfunc. + When it is omitted, all functions will be outputed.\n + The option '-k' is only valid for show and generate. +''' + +DIRECTIVES =3D [ + 'genparse', 'genformat', 'xmlattr', 'xmlelem', 'xmltext', 'xmlgroup', + 'required', 'array', 'specify', 'xmlswitch', 'skipparse', +] + +BUILTIN_MAP =3D { + 'bool': 'Bool', + 'virBoolYesNo': 'BoolYesNo', + 'virBoolOnOff': 'BoolOnOff', + 'virBoolTrueFalse': 'BoolTrueFalse', + 'char': 'Char', + 'unsigned char': 'UChar', + 'int': 'Int', + 'unsigned int': 'UInt', + 'long': 'Long', + 'unsigned long': 'ULong', + 'long long': 'LongLong', + 'unsigned long long': 'ULongLong', + 'uint8_t': 'U8', + 'uint32_t': 'U32', + 'time_t': 'Time', +} + + +# Three builtin types need to be handled specially: +# 'char *' =3D> String +# 'char XXXX[...]' =3D> Chars +# 'unsigned char XXXX[...]' =3D> UChars +def getBuiltinType(ctype, ptr=3DFalse, size=3DNone): + if ctype =3D=3D 'char': + if ptr: + return 'String' + elif size: + return 'Chars' + + if ctype =3D=3D 'unsigned char' and size: + return 'UChars' + + return BUILTIN_MAP.get(ctype, None) + + +def cursorLineExtent(cursor, tu): + loc =3D cursor.location + start =3D SourceLocation.from_position(tu, loc.file, loc.line, 1) + end =3D SourceLocation.from_position(tu, loc.file, loc.line, -1) + return SourceRange.from_locations(start, end) + + +def getTokens(cursor, tu): + return tu.get_tokens(extent=3DcursorLineExtent(cursor, tu)) + + +def createDirectives(text): + tlist =3D re.findall(r'/\*(.*)\*/', text) + if len(tlist) !=3D 1: + return None + + tlist =3D tlist[0].split(',') + if len(tlist) =3D=3D 0: + return None + + directives =3D {} + for item in tlist: + item =3D item.strip() + if ':' in item: + key, value =3D item.split(':') + else: + key, value =3D item, None + + if key in DIRECTIVES: + directives[key] =3D value + return directives + + +def getDirectives(tokens, cursor): + for token in tokens: + if token.location.column <=3D cursor.location.column: + continue + if token.kind =3D=3D TokenKind.COMMENT: + directive =3D createDirectives(token.spelling) + if directive: + return directive + return None + + +def determinType(kvs, tokens, cursor): + prefix =3D [] + kind =3D None + for token in tokens: + if token.location.column >=3D cursor.location.column: + break + if not kind: + kind =3D token.kind + prefix.append(token.spelling) + + suffix =3D [] + for token in tokens: + if token.spelling =3D=3D ';': + break + suffix.append(token.spelling) + + size =3D None + if len(suffix) =3D=3D 3 and suffix[0] =3D=3D '[' and suffix[2] =3D=3D = ']': + size =3D suffix[1] + + assert kind in [TokenKind.IDENTIFIER, TokenKind.KEYWORD], \ + 'Bad field "%s" (%s).' % (cursor.spelling, kind) + + assert prefix + typename =3D ' '.join(prefix) + + # For array, remove the most-outer pointer + if kvs.get('array'): + if typename.endswith('*'): + typename =3D typename[:-1].strip() + + ptr =3D False + if typename.endswith('*'): + typename =3D typename[:-1].strip() + ptr =3D True + + ret =3D getBuiltinType(typename, ptr, size) + if ret: + typename =3D ret + + kvs.update({'type': typename, 'pointer': ptr}) + if size: + kvs['size'] =3D size + return kvs + + +def analyseMember(cursor, tu, struct): + if cursor.spelling =3D=3D 'namespaceData': + struct['namespace'] =3D True + + dvs =3D getDirectives(getTokens(cursor, tu), cursor) + if not dvs: + return None + + kvs =3D {'name': cursor.spelling} + kvs.update(dvs) + + # Formalize member + for key in ['array', 'required', 'skipparse', 'xmltext']: + if key in kvs and not kvs[key]: + kvs[key] =3D True + + if kvs.get('specify'): + assert isinstance(kvs['specify'], str) and len(kvs['specify']) > 0 + + for tag in ['xmlattr', 'xmlelem', 'xmlgroup']: + if tag in kvs: + if not kvs[tag]: + if kvs.get('array'): + kvs[tag] =3D Terms.singularize(kvs['name']) + else: + kvs[tag] =3D kvs['name'] + + return determinType(kvs, getTokens(cursor, tu), cursor) + + +def findMember(struct, name): + for member in struct['members']: + if member['name'] =3D=3D name: + return member + + return None + + +def analyseStruct(struct, cursor, tu): + tokens =3D getTokens(cursor, tu) + kvs =3D getDirectives(tokens, cursor) + if not kvs: + return struct + + path, _ =3D os.path.splitext(cursor.location.file.name) + path, filename =3D os.path.split(path) + _, dirname =3D os.path.split(path) + kvs['output'] =3D dirname + '/' + filename + struct.update(kvs) + + last_kind =3D None + inner_members =3D [] + for child in cursor.get_children(): + if inner_members: + if last_kind =3D=3D CursorKind.STRUCT_DECL: + # Flatten the members of embedded struct + for member in inner_members: + member['name'] =3D child.spelling + '.' + member['name= '] + struct['members'].append(member) + else: + # Embedded union + union =3D getDirectives(getTokens(child, tu), child) + if union and 'xmlswitch' in union: + switch =3D findMember(struct, union['xmlswitch']) + switch['delay_clear'] =3D True + union['switch_type'] =3D switch['type'] + union['name'] =3D child.spelling + union['members'] =3D inner_members + struct['members'].append(union) + struct['xmlswitch'] =3D union['xmlswitch'] + + inner_members =3D [] + last_kind =3D None + continue + + if child.kind in [CursorKind.STRUCT_DECL, CursorKind.UNION_DECL]: + last_kind =3D child.kind + for ichild in child.get_children(): + member =3D analyseMember(ichild, tu, struct) + if member: + inner_members.append(member) + continue + + member =3D analyseMember(child, tu, struct) + if member: + struct['members'].append(member) + + return struct + + +# Check whether the first item of enum is default. +# (i.e. it ends with '_NONE' or '_DEFAULT') +def checkFirstEnumItem(cursor): + find_paren =3D False + for token in cursor.get_tokens(): + # skip all parts in front of '{' + if not find_paren: + if token.spelling !=3D '{': + continue + find_paren =3D True + + if token.kind =3D=3D TokenKind.IDENTIFIER: + return token.spelling.endswith(('_NONE', '_DEFAULT', '_ABSENT'= )) + + return False + + +def rescanStruct(struct): + for member in struct['members']: + if member.get('specify'): + tname =3D member['specify'] + target =3D findMember(struct, tname) + assert target, "Can't find '%s' in '%s'" % (tname, struct['nam= e']) + managed =3D not (member.get('xmlattr') or member.get('xmlelem'= )) + target['specified'] =3D (member['name'], managed) + + +def discoverStructures(tu): + for cursor in tu.cursor.get_children(): + if cursor.kind =3D=3D CursorKind.STRUCT_DECL and cursor.is_definit= ion(): + # Detect structs + name =3D cursor.spelling + if not name: + continue + if name.startswith('_'): + name =3D name[1:] + if TypeTable().check(name): + continue + struct =3D {'name': name, 'meta': 'Struct', 'members': []} + analyseStruct(struct, cursor, tu) + rescanStruct(struct) + TypeTable().register(struct) + elif cursor.kind =3D=3D CursorKind.TYPEDEF_DECL: + # Detect enums + # We can't seek out enums by CursorKind.ENUM_DECL, + # since almost all enums are anonymous. + token =3D cursor.get_tokens() + try: + next(token) # skip 'typedef' + if next(token).spelling =3D=3D 'enum': + if not TypeTable().check(cursor.spelling): + enum =3D {'name': cursor.spelling, 'meta': 'Enum', + 'with_default': checkFirstEnumItem(cursor)} + TypeTable().register(enum) + except StopIteration: + pass + + +class CodeWriter(object): + def __init__(self, args): + self._buildtop =3D args.buildtop + self._curdir =3D args.curdir + self._cmd =3D args.cmd + self._files =3D {} + self._filters =3D {} + self._filters['clearfunc'] =3D args.kinds and 'p' in args.kinds + self._filters['parsefunc'] =3D args.kinds and 'p' in args.kinds + self._filters['formatfunc'] =3D args.kinds and 'f' in args.kinds + if args.cmd =3D=3D 'show': + self._filters['target'] =3D args.target + + def _getFile(self, path, ext): + assert ext in ['.h', '.c'] + _, basename =3D os.path.split(path) + path =3D '%s.generated%s' % (path, ext) + f =3D self._files.get(path) + if f is None: + f =3D open(path, 'w') + f.write('/* Generated by scripts/xmlgen */\n\n') + if ext in ['.c']: + f.write('#include \n') + f.write('#include "%s.h"\n' % basename) + f.write('#include "viralloc.h"\n') + f.write('#include "virerror.h"\n') + f.write('#include "virstring.h"\n\n') + f.write('#include "virenum.h"\n\n') + f.write('#define VIR_FROM_THIS VIR_FROM_NONE\n') + else: + f.write('#pragma once\n\n') + f.write('#include "internal.h"\n') + f.write('#include "virxml.h"\n') + self._files[path] =3D f + return f + + def write(self, atype, kind, extname, content): + if not self._filters[kind]: + return + + if self._cmd =3D=3D 'show': + target =3D self._filters['target'] + if not target or target =3D=3D atype['name']: + outputname =3D atype.get('output', '') + '.generated' + if extname =3D=3D '.h': + print('\n[%s.h]' % outputname) + else: + print('\n[%s.c]' % outputname) + print('\n' + content + '\n') + return + + assert self._cmd =3D=3D 'generate' + + if atype.get('output') and atype['output'].startswith(self._curdir= ): + lfs =3D '\n' if extname =3D=3D '.h' else '\n\n' + path =3D self._buildtop + '/' + atype['output'] + f =3D self._getFile(path, extname) + f.write(lfs + content + '\n') + + def complete(self): + for name in self._files: + self._files[name].close() + self._files.clear() + + +def getHFiles(path): + retlist =3D [] + for fname in os.listdir(path): + if fname.endswith('.h'): + retlist.append(os.path.join(path, fname)) + return retlist + + +def showTips(target, kinds): + atype =3D TypeTable().get(target) + if not atype or atype.get('external'): + sys.exit(0) + + kind_parse =3D kinds and 'p' in kinds and 'genparse' in atype + kind_format =3D kinds and 'f' in kinds and 'genformat' in atype + if not kind_parse and not kind_format: + sys.exit(0) + + captype =3D Terms.allcaps(target) + pathname =3D atype.get('output', '') + subdir, basename =3D os.path.split(pathname) + + tips =3D Block() + tips.newline() + tips.append('[Tips]') + tips.newline() + tips.format('/* Put these lines at the bottom of "${path}.h" */', + path=3Dpathname) + tips.format('/* Makesure "${base}.h" to be appended into ' + '${cur}_xmlgen_input in src/${cur}/meson.build */', + base=3Dbasename, cur=3Dsubdir) + + if kind_parse or kind_format: + tips.newline() + tips.append('/* Define macro to enable hook or redefine check ' + 'when necessary */') + + if kind_parse: + tips.format('/* #define ENABLE_${cap}_PARSE_HOOK */', cap=3Dcaptyp= e) + tips.format('/* #define ENABLE_${cap}_PARSE_HOOK_SET_ARGS */', + cap=3Dcaptype) + + if kind_format: + if atype.get('genformat') in ['separate']: + tips.format('/* #define ENABLE_${cap}_FORMAT_ATTR_HOOK */', + cap=3Dcaptype) + tips.format('/* #define ENABLE_${cap}_FORMAT_ELEM_HOOK */', + cap=3Dcaptype) + tips.newline() + tips.format('/* #define RESET_${cap}_CHECK_ATTR */', + cap=3Dcaptype) + tips.format('/* #define RESET_${cap}_CHECK_ELEM */', + cap=3Dcaptype) + else: + tips.format('/* #define ENABLE_${cap}_FORMAT_HOOK */', + cap=3Dcaptype) + tips.newline() + tips.format('/* #define RESET_${cap}_CHECK */', cap=3Dcaptype) + + tips.newline() + tips.append('/* Makesure below is the bottom line! */') + tips.format('#include "${base}.generated.h"', base=3Dbasename) + print(tips.output()) + + +HELP_LIST =3D 'list structs tagged by "genparse"/"genformat"' +HELP_LIST_ALL =3D 'list all discovered types' + +if __name__ =3D=3D "__main__": + parser =3D argparse.ArgumentParser( + formatter_class=3Dargparse.RawDescriptionHelpFormatter, + description=3DTOOL_DESC) + parser.add_argument('-s', dest=3D'srctop', help=3D'top source director= y') + parser.add_argument('-b', dest=3D'buildtop', help=3D'top build directo= ry') + parser.add_argument('-d', dest=3D'curdir', + help=3D'directory to be dealt with. (util or conf)= ') + subparsers =3D parser.add_subparsers(dest=3D'cmd') + parser_list =3D subparsers.add_parser('list', help=3DHELP_LIST) + parser_list.add_argument('-a', dest=3D'list_all', action=3D'store_true= ', + default=3DFalse, help=3DHELP_LIST_ALL) + parser_show =3D subparsers.add_parser('show', help=3D'show target code= ') + parser_show.add_argument('target', help=3D'target for being previewed') + parser_show.add_argument('-k', dest=3D'kinds', default=3D'pf', + help=3D'kinds of code to be previewed') + parser_show.add_argument('-V', dest=3D'verbose', action=3D'store_true', + help=3D'internal information for debug') + parser_generate =3D subparsers.add_parser('generate', help=3D'generate= code') + parser_generate.add_argument('-k', dest=3D'kinds', default=3D'pf', + help=3D'kinds of code to be generated') + args =3D parser.parse_args() + + if not args.cmd or not args.srctop or not args.buildtop: + parser.print_help() + sys.exit(1) + + if args.cmd =3D=3D 'generate': + print('###### xmlgen: work in src/%s ... ######' % args.curdir) + + timestamp =3D datetime.now() + + # Examine all *.h in "$(srctop)/[util|conf]" + index =3D Index.create() + srctop =3D args.srctop + hfiles =3D getHFiles(srctop + '/util') + getHFiles(srctop + '/conf') + for hfile in hfiles: + tu =3D index.parse(hfile) + discoverStructures(tu) # find all structs and enums + + if args.cmd =3D=3D 'list': + print('%-64s %s' % ('TYPENAME', 'META')) + for name, kvs in TypeTable().items(): + if not args.list_all: + if not ('genparse' in kvs or 'genformat' in kvs): + continue + print('%-64s %s' % (name, kvs['meta'])) + sys.exit(0) + elif args.cmd =3D=3D 'show': + assert args.target, args + atype =3D TypeTable().get(args.target) + if not atype: + sys.exit(0) + if args.verbose: + showDirective(atype) + + writer =3D CodeWriter(args) + + for atype in TypeTable().values(): + makeClearFunc(writer, atype) + makeParseFunc(writer, atype) + makeFormatFunc(writer, atype) + + writer.complete() + + if args.cmd =3D=3D 'generate': + elapse =3D (datetime.now() - timestamp).microseconds + print('\n###### xmlgen: elapse %d(us) ######\n' % elapse) + elif args.cmd =3D=3D 'show': + showTips(args.target, args.kinds) + + sys.exit(0) diff --git a/scripts/xmlgen/utils.py b/scripts/xmlgen/utils.py new file mode 100644 index 00000000..922cd6d9 --- /dev/null +++ b/scripts/xmlgen/utils.py @@ -0,0 +1,121 @@ +# +# Copyright (C) 2021 Shandong Massclouds Co.,Ltd. +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library. If not, see +# . +# + +from string import Template + + +def singleton(cls): + _instances =3D {} + + def inner(): + if cls not in _instances: + _instances[cls] =3D cls() + return _instances[cls] + return inner + + +class Terms(object): + abbrs =3D ['uuid', 'pci', 'zpci', 'ptr', 'mac', 'mtu', 'dns', 'ip', 'd= hcp'] + plurals =3D {'addresses': 'address'} + caps =3D {'NET_DEV': 'NETDEV', 'MACTABLE': 'MAC_TABLE'} + + @classmethod + def _split(cls, word): + ret =3D [] + if not word: + return ret + head =3D 0 + for pos in range(1, len(word)): + if word[pos].isupper() and not word[pos - 1].isupper(): + ret.append(word[head:pos]) + head =3D pos + ret.append(word[head:]) + return ret + + @classmethod + def singularize(cls, name): + ret =3D cls.plurals.get(name, None) + if ret: + return ret + assert name.endswith('s') + return name[:-1] + + # Don't use str.capitalize() which force other letters to be lowercase. + @classmethod + def upperInitial(cls, word): + if not word: + return '' + if word in cls.abbrs: + return word.upper() + if len(word) > 0 and word[0].isupper(): + return word + return word[0].upper() + word[1:] + + @classmethod + def allcaps(cls, word): + if len(word) =3D=3D 0: + return word + parts =3D cls._split(word) + ret =3D '_'.join([part.upper() for part in parts]) + for key, value in cls.caps.items(): + ret =3D ret.replace('_%s_' % key, '_%s_' % value) + return ret + + +def render(template, **kwargs): + return Template(template).substitute(kwargs) + + +class Block(list): + def format(self, template, **args): + if template: + self.append(Template(template).substitute(**args)) + + def extend(self, block): + if isinstance(block, list): + super(Block, self).extend(block) + + # ${_each_line_} is the only legal key for template + # and represents each line of the block. + def mapfmt(self, template, block): + if not block or not template: + return + + assert isinstance(block, list), block + for line in block: + if line: + self.append(Template(template).substitute(_each_line_=3Dli= ne)) + else: + self.append('') + + def newline(self, condition=3DTrue): + if condition: + super(Block, self).append('') + + def output(self, connector=3D'\n'): + return connector.join(self) + + +def dedup(alist): + assert isinstance(alist, list) + ret =3D [] + for e in alist: + if e not in ret: + ret.append(e) + + return ret --=20 2.25.1 From nobody Tue Apr 23 19:28:24 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 170.10.133.124 as permitted sender) client-ip=170.10.133.124; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-delivery-124.mimecast.com; Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of redhat.com designates 170.10.133.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1619076751; cv=none; d=zohomail.com; s=zohoarc; b=ewW75N4cKx0RTDNZphS4v9DWgA/c9B0dik7p+gge10nJadkMnU8gEs/WzNGby4qlKVwDA+wvFLgw92We9rJDJhq+UkRgTGGDNdXjYw7Y6nJks6OR8jjBza6wSOcS8CEoy9ihhogeqNdcyCIl+F+JlRTxJkCYPsKJ6TSc82qZHQM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1619076751; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=neK/MXhElqn+a1AVh3Q3Ya0Cn+hYV2Z6FCa921XgxNs=; b=PmQ4lKuEJyvZb3wPYJQmx5bDLUeOZeWf24T4T8r9ZTeA7aa5jYJ06Il4vN7W0qmjpOjU4firpIsJ05Ow9/GGujqQ78Gv7rUGjwmFptZPi9pil6egzsQvI6Lfm5Xu+WC0iwJcewNcXT6Isdsz6UQmhqr/F9/PDyyUiPrtOZVGQWc= ARC-Authentication-Results: i=1; mx.zohomail.com; spf=pass (zohomail.com: domain of redhat.com designates 170.10.133.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by mx.zohomail.com with SMTPS id 1619076751109208.97919896535007; Thu, 22 Apr 2021 00:32:31 -0700 (PDT) Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-470-OIaczgzaMeWp4uiqwqZXGA-1; Thu, 22 Apr 2021 03:32:26 -0400 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 643B1107ACF5; Thu, 22 Apr 2021 07:32:21 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.20]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 428E76061F; Thu, 22 Apr 2021 07:32:21 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id 050B21806D21; Thu, 22 Apr 2021 07:32:21 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.rdu2.redhat.com [10.11.54.6]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id 13M7VUUP023790 for ; Thu, 22 Apr 2021 03:31:30 -0400 Received: by smtp.corp.redhat.com (Postfix) id 6336820BC8D5; Thu, 22 Apr 2021 07:31:30 +0000 (UTC) Received: from mimecast-mx02.redhat.com (mimecast05.extmail.prod.ext.rdu2.redhat.com [10.11.55.21]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 5D7AC20BC8CF for ; Thu, 22 Apr 2021 07:31:28 +0000 (UTC) Received: from us-smtp-1.mimecast.com (us-smtp-delivery-1.mimecast.com [207.211.31.120]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id AA05585338A for ; Thu, 22 Apr 2021 07:31:28 +0000 (UTC) Received: from m97136.mail.qiye.163.com (m97136.mail.qiye.163.com [220.181.97.136]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-521-1d4z18ClOked2dGpq3ONSg-1; Thu, 22 Apr 2021 03:31:22 -0400 Received: from localhost.localdomain (unknown [58.56.27.130]) by smtp2 (Coremail) with SMTP id iOCowAA3HLYJJYFgMwTJAQ--.5876S4; Thu, 22 Apr 2021 15:26:04 +0800 (CST) X-MC-Unique: OIaczgzaMeWp4uiqwqZXGA-1 X-MC-Unique: 1d4z18ClOked2dGpq3ONSg-1 From: Shi Lei To: libvir-list@redhat.com Subject: [RFCv3 02/25] maint: Check python3-clang and libclang Date: Thu, 22 Apr 2021 15:25:10 +0800 Message-Id: <20210422072533.312211-3-shi_lei@massclouds.com> In-Reply-To: <20210422072533.312211-1-shi_lei@massclouds.com> References: <20210422072533.312211-1-shi_lei@massclouds.com> MIME-Version: 1.0 X-CM-TRANSID: iOCowAA3HLYJJYFgMwTJAQ--.5876S4 X-Coremail-Antispam: 1Uf129KBjDUn29KB7ZKAUJUUUU8529EdanIXcx71UUUUU7v73 VFW2AGmfu7bjvjm3AaLaJ3UbIYCTnIWIevJa73UjIFyTuYvjfULt8eDUUUU X-Originating-IP: [58.56.27.130] X-CM-SenderInfo: pvklsz1hl6ztxvvfz0xxgvhudrp/1tbifgx8T1rpO2KmjwAAsC X-Mimecast-Impersonation-Protect: Policy=CLT - Impersonation Protection Definition; Similar Internal Domain=false; Similar Monitored External Domain=false; Custom External Domain=false; Mimecast External Domain=false; Newly Observed Domain=false; Internal User Name=false; Custom Display Name List=false; Reply-to Address Mismatch=false; Targeted Threat Dictionary=false; Mimecast Threat Dictionary=false; Custom Threat Dictionary=false X-Scanned-By: MIMEDefang 2.78 on 10.11.54.6 X-loop: libvir-list@redhat.com Cc: Shi Lei X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.13 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=libvir-list-bounces@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Make sure 'python3-clang' and 'libclang' have been installed and can work. Also, add 'python3-clang' into libvirt.spec.in and mingw-libvirt.spec.in. Signed-off-by: Shi Lei --- libvirt.spec.in | 1 + meson.build | 10 ++++++++++ mingw-libvirt.spec.in | 1 + 3 files changed, 12 insertions(+) diff --git a/libvirt.spec.in b/libvirt.spec.in index be74964b..4ebd67ce 100644 --- a/libvirt.spec.in +++ b/libvirt.spec.in @@ -277,6 +277,7 @@ BuildRequires: perl-interpreter BuildRequires: perl %endif BuildRequires: python3 +BuildRequires: python3-clang BuildRequires: systemd-units %if %{with_libxl} BuildRequires: xen-devel diff --git a/meson.build b/meson.build index 837955de..a99be250 100644 --- a/meson.build +++ b/meson.build @@ -2406,3 +2406,13 @@ if conf.has('WITH_QEMU') } summary(priv_summary, section: 'Privileges') endif + +py3_clang =3D run_command('python3', '-c', 'import clang.cindex;print("ok"= )') +if py3_clang.returncode() !=3D 0 + error('python3-clang is required.') +endif + +py3_clang_working =3D run_command('python3', '-c', 'import clang.cindex;cl= ang.cindex.Index.create()') +if py3_clang_working.returncode() !=3D 0 + error('python3-clang is present, but not working. Perhaps libclang is mi= ssing?') +endif diff --git a/mingw-libvirt.spec.in b/mingw-libvirt.spec.in index 288f533d..00b54d4a 100644 --- a/mingw-libvirt.spec.in +++ b/mingw-libvirt.spec.in @@ -52,6 +52,7 @@ BuildRequires: pkgconfig BuildRequires: gettext BuildRequires: libxslt BuildRequires: python3 +BuildRequires: python3-clang BuildRequires: perl-interpreter BuildRequires: perl(Getopt::Long) BuildRequires: meson --=20 2.25.1 From nobody Tue Apr 23 19:28:24 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 216.205.24.124 as permitted sender) client-ip=216.205.24.124; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-delivery-124.mimecast.com; Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of redhat.com designates 216.205.24.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1619076772; cv=none; d=zohomail.com; s=zohoarc; b=Ig0/sSMo7K9O1ClKjubjItZzOWXqbZLdvR/Q1YglYKIoEU9Yq5okTOQj8OKFwOBW8UDY/5rdHUF2MqTLb8QAlxcxs1ABuGkYRy+2W6De7X+IC4T0upfx4OotdVt5etEU1dhSi8O4PIWZCelfoIBRT/DcoDCwk595E+AmZaiCF9k= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1619076772; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=a0nDPzjtCTDcOCZkQK9mye7jMYXmI+dcVRPVjez0lGQ=; b=BK30MkZNQe/9PGXJG8oD1xklVDML1ieGB0eV/jxIMwgUdgVMiv8mzwbLOt1a5PEbhCeDBlY4Jbr6Y/QbSmjDmkDF64STpcBPNY7tuDN+L9KkAys5kjyrehphHYLWSU4acNy5lq0pMxYmnZUqnpqRxNR0a33FIA58BSx8lZ3G8Ow= ARC-Authentication-Results: i=1; mx.zohomail.com; spf=pass (zohomail.com: domain of redhat.com designates 216.205.24.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [216.205.24.124]) by mx.zohomail.com with SMTPS id 16190767722303.361126954419092; Thu, 22 Apr 2021 00:32:52 -0700 (PDT) Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-417-7kzDwHg1O4qDpXlrc53b7Q-1; Thu, 22 Apr 2021 03:32:49 -0400 Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 59BB9343B8; Thu, 22 Apr 2021 07:32:43 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.20]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 37F5E62954; Thu, 22 Apr 2021 07:32:43 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id F224B1806D2F; Thu, 22 Apr 2021 07:32:42 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.rdu2.redhat.com [10.11.54.4]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id 13M7WWg2024027 for ; Thu, 22 Apr 2021 03:32:32 -0400 Received: by smtp.corp.redhat.com (Postfix) id 6B28C20FE6D4; Thu, 22 Apr 2021 07:32:32 +0000 (UTC) Received: from mimecast-mx02.redhat.com (mimecast03.extmail.prod.ext.rdu2.redhat.com [10.11.55.19]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 6566D20FE6D1 for ; Thu, 22 Apr 2021 07:32:29 +0000 (UTC) Received: from us-smtp-1.mimecast.com (us-smtp-delivery-1.mimecast.com [205.139.110.120]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id C016F81DB8A for ; Thu, 22 Apr 2021 07:32:29 +0000 (UTC) Received: from m97136.mail.qiye.163.com (m97136.mail.qiye.163.com [220.181.97.136]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-306-D4OrS88VO8GpU3fYQhMYPg-1; Thu, 22 Apr 2021 03:32:16 -0400 Received: from localhost.localdomain (unknown [58.56.27.130]) by smtp2 (Coremail) with SMTP id iOCowAA3HLYJJYFgMwTJAQ--.5876S5; Thu, 22 Apr 2021 15:26:04 +0800 (CST) X-MC-Unique: 7kzDwHg1O4qDpXlrc53b7Q-1 X-MC-Unique: D4OrS88VO8GpU3fYQhMYPg-1 From: Shi Lei To: libvir-list@redhat.com Subject: [RFCv3 03/25] maint: Call xmlgen automatically when c-head-files change Date: Thu, 22 Apr 2021 15:25:11 +0800 Message-Id: <20210422072533.312211-4-shi_lei@massclouds.com> In-Reply-To: <20210422072533.312211-1-shi_lei@massclouds.com> References: <20210422072533.312211-1-shi_lei@massclouds.com> MIME-Version: 1.0 X-CM-TRANSID: iOCowAA3HLYJJYFgMwTJAQ--.5876S5 X-Coremail-Antispam: 1Uf129KBjvJXoWxWry7KFWfuF4ruF17JrWxtFb_yoW7JrW7pa n0qa15tFyUXr1fArs3JF18tF4rGw1kG3WDKwsxWw13Zw4UXr1I9w43KFyfKr47W3y8ZF4F vrn5G34rKF48JFJanT9S1TB71UUUUU7qnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDUYxBIdaVFxhVjvjDU0xZFpf9x0JbMD7hUUUUU= X-Originating-IP: [58.56.27.130] X-CM-SenderInfo: pvklsz1hl6ztxvvfz0xxgvhudrp/1tbibgx8T1lZu9Z7AQAAsG X-Mimecast-Impersonation-Protect: Policy=CLT - Impersonation Protection Definition; Similar Internal Domain=false; Similar Monitored External Domain=false; Custom External Domain=false; Mimecast External Domain=false; Newly Observed Domain=false; Internal User Name=false; Custom Display Name List=false; Reply-to Address Mismatch=false; Targeted Threat Dictionary=false; Mimecast Threat Dictionary=false; Custom Threat Dictionary=false X-Scanned-By: MIMEDefang 2.78 on 10.11.54.4 X-loop: libvir-list@redhat.com Cc: Shi Lei X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.15 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=libvir-list-bounces@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Monitor changes of header-files in src/util and src/conf. Whenever that happens, the tool xmlgen will generate parse/format functions based on these files automatically. Signed-off-by: Shi Lei --- scripts/meson.build | 8 ++++++++ src/conf/meson.build | 36 ++++++++++++++++++++++++++++++++++++ src/meson.build | 6 ++++++ src/util/meson.build | 36 ++++++++++++++++++++++++++++++++++++ tests/meson.build | 2 ++ tools/meson.build | 3 +++ 6 files changed, 91 insertions(+) diff --git a/scripts/meson.build b/scripts/meson.build index 421e3d2a..5399868c 100644 --- a/scripts/meson.build +++ b/scripts/meson.build @@ -35,3 +35,11 @@ foreach name : scripts sname =3D name.split('.')[0].underscorify() set_variable('@0@_prog'.format(sname), find_program(name)) endforeach + +xmlgen_self =3D files( + 'xmlgen/main.py', + 'xmlgen/directive.py', + 'xmlgen/utils.py' +) + +set_variable('virxmlgen_prog', find_program('xmlgen/main.py')) diff --git a/src/conf/meson.build b/src/conf/meson.build index bd35d87e..1439c31d 100644 --- a/src/conf/meson.build +++ b/src/conf/meson.build @@ -1,3 +1,38 @@ +conf_xmlgen_input =3D [ +] + +conf_xmlgen_output =3D [] +foreach name : conf_xmlgen_input + conf_xmlgen_output +=3D '@0@.generated.c'.format(name.split('.')[0]) + conf_xmlgen_output +=3D '@0@.generated.h'.format(name.split('.')[0]) +endforeach + +conf_xmlgen_headers =3D [] +if conf_xmlgen_output.length() > 0 + conf_xmlgen_objects =3D custom_target( + 'virxmlgen', + input: xmlgen_self + conf_xmlgen_input, + output: conf_xmlgen_output, + command: [ + meson_python_prog, python3_prog.path(), '-B', virxmlgen_prog.path(), + '-s', meson.source_root() / 'src', '-b', meson.build_root() / 'src', + '-d', 'conf', 'generate', + ], + ) + + index =3D 0 + foreach header : conf_xmlgen_objects.to_list() + if index % 2 =3D=3D 1 + conf_xmlgen_headers +=3D header + endif + index +=3D 1 + endforeach +else + conf_xmlgen_objects =3D [] +endif + +conf_xmlgen_dep =3D declare_dependency(sources: conf_xmlgen_headers) + netdev_conf_sources =3D [ 'netdev_bandwidth_conf.c', 'netdev_vlan_conf.c', @@ -90,6 +125,7 @@ device_conf_sources =3D [ virt_conf_lib =3D static_library( 'virt_conf', [ + conf_xmlgen_objects, chrdev_conf_sources, cpu_conf_sources, device_conf_sources, diff --git a/src/meson.build b/src/meson.build index c7ff9e97..f8ae47b4 100644 --- a/src/meson.build +++ b/src/meson.build @@ -245,6 +245,12 @@ src_dep =3D declare_dependency( ) =20 subdir('conf') + +src_dep =3D declare_dependency( + dependencies: [ src_dep, util_xmlgen_dep, conf_xmlgen_dep ], + include_directories: [ conf_inc_dir ], +) + subdir('rpc') subdir('access') subdir('cpu') diff --git a/src/util/meson.build b/src/util/meson.build index 05934f68..0d41de92 100644 --- a/src/util/meson.build +++ b/src/util/meson.build @@ -1,3 +1,38 @@ +util_xmlgen_input =3D [ +] + +util_xmlgen_output =3D [] +foreach name : util_xmlgen_input + util_xmlgen_output +=3D '@0@.generated.c'.format(name.split('.')[0]) + util_xmlgen_output +=3D '@0@.generated.h'.format(name.split('.')[0]) +endforeach + +util_xmlgen_headers =3D [] +if util_xmlgen_output.length() > 0 + util_xmlgen_objects =3D custom_target( + 'virxmlgen', + input: xmlgen_self + util_xmlgen_input, + output: util_xmlgen_output, + command: [ + meson_python_prog, python3_prog.path(), '-B', virxmlgen_prog.path(), + '-s', meson.source_root() / 'src', '-b', meson.build_root() / 'src', + '-d', 'util', 'generate', + ], + ) + + index =3D 0 + foreach header : util_xmlgen_objects.to_list() + if index % 2 =3D=3D 1 + util_xmlgen_headers +=3D header + endif + index +=3D 1 + endforeach +else + util_xmlgen_objects =3D [] +endif + +util_xmlgen_dep =3D declare_dependency(sources: util_xmlgen_headers) + util_sources =3D [ 'glibcompat.c', 'viralloc.c', @@ -179,6 +214,7 @@ io_helper_sources =3D [ virt_util_lib =3D static_library( 'virt_util', [ + util_xmlgen_objects, util_sources, util_public_sources, keycode_gen_sources, diff --git a/tests/meson.build b/tests/meson.build index 05c3e901..14ace476 100644 --- a/tests/meson.build +++ b/tests/meson.build @@ -17,6 +17,8 @@ tests_dep =3D declare_dependency( selinux_dep, xdr_dep, yajl_dep, + util_xmlgen_dep, + conf_xmlgen_dep, ], include_directories: [ conf_inc_dir, diff --git a/tools/meson.build b/tools/meson.build index 2acf7b0a..162db0e8 100644 --- a/tools/meson.build +++ b/tools/meson.build @@ -5,11 +5,14 @@ tools_dep =3D declare_dependency( dependencies: [ libxml_dep, glib_dep, + util_xmlgen_dep, + conf_xmlgen_dep, ], include_directories: [ libvirt_inc, src_inc_dir, util_inc_dir, + conf_inc_dir, top_inc_dir, ], link_args: ( --=20 2.25.1 From nobody Tue Apr 23 19:28:24 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 216.205.24.124 as permitted sender) client-ip=216.205.24.124; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-delivery-124.mimecast.com; Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of redhat.com designates 216.205.24.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1619076763; cv=none; d=zohomail.com; s=zohoarc; b=mOZ/8c2oNK4Hj6i0KXT1el0ArN56yRHepPJ0BJ+oR65L+mhwKfVz7QuXJUh0VpOjzBL1/K76d2CrZEymU6j9rDCaxRJ++zSIcvBO0EoBrQ8iRz62iEFDuHKDmmKxcAX0xeADrAv+ghQII88E/I79u4oqfJl++rubZuDOs7Epj9E= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1619076763; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=gG4mfHhV0Qnwf3HdzzEv3uUluJren/tlBZuqJoeDi9g=; b=HsV7H3MxTSUcld/xXaIpjttrePBacFLbTNIknBZ9ZqYlcvM5XeGlONFAmgb6u8LWENWbdF59JOi0a6PvRi/EbjY/2OKlNP/kOAbPBKfkFm8ke1F3eCj/f42+7bSaFucY/JQZymwa3gty1PNu8XLpwplzAKyJgEOINhxk9UYZQNU= ARC-Authentication-Results: i=1; mx.zohomail.com; spf=pass (zohomail.com: domain of redhat.com designates 216.205.24.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [216.205.24.124]) by mx.zohomail.com with SMTPS id 1619076763435525.9987081771113; Thu, 22 Apr 2021 00:32:43 -0700 (PDT) Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-223-RkWVR3xpOCOaVSyaiApX2Q-1; Thu, 22 Apr 2021 03:32:39 -0400 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 1C7AE18B9F6A; Thu, 22 Apr 2021 07:32:30 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.20]) by smtp.corp.redhat.com (Postfix) with ESMTPS id E877F189B6; Thu, 22 Apr 2021 07:32:29 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id A360A1806D29; Thu, 22 Apr 2021 07:32:29 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.rdu2.redhat.com [10.11.54.4]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id 13M7VYbK023819 for ; Thu, 22 Apr 2021 03:31:34 -0400 Received: by smtp.corp.redhat.com (Postfix) id 651A520FE6D3; Thu, 22 Apr 2021 07:31:34 +0000 (UTC) Received: from mimecast-mx02.redhat.com (mimecast06.extmail.prod.ext.rdu2.redhat.com [10.11.55.22]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 5FB4320FE6D2 for ; Thu, 22 Apr 2021 07:31:34 +0000 (UTC) Received: from us-smtp-1.mimecast.com (us-smtp-2.mimecast.com [205.139.110.61]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 402C8185A7B6 for ; Thu, 22 Apr 2021 07:31:34 +0000 (UTC) Received: from m97136.mail.qiye.163.com (m97136.mail.qiye.163.com [220.181.97.136]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-584-lPvt89MPM5q8wu6TuR-iJA-1; Thu, 22 Apr 2021 03:31:30 -0400 Received: from localhost.localdomain (unknown [58.56.27.130]) by smtp2 (Coremail) with SMTP id iOCowAA3HLYJJYFgMwTJAQ--.5876S6; Thu, 22 Apr 2021 15:26:04 +0800 (CST) X-MC-Unique: RkWVR3xpOCOaVSyaiApX2Q-1 X-MC-Unique: lPvt89MPM5q8wu6TuR-iJA-1 From: Shi Lei To: libvir-list@redhat.com Subject: [RFCv3 04/25] docs: Add xmlgen.rst to explain how to use it Date: Thu, 22 Apr 2021 15:25:12 +0800 Message-Id: <20210422072533.312211-5-shi_lei@massclouds.com> In-Reply-To: <20210422072533.312211-1-shi_lei@massclouds.com> References: <20210422072533.312211-1-shi_lei@massclouds.com> MIME-Version: 1.0 X-CM-TRANSID: iOCowAA3HLYJJYFgMwTJAQ--.5876S6 X-Coremail-Antispam: 1Uf129KBjvAXoWfCF13CryDKr15XFyDGr1Dtrb_yoW5JFy7Ao WI9wnIy3WxKr4rCFWkA3WkWFyUua1vgr1IqF4Y9r98Ga4kXF4UCw1jkw48Ga4fWr4YgF15 WFyxJ34Yqr45tF15n29KB7ZKAUJUUUU8529EdanIXcx71UUUUU7v73VFW2AGmfu7bjvjm3 AaLaJ3UbIYCTnIWIevJa73UjIFyTuYvjfUlrcSUUUUU X-Originating-IP: [58.56.27.130] X-CM-SenderInfo: pvklsz1hl6ztxvvfz0xxgvhudrp/1tbiDxp8T1nfQ-T5bQAAsD X-Mimecast-Impersonation-Protect: Policy=CLT - Impersonation Protection Definition; Similar Internal Domain=false; Similar Monitored External Domain=false; Custom External Domain=false; Mimecast External Domain=false; Newly Observed Domain=false; Internal User Name=false; Custom Display Name List=false; Reply-to Address Mismatch=false; Targeted Threat Dictionary=false; Mimecast Threat Dictionary=false; Custom Threat Dictionary=false X-Mimecast-Spam-Signature: yes X-Scanned-By: MIMEDefang 2.78 on 10.11.54.4 X-loop: libvir-list@redhat.com Cc: Shi Lei X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=libvir-list-bounces@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Signed-off-by: Shi Lei --- docs/meson.build | 1 + docs/xmlgen.rst | 684 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 685 insertions(+) create mode 100644 docs/xmlgen.rst diff --git a/docs/meson.build b/docs/meson.build index f550629d..a8a58815 100644 --- a/docs/meson.build +++ b/docs/meson.build @@ -124,6 +124,7 @@ docs_rst_files =3D [ 'programming-languages', 'styleguide', 'submitting-patches', + 'xmlgen', ] =20 # list of web targets to build for docs/web rule diff --git a/docs/xmlgen.rst b/docs/xmlgen.rst new file mode 100644 index 00000000..caea1f99 --- /dev/null +++ b/docs/xmlgen.rst @@ -0,0 +1,684 @@ +=3D=3D=3D=3D=3D=3D +xmlgen +=3D=3D=3D=3D=3D=3D + +In libvirt, developers usually have to implement and maintain parse/format= functions. This tool xmlgen aims to generate most of these functions autom= atically and help relieve developers' burden. + +A Quick Start +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D + +Take virNetworkDNSDef for example, which is in 'src/conf/network_conf.h'. + +In the past, we have to manually implement virNetworkDNSDefParseXML and vi= rNetworkDNSFormatBuf. +And now, we can just take several steps to have xmlgen generate these func= tions and apply them into libvirt project. + +Step1. Add directives on the struct's declaration. +-------------------------------------------------- + +Directives for xmlgen are used to help direct the generating process. As b= elow: + + :: + + typedef struct _virNetworkDNSDef virNetworkDNSDef; + struct _virNetworkDNSDef { /* genparse, genformat */ + virTristateBool enable; /* xmlattr */ + virTristateBool forwardPlainNames; /* xmlattr */ + size_t nfwds; + virNetworkDNSForwarder *forwarders; /* xmlelem, array:nfwds */ + size_t ntxts; + virNetworkDNSTxtDef *txts; /* xmlelem, array */ + ... ... + }; + +On the line of struct's declaration, we set two directives **genparse** an= d **genformat**, which direct xmlgen to generate parse/format functions for= this struct respectively. In this example, these functions include virNetw= orkDNSDefParseXML, virNetworkDNSDefFormatBuf and some auxilliary functions.= Other directives are for members. They direct xmlgen to generate code bloc= ks in the parse/format functions. Directive **xmlattr** indicates that the = member matches an xml attribute, and **xmlelem** is for an xml element. Add= itional directive **array** indicates that the member matches an array of x= ml node. + +Step2. Preview generated functions. +----------------------------------- + +By the below command line: + + :: + + # ./scripts/xmlgen/go list + +Got a list of structs detected by xmlgen, including *virNetworkDNSDef*. +Then we execute the command line as below: + + :: + + # ./scripts/xmlgen/go show virNetworkDNSDef + +All the generated functions related to virNetworkDNSDef are displayed, the= n we ought to preview them before really use them into libvirt project. +There is a special part **[Tips]** except the generated functions and the = declaration of hooks. + +[**Tips**] provides instructions about how to apply these generated functi= ons into project and how to enable hooks. [**Tips**] will be used in step3. + +Also, we got the declaration of hooks. In step4, we will implement a hook = according to it. + +Step3. Enable hooks and include generated functions. +---------------------------------------------------- + +According to [**Tips**] that we got in step2: + + :: + + [Tips] + + /* Put these lines at the bottom of "conf/network_conf.h" */ + /* Makesure "network_conf.h" to be appended into conf_xmlgen_input in sr= c/conf/meson.build */ + + /* Define macro to enable hook or redefine check when necessary */ + /* #define ENABLE_VIR_NETWORK_DNSDEF_PARSE_HOOK */ + /* #define ENABLE_VIR_NETWORK_DNSDEF_PARSE_HOOK_SET_ARGS */ + /* #define ENABLE_VIR_NETWORK_DNSDEF_FORMAT_HOOK */ + + /* #define RESET_VIR_NETWORK_DNSDEF_CHECK */ + + /* Makesure below is the bottom line! */ + #include "network_conf.generated.h" + +Uncomment macros and enable hooks when necessary. In this example, we only= need to define ENABLE_VIR_NETWORK_DNSDEF_PARSE_HOOK to enable the post-hoo= k for parse-function. + +Include the header-file to apply the generated functions. +In this example, we just include "network_conf.generated.h" into "conf/net= work_conf.h" and modify "src/conf/meson.build" as instructed. + +Step4. Implement hooks when necessary. +-------------------------------------- + +In original implementation of virNetworkDNSDefParseXML, there's a piece of= error-checking code as below: + + :: + + if (def->enable =3D=3D VIR_TRISTATE_BOOL_NO && (nfwds || nhosts || nsrvs= || ntxts)) { + virReportError(VIR_ERR_XML_ERROR, + _("Extra data in disabled network '%s'"), + networkName); + } + +Since this piece of code can't be generated, we need a hook to do the chec= k. +In step2, we have gotten the declaration of virNetworkDNSDefParseHook, as = below: + + :: + + #ifdef ENABLE_VIR_NETWORK_DNSDEF_PARSE_HOOK + + int + virNetworkDNSDefParseHook(xmlNodePtr node, + virNetworkDNSDef *def, + const char *instname, + void *parent, + void *opaque, + const char *enableStr, + const char *forwardPlainNamesStr, + int nForwarderNodes, + int nTxtNodes, + int nSrvNodes, + int nHostNodes); + + #endif + +The arguments provide all necessary information for us to do some extra th= ings. It's easy for us to transfer the error-checking code into this hook. +Then we put the implementation into a file, which should include the decla= ration of the hook. In this example, we use 'conf/network_conf.c'. + +Directives +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D + +Directives help direct xmlgen to generate parse/format functions. They are= in the form of comment, so they are only valid for xmlgen and ignored by *= *C** compilers. Directives work on either a struct or a member, so they mus= t appear in the same line of struct's or member's declaration. + +On the other hand, some directives are basic, which can be used on their o= wn; and the others are addional, which must be accompanied with baisc ones. + +genparse +-------- + +(only for struct; basic) + +Generate parse-function for the struct. At the meanwhile, clear-function i= s also generated automatically, which is used for cleaning all the members = when parse-function fails. + +E.g. set **genparse** on virNetworkDNSTxtDef, as below: + + :: + + typedef struct _virNetworkDNSTxtDef virNetworkDNSTxtDef; + struct _virNetworkDNSTxtDef { /* genparse */ + char *name; /* xmlattr, required */ + char *value; /* xmlattr */ + }; + +Then we'll get the implementation of virNetworkDNSTxtDefParseXML (parse-fu= nction) and virNetworkDNSTxtDefClear (clear-function). + +We can enable a pre-hook and a post-hook in the parse function when necess= ary. The usage of hooks will be explained in detail in the following chapte= r **Hooks**. + +Note: Specify **xmlattr** or **xmlelem** for at least one member, or we'll= get an empty parse-function. + +genformat[:separate] +-------------------- + +(only for struct; basic) + +Generate format-function for the struct. At the meanwhile, check-function = is also generated automatically, which is used to determine whether an inst= ance of this type is empty. + +E.g. set **genformat** on virNetworkDHCPRangeDef, as below: + + :: + + typedef struct _virNetworkDHCPRangeDef virNetworkDHCPRangeDef; + struct _virNetworkDHCPRangeDef { /* genformat */ + struct { + virSocketAddr start; /* xmlattr, required */ + virSocketAddr end; /* xmlattr, required */ + } addr; + + virNetworkDHCPLeaseTimeDef *lease; /* xmlelem */ + }; + +Then we'll get the implementation of virNetworkDHCPRangeDefFormatBuf (form= at-function) and virNetworkDHCPRangeDefCheck (check-function). + +By default, the format-function outputs xml for all attributes and all ele= ments. + +But in some special cases, we need two separate format-functions: one for = formatting attributes and another for formatting elements. For that, we sho= uld specify **genformat:separate**. + +E.g., for virDomainGraphicsAuthDef + + :: + + struct _virDomainGraphicsAuthDef { /* genformat:separat= e */ + char *passwd; /* xmlattr */ + /* Whether there is an expiry time set */ + bool expires; /* specify:validTo */ + /* seconds since epoch */ + time_t validTo; /* xmlattr:passwdVal= idTo */ + /* action if connected */ + virDomainGraphicsAuthConnectedType connected; /* xmlattr */ + }; + +Then we'll get virDomainGraphicsAuthDefFormatAttr and virDomainGraphicsAut= hDefFormatElem, which are for formatting attributes and elements respective= ly. In the meanwhile, virDomainGraphicsAuthDefCheckAttr and virDomainGraphi= csAuthDefCheckElem are generated to check whether all attributes/elements a= re all empty. + +We can enable a pre-hook for format-function when necessary. Also, the che= ck-function can be redefined if it's not suitable. The usage of hook and ch= eck-function will be explained in detail in the following chapter **Hooks**. + +Note: Specify **xmlattr** or **xmlelem** for at least one member, or we'll= get an empty format-function. + +xmlattr[:[parentname/]thename] +------------------------------ + +(only for member; basic) + +Indicate that the member matches an xml attribute.There're 3 cases: + +1) By default, use the member's name as attribute's name to generate parse= /format code block. + +2) Specify the attribute's name by **thename** when necessary. + +3) Use the form of **xmlattr:parentname/thename** to indicate that this me= mber matches an attribute of an child-element. + +E.g.: + + :: + + struct _virNetworkIPDef { /* genparse, genformat */ + ... ... + char *family; /* xmlattr */ + virTristateBool localPTR; /* xmlattr:localPtr */ + char *tftproot; /* xmlattr:tftp/root */ + ... ... + }; + +This example demonstrates all those three usages: + +The member **family** has the same name with its corresponding xml attribu= te. As in: . + +But for **localPTR**, the name of its corresponding attribute is "localPtr= ", as in: . So we have to specify it explicitly. + +And for **tftproot**, in fact it matches the attribute *root* of the child= -element *tftp*, as in: in xml. So we use the= most complicated form 'xmlattr:tftp/root'. + +xmlelem[:thename] +----------------- + +(only for member; basic) + +Indicate that the member matches an xml element. + +By default, use the member's name as element's name to generate parse/form= at code block. + +Specify the element's name by **thename** when necessary. + +E.g.: + + :: + + struct _virNetworkForwardNatDef { /* genparse, genformat */ + virSocketAddrRange addr; /* xmlelem:address */ + virPortRange port; /* xmlelem */ + ... ... + }; + +For the member **addr**, it matches xml element
in ; +and **port** matches in . + +In special cases, the corresponding element is a *text-node*, like +.... An additional directive **xmltext** should be appended to +handle this situation. + +xmltext +----------------- + +(only for member; additional) + +Indicate that this member matches *text node*. It must be with **xmlelem**. + +E.g.: + + :: + + typedef struct _virNetworkDef virNetworkDef; + struct _virNetworkDef { /* genparse, genformat */ + virUUID uuid; /* xmlelem, xmltext */ + ... ... + }; + +The member **uuid** matches .... + + +array[:countername] +------------------- + +(only for member; additional) + +Indicate that this member matches an array of xml node. It must be with **= xmlattr** or **xmlelem**. + +Each array member is accompanied with a counter member in the same struct,= which name should be in the form of: 'n' + member-name. + +If the counter member's name doesn't follow the common rule, we should spe= cify it. As in: + + :: + + struct _virNetworkDNSDef { /* genparse, genformat */ + ... ... + size_t nfwds; + virNetworkDNSForwarder *forwarders; /* xmlelem, array:nfwds */ + size_t ntxts; + virNetworkDNSTxtDef *txts; /* xmlelem, array */ + ... ... + }; + +For member **forwarders**, its counter member **nfwds** doesn't follow the= common name rule, so we have to specify it explicitly. + +Another note: for array member, use the **singular** form of its name as i= ts corresponding xml node's name. +As the member **txts**, it matches a group of element **. + +required +-------- + +(only for member; additional) + +Indicate that the corresponding xml node of this member must exist and hav= e valid value. It must be with **xmlattr** or **xmlelem**. E.g.: + + :: + + struct _virNetworkDNSTxtDef { /* genparse, genformat */ + char *name; /* xmlattr, required */ + ... ... + }; + +In parse-function, there will be a piece of code to check the existence of= corresponding attribute, or it will report an error. Just like: + + :: + + def->name =3D virXMLPropString(node, "name"); + if (def->name =3D=3D NULL) { + virReportError(VIR_ERR_XML_ERROR, + _("Missing '%s' setting in '%s'"), + "name", instname); + goto error; + } + +specify:thename +--------------- + +(only for member; basic) + +Indicate that this member specify the existence of another member named wi= th **thename**. E.g.: + + :: + + struct _virNetworkDef { /* genparse, genformat */ + ... ... + virMacAddr mac; /* xmlattr:mac/address */ + bool mac_specified; /* specify:mac */ + }; + +The member **mac_specified** specify the existence of another member **mac= **. + +In parse-function, **mac_specified** will be automatically set when **mac*= * exists. + +In format-function, whether to format **mac** depends on whether **mac_spe= cified** is *TRUE*. + +skipparse +--------- + +(only for member; additional) + +Ignore this member in parse-function. E.g.: + + :: + + struct _virNetworkDef { /* genparse, genformat */ + int connections; /* xmlattr, skipparse */ + ... ... + }; + +The member **connections** won't appear in the generated parse-function, b= ut it still appears in the format-function. + +xmlgroup +-------- + +(only for member which type is a struct; basic) + +This member matches an group of xml nodes rather than an xml element. E.g.: + + :: + + struct _virDomainGraphicsVNCDef { /* genparse */ + ... ... + virDomainGraphicsAuthDef auth; /* xmlgroup */ + }; + +For the member **auth**, we can't find an corresponding element in xml. +In fact, it matches an group of attributes, including *passwd*, *passwdVal= idTo*, and *connected*. +Then, parse/format code block will skip over this level and traverse its c= hildren directly. + +xmlswitch:thename +----------------- + +(only for member which type is a union; basic) + +Indicate that this member matches an xml choice and generates *switch* sta= tement to parse/format xml. + +The union member should have a relative enum member which is specified by = **thename**. E.g., + + :: + + /* Implementation of virDomainGraphicsType */ + VIR_ENUM_IMPL(virDomainGraphics, + VIR_DOMAIN_GRAPHICS_TYPE_LAST, + "sdl", + "vnc", + "rdp", + "desktop", + "spice", + "egl-headless", + ); + + struct _virDomainGraphicsDef { /* genparse, g= enformat */ + virDomainGraphicsType type; /* xmlattr */ + ... ... + union { + virDomainGraphicsSDLDef sdl; /* xmlgroup */ + virDomainGraphicsVNCDef vnc; /* xmlgroup */ + virDomainGraphicsRDPDef rdp; /* xmlgroup */ + virDomainGraphicsDesktopDef desktop; /* xmlgroup */ + virDomainGraphicsSpiceDef spice; /* xmlgroup */ + virDomainGraphicsEGLHeadlessDef egl_headless; /* xmlgroup */ + } data; /* xmlswitch:t= ype */ + }; + +For the union member **data**, the enum member **type** is its relative co= unterpart. + +Note: Each child of **data** has the same name with each child of **type**= in order. + +Automatic Features +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D + +Other than directives, xmlgen can automatically detect some features. + +Default item of enum +-------------------- + +For all enums in libvirt, there're two cases: + +- Most of them have an extra default item which value is *ZERO*. + It usually represents that the absence of the corresponding attribute in= xml. E.g. + + :: + + typedef enum { + VIR_NETWORK_BRIDGE_MAC_TABLE_MANAGER_DEFAULT =3D 0, + VIR_NETWORK_BRIDGE_MAC_TABLE_MANAGER_KERNEL, + VIR_NETWORK_BRIDGE_MAC_TABLE_MANAGER_LIBVIRT, + VIR_NETWORK_BRIDGE_MAC_TABLE_MANAGER_LAST, + } virNetworkBridgeMACTableManagerType; + +In generated parse-function, it's illegal that virNetworkBridgeMACTableMan= agerTypeFromString returns ZERO. + +- The others have no this kind of default item. All items have their actua= l meanings. E.g., + + :: + + typedef enum { + VIR_NETWORK_DHCP_LEASETIME_UNIT_SECONDS =3D 0, + VIR_NETWORK_DHCP_LEASETIME_UNIT_MINUTES, + VIR_NETWORK_DHCP_LEASETIME_UNIT_HOURS, + VIR_NETWORK_DHCP_LEASETIME_UNIT_LAST, + } virNetworkDHCPLeaseTimeUnitType; + +In generated parse-function, the return-value of virNetworkDHCPLeaseTimeUn= itTypeFromString can be ZERO, +which indicates the first item VIR_NETWORK_DHCP_LEASETIME_UNIT_SECONDS. + +The tool xmlgen can distinguish them and generate proper parsing/formattin= g code by checking whether the first item ends with '_DEFAULT', '_NONE' or = '_ABSENT'. + +Namespace +--------- + +For some top structs, such as virNetworkDef, virDomainDef, etc., there're = some code blocks about **namespace**. + +The tool xmlgen generates extra code block to deal with **namespace** in p= arse/format/clear function if it finds that a struct has a member named '**= namespaceData**'. + +Pointer +------- + +Some members' type is a pointer. The tool xmlgen determines it by checking= "*" or "Ptr" so that it can generate proper code. + +Hooks +=3D=3D=3D=3D=3D + +Generated parse/format functions have some hooks which provide flexibility. +By default, hooks are disabled, so we should implement and enable them whe= n necessary. + +Post-hook for parse-function +---------------------------- + +This hook is used to hold error-checking code and even to set/change any m= ember's value in the post process. E.g.: + +:: + + int + virNetworkDNSDefParseXML(xmlNodePtr node, + virNetworkDNSDef *def, + const char *instname G_GNUC_UNUSED, + void *parent G_GNUC_UNUSED, + void *opaque G_GNUC_UNUSED) + { + /* Parsing block for each member */ + ... ... + + #ifdef ENABLE_VIR_NETWORK_DNSDEF_PARSE_HOOK + if (virNetworkDNSDefParseHook(node, def, instname, parent, opaque,= enableStr, forwardPlainNamesStr, nForwarderNodes, nTxtNodes, nSrvNodes, nH= ostNodes) < 0) + goto error; + #endif + + return 0; + + error: + ... ... + return -1; + } + +The hook virNetworkDNSDefParseHook is after all members' parsing blocks. +Now we can take 3 steps to enable this hook to hold some error-checking co= de. + +step1. Look through helpful information. +........................................ + +Execute below command line: + + :: + + # ./scripts/xmlgen/go show virNetworkDNSDef -kp + +Then we got the declaration of virNetworkDNSDefParseHook and tips. +The declaration will be used in step3. And the tips is as below: + + :: + + [Tips] + + /* Put these lines at the bottom of "conf/network_conf.h" */ + /* Makesure "network_conf.h" to be appended into conf_xmlgen_input in = src/conf/meson.build */ + + /* Define macro to enable hook or redefine check when necessary */ + /* #define ENABLE_VIR_NETWORK_DNSDEF_PARSE_HOOK */ + /* #define ENABLE_VIR_NETWORK_DNSDEF_PARSE_HOOK_SET_ARGS */ + + /* Makesure below is the bottom line! */ + #include "network_conf.generated.h" + +step2. Enable hook and apply generated functions. +................................................. + +According to tips from step1, we define ENABLE_VIR_NETWORK_DNSDEF_PARSE_HO= OK to enable the hook and include the header-file. + +step3. Implement hook. +...................... + +Implement virNetworkDNSDefParseHook according to its delcaration and put t= he error-checking code into it. + +This implementation should be written into a C source file that includes "= network_conf.h". + +In this example, "network_conf.c" is a good choice. + +Pre-hook for parse-function +--------------------------- + +This hook is used to change the common rule of passing some special argume= nts, including **parent** and **opaque**. +The common rule is: + +For each parse-function, the argument **parent** holds the pointer of its = parent struct instance, and the argument **def** will be passed into child = parse-function as their **parent**. + +The argument **opaque** holds an opaque data, and it will be passed from p= arent parse-function to child parse-function recursively. + +But sometimes, we should change this rule for some generated parse-functio= ns. As in: + +:: + + int + virNetworkDHCPDefParseXML(xmlNodePtr node, + virNetworkDHCPDef *def, + const char *instname G_GNUC_UNUSED, + void *parent G_GNUC_UNUSED, + void *opaque G_GNUC_UNUSED) + { + ... ... + void *arg_parent G_GNUC_UNUSED =3D def; + void *arg_opaque G_GNUC_UNUSED =3D opaque; + + if (!def) + goto error; + + #ifdef ENABLE_VIR_NETWORK_DHCPDEF_PARSE_HOOK_SET_ARGS + virNetworkDHCPDefParseXMLSetArgs(node, parent, &arg_parent, &arg_o= paque); + #endif + + if (nRangeNodes > 0) { + ... ... + if (virNetworkDHCPRangeDefParseXML(tnode, &def->ranges[i],= instname, arg_parent, arg_opaque) < 0) + goto error; + } + ... ... + } + +The hook virNetworkDHCPDefParseXMLSetArgs has a chance to intercept **pare= nt/opaque** in the chain. In this example, we need pass the pointer of virN= etworkDef rather than that of virNetworkDHCPDef to virNetworkDHCPRangeDefPa= rseXML as its **parent**, so we enable the hook virNetworkDHCPDefParseXMLSe= tArgs to implement it. + +The steps to enable the hook are just similar as mentioned in post-hook fo= r parse-function. + +Pre-hook for format-function +---------------------------- + +The generated format-function has a pre-hook that can override the default= xml output of any member and even the whole output of struct instance. + +E.g., for virNetworkForwardDefFormatBuf, we can implement the hook as belo= w: + +:: + + int + virNetworkForwardDefFormatHook(const virNetworkForwardDef *def, + const void *parent, + const void *opaque G_GNUC_UNUSED, + virTristateBool *empty, + virTristateBool *shortcut, + virBuffer *devBuf, + virBuffer *typeBuf G_GNUC_UNUSED, + virBuffer *managedBuf, + virBuffer *driver_nameBuf G_GNUC_UNUSED, + virBuffer *natBuf G_GNUC_UNUSED, + virBuffer *pfsBuf G_GNUC_UNUSED, + virBuffer *ifsBuf G_GNUC_UNUSED) + { + if (def->type =3D=3D VIR_NETWORK_FORWARD_NONE) { + *empty =3D VIR_TRISTATE_BOOL_YES; + return 0; + } + + if (!def->npfs) { + const char *dev =3D virNetworkDefForwardIf(parent, 0); + virBufferEscapeString(devBuf, " dev=3D'%s'", dev); + } else { + virBufferIgnore(devBuf); + } + + if (def->type !=3D VIR_NETWORK_FORWARD_HOSTDEV) + virBufferIgnore(managedBuf); + + if (!(def->nifs || def->npfs || def->nat.port.start || def->nat.po= rt.end || + VIR_SOCKET_ADDR_VALID(&def->nat.addr.start) || + VIR_SOCKET_ADDR_VALID(&def->nat.addr.end) || + (def->driverName !=3D VIR_NETWORK_FORWARD_DRIVER_NAME_DEFAUL= T) || + def->nat.natIPv6)) + *shortcut =3D VIR_TRISTATE_BOOL_YES; + + return 0; + } + +In the hook, we redefine four things: + +1) Redefine the xml output for the attribute **dev** by resetting *devBuf*. + +2) Indicate that the attribute **managed** should be ignored (by *virBuffe= rIgnore*) under some conditions. + +3) Set **shortcut** to indicate that ... should use the= shortut form like under some conditions. + +4) Set **empty** to indicate that shouldn't appear under some co= nditions. + +The arguments **shortcut** and **empty** are both the type of virTristateB= ool. + +By default, they are VIR_TRISTATE_BOOL_ABSENT which means they don't influ= ence the default behavior of the generated format-function. + +Set them with VIR_TRISTATE_BOOL_YES or VIR_TRISTATE_BOOL_NO to turn on/off= them respectively. + +Check-function +-------------- + +It is an auxiliary function for format-function. + +Before a format-function is called to output an xml node, its auxiliary ch= eck-function should be invoked to determine whether the xml node is empty. +For each struct with **genformat**, their check-functions are generated au= tomatically. + +Sometimes the default implementation is not satisfied, we can redefine it. + +E.g., for virDomainGraphicsListenDef, we look through its check-function b= y calling command line as below: + + :: + + # ./scripts/xmlgen/go show virDomainGraphicsListenDef -kf + +We got the default implementation of virDomainGraphicsListenDefCheck and t= he tips. + +Since it doesn't satisfy our needs, we can define RESET_VIR_DOMAIN_GRAPHIC= S_LISTEN_DEF_CHECK and redefine it. --=20 2.25.1 From nobody Tue Apr 23 19:28:24 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 170.10.133.124 as permitted sender) client-ip=170.10.133.124; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-delivery-124.mimecast.com; Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of redhat.com designates 170.10.133.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1619076779; cv=none; d=zohomail.com; s=zohoarc; b=EVlaEEU67AthPEh5uLwDFrcy38DTropYlSJe444eKGgDw4eWUzAnJgrTccLQ9xBCHjNYYky3wrlCrsLGoGdEOXUrOcVmpWvnhFlcnU75j8SfS90eh5WHQ1aspXP9Rd8cU5HoaZhFEgT9pptWWVE1lfYHPBVCP4XqHsgWuEtPwRc= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1619076779; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=c1RMvEsOb0XLuc5k35O16rA/3Y2PQrhKfF/XfhsiThQ=; b=K35eroivbchc8F8uyByKDem6pjAwVThEdMRZOzV0ieV3wOcWQLlmclWLhyTE1mR46pHPRxDxnYswEqJEqCC+l9bgZ7TmecxIpK4PwuDY3WMK+NtReaNrawW0OJTEM83XuXIdZ/+AT2bmfGfsadyOFq4vTF+1puV+Ytj7YR3wiY4= ARC-Authentication-Results: i=1; mx.zohomail.com; spf=pass (zohomail.com: domain of redhat.com designates 170.10.133.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by mx.zohomail.com with SMTPS id 161907677959872.57726346172853; Thu, 22 Apr 2021 00:32:59 -0700 (PDT) Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-32-vQqle8UZMnamTvqS0MAdig-1; Thu, 22 Apr 2021 03:32:56 -0400 Received: from smtp.corp.redhat.com (int-mx08.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 81A4A8189D8; Thu, 22 Apr 2021 07:32:51 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.21]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 5755919701; Thu, 22 Apr 2021 07:32:51 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id 20DAD44A6F; Thu, 22 Apr 2021 07:32:51 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.rdu2.redhat.com [10.11.54.3]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id 13M7WmXh024151 for ; Thu, 22 Apr 2021 03:32:48 -0400 Received: by smtp.corp.redhat.com (Postfix) id 337DA10500DC; Thu, 22 Apr 2021 07:32:48 +0000 (UTC) Received: from mimecast-mx02.redhat.com (mimecast01.extmail.prod.ext.rdu2.redhat.com [10.11.55.17]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 2FEAD10500D9 for ; Thu, 22 Apr 2021 07:32:45 +0000 (UTC) Received: from us-smtp-1.mimecast.com (us-smtp-delivery-1.mimecast.com [205.139.110.120]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 8F49D858EED for ; Thu, 22 Apr 2021 07:32:45 +0000 (UTC) Received: from m97136.mail.qiye.163.com (m97136.mail.qiye.163.com [220.181.97.136]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-350-FeEmrU5sMEmNlMgTSIHg4Q-1; Thu, 22 Apr 2021 03:32:11 -0400 Received: from localhost.localdomain (unknown [58.56.27.130]) by smtp2 (Coremail) with SMTP id iOCowAA3HLYJJYFgMwTJAQ--.5876S7; Thu, 22 Apr 2021 15:26:05 +0800 (CST) X-MC-Unique: vQqle8UZMnamTvqS0MAdig-1 X-MC-Unique: FeEmrU5sMEmNlMgTSIHg4Q-1 From: Shi Lei To: libvir-list@redhat.com Subject: [RFCv3 05/25] build-aux: Only check *.[ch] for sc_prohibit_useless_translation Date: Thu, 22 Apr 2021 15:25:13 +0800 Message-Id: <20210422072533.312211-6-shi_lei@massclouds.com> In-Reply-To: <20210422072533.312211-1-shi_lei@massclouds.com> References: <20210422072533.312211-1-shi_lei@massclouds.com> MIME-Version: 1.0 X-CM-TRANSID: iOCowAA3HLYJJYFgMwTJAQ--.5876S7 X-Coremail-Antispam: 1Uf129KBjDUn29KB7ZKAUJUUUU8529EdanIXcx71UUUUU7v73 VFW2AGmfu7bjvjm3AaLaJ3UbIYCTnIWIevJa73UjIFyTuYvjfULt8eDUUUU X-Originating-IP: [58.56.27.130] X-CM-SenderInfo: pvklsz1hl6ztxvvfz0xxgvhudrp/1tbidQN8T1n5famRAAAAsg X-Mimecast-Impersonation-Protect: Policy=CLT - Impersonation Protection Definition; Similar Internal Domain=false; Similar Monitored External Domain=false; Custom External Domain=false; Mimecast External Domain=false; Newly Observed Domain=false; Internal User Name=false; Custom Display Name List=false; Reply-to Address Mismatch=false; Targeted Threat Dictionary=false; Mimecast Threat Dictionary=false; Custom Threat Dictionary=false X-Scanned-By: MIMEDefang 2.78 on 10.11.54.3 X-loop: libvir-list@redhat.com Cc: Shi Lei X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.84 on 10.5.11.23 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=libvir-list-bounces@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Signed-off-by: Shi Lei --- build-aux/syntax-check.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build-aux/syntax-check.mk b/build-aux/syntax-check.mk index 552d6391..614f21bc 100644 --- a/build-aux/syntax-check.mk +++ b/build-aux/syntax-check.mk @@ -735,7 +735,7 @@ sc_prohibit_useless_translation: halt=3D'found useless translation' \ $(_sc_search_regexp) @prohibit=3D'\ Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [216.205.24.124]) by mx.zohomail.com with SMTPS id 1619076787983637.5431958928999; Thu, 22 Apr 2021 00:33:07 -0700 (PDT) Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-579-giOngJRROpWqa-GTGcDUDQ-1; Thu, 22 Apr 2021 03:33:02 -0400 Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id EF51C807918; Thu, 22 Apr 2021 07:32:55 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.21]) by smtp.corp.redhat.com (Postfix) with ESMTPS id CDA7A62954; Thu, 22 Apr 2021 07:32:55 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id 913EA5533D; Thu, 22 Apr 2021 07:32:55 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.rdu2.redhat.com [10.11.54.4]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id 13M7WrnJ024214 for ; Thu, 22 Apr 2021 03:32:53 -0400 Received: by smtp.corp.redhat.com (Postfix) id 871DE20FE6CF; Thu, 22 Apr 2021 07:32:53 +0000 (UTC) Received: from mimecast-mx02.redhat.com (mimecast06.extmail.prod.ext.rdu2.redhat.com [10.11.55.22]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 7EF6520FE6D0 for ; Thu, 22 Apr 2021 07:32:50 +0000 (UTC) Received: from us-smtp-1.mimecast.com (us-smtp-delivery-1.mimecast.com [207.211.31.120]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id B7D38183B3C6 for ; Thu, 22 Apr 2021 07:32:50 +0000 (UTC) Received: from m97136.mail.qiye.163.com (m97136.mail.qiye.163.com [220.181.97.136]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-561-059QqmvCNBi2w6MlhPLLnA-1; Thu, 22 Apr 2021 03:32:15 -0400 Received: from localhost.localdomain (unknown [58.56.27.130]) by smtp2 (Coremail) with SMTP id iOCowAA3HLYJJYFgMwTJAQ--.5876S8; Thu, 22 Apr 2021 15:26:05 +0800 (CST) X-MC-Unique: giOngJRROpWqa-GTGcDUDQ-1 X-MC-Unique: 059QqmvCNBi2w6MlhPLLnA-1 From: Shi Lei To: libvir-list@redhat.com Subject: [RFCv3 06/25] tests: Add tests for xmlgen Date: Thu, 22 Apr 2021 15:25:14 +0800 Message-Id: <20210422072533.312211-7-shi_lei@massclouds.com> In-Reply-To: <20210422072533.312211-1-shi_lei@massclouds.com> References: <20210422072533.312211-1-shi_lei@massclouds.com> MIME-Version: 1.0 X-CM-TRANSID: iOCowAA3HLYJJYFgMwTJAQ--.5876S8 X-Coremail-Antispam: 1Uf129KBjvAXoWDury5GrWDXw4ktr48Cr1kuFg_yoWkGF18Ao WSgr9Igw4xtr4xXFZ5CF12gF4qgF1Dtr4ftF4Y9r9IgayfZrn8Jryqk3W3Ga4xArWFyry5 Za4fWwnaya1kJas8n29KB7ZKAUJUUUU8529EdanIXcx71UUUUU7v73VFW2AGmfu7bjvjm3 AaLaJ3UbIYCTnIWIevJa73UjIFyTuYvjfULt8eDUUUU X-Originating-IP: [58.56.27.130] X-CM-SenderInfo: pvklsz1hl6ztxvvfz0xxgvhudrp/1tbiTwl8T1f4qZKeqQAAsW X-Mimecast-Impersonation-Protect: Policy=CLT - Impersonation Protection Definition; Similar Internal Domain=false; Similar Monitored External Domain=false; Custom External Domain=false; Mimecast External Domain=false; Newly Observed Domain=false; Internal User Name=false; Custom Display Name List=false; Reply-to Address Mismatch=false; Targeted Threat Dictionary=false; Mimecast Threat Dictionary=false; Custom Threat Dictionary=false X-Scanned-By: MIMEDefang 2.78 on 10.11.54.4 X-loop: libvir-list@redhat.com Cc: Shi Lei X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.15 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=libvir-list-bounces@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add some tests to make sure xmlgen's validity. Signed-off-by: Shi Lei --- tests/meson.build | 1 + tests/xmlgenin/conf/array.h | 17 + tests/xmlgenin/conf/empty.h | 7 + tests/xmlgenin/conf/enum-first-item.h | 12 + tests/xmlgenin/conf/external.h | 9 + tests/xmlgenin/conf/genformat-separate.h | 11 + tests/xmlgenin/conf/genformat.h | 11 + tests/xmlgenin/conf/genparse.h | 11 + tests/xmlgenin/conf/namespace.h | 12 + tests/xmlgenin/conf/required.h | 9 + tests/xmlgenin/conf/skipparse.h | 10 + tests/xmlgenin/conf/specify.h | 13 + tests/xmlgenin/conf/xmlattr.h | 10 + tests/xmlgenin/conf/xmlelem.h | 10 + tests/xmlgenin/conf/xmlgroup.h | 8 + tests/xmlgenin/conf/xmlswitch.h | 17 + tests/xmlgenin/util/enums.h | 58 +++ tests/xmlgenin/util/structs.h | 67 ++++ tests/xmlgenout/array.txt | 364 ++++++++++++++++++ tests/xmlgenout/empty.txt | 181 +++++++++ tests/xmlgenout/enum-first-item.txt | 297 ++++++++++++++ tests/xmlgenout/external.txt | 205 ++++++++++ tests/xmlgenout/genformat-separate.txt | 190 +++++++++ tests/xmlgenout/genformat.txt | 142 +++++++ tests/xmlgenout/genparse.txt | 154 ++++++++ tests/xmlgenout/namespace.txt | 222 +++++++++++ tests/xmlgenout/required.txt | 236 ++++++++++++ tests/xmlgenout/skipparse.txt | 223 +++++++++++ tests/xmlgenout/specify.txt | 291 ++++++++++++++ tests/xmlgenout/xmlattr.txt | 252 ++++++++++++ tests/xmlgenout/xmlelem.txt | 243 ++++++++++++ tests/xmlgenout/xmlgroup.txt | 204 ++++++++++ tests/xmlgenout/xmlswitch.txt | 470 +++++++++++++++++++++++ tests/xmlgentest.c | 107 ++++++ 34 files changed, 4074 insertions(+) create mode 100644 tests/xmlgenin/conf/array.h create mode 100644 tests/xmlgenin/conf/empty.h create mode 100644 tests/xmlgenin/conf/enum-first-item.h create mode 100644 tests/xmlgenin/conf/external.h create mode 100644 tests/xmlgenin/conf/genformat-separate.h create mode 100644 tests/xmlgenin/conf/genformat.h create mode 100644 tests/xmlgenin/conf/genparse.h create mode 100644 tests/xmlgenin/conf/namespace.h create mode 100644 tests/xmlgenin/conf/required.h create mode 100644 tests/xmlgenin/conf/skipparse.h create mode 100644 tests/xmlgenin/conf/specify.h create mode 100644 tests/xmlgenin/conf/xmlattr.h create mode 100644 tests/xmlgenin/conf/xmlelem.h create mode 100644 tests/xmlgenin/conf/xmlgroup.h create mode 100644 tests/xmlgenin/conf/xmlswitch.h create mode 100644 tests/xmlgenin/util/enums.h create mode 100644 tests/xmlgenin/util/structs.h create mode 100644 tests/xmlgenout/array.txt create mode 100644 tests/xmlgenout/empty.txt create mode 100644 tests/xmlgenout/enum-first-item.txt create mode 100644 tests/xmlgenout/external.txt create mode 100644 tests/xmlgenout/genformat-separate.txt create mode 100644 tests/xmlgenout/genformat.txt create mode 100644 tests/xmlgenout/genparse.txt create mode 100644 tests/xmlgenout/namespace.txt create mode 100644 tests/xmlgenout/required.txt create mode 100644 tests/xmlgenout/skipparse.txt create mode 100644 tests/xmlgenout/specify.txt create mode 100644 tests/xmlgenout/xmlattr.txt create mode 100644 tests/xmlgenout/xmlelem.txt create mode 100644 tests/xmlgenout/xmlgroup.txt create mode 100644 tests/xmlgenout/xmlswitch.txt create mode 100644 tests/xmlgentest.c diff --git a/tests/meson.build b/tests/meson.build index 14ace476..166416cc 100644 --- a/tests/meson.build +++ b/tests/meson.build @@ -340,6 +340,7 @@ tests +=3D [ { 'name': 'viruritest' }, { 'name': 'vshtabletest', 'link_with': [ libvirt_shell_lib ] }, { 'name': 'virmigtest' }, + { 'name': 'xmlgentest' }, ] =20 if host_machine.system() =3D=3D 'linux' diff --git a/tests/xmlgenin/conf/array.h b/tests/xmlgenin/conf/array.h new file mode 100644 index 00000000..8f003be4 --- /dev/null +++ b/tests/xmlgenin/conf/array.h @@ -0,0 +1,17 @@ +/* Test array features */ + +#pragma once + +typedef struct _virArrayDef virArrayDef; +struct _virArrayDef { /* genparse, genformat */ + size_t nnames; + char **names; /* xmlelem:hostname, array */ + size_t nfwds; + virNetworkDNSForwarder *forwarders; /* xmlelem, array:nfwds */ + size_t ntxts; + virNetworkDNSTxtDef *txts; /* xmlelem, array */ + + size_t nroutes; + /* ptr to array of static routes on this interface */ + virNetDevIPRoute **routes; /* xmlelem, array */ +}; diff --git a/tests/xmlgenin/conf/empty.h b/tests/xmlgenin/conf/empty.h new file mode 100644 index 00000000..c8292c8e --- /dev/null +++ b/tests/xmlgenin/conf/empty.h @@ -0,0 +1,7 @@ +/* Test empty struct */ + +#pragma once + +typedef struct _virEmptyDef virEmptyDef; +struct _virEmptyDef { /* genparse, genformat */ +}; diff --git a/tests/xmlgenin/conf/enum-first-item.h b/tests/xmlgenin/conf/en= um-first-item.h new file mode 100644 index 00000000..c62dfe8a --- /dev/null +++ b/tests/xmlgenin/conf/enum-first-item.h @@ -0,0 +1,12 @@ +/* Test first item for enum features */ + +#pragma once + +typedef struct _virEnumFirstItemDef virEnumFirstItemDef; +struct _virEnumFirstItemDef { /* genparse, genformat= */ + virNetworkBridgeMACTableManagerType has_def; /* xmlattr */ + virNetworkForwardType has_none; /* xmlattr */ + virTristateBool has_absent; /* xmlattr */ + + virDomainGraphicsType no_default; /* xmlattr */ +}; diff --git a/tests/xmlgenin/conf/external.h b/tests/xmlgenin/conf/external.h new file mode 100644 index 00000000..52b46acd --- /dev/null +++ b/tests/xmlgenin/conf/external.h @@ -0,0 +1,9 @@ +/* Test specify features */ + +#pragma once + +typedef struct _virExternalDef virExternalDef; +struct _virExternalDef { /* genparse, genformat */ + /* xmlNode is an external type which is not defined in libvirt */ + xmlNode *metadata; /* xmlelem */ +}; diff --git a/tests/xmlgenin/conf/genformat-separate.h b/tests/xmlgenin/conf= /genformat-separate.h new file mode 100644 index 00000000..8e4643af --- /dev/null +++ b/tests/xmlgenin/conf/genformat-separate.h @@ -0,0 +1,11 @@ +/* Test genformat-separate features */ + +#pragma once + +typedef struct _virSeparateDef virSeparateDef; +struct _virSeparateDef { /* genformat:separate */ + virTristateBool enable; /* xmlattr */ + virSocketAddr ip; /* xmlelem */ + size_t ntxts; + virNetworkDNSTxtDef *txts; /* xmlelem, array */ +}; diff --git a/tests/xmlgenin/conf/genformat.h b/tests/xmlgenin/conf/genforma= t.h new file mode 100644 index 00000000..fb92351a --- /dev/null +++ b/tests/xmlgenin/conf/genformat.h @@ -0,0 +1,11 @@ +/* Test genformat features */ + +#pragma once + +typedef struct _virGenFormatDef virGenFormatDef; +struct _virGenFormatDef { /* genformat */ + virTristateBool enable; /* xmlattr */ + virSocketAddr ip; /* xmlelem */ + size_t ntxts; + virNetworkDNSTxtDef *txts; /* xmlelem, array */ +}; diff --git a/tests/xmlgenin/conf/genparse.h b/tests/xmlgenin/conf/genparse.h new file mode 100644 index 00000000..daf53817 --- /dev/null +++ b/tests/xmlgenin/conf/genparse.h @@ -0,0 +1,11 @@ +/* Test genparse features */ + +#pragma once + +typedef struct _virGenParseDef virGenParseDef; +struct _virGenParseDef { /* genparse */ + virTristateBool enable; /* xmlattr */ + virSocketAddr ip; /* xmlelem */ + size_t ntxts; + virNetworkDNSTxtDef *txts; /* xmlelem, array */ +}; diff --git a/tests/xmlgenin/conf/namespace.h b/tests/xmlgenin/conf/namespac= e.h new file mode 100644 index 00000000..0637e64a --- /dev/null +++ b/tests/xmlgenin/conf/namespace.h @@ -0,0 +1,12 @@ +/* Test namespace features */ + +#pragma once + +typedef struct _virNameSpaceDef virNameSpaceDef; +struct _virNameSpaceDef { /* genparse, genformat */ + char *name; /* xmlelem */ + + /* Network specific XML namespace data */ + void *namespaceData; + virXMLNamespace ns; +}; diff --git a/tests/xmlgenin/conf/required.h b/tests/xmlgenin/conf/required.h new file mode 100644 index 00000000..d45af727 --- /dev/null +++ b/tests/xmlgenin/conf/required.h @@ -0,0 +1,9 @@ +/* Test required features */ + +#pragma once + +typedef struct _virRequiredDef virRequiredDef; +struct _virRequiredDef { /* genparse, genformat */ + char *name; /* xmlattr, required */ + virNetworkBootpDef bootp; /* xmlelem, required */ +}; diff --git a/tests/xmlgenin/conf/skipparse.h b/tests/xmlgenin/conf/skippars= e.h new file mode 100644 index 00000000..680a1107 --- /dev/null +++ b/tests/xmlgenin/conf/skipparse.h @@ -0,0 +1,10 @@ +/* Test skipparse features */ + +#pragma once + +typedef struct _virSkipParseDef virSkipParseDef; +struct _virSkipParseDef { /* genparse, genformat */ + int connections; /* xmlattr, skipparse */ + size_t nifs; + virNetworkForwardIfDef *ifs; /* xmlelem, array, skipparse */ +}; diff --git a/tests/xmlgenin/conf/specify.h b/tests/xmlgenin/conf/specify.h new file mode 100644 index 00000000..419bd24d --- /dev/null +++ b/tests/xmlgenin/conf/specify.h @@ -0,0 +1,13 @@ +/* Test specify features */ + +#pragma once + +typedef struct _virSpecifyDef virSpecifyDef; +struct _virSpecifyDef { /* genparse, genformat */ + virNetworkDHCPLeaseTimeUnitType unit; /* xmlattr */ + unsigned long expiry; /* xmlattr, specify:unit */ + virMacAddr mac; /* xmlattr:mac/address */ + bool mac_specified; /* specify:mac */ + virUUID uuid; /* xmlelem, xmltext */ + bool uuid_specified; /* specify:uuid */ +}; diff --git a/tests/xmlgenin/conf/xmlattr.h b/tests/xmlgenin/conf/xmlattr.h new file mode 100644 index 00000000..60dfae9a --- /dev/null +++ b/tests/xmlgenin/conf/xmlattr.h @@ -0,0 +1,10 @@ +/* Test xmlattr features */ + +#pragma once + +typedef struct _virXMLAttrDef virXMLAttrDef; +struct _virXMLAttrDef { /* genparse, genformat */ + char *family; /* xmlattr */ + virTristateBool localPTR; /* xmlattr:localPtr */ + char *tftproot; /* xmlattr:tftp/root */ +}; diff --git a/tests/xmlgenin/conf/xmlelem.h b/tests/xmlgenin/conf/xmlelem.h new file mode 100644 index 00000000..d111f2b5 --- /dev/null +++ b/tests/xmlgenin/conf/xmlelem.h @@ -0,0 +1,10 @@ +/* Test xmlelem features */ + +#pragma once + +typedef struct _virXMLElemDef virXMLElemDef; +struct _virXMLElemDef { /* genparse, genformat */ + virPortRange port; /* xmlelem */ + virSocketAddrRange addr; /* xmlelem:address */ + virUUID uuid; /* xmlelem, xmltext */ +}; diff --git a/tests/xmlgenin/conf/xmlgroup.h b/tests/xmlgenin/conf/xmlgroup.h new file mode 100644 index 00000000..ed12d919 --- /dev/null +++ b/tests/xmlgenin/conf/xmlgroup.h @@ -0,0 +1,8 @@ +/* Test xmlgroup features */ + +#pragma once + +typedef struct _virXMLGroupDef virXMLGroupDef; +struct _virXMLGroupDef { /* genparse, genformat */ + virUtilAuthDef auth; /* xmlgroup */ +}; diff --git a/tests/xmlgenin/conf/xmlswitch.h b/tests/xmlgenin/conf/xmlswitc= h.h new file mode 100644 index 00000000..8730f1b3 --- /dev/null +++ b/tests/xmlgenin/conf/xmlswitch.h @@ -0,0 +1,17 @@ +/* Test xmlswitch features */ + +#pragma once + +typedef struct _virXMLSwitchDef virXMLSwitchDef; +struct _virXMLSwitchDef { /* genparse, genfo= rmat */ + virDomainGraphicsType type; /* xmlattr */ + + union { + virDomainGraphicsSDLDef sdl; /* xmlgroup */ + virDomainGraphicsVNCDef vnc; /* xmlgroup */ + virDomainGraphicsRDPDef rdp; /* xmlgroup */ + virDomainGraphicsDesktopDef desktop; /* xmlgroup */ + virDomainGraphicsSpiceDef spice; /* xmlgroup */ + virDomainGraphicsEGLHeadlessDef egl_headless; /* xmlgroup */ + } data; /* xmlswitch:type = */ +}; diff --git a/tests/xmlgenin/util/enums.h b/tests/xmlgenin/util/enums.h new file mode 100644 index 00000000..89d2eccd --- /dev/null +++ b/tests/xmlgenin/util/enums.h @@ -0,0 +1,58 @@ +/* Basic enum */ + +#pragma once + +/* + * The tool xmlgen scans all header-files in 'util' and 'conf' + * to find all enum types, and further, to determine whether + * they have default item. + * + */ + +typedef enum { + VIR_DOMAIN_GRAPHICS_TYPE_SDL, + VIR_DOMAIN_GRAPHICS_TYPE_VNC, + VIR_DOMAIN_GRAPHICS_TYPE_RDP, + VIR_DOMAIN_GRAPHICS_TYPE_DESKTOP, + VIR_DOMAIN_GRAPHICS_TYPE_SPICE, + VIR_DOMAIN_GRAPHICS_TYPE_EGL_HEADLESS, + + VIR_DOMAIN_GRAPHICS_TYPE_LAST +} virDomainGraphicsType; + +typedef enum { + VIR_NETWORK_FORWARD_NONE =3D 0, + VIR_NETWORK_FORWARD_NAT, + VIR_NETWORK_FORWARD_ROUTE, + VIR_NETWORK_FORWARD_OPEN, + VIR_NETWORK_FORWARD_BRIDGE, + VIR_NETWORK_FORWARD_PRIVATE, + VIR_NETWORK_FORWARD_VEPA, + VIR_NETWORK_FORWARD_PASSTHROUGH, + VIR_NETWORK_FORWARD_HOSTDEV, + + VIR_NETWORK_FORWARD_LAST, +} virNetworkForwardType; + +typedef enum { + VIR_NETWORK_BRIDGE_MAC_TABLE_MANAGER_DEFAULT =3D 0, + VIR_NETWORK_BRIDGE_MAC_TABLE_MANAGER_KERNEL, + VIR_NETWORK_BRIDGE_MAC_TABLE_MANAGER_LIBVIRT, + VIR_NETWORK_BRIDGE_MAC_TABLE_MANAGER_LAST, +} virNetworkBridgeMACTableManagerType; + +typedef enum { + VIR_TRISTATE_BOOL_ABSENT =3D 0, + VIR_TRISTATE_BOOL_YES, + VIR_TRISTATE_BOOL_NO, + + VIR_TRISTATE_BOOL_LAST +} virTristateBool; + +typedef enum { + VIR_NETWORK_DHCP_LEASETIME_UNIT_SECONDS =3D 0, + VIR_NETWORK_DHCP_LEASETIME_UNIT_MINUTES, + VIR_NETWORK_DHCP_LEASETIME_UNIT_HOURS, + + VIR_NETWORK_DHCP_LEASETIME_UNIT_LAST, +} virNetworkDHCPLeaseTimeUnitType; diff --git a/tests/xmlgenin/util/structs.h b/tests/xmlgenin/util/structs.h new file mode 100644 index 00000000..80c10096 --- /dev/null +++ b/tests/xmlgenin/util/structs.h @@ -0,0 +1,67 @@ +/* Basic structs */ + +#pragma once + +/* + * The tool xmlgen scans all header-files in 'util' and 'conf' + * to find all struct types. + * For tests, it's unnecessary to include any members for these structs. + */ + +typedef struct _virNetDevIPRoute virNetDevIPRoute; +struct _virNetDevIPRoute { +}; + +typedef struct _virNetworkDNSForwarder virNetworkDNSForwarder; +struct _virNetworkDNSForwarder { +}; + +typedef struct _virNetworkDNSTxtDef virNetworkDNSTxtDef; +struct _virNetworkDNSTxtDef { +}; + +typedef struct _virSocketAddr virSocketAddr; +struct _virSocketAddr { +}; + +typedef struct _virNetworkForwardIfDef virNetworkForwardIfDef; +struct _virNetworkForwardIfDef { +}; + +typedef struct _virPortRange virPortRange; +struct _virPortRange { +}; + +typedef struct _virSocketAddrRange virSocketAddrRange; +struct _virSocketAddrRange { +}; + +typedef struct _virUtilAuthDef virUtilAuthDef; +struct _virUtilAuthDef { +}; + +typedef struct _virNetworkBootpDef virNetworkBootpDef; +struct _virNetworkBootpDef { +}; + +typedef struct _virMacAddr virMacAddr; +struct _virMacAddr { +}; + +struct _virDomainGraphicsSDLDef { +}; + +struct _virDomainGraphicsVNCDef { +}; + +struct _virDomainGraphicsRDPDef { +}; + +struct _virDomainGraphicsDesktopDef { +}; + +struct _virDomainGraphicsSpiceDef { +}; + +struct _virDomainGraphicsEGLHeadlessDef { +}; diff --git a/tests/xmlgenout/array.txt b/tests/xmlgenout/array.txt new file mode 100644 index 00000000..ccb2d168 --- /dev/null +++ b/tests/xmlgenout/array.txt @@ -0,0 +1,364 @@ +[conf/array.generated.h] + +void +virArrayDefClear(virArrayDef *def); + + +[conf/array.generated.c] + +void +virArrayDefClear(virArrayDef *def) +{ + if (!def) + return; + + if (def->nnames) { + size_t i; + for (i =3D 0; i < def->nnames; i++) { + g_free(def->names[i]); + def->names[i] =3D NULL; + } + } + g_free(def->names); + def->names =3D NULL; + def->nnames =3D 0; + + if (def->nfwds) { + size_t i; + for (i =3D 0; i < def->nfwds; i++) + virNetworkDNSForwarderClear(&def->forwarders[i]); + } + g_free(def->forwarders); + def->forwarders =3D NULL; + def->nfwds =3D 0; + + if (def->ntxts) { + size_t i; + for (i =3D 0; i < def->ntxts; i++) + virNetworkDNSTxtDefClear(&def->txts[i]); + } + g_free(def->txts); + def->txts =3D NULL; + def->ntxts =3D 0; + + if (def->nroutes) { + size_t i; + for (i =3D 0; i < def->nroutes; i++) { + virNetDevIPRouteClear(def->routes[i]); + g_free(def->routes[i]); + def->routes[i] =3D NULL; + } + } + g_free(def->routes); + def->routes =3D NULL; + def->nroutes =3D 0; +} + + +[conf/array.generated.h] + +int +virArrayDefParseXML(xmlNodePtr node, + virArrayDef *def, + const char *instname, + void *parent, + void *opaque); + + +[conf/array.generated.h] + +#ifdef ENABLE_VIR_ARRAY_DEF_PARSE_HOOK + +int +virArrayDefParseHook(xmlNodePtr node, + virArrayDef *def, + const char *instname, + void *parent, + void *opaque, + int nHostnameNodes, + int nForwarderNodes, + int nTxtNodes, + int nRouteNodes); + +#endif + + +[conf/array.generated.h] + +#ifdef ENABLE_VIR_ARRAY_DEF_PARSE_HOOK_SET_ARGS + +void +virArrayDefParseXMLSetArgs(xmlNodePtr node, + void *parent, + void **pparent, + void **popaque); + +#endif + + +[conf/array.generated.c] + +int +virArrayDefParseXML(xmlNodePtr node, + virArrayDef *def, + const char *instname G_GNUC_UNUSED, + void *parent G_GNUC_UNUSED, + void *opaque G_GNUC_UNUSED) +{ + int nHostnameNodes =3D 0; + xmlNodePtr *nodes =3D NULL; + int nForwarderNodes =3D 0; + int nTxtNodes =3D 0; + int nRouteNodes =3D 0; + void *arg_parent G_GNUC_UNUSED =3D def; + void *arg_opaque G_GNUC_UNUSED =3D opaque; + + if (!def) + goto error; + +#ifdef ENABLE_VIR_ARRAY_DEF_PARSE_HOOK_SET_ARGS + virArrayDefParseXMLSetArgs(node, parent, &arg_parent, &arg_opaque); +#endif + + nHostnameNodes =3D virXMLChildNodeSet(node, "hostname", &nodes); + if (nHostnameNodes > 0) { + size_t i; + + def->names =3D g_new0(typeof(*def->names), nHostnameNodes); + for (i =3D 0; i < nHostnameNodes; i++) { + xmlNodePtr tnode =3D nodes[i]; + def->names[i] =3D virXMLNodeContentString(tnode); + } + def->nnames =3D nHostnameNodes; + g_free(nodes); + nodes =3D NULL; + } else if (nHostnameNodes < 0) { + virReportError(VIR_ERR_XML_ERROR, + _("Invalid %s element found."), + "hostname"); + goto error; + } + + nForwarderNodes =3D virXMLChildNodeSet(node, "forwarder", &nodes); + if (nForwarderNodes > 0) { + size_t i; + + def->forwarders =3D g_new0(typeof(*def->forwarders), nForwarderNod= es); + for (i =3D 0; i < nForwarderNodes; i++) { + xmlNodePtr tnode =3D nodes[i]; + if (virNetworkDNSForwarderParseXML(tnode, &def->forwarders[i],= instname, arg_parent, arg_opaque) < 0) + goto error; + } + def->nfwds =3D nForwarderNodes; + g_free(nodes); + nodes =3D NULL; + } else if (nForwarderNodes < 0) { + virReportError(VIR_ERR_XML_ERROR, + _("Invalid %s element found."), + "forwarder"); + goto error; + } + + nTxtNodes =3D virXMLChildNodeSet(node, "txt", &nodes); + if (nTxtNodes > 0) { + size_t i; + + def->txts =3D g_new0(typeof(*def->txts), nTxtNodes); + for (i =3D 0; i < nTxtNodes; i++) { + xmlNodePtr tnode =3D nodes[i]; + if (virNetworkDNSTxtDefParseXML(tnode, &def->txts[i], instname= , arg_parent, arg_opaque) < 0) + goto error; + } + def->ntxts =3D nTxtNodes; + g_free(nodes); + nodes =3D NULL; + } else if (nTxtNodes < 0) { + virReportError(VIR_ERR_XML_ERROR, + _("Invalid %s element found."), + "txt"); + goto error; + } + + nRouteNodes =3D virXMLChildNodeSet(node, "route", &nodes); + if (nRouteNodes > 0) { + size_t i; + + def->routes =3D g_new0(typeof(*def->routes), nRouteNodes); + for (i =3D 0; i < nRouteNodes; i++) { + xmlNodePtr tnode =3D nodes[i]; + def->routes[i] =3D g_new0(typeof(*def->routes[i]), 1); + if (virNetDevIPRouteParseXML(tnode, def->routes[i], instname, = arg_parent, arg_opaque) < 0) + goto error; + } + def->nroutes =3D nRouteNodes; + g_free(nodes); + nodes =3D NULL; + } else if (nRouteNodes < 0) { + virReportError(VIR_ERR_XML_ERROR, + _("Invalid %s element found."), + "route"); + goto error; + } + +#ifdef ENABLE_VIR_ARRAY_DEF_PARSE_HOOK + if (virArrayDefParseHook(node, def, instname, parent, opaque, nHostnam= eNodes, nForwarderNodes, nTxtNodes, nRouteNodes) < 0) + goto error; +#endif + + return 0; + + error: + g_free(nodes); + nodes =3D NULL; + virArrayDefClear(def); + return -1; +} + + +[conf/array.generated.h] + +int +virArrayDefFormatBuf(virBuffer *buf, + const char *name, + const virArrayDef *def, + const void *parent, + void *opaque); + + +[conf/array.generated.h] + +#ifdef ENABLE_VIR_ARRAY_DEF_FORMAT_HOOK + +int +virArrayDefFormatHook(const virArrayDef *def, + const void *parent, + const void *opaque, + virTristateBool *empty, + virTristateBool *shortcut, + virBuffer *namesBuf, + virBuffer *forwardersBuf, + virBuffer *txtsBuf, + virBuffer *routesBuf); + +#endif /* ENABLE_VIR_ARRAY_DEF_FORMAT_HOOK */ + + +[conf/array.generated.c] + +int +virArrayDefFormatBuf(virBuffer *buf, + const char *name, + const virArrayDef *def, + const void *parent G_GNUC_UNUSED, + void *opaque G_GNUC_UNUSED) +{ + virTristateBool empty G_GNUC_UNUSED =3D VIR_TRISTATE_BOOL_ABSENT; + virTristateBool shortcut G_GNUC_UNUSED =3D VIR_TRISTATE_BOOL_ABSENT; + g_auto(virBuffer) namesBuf =3D VIR_BUFFER_INITIALIZER; + g_auto(virBuffer) forwardersBuf =3D VIR_BUFFER_INITIALIZER; + g_auto(virBuffer) txtsBuf =3D VIR_BUFFER_INITIALIZER; + g_auto(virBuffer) routesBuf =3D VIR_BUFFER_INITIALIZER; + + if (!def || !buf) + return 0; + +#ifdef ENABLE_VIR_ARRAY_DEF_FORMAT_HOOK + if (virArrayDefFormatHook(def, parent, opaque, &empty, &shortcut, &nam= esBuf, &forwardersBuf, &txtsBuf, &routesBuf) < 0) + return -1; +#endif /* ENABLE_VIR_ARRAY_DEF_FORMAT_HOOK */ + + if (empty !=3D VIR_TRISTATE_BOOL_NO) + if (empty || !(def->nnames || def->nfwds || def->ntxts || def->nro= utes)) + return 0; + + virBufferAsprintf(buf, "<%s", name); + + virBufferAddLit(buf, ">\n"); + + virBufferAdjustIndent(buf, 2); + + virBufferInheritIndent(&namesBuf, buf); + if (!virBufferTouched(&namesBuf) && def->nnames) { + size_t i; + for (i =3D 0; i < def->nnames; i++) + virBufferEscapeString(buf, "%s\n", def->n= ames[i]); + } + virBufferAddBuffer(buf, &namesBuf); + + virBufferInheritIndent(&forwardersBuf, buf); + if (!virBufferTouched(&forwardersBuf) && def->nfwds) { + size_t i; + for (i =3D 0; i < def->nfwds; i++) { + if (virNetworkDNSForwarderFormatBuf(buf, "forwarder", &def->fo= rwarders[i], def, opaque) < 0) + return -1; + } + } + virBufferAddBuffer(buf, &forwardersBuf); + + virBufferInheritIndent(&txtsBuf, buf); + if (!virBufferTouched(&txtsBuf) && def->ntxts) { + size_t i; + for (i =3D 0; i < def->ntxts; i++) { + if (virNetworkDNSTxtDefFormatBuf(buf, "txt", &def->txts[i], de= f, opaque) < 0) + return -1; + } + } + virBufferAddBuffer(buf, &txtsBuf); + + virBufferInheritIndent(&routesBuf, buf); + if (!virBufferTouched(&routesBuf) && def->nroutes) { + size_t i; + for (i =3D 0; i < def->nroutes; i++) { + if (virNetDevIPRouteFormatBuf(buf, "route", def->routes[i], de= f, opaque) < 0) + return -1; + } + } + virBufferAddBuffer(buf, &routesBuf); + + virBufferAdjustIndent(buf, -2); + virBufferAsprintf(buf, "\n", name); + + return 0; +} + + +[conf/array.generated.h] + +bool +virArrayDefCheck(const virArrayDef *def, + const void *parent, + void *opaque); + + +[conf/array.generated.c] + +#ifndef RESET_VIR_ARRAY_DEF_CHECK + +bool +virArrayDefCheck(const virArrayDef *def, + const void *parent G_GNUC_UNUSED, + void *opaque G_GNUC_UNUSED) +{ + if (!def) + return false; + + return def->nnames || def->nfwds || def->ntxts || def->nroutes; +} + +#endif /* RESET_VIR_ARRAY_DEF_CHECK */ + + +[Tips] + +/* Put these lines at the bottom of "conf/array.h" */ +/* Makesure "array.h" to be appended into conf_xmlgen_input in src/conf/me= son.build */ + +/* Define macro to enable hook or redefine check when necessary */ +/* #define ENABLE_VIR_ARRAY_DEF_PARSE_HOOK */ +/* #define ENABLE_VIR_ARRAY_DEF_PARSE_HOOK_SET_ARGS */ +/* #define ENABLE_VIR_ARRAY_DEF_FORMAT_HOOK */ + +/* #define RESET_VIR_ARRAY_DEF_CHECK */ + +/* Makesure below is the bottom line! */ +#include "array.generated.h" diff --git a/tests/xmlgenout/empty.txt b/tests/xmlgenout/empty.txt new file mode 100644 index 00000000..c83a2c12 --- /dev/null +++ b/tests/xmlgenout/empty.txt @@ -0,0 +1,181 @@ +[conf/empty.generated.h] + +void +virEmptyDefClear(virEmptyDef *def); + + +[conf/empty.generated.c] + +void +virEmptyDefClear(virEmptyDef *def) +{ + if (!def) + return; +} + + +[conf/empty.generated.h] + +int +virEmptyDefParseXML(xmlNodePtr node, + virEmptyDef *def, + const char *instname, + void *parent, + void *opaque); + + +[conf/empty.generated.h] + +#ifdef ENABLE_VIR_EMPTY_DEF_PARSE_HOOK + +int +virEmptyDefParseHook(xmlNodePtr node, + virEmptyDef *def, + const char *instname, + void *parent, + void *opaque); + +#endif + + +[conf/empty.generated.h] + +#ifdef ENABLE_VIR_EMPTY_DEF_PARSE_HOOK_SET_ARGS + +void +virEmptyDefParseXMLSetArgs(xmlNodePtr node, + void *parent, + void **pparent, + void **popaque); + +#endif + + +[conf/empty.generated.c] + +int +virEmptyDefParseXML(xmlNodePtr node, + virEmptyDef *def, + const char *instname G_GNUC_UNUSED, + void *parent G_GNUC_UNUSED, + void *opaque G_GNUC_UNUSED) +{ + void *arg_parent G_GNUC_UNUSED =3D def; + void *arg_opaque G_GNUC_UNUSED =3D opaque; + + if (!def) + goto error; + +#ifdef ENABLE_VIR_EMPTY_DEF_PARSE_HOOK_SET_ARGS + virEmptyDefParseXMLSetArgs(node, parent, &arg_parent, &arg_opaque); +#endif + +#ifdef ENABLE_VIR_EMPTY_DEF_PARSE_HOOK + if (virEmptyDefParseHook(node, def, instname, parent, opaque) < 0) + goto error; +#endif + + return 0; + + error: + virEmptyDefClear(def); + return -1; +} + + +[conf/empty.generated.h] + +int +virEmptyDefFormatBuf(virBuffer *buf, + const char *name, + const virEmptyDef *def, + const void *parent, + void *opaque); + + +[conf/empty.generated.h] + +#ifdef ENABLE_VIR_EMPTY_DEF_FORMAT_HOOK + +int +virEmptyDefFormatHook(const virEmptyDef *def, + const void *parent, + const void *opaque, + virTristateBool *empty, + virTristateBool *shortcut); + +#endif /* ENABLE_VIR_EMPTY_DEF_FORMAT_HOOK */ + + +[conf/empty.generated.c] + +int +virEmptyDefFormatBuf(virBuffer *buf, + const char *name, + const virEmptyDef *def, + const void *parent G_GNUC_UNUSED, + void *opaque G_GNUC_UNUSED) +{ + virTristateBool empty G_GNUC_UNUSED =3D VIR_TRISTATE_BOOL_ABSENT; + virTristateBool shortcut G_GNUC_UNUSED =3D VIR_TRISTATE_BOOL_ABSENT; + + if (!def || !buf) + return 0; + +#ifdef ENABLE_VIR_EMPTY_DEF_FORMAT_HOOK + if (virEmptyDefFormatHook(def, parent, opaque, &empty, &shortcut) < 0) + return -1; +#endif /* ENABLE_VIR_EMPTY_DEF_FORMAT_HOOK */ + + if (empty !=3D VIR_TRISTATE_BOOL_NO) + if (empty) + return 0; + + virBufferAsprintf(buf, "<%s", name); + + virBufferAddLit(buf, "/>\n"); + + return 0; +} + + +[conf/empty.generated.h] + +bool +virEmptyDefCheck(const virEmptyDef *def, + const void *parent, + void *opaque); + + +[conf/empty.generated.c] + +#ifndef RESET_VIR_EMPTY_DEF_CHECK + +bool +virEmptyDefCheck(const virEmptyDef *def, + const void *parent G_GNUC_UNUSED, + void *opaque G_GNUC_UNUSED) +{ + if (!def) + return false; + + return false; +} + +#endif /* RESET_VIR_EMPTY_DEF_CHECK */ + + +[Tips] + +/* Put these lines at the bottom of "conf/empty.h" */ +/* Makesure "empty.h" to be appended into conf_xmlgen_input in src/conf/me= son.build */ + +/* Define macro to enable hook or redefine check when necessary */ +/* #define ENABLE_VIR_EMPTY_DEF_PARSE_HOOK */ +/* #define ENABLE_VIR_EMPTY_DEF_PARSE_HOOK_SET_ARGS */ +/* #define ENABLE_VIR_EMPTY_DEF_FORMAT_HOOK */ + +/* #define RESET_VIR_EMPTY_DEF_CHECK */ + +/* Makesure below is the bottom line! */ +#include "empty.generated.h" diff --git a/tests/xmlgenout/enum-first-item.txt b/tests/xmlgenout/enum-fir= st-item.txt new file mode 100644 index 00000000..4186d46d --- /dev/null +++ b/tests/xmlgenout/enum-first-item.txt @@ -0,0 +1,297 @@ +[conf/enum-first-item.generated.h] + +void +virEnumFirstItemDefClear(virEnumFirstItemDef *def); + + +[conf/enum-first-item.generated.c] + +void +virEnumFirstItemDefClear(virEnumFirstItemDef *def) +{ + if (!def) + return; + + def->has_def =3D 0; + + def->has_none =3D 0; + + def->has_absent =3D 0; + + def->no_default =3D 0; +} + + +[conf/enum-first-item.generated.h] + +int +virEnumFirstItemDefParseXML(xmlNodePtr node, + virEnumFirstItemDef *def, + const char *instname, + void *parent, + void *opaque); + + +[conf/enum-first-item.generated.h] + +#ifdef ENABLE_VIR_ENUM_FIRST_ITEM_DEF_PARSE_HOOK + +int +virEnumFirstItemDefParseHook(xmlNodePtr node, + virEnumFirstItemDef *def, + const char *instname, + void *parent, + void *opaque, + const char *has_defStr, + const char *has_noneStr, + const char *has_absentStr, + const char *no_defaultStr); + +#endif + + +[conf/enum-first-item.generated.h] + +#ifdef ENABLE_VIR_ENUM_FIRST_ITEM_DEF_PARSE_HOOK_SET_ARGS + +void +virEnumFirstItemDefParseXMLSetArgs(xmlNodePtr node, + void *parent, + void **pparent, + void **popaque); + +#endif + + +[conf/enum-first-item.generated.c] + +int +virEnumFirstItemDefParseXML(xmlNodePtr node, + virEnumFirstItemDef *def, + const char *instname G_GNUC_UNUSED, + void *parent G_GNUC_UNUSED, + void *opaque G_GNUC_UNUSED) +{ + g_autofree char *has_defStr =3D NULL; + g_autofree char *has_noneStr =3D NULL; + g_autofree char *has_absentStr =3D NULL; + g_autofree char *no_defaultStr =3D NULL; + void *arg_parent G_GNUC_UNUSED =3D def; + void *arg_opaque G_GNUC_UNUSED =3D opaque; + + if (!def) + goto error; + +#ifdef ENABLE_VIR_ENUM_FIRST_ITEM_DEF_PARSE_HOOK_SET_ARGS + virEnumFirstItemDefParseXMLSetArgs(node, parent, &arg_parent, &arg_opa= que); +#endif + + has_defStr =3D virXMLPropString(node, "has_def"); + if (has_defStr) { + if ((def->has_def =3D virNetworkBridgeMACTableManagerTypeFromStrin= g(has_defStr)) <=3D 0) { + virReportError(VIR_ERR_XML_ERROR, + _("Invalid '%s' setting '%s' in '%s'"), + "has_def", has_defStr, instname); + goto error; + } + } + + has_noneStr =3D virXMLPropString(node, "has_none"); + if (has_noneStr) { + if ((def->has_none =3D virNetworkForwardTypeFromString(has_noneStr= )) <=3D 0) { + virReportError(VIR_ERR_XML_ERROR, + _("Invalid '%s' setting '%s' in '%s'"), + "has_none", has_noneStr, instname); + goto error; + } + } + + has_absentStr =3D virXMLPropString(node, "has_absent"); + if (has_absentStr) { + if ((def->has_absent =3D virTristateBoolTypeFromString(has_absentS= tr)) <=3D 0) { + virReportError(VIR_ERR_XML_ERROR, + _("Invalid '%s' setting '%s' in '%s'"), + "has_absent", has_absentStr, instname); + goto error; + } + } + + no_defaultStr =3D virXMLPropString(node, "no_default"); + if (no_defaultStr) { + if ((def->no_default =3D virDomainGraphicsTypeFromString(no_defaul= tStr)) < 0) { + virReportError(VIR_ERR_XML_ERROR, + _("Invalid '%s' setting '%s' in '%s'"), + "no_default", no_defaultStr, instname); + goto error; + } + } + +#ifdef ENABLE_VIR_ENUM_FIRST_ITEM_DEF_PARSE_HOOK + if (virEnumFirstItemDefParseHook(node, def, instname, parent, opaque, = has_defStr, has_noneStr, has_absentStr, no_defaultStr) < 0) + goto error; +#endif + + return 0; + + error: + virEnumFirstItemDefClear(def); + return -1; +} + + +[conf/enum-first-item.generated.h] + +int +virEnumFirstItemDefFormatBuf(virBuffer *buf, + const char *name, + const virEnumFirstItemDef *def, + const void *parent, + void *opaque); + + +[conf/enum-first-item.generated.h] + +#ifdef ENABLE_VIR_ENUM_FIRST_ITEM_DEF_FORMAT_HOOK + +int +virEnumFirstItemDefFormatHook(const virEnumFirstItemDef *def, + const void *parent, + const void *opaque, + virTristateBool *empty, + virTristateBool *shortcut, + virBuffer *has_defBuf, + virBuffer *has_noneBuf, + virBuffer *has_absentBuf, + virBuffer *no_defaultBuf); + +#endif /* ENABLE_VIR_ENUM_FIRST_ITEM_DEF_FORMAT_HOOK */ + + +[conf/enum-first-item.generated.c] + +int +virEnumFirstItemDefFormatBuf(virBuffer *buf, + const char *name, + const virEnumFirstItemDef *def, + const void *parent G_GNUC_UNUSED, + void *opaque G_GNUC_UNUSED) +{ + virTristateBool empty G_GNUC_UNUSED =3D VIR_TRISTATE_BOOL_ABSENT; + virTristateBool shortcut G_GNUC_UNUSED =3D VIR_TRISTATE_BOOL_ABSENT; + g_auto(virBuffer) has_defBuf =3D VIR_BUFFER_INITIALIZER; + g_auto(virBuffer) has_noneBuf =3D VIR_BUFFER_INITIALIZER; + g_auto(virBuffer) has_absentBuf =3D VIR_BUFFER_INITIALIZER; + g_auto(virBuffer) no_defaultBuf =3D VIR_BUFFER_INITIALIZER; + + if (!def || !buf) + return 0; + +#ifdef ENABLE_VIR_ENUM_FIRST_ITEM_DEF_FORMAT_HOOK + if (virEnumFirstItemDefFormatHook(def, parent, opaque, &empty, &shortc= ut, &has_defBuf, &has_noneBuf, &has_absentBuf, &no_defaultBuf) < 0) + return -1; +#endif /* ENABLE_VIR_ENUM_FIRST_ITEM_DEF_FORMAT_HOOK */ + + if (empty !=3D VIR_TRISTATE_BOOL_NO) + if (empty || !(def->has_def > 0 || def->has_none > 0 || def->has_a= bsent > 0 || def->no_default >=3D 0)) + return 0; + + virBufferAsprintf(buf, "<%s", name); + + virBufferInheritIndent(&has_defBuf, buf); + if (!virBufferTouched(&has_defBuf) && def->has_def > 0) { + const char *str =3D virNetworkBridgeMACTableManagerTypeToString(de= f->has_def); + if (!str) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unknown %s type %d"), + "has_def", def->has_def); + return -1; + } + virBufferAsprintf(&has_defBuf, " has_def=3D'%s'", str); + } + virBufferAddBuffer(buf, &has_defBuf); + + virBufferInheritIndent(&has_noneBuf, buf); + if (!virBufferTouched(&has_noneBuf) && def->has_none > 0) { + const char *str =3D virNetworkForwardTypeToString(def->has_none); + if (!str) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unknown %s type %d"), + "has_none", def->has_none); + return -1; + } + virBufferAsprintf(&has_noneBuf, " has_none=3D'%s'", str); + } + virBufferAddBuffer(buf, &has_noneBuf); + + virBufferInheritIndent(&has_absentBuf, buf); + if (!virBufferTouched(&has_absentBuf) && def->has_absent > 0) { + const char *str =3D virTristateBoolTypeToString(def->has_absent); + if (!str) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unknown %s type %d"), + "has_absent", def->has_absent); + return -1; + } + virBufferAsprintf(&has_absentBuf, " has_absent=3D'%s'", str); + } + virBufferAddBuffer(buf, &has_absentBuf); + + virBufferInheritIndent(&no_defaultBuf, buf); + if (!virBufferTouched(&no_defaultBuf) && def->no_default >=3D 0) { + const char *str =3D virDomainGraphicsTypeToString(def->no_default); + if (!str) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unknown %s type %d"), + "no_default", def->no_default); + return -1; + } + virBufferAsprintf(&no_defaultBuf, " no_default=3D'%s'", str); + } + virBufferAddBuffer(buf, &no_defaultBuf); + + virBufferAddLit(buf, "/>\n"); + + return 0; +} + + +[conf/enum-first-item.generated.h] + +bool +virEnumFirstItemDefCheck(const virEnumFirstItemDef *def, + const void *parent, + void *opaque); + + +[conf/enum-first-item.generated.c] + +#ifndef RESET_VIR_ENUM_FIRST_ITEM_DEF_CHECK + +bool +virEnumFirstItemDefCheck(const virEnumFirstItemDef *def, + const void *parent G_GNUC_UNUSED, + void *opaque G_GNUC_UNUSED) +{ + if (!def) + return false; + + return def->has_def > 0 || def->has_none > 0 || def->has_absent > 0 ||= def->no_default >=3D 0; +} + +#endif /* RESET_VIR_ENUM_FIRST_ITEM_DEF_CHECK */ + + +[Tips] + +/* Put these lines at the bottom of "conf/enum-first-item.h" */ +/* Makesure "enum-first-item.h" to be appended into conf_xmlgen_input in s= rc/conf/meson.build */ + +/* Define macro to enable hook or redefine check when necessary */ +/* #define ENABLE_VIR_ENUM_FIRST_ITEM_DEF_PARSE_HOOK */ +/* #define ENABLE_VIR_ENUM_FIRST_ITEM_DEF_PARSE_HOOK_SET_ARGS */ +/* #define ENABLE_VIR_ENUM_FIRST_ITEM_DEF_FORMAT_HOOK */ + +/* #define RESET_VIR_ENUM_FIRST_ITEM_DEF_CHECK */ + +/* Makesure below is the bottom line! */ +#include "enum-first-item.generated.h" diff --git a/tests/xmlgenout/external.txt b/tests/xmlgenout/external.txt new file mode 100644 index 00000000..4f0ea691 --- /dev/null +++ b/tests/xmlgenout/external.txt @@ -0,0 +1,205 @@ +[conf/external.generated.h] + +void +virExternalDefClear(virExternalDef *def); + + +[conf/external.generated.c] + +void +virExternalDefClear(virExternalDef *def) +{ + if (!def) + return; + + xmlNodeClear(&def->metadata); +} + + +[conf/external.generated.h] + +int +virExternalDefParseXML(xmlNodePtr node, + virExternalDef *def, + const char *instname, + void *parent, + void *opaque); + + +[conf/external.generated.h] + +#ifdef ENABLE_VIR_EXTERNAL_DEF_PARSE_HOOK + +int +virExternalDefParseHook(xmlNodePtr node, + virExternalDef *def, + const char *instname, + void *parent, + void *opaque, + xmlNodePtr metadataNode); + +#endif + + +[conf/external.generated.h] + +#ifdef ENABLE_VIR_EXTERNAL_DEF_PARSE_HOOK_SET_ARGS + +void +virExternalDefParseXMLSetArgs(xmlNodePtr node, + void *parent, + void **pparent, + void **popaque); + +#endif + + +[conf/external.generated.c] + +int +virExternalDefParseXML(xmlNodePtr node, + virExternalDef *def, + const char *instname G_GNUC_UNUSED, + void *parent G_GNUC_UNUSED, + void *opaque G_GNUC_UNUSED) +{ + xmlNodePtr metadataNode =3D NULL; + void *arg_parent G_GNUC_UNUSED =3D def; + void *arg_opaque G_GNUC_UNUSED =3D opaque; + + if (!def) + goto error; + +#ifdef ENABLE_VIR_EXTERNAL_DEF_PARSE_HOOK_SET_ARGS + virExternalDefParseXMLSetArgs(node, parent, &arg_parent, &arg_opaque); +#endif + + metadataNode =3D virXMLChildNode(node, "metadata"); + if (metadataNode) { + if (xmlNodeParseXML(metadataNode, &def->metadata, instname, arg_pa= rent, arg_opaque) < 0) + goto error; + } + +#ifdef ENABLE_VIR_EXTERNAL_DEF_PARSE_HOOK + if (virExternalDefParseHook(node, def, instname, parent, opaque, metad= ataNode) < 0) + goto error; +#endif + + return 0; + + error: + virExternalDefClear(def); + return -1; +} + + +[conf/external.generated.h] + +int +virExternalDefFormatBuf(virBuffer *buf, + const char *name, + const virExternalDef *def, + const void *parent, + void *opaque); + + +[conf/external.generated.h] + +#ifdef ENABLE_VIR_EXTERNAL_DEF_FORMAT_HOOK + +int +virExternalDefFormatHook(const virExternalDef *def, + const void *parent, + const void *opaque, + virTristateBool *empty, + virTristateBool *shortcut, + virBuffer *metadataBuf); + +#endif /* ENABLE_VIR_EXTERNAL_DEF_FORMAT_HOOK */ + + +[conf/external.generated.c] + +int +virExternalDefFormatBuf(virBuffer *buf, + const char *name, + const virExternalDef *def, + const void *parent G_GNUC_UNUSED, + void *opaque G_GNUC_UNUSED) +{ + virTristateBool empty G_GNUC_UNUSED =3D VIR_TRISTATE_BOOL_ABSENT; + virTristateBool shortcut G_GNUC_UNUSED =3D VIR_TRISTATE_BOOL_ABSENT; + g_auto(virBuffer) metadataBuf =3D VIR_BUFFER_INITIALIZER; + + if (!def || !buf) + return 0; + +#ifdef ENABLE_VIR_EXTERNAL_DEF_FORMAT_HOOK + if (virExternalDefFormatHook(def, parent, opaque, &empty, &shortcut, &= metadataBuf) < 0) + return -1; +#endif /* ENABLE_VIR_EXTERNAL_DEF_FORMAT_HOOK */ + + if (empty !=3D VIR_TRISTATE_BOOL_NO) + if (empty || !(xmlNodeCheck(&def->metadata, def, opaque))) + return 0; + + virBufferAsprintf(buf, "<%s", name); + + virBufferAddLit(buf, ">\n"); + + virBufferAdjustIndent(buf, 2); + + virBufferInheritIndent(&metadataBuf, buf); + if (!virBufferTouched(&metadataBuf) && xmlNodeCheck(&def->metadata, de= f, opaque)) { + if (xmlNodeFormatBuf(&metadataBuf, "metadata", &def->metadata, def= , opaque) < 0) + return -1; + } + virBufferAddBuffer(buf, &metadataBuf); + + virBufferAdjustIndent(buf, -2); + virBufferAsprintf(buf, "\n", name); + + return 0; +} + + +[conf/external.generated.h] + +bool +virExternalDefCheck(const virExternalDef *def, + const void *parent, + void *opaque); + + +[conf/external.generated.c] + +#ifndef RESET_VIR_EXTERNAL_DEF_CHECK + +bool +virExternalDefCheck(const virExternalDef *def, + const void *parent G_GNUC_UNUSED, + void *opaque G_GNUC_UNUSED) +{ + if (!def) + return false; + + return xmlNodeCheck(&def->metadata, def, opaque); +} + +#endif /* RESET_VIR_EXTERNAL_DEF_CHECK */ + + +[Tips] + +/* Put these lines at the bottom of "conf/external.h" */ +/* Makesure "external.h" to be appended into conf_xmlgen_input in src/conf= /meson.build */ + +/* Define macro to enable hook or redefine check when necessary */ +/* #define ENABLE_VIR_EXTERNAL_DEF_PARSE_HOOK */ +/* #define ENABLE_VIR_EXTERNAL_DEF_PARSE_HOOK_SET_ARGS */ +/* #define ENABLE_VIR_EXTERNAL_DEF_FORMAT_HOOK */ + +/* #define RESET_VIR_EXTERNAL_DEF_CHECK */ + +/* Makesure below is the bottom line! */ +#include "external.generated.h" diff --git a/tests/xmlgenout/genformat-separate.txt b/tests/xmlgenout/genfo= rmat-separate.txt new file mode 100644 index 00000000..90729d2a --- /dev/null +++ b/tests/xmlgenout/genformat-separate.txt @@ -0,0 +1,190 @@ +[conf/genformat-separate.generated.h] + +#ifdef ENABLE_VIR_SEPARATE_DEF_FORMAT_ATTR_HOOK + +int +virSeparateDefFormatAttrHook(const virSeparateDef *def, + const void *parent, + const void *opaque, + virBuffer *enableBuf); + +#endif /* ENABLE_VIR_SEPARATE_DEF_FORMAT_ATTR_HOOK */ + + +[conf/genformat-separate.generated.h] + +int +virSeparateDefFormatAttr(virBuffer *buf, + const virSeparateDef *def, + const void *parent, + void *opaque); + + +[conf/genformat-separate.generated.c] + +int +virSeparateDefFormatAttr(virBuffer *buf, + const virSeparateDef *def, + const void *parent G_GNUC_UNUSED, + void *opaque G_GNUC_UNUSED) +{ + virTristateBool empty G_GNUC_UNUSED =3D VIR_TRISTATE_BOOL_ABSENT; + virTristateBool shortcut G_GNUC_UNUSED =3D VIR_TRISTATE_BOOL_ABSENT; + g_auto(virBuffer) enableBuf =3D VIR_BUFFER_INITIALIZER; + + if (!def || !buf) + return 0; + +#ifdef ENABLE_VIR_SEPARATE_DEF_FORMAT_ATTR_HOOK + if (virSeparateDefFormatAttrHook(def, parent, opaque, &enableBuf) < 0) + return -1; +#endif /* ENABLE_VIR_SEPARATE_DEF_FORMAT_ATTR_HOOK */ + + virBufferInheritIndent(&enableBuf, buf); + if (!virBufferTouched(&enableBuf) && def->enable > 0) { + const char *str =3D virTristateBoolTypeToString(def->enable); + if (!str) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unknown %s type %d"), + "enable", def->enable); + return -1; + } + virBufferAsprintf(&enableBuf, " enable=3D'%s'", str); + } + virBufferAddBuffer(buf, &enableBuf); + + return 0; +} + + +[conf/genformat-separate.generated.h] + +bool +virSeparateDefCheckAttr(const virSeparateDef *def, + const void *parent, + void *opaque); + + +[conf/genformat-separate.generated.c] + +#ifndef RESET_VIR_SEPARATE_DEF_CHECK_ATTR + +bool +virSeparateDefCheckAttr(const virSeparateDef *def, + const void *parent G_GNUC_UNUSED, + void *opaque G_GNUC_UNUSED) +{ + if (!def) + return false; + + return def->enable > 0; +} + +#endif /* RESET_VIR_SEPARATE_DEF_CHECK_ATTR */ + + +[conf/genformat-separate.generated.h] + +#ifdef ENABLE_VIR_SEPARATE_DEF_FORMAT_ELEM_HOOK + +int +virSeparateDefFormatElemHook(const virSeparateDef *def, + const void *parent, + const void *opaque, + virBuffer *ipBuf, + virBuffer *txtsBuf); + +#endif /* ENABLE_VIR_SEPARATE_DEF_FORMAT_ELEM_HOOK */ + + +[conf/genformat-separate.generated.h] + +int +virSeparateDefFormatElem(virBuffer *buf, + const virSeparateDef *def, + const void *parent, + void *opaque); + + +[conf/genformat-separate.generated.c] + +int +virSeparateDefFormatElem(virBuffer *buf, + const virSeparateDef *def, + const void *parent G_GNUC_UNUSED, + void *opaque G_GNUC_UNUSED) +{ + virTristateBool empty G_GNUC_UNUSED =3D VIR_TRISTATE_BOOL_ABSENT; + virTristateBool shortcut G_GNUC_UNUSED =3D VIR_TRISTATE_BOOL_ABSENT; + g_auto(virBuffer) ipBuf =3D VIR_BUFFER_INITIALIZER; + g_auto(virBuffer) txtsBuf =3D VIR_BUFFER_INITIALIZER; + + if (!def || !buf) + return 0; + +#ifdef ENABLE_VIR_SEPARATE_DEF_FORMAT_ELEM_HOOK + if (virSeparateDefFormatElemHook(def, parent, opaque, &ipBuf, &txtsBuf= ) < 0) + return -1; +#endif /* ENABLE_VIR_SEPARATE_DEF_FORMAT_ELEM_HOOK */ + + virBufferInheritIndent(&ipBuf, buf); + if (!virBufferTouched(&ipBuf) && virSocketAddrCheck(&def->ip, def, opa= que)) { + if (virSocketAddrFormatBuf(&ipBuf, "ip", &def->ip, def, opaque) < = 0) + return -1; + } + virBufferAddBuffer(buf, &ipBuf); + + virBufferInheritIndent(&txtsBuf, buf); + if (!virBufferTouched(&txtsBuf) && def->ntxts) { + size_t i; + for (i =3D 0; i < def->ntxts; i++) { + if (virNetworkDNSTxtDefFormatBuf(buf, "txt", &def->txts[i], de= f, opaque) < 0) + return -1; + } + } + virBufferAddBuffer(buf, &txtsBuf); + + return 0; +} + + +[conf/genformat-separate.generated.h] + +bool +virSeparateDefCheckElem(const virSeparateDef *def, + const void *parent, + void *opaque); + + +[conf/genformat-separate.generated.c] + +#ifndef RESET_VIR_SEPARATE_DEF_CHECK_ELEM + +bool +virSeparateDefCheckElem(const virSeparateDef *def, + const void *parent G_GNUC_UNUSED, + void *opaque G_GNUC_UNUSED) +{ + if (!def) + return false; + + return virSocketAddrCheck(&def->ip, def, opaque) || def->ntxts; +} + +#endif /* RESET_VIR_SEPARATE_DEF_CHECK_ELEM */ + + +[Tips] + +/* Put these lines at the bottom of "conf/genformat-separate.h" */ +/* Makesure "genformat-separate.h" to be appended into conf_xmlgen_input i= n src/conf/meson.build */ + +/* Define macro to enable hook or redefine check when necessary */ +/* #define ENABLE_VIR_SEPARATE_DEF_FORMAT_ATTR_HOOK */ +/* #define ENABLE_VIR_SEPARATE_DEF_FORMAT_ELEM_HOOK */ + +/* #define RESET_VIR_SEPARATE_DEF_CHECK_ATTR */ +/* #define RESET_VIR_SEPARATE_DEF_CHECK_ELEM */ + +/* Makesure below is the bottom line! */ +#include "genformat-separate.generated.h" diff --git a/tests/xmlgenout/genformat.txt b/tests/xmlgenout/genformat.txt new file mode 100644 index 00000000..72e4e0c0 --- /dev/null +++ b/tests/xmlgenout/genformat.txt @@ -0,0 +1,142 @@ +[conf/genformat.generated.h] + +int +virGenFormatDefFormatBuf(virBuffer *buf, + const char *name, + const virGenFormatDef *def, + const void *parent, + void *opaque); + + +[conf/genformat.generated.h] + +#ifdef ENABLE_VIR_GEN_FORMAT_DEF_FORMAT_HOOK + +int +virGenFormatDefFormatHook(const virGenFormatDef *def, + const void *parent, + const void *opaque, + virTristateBool *empty, + virTristateBool *shortcut, + virBuffer *enableBuf, + virBuffer *ipBuf, + virBuffer *txtsBuf); + +#endif /* ENABLE_VIR_GEN_FORMAT_DEF_FORMAT_HOOK */ + + +[conf/genformat.generated.c] + +int +virGenFormatDefFormatBuf(virBuffer *buf, + const char *name, + const virGenFormatDef *def, + const void *parent G_GNUC_UNUSED, + void *opaque G_GNUC_UNUSED) +{ + virTristateBool empty G_GNUC_UNUSED =3D VIR_TRISTATE_BOOL_ABSENT; + virTristateBool shortcut G_GNUC_UNUSED =3D VIR_TRISTATE_BOOL_ABSENT; + g_auto(virBuffer) enableBuf =3D VIR_BUFFER_INITIALIZER; + g_auto(virBuffer) ipBuf =3D VIR_BUFFER_INITIALIZER; + g_auto(virBuffer) txtsBuf =3D VIR_BUFFER_INITIALIZER; + + if (!def || !buf) + return 0; + +#ifdef ENABLE_VIR_GEN_FORMAT_DEF_FORMAT_HOOK + if (virGenFormatDefFormatHook(def, parent, opaque, &empty, &shortcut, = &enableBuf, &ipBuf, &txtsBuf) < 0) + return -1; +#endif /* ENABLE_VIR_GEN_FORMAT_DEF_FORMAT_HOOK */ + + if (empty !=3D VIR_TRISTATE_BOOL_NO) + if (empty || !(def->enable > 0 || virSocketAddrCheck(&def->ip, def= , opaque) || def->ntxts)) + return 0; + + virBufferAsprintf(buf, "<%s", name); + + virBufferInheritIndent(&enableBuf, buf); + if (!virBufferTouched(&enableBuf) && def->enable > 0) { + const char *str =3D virTristateBoolTypeToString(def->enable); + if (!str) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unknown %s type %d"), + "enable", def->enable); + return -1; + } + virBufferAsprintf(&enableBuf, " enable=3D'%s'", str); + } + virBufferAddBuffer(buf, &enableBuf); + + if (shortcut !=3D VIR_TRISTATE_BOOL_NO) { + if (shortcut || !(virSocketAddrCheck(&def->ip, def, opaque) || def= ->ntxts)) { + virBufferAddLit(buf, "/>\n"); + return 0; + } + } + + virBufferAddLit(buf, ">\n"); + + virBufferAdjustIndent(buf, 2); + + virBufferInheritIndent(&ipBuf, buf); + if (!virBufferTouched(&ipBuf) && virSocketAddrCheck(&def->ip, def, opa= que)) { + if (virSocketAddrFormatBuf(&ipBuf, "ip", &def->ip, def, opaque) < = 0) + return -1; + } + virBufferAddBuffer(buf, &ipBuf); + + virBufferInheritIndent(&txtsBuf, buf); + if (!virBufferTouched(&txtsBuf) && def->ntxts) { + size_t i; + for (i =3D 0; i < def->ntxts; i++) { + if (virNetworkDNSTxtDefFormatBuf(buf, "txt", &def->txts[i], de= f, opaque) < 0) + return -1; + } + } + virBufferAddBuffer(buf, &txtsBuf); + + virBufferAdjustIndent(buf, -2); + virBufferAsprintf(buf, "\n", name); + + return 0; +} + + +[conf/genformat.generated.h] + +bool +virGenFormatDefCheck(const virGenFormatDef *def, + const void *parent, + void *opaque); + + +[conf/genformat.generated.c] + +#ifndef RESET_VIR_GEN_FORMAT_DEF_CHECK + +bool +virGenFormatDefCheck(const virGenFormatDef *def, + const void *parent G_GNUC_UNUSED, + void *opaque G_GNUC_UNUSED) +{ + if (!def) + return false; + + return def->enable > 0 || virSocketAddrCheck(&def->ip, def, opaque) ||= def->ntxts; +} + +#endif /* RESET_VIR_GEN_FORMAT_DEF_CHECK */ + + +[Tips] + +/* Put these lines at the bottom of "conf/genformat.h" */ +/* Makesure "genformat.h" to be appended into conf_xmlgen_input in src/con= f/meson.build */ + +/* Define macro to enable hook or redefine check when necessary */ +/* #define ENABLE_VIR_GEN_FORMAT_DEF_FORMAT_HOOK */ + +/* #define RESET_VIR_GEN_FORMAT_DEF_CHECK */ + +/* Makesure below is the bottom line! */ +#include "genformat.generated.h" diff --git a/tests/xmlgenout/genparse.txt b/tests/xmlgenout/genparse.txt new file mode 100644 index 00000000..e24762e1 --- /dev/null +++ b/tests/xmlgenout/genparse.txt @@ -0,0 +1,154 @@ +[conf/genparse.generated.h] + +void +virGenParseDefClear(virGenParseDef *def); + + +[conf/genparse.generated.c] + +void +virGenParseDefClear(virGenParseDef *def) +{ + if (!def) + return; + + def->enable =3D 0; + + virSocketAddrClear(&def->ip); + + if (def->ntxts) { + size_t i; + for (i =3D 0; i < def->ntxts; i++) + virNetworkDNSTxtDefClear(&def->txts[i]); + } + g_free(def->txts); + def->txts =3D NULL; + def->ntxts =3D 0; +} + + +[conf/genparse.generated.h] + +int +virGenParseDefParseXML(xmlNodePtr node, + virGenParseDef *def, + const char *instname, + void *parent, + void *opaque); + + +[conf/genparse.generated.h] + +#ifdef ENABLE_VIR_GEN_PARSE_DEF_PARSE_HOOK + +int +virGenParseDefParseHook(xmlNodePtr node, + virGenParseDef *def, + const char *instname, + void *parent, + void *opaque, + const char *enableStr, + xmlNodePtr ipNode, + int nTxtNodes); + +#endif + + +[conf/genparse.generated.h] + +#ifdef ENABLE_VIR_GEN_PARSE_DEF_PARSE_HOOK_SET_ARGS + +void +virGenParseDefParseXMLSetArgs(xmlNodePtr node, + void *parent, + void **pparent, + void **popaque); + +#endif + + +[conf/genparse.generated.c] + +int +virGenParseDefParseXML(xmlNodePtr node, + virGenParseDef *def, + const char *instname G_GNUC_UNUSED, + void *parent G_GNUC_UNUSED, + void *opaque G_GNUC_UNUSED) +{ + g_autofree char *enableStr =3D NULL; + xmlNodePtr ipNode =3D NULL; + int nTxtNodes =3D 0; + xmlNodePtr *nodes =3D NULL; + void *arg_parent G_GNUC_UNUSED =3D def; + void *arg_opaque G_GNUC_UNUSED =3D opaque; + + if (!def) + goto error; + +#ifdef ENABLE_VIR_GEN_PARSE_DEF_PARSE_HOOK_SET_ARGS + virGenParseDefParseXMLSetArgs(node, parent, &arg_parent, &arg_opaque); +#endif + + enableStr =3D virXMLPropString(node, "enable"); + if (enableStr) { + if ((def->enable =3D virTristateBoolTypeFromString(enableStr)) <= =3D 0) { + virReportError(VIR_ERR_XML_ERROR, + _("Invalid '%s' setting '%s' in '%s'"), + "enable", enableStr, instname); + goto error; + } + } + + ipNode =3D virXMLChildNode(node, "ip"); + if (ipNode) { + if (virSocketAddrParseXML(ipNode, &def->ip, instname, arg_parent, = arg_opaque) < 0) + goto error; + } + + nTxtNodes =3D virXMLChildNodeSet(node, "txt", &nodes); + if (nTxtNodes > 0) { + size_t i; + + def->txts =3D g_new0(typeof(*def->txts), nTxtNodes); + for (i =3D 0; i < nTxtNodes; i++) { + xmlNodePtr tnode =3D nodes[i]; + if (virNetworkDNSTxtDefParseXML(tnode, &def->txts[i], instname= , arg_parent, arg_opaque) < 0) + goto error; + } + def->ntxts =3D nTxtNodes; + g_free(nodes); + nodes =3D NULL; + } else if (nTxtNodes < 0) { + virReportError(VIR_ERR_XML_ERROR, + _("Invalid %s element found."), + "txt"); + goto error; + } + +#ifdef ENABLE_VIR_GEN_PARSE_DEF_PARSE_HOOK + if (virGenParseDefParseHook(node, def, instname, parent, opaque, enabl= eStr, ipNode, nTxtNodes) < 0) + goto error; +#endif + + return 0; + + error: + g_free(nodes); + nodes =3D NULL; + virGenParseDefClear(def); + return -1; +} + + +[Tips] + +/* Put these lines at the bottom of "conf/genparse.h" */ +/* Makesure "genparse.h" to be appended into conf_xmlgen_input in src/conf= /meson.build */ + +/* Define macro to enable hook or redefine check when necessary */ +/* #define ENABLE_VIR_GEN_PARSE_DEF_PARSE_HOOK */ +/* #define ENABLE_VIR_GEN_PARSE_DEF_PARSE_HOOK_SET_ARGS */ + +/* Makesure below is the bottom line! */ +#include "genparse.generated.h" diff --git a/tests/xmlgenout/namespace.txt b/tests/xmlgenout/namespace.txt new file mode 100644 index 00000000..df1660dd --- /dev/null +++ b/tests/xmlgenout/namespace.txt @@ -0,0 +1,222 @@ +[conf/namespace.generated.h] + +void +virNameSpaceDefClear(virNameSpaceDef *def); + + +[conf/namespace.generated.c] + +void +virNameSpaceDefClear(virNameSpaceDef *def) +{ + if (!def) + return; + + g_free(def->name); + def->name =3D NULL; + + if (def->namespaceData && def->ns.free) + (def->ns.free)(def->namespaceData); +} + + +[conf/namespace.generated.h] + +int +virNameSpaceDefParseXML(xmlNodePtr node, + virNameSpaceDef *def, + const char *instname, + void *parent, + void *opaque, + xmlXPathContextPtr ctxt, + virNetworkXMLOption *xmlopt); + + +[conf/namespace.generated.h] + +#ifdef ENABLE_VIR_NAME_SPACE_DEF_PARSE_HOOK + +int +virNameSpaceDefParseHook(xmlNodePtr node, + virNameSpaceDef *def, + const char *instname, + void *parent, + void *opaque, + xmlXPathContextPtr ctxt, + virNetworkXMLOption *xmlopt); + +#endif + + +[conf/namespace.generated.h] + +#ifdef ENABLE_VIR_NAME_SPACE_DEF_PARSE_HOOK_SET_ARGS + +void +virNameSpaceDefParseXMLSetArgs(xmlNodePtr node, + void *parent, + void **pparent, + void **popaque); + +#endif + + +[conf/namespace.generated.c] + +int +virNameSpaceDefParseXML(xmlNodePtr node, + virNameSpaceDef *def, + const char *instname G_GNUC_UNUSED, + void *parent G_GNUC_UNUSED, + void *opaque G_GNUC_UNUSED, + xmlXPathContextPtr ctxt, + virNetworkXMLOption *xmlopt) +{ + void *arg_parent G_GNUC_UNUSED =3D def; + void *arg_opaque G_GNUC_UNUSED =3D opaque; + + if (!def) + goto error; + +#ifdef ENABLE_VIR_NAME_SPACE_DEF_PARSE_HOOK_SET_ARGS + virNameSpaceDefParseXMLSetArgs(node, parent, &arg_parent, &arg_opaque); +#endif + + def->name =3D virXMLChildNodeContent(node, "name"); + +#ifdef ENABLE_VIR_NAME_SPACE_DEF_PARSE_HOOK + if (virNameSpaceDefParseHook(node, def, instname, parent, opaque, ctxt= , xmlopt) < 0) + goto error; +#endif + + if (xmlopt) + def->ns =3D xmlopt->ns; + if (def->ns.parse) { + if (virXMLNamespaceRegister(ctxt, &def->ns) < 0) + goto error; + if ((def->ns.parse)(ctxt, &def->namespaceData) < 0) + goto error; + } + return 0; + + error: + virNameSpaceDefClear(def); + return -1; +} + + +[conf/namespace.generated.h] + +int +virNameSpaceDefFormatBuf(virBuffer *buf, + const char *name, + const virNameSpaceDef *def, + const void *parent, + void *opaque); + + +[conf/namespace.generated.h] + +#ifdef ENABLE_VIR_NAME_SPACE_DEF_FORMAT_HOOK + +int +virNameSpaceDefFormatHook(const virNameSpaceDef *def, + const void *parent, + const void *opaque, + virTristateBool *empty, + virTristateBool *shortcut, + virBuffer *nameBuf); + +#endif /* ENABLE_VIR_NAME_SPACE_DEF_FORMAT_HOOK */ + + +[conf/namespace.generated.c] + +int +virNameSpaceDefFormatBuf(virBuffer *buf, + const char *name, + const virNameSpaceDef *def, + const void *parent G_GNUC_UNUSED, + void *opaque G_GNUC_UNUSED) +{ + virTristateBool empty G_GNUC_UNUSED =3D VIR_TRISTATE_BOOL_ABSENT; + virTristateBool shortcut G_GNUC_UNUSED =3D VIR_TRISTATE_BOOL_ABSENT; + g_auto(virBuffer) nameBuf =3D VIR_BUFFER_INITIALIZER; + + if (!def || !buf) + return 0; + +#ifdef ENABLE_VIR_NAME_SPACE_DEF_FORMAT_HOOK + if (virNameSpaceDefFormatHook(def, parent, opaque, &empty, &shortcut, = &nameBuf) < 0) + return -1; +#endif /* ENABLE_VIR_NAME_SPACE_DEF_FORMAT_HOOK */ + + if (empty !=3D VIR_TRISTATE_BOOL_NO) + if (empty || !(def->name)) + return 0; + + virBufferAsprintf(buf, "<%s", name); + + if (def->namespaceData && def->ns.format) + virXMLNamespaceFormatNS(buf, &def->ns); + virBufferAddLit(buf, ">\n"); + + virBufferAdjustIndent(buf, 2); + + virBufferInheritIndent(&nameBuf, buf); + if (!virBufferTouched(&nameBuf) && def->name) + virBufferEscapeString(&nameBuf, "%s\n", def->name); + virBufferAddBuffer(buf, &nameBuf); + + if (def->namespaceData && def->ns.format) { + if ((def->ns.format)(buf, def->namespaceData) < 0) + return -1; + } + + virBufferAdjustIndent(buf, -2); + virBufferAsprintf(buf, "\n", name); + + return 0; +} + + +[conf/namespace.generated.h] + +bool +virNameSpaceDefCheck(const virNameSpaceDef *def, + const void *parent, + void *opaque); + + +[conf/namespace.generated.c] + +#ifndef RESET_VIR_NAME_SPACE_DEF_CHECK + +bool +virNameSpaceDefCheck(const virNameSpaceDef *def, + const void *parent G_GNUC_UNUSED, + void *opaque G_GNUC_UNUSED) +{ + if (!def) + return false; + + return def->name; +} + +#endif /* RESET_VIR_NAME_SPACE_DEF_CHECK */ + + +[Tips] + +/* Put these lines at the bottom of "conf/namespace.h" */ +/* Makesure "namespace.h" to be appended into conf_xmlgen_input in src/con= f/meson.build */ + +/* Define macro to enable hook or redefine check when necessary */ +/* #define ENABLE_VIR_NAME_SPACE_DEF_PARSE_HOOK */ +/* #define ENABLE_VIR_NAME_SPACE_DEF_PARSE_HOOK_SET_ARGS */ +/* #define ENABLE_VIR_NAME_SPACE_DEF_FORMAT_HOOK */ + +/* #define RESET_VIR_NAME_SPACE_DEF_CHECK */ + +/* Makesure below is the bottom line! */ +#include "namespace.generated.h" diff --git a/tests/xmlgenout/required.txt b/tests/xmlgenout/required.txt new file mode 100644 index 00000000..df509284 --- /dev/null +++ b/tests/xmlgenout/required.txt @@ -0,0 +1,236 @@ +[conf/required.generated.h] + +void +virRequiredDefClear(virRequiredDef *def); + + +[conf/required.generated.c] + +void +virRequiredDefClear(virRequiredDef *def) +{ + if (!def) + return; + + g_free(def->name); + def->name =3D NULL; + + virNetworkBootpDefClear(&def->bootp); +} + + +[conf/required.generated.h] + +int +virRequiredDefParseXML(xmlNodePtr node, + virRequiredDef *def, + const char *instname, + void *parent, + void *opaque); + + +[conf/required.generated.h] + +#ifdef ENABLE_VIR_REQUIRED_DEF_PARSE_HOOK + +int +virRequiredDefParseHook(xmlNodePtr node, + virRequiredDef *def, + const char *instname, + void *parent, + void *opaque, + xmlNodePtr bootpNode); + +#endif + + +[conf/required.generated.h] + +#ifdef ENABLE_VIR_REQUIRED_DEF_PARSE_HOOK_SET_ARGS + +void +virRequiredDefParseXMLSetArgs(xmlNodePtr node, + void *parent, + void **pparent, + void **popaque); + +#endif + + +[conf/required.generated.c] + +int +virRequiredDefParseXML(xmlNodePtr node, + virRequiredDef *def, + const char *instname G_GNUC_UNUSED, + void *parent G_GNUC_UNUSED, + void *opaque G_GNUC_UNUSED) +{ + xmlNodePtr bootpNode =3D NULL; + void *arg_parent G_GNUC_UNUSED =3D def; + void *arg_opaque G_GNUC_UNUSED =3D opaque; + + if (!def) + goto error; + +#ifdef ENABLE_VIR_REQUIRED_DEF_PARSE_HOOK_SET_ARGS + virRequiredDefParseXMLSetArgs(node, parent, &arg_parent, &arg_opaque); +#endif + + def->name =3D virXMLPropString(node, "name"); + if (def->name =3D=3D NULL) { + virReportError(VIR_ERR_XML_ERROR, + _("Missing '%s' setting in '%s'"), + "name", instname); + goto error; + } + + bootpNode =3D virXMLChildNode(node, "bootp"); + if (bootpNode =3D=3D NULL) { + virReportError(VIR_ERR_XML_ERROR, + _("Missing '%s' setting in '%s'"), + "bootp", instname); + goto error; + } + if (bootpNode) { + if (virNetworkBootpDefParseXML(bootpNode, &def->bootp, instname, a= rg_parent, arg_opaque) < 0) + goto error; + } + +#ifdef ENABLE_VIR_REQUIRED_DEF_PARSE_HOOK + if (virRequiredDefParseHook(node, def, instname, parent, opaque, bootp= Node) < 0) + goto error; +#endif + + return 0; + + error: + virRequiredDefClear(def); + return -1; +} + + +[conf/required.generated.h] + +int +virRequiredDefFormatBuf(virBuffer *buf, + const char *name, + const virRequiredDef *def, + const void *parent, + void *opaque); + + +[conf/required.generated.h] + +#ifdef ENABLE_VIR_REQUIRED_DEF_FORMAT_HOOK + +int +virRequiredDefFormatHook(const virRequiredDef *def, + const void *parent, + const void *opaque, + virTristateBool *empty, + virTristateBool *shortcut, + virBuffer *nameBuf, + virBuffer *bootpBuf); + +#endif /* ENABLE_VIR_REQUIRED_DEF_FORMAT_HOOK */ + + +[conf/required.generated.c] + +int +virRequiredDefFormatBuf(virBuffer *buf, + const char *name, + const virRequiredDef *def, + const void *parent G_GNUC_UNUSED, + void *opaque G_GNUC_UNUSED) +{ + virTristateBool empty G_GNUC_UNUSED =3D VIR_TRISTATE_BOOL_ABSENT; + virTristateBool shortcut G_GNUC_UNUSED =3D VIR_TRISTATE_BOOL_ABSENT; + g_auto(virBuffer) nameBuf =3D VIR_BUFFER_INITIALIZER; + g_auto(virBuffer) bootpBuf =3D VIR_BUFFER_INITIALIZER; + + if (!def || !buf) + return 0; + +#ifdef ENABLE_VIR_REQUIRED_DEF_FORMAT_HOOK + if (virRequiredDefFormatHook(def, parent, opaque, &empty, &shortcut, &= nameBuf, &bootpBuf) < 0) + return -1; +#endif /* ENABLE_VIR_REQUIRED_DEF_FORMAT_HOOK */ + + if (empty !=3D VIR_TRISTATE_BOOL_NO) + if (empty || !(def->name || virNetworkBootpDefCheck(&def->bootp, d= ef, opaque))) + return 0; + + virBufferAsprintf(buf, "<%s", name); + + virBufferInheritIndent(&nameBuf, buf); + if (!virBufferTouched(&nameBuf)) + virBufferEscapeString(&nameBuf, " name=3D'%s'", def->name); + virBufferAddBuffer(buf, &nameBuf); + + if (shortcut !=3D VIR_TRISTATE_BOOL_NO) { + if (shortcut || !(virNetworkBootpDefCheck(&def->bootp, def, opaque= ))) { + virBufferAddLit(buf, "/>\n"); + return 0; + } + } + + virBufferAddLit(buf, ">\n"); + + virBufferAdjustIndent(buf, 2); + + virBufferInheritIndent(&bootpBuf, buf); + if (!virBufferTouched(&bootpBuf)) { + if (virNetworkBootpDefFormatBuf(&bootpBuf, "bootp", &def->bootp, d= ef, opaque) < 0) + return -1; + } + virBufferAddBuffer(buf, &bootpBuf); + + virBufferAdjustIndent(buf, -2); + virBufferAsprintf(buf, "\n", name); + + return 0; +} + + +[conf/required.generated.h] + +bool +virRequiredDefCheck(const virRequiredDef *def, + const void *parent, + void *opaque); + + +[conf/required.generated.c] + +#ifndef RESET_VIR_REQUIRED_DEF_CHECK + +bool +virRequiredDefCheck(const virRequiredDef *def, + const void *parent G_GNUC_UNUSED, + void *opaque G_GNUC_UNUSED) +{ + if (!def) + return false; + + return def->name || virNetworkBootpDefCheck(&def->bootp, def, opaque); +} + +#endif /* RESET_VIR_REQUIRED_DEF_CHECK */ + + +[Tips] + +/* Put these lines at the bottom of "conf/required.h" */ +/* Makesure "required.h" to be appended into conf_xmlgen_input in src/conf= /meson.build */ + +/* Define macro to enable hook or redefine check when necessary */ +/* #define ENABLE_VIR_REQUIRED_DEF_PARSE_HOOK */ +/* #define ENABLE_VIR_REQUIRED_DEF_PARSE_HOOK_SET_ARGS */ +/* #define ENABLE_VIR_REQUIRED_DEF_FORMAT_HOOK */ + +/* #define RESET_VIR_REQUIRED_DEF_CHECK */ + +/* Makesure below is the bottom line! */ +#include "required.generated.h" diff --git a/tests/xmlgenout/skipparse.txt b/tests/xmlgenout/skipparse.txt new file mode 100644 index 00000000..b6f6546a --- /dev/null +++ b/tests/xmlgenout/skipparse.txt @@ -0,0 +1,223 @@ +[conf/skipparse.generated.h] + +void +virSkipParseDefClear(virSkipParseDef *def); + + +[conf/skipparse.generated.c] + +void +virSkipParseDefClear(virSkipParseDef *def) +{ + if (!def) + return; + + def->connections =3D 0; + + if (def->nifs) { + size_t i; + for (i =3D 0; i < def->nifs; i++) + virNetworkForwardIfDefClear(&def->ifs[i]); + } + g_free(def->ifs); + def->ifs =3D NULL; + def->nifs =3D 0; +} + + +[conf/skipparse.generated.h] + +int +virSkipParseDefParseXML(xmlNodePtr node, + virSkipParseDef *def, + const char *instname, + void *parent, + void *opaque); + + +[conf/skipparse.generated.h] + +#ifdef ENABLE_VIR_SKIP_PARSE_DEF_PARSE_HOOK + +int +virSkipParseDefParseHook(xmlNodePtr node, + virSkipParseDef *def, + const char *instname, + void *parent, + void *opaque); + +#endif + + +[conf/skipparse.generated.h] + +#ifdef ENABLE_VIR_SKIP_PARSE_DEF_PARSE_HOOK_SET_ARGS + +void +virSkipParseDefParseXMLSetArgs(xmlNodePtr node, + void *parent, + void **pparent, + void **popaque); + +#endif + + +[conf/skipparse.generated.c] + +int +virSkipParseDefParseXML(xmlNodePtr node, + virSkipParseDef *def, + const char *instname G_GNUC_UNUSED, + void *parent G_GNUC_UNUSED, + void *opaque G_GNUC_UNUSED) +{ + void *arg_parent G_GNUC_UNUSED =3D def; + void *arg_opaque G_GNUC_UNUSED =3D opaque; + + if (!def) + goto error; + +#ifdef ENABLE_VIR_SKIP_PARSE_DEF_PARSE_HOOK_SET_ARGS + virSkipParseDefParseXMLSetArgs(node, parent, &arg_parent, &arg_opaque); +#endif + +#ifdef ENABLE_VIR_SKIP_PARSE_DEF_PARSE_HOOK + if (virSkipParseDefParseHook(node, def, instname, parent, opaque) < 0) + goto error; +#endif + + return 0; + + error: + virSkipParseDefClear(def); + return -1; +} + + +[conf/skipparse.generated.h] + +int +virSkipParseDefFormatBuf(virBuffer *buf, + const char *name, + const virSkipParseDef *def, + const void *parent, + void *opaque); + + +[conf/skipparse.generated.h] + +#ifdef ENABLE_VIR_SKIP_PARSE_DEF_FORMAT_HOOK + +int +virSkipParseDefFormatHook(const virSkipParseDef *def, + const void *parent, + const void *opaque, + virTristateBool *empty, + virTristateBool *shortcut, + virBuffer *connectionsBuf, + virBuffer *ifsBuf); + +#endif /* ENABLE_VIR_SKIP_PARSE_DEF_FORMAT_HOOK */ + + +[conf/skipparse.generated.c] + +int +virSkipParseDefFormatBuf(virBuffer *buf, + const char *name, + const virSkipParseDef *def, + const void *parent G_GNUC_UNUSED, + void *opaque G_GNUC_UNUSED) +{ + virTristateBool empty G_GNUC_UNUSED =3D VIR_TRISTATE_BOOL_ABSENT; + virTristateBool shortcut G_GNUC_UNUSED =3D VIR_TRISTATE_BOOL_ABSENT; + g_auto(virBuffer) connectionsBuf =3D VIR_BUFFER_INITIALIZER; + g_auto(virBuffer) ifsBuf =3D VIR_BUFFER_INITIALIZER; + + if (!def || !buf) + return 0; + +#ifdef ENABLE_VIR_SKIP_PARSE_DEF_FORMAT_HOOK + if (virSkipParseDefFormatHook(def, parent, opaque, &empty, &shortcut, = &connectionsBuf, &ifsBuf) < 0) + return -1; +#endif /* ENABLE_VIR_SKIP_PARSE_DEF_FORMAT_HOOK */ + + if (empty !=3D VIR_TRISTATE_BOOL_NO) + if (empty || !(def->connections || def->nifs)) + return 0; + + virBufferAsprintf(buf, "<%s", name); + + virBufferInheritIndent(&connectionsBuf, buf); + if (!virBufferTouched(&connectionsBuf) && def->connections) + virBufferAsprintf(&connectionsBuf, " connections=3D'%d'", def->con= nections); + virBufferAddBuffer(buf, &connectionsBuf); + + if (shortcut !=3D VIR_TRISTATE_BOOL_NO) { + if (shortcut || !(def->nifs)) { + virBufferAddLit(buf, "/>\n"); + return 0; + } + } + + virBufferAddLit(buf, ">\n"); + + virBufferAdjustIndent(buf, 2); + + virBufferInheritIndent(&ifsBuf, buf); + if (!virBufferTouched(&ifsBuf) && def->nifs) { + size_t i; + for (i =3D 0; i < def->nifs; i++) { + if (virNetworkForwardIfDefFormatBuf(buf, "if", &def->ifs[i], d= ef, opaque) < 0) + return -1; + } + } + virBufferAddBuffer(buf, &ifsBuf); + + virBufferAdjustIndent(buf, -2); + virBufferAsprintf(buf, "\n", name); + + return 0; +} + + +[conf/skipparse.generated.h] + +bool +virSkipParseDefCheck(const virSkipParseDef *def, + const void *parent, + void *opaque); + + +[conf/skipparse.generated.c] + +#ifndef RESET_VIR_SKIP_PARSE_DEF_CHECK + +bool +virSkipParseDefCheck(const virSkipParseDef *def, + const void *parent G_GNUC_UNUSED, + void *opaque G_GNUC_UNUSED) +{ + if (!def) + return false; + + return def->connections || def->nifs; +} + +#endif /* RESET_VIR_SKIP_PARSE_DEF_CHECK */ + + +[Tips] + +/* Put these lines at the bottom of "conf/skipparse.h" */ +/* Makesure "skipparse.h" to be appended into conf_xmlgen_input in src/con= f/meson.build */ + +/* Define macro to enable hook or redefine check when necessary */ +/* #define ENABLE_VIR_SKIP_PARSE_DEF_PARSE_HOOK */ +/* #define ENABLE_VIR_SKIP_PARSE_DEF_PARSE_HOOK_SET_ARGS */ +/* #define ENABLE_VIR_SKIP_PARSE_DEF_FORMAT_HOOK */ + +/* #define RESET_VIR_SKIP_PARSE_DEF_CHECK */ + +/* Makesure below is the bottom line! */ +#include "skipparse.generated.h" diff --git a/tests/xmlgenout/specify.txt b/tests/xmlgenout/specify.txt new file mode 100644 index 00000000..dd6dac9c --- /dev/null +++ b/tests/xmlgenout/specify.txt @@ -0,0 +1,291 @@ +[conf/specify.generated.h] + +void +virSpecifyDefClear(virSpecifyDef *def); + + +[conf/specify.generated.c] + +void +virSpecifyDefClear(virSpecifyDef *def) +{ + if (!def) + return; + + def->unit =3D 0; + + def->expiry =3D 0; + + virMacAddrClear(&def->mac); + def->mac_specified =3D false; + + virUUIDClear(&def->uuid); + def->uuid_specified =3D false; +} + + +[conf/specify.generated.h] + +int +virSpecifyDefParseXML(xmlNodePtr node, + virSpecifyDef *def, + const char *instname, + void *parent, + void *opaque); + + +[conf/specify.generated.h] + +#ifdef ENABLE_VIR_SPECIFY_DEF_PARSE_HOOK + +int +virSpecifyDefParseHook(xmlNodePtr node, + virSpecifyDef *def, + const char *instname, + void *parent, + void *opaque, + const char *unitStr, + const char *expiryStr, + const char *macStr, + const char *uuidStr); + +#endif + + +[conf/specify.generated.h] + +#ifdef ENABLE_VIR_SPECIFY_DEF_PARSE_HOOK_SET_ARGS + +void +virSpecifyDefParseXMLSetArgs(xmlNodePtr node, + void *parent, + void **pparent, + void **popaque); + +#endif + + +[conf/specify.generated.c] + +int +virSpecifyDefParseXML(xmlNodePtr node, + virSpecifyDef *def, + const char *instname G_GNUC_UNUSED, + void *parent G_GNUC_UNUSED, + void *opaque G_GNUC_UNUSED) +{ + g_autofree char *unitStr =3D NULL; + g_autofree char *expiryStr =3D NULL; + g_autofree char *macStr =3D NULL; + g_autofree char *uuidStr =3D NULL; + void *arg_parent G_GNUC_UNUSED =3D def; + void *arg_opaque G_GNUC_UNUSED =3D opaque; + + if (!def) + goto error; + +#ifdef ENABLE_VIR_SPECIFY_DEF_PARSE_HOOK_SET_ARGS + virSpecifyDefParseXMLSetArgs(node, parent, &arg_parent, &arg_opaque); +#endif + + unitStr =3D virXMLPropString(node, "unit"); + if (unitStr) { + if ((def->unit =3D virNetworkDHCPLeaseTimeUnitTypeFromString(unitS= tr)) < 0) { + virReportError(VIR_ERR_XML_ERROR, + _("Invalid '%s' setting '%s' in '%s'"), + "unit", unitStr, instname); + goto error; + } + } + + expiryStr =3D virXMLPropString(node, "expiry"); + if (expiryStr) { + if (virStrToLong_ulp(expiryStr, NULL, 0, &def->expiry) < 0) { + virReportError(VIR_ERR_XML_ERROR, + _("Invalid '%s' setting '%s' in '%s'"), + "expiry", expiryStr, instname); + goto error; + } + } + + macStr =3D virXMLChildPropString(node, "mac/address"); + if (macStr) { + if (virMacAddrParseXML(macStr, &def->mac, instname, arg_parent, ar= g_opaque) < 0) + goto error; + def->mac_specified =3D true; + } + + uuidStr =3D virXMLChildNodeContent(node, "uuid"); + if (uuidStr) { + if (virUUIDParseXML(uuidStr, &def->uuid, instname, arg_parent, arg= _opaque) < 0) + goto error; + def->uuid_specified =3D true; + } + +#ifdef ENABLE_VIR_SPECIFY_DEF_PARSE_HOOK + if (virSpecifyDefParseHook(node, def, instname, parent, opaque, unitSt= r, expiryStr, macStr, uuidStr) < 0) + goto error; +#endif + + return 0; + + error: + virSpecifyDefClear(def); + return -1; +} + + +[conf/specify.generated.h] + +int +virSpecifyDefFormatBuf(virBuffer *buf, + const char *name, + const virSpecifyDef *def, + const void *parent, + void *opaque); + + +[conf/specify.generated.h] + +#ifdef ENABLE_VIR_SPECIFY_DEF_FORMAT_HOOK + +int +virSpecifyDefFormatHook(const virSpecifyDef *def, + const void *parent, + const void *opaque, + virTristateBool *empty, + virTristateBool *shortcut, + virBuffer *unitBuf, + virBuffer *expiryBuf, + virBuffer *mac_addressBuf, + virBuffer *uuidBuf); + +#endif /* ENABLE_VIR_SPECIFY_DEF_FORMAT_HOOK */ + + +[conf/specify.generated.c] + +int +virSpecifyDefFormatBuf(virBuffer *buf, + const char *name, + const virSpecifyDef *def, + const void *parent G_GNUC_UNUSED, + void *opaque G_GNUC_UNUSED) +{ + virTristateBool empty G_GNUC_UNUSED =3D VIR_TRISTATE_BOOL_ABSENT; + virTristateBool shortcut G_GNUC_UNUSED =3D VIR_TRISTATE_BOOL_ABSENT; + g_auto(virBuffer) unitBuf =3D VIR_BUFFER_INITIALIZER; + g_auto(virBuffer) expiryBuf =3D VIR_BUFFER_INITIALIZER; + g_auto(virBuffer) mac_addressBuf =3D VIR_BUFFER_INITIALIZER; + g_auto(virBuffer) uuidBuf =3D VIR_BUFFER_INITIALIZER; + + if (!def || !buf) + return 0; + +#ifdef ENABLE_VIR_SPECIFY_DEF_FORMAT_HOOK + if (virSpecifyDefFormatHook(def, parent, opaque, &empty, &shortcut, &u= nitBuf, &expiryBuf, &mac_addressBuf, &uuidBuf) < 0) + return -1; +#endif /* ENABLE_VIR_SPECIFY_DEF_FORMAT_HOOK */ + + if (empty !=3D VIR_TRISTATE_BOOL_NO) + if (empty || !(def->expiry || def->uuid_specified || def->mac_spec= ified)) + return 0; + + virBufferAsprintf(buf, "<%s", name); + + virBufferInheritIndent(&unitBuf, buf); + if (!virBufferTouched(&unitBuf) && def->expiry) { + const char *str =3D virNetworkDHCPLeaseTimeUnitTypeToString(def->u= nit); + if (!str) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unknown %s type %d"), + "unit", def->unit); + return -1; + } + virBufferAsprintf(&unitBuf, " unit=3D'%s'", str); + } + virBufferAddBuffer(buf, &unitBuf); + + virBufferInheritIndent(&expiryBuf, buf); + if (!virBufferTouched(&expiryBuf) && def->expiry) + virBufferAsprintf(&expiryBuf, " expiry=3D'%lu'", def->expiry); + virBufferAddBuffer(buf, &expiryBuf); + + if (shortcut !=3D VIR_TRISTATE_BOOL_NO) { + if (shortcut || !(def->uuid_specified || def->mac_specified)) { + virBufferAddLit(buf, "/>\n"); + return 0; + } + } + + virBufferAddLit(buf, ">\n"); + + virBufferAdjustIndent(buf, 2); + + if (virBufferUse(&mac_addressBuf) || def->mac_specified) { + virBufferAddLit(buf, "mac_specified) { + if (virMacAddrFormatBuf(&mac_addressBuf, " address=3D'%s'", &d= ef->mac, def, opaque) < 0) + return -1; + } + virBufferAddBuffer(buf, &mac_addressBuf); + + virBufferAddLit(buf, "/>\n"); + } + + virBufferInheritIndent(&uuidBuf, buf); + if (!virBufferTouched(&uuidBuf) && def->uuid_specified) { + if (virUUIDFormatBuf(&uuidBuf, "%s\n", &def->uuid, de= f, opaque) < 0) + return -1; + } + virBufferAddBuffer(buf, &uuidBuf); + + virBufferAdjustIndent(buf, -2); + virBufferAsprintf(buf, "\n", name); + + return 0; +} + + +[conf/specify.generated.h] + +bool +virSpecifyDefCheck(const virSpecifyDef *def, + const void *parent, + void *opaque); + + +[conf/specify.generated.c] + +#ifndef RESET_VIR_SPECIFY_DEF_CHECK + +bool +virSpecifyDefCheck(const virSpecifyDef *def, + const void *parent G_GNUC_UNUSED, + void *opaque G_GNUC_UNUSED) +{ + if (!def) + return false; + + return def->expiry || def->uuid_specified || def->mac_specified; +} + +#endif /* RESET_VIR_SPECIFY_DEF_CHECK */ + + +[Tips] + +/* Put these lines at the bottom of "conf/specify.h" */ +/* Makesure "specify.h" to be appended into conf_xmlgen_input in src/conf/= meson.build */ + +/* Define macro to enable hook or redefine check when necessary */ +/* #define ENABLE_VIR_SPECIFY_DEF_PARSE_HOOK */ +/* #define ENABLE_VIR_SPECIFY_DEF_PARSE_HOOK_SET_ARGS */ +/* #define ENABLE_VIR_SPECIFY_DEF_FORMAT_HOOK */ + +/* #define RESET_VIR_SPECIFY_DEF_CHECK */ + +/* Makesure below is the bottom line! */ +#include "specify.generated.h" diff --git a/tests/xmlgenout/xmlattr.txt b/tests/xmlgenout/xmlattr.txt new file mode 100644 index 00000000..228eb3cc --- /dev/null +++ b/tests/xmlgenout/xmlattr.txt @@ -0,0 +1,252 @@ +[conf/xmlattr.generated.h] + +void +virXMLAttrDefClear(virXMLAttrDef *def); + + +[conf/xmlattr.generated.c] + +void +virXMLAttrDefClear(virXMLAttrDef *def) +{ + if (!def) + return; + + g_free(def->family); + def->family =3D NULL; + + def->localPTR =3D 0; + + g_free(def->tftproot); + def->tftproot =3D NULL; +} + + +[conf/xmlattr.generated.h] + +int +virXMLAttrDefParseXML(xmlNodePtr node, + virXMLAttrDef *def, + const char *instname, + void *parent, + void *opaque); + + +[conf/xmlattr.generated.h] + +#ifdef ENABLE_VIR_XMLATTR_DEF_PARSE_HOOK + +int +virXMLAttrDefParseHook(xmlNodePtr node, + virXMLAttrDef *def, + const char *instname, + void *parent, + void *opaque, + const char *localPTRStr); + +#endif + + +[conf/xmlattr.generated.h] + +#ifdef ENABLE_VIR_XMLATTR_DEF_PARSE_HOOK_SET_ARGS + +void +virXMLAttrDefParseXMLSetArgs(xmlNodePtr node, + void *parent, + void **pparent, + void **popaque); + +#endif + + +[conf/xmlattr.generated.c] + +int +virXMLAttrDefParseXML(xmlNodePtr node, + virXMLAttrDef *def, + const char *instname G_GNUC_UNUSED, + void *parent G_GNUC_UNUSED, + void *opaque G_GNUC_UNUSED) +{ + g_autofree char *localPTRStr =3D NULL; + void *arg_parent G_GNUC_UNUSED =3D def; + void *arg_opaque G_GNUC_UNUSED =3D opaque; + + if (!def) + goto error; + +#ifdef ENABLE_VIR_XMLATTR_DEF_PARSE_HOOK_SET_ARGS + virXMLAttrDefParseXMLSetArgs(node, parent, &arg_parent, &arg_opaque); +#endif + + def->family =3D virXMLPropString(node, "family"); + + localPTRStr =3D virXMLPropString(node, "localPtr"); + if (localPTRStr) { + if ((def->localPTR =3D virTristateBoolTypeFromString(localPTRStr))= <=3D 0) { + virReportError(VIR_ERR_XML_ERROR, + _("Invalid '%s' setting '%s' in '%s'"), + "localPtr", localPTRStr, instname); + goto error; + } + } + + def->tftproot =3D virXMLChildPropString(node, "tftp/root"); + +#ifdef ENABLE_VIR_XMLATTR_DEF_PARSE_HOOK + if (virXMLAttrDefParseHook(node, def, instname, parent, opaque, localP= TRStr) < 0) + goto error; +#endif + + return 0; + + error: + virXMLAttrDefClear(def); + return -1; +} + + +[conf/xmlattr.generated.h] + +int +virXMLAttrDefFormatBuf(virBuffer *buf, + const char *name, + const virXMLAttrDef *def, + const void *parent, + void *opaque); + + +[conf/xmlattr.generated.h] + +#ifdef ENABLE_VIR_XMLATTR_DEF_FORMAT_HOOK + +int +virXMLAttrDefFormatHook(const virXMLAttrDef *def, + const void *parent, + const void *opaque, + virTristateBool *empty, + virTristateBool *shortcut, + virBuffer *familyBuf, + virBuffer *localPTRBuf, + virBuffer *tftp_rootBuf); + +#endif /* ENABLE_VIR_XMLATTR_DEF_FORMAT_HOOK */ + + +[conf/xmlattr.generated.c] + +int +virXMLAttrDefFormatBuf(virBuffer *buf, + const char *name, + const virXMLAttrDef *def, + const void *parent G_GNUC_UNUSED, + void *opaque G_GNUC_UNUSED) +{ + virTristateBool empty G_GNUC_UNUSED =3D VIR_TRISTATE_BOOL_ABSENT; + virTristateBool shortcut G_GNUC_UNUSED =3D VIR_TRISTATE_BOOL_ABSENT; + g_auto(virBuffer) familyBuf =3D VIR_BUFFER_INITIALIZER; + g_auto(virBuffer) localPTRBuf =3D VIR_BUFFER_INITIALIZER; + g_auto(virBuffer) tftp_rootBuf =3D VIR_BUFFER_INITIALIZER; + + if (!def || !buf) + return 0; + +#ifdef ENABLE_VIR_XMLATTR_DEF_FORMAT_HOOK + if (virXMLAttrDefFormatHook(def, parent, opaque, &empty, &shortcut, &f= amilyBuf, &localPTRBuf, &tftp_rootBuf) < 0) + return -1; +#endif /* ENABLE_VIR_XMLATTR_DEF_FORMAT_HOOK */ + + if (empty !=3D VIR_TRISTATE_BOOL_NO) + if (empty || !(def->family || def->localPTR > 0 || def->tftproot)) + return 0; + + virBufferAsprintf(buf, "<%s", name); + + virBufferInheritIndent(&familyBuf, buf); + if (!virBufferTouched(&familyBuf) && def->family) + virBufferEscapeString(&familyBuf, " family=3D'%s'", def->family); + virBufferAddBuffer(buf, &familyBuf); + + virBufferInheritIndent(&localPTRBuf, buf); + if (!virBufferTouched(&localPTRBuf) && def->localPTR > 0) { + const char *str =3D virTristateBoolTypeToString(def->localPTR); + if (!str) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unknown %s type %d"), + "localPtr", def->localPTR); + return -1; + } + virBufferAsprintf(&localPTRBuf, " localPtr=3D'%s'", str); + } + virBufferAddBuffer(buf, &localPTRBuf); + + if (shortcut !=3D VIR_TRISTATE_BOOL_NO) { + if (shortcut || !(def->tftproot)) { + virBufferAddLit(buf, "/>\n"); + return 0; + } + } + + virBufferAddLit(buf, ">\n"); + + virBufferAdjustIndent(buf, 2); + + if (virBufferUse(&tftp_rootBuf) || def->tftproot) { + virBufferAddLit(buf, "tftproot) + virBufferEscapeString(&tftp_rootBuf, " root=3D'%s'", def->tftp= root); + virBufferAddBuffer(buf, &tftp_rootBuf); + + virBufferAddLit(buf, "/>\n"); + } + + virBufferAdjustIndent(buf, -2); + virBufferAsprintf(buf, "\n", name); + + return 0; +} + + +[conf/xmlattr.generated.h] + +bool +virXMLAttrDefCheck(const virXMLAttrDef *def, + const void *parent, + void *opaque); + + +[conf/xmlattr.generated.c] + +#ifndef RESET_VIR_XMLATTR_DEF_CHECK + +bool +virXMLAttrDefCheck(const virXMLAttrDef *def, + const void *parent G_GNUC_UNUSED, + void *opaque G_GNUC_UNUSED) +{ + if (!def) + return false; + + return def->family || def->localPTR > 0 || def->tftproot; +} + +#endif /* RESET_VIR_XMLATTR_DEF_CHECK */ + + +[Tips] + +/* Put these lines at the bottom of "conf/xmlattr.h" */ +/* Makesure "xmlattr.h" to be appended into conf_xmlgen_input in src/conf/= meson.build */ + +/* Define macro to enable hook or redefine check when necessary */ +/* #define ENABLE_VIR_XMLATTR_DEF_PARSE_HOOK */ +/* #define ENABLE_VIR_XMLATTR_DEF_PARSE_HOOK_SET_ARGS */ +/* #define ENABLE_VIR_XMLATTR_DEF_FORMAT_HOOK */ + +/* #define RESET_VIR_XMLATTR_DEF_CHECK */ + +/* Makesure below is the bottom line! */ +#include "xmlattr.generated.h" diff --git a/tests/xmlgenout/xmlelem.txt b/tests/xmlgenout/xmlelem.txt new file mode 100644 index 00000000..d910eda2 --- /dev/null +++ b/tests/xmlgenout/xmlelem.txt @@ -0,0 +1,243 @@ +[conf/xmlelem.generated.h] + +void +virXMLElemDefClear(virXMLElemDef *def); + + +[conf/xmlelem.generated.c] + +void +virXMLElemDefClear(virXMLElemDef *def) +{ + if (!def) + return; + + virPortRangeClear(&def->port); + + virSocketAddrRangeClear(&def->addr); + + virUUIDClear(&def->uuid); +} + + +[conf/xmlelem.generated.h] + +int +virXMLElemDefParseXML(xmlNodePtr node, + virXMLElemDef *def, + const char *instname, + void *parent, + void *opaque); + + +[conf/xmlelem.generated.h] + +#ifdef ENABLE_VIR_XMLELEM_DEF_PARSE_HOOK + +int +virXMLElemDefParseHook(xmlNodePtr node, + virXMLElemDef *def, + const char *instname, + void *parent, + void *opaque, + xmlNodePtr portNode, + xmlNodePtr addrNode, + const char *uuidStr); + +#endif + + +[conf/xmlelem.generated.h] + +#ifdef ENABLE_VIR_XMLELEM_DEF_PARSE_HOOK_SET_ARGS + +void +virXMLElemDefParseXMLSetArgs(xmlNodePtr node, + void *parent, + void **pparent, + void **popaque); + +#endif + + +[conf/xmlelem.generated.c] + +int +virXMLElemDefParseXML(xmlNodePtr node, + virXMLElemDef *def, + const char *instname G_GNUC_UNUSED, + void *parent G_GNUC_UNUSED, + void *opaque G_GNUC_UNUSED) +{ + xmlNodePtr portNode =3D NULL; + xmlNodePtr addrNode =3D NULL; + g_autofree char *uuidStr =3D NULL; + void *arg_parent G_GNUC_UNUSED =3D def; + void *arg_opaque G_GNUC_UNUSED =3D opaque; + + if (!def) + goto error; + +#ifdef ENABLE_VIR_XMLELEM_DEF_PARSE_HOOK_SET_ARGS + virXMLElemDefParseXMLSetArgs(node, parent, &arg_parent, &arg_opaque); +#endif + + portNode =3D virXMLChildNode(node, "port"); + if (portNode) { + if (virPortRangeParseXML(portNode, &def->port, instname, arg_paren= t, arg_opaque) < 0) + goto error; + } + + addrNode =3D virXMLChildNode(node, "address"); + if (addrNode) { + if (virSocketAddrRangeParseXML(addrNode, &def->addr, instname, arg= _parent, arg_opaque) < 0) + goto error; + } + + uuidStr =3D virXMLChildNodeContent(node, "uuid"); + if (uuidStr) { + if (virUUIDParseXML(uuidStr, &def->uuid, instname, arg_parent, arg= _opaque) < 0) + goto error; + } + +#ifdef ENABLE_VIR_XMLELEM_DEF_PARSE_HOOK + if (virXMLElemDefParseHook(node, def, instname, parent, opaque, portNo= de, addrNode, uuidStr) < 0) + goto error; +#endif + + return 0; + + error: + virXMLElemDefClear(def); + return -1; +} + + +[conf/xmlelem.generated.h] + +int +virXMLElemDefFormatBuf(virBuffer *buf, + const char *name, + const virXMLElemDef *def, + const void *parent, + void *opaque); + + +[conf/xmlelem.generated.h] + +#ifdef ENABLE_VIR_XMLELEM_DEF_FORMAT_HOOK + +int +virXMLElemDefFormatHook(const virXMLElemDef *def, + const void *parent, + const void *opaque, + virTristateBool *empty, + virTristateBool *shortcut, + virBuffer *portBuf, + virBuffer *addrBuf, + virBuffer *uuidBuf); + +#endif /* ENABLE_VIR_XMLELEM_DEF_FORMAT_HOOK */ + + +[conf/xmlelem.generated.c] + +int +virXMLElemDefFormatBuf(virBuffer *buf, + const char *name, + const virXMLElemDef *def, + const void *parent G_GNUC_UNUSED, + void *opaque G_GNUC_UNUSED) +{ + virTristateBool empty G_GNUC_UNUSED =3D VIR_TRISTATE_BOOL_ABSENT; + virTristateBool shortcut G_GNUC_UNUSED =3D VIR_TRISTATE_BOOL_ABSENT; + g_auto(virBuffer) portBuf =3D VIR_BUFFER_INITIALIZER; + g_auto(virBuffer) addrBuf =3D VIR_BUFFER_INITIALIZER; + g_auto(virBuffer) uuidBuf =3D VIR_BUFFER_INITIALIZER; + + if (!def || !buf) + return 0; + +#ifdef ENABLE_VIR_XMLELEM_DEF_FORMAT_HOOK + if (virXMLElemDefFormatHook(def, parent, opaque, &empty, &shortcut, &p= ortBuf, &addrBuf, &uuidBuf) < 0) + return -1; +#endif /* ENABLE_VIR_XMLELEM_DEF_FORMAT_HOOK */ + + if (empty !=3D VIR_TRISTATE_BOOL_NO) + if (empty || !(virPortRangeCheck(&def->port, def, opaque) || virSo= cketAddrRangeCheck(&def->addr, def, opaque) || virUUIDCheck(&def->uuid, def= , opaque))) + return 0; + + virBufferAsprintf(buf, "<%s", name); + + virBufferAddLit(buf, ">\n"); + + virBufferAdjustIndent(buf, 2); + + virBufferInheritIndent(&portBuf, buf); + if (!virBufferTouched(&portBuf) && virPortRangeCheck(&def->port, def, = opaque)) { + if (virPortRangeFormatBuf(&portBuf, "port", &def->port, def, opaqu= e) < 0) + return -1; + } + virBufferAddBuffer(buf, &portBuf); + + virBufferInheritIndent(&addrBuf, buf); + if (!virBufferTouched(&addrBuf) && virSocketAddrRangeCheck(&def->addr,= def, opaque)) { + if (virSocketAddrRangeFormatBuf(&addrBuf, "address", &def->addr, d= ef, opaque) < 0) + return -1; + } + virBufferAddBuffer(buf, &addrBuf); + + virBufferInheritIndent(&uuidBuf, buf); + if (!virBufferTouched(&uuidBuf) && virUUIDCheck(&def->uuid, def, opaqu= e)) { + if (virUUIDFormatBuf(&uuidBuf, "%s\n", &def->uuid, de= f, opaque) < 0) + return -1; + } + virBufferAddBuffer(buf, &uuidBuf); + + virBufferAdjustIndent(buf, -2); + virBufferAsprintf(buf, "\n", name); + + return 0; +} + + +[conf/xmlelem.generated.h] + +bool +virXMLElemDefCheck(const virXMLElemDef *def, + const void *parent, + void *opaque); + + +[conf/xmlelem.generated.c] + +#ifndef RESET_VIR_XMLELEM_DEF_CHECK + +bool +virXMLElemDefCheck(const virXMLElemDef *def, + const void *parent G_GNUC_UNUSED, + void *opaque G_GNUC_UNUSED) +{ + if (!def) + return false; + + return virPortRangeCheck(&def->port, def, opaque) || virSocketAddrRang= eCheck(&def->addr, def, opaque) || virUUIDCheck(&def->uuid, def, opaque); +} + +#endif /* RESET_VIR_XMLELEM_DEF_CHECK */ + + +[Tips] + +/* Put these lines at the bottom of "conf/xmlelem.h" */ +/* Makesure "xmlelem.h" to be appended into conf_xmlgen_input in src/conf/= meson.build */ + +/* Define macro to enable hook or redefine check when necessary */ +/* #define ENABLE_VIR_XMLELEM_DEF_PARSE_HOOK */ +/* #define ENABLE_VIR_XMLELEM_DEF_PARSE_HOOK_SET_ARGS */ +/* #define ENABLE_VIR_XMLELEM_DEF_FORMAT_HOOK */ + +/* #define RESET_VIR_XMLELEM_DEF_CHECK */ + +/* Makesure below is the bottom line! */ +#include "xmlelem.generated.h" diff --git a/tests/xmlgenout/xmlgroup.txt b/tests/xmlgenout/xmlgroup.txt new file mode 100644 index 00000000..ff9d7e09 --- /dev/null +++ b/tests/xmlgenout/xmlgroup.txt @@ -0,0 +1,204 @@ +[conf/xmlgroup.generated.h] + +void +virXMLGroupDefClear(virXMLGroupDef *def); + + +[conf/xmlgroup.generated.c] + +void +virXMLGroupDefClear(virXMLGroupDef *def) +{ + if (!def) + return; + + virUtilAuthDefClear(&def->auth); +} + + +[conf/xmlgroup.generated.h] + +int +virXMLGroupDefParseXML(xmlNodePtr node, + virXMLGroupDef *def, + const char *instname, + void *parent, + void *opaque); + + +[conf/xmlgroup.generated.h] + +#ifdef ENABLE_VIR_XMLGROUP_DEF_PARSE_HOOK + +int +virXMLGroupDefParseHook(xmlNodePtr node, + virXMLGroupDef *def, + const char *instname, + void *parent, + void *opaque); + +#endif + + +[conf/xmlgroup.generated.h] + +#ifdef ENABLE_VIR_XMLGROUP_DEF_PARSE_HOOK_SET_ARGS + +void +virXMLGroupDefParseXMLSetArgs(xmlNodePtr node, + void *parent, + void **pparent, + void **popaque); + +#endif + + +[conf/xmlgroup.generated.c] + +int +virXMLGroupDefParseXML(xmlNodePtr node, + virXMLGroupDef *def, + const char *instname G_GNUC_UNUSED, + void *parent G_GNUC_UNUSED, + void *opaque G_GNUC_UNUSED) +{ + void *arg_parent G_GNUC_UNUSED =3D def; + void *arg_opaque G_GNUC_UNUSED =3D opaque; + + if (!def) + goto error; + +#ifdef ENABLE_VIR_XMLGROUP_DEF_PARSE_HOOK_SET_ARGS + virXMLGroupDefParseXMLSetArgs(node, parent, &arg_parent, &arg_opaque); +#endif + + if (virUtilAuthDefParseXML(node, &def->auth, instname, arg_parent, arg= _opaque) < 0) + goto error; + +#ifdef ENABLE_VIR_XMLGROUP_DEF_PARSE_HOOK + if (virXMLGroupDefParseHook(node, def, instname, parent, opaque) < 0) + goto error; +#endif + + return 0; + + error: + virXMLGroupDefClear(def); + return -1; +} + + +[conf/xmlgroup.generated.h] + +int +virXMLGroupDefFormatBuf(virBuffer *buf, + const char *name, + const virXMLGroupDef *def, + const void *parent, + void *opaque); + + +[conf/xmlgroup.generated.h] + +#ifdef ENABLE_VIR_XMLGROUP_DEF_FORMAT_HOOK + +int +virXMLGroupDefFormatHook(const virXMLGroupDef *def, + const void *parent, + const void *opaque, + virTristateBool *empty, + virTristateBool *shortcut); + +#endif /* ENABLE_VIR_XMLGROUP_DEF_FORMAT_HOOK */ + + +[conf/xmlgroup.generated.c] + +int +virXMLGroupDefFormatBuf(virBuffer *buf, + const char *name, + const virXMLGroupDef *def, + const void *parent G_GNUC_UNUSED, + void *opaque G_GNUC_UNUSED) +{ + virTristateBool empty G_GNUC_UNUSED =3D VIR_TRISTATE_BOOL_ABSENT; + virTristateBool shortcut G_GNUC_UNUSED =3D VIR_TRISTATE_BOOL_ABSENT; + + if (!def || !buf) + return 0; + +#ifdef ENABLE_VIR_XMLGROUP_DEF_FORMAT_HOOK + if (virXMLGroupDefFormatHook(def, parent, opaque, &empty, &shortcut) <= 0) + return -1; +#endif /* ENABLE_VIR_XMLGROUP_DEF_FORMAT_HOOK */ + + if (empty !=3D VIR_TRISTATE_BOOL_NO) + if (empty || !(virUtilAuthDefCheckAttr(&def->auth, def, opaque) ||= virUtilAuthDefCheckElem(&def->auth, def, opaque))) + return 0; + + virBufferAsprintf(buf, "<%s", name); + + if (virUtilAuthDefFormatAttr(buf, &def->auth, def, opaque) < 0) + return -1; + + if (shortcut !=3D VIR_TRISTATE_BOOL_NO) { + if (shortcut || !(virUtilAuthDefCheckElem(&def->auth, def, opaque)= )) { + virBufferAddLit(buf, "/>\n"); + return 0; + } + } + + virBufferAddLit(buf, ">\n"); + + virBufferAdjustIndent(buf, 2); + + if (virUtilAuthDefFormatElem(buf, &def->auth, def, opaque) < 0) + return -1; + + virBufferAdjustIndent(buf, -2); + virBufferAsprintf(buf, "\n", name); + + return 0; +} + + +[conf/xmlgroup.generated.h] + +bool +virXMLGroupDefCheck(const virXMLGroupDef *def, + const void *parent, + void *opaque); + + +[conf/xmlgroup.generated.c] + +#ifndef RESET_VIR_XMLGROUP_DEF_CHECK + +bool +virXMLGroupDefCheck(const virXMLGroupDef *def, + const void *parent G_GNUC_UNUSED, + void *opaque G_GNUC_UNUSED) +{ + if (!def) + return false; + + return virUtilAuthDefCheckAttr(&def->auth, def, opaque) || virUtilAuth= DefCheckElem(&def->auth, def, opaque); +} + +#endif /* RESET_VIR_XMLGROUP_DEF_CHECK */ + + +[Tips] + +/* Put these lines at the bottom of "conf/xmlgroup.h" */ +/* Makesure "xmlgroup.h" to be appended into conf_xmlgen_input in src/conf= /meson.build */ + +/* Define macro to enable hook or redefine check when necessary */ +/* #define ENABLE_VIR_XMLGROUP_DEF_PARSE_HOOK */ +/* #define ENABLE_VIR_XMLGROUP_DEF_PARSE_HOOK_SET_ARGS */ +/* #define ENABLE_VIR_XMLGROUP_DEF_FORMAT_HOOK */ + +/* #define RESET_VIR_XMLGROUP_DEF_CHECK */ + +/* Makesure below is the bottom line! */ +#include "xmlgroup.generated.h" diff --git a/tests/xmlgenout/xmlswitch.txt b/tests/xmlgenout/xmlswitch.txt new file mode 100644 index 00000000..772f1353 --- /dev/null +++ b/tests/xmlgenout/xmlswitch.txt @@ -0,0 +1,470 @@ +[conf/xmlswitch.generated.h] + +void +virXMLSwitchDefClear(virXMLSwitchDef *def); + + +[conf/xmlswitch.generated.c] + +void +virXMLSwitchDefClear(virXMLSwitchDef *def) +{ + if (!def) + return; + + switch (def->type) { + + case VIR_DOMAIN_GRAPHICS_TYPE_SDL: + virDomainGraphicsSDLDefClear(&def->data.sdl); + break; + + case VIR_DOMAIN_GRAPHICS_TYPE_VNC: + virDomainGraphicsVNCDefClear(&def->data.vnc); + break; + + case VIR_DOMAIN_GRAPHICS_TYPE_RDP: + virDomainGraphicsRDPDefClear(&def->data.rdp); + break; + + case VIR_DOMAIN_GRAPHICS_TYPE_DESKTOP: + virDomainGraphicsDesktopDefClear(&def->data.desktop); + break; + + case VIR_DOMAIN_GRAPHICS_TYPE_SPICE: + virDomainGraphicsSpiceDefClear(&def->data.spice); + break; + + case VIR_DOMAIN_GRAPHICS_TYPE_EGL_HEADLESS: + virDomainGraphicsEGLHeadlessDefClear(&def->data.egl_headless); + break; + + case VIR_DOMAIN_GRAPHICS_TYPE_LAST: + break; + } + + def->type =3D 0; +} + + +[conf/xmlswitch.generated.h] + +int +virXMLSwitchDefParseXML(xmlNodePtr node, + virXMLSwitchDef *def, + const char *instname, + void *parent, + void *opaque); + + +[conf/xmlswitch.generated.h] + +#ifdef ENABLE_VIR_XMLSWITCH_DEF_PARSE_HOOK + +int +virXMLSwitchDefParseHook(xmlNodePtr node, + virXMLSwitchDef *def, + const char *instname, + void *parent, + void *opaque, + const char *typeStr); + +#endif + + +[conf/xmlswitch.generated.h] + +#ifdef ENABLE_VIR_XMLSWITCH_DEF_PARSE_HOOK_SET_ARGS + +void +virXMLSwitchDefParseXMLSetArgs(xmlNodePtr node, + void *parent, + void **pparent, + void **popaque); + +#endif + + +[conf/xmlswitch.generated.c] + +int +virXMLSwitchDefParseXML(xmlNodePtr node, + virXMLSwitchDef *def, + const char *instname G_GNUC_UNUSED, + void *parent G_GNUC_UNUSED, + void *opaque G_GNUC_UNUSED) +{ + g_autofree char *typeStr =3D NULL; + void *arg_parent G_GNUC_UNUSED =3D def; + void *arg_opaque G_GNUC_UNUSED =3D opaque; + + if (!def) + goto error; + +#ifdef ENABLE_VIR_XMLSWITCH_DEF_PARSE_HOOK_SET_ARGS + virXMLSwitchDefParseXMLSetArgs(node, parent, &arg_parent, &arg_opaque); +#endif + + typeStr =3D virXMLPropString(node, "type"); + if (typeStr) { + if ((def->type =3D virDomainGraphicsTypeFromString(typeStr)) < 0) { + virReportError(VIR_ERR_XML_ERROR, + _("Invalid '%s' setting '%s' in '%s'"), + "type", typeStr, instname); + goto error; + } + } + + switch (def->type) { + + case VIR_DOMAIN_GRAPHICS_TYPE_SDL: + if (virDomainGraphicsSDLDefParseXML(node, &def->data.sdl, instname= , arg_parent, arg_opaque) < 0) + goto error; + break; + + case VIR_DOMAIN_GRAPHICS_TYPE_VNC: + if (virDomainGraphicsVNCDefParseXML(node, &def->data.vnc, instname= , arg_parent, arg_opaque) < 0) + goto error; + break; + + case VIR_DOMAIN_GRAPHICS_TYPE_RDP: + if (virDomainGraphicsRDPDefParseXML(node, &def->data.rdp, instname= , arg_parent, arg_opaque) < 0) + goto error; + break; + + case VIR_DOMAIN_GRAPHICS_TYPE_DESKTOP: + if (virDomainGraphicsDesktopDefParseXML(node, &def->data.desktop, = instname, arg_parent, arg_opaque) < 0) + goto error; + break; + + case VIR_DOMAIN_GRAPHICS_TYPE_SPICE: + if (virDomainGraphicsSpiceDefParseXML(node, &def->data.spice, inst= name, arg_parent, arg_opaque) < 0) + goto error; + break; + + case VIR_DOMAIN_GRAPHICS_TYPE_EGL_HEADLESS: + if (virDomainGraphicsEGLHeadlessDefParseXML(node, &def->data.egl_h= eadless, instname, arg_parent, arg_opaque) < 0) + goto error; + break; + + case VIR_DOMAIN_GRAPHICS_TYPE_LAST: + break; + } + +#ifdef ENABLE_VIR_XMLSWITCH_DEF_PARSE_HOOK + if (virXMLSwitchDefParseHook(node, def, instname, parent, opaque, type= Str) < 0) + goto error; +#endif + + return 0; + + error: + virXMLSwitchDefClear(def); + return -1; +} + + +[conf/xmlswitch.generated.h] + +bool +virXMLSwitchDefDataCheckAttr(const virXMLSwitchDef *def, + void *opaque); + + +[conf/xmlswitch.generated.c] + +#ifndef RESET_VIR_XMLSWITCH_DEF_DATA_CHECK_ATTR + +bool +virXMLSwitchDefDataCheckAttr(const virXMLSwitchDef *def, + void *opaque G_GNUC_UNUSED) +{ + bool ret =3D false; + if (!def) + return false; + + switch (def->type) { + + case VIR_DOMAIN_GRAPHICS_TYPE_SDL: + ret =3D virDomainGraphicsSDLDefCheckAttr(&def->data.sdl, def, opaq= ue); + break; + + case VIR_DOMAIN_GRAPHICS_TYPE_VNC: + ret =3D virDomainGraphicsVNCDefCheckAttr(&def->data.vnc, def, opaq= ue); + break; + + case VIR_DOMAIN_GRAPHICS_TYPE_RDP: + ret =3D virDomainGraphicsRDPDefCheckAttr(&def->data.rdp, def, opaq= ue); + break; + + case VIR_DOMAIN_GRAPHICS_TYPE_DESKTOP: + ret =3D virDomainGraphicsDesktopDefCheckAttr(&def->data.desktop, d= ef, opaque); + break; + + case VIR_DOMAIN_GRAPHICS_TYPE_SPICE: + ret =3D virDomainGraphicsSpiceDefCheckAttr(&def->data.spice, def, = opaque); + break; + + case VIR_DOMAIN_GRAPHICS_TYPE_EGL_HEADLESS: + ret =3D virDomainGraphicsEGLHeadlessDefCheckAttr(&def->data.egl_he= adless, def, opaque); + break; + + case VIR_DOMAIN_GRAPHICS_TYPE_LAST: + break; + } + + return ret; +} + +#endif /* RESET_VIR_XMLSWITCH_DEF_DATA_CHECK_ATTR */ + + +[conf/xmlswitch.generated.h] + +bool +virXMLSwitchDefDataCheckElem(const virXMLSwitchDef *def, + void *opaque); + + +[conf/xmlswitch.generated.c] + +#ifndef RESET_VIR_XMLSWITCH_DEF_DATA_CHECK_ELEM + +bool +virXMLSwitchDefDataCheckElem(const virXMLSwitchDef *def, + void *opaque G_GNUC_UNUSED) +{ + bool ret =3D false; + if (!def) + return false; + + switch (def->type) { + + case VIR_DOMAIN_GRAPHICS_TYPE_SDL: + ret =3D virDomainGraphicsSDLDefCheckElem(&def->data.sdl, def, opaq= ue); + break; + + case VIR_DOMAIN_GRAPHICS_TYPE_VNC: + ret =3D virDomainGraphicsVNCDefCheckElem(&def->data.vnc, def, opaq= ue); + break; + + case VIR_DOMAIN_GRAPHICS_TYPE_RDP: + ret =3D virDomainGraphicsRDPDefCheckElem(&def->data.rdp, def, opaq= ue); + break; + + case VIR_DOMAIN_GRAPHICS_TYPE_DESKTOP: + ret =3D virDomainGraphicsDesktopDefCheckElem(&def->data.desktop, d= ef, opaque); + break; + + case VIR_DOMAIN_GRAPHICS_TYPE_SPICE: + ret =3D virDomainGraphicsSpiceDefCheckElem(&def->data.spice, def, = opaque); + break; + + case VIR_DOMAIN_GRAPHICS_TYPE_EGL_HEADLESS: + ret =3D virDomainGraphicsEGLHeadlessDefCheckElem(&def->data.egl_he= adless, def, opaque); + break; + + case VIR_DOMAIN_GRAPHICS_TYPE_LAST: + break; + } + + return ret; +} + +#endif /* RESET_VIR_XMLSWITCH_DEF_DATA_CHECK_ELEM */ + + +[conf/xmlswitch.generated.h] + +int +virXMLSwitchDefFormatBuf(virBuffer *buf, + const char *name, + const virXMLSwitchDef *def, + const void *parent, + void *opaque); + + +[conf/xmlswitch.generated.h] + +#ifdef ENABLE_VIR_XMLSWITCH_DEF_FORMAT_HOOK + +int +virXMLSwitchDefFormatHook(const virXMLSwitchDef *def, + const void *parent, + const void *opaque, + virTristateBool *empty, + virTristateBool *shortcut, + virBuffer *typeBuf); + +#endif /* ENABLE_VIR_XMLSWITCH_DEF_FORMAT_HOOK */ + + +[conf/xmlswitch.generated.c] + +int +virXMLSwitchDefFormatBuf(virBuffer *buf, + const char *name, + const virXMLSwitchDef *def, + const void *parent G_GNUC_UNUSED, + void *opaque G_GNUC_UNUSED) +{ + virTristateBool empty G_GNUC_UNUSED =3D VIR_TRISTATE_BOOL_ABSENT; + virTristateBool shortcut G_GNUC_UNUSED =3D VIR_TRISTATE_BOOL_ABSENT; + g_auto(virBuffer) typeBuf =3D VIR_BUFFER_INITIALIZER; + + if (!def || !buf) + return 0; + +#ifdef ENABLE_VIR_XMLSWITCH_DEF_FORMAT_HOOK + if (virXMLSwitchDefFormatHook(def, parent, opaque, &empty, &shortcut, = &typeBuf) < 0) + return -1; +#endif /* ENABLE_VIR_XMLSWITCH_DEF_FORMAT_HOOK */ + + if (empty !=3D VIR_TRISTATE_BOOL_NO) + if (empty || !(def->type >=3D 0 || virXMLSwitchDefDataCheckAttr(de= f, opaque) || virXMLSwitchDefDataCheckElem(def, opaque))) + return 0; + + virBufferAsprintf(buf, "<%s", name); + + virBufferInheritIndent(&typeBuf, buf); + if (!virBufferTouched(&typeBuf) && def->type >=3D 0) { + const char *str =3D virDomainGraphicsTypeToString(def->type); + if (!str) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unknown %s type %d"), + "type", def->type); + return -1; + } + virBufferAsprintf(&typeBuf, " type=3D'%s'", str); + } + virBufferAddBuffer(buf, &typeBuf); + + switch (def->type) { + + case VIR_DOMAIN_GRAPHICS_TYPE_SDL: + if (virDomainGraphicsSDLDefFormatAttr(buf, &def->data.sdl, def, op= aque) < 0) + return -1; + break; + + case VIR_DOMAIN_GRAPHICS_TYPE_VNC: + if (virDomainGraphicsVNCDefFormatAttr(buf, &def->data.vnc, def, op= aque) < 0) + return -1; + break; + + case VIR_DOMAIN_GRAPHICS_TYPE_RDP: + if (virDomainGraphicsRDPDefFormatAttr(buf, &def->data.rdp, def, op= aque) < 0) + return -1; + break; + + case VIR_DOMAIN_GRAPHICS_TYPE_DESKTOP: + if (virDomainGraphicsDesktopDefFormatAttr(buf, &def->data.desktop,= def, opaque) < 0) + return -1; + break; + + case VIR_DOMAIN_GRAPHICS_TYPE_SPICE: + if (virDomainGraphicsSpiceDefFormatAttr(buf, &def->data.spice, def= , opaque) < 0) + return -1; + break; + + case VIR_DOMAIN_GRAPHICS_TYPE_EGL_HEADLESS: + if (virDomainGraphicsEGLHeadlessDefFormatAttr(buf, &def->data.egl_= headless, def, opaque) < 0) + return -1; + break; + + case VIR_DOMAIN_GRAPHICS_TYPE_LAST: + break; + } + + if (shortcut !=3D VIR_TRISTATE_BOOL_NO) { + if (shortcut || !(virXMLSwitchDefDataCheckElem(def, opaque))) { + virBufferAddLit(buf, "/>\n"); + return 0; + } + } + + virBufferAddLit(buf, ">\n"); + + virBufferAdjustIndent(buf, 2); + + switch (def->type) { + + case VIR_DOMAIN_GRAPHICS_TYPE_SDL: + if (virDomainGraphicsSDLDefFormatElem(buf, &def->data.sdl, def, op= aque) < 0) + return -1; + break; + + case VIR_DOMAIN_GRAPHICS_TYPE_VNC: + if (virDomainGraphicsVNCDefFormatElem(buf, &def->data.vnc, def, op= aque) < 0) + return -1; + break; + + case VIR_DOMAIN_GRAPHICS_TYPE_RDP: + if (virDomainGraphicsRDPDefFormatElem(buf, &def->data.rdp, def, op= aque) < 0) + return -1; + break; + + case VIR_DOMAIN_GRAPHICS_TYPE_DESKTOP: + if (virDomainGraphicsDesktopDefFormatElem(buf, &def->data.desktop,= def, opaque) < 0) + return -1; + break; + + case VIR_DOMAIN_GRAPHICS_TYPE_SPICE: + if (virDomainGraphicsSpiceDefFormatElem(buf, &def->data.spice, def= , opaque) < 0) + return -1; + break; + + case VIR_DOMAIN_GRAPHICS_TYPE_EGL_HEADLESS: + if (virDomainGraphicsEGLHeadlessDefFormatElem(buf, &def->data.egl_= headless, def, opaque) < 0) + return -1; + break; + + case VIR_DOMAIN_GRAPHICS_TYPE_LAST: + break; + } + + virBufferAdjustIndent(buf, -2); + virBufferAsprintf(buf, "\n", name); + + return 0; +} + + +[conf/xmlswitch.generated.h] + +bool +virXMLSwitchDefCheck(const virXMLSwitchDef *def, + const void *parent, + void *opaque); + + +[conf/xmlswitch.generated.c] + +#ifndef RESET_VIR_XMLSWITCH_DEF_CHECK + +bool +virXMLSwitchDefCheck(const virXMLSwitchDef *def, + const void *parent G_GNUC_UNUSED, + void *opaque G_GNUC_UNUSED) +{ + if (!def) + return false; + + return def->type >=3D 0 || virXMLSwitchDefDataCheckAttr(def, opaque) |= | virXMLSwitchDefDataCheckElem(def, opaque); +} + +#endif /* RESET_VIR_XMLSWITCH_DEF_CHECK */ + + +[Tips] + +/* Put these lines at the bottom of "conf/xmlswitch.h" */ +/* Makesure "xmlswitch.h" to be appended into conf_xmlgen_input in src/con= f/meson.build */ + +/* Define macro to enable hook or redefine check when necessary */ +/* #define ENABLE_VIR_XMLSWITCH_DEF_PARSE_HOOK */ +/* #define ENABLE_VIR_XMLSWITCH_DEF_PARSE_HOOK_SET_ARGS */ +/* #define ENABLE_VIR_XMLSWITCH_DEF_FORMAT_HOOK */ + +/* #define RESET_VIR_XMLSWITCH_DEF_CHECK */ + +/* Makesure below is the bottom line! */ +#include "xmlswitch.generated.h" diff --git a/tests/xmlgentest.c b/tests/xmlgentest.c new file mode 100644 index 00000000..a20773dc --- /dev/null +++ b/tests/xmlgentest.c @@ -0,0 +1,107 @@ +#include + +#include "internal.h" +#include "testutils.h" +#include "vircommand.h" + +#define VIR_FROM_THIS VIR_FROM_NONE + +typedef enum { + TEST_COMPARE_RESULT_SUCCESS, + TEST_COMPARE_RESULT_FAIL_GENERATE, + TEST_COMPARE_RESULT_FAIL_COMPARE, +} testCompareResult; + +struct testInfo { + const char *name; + const char *target; + testCompareResult expectResult; +}; + +static int +testCompareGenFiles(const void *data) +{ + int ret =3D 0; + testCompareResult result =3D TEST_COMPARE_RESULT_SUCCESS; + const struct testInfo *info =3D data; + g_autofree char *outbuf =3D NULL; + g_autoptr(virCommand) cmd =3D NULL; + g_autofree char *outfile =3D NULL; + char *actual =3D NULL; + + cmd =3D virCommandNewArgList(PYTHON3, "-B", + abs_top_srcdir "/scripts/xmlgen/main.py", + "-s", abs_srcdir "/xmlgenin", + "-b", abs_builddir "/xmlgenin", + "-d", "", + "show", info->target, NULL); + + virCommandSetOutputBuffer(cmd, &outbuf); + + if (virCommandRun(cmd, NULL) < 0) { + result =3D TEST_COMPARE_RESULT_FAIL_GENERATE; + goto cleanup; + } + + /* Skip first empty line */ + if (outbuf && outbuf[0] =3D=3D '\n') + actual =3D outbuf + 1; + else + actual =3D outbuf; + + outfile =3D g_strdup_printf("%s/xmlgenout/%s.txt", abs_srcdir, info->n= ame); + if (virTestCompareToFile(actual, outfile) < 0) { + result =3D TEST_COMPARE_RESULT_FAIL_COMPARE; + goto cleanup; + } + + cleanup: + if (result =3D=3D info->expectResult) { + ret =3D 0; + if (info->expectResult !=3D TEST_COMPARE_RESULT_SUCCESS) { + VIR_TEST_DEBUG("Got expected failure code=3D%d msg=3D%s", + result, virGetLastErrorMessage()); + } + } else { + ret =3D -1; + VIR_TEST_DEBUG("Expected result code=3D%d but received code=3D%d", + info->expectResult, result); + } + virResetLastError(); + + return ret; +} + +static int +mymain(void) +{ + int ret =3D 0; + +#define DO_TEST(name, target) \ + do { \ + const struct testInfo info =3D {name, target, TEST_COMPARE_RESULT_= SUCCESS}; \ + if (virTestRun("xmlgen: generate for " target " in test " name, \ + testCompareGenFiles, &info) < 0) \ + ret =3D -1; \ + } while (0) + + DO_TEST("empty", "virEmptyDef"); + DO_TEST("genparse", "virGenParseDef"); + DO_TEST("genformat", "virGenFormatDef"); + DO_TEST("genformat-separate", "virSeparateDef"); + DO_TEST("xmlattr", "virXMLAttrDef"); + DO_TEST("xmlelem", "virXMLElemDef"); + DO_TEST("array", "virArrayDef"); + DO_TEST("required", "virRequiredDef"); + DO_TEST("specify", "virSpecifyDef"); + DO_TEST("skipparse", "virSkipParseDef"); + DO_TEST("xmlgroup", "virXMLGroupDef"); + DO_TEST("xmlswitch", "virXMLSwitchDef"); + DO_TEST("enum-first-item", "virEnumFirstItemDef"); + DO_TEST("namespace", "virNameSpaceDef"); + DO_TEST("external", "virExternalDef"); + + return ret =3D=3D 0 ? EXIT_SUCCESS : EXIT_FAILURE; +} + +VIR_TEST_MAIN(mymain) --=20 2.25.1 From nobody Tue Apr 23 19:28:24 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 170.10.133.124 as permitted sender) client-ip=170.10.133.124; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-delivery-124.mimecast.com; Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of redhat.com designates 170.10.133.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1619077368; cv=none; d=zohomail.com; s=zohoarc; b=cchSfJj/eDXNsR9aU7iB1ZhV9AU5EMi9v+nraEC69qXGKewmGx36YHWnpMvRj4GYrO8SRX/DoFGu2M2WTXIk/AxXAlq6NpME7azdUFUVjlkc4+q9IwgnSR5h0xeO+UtHUwaamE9ReUJXwu5WXgGpQ4u3VELh+z4Ye50xNGnWd38= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1619077368; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=/OeIPphsBmcC2eAxU6BM5i8j+4IrldbpRsjElmKPrPg=; b=ZrGrTxJyOLUqo0+T5A7m7XHNknuOFT8i2l3g/GwU+wHXEZxLqRZZV7uwy7KMbrNzSpEgtvfRSMSYmB7ElmslFxQRfIaCC7+GSQB0uuQ2oaQBRV9+Z9inSiTLHghFud/K/GKPqYVJzptHu1sAwLeATe0SzlvbGm/Uhz8OrADxe0I= ARC-Authentication-Results: i=1; mx.zohomail.com; spf=pass (zohomail.com: domain of redhat.com designates 170.10.133.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by mx.zohomail.com with SMTPS id 1619077368574926.6315691195616; Thu, 22 Apr 2021 00:42:48 -0700 (PDT) Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-466-xh7cks1DMmaP0-mJ9r2KBg-1; Thu, 22 Apr 2021 03:42:45 -0400 Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 4B01180D6AB; Thu, 22 Apr 2021 07:42:40 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.21]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 1D5DB100F49F; Thu, 22 Apr 2021 07:42:40 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id 9DFC84EA30; Thu, 22 Apr 2021 07:42:39 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.rdu2.redhat.com [10.11.54.4]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id 13M7gcCv025410 for ; Thu, 22 Apr 2021 03:42:38 -0400 Received: by smtp.corp.redhat.com (Postfix) id 1379120FE6D7; Thu, 22 Apr 2021 07:42:38 +0000 (UTC) Received: from mimecast-mx02.redhat.com (mimecast04.extmail.prod.ext.rdu2.redhat.com [10.11.55.20]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 0CC9120FE6DE for ; Thu, 22 Apr 2021 07:42:35 +0000 (UTC) Received: from us-smtp-1.mimecast.com (us-smtp-delivery-1.mimecast.com [205.139.110.120]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 75B8710115E9 for ; Thu, 22 Apr 2021 07:42:35 +0000 (UTC) Received: from m97136.mail.qiye.163.com (m97136.mail.qiye.163.com [220.181.97.136]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-520-F7445heeN1uY--tAxglagw-1; Thu, 22 Apr 2021 03:42:20 -0400 Received: from localhost.localdomain (unknown [58.56.27.130]) by smtp2 (Coremail) with SMTP id iOCowAA3HLYJJYFgMwTJAQ--.5876S9; Thu, 22 Apr 2021 15:26:06 +0800 (CST) X-MC-Unique: xh7cks1DMmaP0-mJ9r2KBg-1 X-MC-Unique: F7445heeN1uY--tAxglagw-1 From: Shi Lei To: libvir-list@redhat.com Subject: [RFCv3 07/25] util: Add some xml-helper-functions to cooperate with xmlgen Date: Thu, 22 Apr 2021 15:25:15 +0800 Message-Id: <20210422072533.312211-8-shi_lei@massclouds.com> In-Reply-To: <20210422072533.312211-1-shi_lei@massclouds.com> References: <20210422072533.312211-1-shi_lei@massclouds.com> MIME-Version: 1.0 X-CM-TRANSID: iOCowAA3HLYJJYFgMwTJAQ--.5876S9 X-Coremail-Antispam: 1Uf129KBjvJXoW3WrWruw45tF4fAF1rCFWDtwb_yoW3KFyrpr ZxKrZ8twn8Ja4fur1vvF1SqryrZF4rWrWUWrs8uw4DCF4fJrnxWr47JF1jgw4UArWDuryY va1rKF18GFWUGF7anT9S1TB71UUUUU7qnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDUYxBIdaVFxhVjvjDU0xZFpf9x0JbMD7hUUUUU= X-Originating-IP: [58.56.27.130] X-CM-SenderInfo: pvklsz1hl6ztxvvfz0xxgvhudrp/1tbicw58T1n5fEdbxQAAsL X-Mimecast-Impersonation-Protect: Policy=CLT - Impersonation Protection Definition; Similar Internal Domain=false; Similar Monitored External Domain=false; Custom External Domain=false; Mimecast External Domain=false; Newly Observed Domain=false; Internal User Name=false; Custom Display Name List=false; Reply-to Address Mismatch=false; Targeted Threat Dictionary=false; Mimecast Threat Dictionary=false; Custom Threat Dictionary=false X-Scanned-By: MIMEDefang 2.78 on 10.11.54.4 X-loop: libvir-list@redhat.com Cc: Shi Lei X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.84 on 10.5.11.22 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=libvir-list-bounces@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" 1) virXMLChildNode and virXMLChildNodeSet Parse xml based on 'node' rather than 'ctxt'. 2) virXMLChildPropString Support to parse child node's property value by path, which is as "child_node_name/prop_name". 3) virXMLChildNodeContent Support to parse child node's content. 4) virBufferIgnore Mark a buffer with the flag 'ignored'. 5) virBufferTouched Check whether the buffer has been touched, which means this buffer has been used or ignored. 6) virBufferInheritIndent Inherit the indentation from another buffer. Signed-off-by: Shi Lei --- src/libvirt_private.syms | 6 ++ src/util/virbuffer.c | 44 ++++++++++++++ src/util/virbuffer.h | 8 ++- src/util/virxml.c | 120 +++++++++++++++++++++++++++++++++++++++ src/util/virxml.h | 6 ++ 5 files changed, 182 insertions(+), 2 deletions(-) diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index e9bb2391..fad0ff71 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -1864,9 +1864,12 @@ virBufferEscapeString; virBufferFreeAndReset; virBufferGetEffectiveIndent; virBufferGetIndent; +virBufferIgnore; +virBufferInheritIndent; virBufferSetIndent; virBufferStrcat; virBufferStrcatVArgs; +virBufferTouched; virBufferTrim; virBufferTrimChars; virBufferTrimLen; @@ -3539,6 +3542,9 @@ virVsockSetGuestCid; virParseScaledValue; virXMLBufferCreate; virXMLCheckIllegalChars; +virXMLChildNode; +virXMLChildNodeSet; +virXMLChildPropString; virXMLExtractNamespaceXML; virXMLFormatElement; virXMLNewNode; diff --git a/src/util/virbuffer.c b/src/util/virbuffer.c index 8f9cd57e..b6f936c8 100644 --- a/src/util/virbuffer.c +++ b/src/util/virbuffer.c @@ -80,6 +80,24 @@ virBufferSetIndent(virBuffer *buf, int indent) } =20 =20 +/** + * virBufferInheritIndent: + * @buf: the buffer + * @frombuf: new indentation size from it. + * + * Just like virBufferSetIndent, but the indentation comes from + * another buffer. + */ +void +virBufferInheritIndent(virBuffer *buf, virBuffer *frombuf) +{ + if (!buf || !frombuf) + return; + + buf->indent =3D virBufferGetEffectiveIndent(frombuf); +} + + /** * virBufferGetIndent: * @buf: the buffer @@ -291,6 +309,32 @@ virBufferUse(const virBuffer *buf) return buf->str->len; } =20 +/** + * virBufferTouched: + * @buf: the buffer to be checked + * + * Return true when the buffer has content or + * it has been ignored(by calling virBufferIgnore); + * otherwise, return false. + */ +bool +virBufferTouched(virBuffer *buf) +{ + return buf->ignored || virBufferUse(buf); +} + +/** + * virBufferIgnore: + * @buf: the buffer to be ignored + * + * Ignore the buffer explicitly. + */ +void +virBufferIgnore(virBuffer *buf) +{ + buf->ignored =3D true; +} + /** * virBufferAsprintf: * @buf: the buffer to append to diff --git a/src/util/virbuffer.h b/src/util/virbuffer.h index 0e72d078..ddb29cb5 100644 --- a/src/util/virbuffer.h +++ b/src/util/virbuffer.h @@ -32,7 +32,7 @@ */ typedef struct _virBuffer virBuffer; =20 -#define VIR_BUFFER_INITIALIZER { NULL, 0 } +#define VIR_BUFFER_INITIALIZER { NULL, 0, false } =20 /** * VIR_BUFFER_INIT_CHILD: @@ -41,11 +41,12 @@ typedef struct _virBuffer virBuffer; * Initialize a virBuffer structure and set up the indentation level for * formatting XML subelements of @parentbuf. */ -#define VIR_BUFFER_INIT_CHILD(parentbuf) { NULL, (parentbuf)->indent + 2 } +#define VIR_BUFFER_INIT_CHILD(parentbuf) { NULL, (parentbuf)->indent + 2, = false } =20 struct _virBuffer { GString *str; int indent; + bool ignored; }; =20 const char *virBufferCurrentContent(virBuffer *buf); @@ -86,6 +87,7 @@ void virBufferURIEncodeString(virBuffer *buf, const char = *str); =20 void virBufferAdjustIndent(virBuffer *buf, int indent); void virBufferSetIndent(virBuffer *, int indent); +void virBufferInheritIndent(virBuffer *buf, virBuffer *frombuf); =20 size_t virBufferGetIndent(const virBuffer *buf); size_t virBufferGetEffectiveIndent(const virBuffer *buf); @@ -94,3 +96,5 @@ void virBufferTrim(virBuffer *buf, const char *trim); void virBufferTrimChars(virBuffer *buf, const char *trim); void virBufferTrimLen(virBuffer *buf, int len); void virBufferAddStr(virBuffer *buf, const char *str); +bool virBufferTouched(virBuffer *buf); +void virBufferIgnore(virBuffer *buf); diff --git a/src/util/virxml.c b/src/util/virxml.c index 5ceef738..a6e50459 100644 --- a/src/util/virxml.c +++ b/src/util/virxml.c @@ -1746,3 +1746,123 @@ virXMLNewNode(xmlNsPtr ns, =20 return ret; } + + +/** + * virXMLChildNode: + * @node: Parent XML dom node pointer + * @name: Name of the child element + * + * Convenience function to return the child element of a XML node. + * + * Returns the pointer of child element node or NULL in case of failure. + * If there are many nodes match condition, it only returns the first node. + */ +xmlNodePtr +virXMLChildNode(xmlNodePtr node, const char *name) +{ + xmlNodePtr cur =3D node->children; + while (cur) { + if (cur->type =3D=3D XML_ELEMENT_NODE && virXMLNodeNameEqual(cur, = name)) + return cur; + cur =3D cur->next; + } + return NULL; +} + + +/** + * virXMLChildPropString: + * @node: Parent XML dom node pointer + * @path: Path of the property (attribute) to get + * + * Convenience function to return copy of an attribute value by a path. + * Path consists of names of child elements and an attribute. + * The delimiter is '/'. + * + * E.g.: For , + * the path is 'son/grandSon/name' to get attribute 'name'. + * + * Returns the property (attribute) value as string or NULL in case of fai= lure. + * The caller is responsible for freeing the returned buffer. + */ +char * +virXMLChildPropString(xmlNodePtr node, const char *path) +{ + char *next; + char *sep; + xmlNodePtr tnode =3D node; + g_autofree char *tmp =3D NULL; + tmp =3D g_strdup(path); + + next =3D tmp; + while ((sep =3D strchr(next, '/'))) { + *sep =3D '\0'; + + if ((tnode =3D virXMLChildNode(tnode, next)) =3D=3D NULL) + return NULL; + + next =3D sep + 1; + } + + return virXMLPropString(tnode, next); +} + + +/** + * virXMLChildNodeSet: + * @node: Parent XML dom node pointer + * @name: Name of the children element + * @list: the returned list of nodes (or NULL if only count matters) + * + * Convenience function to evaluate a set of children elements + * + * Returns the number of nodes found in which case @list is set (and + * must be freed) or -1 if the evaluation failed. + */ +int +virXMLChildNodeSet(xmlNodePtr node, const char *name, xmlNodePtr **list) +{ + size_t count =3D 0; + xmlNodePtr cur =3D node->children; + + if (list !=3D NULL) + *list =3D NULL; + + while (cur) { + if (cur->type =3D=3D XML_ELEMENT_NODE && virXMLNodeNameEqual(cur, = name)) { + if (list !=3D NULL) { + if (VIR_APPEND_ELEMENT_COPY(*list, count, cur) < 0) + return -1; + } else { + count++; + } + } + cur =3D cur->next; + } + return count; +} + + +/** + * virXMLChildNodeContent: + * @node: XML parent node pointer + * @name: child node name + * + * Convenience function to return copy of content of an child node. + * E.g., for content, call + * virXMLChildNodeContent(parent_node_ptr, "child") to get the content + * of the child node. + * + * Returns the content value as string or NULL in case of failure. + * The caller is responsible for freeing the returned buffer. + */ +char * +virXMLChildNodeContent(xmlNodePtr node, const char *name) +{ + xmlNodePtr child =3D virXMLChildNode(node, name); + if (!child) + return NULL; + + return virXMLNodeContentString(child); +} diff --git a/src/util/virxml.h b/src/util/virxml.h index c83d16a1..7dac1d3e 100644 --- a/src/util/virxml.h +++ b/src/util/virxml.h @@ -134,6 +134,10 @@ virXMLPropUInt(xmlNodePtr node, unsigned int *result) ATTRIBUTE_NONNULL(0) ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(4); =20 +xmlNodePtr virXMLChildNode(xmlNodePtr node, const char *name); +int virXMLChildNodeSet(xmlNodePtr node, const char *name, xmlNodePtr **lis= t); +char * virXMLChildPropString(xmlNodePtr node, const char *path); + int virXMLPropEnum(xmlNodePtr node, const char* name, @@ -375,3 +379,5 @@ virXMLBufferCreate(void); xmlNodePtr virXMLNewNode(xmlNsPtr ns, const char *name); + +char * virXMLChildNodeContent(xmlNodePtr node, const char *name); --=20 2.25.1 From nobody Tue Apr 23 19:28:24 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 216.205.24.124 as permitted sender) client-ip=216.205.24.124; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-delivery-124.mimecast.com; Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of redhat.com designates 216.205.24.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1619076711; cv=none; d=zohomail.com; s=zohoarc; b=A4S71iQ+1+atUIBIauDfZQlCYNVpjYccg0jNt96N3xfRYMFWHiGIyO9Un60GkElTiFgCVTmsTR6oRKDWOXtC8xTqYr+ILnzCC+VwESDcuinFRPQ5f4WIQvP3M/YhVKJT02H41RpWPOTa0NrN+YGUNtmUmC/93ByOwoHj+m9eGd0= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1619076711; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=RABx1kKGQnEvIhPoW+KWFBNccFMOF9+gl0HgSJozvbg=; b=WKxPdmHmBjVg6vfNRIi22Bguw9hfVvM2C8FtAou0acz8FljRQ8CygDcUSPOqDDguk7H1psho8o53unNATudxWTj5xrjL2kZgVCp4jXVd7EM8X9inAZ+n/1DtNtwAm21ARg92cxm5hjdv0BVXxQyxO91eYt8XynZ9xTRWSXKSczA= ARC-Authentication-Results: i=1; mx.zohomail.com; spf=pass (zohomail.com: domain of redhat.com designates 216.205.24.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [216.205.24.124]) by mx.zohomail.com with SMTPS id 1619076711340710.8911293402367; Thu, 22 Apr 2021 00:31:51 -0700 (PDT) Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-585-kXEZC-XwP6iqn7VinO0W8g-1; Thu, 22 Apr 2021 03:31:48 -0400 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id C4310107ACE6; Thu, 22 Apr 2021 07:31:40 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.20]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 407935C260; Thu, 22 Apr 2021 07:31:37 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id 342101806D1A; Thu, 22 Apr 2021 07:31:32 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.rdu2.redhat.com [10.11.54.5]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id 13M7VTUY023774 for ; Thu, 22 Apr 2021 03:31:29 -0400 Received: by smtp.corp.redhat.com (Postfix) id 13CDAF8965; Thu, 22 Apr 2021 07:31:29 +0000 (UTC) Received: from mimecast-mx02.redhat.com (mimecast02.extmail.prod.ext.rdu2.redhat.com [10.11.55.18]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 0F2A2F896A for ; Thu, 22 Apr 2021 07:31:26 +0000 (UTC) Received: from us-smtp-1.mimecast.com (us-smtp-1.mimecast.com [207.211.31.81]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 384B3A2881D for ; Thu, 22 Apr 2021 07:31:26 +0000 (UTC) Received: from m97136.mail.qiye.163.com (m97136.mail.qiye.163.com [220.181.97.136]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-597-wZi6OTg8NCG9Le7IZj0PNQ-1; Thu, 22 Apr 2021 03:31:22 -0400 Received: from localhost.localdomain (unknown [58.56.27.130]) by smtp2 (Coremail) with SMTP id iOCowAA3HLYJJYFgMwTJAQ--.5876S10; Thu, 22 Apr 2021 15:26:06 +0800 (CST) X-MC-Unique: kXEZC-XwP6iqn7VinO0W8g-1 X-MC-Unique: wZi6OTg8NCG9Le7IZj0PNQ-1 From: Shi Lei To: libvir-list@redhat.com Subject: [RFCv3 08/25] util: Add helper aliases and functions for 'bool' and 'time_t' to cooperate with xmlgen Date: Thu, 22 Apr 2021 15:25:16 +0800 Message-Id: <20210422072533.312211-9-shi_lei@massclouds.com> In-Reply-To: <20210422072533.312211-1-shi_lei@massclouds.com> References: <20210422072533.312211-1-shi_lei@massclouds.com> MIME-Version: 1.0 X-CM-TRANSID: iOCowAA3HLYJJYFgMwTJAQ--.5876S10 X-Coremail-Antispam: 1Uf129KBjvJXoWxKw4fZw15WFWxGrW5tryxZrb_yoW7ZF1xpa yxGa1fAryqq3Z3G397Ka4kGr13Zr4Fqr43Xwsxuw1kGF4Iyr1jyrsxJF98ua15GFZFgr43 tr9Yqry5C3ZxJw7anT9S1TB71UUUUU7qnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDUYxBIdaVFxhVjvjDU0xZFpf9x0JbMD7hUUUUU= X-Originating-IP: [58.56.27.130] X-CM-SenderInfo: pvklsz1hl6ztxvvfz0xxgvhudrp/1tbiegV8T1qri0QjWQAAsI X-Mimecast-Impersonation-Protect: Policy=CLT - Impersonation Protection Definition; Similar Internal Domain=false; Similar Monitored External Domain=false; Custom External Domain=false; Mimecast External Domain=false; Newly Observed Domain=false; Internal User Name=false; Custom Display Name List=false; Reply-to Address Mismatch=false; Targeted Threat Dictionary=false; Mimecast Threat Dictionary=false; Custom Threat Dictionary=false X-Scanned-By: MIMEDefang 2.79 on 10.11.54.5 X-loop: libvir-list@redhat.com Cc: Shi Lei X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=libvir-list-bounces@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add three aliases virBoolYesNo, virBoolOnOff and virBoolTrueFalse for type 'bool'. The tool xmlgen depends on them to determine their ture values in XML. Also, add corresponding functions to parse them. Add virStrToTime and virTimeFormatBuf to convert 'time_t' and 'string'. Add virStrToLong_u8p to convert 'string' to 'uint_8'. Signed-off-by: Shi Lei --- src/internal.h | 8 +++ src/libvirt_private.syms | 5 ++ src/util/virstring.c | 102 +++++++++++++++++++++++++++++++++++++++ src/util/virstring.h | 15 ++++++ 4 files changed, 130 insertions(+) diff --git a/src/internal.h b/src/internal.h index 0a03dfc4..3342934f 100644 --- a/src/internal.h +++ b/src/internal.h @@ -529,3 +529,11 @@ enum { # define fprintf(fh, ...) g_fprintf(fh, __VA_ARGS__) =20 #endif /* VIR_NO_GLIB_STDIO */ + +/* These are aliases for bool. + * The xmlgen depends on them to determine their true values + * in XML. + */ +typedef bool virBoolYesNo; /* True values: 'yes', 'no' */ +typedef bool virBoolOnOff; /* True values: 'on', 'off' */ +typedef bool virBoolTrueFalse; /* True values: 'true', 'false' */ diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index fad0ff71..e78491dc 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -3275,6 +3275,9 @@ virStringStripIPv6Brackets; virStringStripSuffix; virStringToUpper; virStringTrimOptionalNewline; +virStrToBoolOnOff; +virStrToBoolTrueFalse; +virStrToBoolYesNo; virStrToDouble; virStrToLong_i; virStrToLong_l; @@ -3285,6 +3288,8 @@ virStrToLong_ul; virStrToLong_ull; virStrToLong_ullp; virStrToLong_ulp; +virStrToTime; +virTimeFormatBuf; virTrimSpaces; =20 =20 diff --git a/src/util/virstring.c b/src/util/virstring.c index a2c07e5c..ac6c0aae 100644 --- a/src/util/virstring.c +++ b/src/util/virstring.c @@ -233,6 +233,21 @@ virStrToLong_ulp(char const *s, char **end_ptr, int ba= se, return 0; } =20 +/* Just like virStrToLong_uip, above, but produce an "uint8_t" value. + * This version rejects any negative signs. */ +int +virStrToLong_u8p(char const *s, char **end_ptr, int base, uint8_t *result) +{ + unsigned int val; + int ret; + ret =3D virStrToLong_uip(s, end_ptr, base, &val); + if (ret < 0 || val > 0xff) + return -1; + + *result =3D (uint8_t) val; + return 0; +} + /* Just like virStrToLong_i, above, but produce a "long long" value. */ int virStrToLong_ll(char const *s, char **end_ptr, int base, long long *result) @@ -1077,3 +1092,90 @@ int virStringParseYesNo(const char *str, bool *resul= t) =20 return 0; } + + +int +virStrToBoolYesNo(const char *str, bool *result) +{ + if (STREQ(str, "yes")) + *result =3D true; + else if (STREQ(str, "no")) + *result =3D false; + else + return -1; + + return 0; +} + + +int +virStrToBoolOnOff(const char *str, bool *result) +{ + if (STREQ(str, "on")) + *result =3D true; + else if (STREQ(str, "off")) + *result =3D false; + else + return -1; + + return 0; +} + + +int +virStrToBoolTrueFalse(const char *str, bool *result) +{ + if (STREQ(str, "true")) + *result =3D true; + else if (STREQ(str, "false")) + *result =3D false; + else + return -1; + + return 0; +} + + +int virStrToTime(const char *str, time_t *result) +{ + g_autoptr(GDateTime) then =3D NULL; + g_autoptr(GTimeZone) tz =3D g_time_zone_new_utc(); + char *tmp; + int year, mon, mday, hour, min, sec; + + /* Expect: YYYY-MM-DDTHH:MM:SS (%d-%d-%dT%d:%d:%d) eg 2010-11-28T14:2= 9:01 */ + if (/* year */ + virStrToLong_i(str, &tmp, 10, &year) < 0 || *tmp !=3D '-' || + /* month */ + virStrToLong_i(tmp+1, &tmp, 10, &mon) < 0 || *tmp !=3D '-' || + /* day */ + virStrToLong_i(tmp+1, &tmp, 10, &mday) < 0 || *tmp !=3D 'T' || + /* hour */ + virStrToLong_i(tmp+1, &tmp, 10, &hour) < 0 || *tmp !=3D ':' || + /* minute */ + virStrToLong_i(tmp+1, &tmp, 10, &min) < 0 || *tmp !=3D ':' || + /* second */ + virStrToLong_i(tmp+1, &tmp, 10, &sec) < 0 || *tmp !=3D '\0') { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("invalid time '%s', expect YYYY-MM-DDTHH:MM:SS"), + str); + return -1; + } + + then =3D g_date_time_new(tz, year, mon, mday, hour, min, sec); + *result =3D (time_t)g_date_time_to_unix(then); + return 0; +} + + +int +virTimeFormatBuf(virBuffer *buf, const char *layout, const time_t time) +{ + g_autoptr(GDateTime) then =3D NULL; + g_autofree char *thenstr =3D NULL; + + then =3D g_date_time_new_from_unix_utc(time); + thenstr =3D g_date_time_format(then, "%Y-%m-%dT%H:%M:%S"); + virBufferAsprintf(buf, layout, thenstr); + return 0; +} diff --git a/src/util/virstring.h b/src/util/virstring.h index 7cc1d8c5..e16da824 100644 --- a/src/util/virstring.h +++ b/src/util/virstring.h @@ -19,6 +19,7 @@ #pragma once =20 #include "internal.h" +#include "virbuffer.h" =20 #define VIR_INT64_STR_BUFLEN 21 =20 @@ -59,6 +60,11 @@ int virStrToLong_ulp(char const *s, int base, unsigned long *result) G_GNUC_WARN_UNUSED_RESULT; +int virStrToLong_u8p(char const *s, + char **end_ptr, + int base, + uint8_t *result) + G_GNUC_WARN_UNUSED_RESULT; int virStrToLong_ll(char const *s, char **end_ptr, int base, @@ -141,3 +147,12 @@ int virStringParsePort(const char *str, int virStringParseYesNo(const char *str, bool *result) G_GNUC_WARN_UNUSED_RESULT; + +int virStrToBoolYesNo(const char *str, bool *result); +int virStrToBoolOnOff(const char *str, bool *result); +int virStrToBoolTrueFalse(const char *str, bool *result); + +int virStrToTime(const char *str, time_t *result) + G_GNUC_WARN_UNUSED_RESULT; + +int virTimeFormatBuf(virBuffer *buf, const char *layout, const time_t time= ); --=20 2.25.1 From nobody Tue Apr 23 19:28:24 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 216.205.24.124 as permitted sender) client-ip=216.205.24.124; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-delivery-124.mimecast.com; Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of redhat.com designates 216.205.24.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1619076757; cv=none; d=zohomail.com; s=zohoarc; b=aBU9ApHUG8e2gOEp3KE2JJsKnDdcjaiOP3T8z7XcK1/9scGxX2RShGQn6eyWc8moIy40ow7XsOkeHnPmHdBGfkCvPXU1kmfrGq9tLLYl2NCXyOe8ek/PzMTX/76LZIKGZkjFkXx78I4ngRDr8CF1IvrV96qe3CrCHIbJ15JHhkY= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1619076757; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=E66ICDOVNikWB/1DL4Xe6lcSJmL4YQzvhS2xqnfRAyE=; b=PdWhZXn3kWivaimrOXtFX+o9q30iQNUctCxOfvAUqONvGRgxXLrj/qtZnhDE0ur1BZBX3EhXgb8Oy8S/K0lagCRNt7AkQwxrSrOygmtntx1ZHCHDxqbF7uhqO5/9QgqSAGZ7e54izmoo7d3MN6v1NUtRRghccGx7uyBZFigwQ2Q= ARC-Authentication-Results: i=1; mx.zohomail.com; spf=pass (zohomail.com: domain of redhat.com designates 216.205.24.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [216.205.24.124]) by mx.zohomail.com with SMTPS id 1619076757839815.1685040980145; Thu, 22 Apr 2021 00:32:37 -0700 (PDT) Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-325-WYwOjd7ZPmyRF-pl6XX6bA-1; Thu, 22 Apr 2021 03:32:33 -0400 Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 43BEE343BD; Thu, 22 Apr 2021 07:32:27 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.20]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 1335210016FD; Thu, 22 Apr 2021 07:32:27 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id D03011806D25; Thu, 22 Apr 2021 07:32:26 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.rdu2.redhat.com [10.11.54.4]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id 13M7VVms023800 for ; Thu, 22 Apr 2021 03:31:31 -0400 Received: by smtp.corp.redhat.com (Postfix) id 3A4D720FE6D1; Thu, 22 Apr 2021 07:31:31 +0000 (UTC) Received: from mimecast-mx02.redhat.com (mimecast05.extmail.prod.ext.rdu2.redhat.com [10.11.55.21]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 348C420FE6D0 for ; Thu, 22 Apr 2021 07:31:31 +0000 (UTC) Received: from us-smtp-1.mimecast.com (us-smtp-1.mimecast.com [207.211.31.81]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 1D11185338A for ; Thu, 22 Apr 2021 07:31:31 +0000 (UTC) Received: from m97136.mail.qiye.163.com (m97136.mail.qiye.163.com [220.181.97.136]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-185-7amtf4PGOD6_3Jve6H-V6Q-1; Thu, 22 Apr 2021 03:31:26 -0400 Received: from localhost.localdomain (unknown [58.56.27.130]) by smtp2 (Coremail) with SMTP id iOCowAA3HLYJJYFgMwTJAQ--.5876S11; Thu, 22 Apr 2021 15:26:06 +0800 (CST) X-MC-Unique: WYwOjd7ZPmyRF-pl6XX6bA-1 X-MC-Unique: 7amtf4PGOD6_3Jve6H-V6Q-1 From: Shi Lei To: libvir-list@redhat.com Subject: [RFCv3 09/25] util: Add parsexml/formatbuf helper functions for virSocketAddr Date: Thu, 22 Apr 2021 15:25:17 +0800 Message-Id: <20210422072533.312211-10-shi_lei@massclouds.com> In-Reply-To: <20210422072533.312211-1-shi_lei@massclouds.com> References: <20210422072533.312211-1-shi_lei@massclouds.com> MIME-Version: 1.0 X-CM-TRANSID: iOCowAA3HLYJJYFgMwTJAQ--.5876S11 X-Coremail-Antispam: 1Uf129KBjvJXoWxAw43Jw4xKF1kZw45uF13XFb_yoWrArWkpF 15twn8XFW8tws3Zw4Iqr4Y9r1ftF18XayUXa47uw10krs8J3W3t3ZFqFy3Gr1rJFWjyF48 XFn8GrWkCF4UJF7anT9S1TB71UUUUU7qnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDUYxBIdaVFxhVjvjDU0xZFpf9x0JbMD7hUUUUU= X-Originating-IP: [58.56.27.130] X-CM-SenderInfo: pvklsz1hl6ztxvvfz0xxgvhudrp/1tbiXA58T1i2lRiHegAAs- X-Mimecast-Impersonation-Protect: Policy=CLT - Impersonation Protection Definition; Similar Internal Domain=false; Similar Monitored External Domain=false; Custom External Domain=false; Mimecast External Domain=false; Newly Observed Domain=false; Internal User Name=false; Custom Display Name List=false; Reply-to Address Mismatch=false; Targeted Threat Dictionary=false; Mimecast Threat Dictionary=false; Custom Threat Dictionary=false X-Scanned-By: MIMEDefang 2.78 on 10.11.54.4 X-loop: libvir-list@redhat.com Cc: Shi Lei X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.84 on 10.5.11.22 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=libvir-list-bounces@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Implement the parsexml/formatbuf functions for virSocketAddr. Signed-off-by: Shi Lei --- src/libvirt_private.syms | 2 ++ src/util/virsocketaddr.c | 42 ++++++++++++++++++++++++++++++++++++++++ src/util/virsocketaddr.h | 23 ++++++++++++++++++++-- 3 files changed, 65 insertions(+), 2 deletions(-) diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index e78491dc..055396d0 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -3213,6 +3213,7 @@ virSocketAddrBroadcastByPrefix; virSocketAddrCheckNetmask; virSocketAddrEqual; virSocketAddrFormat; +virSocketAddrFormatBuf; virSocketAddrFormatFull; virSocketAddrGetIPPrefix; virSocketAddrGetNumNetmaskBits; @@ -3230,6 +3231,7 @@ virSocketAddrParse; virSocketAddrParseAny; virSocketAddrParseIPv4; virSocketAddrParseIPv6; +virSocketAddrParseXML; virSocketAddrPrefixToNetmask; virSocketAddrPTRDomain; virSocketAddrResolveService; diff --git a/src/util/virsocketaddr.c b/src/util/virsocketaddr.c index 94cbfc62..fcad7f8a 100644 --- a/src/util/virsocketaddr.c +++ b/src/util/virsocketaddr.c @@ -154,6 +154,15 @@ int virSocketAddrParse(virSocketAddr *addr, const char= *val, int family) return len; } =20 +int virSocketAddrParseXML(const char *val, + virSocketAddr *addr, + const char *instname G_GNUC_UNUSED, + void *parent G_GNUC_UNUSED, + void *opaque G_GNUC_UNUSED) +{ + return virSocketAddrParse(addr, val, AF_UNSPEC); +} + /** * virSocketAddrParseAny: * @addr: where to store the return value, optional. @@ -1306,3 +1315,36 @@ virSocketAddrFree(virSocketAddr *addr) { g_free(addr); } + +void +virSocketAddrClear(virSocketAddr *addr) +{ + memset(addr, 0, sizeof(virSocketAddr)); +} + +int +virSocketAddrFormatBuf(virBuffer *buf, + const char *fmt, + const virSocketAddr *addr, + const void *parent G_GNUC_UNUSED, + void *opaque G_GNUC_UNUSED) +{ + g_autofree char *str =3D NULL; + if (!VIR_SOCKET_ADDR_VALID(addr)) + return 0; + + str =3D virSocketAddrFormatFull(addr, false, NULL); + if (!str) + return -1; + + virBufferAsprintf(buf, fmt, str); + return 0; +} + +bool +virSocketAddrCheck(const virSocketAddr *addr, + const void *parent G_GNUC_UNUSED, + void *opaque G_GNUC_UNUSED) +{ + return VIR_SOCKET_ADDR_VALID(addr); +} diff --git a/src/util/virsocketaddr.h b/src/util/virsocketaddr.h index f76e2297..cba87390 100644 --- a/src/util/virsocketaddr.h +++ b/src/util/virsocketaddr.h @@ -18,11 +18,13 @@ =20 #pragma once =20 +#include "virbuffer.h" #include "virsocket.h" =20 #define VIR_LOOPBACK_IPV4_ADDR "127.0.0.1" =20 -typedef struct { +typedef struct _virSocketAddr virSocketAddr; +struct _virSocketAddr { union { struct sockaddr sa; struct sockaddr_storage stor; @@ -33,7 +35,7 @@ typedef struct { #endif } data; socklen_t len; -} virSocketAddr; +}; =20 #define VIR_SOCKET_ADDR_VALID(s) \ ((s)->data.sa.sa_family !=3D AF_UNSPEC) @@ -66,6 +68,12 @@ int virSocketAddrParse(virSocketAddr *addr, const char *val, int family); =20 +int virSocketAddrParseXML(const char *val, + virSocketAddr *addr, + const char *instname, + void *parent, + void *opaque); + int virSocketAddrParseAny(virSocketAddr *addr, const char *val, int family, @@ -89,6 +97,12 @@ char *virSocketAddrFormatFull(const virSocketAddr *addr, bool withService, const char *separator); =20 +int virSocketAddrFormatBuf(virBuffer *buf, + const char *fmt, + const virSocketAddr *addr, + const void *parent, + void *opaque); + char *virSocketAddrGetPath(virSocketAddr *addr); =20 int virSocketAddrSetPort(virSocketAddr *addr, int port); @@ -141,5 +155,10 @@ int virSocketAddrPTRDomain(const virSocketAddr *addr, ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(3); =20 void virSocketAddrFree(virSocketAddr *addr); +void virSocketAddrClear(virSocketAddr *addr); =20 G_DEFINE_AUTOPTR_CLEANUP_FUNC(virSocketAddr, virSocketAddrFree); + +bool virSocketAddrCheck(const virSocketAddr *addr, + const void *parent, + void *opaque); --=20 2.25.1 From nobody Tue Apr 23 19:28:24 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 170.10.133.124 as permitted sender) client-ip=170.10.133.124; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-delivery-124.mimecast.com; Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of redhat.com designates 170.10.133.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1619076821; cv=none; d=zohomail.com; s=zohoarc; b=hze7UKqe1SdW+Cmk4TbliAhznOdKGrEdDypiTz4YefAU+m6TH9vF1HM3HDxUjEMN3xZuyNQCkIVFVJsOjKm1KoyQaAlwEHlrNhNZCN9yFa1NF1ebR9x7t/UwsaLq1bOw/GUVxx7DENVLLgb3PztdDrV8D4mGTcQ/TZCQieWR89M= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1619076821; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=91lqp+MOThrPXa1TlaOswtrFzXUUpwPCGU2LPfSr9dg=; b=Puv8h9oVUeP0cT1I7noJijVHhAGg3Cs0DsG453xwPJNQwCan/dA+iKKhrO6MY1Ocz6k3H4EVQCMo7ABP9fG8QTxJFKfIbYTmPbJkuURcZNFu105dMNXilfrcbq7kthhlgY1VNJ7V/GeJOGLv/MRcfG2JWvqzdLwtumrBV38Cl2w= ARC-Authentication-Results: i=1; mx.zohomail.com; spf=pass (zohomail.com: domain of redhat.com designates 170.10.133.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by mx.zohomail.com with SMTPS id 1619076821866507.78504820241835; Thu, 22 Apr 2021 00:33:41 -0700 (PDT) Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-64-H6jVj4LTPoOP1A3VClyltQ-1; Thu, 22 Apr 2021 03:32:32 -0400 Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id AD53887A826; Thu, 22 Apr 2021 07:32:27 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.21]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 8C2342CC9B; Thu, 22 Apr 2021 07:32:27 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id 4E2EA44A63; Thu, 22 Apr 2021 07:32:27 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.rdu2.redhat.com [10.11.54.5]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id 13M7WGjm023949 for ; Thu, 22 Apr 2021 03:32:16 -0400 Received: by smtp.corp.redhat.com (Postfix) id 633ECF8962; Thu, 22 Apr 2021 07:32:16 +0000 (UTC) Received: from mimecast-mx02.redhat.com (mimecast03.extmail.prod.ext.rdu2.redhat.com [10.11.55.19]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 5EFC0F8964 for ; Thu, 22 Apr 2021 07:32:13 +0000 (UTC) Received: from us-smtp-1.mimecast.com (us-smtp-1.mimecast.com [207.211.31.81]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 7AE10803F4A for ; Thu, 22 Apr 2021 07:32:13 +0000 (UTC) Received: from m97136.mail.qiye.163.com (m97136.mail.qiye.163.com [220.181.97.136]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-315-pt76pnemORav6148Gio7qQ-1; Thu, 22 Apr 2021 03:32:10 -0400 Received: from localhost.localdomain (unknown [58.56.27.130]) by smtp2 (Coremail) with SMTP id iOCowAA3HLYJJYFgMwTJAQ--.5876S12; Thu, 22 Apr 2021 15:26:06 +0800 (CST) X-MC-Unique: H6jVj4LTPoOP1A3VClyltQ-1 X-MC-Unique: pt76pnemORav6148Gio7qQ-1 From: Shi Lei To: libvir-list@redhat.com Subject: [RFCv3 10/25] util: Add virUUID type and parse/format functions Date: Thu, 22 Apr 2021 15:25:18 +0800 Message-Id: <20210422072533.312211-11-shi_lei@massclouds.com> In-Reply-To: <20210422072533.312211-1-shi_lei@massclouds.com> References: <20210422072533.312211-1-shi_lei@massclouds.com> MIME-Version: 1.0 X-CM-TRANSID: iOCowAA3HLYJJYFgMwTJAQ--.5876S12 X-Coremail-Antispam: 1Uf129KBjDUn29KB7ZKAUJUUUU8529EdanIXcx71UUUUU7v73 VFW2AGmfu7bjvjm3AaLaJ3UbIYCTnIWIevJa73UjIFyTuYvjfULt8eDUUUU X-Originating-IP: [58.56.27.130] X-CM-SenderInfo: pvklsz1hl6ztxvvfz0xxgvhudrp/1tbiVxl8T1f4qOiFZgAAsx X-Mimecast-Impersonation-Protect: Policy=CLT - Impersonation Protection Definition; Similar Internal Domain=false; Similar Monitored External Domain=false; Custom External Domain=false; Mimecast External Domain=false; Newly Observed Domain=false; Internal User Name=false; Custom Display Name List=false; Reply-to Address Mismatch=false; Targeted Threat Dictionary=false; Mimecast Threat Dictionary=false; Custom Threat Dictionary=false X-Scanned-By: MIMEDefang 2.79 on 10.11.54.5 X-loop: libvir-list@redhat.com Cc: Shi Lei X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.15 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=libvir-list-bounces@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Signed-off-by: Shi Lei --- src/util/viruuid.c | 31 +++++++++++++++++++++++++++++++ src/util/viruuid.h | 18 ++++++++++++++++++ 2 files changed, 49 insertions(+) diff --git a/src/util/viruuid.c b/src/util/viruuid.c index 558fbb9c..c6e6272f 100644 --- a/src/util/viruuid.c +++ b/src/util/viruuid.c @@ -134,6 +134,18 @@ virUUIDParse(const char *uuidstr, unsigned char *uuid) return 0; } =20 + +int +virUUIDParseXML(const char *uuidstr, + virUUID *puuid, + const char *instname G_GNUC_UNUSED, + void *parent G_GNUC_UNUSED, + void *opaque G_GNUC_UNUSED) +{ + return virUUIDParse(uuidstr, *puuid); +} + + /** * virUUIDFormat: * @uuid: array of VIR_UUID_BUFLEN bytes to store the raw UUID @@ -159,6 +171,20 @@ virUUIDFormat(const unsigned char *uuid, char *uuidstr) } =20 =20 +int +virUUIDFormatBuf(virBuffer *buf, + const char *fmt, + const virUUID *puuid, + const void *parent G_GNUC_UNUSED, + void *opaque G_GNUC_UNUSED) +{ + char uuidstr[VIR_UUID_STRING_BUFLEN]; + virUUIDFormat(*puuid, uuidstr); + virBufferAsprintf(buf, fmt, uuidstr); + + return 0; +} + =20 /** * virUUIDIsValid @@ -263,3 +289,8 @@ int virGetHostUUID(unsigned char *uuid) =20 return ret; } + +void virUUIDClear(virUUID *puuid G_GNUC_UNUSED) +{ + memset(*puuid, 0, VIR_UUID_BUFLEN); +} diff --git a/src/util/viruuid.h b/src/util/viruuid.h index b403b190..36766356 100644 --- a/src/util/viruuid.h +++ b/src/util/viruuid.h @@ -21,6 +21,7 @@ #pragma once =20 #include "internal.h" +#include "virbuffer.h" =20 =20 /** @@ -39,6 +40,7 @@ } \ } while (0) =20 +typedef unsigned char virUUID[VIR_UUID_BUFLEN]; =20 int virSetHostUUIDStr(const char *host_uuid); int virGetHostUUID(unsigned char *host_uuid) ATTRIBUTE_NONNULL(1) G_GNUC_N= O_INLINE; @@ -51,5 +53,21 @@ int virUUIDParse(const char *uuidstr, unsigned char *uuid) ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) G_GNUC_WARN_UNUSED_RESULT; =20 +int +virUUIDParseXML(const char *uuidstr, + virUUID *puuid, + const char *instname, + void *parent, + void *opaque); + const char *virUUIDFormat(const unsigned char *uuid, char *uuidstr) ATTRIBUTE_NONNULL(1) ATTRIBUTE_NO= NNULL(2); + +int +virUUIDFormatBuf(virBuffer *buf, + const char *fmt, + const virUUID *puuid, + const void *parent, + void *opaque); + +void virUUIDClear(virUUID *puuid); --=20 2.25.1 From nobody Tue Apr 23 19:28:24 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 216.205.24.124 as permitted sender) client-ip=216.205.24.124; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-delivery-124.mimecast.com; Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of redhat.com designates 216.205.24.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1619077401; cv=none; d=zohomail.com; s=zohoarc; b=lcIs/ncrk3gITBkna6BCi1vei9XoUCn8PfYu5w37RPd6L65wpOD8c0iVCSMUj7m5sezPq/h9sotomNOXw1dgdfYea28bO+67PD8DvdTmXKfHvX9u8OFfuiABuQfIyLM4zSLXx1RNvwZo45yDL0mIhIrmA4fUSM8U+02mCcAp/78= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1619077401; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=0vvRVEhvGdI7GKBdgyKj0OzmCkigmahf0y+r0L1Faio=; b=gr4YQz9ZMwjHKelRrpJzjASBXRaymyshYEub9umldGRqL79djKez3y2VmxDVro2wZDW4JIES6Wong6q+ZJv3R+8iHKANgB5GX5dTGRd8PRDL+EN2MSg4ajteIkepl/CqWVQOtR0gn3dVEXNCzJ7qV7SCVABmYzjA4pu7fpBnKr8= ARC-Authentication-Results: i=1; mx.zohomail.com; spf=pass (zohomail.com: domain of redhat.com designates 216.205.24.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [216.205.24.124]) by mx.zohomail.com with SMTPS id 16190774011401005.6760636927586; Thu, 22 Apr 2021 00:43:21 -0700 (PDT) Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-467-ELP6PnfGPGeDXfsb0L_wJw-1; Thu, 22 Apr 2021 03:39:41 -0400 Received: from smtp.corp.redhat.com (int-mx08.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 92B34343A7; Thu, 22 Apr 2021 07:43:11 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.20]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 63EC61972B; Thu, 22 Apr 2021 07:43:11 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id 22EE61806D1B; Thu, 22 Apr 2021 07:43:11 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.rdu2.redhat.com [10.11.54.5]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id 13M7h9bW025500 for ; Thu, 22 Apr 2021 03:43:10 -0400 Received: by smtp.corp.redhat.com (Postfix) id D227FF896A; Thu, 22 Apr 2021 07:43:09 +0000 (UTC) Received: from mimecast-mx02.redhat.com (mimecast04.extmail.prod.ext.rdu2.redhat.com [10.11.55.20]) by smtp.corp.redhat.com (Postfix) with ESMTPS id CE65AF896E for ; Thu, 22 Apr 2021 07:43:07 +0000 (UTC) Received: from us-smtp-1.mimecast.com (us-smtp-delivery-1.mimecast.com [207.211.31.120]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 25ADE101A539 for ; Thu, 22 Apr 2021 07:43:07 +0000 (UTC) Received: from m97136.mail.qiye.163.com (m97136.mail.qiye.163.com [220.181.97.136]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-431-uMiOlviZP_uQyBBPWDL_KQ-1; Thu, 22 Apr 2021 03:42:26 -0400 Received: from localhost.localdomain (unknown [58.56.27.130]) by smtp2 (Coremail) with SMTP id iOCowAA3HLYJJYFgMwTJAQ--.5876S13; Thu, 22 Apr 2021 15:26:07 +0800 (CST) X-MC-Unique: ELP6PnfGPGeDXfsb0L_wJw-1 X-MC-Unique: uMiOlviZP_uQyBBPWDL_KQ-1 From: Shi Lei To: libvir-list@redhat.com Subject: [RFCv3 11/25] conf: Extract error-checking code from virNetworkDNSTxtDefParseXML Date: Thu, 22 Apr 2021 15:25:19 +0800 Message-Id: <20210422072533.312211-12-shi_lei@massclouds.com> In-Reply-To: <20210422072533.312211-1-shi_lei@massclouds.com> References: <20210422072533.312211-1-shi_lei@massclouds.com> MIME-Version: 1.0 X-CM-TRANSID: iOCowAA3HLYJJYFgMwTJAQ--.5876S13 X-Coremail-Antispam: 1Uf129KBjDUn29KB7ZKAUJUUUU8529EdanIXcx71UUUUU7v73 VFW2AGmfu7bjvjm3AaLaJ3UbIYCTnIWIevJa73UjIFyTuYvjfULt8eDUUUU X-Originating-IP: [58.56.27.130] X-CM-SenderInfo: pvklsz1hl6ztxvvfz0xxgvhudrp/1tbigxx8T1sfnlwR-wAAsE X-Mimecast-Impersonation-Protect: Policy=CLT - Impersonation Protection Definition; Similar Internal Domain=false; Similar Monitored External Domain=false; Custom External Domain=false; Mimecast External Domain=false; Newly Observed Domain=false; Internal User Name=false; Custom Display Name List=false; Reply-to Address Mismatch=false; Targeted Threat Dictionary=false; Mimecast Threat Dictionary=false; Custom Threat Dictionary=false X-Scanned-By: MIMEDefang 2.79 on 10.11.54.5 X-loop: libvir-list@redhat.com Cc: Shi Lei X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.84 on 10.5.11.23 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=libvir-list-bounces@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Signed-off-by: Shi Lei --- src/conf/network_conf.c | 49 ++++++++++++++++++++++++++++++++--------- 1 file changed, 38 insertions(+), 11 deletions(-) diff --git a/src/conf/network_conf.c b/src/conf/network_conf.c index d6eafa3f..87157591 100644 --- a/src/conf/network_conf.c +++ b/src/conf/network_conf.c @@ -887,26 +887,26 @@ virNetworkDNSSrvDefParseXML(const char *networkName, =20 =20 static int -virNetworkDNSTxtDefParseXML(const char *networkName, - xmlNodePtr node, - virNetworkDNSTxtDef *def, - bool partialOkay) +virNetworkDNSTxtDefParseHook(xmlNodePtr node G_GNUC_UNUSED, + virNetworkDNSTxtDef *def, + const char *networkName, + void *parent G_GNUC_UNUSED, + void *opaque) { const char *bad =3D " ,"; + bool partialOkay =3D false; + + if (opaque) + partialOkay =3D *((bool *) opaque); =20 - if (!(def->name =3D virXMLPropString(node, "name"))) { - virReportError(VIR_ERR_XML_DETAIL, - _("missing required name attribute in DNS TXT recor= d " - "of network %s"), networkName); - goto error; - } if (strcspn(def->name, bad) !=3D strlen(def->name)) { virReportError(VIR_ERR_XML_DETAIL, _("prohibited character in DNS TXT record " "name '%s' of network %s"), def->name, networkNam= e); goto error; } - if (!(def->value =3D virXMLPropString(node, "value")) && !partialOkay)= { + + if (!def->value && !partialOkay) { virReportError(VIR_ERR_XML_DETAIL, _("missing required value attribute in DNS TXT reco= rd " "named '%s' of network %s"), def->name, networkNa= me); @@ -919,6 +919,33 @@ virNetworkDNSTxtDefParseXML(const char *networkName, "in DNS TXT record of network %s"), networkName); goto error; } + + return 0; + + error: + return -1; +} + + +static int +virNetworkDNSTxtDefParseXML(const char *networkName, + xmlNodePtr node, + virNetworkDNSTxtDef *def, + bool partialOkay) +{ + if (!(def->name =3D virXMLPropString(node, "name"))) { + virReportError(VIR_ERR_XML_DETAIL, + _("missing required name attribute in DNS TXT recor= d " + "of network %s"), networkName); + goto error; + } + + def->value =3D virXMLPropString(node, "value"); + + if (virNetworkDNSTxtDefParseHook(node, def, networkName, + NULL, &partialOkay) < 0) + goto error; + return 0; =20 error: --=20 2.25.1 From nobody Tue Apr 23 19:28:24 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 170.10.133.124 as permitted sender) client-ip=170.10.133.124; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-delivery-124.mimecast.com; Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of redhat.com designates 170.10.133.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1619076776; cv=none; d=zohomail.com; s=zohoarc; b=Z7GpuwFeYnbtEZY3H7mQ3mvJA62i4MWq7jyYQMr9kDqNQZ4P4In4IdhFOyvpmV/nTwVzqubDio4Hc1pD8MHeSnznX+WTrQSy8WjqdxgUhAhTro9kfidyp0HSLiWXLCuyonLePTLy1TpaJQe2z6EwgA7lXWGJC+8VxccWlD8m37I= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1619076776; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=axFwZu1kQiHDft3X2V/veXC4K3Wgbzv0PqNVfP9Qdek=; b=RE1olZDsA79SMHGm6CYWmAto991DGMP3QgfG2WMii/bn8vbRz9QkLo6aTJH+hGWA/NgiT2OsKEcmKhvp9SXzyUBAy0Y/m1QDLH+fuAY7rAiXXTfeSUsIhjYRf045go9gTProp66ScLnKE39XDP31NPAeoTKKapLc4/dDzzM9PRo= ARC-Authentication-Results: i=1; mx.zohomail.com; spf=pass (zohomail.com: domain of redhat.com designates 170.10.133.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by mx.zohomail.com with SMTPS id 1619076776317852.6316696963022; Thu, 22 Apr 2021 00:32:56 -0700 (PDT) Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-392-sSlPWRCIPly45HiIaLg1Vw-1; Thu, 22 Apr 2021 03:32:52 -0400 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id B7426343A0; Thu, 22 Apr 2021 07:32:47 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.21]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 986D860938; Thu, 22 Apr 2021 07:32:47 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id 60AB444A6C; Thu, 22 Apr 2021 07:32:47 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.rdu2.redhat.com [10.11.54.4]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id 13M7WhfA024094 for ; Thu, 22 Apr 2021 03:32:43 -0400 Received: by smtp.corp.redhat.com (Postfix) id 3AB3620FE6D1; Thu, 22 Apr 2021 07:32:43 +0000 (UTC) Received: from mimecast-mx02.redhat.com (mimecast03.extmail.prod.ext.rdu2.redhat.com [10.11.55.19]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 3589520FE6D0 for ; Thu, 22 Apr 2021 07:32:43 +0000 (UTC) Received: from us-smtp-1.mimecast.com (us-smtp-1.mimecast.com [207.211.31.81]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 1E94D80066D for ; Thu, 22 Apr 2021 07:32:43 +0000 (UTC) Received: from m97136.mail.qiye.163.com (m97136.mail.qiye.163.com [220.181.97.136]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-273-702_NJjOON-fip11bFEvVA-1; Thu, 22 Apr 2021 03:32:10 -0400 Received: from localhost.localdomain (unknown [58.56.27.130]) by smtp2 (Coremail) with SMTP id iOCowAA3HLYJJYFgMwTJAQ--.5876S14; Thu, 22 Apr 2021 15:26:07 +0800 (CST) X-MC-Unique: sSlPWRCIPly45HiIaLg1Vw-1 X-MC-Unique: 702_NJjOON-fip11bFEvVA-1 From: Shi Lei To: libvir-list@redhat.com Subject: [RFCv3 12/25] conf: Replace virNetworkDNSTxtDefParseXML(hardcoded) with namesake(generated) Date: Thu, 22 Apr 2021 15:25:20 +0800 Message-Id: <20210422072533.312211-13-shi_lei@massclouds.com> In-Reply-To: <20210422072533.312211-1-shi_lei@massclouds.com> References: <20210422072533.312211-1-shi_lei@massclouds.com> MIME-Version: 1.0 X-CM-TRANSID: iOCowAA3HLYJJYFgMwTJAQ--.5876S14 X-Coremail-Antispam: 1Uf129KBjvJXoWxZFW5WFy3Cw1rJr1rWFW3ZFb_yoWrZrWxpa n8t3ZFya18WF4fKay7AryfCr4DCw1kXw4Yk34fuwnrAw45ZryxGFn3Cr18XrW5GryFyF43 CF1aqrZ8Gr4UAFUanT9S1TB71UUUUU7qnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDUYxBIdaVFxhVjvjDU0xZFpf9x0JbMD7hUUUUU= X-Originating-IP: [58.56.27.130] X-CM-SenderInfo: pvklsz1hl6ztxvvfz0xxgvhudrp/1tbiWg98T1f4qKySjQAAsS X-Mimecast-Impersonation-Protect: Policy=CLT - Impersonation Protection Definition; Similar Internal Domain=false; Similar Monitored External Domain=false; Custom External Domain=false; Mimecast External Domain=false; Newly Observed Domain=false; Internal User Name=false; Custom Display Name List=false; Reply-to Address Mismatch=false; Targeted Threat Dictionary=false; Mimecast Threat Dictionary=false; Custom Threat Dictionary=false X-Scanned-By: MIMEDefang 2.78 on 10.11.54.4 X-loop: libvir-list@redhat.com Cc: Shi Lei X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.13 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=libvir-list-bounces@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Signed-off-by: Shi Lei --- po/POTFILES.in | 1 + src/conf/meson.build | 1 + src/conf/network_conf.c | 45 ++++++----------------------------------- src/conf/network_conf.h | 9 ++++++--- 4 files changed, 14 insertions(+), 42 deletions(-) diff --git a/po/POTFILES.in b/po/POTFILES.in index 9740bb2b..fe20b9d7 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -3,6 +3,7 @@ @BUILDDIR@src/access/viraccessapicheckqemu.c @BUILDDIR@src/admin/admin_client.h @BUILDDIR@src/admin/admin_server_dispatch_stubs.h +@BUILDDIR@src/conf/network_conf.generated.c @BUILDDIR@src/remote/remote_client_bodies.h @BUILDDIR@src/remote/remote_daemon_dispatch_stubs.h @SRCDIR@scripts/xmlgen/directive.py diff --git a/src/conf/meson.build b/src/conf/meson.build index 1439c31d..f1cfe35c 100644 --- a/src/conf/meson.build +++ b/src/conf/meson.build @@ -1,4 +1,5 @@ conf_xmlgen_input =3D [ + 'network_conf.h', ] =20 conf_xmlgen_output =3D [] diff --git a/src/conf/network_conf.c b/src/conf/network_conf.c index 87157591..a6c2f11a 100644 --- a/src/conf/network_conf.c +++ b/src/conf/network_conf.c @@ -174,14 +174,6 @@ virNetworkIPDefClear(virNetworkIPDef *def) } =20 =20 -static void -virNetworkDNSTxtDefClear(virNetworkDNSTxtDef *def) -{ - VIR_FREE(def->name); - VIR_FREE(def->value); -} - - static void virNetworkDNSHostDefClear(virNetworkDNSHostDef *def) { @@ -886,7 +878,7 @@ virNetworkDNSSrvDefParseXML(const char *networkName, } =20 =20 -static int +int virNetworkDNSTxtDefParseHook(xmlNodePtr node G_GNUC_UNUSED, virNetworkDNSTxtDef *def, const char *networkName, @@ -927,33 +919,6 @@ virNetworkDNSTxtDefParseHook(xmlNodePtr node G_GNUC_UN= USED, } =20 =20 -static int -virNetworkDNSTxtDefParseXML(const char *networkName, - xmlNodePtr node, - virNetworkDNSTxtDef *def, - bool partialOkay) -{ - if (!(def->name =3D virXMLPropString(node, "name"))) { - virReportError(VIR_ERR_XML_DETAIL, - _("missing required name attribute in DNS TXT recor= d " - "of network %s"), networkName); - goto error; - } - - def->value =3D virXMLPropString(node, "value"); - - if (virNetworkDNSTxtDefParseHook(node, def, networkName, - NULL, &partialOkay) < 0) - goto error; - - return 0; - - error: - virNetworkDNSTxtDefClear(def); - return -1; -} - - static int virNetworkDNSDefParseXML(const char *networkName, xmlNodePtr node, @@ -1077,8 +1042,8 @@ virNetworkDNSDefParseXML(const char *networkName, def->txts =3D g_new0(virNetworkDNSTxtDef, ntxts); =20 for (i =3D 0; i < ntxts; i++) { - if (virNetworkDNSTxtDefParseXML(networkName, txtNodes[i], - &def->txts[def->ntxts], false)= < 0) { + if (virNetworkDNSTxtDefParseXML(txtNodes[i], &def->txts[def->n= txts], + networkName, def, NULL) < 0) { return -1; } def->ntxts++; @@ -3614,6 +3579,7 @@ virNetworkDefUpdateDNSTxt(virNetworkDef *def, virNetworkDNSTxtDef txt; bool isAdd =3D (command =3D=3D VIR_NETWORK_UPDATE_COMMAND_ADD_FIRST || command =3D=3D VIR_NETWORK_UPDATE_COMMAND_ADD_LAST); + bool notAdd; =20 memset(&txt, 0, sizeof(txt)); =20 @@ -3627,7 +3593,8 @@ virNetworkDefUpdateDNSTxt(virNetworkDef *def, if (virNetworkDefUpdateCheckElementName(def, ctxt->node, "txt") < 0) goto cleanup; =20 - if (virNetworkDNSTxtDefParseXML(def->name, ctxt->node, &txt, !isAdd) <= 0) + notAdd =3D !isAdd; + if (virNetworkDNSTxtDefParseXML(ctxt->node, &txt, def->name, def, ¬= Add) < 0) goto cleanup; =20 for (foundIdx =3D 0; foundIdx < dns->ntxts; foundIdx++) { diff --git a/src/conf/network_conf.h b/src/conf/network_conf.h index a7e6b7a2..f5720e5e 100644 --- a/src/conf/network_conf.h +++ b/src/conf/network_conf.h @@ -125,9 +125,9 @@ struct _virNetworkDHCPHostDef { }; =20 typedef struct _virNetworkDNSTxtDef virNetworkDNSTxtDef; -struct _virNetworkDNSTxtDef { - char *name; - char *value; +struct _virNetworkDNSTxtDef { /* genparse */ + char *name; /* xmlattr, required */ + char *value; /* xmlattr */ }; =20 typedef struct _virNetworkDNSSrvDef virNetworkDNSSrvDef; @@ -428,3 +428,6 @@ virNetworkDefUpdateSection(virNetworkDef *def, unsigned int flags); /* virNetworkUpdateFlags = */ =20 VIR_ENUM_DECL(virNetworkTaint); + +#define ENABLE_VIR_NETWORK_DNSTXT_DEF_PARSE_HOOK +#include "network_conf.generated.h" --=20 2.25.1 From nobody Tue Apr 23 19:28:24 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 216.205.24.124 as permitted sender) client-ip=216.205.24.124; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-delivery-124.mimecast.com; Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of redhat.com designates 216.205.24.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1619076789; cv=none; d=zohomail.com; s=zohoarc; b=il6/htjlp7peuX2oX1Pt3YSWZukzCafEvs8VZ4TKiOpJVOEzG4ttBz/TGkTIHGr2SZBGPX9OmH6qo5ozSq2TDgofCw9XLkAywDBbyhkKnRt6MMYDRCABOC7OnI40Nkde6KwZUlz8VhH5V8LKjs0Oic5Ep2kzOq3Ct0zipepgoJQ= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1619076789; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=YTK5eP5CIQwpOiLFmCQ4WUycwnhTaDhNgLqvnQkuZp0=; b=hRNWTNu1xDJHJokvzIhLNnerWJBA/uOQehzz6twf3YQioyNK2q0C/pf3eR3h4jCPEEnZPeET6dVX/+G7/AMaTZWJvAvkpA0b4dhv/7uKQarIBdvtYT2P07Yf+8SBiTl8C9CooezyekjRtjdrpIxaBZ5vSOx6uzhhhaLOB9Gl1c8= ARC-Authentication-Results: i=1; mx.zohomail.com; spf=pass (zohomail.com: domain of redhat.com designates 216.205.24.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [216.205.24.124]) by mx.zohomail.com with SMTPS id 1619076789875134.7189685434713; Thu, 22 Apr 2021 00:33:09 -0700 (PDT) Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-581-aAZHfU8wPCaVVVMICEMq5Q-1; Thu, 22 Apr 2021 03:32:33 -0400 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 11C2D18B9F61; Thu, 22 Apr 2021 07:32:24 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.20]) by smtp.corp.redhat.com (Postfix) with ESMTPS id E144560BE5; Thu, 22 Apr 2021 07:32:23 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id A6C151806D22; Thu, 22 Apr 2021 07:32:23 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.rdu2.redhat.com [10.11.54.6]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id 13M7VUZC023791 for ; Thu, 22 Apr 2021 03:31:30 -0400 Received: by smtp.corp.redhat.com (Postfix) id 633E920BC8D6; Thu, 22 Apr 2021 07:31:30 +0000 (UTC) Received: from mimecast-mx02.redhat.com (mimecast03.extmail.prod.ext.rdu2.redhat.com [10.11.55.19]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 5DB2020BC8D0 for ; Thu, 22 Apr 2021 07:31:27 +0000 (UTC) Received: from us-smtp-1.mimecast.com (us-smtp-1.mimecast.com [207.211.31.81]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id D12548037AD for ; Thu, 22 Apr 2021 07:31:27 +0000 (UTC) Received: from m97136.mail.qiye.163.com (m97136.mail.qiye.163.com [220.181.97.136]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-401-16sYMhxGOVm8mhaBA6dhiw-1; Thu, 22 Apr 2021 03:31:25 -0400 Received: from localhost.localdomain (unknown [58.56.27.130]) by smtp2 (Coremail) with SMTP id iOCowAA3HLYJJYFgMwTJAQ--.5876S15; Thu, 22 Apr 2021 15:26:07 +0800 (CST) X-MC-Unique: aAZHfU8wPCaVVVMICEMq5Q-1 X-MC-Unique: 16sYMhxGOVm8mhaBA6dhiw-1 From: Shi Lei To: libvir-list@redhat.com Subject: [RFCv3 13/25] conf: Generate virNetworkDNSTxtDefFormatBuf Date: Thu, 22 Apr 2021 15:25:21 +0800 Message-Id: <20210422072533.312211-14-shi_lei@massclouds.com> In-Reply-To: <20210422072533.312211-1-shi_lei@massclouds.com> References: <20210422072533.312211-1-shi_lei@massclouds.com> MIME-Version: 1.0 X-CM-TRANSID: iOCowAA3HLYJJYFgMwTJAQ--.5876S15 X-Coremail-Antispam: 1Uf129KBjDUn29KB7ZKAUJUUUU8529EdanIXcx71UUUUU7v73 VFW2AGmfu7bjvjm3AaLaJ3UbIYCTnIWIevJa73UjIFyTuYvjfULt8eDUUUU X-Originating-IP: [58.56.27.130] X-CM-SenderInfo: pvklsz1hl6ztxvvfz0xxgvhudrp/1tbiZw98T1lZu99idAAAsp X-Mimecast-Impersonation-Protect: Policy=CLT - Impersonation Protection Definition; Similar Internal Domain=false; Similar Monitored External Domain=false; Custom External Domain=false; Mimecast External Domain=false; Newly Observed Domain=false; Internal User Name=false; Custom Display Name List=false; Reply-to Address Mismatch=false; Targeted Threat Dictionary=false; Mimecast Threat Dictionary=false; Custom Threat Dictionary=false X-Scanned-By: MIMEDefang 2.78 on 10.11.54.6 X-loop: libvir-list@redhat.com Cc: Shi Lei X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=libvir-list-bounces@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Signed-off-by: Shi Lei --- src/conf/network_conf.c | 4 ++-- src/conf/network_conf.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/conf/network_conf.c b/src/conf/network_conf.c index a6c2f11a..bb976a78 100644 --- a/src/conf/network_conf.c +++ b/src/conf/network_conf.c @@ -2199,8 +2199,8 @@ virNetworkDNSDefFormat(virBuffer *buf, } =20 for (i =3D 0; i < def->ntxts; i++) { - virBufferEscapeString(buf, "txts[i].name); - virBufferEscapeString(buf, "value=3D'%s'/>\n", def->txts[i].value); + if (virNetworkDNSTxtDefFormatBuf(buf, "txt", &def->txts[i], def, N= ULL) < 0) + return -1; } =20 for (i =3D 0; i < def->nsrvs; i++) { diff --git a/src/conf/network_conf.h b/src/conf/network_conf.h index f5720e5e..a4c83b46 100644 --- a/src/conf/network_conf.h +++ b/src/conf/network_conf.h @@ -125,7 +125,7 @@ struct _virNetworkDHCPHostDef { }; =20 typedef struct _virNetworkDNSTxtDef virNetworkDNSTxtDef; -struct _virNetworkDNSTxtDef { /* genparse */ +struct _virNetworkDNSTxtDef { /* genparse, genformat */ char *name; /* xmlattr, required */ char *value; /* xmlattr */ }; --=20 2.25.1 From nobody Tue Apr 23 19:28:24 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 170.10.133.124 as permitted sender) client-ip=170.10.133.124; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-delivery-124.mimecast.com; Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of redhat.com designates 170.10.133.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1619077409; cv=none; d=zohomail.com; s=zohoarc; b=YgaX/iZpbEILw+823tBC03SdpdKm3a1jZVpgc2HexsnnnK6ngqSFl2RAAdtwBVSTrfg5YOneuwJWlyTd834NsISA77tlVBiwK3XzcwmT+3Iyo9p6H5miDZXK6PjK9o3O60GgXn7NDIGaqy+Svyb0uubfqHADLeQPBduPgvhYTmk= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1619077409; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=zf8tdpKSyIGCgw+FYtyxt4xzNdPYZSg6Kg1cQULBpMk=; b=a72UypVHx4vqbF+oaZXdtRL8edncyIqwUXI1KG1ELsjYNkbc8Q5pzMDQvPjtXiC8X5OMZ8vE8YqH2ihUWdgIg8270Z6FhcHT6Kp2CzbfrersZCSCSUax26WveQagmK7Fo4n7xy2St60267teXc7vbXO1vEFGU5vCLGZnlatHkvE= ARC-Authentication-Results: i=1; mx.zohomail.com; spf=pass (zohomail.com: domain of redhat.com designates 170.10.133.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by mx.zohomail.com with SMTPS id 1619077409184628.9483104414027; Thu, 22 Apr 2021 00:43:29 -0700 (PDT) Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-472-ssKLw4KtMZeAbIxVGY5YFg-1; Thu, 22 Apr 2021 03:43:24 -0400 Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 7365D343A2; Thu, 22 Apr 2021 07:43:19 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.21]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 279A562688; Thu, 22 Apr 2021 07:43:19 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id DF72C44A5D; Thu, 22 Apr 2021 07:43:18 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.rdu2.redhat.com [10.11.54.3]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id 13M7hFak025538 for ; Thu, 22 Apr 2021 03:43:15 -0400 Received: by smtp.corp.redhat.com (Postfix) id 5AB44115D35F; Thu, 22 Apr 2021 07:43:15 +0000 (UTC) Received: from mimecast-mx02.redhat.com (mimecast04.extmail.prod.ext.rdu2.redhat.com [10.11.55.20]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 55EA5115D361 for ; Thu, 22 Apr 2021 07:43:12 +0000 (UTC) Received: from us-smtp-1.mimecast.com (us-smtp-1.mimecast.com [205.139.110.61]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id B61BF101A539 for ; Thu, 22 Apr 2021 07:43:12 +0000 (UTC) Received: from m97136.mail.qiye.163.com (m97136.mail.qiye.163.com [220.181.97.136]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-182-yVwwqBJ4OJqaCIF7VMyrwA-1; Thu, 22 Apr 2021 03:43:05 -0400 Received: from localhost.localdomain (unknown [58.56.27.130]) by smtp2 (Coremail) with SMTP id iOCowAA3HLYJJYFgMwTJAQ--.5876S16; Thu, 22 Apr 2021 15:26:07 +0800 (CST) X-MC-Unique: ssKLw4KtMZeAbIxVGY5YFg-1 X-MC-Unique: yVwwqBJ4OJqaCIF7VMyrwA-1 From: Shi Lei To: libvir-list@redhat.com Subject: [RFCv3 14/25] conf: Extract error-checking code from virNetworkDNSSrvDefParseXML Date: Thu, 22 Apr 2021 15:25:22 +0800 Message-Id: <20210422072533.312211-15-shi_lei@massclouds.com> In-Reply-To: <20210422072533.312211-1-shi_lei@massclouds.com> References: <20210422072533.312211-1-shi_lei@massclouds.com> MIME-Version: 1.0 X-CM-TRANSID: iOCowAA3HLYJJYFgMwTJAQ--.5876S16 X-Coremail-Antispam: 1Uf129KBjvJXoW3JryUXFy7JrWDWrW3XryxXwb_yoW7tryfpF s5Ja98GrWrGr1fKrWjkFyrCw15Wwn5tr45C3s3Za4Ik3y3Xwn7Cw47ZFyDW3y7Cry5Jr4a yFy3Zws5Wrn8Z3JanT9S1TB71UUUUU7qnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDUYxBIdaVFxhVjvjDU0xZFpf9x0Jb_pBgUUUUU= X-Originating-IP: [58.56.27.130] X-CM-SenderInfo: pvklsz1hl6ztxvvfz0xxgvhudrp/1tbiPw98T1bdHPqnVwAAse X-Mimecast-Impersonation-Protect: Policy=CLT - Impersonation Protection Definition; Similar Internal Domain=false; Similar Monitored External Domain=false; Custom External Domain=false; Mimecast External Domain=false; Newly Observed Domain=false; Internal User Name=false; Custom Display Name List=false; Reply-to Address Mismatch=false; Targeted Threat Dictionary=false; Mimecast Threat Dictionary=false; Custom Threat Dictionary=false X-Scanned-By: MIMEDefang 2.78 on 10.11.54.3 X-loop: libvir-list@redhat.com Cc: Shi Lei X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.15 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=libvir-list-bounces@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Signed-off-by: Shi Lei --- src/conf/network_conf.c | 107 +++++++++++++++++++++++++++++++--------- 1 file changed, 83 insertions(+), 24 deletions(-) diff --git a/src/conf/network_conf.c b/src/conf/network_conf.c index bb976a78..20128af0 100644 --- a/src/conf/network_conf.c +++ b/src/conf/network_conf.c @@ -768,23 +768,26 @@ virNetworkDNSHostDefParseXML(const char *networkName, "_-+/*" =20 static int -virNetworkDNSSrvDefParseXML(const char *networkName, - xmlNodePtr node, - xmlXPathContextPtr ctxt, - virNetworkDNSSrvDef *def, - bool partialOkay) +virNetworkDNSSrvDefParseHook(xmlNodePtr node G_GNUC_UNUSED, + virNetworkDNSSrvDef *def, + const char *networkName, + void *parent G_GNUC_UNUSED, + void *opaque, + const char *portStr, + const char *priorityStr, + const char *weightStr) { - int ret; - VIR_XPATH_NODE_AUTORESTORE(ctxt) - - ctxt->node =3D node; + bool partialOkay =3D false; + if (opaque) + partialOkay =3D *((bool *) opaque); =20 - if (!(def->service =3D virXMLPropString(node, "service")) && !partialO= kay) { + if (!def->service && !partialOkay) { virReportError(VIR_ERR_XML_DETAIL, _("missing required service attribute in DNS SRV re= cord " "of network '%s'"), networkName); goto error; } + if (def->service) { if (strlen(def->service) > DNS_RECORD_LENGTH_SRV) { virReportError(VIR_ERR_XML_DETAIL, @@ -802,13 +805,14 @@ virNetworkDNSSrvDefParseXML(const char *networkName, } } =20 - if (!(def->protocol =3D virXMLPropString(node, "protocol")) && !partia= lOkay) { + if (!def->protocol && !partialOkay) { virReportError(VIR_ERR_XML_DETAIL, _("missing required protocol attribute " "in DNS SRV record '%s' of network '%s'"), def->service, networkName); goto error; } + if (def->protocol && strspn(def->protocol, PROTOCOL_CHARS) < strlen(def->protocol)) { virReportError(VIR_ERR_XML_DETAIL, @@ -818,19 +822,14 @@ virNetworkDNSSrvDefParseXML(const char *networkName, goto error; } =20 - /* Following attributes are optional */ - def->domain =3D virXMLPropString(node, "domain"); - def->target =3D virXMLPropString(node, "target"); - - ret =3D virXPathUInt("string(./@port)", ctxt, &def->port); - if (ret >=3D 0 && !def->target) { + if (portStr && !def->target) { virReportError(VIR_ERR_XML_DETAIL, _("DNS SRV port attribute not permitted without " "target for service '%s' in network '%s'"), def->service, networkName); goto error; } - if (ret =3D=3D -2 || (ret >=3D 0 && (def->port < 1 || def->port > 6553= 5))) { + if (portStr && (def->port < 1 || def->port > 65535)) { virReportError(VIR_ERR_XML_DETAIL, _("invalid DNS SRV port attribute " "for service '%s' in network '%s'"), @@ -838,15 +837,14 @@ virNetworkDNSSrvDefParseXML(const char *networkName, goto error; } =20 - ret =3D virXPathUInt("string(./@priority)", ctxt, &def->priority); - if (ret >=3D 0 && !def->target) { + if (priorityStr && !def->target) { virReportError(VIR_ERR_XML_DETAIL, _("DNS SRV priority attribute not permitted without= " "target for service '%s' in network '%s'"), def->service, networkName); goto error; } - if (ret =3D=3D -2 || (ret >=3D 0 && def->priority > 65535)) { + if (priorityStr && def->priority > 65535) { virReportError(VIR_ERR_XML_DETAIL, _("Invalid DNS SRV priority attribute " "for service '%s' in network '%s'"), @@ -854,15 +852,14 @@ virNetworkDNSSrvDefParseXML(const char *networkName, goto error; } =20 - ret =3D virXPathUInt("string(./@weight)", ctxt, &def->weight); - if (ret >=3D 0 && !def->target) { + if (weightStr && !def->target) { virReportError(VIR_ERR_XML_DETAIL, _("DNS SRV weight attribute not permitted without " "target for service '%s' in network '%s'"), def->service, networkName); goto error; } - if (ret =3D=3D -2 || (ret >=3D 0 && def->weight > 65535)) { + if (weightStr && def->weight > 65535) { virReportError(VIR_ERR_XML_DETAIL, _("invalid DNS SRV weight attribute " "for service '%s' in network '%s'"), @@ -872,6 +869,68 @@ virNetworkDNSSrvDefParseXML(const char *networkName, =20 return 0; =20 + error: + return -1; +} + + +static int +virNetworkDNSSrvDefParseXML(const char *networkName, + xmlNodePtr node, + xmlXPathContextPtr ctxt G_GNUC_UNUSED, + virNetworkDNSSrvDef *def, + bool partialOkay) +{ + g_autofree char *portStr =3D NULL; + g_autofree char *priorityStr =3D NULL; + g_autofree char *weightStr =3D NULL; + + def->service =3D virXMLPropString(node, "service"); + def->protocol =3D virXMLPropString(node, "protocol"); + + /* Following attributes are optional */ + def->domain =3D virXMLPropString(node, "domain"); + def->target =3D virXMLPropString(node, "target"); + + portStr =3D virXMLPropString(node, "port"); + if (portStr) { + if (virStrToLong_uip(portStr, NULL, 0, &def->port) < 0) { + virReportError(VIR_ERR_XML_DETAIL, + _("invalid DNS SRV port attribute " + "for service '%s' in network '%s'"), + def->service, networkName); + goto error; + } + } + + priorityStr =3D virXMLPropString(node, "priority"); + if (priorityStr) { + if (virStrToLong_uip(priorityStr, NULL, 0, &def->priority) < 0) { + virReportError(VIR_ERR_XML_DETAIL, + _("Invalid DNS SRV priority attribute " + "for service '%s' in network '%s'"), + def->service, networkName); + goto error; + } + } + + weightStr =3D virXMLPropString(node, "weight"); + if (weightStr) { + if (virStrToLong_uip(weightStr, NULL, 0, &def->weight) < 0) { + virReportError(VIR_ERR_XML_DETAIL, + _("invalid DNS SRV weight attribute " + "for service '%s' in network '%s'"), + def->service, networkName); + goto error; + } + } + + if (virNetworkDNSSrvDefParseHook(node, def, networkName, def, &partial= Okay, + portStr, priorityStr, weightStr) < 0) + goto error; + + return 0; + error: virNetworkDNSSrvDefClear(def); return -1; --=20 2.25.1 From nobody Tue Apr 23 19:28:24 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 170.10.133.124 as permitted sender) client-ip=170.10.133.124; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-delivery-124.mimecast.com; Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of redhat.com designates 170.10.133.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1619077409; cv=none; d=zohomail.com; s=zohoarc; b=Jgt93AEJ9sLPDQ9SarQAW3pgTNfi61fDlpp70knOA4DDhPUxYVuAX5KeN5rSeK9R6g1TsfyG22uYSfW+jofweDhjCgk59zF4+U6ppaHxpU5cBmsPMO6cHV+JsBZMuDTpl6kvTQB9dq9aPw0IyeQ+CNxbuiDcS48fc4HUBxneWF4= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1619077409; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=rTjCXcWQ7kfaJJAMVaA4kfMmWpprXePwikL04Lhtgrk=; b=FZeJJHdTkzCHm5W7gFBnCLp2YkUMzV9AK0AqEtOQ8kDOqW8F2Oh6yrK5yc6IC2KsguVX96Y6r2bEKTS3CtkbrJ3CCkAJRByC2VjqczIRcvnvvRJgbaDMV5o5Z23IpAMfSUSFUzSGso5boPdVbm4auMa5575pvBIc18yQAhqL0ic= ARC-Authentication-Results: i=1; mx.zohomail.com; spf=pass (zohomail.com: domain of redhat.com designates 170.10.133.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by mx.zohomail.com with SMTPS id 1619077409796708.6481728943628; Thu, 22 Apr 2021 00:43:29 -0700 (PDT) Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-554-3x3ZP3Z_NAuiLEYGysJANg-1; Thu, 22 Apr 2021 03:43:24 -0400 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id CF0AD19253C8; Thu, 22 Apr 2021 07:43:17 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.21]) by smtp.corp.redhat.com (Postfix) with ESMTPS id AC5E55C230; Thu, 22 Apr 2021 07:43:17 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id 7313144A5C; Thu, 22 Apr 2021 07:43:17 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.rdu2.redhat.com [10.11.54.4]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id 13M7hEIQ025529 for ; Thu, 22 Apr 2021 03:43:14 -0400 Received: by smtp.corp.redhat.com (Postfix) id 37BF420FE6D4; Thu, 22 Apr 2021 07:43:14 +0000 (UTC) Received: from mimecast-mx02.redhat.com (mimecast02.extmail.prod.ext.rdu2.redhat.com [10.11.55.18]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 32B0C20FE6D7 for ; Thu, 22 Apr 2021 07:43:11 +0000 (UTC) Received: from us-smtp-1.mimecast.com (us-smtp-delivery-1.mimecast.com [205.139.110.120]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id A3022A2880B for ; Thu, 22 Apr 2021 07:43:11 +0000 (UTC) Received: from m97136.mail.qiye.163.com (m97136.mail.qiye.163.com [220.181.97.136]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-32-jAmX5o7gOMaaQue9YpeomQ-1; Thu, 22 Apr 2021 03:43:09 -0400 Received: from localhost.localdomain (unknown [58.56.27.130]) by smtp2 (Coremail) with SMTP id iOCowAA3HLYJJYFgMwTJAQ--.5876S17; Thu, 22 Apr 2021 15:26:07 +0800 (CST) X-MC-Unique: 3x3ZP3Z_NAuiLEYGysJANg-1 X-MC-Unique: jAmX5o7gOMaaQue9YpeomQ-1 From: Shi Lei To: libvir-list@redhat.com Subject: [RFCv3 15/25] conf: Replace virNetworkDNSSrvDefParseXML(hardcoded) with namesake(generated) Date: Thu, 22 Apr 2021 15:25:23 +0800 Message-Id: <20210422072533.312211-16-shi_lei@massclouds.com> In-Reply-To: <20210422072533.312211-1-shi_lei@massclouds.com> References: <20210422072533.312211-1-shi_lei@massclouds.com> MIME-Version: 1.0 X-CM-TRANSID: iOCowAA3HLYJJYFgMwTJAQ--.5876S17 X-Coremail-Antispam: 1Uf129KBjvJXoW3WFWDZr4fWryfXr1UCrykKrg_yoW7Xw1fpF n5JasrCFWrWr4rKFW2yrn3Cw15ur1kJw45C3s3Za4xC345Xrn7Cw1xZr18WrW5Gr95Ar13 AFyavws8Gr1UZF7anT9S1TB71UUUUU7qnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDUYxBIdaVFxhVjvjDU0xZFpf9x0Jb_pBgUUUUU= X-Originating-IP: [58.56.27.130] X-CM-SenderInfo: pvklsz1hl6ztxvvfz0xxgvhudrp/1tbiURB8T1f4qVxNdgAAsT X-Mimecast-Impersonation-Protect: Policy=CLT - Impersonation Protection Definition; Similar Internal Domain=false; Similar Monitored External Domain=false; Custom External Domain=false; Mimecast External Domain=false; Newly Observed Domain=false; Internal User Name=false; Custom Display Name List=false; Reply-to Address Mismatch=false; Targeted Threat Dictionary=false; Mimecast Threat Dictionary=false; Custom Threat Dictionary=false X-Scanned-By: MIMEDefang 2.78 on 10.11.54.4 X-loop: libvir-list@redhat.com Cc: Shi Lei X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=libvir-list-bounces@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Signed-off-by: Shi Lei --- src/conf/network_conf.c | 83 +++-------------------------------------- src/conf/network_conf.h | 17 +++++---- 2 files changed, 15 insertions(+), 85 deletions(-) diff --git a/src/conf/network_conf.c b/src/conf/network_conf.c index 20128af0..cb2f3163 100644 --- a/src/conf/network_conf.c +++ b/src/conf/network_conf.c @@ -183,16 +183,6 @@ virNetworkDNSHostDefClear(virNetworkDNSHostDef *def) } =20 =20 -static void -virNetworkDNSSrvDefClear(virNetworkDNSSrvDef *def) -{ - VIR_FREE(def->domain); - VIR_FREE(def->service); - VIR_FREE(def->protocol); - VIR_FREE(def->target); -} - - static void virNetworkDNSForwarderClear(virNetworkDNSForwarder *def) { @@ -767,7 +757,7 @@ virNetworkDNSHostDefParseXML(const char *networkName, "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" \ "_-+/*" =20 -static int +int virNetworkDNSSrvDefParseHook(xmlNodePtr node G_GNUC_UNUSED, virNetworkDNSSrvDef *def, const char *networkName, @@ -874,69 +864,6 @@ virNetworkDNSSrvDefParseHook(xmlNodePtr node G_GNUC_UN= USED, } =20 =20 -static int -virNetworkDNSSrvDefParseXML(const char *networkName, - xmlNodePtr node, - xmlXPathContextPtr ctxt G_GNUC_UNUSED, - virNetworkDNSSrvDef *def, - bool partialOkay) -{ - g_autofree char *portStr =3D NULL; - g_autofree char *priorityStr =3D NULL; - g_autofree char *weightStr =3D NULL; - - def->service =3D virXMLPropString(node, "service"); - def->protocol =3D virXMLPropString(node, "protocol"); - - /* Following attributes are optional */ - def->domain =3D virXMLPropString(node, "domain"); - def->target =3D virXMLPropString(node, "target"); - - portStr =3D virXMLPropString(node, "port"); - if (portStr) { - if (virStrToLong_uip(portStr, NULL, 0, &def->port) < 0) { - virReportError(VIR_ERR_XML_DETAIL, - _("invalid DNS SRV port attribute " - "for service '%s' in network '%s'"), - def->service, networkName); - goto error; - } - } - - priorityStr =3D virXMLPropString(node, "priority"); - if (priorityStr) { - if (virStrToLong_uip(priorityStr, NULL, 0, &def->priority) < 0) { - virReportError(VIR_ERR_XML_DETAIL, - _("Invalid DNS SRV priority attribute " - "for service '%s' in network '%s'"), - def->service, networkName); - goto error; - } - } - - weightStr =3D virXMLPropString(node, "weight"); - if (weightStr) { - if (virStrToLong_uip(weightStr, NULL, 0, &def->weight) < 0) { - virReportError(VIR_ERR_XML_DETAIL, - _("invalid DNS SRV weight attribute " - "for service '%s' in network '%s'"), - def->service, networkName); - goto error; - } - } - - if (virNetworkDNSSrvDefParseHook(node, def, networkName, def, &partial= Okay, - portStr, priorityStr, weightStr) < 0) - goto error; - - return 0; - - error: - virNetworkDNSSrvDefClear(def); - return -1; -} - - int virNetworkDNSTxtDefParseHook(xmlNodePtr node G_GNUC_UNUSED, virNetworkDNSTxtDef *def, @@ -1082,8 +1009,8 @@ virNetworkDNSDefParseXML(const char *networkName, def->srvs =3D g_new0(virNetworkDNSSrvDef, nsrvs); =20 for (i =3D 0; i < nsrvs; i++) { - if (virNetworkDNSSrvDefParseXML(networkName, srvNodes[i], ctxt, - &def->srvs[def->nsrvs], false)= < 0) { + if (virNetworkDNSSrvDefParseXML(srvNodes[i], &def->srvs[def->n= srvs], + networkName, def, NULL) < 0) { return -1; } def->nsrvs++; @@ -3553,6 +3480,7 @@ virNetworkDefUpdateDNSSrv(virNetworkDef *def, bool isAdd =3D (command =3D=3D VIR_NETWORK_UPDATE_COMMAND_ADD_FIRST || command =3D=3D VIR_NETWORK_UPDATE_COMMAND_ADD_LAST); int foundCt =3D 0; + bool notAdd; =20 memset(&srv, 0, sizeof(srv)); =20 @@ -3566,7 +3494,8 @@ virNetworkDefUpdateDNSSrv(virNetworkDef *def, if (virNetworkDefUpdateCheckElementName(def, ctxt->node, "srv") < 0) goto cleanup; =20 - if (virNetworkDNSSrvDefParseXML(def->name, ctxt->node, ctxt, &srv, !is= Add) < 0) + notAdd =3D !isAdd; + if (virNetworkDNSSrvDefParseXML(ctxt->node, &srv, def->name, def, ¬= Add) < 0) goto cleanup; =20 for (i =3D 0; i < dns->nsrvs; i++) { diff --git a/src/conf/network_conf.h b/src/conf/network_conf.h index a4c83b46..a58d8953 100644 --- a/src/conf/network_conf.h +++ b/src/conf/network_conf.h @@ -131,14 +131,14 @@ struct _virNetworkDNSTxtDef { /* genparse, genforma= t */ }; =20 typedef struct _virNetworkDNSSrvDef virNetworkDNSSrvDef; -struct _virNetworkDNSSrvDef { - char *domain; - char *service; - char *protocol; - char *target; - unsigned int port; - unsigned int priority; - unsigned int weight; +struct _virNetworkDNSSrvDef { /* genparse */ + char *service; /* xmlattr */ + char *protocol; /* xmlattr */ + char *domain; /* xmlattr */ + char *target; /* xmlattr */ + unsigned int port; /* xmlattr */ + unsigned int priority; /* xmlattr */ + unsigned int weight; /* xmlattr */ }; =20 typedef struct _virNetworkDNSHostDef virNetworkDNSHostDef; @@ -429,5 +429,6 @@ virNetworkDefUpdateSection(virNetworkDef *def, =20 VIR_ENUM_DECL(virNetworkTaint); =20 +#define ENABLE_VIR_NETWORK_DNSSRV_DEF_PARSE_HOOK #define ENABLE_VIR_NETWORK_DNSTXT_DEF_PARSE_HOOK #include "network_conf.generated.h" --=20 2.25.1 From nobody Tue Apr 23 19:28:24 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 170.10.133.124 as permitted sender) client-ip=170.10.133.124; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-delivery-124.mimecast.com; Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of redhat.com designates 170.10.133.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1619076776; cv=none; d=zohomail.com; s=zohoarc; b=EXunass+q8VMezN6S3EsdDPnPaIiI5RZPF8koam4VQNx2rbeBVKSUS7mec/mOKPgbGVEZfuvJs+BFw9DCNMhqlIzD7tlk7epcZa7NS95/qvW4bxOOOmbKA1sbsffS7DOWQ0uBDq/TL8YZ/oevYp28q3IuUNF+O7U//jOgpMW8WU= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1619076776; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=jmrKD5semom49vbYjbt3qhw1Ct8pVr2qKomj1E+6/Zg=; b=l4IJChZdctLkM+Rp4ayb1aTtb5oQtgxbjXIXgVYTPcKoCUhgJBehOundGxa2sSXafLgteKr+RqRtinlthuQ68NVF6i989IBrk1Njk3NCiAw/braHCvbpV769g5T6tZRpA87Wj5KnJUoAOE5kZkKcs8l+lKICwPoJ6BckfXoDQ+A= ARC-Authentication-Results: i=1; mx.zohomail.com; spf=pass (zohomail.com: domain of redhat.com designates 170.10.133.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by mx.zohomail.com with SMTPS id 16190767769791019.7671646366917; Thu, 22 Apr 2021 00:32:56 -0700 (PDT) Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-358-_6HAwldGNTuA8_4rtyS4hA-1; Thu, 22 Apr 2021 03:32:51 -0400 Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 24070107ACFB; Thu, 22 Apr 2021 07:32:47 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.21]) by smtp.corp.redhat.com (Postfix) with ESMTPS id E834C101F965; Thu, 22 Apr 2021 07:32:46 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id A6A1B44A60; Thu, 22 Apr 2021 07:32:46 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.rdu2.redhat.com [10.11.54.4]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id 13M7WhvF024085 for ; Thu, 22 Apr 2021 03:32:43 -0400 Received: by smtp.corp.redhat.com (Postfix) id EFF1F20FE6CF; Thu, 22 Apr 2021 07:32:42 +0000 (UTC) Received: from mimecast-mx02.redhat.com (mimecast06.extmail.prod.ext.rdu2.redhat.com [10.11.55.22]) by smtp.corp.redhat.com (Postfix) with ESMTPS id EB37620FE6D2 for ; Thu, 22 Apr 2021 07:32:42 +0000 (UTC) Received: from us-smtp-1.mimecast.com (us-smtp-2.mimecast.com [205.139.110.61]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id D359A185A7A5 for ; Thu, 22 Apr 2021 07:32:42 +0000 (UTC) Received: from m97136.mail.qiye.163.com (m97136.mail.qiye.163.com [220.181.97.136]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-316-Igtc9vuSPU2Z8aD1d0_7ZA-1; Thu, 22 Apr 2021 03:32:10 -0400 Received: from localhost.localdomain (unknown [58.56.27.130]) by smtp2 (Coremail) with SMTP id iOCowAA3HLYJJYFgMwTJAQ--.5876S18; Thu, 22 Apr 2021 15:26:08 +0800 (CST) X-MC-Unique: _6HAwldGNTuA8_4rtyS4hA-1 X-MC-Unique: Igtc9vuSPU2Z8aD1d0_7ZA-1 From: Shi Lei To: libvir-list@redhat.com Subject: [RFCv3 16/25] conf: Generate virNetworkDNSSrvDefFormatBuf Date: Thu, 22 Apr 2021 15:25:24 +0800 Message-Id: <20210422072533.312211-17-shi_lei@massclouds.com> In-Reply-To: <20210422072533.312211-1-shi_lei@massclouds.com> References: <20210422072533.312211-1-shi_lei@massclouds.com> MIME-Version: 1.0 X-CM-TRANSID: iOCowAA3HLYJJYFgMwTJAQ--.5876S18 X-Coremail-Antispam: 1Uf129KBjDUn29KB7ZKAUJUUUU8529EdanIXcx71UUUUU7v73 VFW2AGmfu7bjvjm3AaLaJ3UbIYCTnIWIevJa73UjIFyTuYvjfULasbUUUUU X-Originating-IP: [58.56.27.130] X-CM-SenderInfo: pvklsz1hl6ztxvvfz0xxgvhudrp/1tbigxx8T1sfnlwSAwAAs7 X-Mimecast-Impersonation-Protect: Policy=CLT - Impersonation Protection Definition; Similar Internal Domain=false; Similar Monitored External Domain=false; Custom External Domain=false; Mimecast External Domain=false; Newly Observed Domain=false; Internal User Name=false; Custom Display Name List=false; Reply-to Address Mismatch=false; Targeted Threat Dictionary=false; Mimecast Threat Dictionary=false; Custom Threat Dictionary=false X-Scanned-By: MIMEDefang 2.78 on 10.11.54.4 X-loop: libvir-list@redhat.com Cc: Shi Lei X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.84 on 10.5.11.22 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=libvir-list-bounces@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Signed-off-by: Shi Lei --- src/conf/network_conf.c | 18 ++---------------- src/conf/network_conf.h | 2 +- 2 files changed, 3 insertions(+), 17 deletions(-) diff --git a/src/conf/network_conf.c b/src/conf/network_conf.c index cb2f3163..146c4977 100644 --- a/src/conf/network_conf.c +++ b/src/conf/network_conf.c @@ -2191,22 +2191,8 @@ virNetworkDNSDefFormat(virBuffer *buf, =20 for (i =3D 0; i < def->nsrvs; i++) { if (def->srvs[i].service && def->srvs[i].protocol) { - virBufferEscapeString(buf, "srvs[i].service); - virBufferEscapeString(buf, "protocol=3D'%s'", def->srvs[i].pro= tocol); - - if (def->srvs[i].domain) - virBufferEscapeString(buf, " domain=3D'%s'", def->srvs[i].= domain); - if (def->srvs[i].target) - virBufferEscapeString(buf, " target=3D'%s'", def->srvs[i].= target); - if (def->srvs[i].port) - virBufferAsprintf(buf, " port=3D'%d'", def->srvs[i].port); - if (def->srvs[i].priority) - virBufferAsprintf(buf, " priority=3D'%d'", def->srvs[i].pr= iority); - if (def->srvs[i].weight) - virBufferAsprintf(buf, " weight=3D'%d'", def->srvs[i].weig= ht); - - virBufferAddLit(buf, "/>\n"); + if (virNetworkDNSSrvDefFormatBuf(buf, "srv", &def->srvs[i], de= f, NULL) < 0) + return -1; } } =20 diff --git a/src/conf/network_conf.h b/src/conf/network_conf.h index a58d8953..052ccb58 100644 --- a/src/conf/network_conf.h +++ b/src/conf/network_conf.h @@ -131,7 +131,7 @@ struct _virNetworkDNSTxtDef { /* genparse, genformat = */ }; =20 typedef struct _virNetworkDNSSrvDef virNetworkDNSSrvDef; -struct _virNetworkDNSSrvDef { /* genparse */ +struct _virNetworkDNSSrvDef { /* genparse, genformat */ char *service; /* xmlattr */ char *protocol; /* xmlattr */ char *domain; /* xmlattr */ --=20 2.25.1 From nobody Tue Apr 23 19:28:24 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 170.10.133.124 as permitted sender) client-ip=170.10.133.124; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-delivery-124.mimecast.com; Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of redhat.com designates 170.10.133.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1619077400; cv=none; d=zohomail.com; s=zohoarc; b=j0lN2y+4ZD4hyCZM+iBrykX+dmKba0zdxxq4hUYzrU4IMxV7uyKUgf7J5fIuethaCntoG9IfbfR3r6fgYz5xb8zSs845fYK2QNAnzT8qLK+YVtf0Y66RMnKzvRVfrWi6Mi4iECGVR4smwuTODSCyn4u0+/HT0GcxueAJx2nlzQA= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1619077400; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=6HB9O0msgl/0nFvF1oVU5GvoJ+vPk91aOUWrXoHYl1g=; b=V+HnG5iq3z9rEHC1QItfXC+KgKUtUm618ev0u5dTECbfdfn331ZQYwXpGPnLr1zXowg7XDVza16a/O864JpBYwPEQk07+hOJ2tC6PKH4nIDkwzhy9niYuevH1HVaPMlkSVEl3eQOz8MwvjZXV/3F+Z9k6au9wBg9Ipnz2f9KaF4= ARC-Authentication-Results: i=1; mx.zohomail.com; spf=pass (zohomail.com: domain of redhat.com designates 170.10.133.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by mx.zohomail.com with SMTPS id 1619077400729689.1095758642256; Thu, 22 Apr 2021 00:43:20 -0700 (PDT) Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-438-Jt6b0PQTMbqXJV85I-f8TA-1; Thu, 22 Apr 2021 03:43:17 -0400 Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 08D7219253D7; Thu, 22 Apr 2021 07:43:13 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.20]) by smtp.corp.redhat.com (Postfix) with ESMTPS id DF48A2D080; Thu, 22 Apr 2021 07:43:12 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id AC1421806D1D; Thu, 22 Apr 2021 07:43:12 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.rdu2.redhat.com [10.11.54.5]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id 13M7hBtm025516 for ; Thu, 22 Apr 2021 03:43:11 -0400 Received: by smtp.corp.redhat.com (Postfix) id 546D2F8965; Thu, 22 Apr 2021 07:43:11 +0000 (UTC) Received: from mimecast-mx02.redhat.com (mimecast02.extmail.prod.ext.rdu2.redhat.com [10.11.55.18]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 509DCF896A for ; Thu, 22 Apr 2021 07:43:11 +0000 (UTC) Received: from us-smtp-1.mimecast.com (us-smtp-2.mimecast.com [205.139.110.61]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 3A8D48027E6 for ; Thu, 22 Apr 2021 07:43:11 +0000 (UTC) Received: from m97136.mail.qiye.163.com (m97136.mail.qiye.163.com [220.181.97.136]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-502-u86t8umrO1O2z0EwiX2ISA-1; Thu, 22 Apr 2021 03:43:07 -0400 Received: from localhost.localdomain (unknown [58.56.27.130]) by smtp2 (Coremail) with SMTP id iOCowAA3HLYJJYFgMwTJAQ--.5876S19; Thu, 22 Apr 2021 15:26:08 +0800 (CST) X-MC-Unique: Jt6b0PQTMbqXJV85I-f8TA-1 X-MC-Unique: u86t8umrO1O2z0EwiX2ISA-1 From: Shi Lei To: libvir-list@redhat.com Subject: [RFCv3 17/25] conf: Extract error-checking code from virNetworkDNSHostDefParseXML Date: Thu, 22 Apr 2021 15:25:25 +0800 Message-Id: <20210422072533.312211-18-shi_lei@massclouds.com> In-Reply-To: <20210422072533.312211-1-shi_lei@massclouds.com> References: <20210422072533.312211-1-shi_lei@massclouds.com> MIME-Version: 1.0 X-CM-TRANSID: iOCowAA3HLYJJYFgMwTJAQ--.5876S19 X-Coremail-Antispam: 1Uf129KBjvJXoWxCF48tryfJrW7WF1fAr15XFb_yoW5GF1DpF 1fJa98JF4kWr1ak397KF18Kw15JrykJ345Kryfuw1UZFy3Xw18Grs7Zry7WasxWry5XrWY yF4ayws8Gr4UA3JanT9S1TB71UUUUU7qnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDUYxBIdaVFxhVjvjDU0xZFpf9x0JbKv35UUUUU= X-Originating-IP: [58.56.27.130] X-CM-SenderInfo: pvklsz1hl6ztxvvfz0xxgvhudrp/1tbigBB8T1rpO43S6AAAsc X-Mimecast-Impersonation-Protect: Policy=CLT - Impersonation Protection Definition; Similar Internal Domain=false; Similar Monitored External Domain=false; Custom External Domain=false; Mimecast External Domain=false; Newly Observed Domain=false; Internal User Name=false; Custom Display Name List=false; Reply-to Address Mismatch=false; Targeted Threat Dictionary=false; Mimecast Threat Dictionary=false; Custom Threat Dictionary=false X-Scanned-By: MIMEDefang 2.79 on 10.11.54.5 X-loop: libvir-list@redhat.com Cc: Shi Lei X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.15 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=libvir-list-bounces@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Signed-off-by: Shi Lei --- src/conf/network_conf.c | 63 +++++++++++++++++++++++++++++------------ 1 file changed, 45 insertions(+), 18 deletions(-) diff --git a/src/conf/network_conf.c b/src/conf/network_conf.c index 146c4977..b326ef5f 100644 --- a/src/conf/network_conf.c +++ b/src/conf/network_conf.c @@ -676,21 +676,57 @@ virNetworkDHCPDefParseXML(const char *networkName, =20 =20 static int -virNetworkDNSHostDefParseXML(const char *networkName, - xmlNodePtr node, - virNetworkDNSHostDef *def, - bool partialOkay) +virNetworkDNSHostDefParseHook(xmlNodePtr node G_GNUC_UNUSED, + virNetworkDNSHostDef *def, + const char *networkName, + void *parent G_GNUC_UNUSED, + void *opaque, + const char *ip, + int nHostnameNodes G_GNUC_UNUSED) { - xmlNodePtr cur; - g_autofree char *ip =3D NULL; + bool partialOkay =3D false; =20 - if (!(ip =3D virXMLPropString(node, "ip")) && !partialOkay) { + if (opaque) + partialOkay =3D *((bool *) opaque); + + if (!ip && !partialOkay) { virReportError(VIR_ERR_XML_DETAIL, _("Missing IP address in network '%s' DNS HOST reco= rd"), networkName); goto error; } =20 + if (def->nnames =3D=3D 0 && !partialOkay) { + virReportError(VIR_ERR_XML_DETAIL, + _("Missing hostname in network '%s' DNS HOST record= "), + networkName); + goto error; + } + + if (!VIR_SOCKET_ADDR_VALID(&def->ip) && def->nnames =3D=3D 0) { + virReportError(VIR_ERR_XML_DETAIL, + _("Missing ip and hostname in network '%s' DNS HOST= record"), + networkName); + goto error; + } + + return 0; + + error: + return -1; +} + + +static int +virNetworkDNSHostDefParseXML(const char *networkName, + xmlNodePtr node, + virNetworkDNSHostDef *def, + bool partialOkay) +{ + xmlNodePtr cur; + g_autofree char *ip =3D NULL; + + ip =3D virXMLPropString(node, "ip"); if (ip && (virSocketAddrParse(&def->ip, ip, AF_UNSPEC) < 0)) { virReportError(VIR_ERR_XML_DETAIL, _("Invalid IP address in network '%s' DNS HOST reco= rd"), @@ -720,19 +756,10 @@ virNetworkDNSHostDefParseXML(const char *networkName, } cur =3D cur->next; } - if (def->nnames =3D=3D 0 && !partialOkay) { - virReportError(VIR_ERR_XML_DETAIL, - _("Missing hostname in network '%s' DNS HOST record= "), - networkName); - goto error; - } =20 - if (!VIR_SOCKET_ADDR_VALID(&def->ip) && def->nnames =3D=3D 0) { - virReportError(VIR_ERR_XML_DETAIL, - _("Missing ip and hostname in network '%s' DNS HOST= record"), - networkName); + if (virNetworkDNSHostDefParseHook(node, def, networkName, def, &partia= lOkay, + ip, def->nnames) < 0) goto error; - } =20 return 0; =20 --=20 2.25.1 From nobody Tue Apr 23 19:28:24 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 216.205.24.124 as permitted sender) client-ip=216.205.24.124; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-delivery-124.mimecast.com; Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of redhat.com designates 216.205.24.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1619076750; cv=none; d=zohomail.com; s=zohoarc; b=UihWlvhOA4OTvpC5HKVOWiSUonk/VtSW59AulDVEy9S/hnHwxs2TbhbrQq9YWgMqVEQSbspizhWADpOglTCFE3GsZW733XFSvfNuDCHvcPKKTxx6Ml0jipgPeIVrfbZlLPsQc0op8WgKuvvotA8+H7wyjT+vCImkvn8QlHVKApA= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1619076750; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=TixFYFGm/tikN3pBfC0N++SCmKKd2clbi/Mq4RQQbLk=; b=PyeAG0jaRQ/G4CAnLemeKk8sw0yNB91WSHz9Cia3cmkruUjdehDLzSPqE5lFVOqNtkRFtK5TMm6e7cL1P2SpKzBQ0aBHEhyjXu79cL6Y7MoFukT9AzPun8Cgd32+0lCgkI/kA3zMKnXPVe9b03JxPAotn7gGeu0fIs77T2/N4ao= ARC-Authentication-Results: i=1; mx.zohomail.com; spf=pass (zohomail.com: domain of redhat.com designates 216.205.24.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [216.205.24.124]) by mx.zohomail.com with SMTPS id 161907675004423.310440438787964; Thu, 22 Apr 2021 00:32:30 -0700 (PDT) Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-269-NKF6LXHuNW2fPXEoGz0ZcA-1; Thu, 22 Apr 2021 03:32:24 -0400 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id CFA1C8189D3; Thu, 22 Apr 2021 07:32:18 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.20]) by smtp.corp.redhat.com (Postfix) with ESMTPS id A63A960613; Thu, 22 Apr 2021 07:32:18 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id 65FF91806D1A; Thu, 22 Apr 2021 07:32:18 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.rdu2.redhat.com [10.11.54.3]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id 13M7VWb8023805 for ; Thu, 22 Apr 2021 03:31:32 -0400 Received: by smtp.corp.redhat.com (Postfix) id 41765115D35E; Thu, 22 Apr 2021 07:31:32 +0000 (UTC) Received: from mimecast-mx02.redhat.com (mimecast05.extmail.prod.ext.rdu2.redhat.com [10.11.55.21]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 3E361115D35D for ; Thu, 22 Apr 2021 07:31:29 +0000 (UTC) Received: from us-smtp-1.mimecast.com (us-smtp-2.mimecast.com [205.139.110.61]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id AAC84805F47 for ; Thu, 22 Apr 2021 07:31:29 +0000 (UTC) Received: from m97136.mail.qiye.163.com (m97136.mail.qiye.163.com [220.181.97.136]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-152-b8gixJFhN56t_hXzSbP1HA-1; Thu, 22 Apr 2021 03:31:24 -0400 Received: from localhost.localdomain (unknown [58.56.27.130]) by smtp2 (Coremail) with SMTP id iOCowAA3HLYJJYFgMwTJAQ--.5876S20; Thu, 22 Apr 2021 15:26:08 +0800 (CST) X-MC-Unique: NKF6LXHuNW2fPXEoGz0ZcA-1 X-MC-Unique: b8gixJFhN56t_hXzSbP1HA-1 From: Shi Lei To: libvir-list@redhat.com Subject: [RFCv3 18/25] conf: Replace virNetworkDNSHostDefParseXML(hardcoded) with namesake(generated) Date: Thu, 22 Apr 2021 15:25:26 +0800 Message-Id: <20210422072533.312211-19-shi_lei@massclouds.com> In-Reply-To: <20210422072533.312211-1-shi_lei@massclouds.com> References: <20210422072533.312211-1-shi_lei@massclouds.com> MIME-Version: 1.0 X-CM-TRANSID: iOCowAA3HLYJJYFgMwTJAQ--.5876S20 X-Coremail-Antispam: 1Uf129KBjvJXoWxWw4xWryrtryxCF17ur1kGrg_yoWrZr1fpF sxJanrAw48Wa1fK3y7Ar1SkrnxurykJw45CryfWw13Z3yUXr1xGws7uF18Wa15Gry5Ar15 CF4Yvws8GrW7AFUanT9S1TB71UUUUU7qnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDUYxBIdaVFxhVjvjDU0xZFpf9x0JbKv35UUUUU= X-Originating-IP: [58.56.27.130] X-CM-SenderInfo: pvklsz1hl6ztxvvfz0xxgvhudrp/1tbifhB8T1rpO2KmnwAAsO X-Mimecast-Impersonation-Protect: Policy=CLT - Impersonation Protection Definition; Similar Internal Domain=false; Similar Monitored External Domain=false; Custom External Domain=false; Mimecast External Domain=false; Newly Observed Domain=false; Internal User Name=false; Custom Display Name List=false; Reply-to Address Mismatch=false; Targeted Threat Dictionary=false; Mimecast Threat Dictionary=false; Custom Threat Dictionary=false X-Scanned-By: MIMEDefang 2.78 on 10.11.54.3 X-loop: libvir-list@redhat.com Cc: Shi Lei X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.13 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=libvir-list-bounces@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Signed-off-by: Shi Lei --- src/conf/network_conf.c | 71 ++++------------------------------------- src/conf/network_conf.h | 7 ++-- 2 files changed, 10 insertions(+), 68 deletions(-) diff --git a/src/conf/network_conf.c b/src/conf/network_conf.c index b326ef5f..90b1e0ee 100644 --- a/src/conf/network_conf.c +++ b/src/conf/network_conf.c @@ -174,15 +174,6 @@ virNetworkIPDefClear(virNetworkIPDef *def) } =20 =20 -static void -virNetworkDNSHostDefClear(virNetworkDNSHostDef *def) -{ - while (def->nnames) - VIR_FREE(def->names[--def->nnames]); - VIR_FREE(def->names); -} - - static void virNetworkDNSForwarderClear(virNetworkDNSForwarder *def) { @@ -675,7 +666,7 @@ virNetworkDHCPDefParseXML(const char *networkName, } =20 =20 -static int +int virNetworkDNSHostDefParseHook(xmlNodePtr node G_GNUC_UNUSED, virNetworkDNSHostDef *def, const char *networkName, @@ -717,58 +708,6 @@ virNetworkDNSHostDefParseHook(xmlNodePtr node G_GNUC_U= NUSED, } =20 =20 -static int -virNetworkDNSHostDefParseXML(const char *networkName, - xmlNodePtr node, - virNetworkDNSHostDef *def, - bool partialOkay) -{ - xmlNodePtr cur; - g_autofree char *ip =3D NULL; - - ip =3D virXMLPropString(node, "ip"); - if (ip && (virSocketAddrParse(&def->ip, ip, AF_UNSPEC) < 0)) { - virReportError(VIR_ERR_XML_DETAIL, - _("Invalid IP address in network '%s' DNS HOST reco= rd"), - networkName); - goto error; - } - - cur =3D node->children; - while (cur !=3D NULL) { - if (cur->type =3D=3D XML_ELEMENT_NODE && - virXMLNodeNameEqual(cur, "hostname")) { - if (cur->children !=3D NULL) { - g_autofree char *name =3D virXMLNodeContentString(cur); - - if (!name) - goto error; - - if (!name[0]) { - virReportError(VIR_ERR_XML_DETAIL, - _("Missing hostname in network '%s' D= NS HOST record"), - networkName); - goto error; - } - if (VIR_APPEND_ELEMENT(def->names, def->nnames, name) < = 0) - goto error; - } - } - cur =3D cur->next; - } - - if (virNetworkDNSHostDefParseHook(node, def, networkName, def, &partia= lOkay, - ip, def->nnames) < 0) - goto error; - - return 0; - - error: - virNetworkDNSHostDefClear(def); - return -1; -} - - /* This includes all characters used in the names of current * /etc/services and /etc/protocols files (on Fedora 20), except ".", * which we can't allow because it would conflict with the use of "." @@ -1017,8 +956,8 @@ virNetworkDNSDefParseXML(const char *networkName, def->hosts =3D g_new0(virNetworkDNSHostDef, nhosts); =20 for (i =3D 0; i < nhosts; i++) { - if (virNetworkDNSHostDefParseXML(networkName, hostNodes[i], - &def->hosts[def->nhosts], fal= se) < 0) { + if (virNetworkDNSHostDefParseXML(hostNodes[i], &def->hosts[def= ->nhosts], + networkName, def, NULL) < 0) { return -1; } def->nhosts++; @@ -3398,6 +3337,7 @@ virNetworkDefUpdateDNSHost(virNetworkDef *def, bool isAdd =3D (command =3D=3D VIR_NETWORK_UPDATE_COMMAND_ADD_FIRST || command =3D=3D VIR_NETWORK_UPDATE_COMMAND_ADD_LAST); int foundCt =3D 0; + bool notAdd; =20 memset(&host, 0, sizeof(host)); =20 @@ -3411,7 +3351,8 @@ virNetworkDefUpdateDNSHost(virNetworkDef *def, if (virNetworkDefUpdateCheckElementName(def, ctxt->node, "host") < 0) goto cleanup; =20 - if (virNetworkDNSHostDefParseXML(def->name, ctxt->node, &host, !isAdd)= < 0) + notAdd =3D !isAdd; + if (virNetworkDNSHostDefParseXML(ctxt->node, &host, def->name, def, &n= otAdd) < 0) goto cleanup; =20 for (i =3D 0; i < dns->nhosts; i++) { diff --git a/src/conf/network_conf.h b/src/conf/network_conf.h index 052ccb58..998411be 100644 --- a/src/conf/network_conf.h +++ b/src/conf/network_conf.h @@ -142,10 +142,10 @@ struct _virNetworkDNSSrvDef { /* genparse, genforma= t */ }; =20 typedef struct _virNetworkDNSHostDef virNetworkDNSHostDef; -struct _virNetworkDNSHostDef { - virSocketAddr ip; +struct _virNetworkDNSHostDef { /* genparse */ + virSocketAddr ip; /* xmlattr */ size_t nnames; - char **names; + char **names; /* xmlelem:hostname, array */ }; =20 =20 @@ -429,6 +429,7 @@ virNetworkDefUpdateSection(virNetworkDef *def, =20 VIR_ENUM_DECL(virNetworkTaint); =20 +#define ENABLE_VIR_NETWORK_DNSHOST_DEF_PARSE_HOOK #define ENABLE_VIR_NETWORK_DNSSRV_DEF_PARSE_HOOK #define ENABLE_VIR_NETWORK_DNSTXT_DEF_PARSE_HOOK #include "network_conf.generated.h" --=20 2.25.1 From nobody Tue Apr 23 19:28:24 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 216.205.24.124 as permitted sender) client-ip=216.205.24.124; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-delivery-124.mimecast.com; Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of redhat.com designates 216.205.24.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1619076735; cv=none; d=zohomail.com; s=zohoarc; b=ceImITSF4GWEhtWQXFyzcFSL+m13UI+60zqKrzEc5HGTQr/WtIwMAZPFfyvriHEqFudGaISAE6zJ//qqgkGcsjvjby5NriPMgslYZLXy5RRq/Uz2vF2sBe8o+ONnLkLbQWJ2QOy+fUN3qh+J/NFrWZGok8vnV8tCCk5xbvDrj3k= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1619076735; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=plQg8oKPocWzAL4gmCGVxFgH4LhEc7PZa/rcszDc3ug=; b=Gsf5Os4jT3IoNtDl/viHSQUKp97Avp2RBL1g0ZKm0ffZ5+0i3Wy3tE7qQMZHvCLtikU2F/IPVBGUVP3G7AYMFuN4VgV7Hu4XG6ZgtiDlZjxhlk5wp0R0MAObcX257zudqAMIDJeJboc+zQwkwmv8rKE0CD0b20QIQl3X7DimaKE= ARC-Authentication-Results: i=1; mx.zohomail.com; spf=pass (zohomail.com: domain of redhat.com designates 216.205.24.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [216.205.24.124]) by mx.zohomail.com with SMTPS id 1619076734884668.6780365079352; Thu, 22 Apr 2021 00:32:14 -0700 (PDT) Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-557-YLkrnAVOO5exrYIQxZyCgA-1; Thu, 22 Apr 2021 03:32:11 -0400 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 0E4B81008066; Thu, 22 Apr 2021 07:32:06 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.20]) by smtp.corp.redhat.com (Postfix) with ESMTPS id CE2DC60938; Thu, 22 Apr 2021 07:32:05 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id 474121806D1C; Thu, 22 Apr 2021 07:32:05 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.rdu2.redhat.com [10.11.54.4]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id 13M7VTRL023776 for ; Thu, 22 Apr 2021 03:31:29 -0400 Received: by smtp.corp.redhat.com (Postfix) id 827DC20FE6CF; Thu, 22 Apr 2021 07:31:29 +0000 (UTC) Received: from mimecast-mx02.redhat.com (mimecast06.extmail.prod.ext.rdu2.redhat.com [10.11.55.22]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 7DD2820FE6D2 for ; Thu, 22 Apr 2021 07:31:27 +0000 (UTC) Received: from us-smtp-1.mimecast.com (us-smtp-2.mimecast.com [207.211.31.81]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id EF0CF183B3C6 for ; Thu, 22 Apr 2021 07:31:26 +0000 (UTC) Received: from m97136.mail.qiye.163.com (m97136.mail.qiye.163.com [220.181.97.136]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-181-7H912iitNPqvnyWyLPIoTA-1; Thu, 22 Apr 2021 03:31:23 -0400 Received: from localhost.localdomain (unknown [58.56.27.130]) by smtp2 (Coremail) with SMTP id iOCowAA3HLYJJYFgMwTJAQ--.5876S21; Thu, 22 Apr 2021 15:26:08 +0800 (CST) X-MC-Unique: YLkrnAVOO5exrYIQxZyCgA-1 X-MC-Unique: 7H912iitNPqvnyWyLPIoTA-1 From: Shi Lei To: libvir-list@redhat.com Subject: [RFCv3 19/25] conf: Generate virNetworkDNSHostDefFormatBuf Date: Thu, 22 Apr 2021 15:25:27 +0800 Message-Id: <20210422072533.312211-20-shi_lei@massclouds.com> In-Reply-To: <20210422072533.312211-1-shi_lei@massclouds.com> References: <20210422072533.312211-1-shi_lei@massclouds.com> MIME-Version: 1.0 X-CM-TRANSID: iOCowAA3HLYJJYFgMwTJAQ--.5876S21 X-Coremail-Antispam: 1Uf129KBjDUn29KB7ZKAUJUUUU8529EdanIXcx71UUUUU7v73 VFW2AGmfu7bjvjm3AaLaJ3UbIYCTnIWIevJa73UjIFyTuYvjfULasbUUUUU X-Originating-IP: [58.56.27.130] X-CM-SenderInfo: pvklsz1hl6ztxvvfz0xxgvhudrp/1tbiTwp8T1f4qZKesQAAsN X-Mimecast-Impersonation-Protect: Policy=CLT - Impersonation Protection Definition; Similar Internal Domain=false; Similar Monitored External Domain=false; Custom External Domain=false; Mimecast External Domain=false; Newly Observed Domain=false; Internal User Name=false; Custom Display Name List=false; Reply-to Address Mismatch=false; Targeted Threat Dictionary=false; Mimecast Threat Dictionary=false; Custom Threat Dictionary=false X-Scanned-By: MIMEDefang 2.78 on 10.11.54.4 X-loop: libvir-list@redhat.com Cc: Shi Lei X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.13 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=libvir-list-bounces@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Signed-off-by: Shi Lei --- src/conf/network_conf.c | 14 +++----------- src/conf/network_conf.h | 2 +- 2 files changed, 4 insertions(+), 12 deletions(-) diff --git a/src/conf/network_conf.c b/src/conf/network_conf.c index 90b1e0ee..ba67eab1 100644 --- a/src/conf/network_conf.c +++ b/src/conf/network_conf.c @@ -2095,7 +2095,7 @@ static int virNetworkDNSDefFormat(virBuffer *buf, const virNetworkDNSDef *def) { - size_t i, j; + size_t i; =20 if (!(def->enable || def->forwardPlainNames || def->nfwds || def->nhos= ts || def->nsrvs || def->ntxts)) @@ -2164,16 +2164,8 @@ virNetworkDNSDefFormat(virBuffer *buf, =20 if (def->nhosts) { for (i =3D 0; i < def->nhosts; i++) { - g_autofree char *ip =3D virSocketAddrFormat(&def->hosts[i].ip); - - virBufferAsprintf(buf, "\n", ip); - virBufferAdjustIndent(buf, 2); - for (j =3D 0; j < def->hosts[i].nnames; j++) - virBufferEscapeString(buf, "%s\n", - def->hosts[i].names[j]); - - virBufferAdjustIndent(buf, -2); - virBufferAddLit(buf, "\n"); + if (virNetworkDNSHostDefFormatBuf(buf, "host", &def->hosts[i],= def, NULL) < 0) + return -1; } } virBufferAdjustIndent(buf, -2); diff --git a/src/conf/network_conf.h b/src/conf/network_conf.h index 998411be..836d088d 100644 --- a/src/conf/network_conf.h +++ b/src/conf/network_conf.h @@ -142,7 +142,7 @@ struct _virNetworkDNSSrvDef { /* genparse, genformat = */ }; =20 typedef struct _virNetworkDNSHostDef virNetworkDNSHostDef; -struct _virNetworkDNSHostDef { /* genparse */ +struct _virNetworkDNSHostDef { /* genparse, genformat */ virSocketAddr ip; /* xmlattr */ size_t nnames; char **names; /* xmlelem:hostname, array */ --=20 2.25.1 From nobody Tue Apr 23 19:28:24 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 216.205.24.124 as permitted sender) client-ip=216.205.24.124; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-delivery-124.mimecast.com; Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of redhat.com designates 216.205.24.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1619076794; cv=none; d=zohomail.com; s=zohoarc; b=CYr/TNoayyL9W3c4cbYVFfc32ZNnffdKiXaQxNRKLGuSg7niBga8iLAtCp9feIJzefP5c+za4iXwnC4WF4TXIhmMI+7rW86uruEh2M7xRL04zCYTTLuXzDjwQpJQpuy4Ys5TOt64xHpTie7WysW8t7PomTOjoSZLzPp5eeCE+oY= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1619076794; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=V9oC3dMbTlHuhm1yvHPLb7fgnICeI7RIlduED1qU1hE=; b=M+lZXz59HTjn6TBxYgnY56wrgSukxRwmhhZrH5UDM+VCKEuQKagWNFx8m6I55g+fA005NKmE3BGoHopypoHomehmsVXoOcJuaa0jEygWQBU7S347RkWoW5lipIjDuN9Ufvv8RgjMa0v1cXquBZIdamFWvgvSfphvmrfFKZ8wDLU= ARC-Authentication-Results: i=1; mx.zohomail.com; spf=pass (zohomail.com: domain of redhat.com designates 216.205.24.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [216.205.24.124]) by mx.zohomail.com with SMTPS id 1619076794503661.0102536962677; Thu, 22 Apr 2021 00:33:14 -0700 (PDT) Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-492-4b6baSxyNemy9zGu6A7TlA-1; Thu, 22 Apr 2021 03:32:33 -0400 Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id A05511008076; Thu, 22 Apr 2021 07:32:24 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.21]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 7634010016FD; Thu, 22 Apr 2021 07:32:24 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id 3C39E44A60; Thu, 22 Apr 2021 07:32:24 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.rdu2.redhat.com [10.11.54.6]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id 13M7VifG023869 for ; Thu, 22 Apr 2021 03:31:44 -0400 Received: by smtp.corp.redhat.com (Postfix) id E4FB420BC8D5; Thu, 22 Apr 2021 07:31:43 +0000 (UTC) Received: from mimecast-mx02.redhat.com (mimecast01.extmail.prod.ext.rdu2.redhat.com [10.11.55.17]) by smtp.corp.redhat.com (Postfix) with ESMTPS id DEEBF20BC8C4 for ; Thu, 22 Apr 2021 07:31:37 +0000 (UTC) Received: from us-smtp-1.mimecast.com (us-smtp-delivery-1.mimecast.com [205.139.110.120]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 37777858EEE for ; Thu, 22 Apr 2021 07:31:37 +0000 (UTC) Received: from m97136.mail.qiye.163.com (m97136.mail.qiye.163.com [220.181.97.136]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-480-6oADJ63yOZKjX921WoRvUg-1; Thu, 22 Apr 2021 03:31:27 -0400 Received: from localhost.localdomain (unknown [58.56.27.130]) by smtp2 (Coremail) with SMTP id iOCowAA3HLYJJYFgMwTJAQ--.5876S22; Thu, 22 Apr 2021 15:26:09 +0800 (CST) X-MC-Unique: 4b6baSxyNemy9zGu6A7TlA-1 X-MC-Unique: 6oADJ63yOZKjX921WoRvUg-1 From: Shi Lei To: libvir-list@redhat.com Subject: [RFCv3 20/25] conf: Extract virNetworkDNSForwarderParseXML from virNetworkDNSParseXML Date: Thu, 22 Apr 2021 15:25:28 +0800 Message-Id: <20210422072533.312211-21-shi_lei@massclouds.com> In-Reply-To: <20210422072533.312211-1-shi_lei@massclouds.com> References: <20210422072533.312211-1-shi_lei@massclouds.com> MIME-Version: 1.0 X-CM-TRANSID: iOCowAA3HLYJJYFgMwTJAQ--.5876S22 X-Coremail-Antispam: 1Uf129KBjvJXoW7Ww1kWF1fJFW7Kr4fCr1kGrg_yoW5JFykpF 4rJF98Gw4rWr1fK3y2yw4rCr45CFy8Jay5K34fZw1093y3WryUCr1fZryI9F1UWrWFyr4a yF4aqrZ8Gr4UAF7anT9S1TB71UUUUU7qnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDUYxBIdaVFxhVjvjDU0xZFpf9x0JbKv35UUUUU= X-Originating-IP: [58.56.27.130] X-CM-SenderInfo: pvklsz1hl6ztxvvfz0xxgvhudrp/1tbiUBF8T1f4qUc4LgAAsl X-Mimecast-Impersonation-Protect: Policy=CLT - Impersonation Protection Definition; Similar Internal Domain=false; Similar Monitored External Domain=false; Custom External Domain=false; Mimecast External Domain=false; Newly Observed Domain=false; Internal User Name=false; Custom Display Name List=false; Reply-to Address Mismatch=false; Targeted Threat Dictionary=false; Mimecast Threat Dictionary=false; Custom Threat Dictionary=false X-Scanned-By: MIMEDefang 2.78 on 10.11.54.6 X-loop: libvir-list@redhat.com Cc: Shi Lei X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.84 on 10.5.11.22 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=libvir-list-bounces@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Signed-off-by: Shi Lei --- src/conf/network_conf.c | 68 +++++++++++++++++++++++++++++++---------- 1 file changed, 52 insertions(+), 16 deletions(-) diff --git a/src/conf/network_conf.c b/src/conf/network_conf.c index ba67eab1..cf9e77d3 100644 --- a/src/conf/network_conf.c +++ b/src/conf/network_conf.c @@ -871,6 +871,52 @@ virNetworkDNSTxtDefParseHook(xmlNodePtr node G_GNUC_UN= USED, } =20 =20 +static int +virNetworkDNSForwarderParseHook(xmlNodePtr node G_GNUC_UNUSED, + virNetworkDNSForwarder *def, + const char *instname G_GNUC_UNUSED, + void *parent G_GNUC_UNUSED, + void *opaque G_GNUC_UNUSED, + const char *addr) +{ + if (!(addr || def->domain)) { + virReportError(VIR_ERR_XML_ERROR, "%s", + _("Invalid forwarder element, must contain " + "at least one of addr or domain")); + return -1; + } + + return 0; +} + + +static int +virNetworkDNSForwarderParseXML(xmlNodePtr node, + virNetworkDNSForwarder *def, + const char *networkName, + void *parent G_GNUC_UNUSED, + void *opaque) +{ + g_autofree char *addr =3D virXMLPropString(node, "addr"); + + if (addr && virSocketAddrParse(&def->addr, addr, AF_UNSPEC) < 0) { + virReportError(VIR_ERR_XML_ERROR, + _("Invalid forwarder IP address '%s' " + "in network '%s'"), + addr, networkName); + return -1; + } + + def->domain =3D virXMLPropString(node, "domain"); + + if (virNetworkDNSForwarderParseHook(node, def, networkName, def, opaqu= e, + addr) < 0) + return -1; + + return 0; +} + + static int virNetworkDNSDefParseXML(const char *networkName, xmlNodePtr node, @@ -924,23 +970,13 @@ virNetworkDNSDefParseXML(const char *networkName, def->forwarders =3D g_new0(virNetworkDNSForwarder, nfwds); =20 for (i =3D 0; i < nfwds; i++) { - g_autofree char *addr =3D virXMLPropString(fwdNodes[i], "addr"= ); - - if (addr && virSocketAddrParse(&def->forwarders[i].addr, - addr, AF_UNSPEC) < 0) { - virReportError(VIR_ERR_XML_ERROR, - _("Invalid forwarder IP address '%s' " - "in network '%s'"), - addr, networkName); + if (virNetworkDNSForwarderParseXML(fwdNodes[i], + &def->forwarders[i], + networkName, + def, + NULL) < 0) return -1; - } - def->forwarders[i].domain =3D virXMLPropString(fwdNodes[i], "d= omain"); - if (!(addr || def->forwarders[i].domain)) { - virReportError(VIR_ERR_XML_ERROR, "%s", - _("Invalid forwarder element, must contain " - "at least one of addr or domain")); - return -1; - } + def->nfwds++; } } --=20 2.25.1 From nobody Tue Apr 23 19:28:24 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 216.205.24.124 as permitted sender) client-ip=216.205.24.124; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-delivery-124.mimecast.com; Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of redhat.com designates 216.205.24.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1619077365; cv=none; d=zohomail.com; s=zohoarc; b=akAh0Npn/F7EWC/QNibByvaGKnMpN7dzhqJyjHWgFvKykI20qccFGvhIfjqiztvr9TTw5oipuMgYIJrKbFc5lFx2QUX0ShMXLbWKO75soUeTpQVOpd4D6TGKG3s74zrTg/gMXOIXn+ARKRAwlCFJoH13HuYB7uVD/xXjMZE4wL0= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1619077365; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=I1W9nbO7pjchkonQepM747VBeM7qGqq/cpDQ29VfYCQ=; b=dDqB3MCx6K7G5yeqlPvTACo2INegldhQaH6y1bcKrPvXx7sMqwIgHOU07BV0vR2UcMwywNSvTQXMUeY9uYSiennRGpLizQ19GXWwBMRaECuQZR8DBNBLl066lYEmo1J49mgltzz6gFSA2/6Ykyq1yfsGB/nJBiXbvCT4W/Bx2bc= ARC-Authentication-Results: i=1; mx.zohomail.com; spf=pass (zohomail.com: domain of redhat.com designates 216.205.24.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [216.205.24.124]) by mx.zohomail.com with SMTPS id 1619077365697379.7470948711914; Thu, 22 Apr 2021 00:42:45 -0700 (PDT) Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-503-rxHA8WyqP9-ErVMCUdBBMA-1; Thu, 22 Apr 2021 03:42:37 -0400 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id AF800801814; Thu, 22 Apr 2021 07:42:31 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.20]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 5053C29242; Thu, 22 Apr 2021 07:42:31 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id 8382E1806D1A; Thu, 22 Apr 2021 07:42:29 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.rdu2.redhat.com [10.11.54.3]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id 13M7gRku025386 for ; Thu, 22 Apr 2021 03:42:28 -0400 Received: by smtp.corp.redhat.com (Postfix) id B9F6F115D35E; Thu, 22 Apr 2021 07:42:27 +0000 (UTC) Received: from mimecast-mx02.redhat.com (mimecast06.extmail.prod.ext.rdu2.redhat.com [10.11.55.22]) by smtp.corp.redhat.com (Postfix) with ESMTPS id B59F61043DED for ; Thu, 22 Apr 2021 07:42:25 +0000 (UTC) Received: from us-smtp-1.mimecast.com (us-smtp-delivery-1.mimecast.com [205.139.110.120]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 4D44B185A7B8 for ; Thu, 22 Apr 2021 07:42:25 +0000 (UTC) Received: from m97136.mail.qiye.163.com (m97136.mail.qiye.163.com [220.181.97.136]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-100-4K6RYSFIN1iYr8r3JQM81A-1; Thu, 22 Apr 2021 03:42:17 -0400 Received: from localhost.localdomain (unknown [58.56.27.130]) by smtp2 (Coremail) with SMTP id iOCowAA3HLYJJYFgMwTJAQ--.5876S23; Thu, 22 Apr 2021 15:26:09 +0800 (CST) X-MC-Unique: rxHA8WyqP9-ErVMCUdBBMA-1 X-MC-Unique: 4K6RYSFIN1iYr8r3JQM81A-1 From: Shi Lei To: libvir-list@redhat.com Subject: [RFCv3 21/25] conf: Replace virNetworkDNSForwarderParseXML(hardcoded) with namesake(generated) Date: Thu, 22 Apr 2021 15:25:29 +0800 Message-Id: <20210422072533.312211-22-shi_lei@massclouds.com> In-Reply-To: <20210422072533.312211-1-shi_lei@massclouds.com> References: <20210422072533.312211-1-shi_lei@massclouds.com> MIME-Version: 1.0 X-CM-TRANSID: iOCowAA3HLYJJYFgMwTJAQ--.5876S23 X-Coremail-Antispam: 1Uf129KBjvJXoWxurW7uryDArWktFyfAryxXwb_yoW5Gw1DpF n8J3ZrAa1rWa1Fk3y2yrZYkrn8Cw18Jw4Yg3yfWw1Sv3yUJrn2kF1fur1IvFW5WrW5Ar13 AF4Yvrs8Gr1UAFUanT9S1TB71UUUUU7qnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDUYxBIdaVFxhVjvjDU0xZFpf9x0JbKv35UUUUU= X-Originating-IP: [58.56.27.130] X-CM-SenderInfo: pvklsz1hl6ztxvvfz0xxgvhudrp/1tbiUBF8T1f4qUc4MAAAs7 X-Mimecast-Impersonation-Protect: Policy=CLT - Impersonation Protection Definition; Similar Internal Domain=false; Similar Monitored External Domain=false; Custom External Domain=false; Mimecast External Domain=false; Newly Observed Domain=false; Internal User Name=false; Custom Display Name List=false; Reply-to Address Mismatch=false; Targeted Threat Dictionary=false; Mimecast Threat Dictionary=false; Custom Threat Dictionary=false X-Scanned-By: MIMEDefang 2.78 on 10.11.54.3 X-loop: libvir-list@redhat.com Cc: Shi Lei X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=libvir-list-bounces@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Signed-off-by: Shi Lei --- src/conf/network_conf.c | 36 +----------------------------------- src/conf/network_conf.h | 7 ++++--- 2 files changed, 5 insertions(+), 38 deletions(-) diff --git a/src/conf/network_conf.c b/src/conf/network_conf.c index cf9e77d3..ef28bb4d 100644 --- a/src/conf/network_conf.c +++ b/src/conf/network_conf.c @@ -174,13 +174,6 @@ virNetworkIPDefClear(virNetworkIPDef *def) } =20 =20 -static void -virNetworkDNSForwarderClear(virNetworkDNSForwarder *def) -{ - VIR_FREE(def->domain); -} - - static void virNetworkDNSDefClear(virNetworkDNSDef *def) { @@ -871,7 +864,7 @@ virNetworkDNSTxtDefParseHook(xmlNodePtr node G_GNUC_UNU= SED, } =20 =20 -static int +int virNetworkDNSForwarderParseHook(xmlNodePtr node G_GNUC_UNUSED, virNetworkDNSForwarder *def, const char *instname G_GNUC_UNUSED, @@ -890,33 +883,6 @@ virNetworkDNSForwarderParseHook(xmlNodePtr node G_GNUC= _UNUSED, } =20 =20 -static int -virNetworkDNSForwarderParseXML(xmlNodePtr node, - virNetworkDNSForwarder *def, - const char *networkName, - void *parent G_GNUC_UNUSED, - void *opaque) -{ - g_autofree char *addr =3D virXMLPropString(node, "addr"); - - if (addr && virSocketAddrParse(&def->addr, addr, AF_UNSPEC) < 0) { - virReportError(VIR_ERR_XML_ERROR, - _("Invalid forwarder IP address '%s' " - "in network '%s'"), - addr, networkName); - return -1; - } - - def->domain =3D virXMLPropString(node, "domain"); - - if (virNetworkDNSForwarderParseHook(node, def, networkName, def, opaqu= e, - addr) < 0) - return -1; - - return 0; -} - - static int virNetworkDNSDefParseXML(const char *networkName, xmlNodePtr node, diff --git a/src/conf/network_conf.h b/src/conf/network_conf.h index 836d088d..17f6c309 100644 --- a/src/conf/network_conf.h +++ b/src/conf/network_conf.h @@ -150,9 +150,9 @@ struct _virNetworkDNSHostDef { /* genparse, genformat = */ =20 =20 typedef struct _virNetworkDNSForwarder virNetworkDNSForwarder; -struct _virNetworkDNSForwarder { - virSocketAddr addr; - char *domain; +struct _virNetworkDNSForwarder { /* genparse */ + virSocketAddr addr; /* xmlattr */ + char *domain; /* xmlattr */ }; =20 typedef struct _virNetworkDNSDef virNetworkDNSDef; @@ -429,6 +429,7 @@ virNetworkDefUpdateSection(virNetworkDef *def, =20 VIR_ENUM_DECL(virNetworkTaint); =20 +#define ENABLE_VIR_NETWORK_DNSFORWARDER_PARSE_HOOK #define ENABLE_VIR_NETWORK_DNSHOST_DEF_PARSE_HOOK #define ENABLE_VIR_NETWORK_DNSSRV_DEF_PARSE_HOOK #define ENABLE_VIR_NETWORK_DNSTXT_DEF_PARSE_HOOK --=20 2.25.1 From nobody Tue Apr 23 19:28:24 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 170.10.133.124 as permitted sender) client-ip=170.10.133.124; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-delivery-124.mimecast.com; Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of redhat.com designates 170.10.133.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1619076765; cv=none; d=zohomail.com; s=zohoarc; b=IqGxws4D0uTXmFMbLofh2AqWgGnSe4tTdhKVHESsSX6p8+k4OsW9zj/iVctNyWVwEbYVl/RpnvF5ewnrpcvfI2c7A+vAQG0gof8Xn0iizRBVDljtQCLu7Hd0Jr/L+Ch0XwlX/VO/jHopAbk8sNndWiQBagb2bjN/BJOeXryCVeY= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1619076765; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=BWVFpySk9O4g9sGqaVvYeG7rCK6IADwQoyhCoKbpAvs=; b=XhBmaJRIkfPDc7TeDwauyR/TJ0UC03ildiTOGHa7mMpW/3qWvJK+J8whZIrLXBvdlxcUtWSHBlD7NNNcIl/iL6f1fQ/9iXgaAva6+zH5Z4yww7GeGQ4J0b1gTqYWwMZDkmAYOtQrXx8jJi89B86rgiiA2fyD5KEKCtrkOAzt6XE= ARC-Authentication-Results: i=1; mx.zohomail.com; spf=pass (zohomail.com: domain of redhat.com designates 170.10.133.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by mx.zohomail.com with SMTPS id 1619076765736745.1561052878578; Thu, 22 Apr 2021 00:32:45 -0700 (PDT) Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-226-quSha2dpMp67iY5xhNWtNA-1; Thu, 22 Apr 2021 03:32:41 -0400 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 74690343B8; Thu, 22 Apr 2021 07:32:37 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.21]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 50EA360BE5; Thu, 22 Apr 2021 07:32:37 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id 1A4A644A67; Thu, 22 Apr 2021 07:32:37 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.rdu2.redhat.com [10.11.54.6]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id 13M7WIlR023967 for ; Thu, 22 Apr 2021 03:32:19 -0400 Received: by smtp.corp.redhat.com (Postfix) id BADBA20BDB30; Thu, 22 Apr 2021 07:32:18 +0000 (UTC) Received: from mimecast-mx02.redhat.com (mimecast02.extmail.prod.ext.rdu2.redhat.com [10.11.55.18]) by smtp.corp.redhat.com (Postfix) with ESMTPS id B5B3020BDB2E for ; Thu, 22 Apr 2021 07:32:16 +0000 (UTC) Received: from us-smtp-1.mimecast.com (us-smtp-delivery-1.mimecast.com [205.139.110.120]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 28AF7A28802 for ; Thu, 22 Apr 2021 07:32:16 +0000 (UTC) Received: from m97136.mail.qiye.163.com (m97136.mail.qiye.163.com [220.181.97.136]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-592-O3tmIlFxN-iltuBjviHGqQ-1; Thu, 22 Apr 2021 03:32:12 -0400 Received: from localhost.localdomain (unknown [58.56.27.130]) by smtp2 (Coremail) with SMTP id iOCowAA3HLYJJYFgMwTJAQ--.5876S24; Thu, 22 Apr 2021 15:26:09 +0800 (CST) X-MC-Unique: quSha2dpMp67iY5xhNWtNA-1 X-MC-Unique: O3tmIlFxN-iltuBjviHGqQ-1 From: Shi Lei To: libvir-list@redhat.com Subject: [RFCv3 22/25] conf: Generate virNetworkDNSForwarderFormatBuf Date: Thu, 22 Apr 2021 15:25:30 +0800 Message-Id: <20210422072533.312211-23-shi_lei@massclouds.com> In-Reply-To: <20210422072533.312211-1-shi_lei@massclouds.com> References: <20210422072533.312211-1-shi_lei@massclouds.com> MIME-Version: 1.0 X-CM-TRANSID: iOCowAA3HLYJJYFgMwTJAQ--.5876S24 X-Coremail-Antispam: 1Uf129KBjDUn29KB7ZKAUJUUUU8529EdanIXcx71UUUUU7v73 VFW2AGmfu7bjvjm3AaLaJ3UbIYCTnIWIevJa73UjIFyTuYvjfULasbUUUUU X-Originating-IP: [58.56.27.130] X-CM-SenderInfo: pvklsz1hl6ztxvvfz0xxgvhudrp/1tbiSRF8T1dqAuu4awAAss X-Mimecast-Impersonation-Protect: Policy=CLT - Impersonation Protection Definition; Similar Internal Domain=false; Similar Monitored External Domain=false; Custom External Domain=false; Mimecast External Domain=false; Newly Observed Domain=false; Internal User Name=false; Custom Display Name List=false; Reply-to Address Mismatch=false; Targeted Threat Dictionary=false; Mimecast Threat Dictionary=false; Custom Threat Dictionary=false X-Scanned-By: MIMEDefang 2.78 on 10.11.54.6 X-loop: libvir-list@redhat.com Cc: Shi Lei X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=libvir-list-bounces@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Signed-off-by: Shi Lei --- src/conf/network_conf.c | 18 +++--------------- src/conf/network_conf.h | 4 ++-- 2 files changed, 5 insertions(+), 17 deletions(-) diff --git a/src/conf/network_conf.c b/src/conf/network_conf.c index ef28bb4d..be639500 100644 --- a/src/conf/network_conf.c +++ b/src/conf/network_conf.c @@ -2135,21 +2135,9 @@ virNetworkDNSDefFormat(virBuffer *buf, virBufferAdjustIndent(buf, 2); =20 for (i =3D 0; i < def->nfwds; i++) { - - virBufferAddLit(buf, "forwarders[i].domain) { - virBufferEscapeString(buf, " domain=3D'%s'", - def->forwarders[i].domain); - } - if (VIR_SOCKET_ADDR_VALID(&def->forwarders[i].addr)) { - g_autofree char *addr =3D virSocketAddrFormat(&def->forwarders= [i].addr); - - if (!addr) - return -1; - - virBufferAsprintf(buf, " addr=3D'%s'", addr); - } - virBufferAddLit(buf, "/>\n"); + if (virNetworkDNSForwarderFormatBuf(buf, "forwarder", + &def->forwarders[i], def, NULL= ) < 0) + return -1; } =20 for (i =3D 0; i < def->ntxts; i++) { diff --git a/src/conf/network_conf.h b/src/conf/network_conf.h index 17f6c309..577c1568 100644 --- a/src/conf/network_conf.h +++ b/src/conf/network_conf.h @@ -150,9 +150,9 @@ struct _virNetworkDNSHostDef { /* genparse, genformat = */ =20 =20 typedef struct _virNetworkDNSForwarder virNetworkDNSForwarder; -struct _virNetworkDNSForwarder { /* genparse */ - virSocketAddr addr; /* xmlattr */ +struct _virNetworkDNSForwarder { /* genparse, genformat */ char *domain; /* xmlattr */ + virSocketAddr addr; /* xmlattr */ }; =20 typedef struct _virNetworkDNSDef virNetworkDNSDef; --=20 2.25.1 From nobody Tue Apr 23 19:28:24 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 216.205.24.124 as permitted sender) client-ip=216.205.24.124; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-delivery-124.mimecast.com; Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of redhat.com designates 216.205.24.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1619076781; cv=none; d=zohomail.com; s=zohoarc; b=Bm+PrI/CLgVMTE+NZRiAEPJQLt8ELplq2O3GimbTfcyPeIBeX+ukRXF/zfy2oYMYzqnOKwu42eqDFkJtHkj9DOnS+/ZT+Dy/CUrGadZTWtnSZr2r0SqZo3Tfg6R2N8pwgeJ+HmPjpDkCeYvKADu3jVoZVvNFT4ff9IBHRsa3pYA= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1619076781; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=zH1muDkp9G/vpXI7ioDl+5jQpMFQbbxf038QVDVmSUA=; b=Y/0YO5pXhHpZHVvT0GKJd82sgbjkqzUi9wvriLoKXFNyyu7NV7weNVBhfoVvSQBqbwjKPdRZmtnCrtErJZ6bpxRCkBKVUZu4Q/dN8hQt/TS7+F1q0cneQIeUOcwLEllJyXC1vqoy7749isiLlTMx7sOnvTzryPOZF67dKpd9rZI= ARC-Authentication-Results: i=1; mx.zohomail.com; spf=pass (zohomail.com: domain of redhat.com designates 216.205.24.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [216.205.24.124]) by mx.zohomail.com with SMTPS id 1619076781328794.8502313901812; Thu, 22 Apr 2021 00:33:01 -0700 (PDT) Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-229-15ZOSbS_O8yP0AEnaYGaSw-1; Thu, 22 Apr 2021 03:32:57 -0400 Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 6B108107ACC7; Thu, 22 Apr 2021 07:32:51 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.20]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 42C01101F965; Thu, 22 Apr 2021 07:32:51 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id 0A5521806D33; Thu, 22 Apr 2021 07:32:51 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.rdu2.redhat.com [10.11.54.6]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id 13M7Wkpf024126 for ; Thu, 22 Apr 2021 03:32:46 -0400 Received: by smtp.corp.redhat.com (Postfix) id 8B05420BDB2F; Thu, 22 Apr 2021 07:32:46 +0000 (UTC) Received: from mimecast-mx02.redhat.com (mimecast06.extmail.prod.ext.rdu2.redhat.com [10.11.55.22]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 2DA1620BDB30 for ; Thu, 22 Apr 2021 07:32:45 +0000 (UTC) Received: from us-smtp-1.mimecast.com (us-smtp-delivery-1.mimecast.com [205.139.110.120]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 1C779185A7A5 for ; Thu, 22 Apr 2021 07:32:45 +0000 (UTC) Received: from m97136.mail.qiye.163.com (m97136.mail.qiye.163.com [220.181.97.136]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-362-rW-wtzmTP5aMR9HluhNYpA-1; Thu, 22 Apr 2021 03:32:12 -0400 Received: from localhost.localdomain (unknown [58.56.27.130]) by smtp2 (Coremail) with SMTP id iOCowAA3HLYJJYFgMwTJAQ--.5876S25; Thu, 22 Apr 2021 15:26:09 +0800 (CST) X-MC-Unique: 15ZOSbS_O8yP0AEnaYGaSw-1 X-MC-Unique: rW-wtzmTP5aMR9HluhNYpA-1 From: Shi Lei To: libvir-list@redhat.com Subject: [RFCv3 23/25] conf: Extract error-checking code from virNetworkDNSDefParseXML Date: Thu, 22 Apr 2021 15:25:31 +0800 Message-Id: <20210422072533.312211-24-shi_lei@massclouds.com> In-Reply-To: <20210422072533.312211-1-shi_lei@massclouds.com> References: <20210422072533.312211-1-shi_lei@massclouds.com> MIME-Version: 1.0 X-CM-TRANSID: iOCowAA3HLYJJYFgMwTJAQ--.5876S25 X-Coremail-Antispam: 1Uf129KBjDUn29KB7ZKAUJUUUU8529EdanIXcx71UUUUU7v73 VFW2AGmfu7bjvjm3AaLaJ3UbIYCTnIWIevJa73UjIFyTuYvjfULasbUUUUU X-Originating-IP: [58.56.27.130] X-CM-SenderInfo: pvklsz1hl6ztxvvfz0xxgvhudrp/1tbieBF8T1qriKc+5wAAsd X-Mimecast-Impersonation-Protect: Policy=CLT - Impersonation Protection Definition; Similar Internal Domain=false; Similar Monitored External Domain=false; Custom External Domain=false; Mimecast External Domain=false; Newly Observed Domain=false; Internal User Name=false; Custom Display Name List=false; Reply-to Address Mismatch=false; Targeted Threat Dictionary=false; Mimecast Threat Dictionary=false; Custom Threat Dictionary=false X-Scanned-By: MIMEDefang 2.78 on 10.11.54.6 X-loop: libvir-list@redhat.com Cc: Shi Lei X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.84 on 10.5.11.22 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=libvir-list-bounces@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Signed-off-by: Shi Lei --- src/conf/network_conf.c | 34 ++++++++++++++++++++++++++++------ 1 file changed, 28 insertions(+), 6 deletions(-) diff --git a/src/conf/network_conf.c b/src/conf/network_conf.c index be639500..19408987 100644 --- a/src/conf/network_conf.c +++ b/src/conf/network_conf.c @@ -883,6 +883,31 @@ virNetworkDNSForwarderParseHook(xmlNodePtr node G_GNUC= _UNUSED, } =20 =20 +static int +virNetworkDNSDefParseHook(xmlNodePtr node G_GNUC_UNUSED, + virNetworkDNSDef *def, + const char *networkName, + void *parent G_GNUC_UNUSED, + void *opaque G_GNUC_UNUSED, + const char *enable G_GNUC_UNUSED, + const char *forwardPlainNames G_GNUC_UNUSED, + int nfwds, + int ntxts, + int nsrvs, + int nhosts) +{ + if (def->enable =3D=3D VIR_TRISTATE_BOOL_NO && + (nfwds || nhosts || nsrvs || ntxts)) { + virReportError(VIR_ERR_XML_ERROR, + _("Extra data in disabled network '%s'"), + networkName); + return -1; + } + + return 0; +} + + static int virNetworkDNSDefParseXML(const char *networkName, xmlNodePtr node, @@ -1004,13 +1029,10 @@ virNetworkDNSDefParseXML(const char *networkName, } } =20 - if (def->enable =3D=3D VIR_TRISTATE_BOOL_NO && - (nfwds || nhosts || nsrvs || ntxts)) { - virReportError(VIR_ERR_XML_ERROR, - _("Extra data in disabled network '%s'"), - networkName); + if (virNetworkDNSDefParseHook(node, def, networkName, def, NULL, + enable, forwardPlainNames, + nfwds, ntxts, nsrvs, nhosts) < 0) return -1; - } =20 return 0; } --=20 2.25.1 From nobody Tue Apr 23 19:28:24 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 216.205.24.124 as permitted sender) client-ip=216.205.24.124; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-delivery-124.mimecast.com; Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of redhat.com designates 216.205.24.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1619076749; cv=none; d=zohomail.com; s=zohoarc; b=ZPRDQtGWyJ77ugRuylfn/w1pTxoSUghEkntgC/h7r83zogBEIwCR5QTcuIvHSooodFGP+KsuO7WNZNPG3jbZ9k9rQDym52tdrRu/McCy+CmxxZ2TlvIU8/c+mO0auIjSKPNYhPr6CWWX6tC+MW4nHi/Iwmo80Szgtdms69+wWVc= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1619076749; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=wspc5c//vH1PKl6UikgiyAEeQAxpSMQhwCkuid6BSgQ=; b=LwhwYkFV6U6RpIMk/as54bIz1bGXabMHYqnPaXHd1CE32YE2wQ1iA0HsLqq/kMmX6DOpOIcjBi6ddEezLv0eGGC3LKrEIWvqtOjMhcS94RVYSCJtfflc6b0qU4+nAT6CQALx0rswlqVD5XbZoXTMeZ05R25CuVwQ2DhuKpYMwp0= ARC-Authentication-Results: i=1; mx.zohomail.com; spf=pass (zohomail.com: domain of redhat.com designates 216.205.24.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [216.205.24.124]) by mx.zohomail.com with SMTPS id 1619076749164881.6827683961898; Thu, 22 Apr 2021 00:32:29 -0700 (PDT) Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-245-J3TQy-7NNp6JgqaK6BHcyw-1; Thu, 22 Apr 2021 03:32:24 -0400 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 654D1814339; Thu, 22 Apr 2021 07:32:18 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.21]) by smtp.corp.redhat.com (Postfix) with ESMTPS id BA9085C260; Thu, 22 Apr 2021 07:32:17 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id 7E8004EA30; Thu, 22 Apr 2021 07:32:17 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.rdu2.redhat.com [10.11.54.5]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id 13M7VT4J023775 for ; Thu, 22 Apr 2021 03:31:29 -0400 Received: by smtp.corp.redhat.com (Postfix) id 13B50F8960; Thu, 22 Apr 2021 07:31:29 +0000 (UTC) Received: from mimecast-mx02.redhat.com (mimecast02.extmail.prod.ext.rdu2.redhat.com [10.11.55.18]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 0F0ECF8967 for ; Thu, 22 Apr 2021 07:31:27 +0000 (UTC) Received: from us-smtp-1.mimecast.com (us-smtp-delivery-1.mimecast.com [205.139.110.120]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id F35C1A2880F for ; Thu, 22 Apr 2021 07:31:26 +0000 (UTC) Received: from m97136.mail.qiye.163.com (m97136.mail.qiye.163.com [220.181.97.136]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-152-vAMW6N9KPBaDqyx8mrJPCA-1; Thu, 22 Apr 2021 03:31:23 -0400 Received: from localhost.localdomain (unknown [58.56.27.130]) by smtp2 (Coremail) with SMTP id iOCowAA3HLYJJYFgMwTJAQ--.5876S26; Thu, 22 Apr 2021 15:26:09 +0800 (CST) X-MC-Unique: J3TQy-7NNp6JgqaK6BHcyw-1 X-MC-Unique: vAMW6N9KPBaDqyx8mrJPCA-1 From: Shi Lei To: libvir-list@redhat.com Subject: [RFCv3 24/25] conf: Replace virNetworkDNSDefParseXML(hardcoded) with namesake(generated) Date: Thu, 22 Apr 2021 15:25:32 +0800 Message-Id: <20210422072533.312211-25-shi_lei@massclouds.com> In-Reply-To: <20210422072533.312211-1-shi_lei@massclouds.com> References: <20210422072533.312211-1-shi_lei@massclouds.com> MIME-Version: 1.0 X-CM-TRANSID: iOCowAA3HLYJJYFgMwTJAQ--.5876S26 X-Coremail-Antispam: 1Uf129KBjvJXoW3AryDJry5Xr1kXr48uF4UArb_yoWxCry3p3 Z5Jas0kFW8Wrn5K3yIyw4rJrn8uFy8JrWYkryxW3srA345Wr1xCrn3ury8ZF45WrW5Ar13 CF1aqrs8Gr4UAFUanT9S1TB71UUUUU7qnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDUYxBIdaVFxhVjvjDU0xZFpf9x0JbtoGLUUUUU= X-Originating-IP: [58.56.27.130] X-CM-SenderInfo: pvklsz1hl6ztxvvfz0xxgvhudrp/1tbiTwt8T1f4qZKeswAAsO X-Mimecast-Impersonation-Protect: Policy=CLT - Impersonation Protection Definition; Similar Internal Domain=false; Similar Monitored External Domain=false; Custom External Domain=false; Mimecast External Domain=false; Newly Observed Domain=false; Internal User Name=false; Custom Display Name List=false; Reply-to Address Mismatch=false; Targeted Threat Dictionary=false; Mimecast Threat Dictionary=false; Custom Threat Dictionary=false X-Scanned-By: MIMEDefang 2.79 on 10.11.54.5 X-loop: libvir-list@redhat.com Cc: Shi Lei X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=libvir-list-bounces@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Reorder the members of virNetworkDNSDef according to their orders in format function. Signed-off-by: Shi Lei --- src/conf/network_conf.c | 160 +--------------------------------------- src/conf/network_conf.h | 19 ++--- 2 files changed, 12 insertions(+), 167 deletions(-) diff --git a/src/conf/network_conf.c b/src/conf/network_conf.c index 19408987..364c10e2 100644 --- a/src/conf/network_conf.c +++ b/src/conf/network_conf.c @@ -174,32 +174,6 @@ virNetworkIPDefClear(virNetworkIPDef *def) } =20 =20 -static void -virNetworkDNSDefClear(virNetworkDNSDef *def) -{ - if (def->forwarders) { - while (def->nfwds) - virNetworkDNSForwarderClear(&def->forwarders[--def->nfwds]); - VIR_FREE(def->forwarders); - } - if (def->txts) { - while (def->ntxts) - virNetworkDNSTxtDefClear(&def->txts[--def->ntxts]); - VIR_FREE(def->txts); - } - if (def->hosts) { - while (def->nhosts) - virNetworkDNSHostDefClear(&def->hosts[--def->nhosts]); - VIR_FREE(def->hosts); - } - if (def->srvs) { - while (def->nsrvs) - virNetworkDNSSrvDefClear(&def->srvs[--def->nsrvs]); - VIR_FREE(def->srvs); - } -} - - static void virNetworkForwardDefClear(virNetworkForwardDef *def) { @@ -883,7 +857,7 @@ virNetworkDNSForwarderParseHook(xmlNodePtr node G_GNUC_= UNUSED, } =20 =20 -static int +int virNetworkDNSDefParseHook(xmlNodePtr node G_GNUC_UNUSED, virNetworkDNSDef *def, const char *networkName, @@ -908,136 +882,6 @@ virNetworkDNSDefParseHook(xmlNodePtr node G_GNUC_UNUS= ED, } =20 =20 -static int -virNetworkDNSDefParseXML(const char *networkName, - xmlNodePtr node, - xmlXPathContextPtr ctxt, - virNetworkDNSDef *def) -{ - g_autofree xmlNodePtr *hostNodes =3D NULL; - g_autofree xmlNodePtr *srvNodes =3D NULL; - g_autofree xmlNodePtr *txtNodes =3D NULL; - g_autofree xmlNodePtr *fwdNodes =3D NULL; - g_autofree char *forwardPlainNames =3D NULL; - g_autofree char *enable =3D NULL; - int nhosts, nsrvs, ntxts, nfwds; - size_t i; - VIR_XPATH_NODE_AUTORESTORE(ctxt) - - ctxt->node =3D node; - - enable =3D virXPathString("string(./@enable)", ctxt); - if (enable) { - def->enable =3D virTristateBoolTypeFromString(enable); - if (def->enable <=3D 0) { - virReportError(VIR_ERR_XML_ERROR, - _("Invalid dns enable setting '%s' " - "in network '%s'"), - enable, networkName); - return -1; - } - } - - forwardPlainNames =3D virXPathString("string(./@forwardPlainNames)", c= txt); - if (forwardPlainNames) { - def->forwardPlainNames =3D virTristateBoolTypeFromString(forwardPl= ainNames); - if (def->forwardPlainNames <=3D 0) { - virReportError(VIR_ERR_XML_ERROR, - _("Invalid dns forwardPlainNames setting '%s' " - "in network '%s'"), - forwardPlainNames, networkName); - return -1; - } - } - - nfwds =3D virXPathNodeSet("./forwarder", ctxt, &fwdNodes); - if (nfwds < 0) { - virReportError(VIR_ERR_XML_ERROR, - _("invalid element found in of ne= twork %s"), - networkName); - return -1; - } - if (nfwds > 0) { - def->forwarders =3D g_new0(virNetworkDNSForwarder, nfwds); - - for (i =3D 0; i < nfwds; i++) { - if (virNetworkDNSForwarderParseXML(fwdNodes[i], - &def->forwarders[i], - networkName, - def, - NULL) < 0) - return -1; - - def->nfwds++; - } - } - - nhosts =3D virXPathNodeSet("./host", ctxt, &hostNodes); - if (nhosts < 0) { - virReportError(VIR_ERR_XML_ERROR, - _("invalid element found in of network= %s"), - networkName); - return -1; - } - if (nhosts > 0) { - def->hosts =3D g_new0(virNetworkDNSHostDef, nhosts); - - for (i =3D 0; i < nhosts; i++) { - if (virNetworkDNSHostDefParseXML(hostNodes[i], &def->hosts[def= ->nhosts], - networkName, def, NULL) < 0) { - return -1; - } - def->nhosts++; - } - } - - nsrvs =3D virXPathNodeSet("./srv", ctxt, &srvNodes); - if (nsrvs < 0) { - virReportError(VIR_ERR_XML_ERROR, - _("invalid element found in of network = %s"), - networkName); - return -1; - } - if (nsrvs > 0) { - def->srvs =3D g_new0(virNetworkDNSSrvDef, nsrvs); - - for (i =3D 0; i < nsrvs; i++) { - if (virNetworkDNSSrvDefParseXML(srvNodes[i], &def->srvs[def->n= srvs], - networkName, def, NULL) < 0) { - return -1; - } - def->nsrvs++; - } - } - - ntxts =3D virXPathNodeSet("./txt", ctxt, &txtNodes); - if (ntxts < 0) { - virReportError(VIR_ERR_XML_ERROR, - _("invalid element found in of network = %s"), - networkName); - return -1; - } - if (ntxts > 0) { - def->txts =3D g_new0(virNetworkDNSTxtDef, ntxts); - - for (i =3D 0; i < ntxts; i++) { - if (virNetworkDNSTxtDefParseXML(txtNodes[i], &def->txts[def->n= txts], - networkName, def, NULL) < 0) { - return -1; - } - def->ntxts++; - } - } - - if (virNetworkDNSDefParseHook(node, def, networkName, def, NULL, - enable, forwardPlainNames, - nfwds, ntxts, nsrvs, nhosts) < 0) - return -1; - - return 0; -} - - static int virNetworkIPDefParseXML(const char *networkName, xmlNodePtr node, @@ -1795,7 +1639,7 @@ virNetworkDefParseXML(xmlXPathContextPtr ctxt, =20 dnsNode =3D virXPathNode("./dns", ctxt); if (dnsNode !=3D NULL && - virNetworkDNSDefParseXML(def->name, dnsNode, ctxt, &def->dns) < 0)= { + virNetworkDNSDefParseXML(dnsNode, &def->dns, def->name, def, NULL)= < 0) { return NULL; } =20 diff --git a/src/conf/network_conf.h b/src/conf/network_conf.h index 577c1568..9968d962 100644 --- a/src/conf/network_conf.h +++ b/src/conf/network_conf.h @@ -156,17 +156,17 @@ struct _virNetworkDNSForwarder { /* genparse, genf= ormat */ }; =20 typedef struct _virNetworkDNSDef virNetworkDNSDef; -struct _virNetworkDNSDef { - int enable; /* enum virTristateBool */ - int forwardPlainNames; /* enum virTristateBool */ +struct _virNetworkDNSDef { /* genparse */ + virTristateBool enable; /* xmlattr */ + virTristateBool forwardPlainNames; /* xmlattr */ + size_t nfwds; + virNetworkDNSForwarder *forwarders; /* xmlelem, array:nfwds */ size_t ntxts; - virNetworkDNSTxtDef *txts; - size_t nhosts; - virNetworkDNSHostDef *hosts; + virNetworkDNSTxtDef *txts; /* xmlelem, array */ size_t nsrvs; - virNetworkDNSSrvDef *srvs; - size_t nfwds; - virNetworkDNSForwarder *forwarders; + virNetworkDNSSrvDef *srvs; /* xmlelem, array */ + size_t nhosts; + virNetworkDNSHostDef *hosts; /* xmlelem, array */ }; =20 typedef struct _virNetworkIPDef virNetworkIPDef; @@ -429,6 +429,7 @@ virNetworkDefUpdateSection(virNetworkDef *def, =20 VIR_ENUM_DECL(virNetworkTaint); =20 +#define ENABLE_VIR_NETWORK_DNSDEF_PARSE_HOOK #define ENABLE_VIR_NETWORK_DNSFORWARDER_PARSE_HOOK #define ENABLE_VIR_NETWORK_DNSHOST_DEF_PARSE_HOOK #define ENABLE_VIR_NETWORK_DNSSRV_DEF_PARSE_HOOK --=20 2.25.1 From nobody Tue Apr 23 19:28:24 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 170.10.133.124 as permitted sender) client-ip=170.10.133.124; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-delivery-124.mimecast.com; Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of redhat.com designates 170.10.133.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1619076754; cv=none; d=zohomail.com; s=zohoarc; b=dukU0uiS9XHMKPtdmutk9mR5wf5KLGbyHW5dnBO2AJ2bzuf4EJlRgV2iCc9fDYOrfN8z+DXzwykNMcD96uZu1zLUF6iI4e9LqAnRlAY2xIOVp1uAgFovfURiq1ENSE02TUhBpgjWPKjhg6BixMlkjHt5ihDus3I79+pKdtxuLrw= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1619076754; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=hDmz0R/HGn3PgJ0idoa+CXHqocNS7omC7oP8sp6GrSQ=; b=lrI9cvoVj6lGXBGsl9a+Yatt8iEfI2Z2Y7v9l6EWfSFCQm7UySco8P8Xo2SVyyQBQGgbdf6IeNepnaWhVltIqMwOz2JfrsKDKfZYY8jU+6izb299CGOEHsgZhQVrIyT9TWzJrvI0vUlg4JBAPZDq1RZbMuoeNuX8FrEK7V7b7f4= ARC-Authentication-Results: i=1; mx.zohomail.com; spf=pass (zohomail.com: domain of redhat.com designates 170.10.133.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by mx.zohomail.com with SMTPS id 1619076754781831.0555941930321; Thu, 22 Apr 2021 00:32:34 -0700 (PDT) Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-184-cPk2PrgdNqWwkykAhq_GMA-1; Thu, 22 Apr 2021 03:32:26 -0400 Received: from smtp.corp.redhat.com (int-mx08.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id C95DE18B9F58; Thu, 22 Apr 2021 07:32:21 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.21]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 9E91219726; Thu, 22 Apr 2021 07:32:21 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id 62B3744A5B; Thu, 22 Apr 2021 07:32:21 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.rdu2.redhat.com [10.11.54.4]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id 13M7Vfm4023857 for ; Thu, 22 Apr 2021 03:31:41 -0400 Received: by smtp.corp.redhat.com (Postfix) id 6113420FE6D1; Thu, 22 Apr 2021 07:31:41 +0000 (UTC) Received: from mimecast-mx02.redhat.com (mimecast05.extmail.prod.ext.rdu2.redhat.com [10.11.55.21]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 5C8E720FE6CF for ; Thu, 22 Apr 2021 07:31:41 +0000 (UTC) Received: from us-smtp-1.mimecast.com (us-smtp-delivery-1.mimecast.com [207.211.31.120]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 45E9080A1D2 for ; Thu, 22 Apr 2021 07:31:41 +0000 (UTC) Received: from m97136.mail.qiye.163.com (m97136.mail.qiye.163.com [220.181.97.136]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-65-dHDnIytRMhixwLO7DEiY-A-1; Thu, 22 Apr 2021 03:31:27 -0400 Received: from localhost.localdomain (unknown [58.56.27.130]) by smtp2 (Coremail) with SMTP id iOCowAA3HLYJJYFgMwTJAQ--.5876S27; Thu, 22 Apr 2021 15:26:10 +0800 (CST) X-MC-Unique: cPk2PrgdNqWwkykAhq_GMA-1 X-MC-Unique: dHDnIytRMhixwLO7DEiY-A-1 From: Shi Lei To: libvir-list@redhat.com Subject: [RFCv3 25/25] conf: Generate virNetworkDNSDefFormatBuf Date: Thu, 22 Apr 2021 15:25:33 +0800 Message-Id: <20210422072533.312211-26-shi_lei@massclouds.com> In-Reply-To: <20210422072533.312211-1-shi_lei@massclouds.com> References: <20210422072533.312211-1-shi_lei@massclouds.com> MIME-Version: 1.0 X-CM-TRANSID: iOCowAA3HLYJJYFgMwTJAQ--.5876S27 X-Coremail-Antispam: 1Uf129KBjvJXoWxXFy8uryfXr4rAr4UWr1kGrg_yoW5Zry7pF n3tFn0yFW8WFy5Kryjy3yfKrn8uFykXw4rGrZ7W3yxZ3y5Gw1fAFyxCry0v3yrWrWYkrW5 AF1Fgrs8J3y8JFUanT9S1TB71UUUUU7qnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDUYxBIdaVFxhVjvjDU0xZFpf9x0JbtoGLUUUUU= X-Originating-IP: [58.56.27.130] X-CM-SenderInfo: pvklsz1hl6ztxvvfz0xxgvhudrp/1tbifRJ8T1rpO2SAJQAAsV X-Mimecast-Impersonation-Protect: Policy=CLT - Impersonation Protection Definition; Similar Internal Domain=false; Similar Monitored External Domain=false; Custom External Domain=false; Mimecast External Domain=false; Newly Observed Domain=false; Internal User Name=false; Custom Display Name List=false; Reply-to Address Mismatch=false; Targeted Threat Dictionary=false; Mimecast Threat Dictionary=false; Custom Threat Dictionary=false X-Scanned-By: MIMEDefang 2.78 on 10.11.54.4 X-loop: libvir-list@redhat.com Cc: Shi Lei X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.84 on 10.5.11.23 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=libvir-list-bounces@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Signed-off-by: Shi Lei --- src/conf/network_conf.c | 73 +---------------------------------------- src/conf/network_conf.h | 2 +- 2 files changed, 2 insertions(+), 73 deletions(-) diff --git a/src/conf/network_conf.c b/src/conf/network_conf.c index 364c10e2..a652110c 100644 --- a/src/conf/network_conf.c +++ b/src/conf/network_conf.c @@ -1959,77 +1959,6 @@ virNetworkDefParseNode(xmlDocPtr xml, } =20 =20 -static int -virNetworkDNSDefFormat(virBuffer *buf, - const virNetworkDNSDef *def) -{ - size_t i; - - if (!(def->enable || def->forwardPlainNames || def->nfwds || def->nhos= ts || - def->nsrvs || def->ntxts)) - return 0; - - virBufferAddLit(buf, "enable) { - const char *fwd =3D virTristateBoolTypeToString(def->enable); - - if (!fwd) { - virReportError(VIR_ERR_INTERNAL_ERROR, - _("Unknown enable type %d in network"), - def->enable); - return -1; - } - virBufferAsprintf(buf, " enable=3D'%s'", fwd); - } - if (def->forwardPlainNames) { - const char *fwd =3D virTristateBoolTypeToString(def->forwardPlainN= ames); - - if (!fwd) { - virReportError(VIR_ERR_INTERNAL_ERROR, - _("Unknown forwardPlainNames type %d in network= "), - def->forwardPlainNames); - return -1; - } - virBufferAsprintf(buf, " forwardPlainNames=3D'%s'", fwd); - } - if (!(def->nfwds || def->nhosts || def->nsrvs || def->ntxts)) { - virBufferAddLit(buf, "/>\n"); - return 0; - } - - virBufferAddLit(buf, ">\n"); - virBufferAdjustIndent(buf, 2); - - for (i =3D 0; i < def->nfwds; i++) { - if (virNetworkDNSForwarderFormatBuf(buf, "forwarder", - &def->forwarders[i], def, NULL= ) < 0) - return -1; - } - - for (i =3D 0; i < def->ntxts; i++) { - if (virNetworkDNSTxtDefFormatBuf(buf, "txt", &def->txts[i], def, N= ULL) < 0) - return -1; - } - - for (i =3D 0; i < def->nsrvs; i++) { - if (def->srvs[i].service && def->srvs[i].protocol) { - if (virNetworkDNSSrvDefFormatBuf(buf, "srv", &def->srvs[i], de= f, NULL) < 0) - return -1; - } - } - - if (def->nhosts) { - for (i =3D 0; i < def->nhosts; i++) { - if (virNetworkDNSHostDefFormatBuf(buf, "host", &def->hosts[i],= def, NULL) < 0) - return -1; - } - } - virBufferAdjustIndent(buf, -2); - virBufferAddLit(buf, "\n"); - return 0; -} - - static int virNetworkIPDefFormat(virBuffer *buf, const virNetworkIPDef *def) @@ -2436,7 +2365,7 @@ virNetworkDefFormatBuf(virBuffer *buf, virBufferAddLit(buf, "/>\n"); } =20 - if (virNetworkDNSDefFormat(buf, &def->dns) < 0) + if (virNetworkDNSDefFormatBuf(buf, "dns", &def->dns, def, NULL) < 0) return -1; =20 if (virNetDevVlanFormat(&def->vlan, buf) < 0) diff --git a/src/conf/network_conf.h b/src/conf/network_conf.h index 9968d962..b0675175 100644 --- a/src/conf/network_conf.h +++ b/src/conf/network_conf.h @@ -156,7 +156,7 @@ struct _virNetworkDNSForwarder { /* genparse, genfor= mat */ }; =20 typedef struct _virNetworkDNSDef virNetworkDNSDef; -struct _virNetworkDNSDef { /* genparse */ +struct _virNetworkDNSDef { /* genparse, genformat */ virTristateBool enable; /* xmlattr */ virTristateBool forwardPlainNames; /* xmlattr */ size_t nfwds; --=20 2.25.1