diff --git a/Makefile.am b/Makefile.am
index 344c2ba41b..f19435e19a 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -48,6 +48,7 @@ EXTRA_DIST = \
scripts/augeas-gentest.py \
build-aux/check-spacing.pl \
scripts/check-aclperms.py \
+ scripts/check-drivername.py \
scripts/check-symfile.py \
scripts/check-symsorting.py \
scripts/dtrace2systemtap.py \
diff --git a/scripts/check-drivername.py b/scripts/check-drivername.py
new file mode 100644
index 0000000000..ba77a6d48d
--- /dev/null
+++ b/scripts/check-drivername.py
@@ -0,0 +1,113 @@
+#!/usr/bin/env python
+#
+# Copyright (C) 2013-2019 Red Hat, Inc.
+#
+# 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 __future__ import print_function
+
+import re
+import sys
+
+drvfiles = []
+symfiles = []
+for arg in sys.argv:
+ if arg.endswith(".h"):
+ drvfiles.append(arg)
+ else:
+ symfiles.append(arg)
+
+symbols = {}
+
+for symfile in symfiles:
+ with open(symfile, "r") as fh:
+ for line in fh:
+ m = re.search(r'''^\s*(vir\w+)\s*;\s*$''', line)
+ if m is not None:
+ symbols[m.group(1)] = True
+
+status = 0
+for drvfile in drvfiles:
+ with open(drvfile, "r") as fh:
+ for line in fh:
+ m = re.search(r'''\*(virDrv\w+)\s*\)''', line)
+ if m is not None:
+ drv = m.group(1)
+
+ skip = [
+ "virDrvStateInitialize",
+ "virDrvStateCleanup",
+ "virDrvStateReload",
+ "virDrvStateStop",
+ "virDrvConnectSupportsFeature",
+ "virDrvConnectURIProbe",
+ "virDrvDomainMigratePrepare",
+ "virDrvDomainMigratePrepare2",
+ "virDrvDomainMigratePrepare3",
+ "virDrvDomainMigratePrepare3Params",
+ "virDrvDomainMigratePrepareTunnel",
+ "virDrvDomainMigratePrepareTunnelParams",
+ "virDrvDomainMigratePrepareTunnel3",
+ "virDrvDomainMigratePrepareTunnel3Params",
+ "virDrvDomainMigratePerform",
+ "virDrvDomainMigratePerform3",
+ "virDrvDomainMigratePerform3Params",
+ "virDrvDomainMigrateConfirm",
+ "virDrvDomainMigrateConfirm3",
+ "virDrvDomainMigrateConfirm3Params",
+ "virDrvDomainMigrateBegin",
+ "virDrvDomainMigrateBegin3",
+ "virDrvDomainMigrateBegin3Params",
+ "virDrvDomainMigrateFinish",
+ "virDrvDomainMigrateFinish2",
+ "virDrvDomainMigrateFinish3",
+ "virDrvDomainMigrateFinish3Params",
+ "virDrvStreamInData",
+ ]
+ if drv in skip:
+ continue
+
+ sym = drv.replace("virDrv", "vir")
+
+ if sym not in symbols:
+ print("Driver method name %s doesn't match public API" %
+ drv)
+ status = 1
+ continue
+
+ m = re.search(r'''(\*vir\w+)\s*\)''', line)
+ if m is not None:
+ name = m.group(1)
+ print("Bogus name %s" % name)
+ status = 1
+ continue
+
+ m = re.search(r'''^\s*(virDrv\w+)\s+(\w+);\s*''', line)
+ if m is not None:
+ drv = m.group(1)
+ field = m.group(2)
+
+ tmp = drv.replace("virDrv", "")
+ if tmp.startswith("NWFilter"):
+ tmp = "nwfilter" + tmp[8:]
+ tmp = tmp[0:1].lower() + tmp[1:]
+
+ if tmp != field:
+ print("Driver struct field %s should be named %s" %
+ (field, tmp))
+ status = 1
+
+sys.exit(status)
diff --git a/src/Makefile.am b/src/Makefile.am
index f79969b9a7..09c714e63e 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -330,15 +330,25 @@ check-protocol:
endif !WITH_REMOTE
EXTRA_DIST += $(PROTOCOL_STRUCTS)
+DRIVERS = \
+ $(srcdir)/driver-hypervisor.h \
+ $(srcdir)/driver-interface.h \
+ $(srcdir)/driver-network.h \
+ $(srcdir)/driver-nodedev.h \
+ $(srcdir)/driver-nwfilter.h \
+ $(srcdir)/driver-secret.h \
+ $(srcdir)/driver-state.h \
+ $(srcdir)/driver-storage.h \
+ $(srcdir)/driver-stream.h \
+ $(NULL)
+
check-drivername:
- $(AM_V_GEN)$(PERL) $(srcdir)/check-drivername.pl \
- $(srcdir)/driver.h \
+ $(AM_V_GEN)$(RUNUTF8) $(PYTHON) $(top_srcdir)/scripts/check-drivername.py \
+ $(DRIVERS) \
$(srcdir)/libvirt_public.syms \
$(srcdir)/libvirt_qemu.syms \
$(srcdir)/libvirt_lxc.syms
-EXTRA_DIST += check-drivername.pl
-
check-driverimpls:
$(AM_V_GEN)$(PERL) $(srcdir)/check-driverimpls.pl \
$(DRIVER_SOURCE_FILES)
diff --git a/src/admin/Makefile.inc.am b/src/admin/Makefile.inc.am
index a02991df68..7ceccafa8e 100644
--- a/src/admin/Makefile.inc.am
+++ b/src/admin/Makefile.inc.am
@@ -116,7 +116,7 @@ check-admin-symsorting:
$(srcdir) $(ADMIN_SYM_FILES)
check-admin-drivername:
- $(AM_V_GEN)$(PERL) $(srcdir)/check-drivername.pl \
+ $(AM_V_GEN)$(RUNUTF8) $(PYTHON) $(top_srcdir)/scripts/check-drivername.py \
$(srcdir)/admin/libvirt_admin_public.syms
check-admin: check-admin-symfile check-admin-symsorting check-admin-drivername
diff --git a/src/check-drivername.pl b/src/check-drivername.pl
deleted file mode 100755
index 3a62193e33..0000000000
--- a/src/check-drivername.pl
+++ /dev/null
@@ -1,83 +0,0 @@
-#!/usr/bin/env perl
-#
-# Copyright (C) 2013 Red Hat, Inc.
-#
-# 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
-# .
-#
-
-use strict;
-use warnings;
-
-my $drvfile = shift;
-my @symfiles = @ARGV;
-
-my %symbols;
-
-foreach my $symfile (@symfiles) {
- open SYMFILE, "<", $symfile
- or die "cannot read $symfile: $!";
- while () {
- if (/^\s*(vir\w+)\s*;\s*$/) {
- $symbols{$1} = 1;
- }
- }
-
- close SYMFILE;
-}
-
-open DRVFILE, "<", $drvfile
- or die "cannot read $drvfile: $!";
-
-my $status = 0;
-
-while () {
- next if /virDrvConnectSupportsFeature/;
- if (/\*(virDrv\w+)\s*\)/) {
-
- my $drv = $1;
-
- next if $drv =~ /virDrvState/;
- next if $drv =~ /virDrvDomainMigrate(Prepare|Perform|Confirm|Begin|Finish)/;
-
- my $sym = $drv;
- $sym =~ s/virDrv/vir/;
-
- unless (exists $symbols{$sym}) {
- print "Driver method name $drv doesn't match public API name\n";
- $status = 1;
- }
- } elsif (/^\*(vir\w+)\s*\)/) {
- my $name = $1;
- print "Bogus name $1\n";
- $status = 1;
- } elsif (/^\s*(virDrv\w+)\s+(\w+);\s*/) {
- my $drv = $1;
- my $field = $2;
-
- my $tmp = $drv;
- $tmp =~ s/virDrv//;
- $tmp =~ s/^NWFilter/nwfilter/;
- $tmp =~ s/^(\w)/lc $1/e;
-
- unless ($tmp eq $field) {
- print "Driver struct field $field should be named $tmp\n";
- $status = 1;
- }
- }
-}
-
-close DRVFILE;
-
-exit $status;