From 426f70261d61db359e573e06b03575ee8cf50f5d Mon Sep 17 00:00:00 2001 From: "Jan Alexander Steffens (heftig)" Date: Tue, 11 Jul 2017 21:52:37 +0200 Subject: [PATCH] avahi-python: Use the agnostic DBM interface Also fixes configure failing if Python 3 and GDBM are in use, since Py3 only has anydbm under the name of 'dbm'. --- avahi-python/avahi/Makefile.am | 15 +----------- avahi-python/avahi/ServiceTypeDatabase.py.in | 31 ++++++++++++++++++------- configure.ac | 9 ++++--- service-type-database/.gitignore | 1 - service-type-database/Makefile.am | 18 ++++---------- service-type-database/{build-db.in => build-db} | 13 +++++++---- 6 files changed, 41 insertions(+), 46 deletions(-) rename service-type-database/{build-db.in => build-db} (87%) diff --git a/avahi-python/avahi/Makefile.am b/avahi-python/avahi/Makefile.am index 3eb67d0df438a7f8..c906b9bf3b6d0708 100644 --- a/avahi-python/avahi/Makefile.am +++ b/avahi-python/avahi/Makefile.am @@ -25,29 +25,16 @@ avahidir = $(pythondir)/avahi if HAVE_GDBM nodist_avahi_SCRIPTS = ServiceTypeDatabase.py - -ServiceTypeDatabase.py: ServiceTypeDatabase.py.in - $(AM_V_GEN)sed -e 's,@PYTHON\@,$(PYTHON),g' \ - -e 's,@DBM\@,gdbm,g' \ - -e 's,@FIRST_KEY\@,key = self.db.firstkey(),g' \ - -e 's,@CHECK_KEY\@,while key is not None:,g' \ - -e 's,@NEXT_KEY\@,key = self.db.nextkey(key),g' \ - -e 's,@pkglibdatadir\@,$(pkglibdatadir),g' $< > $@ && \ - chmod +x $@ endif if HAVE_DBM nodist_avahi_SCRIPTS = ServiceTypeDatabase.py +endif ServiceTypeDatabase.py: ServiceTypeDatabase.py.in $(AM_V_GEN)sed -e 's,@PYTHON\@,$(PYTHON),g' \ - -e 's,@DBM\@,dbm,g' \ - -e 's,@FIRST_KEY\@,keys = self.db.keys(),g' \ - -e 's,@CHECK_KEY\@,for key in keys:,g' \ - -e 's,@NEXT_KEY\@,,g' \ -e 's,@pkglibdatadir\@,$(pkglibdatadir),g' $< > $@ && \ chmod +x $@ -endif avahi_PYTHON = $(avahi_SCRIPTS) diff --git a/avahi-python/avahi/ServiceTypeDatabase.py.in b/avahi-python/avahi/ServiceTypeDatabase.py.in index 4ddd654409deb983..d7f9969bbd5a6ab0 100644 --- a/avahi-python/avahi/ServiceTypeDatabase.py.in +++ b/avahi-python/avahi/ServiceTypeDatabase.py.in @@ -17,18 +17,22 @@ # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 # USA. -import @DBM@ +try: + import anydbm as dbm +except ImportError: + import dbm + import locale import re locale.setlocale(locale.LC_ALL, '') class ServiceTypeDatabase: """ServiceTypeDatabase maps service types to descriptions""" def __init__(self, filename = "@pkglibdatadir@/service-types.db"): - self.db = @DBM@.open(filename, "r") + self.db = dbm.open(filename, "r") l = locale.getlocale(locale.LC_MESSAGES) @@ -90,13 +94,24 @@ class ServiceTypeDatabase: def __iter__(self): - @FIRST_KEY@ - @CHECK_KEY@ + def want_key(key): + if not re.search('_[a-zA-Z0-9-]+\._[a-zA-Z0-9-]+', key): + return False + if re.search('_[a-zA-Z0-9-]+\._[a-zA-Z0-9-]+\[.*\]', key): + return False + return True - if re.search('_[a-zA-Z0-9-]+\._[a-zA-Z0-9-]+', key) and not re.search('_[a-zA-Z0-9-]+\._[a-zA-Z0-9-]+\[.*\]', key): - yield key - - @NEXT_KEY@ + try: + key = self.db.firstkey() + except AttributeError: + for key in self.db.keys(): + if want_key(key): + yield key + else: + while key is not None: + if want_key(key): + yield key + key = self.db.nextkey(key) def __len__(self): diff --git a/configure.ac b/configure.ac index 66789718d45ff4ea..fbbf7cf3ef562a26 100644 --- a/configure.ac +++ b/configure.ac @@ -824,11 +824,10 @@ if test "x$HAVE_PYTHON" = "xyes" ; then fi AM_CHECK_PYMOD(socket,,,[AC_MSG_ERROR(Could not find Python module socket)]) - if test "x$HAVE_GDBM" = "xyes"; then - AM_CHECK_PYMOD(gdbm,,,[AC_MSG_ERROR(Could not find Python module gdbm)]) - fi - if test "x$HAVE_DBM" = "xyes"; then - AM_CHECK_PYMOD(dbm,,,[AC_MSG_ERROR(Could not find Python module dbm)]) + if test "x$HAVE_GDBM" = "xyes" || test "x$HAVE_DBM" = "xyes"; then + AM_CHECK_PYMOD(anydbm,,,[ + AM_CHECK_PYMOD(dbm,,,[AC_MSG_ERROR(Could not find Python module dbm)]) + ]) fi fi fi diff --git a/service-type-database/.gitignore b/service-type-database/.gitignore index 581f1929d521c01d..51b02600e70c1ceb 100644 --- a/service-type-database/.gitignore +++ b/service-type-database/.gitignore @@ -1,4 +1,3 @@ Makefile Makefile.in service-types.db -build-db diff --git a/service-type-database/Makefile.am b/service-type-database/Makefile.am index d184fde30f0758c5..f9fa0825e937f2f7 100644 --- a/service-type-database/Makefile.am +++ b/service-type-database/Makefile.am @@ -15,49 +15,39 @@ # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 # USA. -EXTRA_DIST=build-db.in service-types +EXTRA_DIST=service-types pkglibdatadir=$(libdir)/avahi pkglibdata_DATA= if HAVE_PYTHON if HAVE_GDBM noinst_SCRIPTS=build-db pkglibdata_DATA+=service-types.db -build-db: build-db.in - $(AM_V_GEN)sed -e 's,@PYTHON\@,$(PYTHON),g' \ - -e 's,@DBM\@,gdbm,g' $< > $@ && \ - chmod +x $@ - -service-types.db: service-types build-db +service-types.db: service-types $(AM_V_GEN)$(PYTHON) build-db $< $@.coming && \ mv $@.coming $@ -CLEANFILES = service-types.db build-db +CLEANFILES = service-types.db endif if HAVE_DBM noinst_SCRIPTS=build-db pkglibdata_DATA+=service-types.db.pag service-types.db.dir -build-db: build-db.in - $(AM_V_GEN)sed -e 's,@PYTHON\@,$(PYTHON),g' \ - -e 's,@DBM\@,dbm,g' $< > $@ && \ - chmod +x $@ - service-types.db.pag: service-types.db $(AM_V_GEN)mv service-types.db.coming.pag service-types.db.pag service-types.db.dir: service-types.db $(AM_V_GEN)mv service-types.db.coming.dir service-types.db.dir service-types.db: service-types build-db $(AM_V_GEN)$(PYTHON) build-db $< $@.coming && \ if test -f "$@.coming"; then mv $@.coming $@; fi -CLEANFILES = service-types.db* build-db +CLEANFILES = service-types.db* endif endif diff --git a/service-type-database/build-db.in b/service-type-database/build-db similarity index 87% rename from service-type-database/build-db.in rename to service-type-database/build-db index 4cda425374a79198..78ee892f606ea43c 100755 --- a/service-type-database/build-db.in +++ b/service-type-database/build-db @@ -1,37 +1,42 @@ -#!@PYTHON@ +#!/usr/bin/env python # -*-python-*- # This file is part of avahi. # # avahi 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 of the # License, or (at your option) any later version. # # avahi 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 Lesser General Public # License along with avahi; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 # USA. -import @DBM@, sys +try: + import anydbm as dbm +except ImportError: + import dbm + +import sys if len(sys.argv) > 1: infn = sys.argv[1] else: infn = "service-types" if len(sys.argv) > 2: outfn = sys.argv[2] else: outfn = infn + ".db" -db = @DBM@.open(outfn, "n") +db = dbm.open(outfn, "n") -for ln in file(infn, "r"): +for ln in open(infn, "r"): ln = ln.strip(" \r\n\t") if ln == "" or ln.startswith("#"): -- 2.13.2