Hi!

I have been spending recently much time in gdb looking into bind9 code. But as an excercise I have created potential base for pretty printers in gdb.

You may know it is possible to define custom display functions written in python in gdb. That helps especially when lot of members, which can be interpreted much simpler way. Common might be std::string displaying.

I have no time to play with extensively, but I have put together interesting piece for code for swig tool. That cannot process original dnsmasq header without much hassle, but I were able to export a lot of flags into python. There, using enum.Flag type, it can show nice and friendly text way from constants gathered. For example for F_ flag or SERV_ flag in struct server or crec. It could use a lot of polishing, but I think is a great way have code more understandable from debugger.

Just put those files into src, have swig and python development files installed and give it a try.

Nice example can be run from python:

from pydnsmasq import *
SERV(11)

<SERV.SERV_LITERAL_ADDRESS|SERV_USE_RESOLV|SERV_4ADDR: 11>

If you have ever been lost in flags in debugger, this should help you a lot! But I think common enumeration defines should be changed to enum in C directly. It would get understood right away.

PS: consider the same license as the project for them.

Cheers,
Petr

--
Petr Menšík
Software Engineer, RHEL
Red Hat, http://www.redhat.com/
PGP: DFCF908DB7C87E8E529925BC4931CA5B6C9FC5CB

Attachment: mkswig.sh
Description: application/shellscript

#!/usr/bin/python
# Copyright (c) 2024 Petr Menšík <pemen...@redhat.com>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; version 2 dated June, 1991, or
# (at your option) version 3 dated 29 June, 2007.
#
# This program 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 General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
#
#
# Small wrapper in python around swig generated dnsmasq module

import enum
import dnsmasq

def dnsmasq_make_flags(name):
   v = vars(dnsmasq)
   return enum.Flag(name, dict([(i, v[i]) for i in v if i.startswith(name+'_')]))

def dnsmasq_make_enum(name):
   v = vars(dnsmasq)
   return enum.Enum(name, dict([(i, v[i]) for i in v if i.startswith(name+'_')]))

ACTOPM  = dnsmasq_make_enum("ACTION")
OPT     = dnsmasq_make_enum("OPT")
EVENT   = dnsmasq_make_enum("EVENT")
TXT_STAT= dnsmasq_make_enum("TXT_STAT")
T       = dnsmasq_make_enum("T")

AH      = dnsmasq_make_flags("AH")
CONFIG  = dnsmasq_make_flags("CONFIG")
CONTEXT = dnsmasq_make_flags("CONTEXT")
DHOPT   = dnsmasq_make_flags("DHOPT")
DNSSEC_FAIL = dnsmasq_make_flags("DNSSEC_FAIL")
DUMP    = dnsmasq_make_flags("DUMP")
F       = dnsmasq_make_flags("F")
FREC    = dnsmasq_make_flags("FREC")
LEASE   = dnsmasq_make_flags("LEASE")
INAME   = dnsmasq_make_flags("INAME")
IFACE   = dnsmasq_make_flags("IFACE")
SERV    = dnsmasq_make_flags("SERV")

/* Copyright (c) 2024 Petr Menšík <pemen...@redhat.com>
 
   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; version 2 dated June, 1991, or
   (at your option) version 3 dated 29 June, 2007.
 
   This program 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 General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/

%module dnsmasq
%{
#define SWIG_FILE_WITH_INIT
#include "config.h"
#undef _STDIO_H
#undef _GNU_SOURCE
// generated by grep -E '^(#|typedef)' dnsmasq.h > dnsmasq-defines.h
#include "dnsmasq-defines.h"

struct daemon { } daemon;
%}
// %include "dnsmasq.h"
%include "dnsmasq-defines.h"
%include "dns-protocol.h"
%include "dhcp-protocol.h"
%include "dhcp6-protocol.h"
%include "radv-protocol.h"
%include "metrics.h"

#if 0
/* now create python code using those values as enumerators.
def dnsmasq_make_flags(name):
   return enum.Flag(name, dict([(i, v[i]) for i in vars(dnsmasq) if 
i.startswith(name+'_')]))

def dnsmasq_make_enum(name):
   return enum.Enum(name, dict([(i, v[i]) for i in vars(dnsmasq) if 
i.startswith(name+'_')]))

ACTOPM  = dnsmasq_make_enum("ACTION")
OPT     = dnsmasq_make_enum("OPT")
EVENT   = dnsmasq_make_enum("EVENT")
TXT_STAT= dnsmasq_make_enum("TXT_STAT")
T       = dnsmasq_make_enum("T")

AH      = dnsmasq_make_flags("AH")
CONFIG  = dnsmasq_make_flags("CONFIG")
CONTEXT = dnsmasq_make_flags("CONTEXT")
DHOPT   = dnsmasq_make_flags("DHOPT")
DNSSEC_FAIL = dnsmasq_make_flags("DNSSEC_FAIL")
DUMP    = dnsmasq_make_flags("DUMP")
F       = dnsmasq_make_flags("F")
FREC    = dnsmasq_make_flags("FREC")
LEASE   = dnsmasq_make_flags("LEASE")
INAME   = dnsmasq_make_flags("INAME")
IFACE   = dnsmasq_make_flags("IFACE")
SERV    = dnsmasq_make_flags("SERV")
*/
#endif
_______________________________________________
Dnsmasq-discuss mailing list
Dnsmasq-discuss@lists.thekelleys.org.uk
https://lists.thekelleys.org.uk/cgi-bin/mailman/listinfo/dnsmasq-discuss

Reply via email to