[libvirt] [PATCH 0/3] Prefer g_mkstemp_full and g_mkdtemp (glib chronicles)

Remove the dependency on three more gnulib modules: mkdtemp mkostemp mkostemps Note: this series is not affiliated with the kill-a-gnulib-module-a-day initiative Ján Tomko (3): Use g_mkstemp_full instead of mkostemp(s) Use g_mkdtemp instead of mkdtemp syntax-check: prefer g_mkstemp_full and g_mkdtemp build-aux/syntax-check.mk | 13 ++++++++++--- src/qemu/qemu_driver.c | 8 ++++---- src/qemu/qemu_process.c | 2 +- src/storage/storage_driver.c | 2 +- src/storage/storage_util.c | 2 +- src/util/virlog.c | 8 +------- src/vbox/vbox_common.c | 4 ++-- tests/fdstreamtest.c | 2 +- tests/qemuhotplugtest.c | 2 +- tests/qemumemlocktest.c | 2 +- tests/qemumonitortestutils.c | 2 +- tests/qemuxml2argvtest.c | 2 +- tests/qemuxml2xmltest.c | 2 +- tests/scsihosttest.c | 2 +- tests/testutilsqemu.c | 4 ++-- tests/vircgrouptest.c | 2 +- tests/virfiletest.c | 2 +- tests/virhostdevtest.c | 2 +- tests/virnetsockettest.c | 4 ++-- tests/virpcitest.c | 2 +- tests/virscsitest.c | 2 +- tools/vsh.c | 4 ++-- 22 files changed, 38 insertions(+), 37 deletions(-) -- 2.21.0

With g_mkstemp_full, there is no need to distinguish between mkostemp and mkostemps (no suffix vs. a suffix of a fixed length), because the GLib function looks for the XXXXXX pattern everywhere in the string. Use S_IRUSR | S_IWUSR for the permissions and do not pass O_RDWR in flags since it's implied. Signed-off-by: Ján Tomko <jtomko@redhat.com> --- src/qemu/qemu_driver.c | 8 ++++---- src/storage/storage_driver.c | 2 +- src/storage/storage_util.c | 2 +- src/util/virlog.c | 8 +------- src/vbox/vbox_common.c | 4 ++-- tests/virfiletest.c | 2 +- tools/vsh.c | 4 ++-- 7 files changed, 12 insertions(+), 18 deletions(-) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 159a6dc464..a9364dc7e3 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -4024,8 +4024,8 @@ qemuDomainScreenshot(virDomainPtr dom, if (!(tmp = g_strdup_printf("%s/qemu.screendump.XXXXXX", cfg->cacheDir))) goto endjob; - if ((tmp_fd = mkostemp(tmp, O_CLOEXEC)) == -1) { - virReportSystemError(errno, _("mkostemp(\"%s\") failed"), tmp); + if ((tmp_fd = g_mkstemp_full(tmp, O_CLOEXEC, S_IRUSR | S_IWUSR)) == -1) { + virReportSystemError(errno, _("g_mkstemp(\"%s\") failed"), tmp); goto endjob; } unlink_tmp = true; @@ -11963,9 +11963,9 @@ qemuDomainMemoryPeek(virDomainPtr dom, goto endjob; /* Create a temporary filename. */ - if ((fd = mkostemp(tmp, O_CLOEXEC)) == -1) { + if ((fd = g_mkstemp_full(tmp, O_CLOEXEC, S_IRUSR | S_IWUSR)) == -1) { virReportSystemError(errno, - _("mkostemp(\"%s\") failed"), tmp); + _("g_mkstemp(\"%s\") failed"), tmp); goto endjob; } diff --git a/src/storage/storage_driver.c b/src/storage/storage_driver.c index 04e4abcd6a..d8355d3c3c 100644 --- a/src/storage/storage_driver.c +++ b/src/storage/storage_driver.c @@ -2825,7 +2825,7 @@ virStoragePoolObjFindPoolByUUID(const unsigned char *uuid) * * Generate a name for a temporary file using the driver stateDir * as a path, the pool name, and the volume name to be used as input - * for a mkostemp + * for mkstemp * * Returns a string pointer on success, NULL on failure */ diff --git a/src/storage/storage_util.c b/src/storage/storage_util.c index f91c2c64ee..8cc308e12d 100644 --- a/src/storage/storage_util.c +++ b/src/storage/storage_util.c @@ -1216,7 +1216,7 @@ storageBackendCreateQemuImgSecretPath(virStoragePoolObjPtr pool, if (!(secretPath = virStoragePoolObjBuildTempFilePath(pool, vol))) goto cleanup; - if ((fd = mkostemp(secretPath, O_CLOEXEC)) < 0) { + if ((fd = g_mkstemp_full(secretPath, O_CLOEXEC, S_IRUSR | S_IWUSR)) < 0) { virReportSystemError(errno, "%s", _("failed to open secret file for write")); goto error; diff --git a/src/util/virlog.c b/src/util/virlog.c index b3460d85fe..dcb287f146 100644 --- a/src/util/virlog.c +++ b/src/util/virlog.c @@ -996,13 +996,7 @@ virLogOutputToJournald(virLogSourcePtr source, * and pass an FD to the journal */ - /* NB: mkostemp is not declared async signal safe by - * POSIX, but this is Linux only code and the GLibc - * impl is safe enough, only using open() and inline - * asm to read a timestamp (falling back to gettimeofday - * on some arches - */ - if ((buffd = mkostemp(path, O_CLOEXEC|O_RDWR)) < 0) + if ((buffd = g_mkstemp_full(path, O_CLOEXEC, S_IRUSR | S_IWUSR)) < 0) return; if (unlink(path) < 0) diff --git a/src/vbox/vbox_common.c b/src/vbox/vbox_common.c index 0bd47e3ddb..043c26b9f6 100644 --- a/src/vbox/vbox_common.c +++ b/src/vbox/vbox_common.c @@ -7385,8 +7385,8 @@ vboxDomainScreenshot(virDomainPtr dom, tmp = g_strdup_printf("%s/vbox.screendump.XXXXXX", cacheDir); - if ((tmp_fd = mkostemp(tmp, O_CLOEXEC)) == -1) { - virReportSystemError(errno, _("mkostemp(\"%s\") failed"), tmp); + if ((tmp_fd = g_mkstemp_full(tmp, O_CLOEXEC, S_IRUSR | S_IWUSR)) == -1) { + virReportSystemError(errno, _("g_mkstemp(\"%s\") failed"), tmp); VIR_FREE(tmp); VBOX_RELEASE(machine); return NULL; diff --git a/tests/virfiletest.c b/tests/virfiletest.c index c7d5f6abeb..193c5bedd4 100644 --- a/tests/virfiletest.c +++ b/tests/virfiletest.c @@ -133,7 +133,7 @@ makeSparseFile(const off_t offsets[], off_t len = 0; size_t i; - if ((fd = mkostemp(path, O_CLOEXEC|O_RDWR)) < 0) + if ((fd = g_mkstemp_full(path, O_CLOEXEC, S_IRUSR | S_IWUSR)) < 0) goto error; if (unlink(path) < 0) diff --git a/tools/vsh.c b/tools/vsh.c index 000cf6a009..e851303e69 100644 --- a/tools/vsh.c +++ b/tools/vsh.c @@ -2400,9 +2400,9 @@ vshEditWriteToTempFile(vshControl *ctl, const char *doc) tmpdir = getenv("TMPDIR"); if (!tmpdir) tmpdir = "/tmp"; ret = g_strdup_printf("%s/virshXXXXXX.xml", tmpdir); - fd = mkostemps(ret, 4, O_CLOEXEC); + fd = g_mkstemp_full(ret, O_CLOEXEC, S_IRUSR | S_IWUSR); if (fd == -1) { - vshError(ctl, _("mkostemps: failed to create temporary file: %s"), + vshError(ctl, _("g_mkstemp: failed to create temporary file: %s"), virStrerror(errno, ebuf, sizeof(ebuf))); VIR_FREE(ret); return NULL; -- 2.21.0

On Thu, Nov 14, 2019 at 14:48:04 +0100, Ján Tomko wrote:
With g_mkstemp_full, there is no need to distinguish between mkostemp and mkostemps (no suffix vs. a suffix of a fixed length), because the GLib function looks for the XXXXXX pattern everywhere in the string.
Use S_IRUSR | S_IWUSR for the permissions and do not pass O_RDWR in flags since it's implied.
Signed-off-by: Ján Tomko <jtomko@redhat.com> --- src/qemu/qemu_driver.c | 8 ++++---- src/storage/storage_driver.c | 2 +- src/storage/storage_util.c | 2 +- src/util/virlog.c | 8 +------- src/vbox/vbox_common.c | 4 ++-- tests/virfiletest.c | 2 +- tools/vsh.c | 4 ++-- 7 files changed, 12 insertions(+), 18 deletions(-)
[...]
diff --git a/src/storage/storage_driver.c b/src/storage/storage_driver.c index 04e4abcd6a..d8355d3c3c 100644 --- a/src/storage/storage_driver.c +++ b/src/storage/storage_driver.c @@ -2825,7 +2825,7 @@ virStoragePoolObjFindPoolByUUID(const unsigned char *uuid) * * Generate a name for a temporary file using the driver stateDir * as a path, the pool name, and the volume name to be used as input - * for a mkostemp + * for mkstemp
Shouldn't we mention g_mkstemp_full?
* * Returns a string pointer on success, NULL on failure */
[...]
diff --git a/tools/vsh.c b/tools/vsh.c index 000cf6a009..e851303e69 100644 --- a/tools/vsh.c +++ b/tools/vsh.c @@ -2400,9 +2400,9 @@ vshEditWriteToTempFile(vshControl *ctl, const char *doc) tmpdir = getenv("TMPDIR"); if (!tmpdir) tmpdir = "/tmp"; ret = g_strdup_printf("%s/virshXXXXXX.xml", tmpdir); - fd = mkostemps(ret, 4, O_CLOEXEC); + fd = g_mkstemp_full(ret, O_CLOEXEC, S_IRUSR | S_IWUSR); if (fd == -1) { - vshError(ctl, _("mkostemps: failed to create temporary file: %s"), + vshError(ctl, _("g_mkstemp: failed to create temporary file: %s"),
_full
virStrerror(errno, ebuf, sizeof(ebuf))); VIR_FREE(ret); return NULL;
Reviewed-by: Peter Krempa <pkrempa@redhat.com>

On Thu, Nov 14, 2019 at 05:37:26PM +0100, Peter Krempa wrote:
On Thu, Nov 14, 2019 at 14:48:04 +0100, Ján Tomko wrote:
With g_mkstemp_full, there is no need to distinguish between mkostemp and mkostemps (no suffix vs. a suffix of a fixed length), because the GLib function looks for the XXXXXX pattern everywhere in the string.
Use S_IRUSR | S_IWUSR for the permissions and do not pass O_RDWR in flags since it's implied.
Signed-off-by: Ján Tomko <jtomko@redhat.com> --- src/qemu/qemu_driver.c | 8 ++++---- src/storage/storage_driver.c | 2 +- src/storage/storage_util.c | 2 +- src/util/virlog.c | 8 +------- src/vbox/vbox_common.c | 4 ++-- tests/virfiletest.c | 2 +- tools/vsh.c | 4 ++-- 7 files changed, 12 insertions(+), 18 deletions(-)
[...]
diff --git a/src/storage/storage_driver.c b/src/storage/storage_driver.c index 04e4abcd6a..d8355d3c3c 100644 --- a/src/storage/storage_driver.c +++ b/src/storage/storage_driver.c @@ -2825,7 +2825,7 @@ virStoragePoolObjFindPoolByUUID(const unsigned char *uuid) * * Generate a name for a temporary file using the driver stateDir * as a path, the pool name, and the volume name to be used as input - * for a mkostemp + * for mkstemp
Shouldn't we mention g_mkstemp_full?
Well, the XXXXXX template is not really g_mkstemp-specific
* * Returns a string pointer on success, NULL on failure */
[...]
diff --git a/tools/vsh.c b/tools/vsh.c index 000cf6a009..e851303e69 100644 --- a/tools/vsh.c +++ b/tools/vsh.c @@ -2400,9 +2400,9 @@ vshEditWriteToTempFile(vshControl *ctl, const char *doc) tmpdir = getenv("TMPDIR"); if (!tmpdir) tmpdir = "/tmp"; ret = g_strdup_printf("%s/virshXXXXXX.xml", tmpdir); - fd = mkostemps(ret, 4, O_CLOEXEC); + fd = g_mkstemp_full(ret, O_CLOEXEC, S_IRUSR | S_IWUSR); if (fd == -1) { - vshError(ctl, _("mkostemps: failed to create temporary file: %s"), + vshError(ctl, _("g_mkstemp: failed to create temporary file: %s"),
_full
Fixed. Jano
virStrerror(errno, ebuf, sizeof(ebuf))); VIR_FREE(ret); return NULL;
Reviewed-by: Peter Krempa <pkrempa@redhat.com>
-- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list

Prefer the GLib version to the one from gnulib. Signed-off-by: Ján Tomko <jtomko@redhat.com> --- src/qemu/qemu_process.c | 2 +- tests/fdstreamtest.c | 2 +- tests/qemuhotplugtest.c | 2 +- tests/qemumemlocktest.c | 2 +- tests/qemumonitortestutils.c | 2 +- tests/qemuxml2argvtest.c | 2 +- tests/qemuxml2xmltest.c | 2 +- tests/scsihosttest.c | 2 +- tests/testutilsqemu.c | 4 ++-- tests/vircgrouptest.c | 2 +- tests/virhostdevtest.c | 2 +- tests/virnetsockettest.c | 4 ++-- tests/virpcitest.c | 2 +- tests/virscsitest.c | 2 +- 14 files changed, 16 insertions(+), 16 deletions(-) diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index 4cf4069d50..a669fc608f 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -8508,7 +8508,7 @@ qemuProcessQMPInit(qemuProcessQMPPtr proc) template = g_strdup_printf("%s/qmp-XXXXXX", proc->libDir); - if (!(proc->uniqDir = mkdtemp(template))) { + if (!(proc->uniqDir = g_mkdtemp(template))) { virReportSystemError(errno, _("Failed to create unique directory with " "template '%s' for probing QEMU"), diff --git a/tests/fdstreamtest.c b/tests/fdstreamtest.c index f4d38d5a20..03f5520fa6 100644 --- a/tests/fdstreamtest.c +++ b/tests/fdstreamtest.c @@ -319,7 +319,7 @@ mymain(void) char scratchdir[] = SCRATCHDIRTEMPLATE; int ret = 0; - if (!mkdtemp(scratchdir)) { + if (!g_mkdtemp(scratchdir)) { virFilePrintf(stderr, "Cannot create fdstreamdir"); abort(); } diff --git a/tests/qemuhotplugtest.c b/tests/qemuhotplugtest.c index a0a579f29a..5356785fa4 100644 --- a/tests/qemuhotplugtest.c +++ b/tests/qemuhotplugtest.c @@ -593,7 +593,7 @@ mymain(void) fakerootdir = g_strdup(FAKEROOTDIRTEMPLATE); - if (!mkdtemp(fakerootdir)) { + if (!g_mkdtemp(fakerootdir)) { fprintf(stderr, "Cannot create fakerootdir"); abort(); } diff --git a/tests/qemumemlocktest.c b/tests/qemumemlocktest.c index d5a4fb1268..52cd9f9f26 100644 --- a/tests/qemumemlocktest.c +++ b/tests/qemumemlocktest.c @@ -62,7 +62,7 @@ mymain(void) fakerootdir = g_strdup(FAKEROOTDIRTEMPLATE); - if (!mkdtemp(fakerootdir)) { + if (!g_mkdtemp(fakerootdir)) { fprintf(stderr, "Cannot create fakerootdir"); abort(); } diff --git a/tests/qemumonitortestutils.c b/tests/qemumonitortestutils.c index d7ecdb2ef9..617a2997d1 100644 --- a/tests/qemumonitortestutils.c +++ b/tests/qemumonitortestutils.c @@ -1045,7 +1045,7 @@ qemuMonitorCommonTestNew(virDomainXMLOptionPtr xmlopt, tmpdir_template = g_strdup("/tmp/libvirt_XXXXXX"); - if (!(test->tmpdir = mkdtemp(tmpdir_template))) { + if (!(test->tmpdir = g_mkdtemp(tmpdir_template))) { virReportSystemError(errno, "%s", "Failed to create temporary directory"); goto error; diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c index f0405866e1..5e1d6a45c5 100644 --- a/tests/qemuxml2argvtest.c +++ b/tests/qemuxml2argvtest.c @@ -609,7 +609,7 @@ mymain(void) fakerootdir = g_strdup(FAKEROOTDIRTEMPLATE); - if (!mkdtemp(fakerootdir)) { + if (!g_mkdtemp(fakerootdir)) { fprintf(stderr, "Cannot create fakerootdir"); abort(); } diff --git a/tests/qemuxml2xmltest.c b/tests/qemuxml2xmltest.c index 8b256b9b19..08c85d3b73 100644 --- a/tests/qemuxml2xmltest.c +++ b/tests/qemuxml2xmltest.c @@ -142,7 +142,7 @@ mymain(void) fakerootdir = g_strdup(FAKEROOTDIRTEMPLATE); - if (!mkdtemp(fakerootdir)) { + if (!g_mkdtemp(fakerootdir)) { fprintf(stderr, "Cannot create fakerootdir"); abort(); } diff --git a/tests/scsihosttest.c b/tests/scsihosttest.c index b35ec6980a..e8193836ff 100644 --- a/tests/scsihosttest.c +++ b/tests/scsihosttest.c @@ -250,7 +250,7 @@ mymain(void) fakerootdir = g_strdup(FAKEROOTDIRTEMPLATE); - if (!mkdtemp(fakerootdir)) { + if (!g_mkdtemp(fakerootdir)) { fprintf(stderr, "Cannot create fakerootdir"); goto cleanup; } diff --git a/tests/testutilsqemu.c b/tests/testutilsqemu.c index 6fe385e545..5a7011478b 100644 --- a/tests/testutilsqemu.c +++ b/tests/testutilsqemu.c @@ -709,14 +709,14 @@ int qemuTestDriverInit(virQEMUDriver *driver) driver->config->libDir = g_strdup("/tmp/lib"); driver->config->channelTargetDir = g_strdup("/tmp/channel"); - if (!mkdtemp(statedir)) { + if (!g_mkdtemp(statedir)) { virFilePrintf(stderr, "Cannot create fake stateDir"); goto error; } driver->config->stateDir = g_strdup(statedir); - if (!mkdtemp(configdir)) { + if (!g_mkdtemp(configdir)) { virFilePrintf(stderr, "Cannot create fake configDir"); goto error; } diff --git a/tests/vircgrouptest.c b/tests/vircgrouptest.c index e1770426d7..c952676c25 100644 --- a/tests/vircgrouptest.c +++ b/tests/vircgrouptest.c @@ -989,7 +989,7 @@ initFakeFS(const char *mode, fakerootdir = g_strdup(FAKEROOTDIRTEMPLATE); - if (!mkdtemp(fakerootdir)) { + if (!g_mkdtemp(fakerootdir)) { fprintf(stderr, "Cannot create fakerootdir"); abort(); } diff --git a/tests/virhostdevtest.c b/tests/virhostdevtest.c index 1f3f730433..ed8e7e8fc1 100644 --- a/tests/virhostdevtest.c +++ b/tests/virhostdevtest.c @@ -502,7 +502,7 @@ mymain(void) fakerootdir = g_strdup(FAKEROOTDIRTEMPLATE); - if (!mkdtemp(fakerootdir)) { + if (!g_mkdtemp(fakerootdir)) { fprintf(stderr, "Cannot create fakerootdir"); abort(); } diff --git a/tests/virnetsockettest.c b/tests/virnetsockettest.c index 4e9f201e45..3a5959b27e 100644 --- a/tests/virnetsockettest.c +++ b/tests/virnetsockettest.c @@ -191,7 +191,7 @@ testSocketAccept(const void *opaque) if (!data) { virNetSocketPtr usock; - tmpdir = mkdtemp(template); + tmpdir = g_mkdtemp(template); if (tmpdir == NULL) { VIR_WARN("Failed to create temporary directory"); goto cleanup; @@ -315,7 +315,7 @@ static int testSocketUNIXAddrs(const void *data G_GNUC_UNUSED) char *tmpdir; char template[] = "/tmp/libvirt_XXXXXX"; - tmpdir = mkdtemp(template); + tmpdir = g_mkdtemp(template); if (tmpdir == NULL) { VIR_WARN("Failed to create temporary directory"); goto cleanup; diff --git a/tests/virpcitest.c b/tests/virpcitest.c index d6dbe8c1ef..21dd538232 100644 --- a/tests/virpcitest.c +++ b/tests/virpcitest.c @@ -330,7 +330,7 @@ mymain(void) fakerootdir = g_strdup(FAKEROOTDIRTEMPLATE); - if (!mkdtemp(fakerootdir)) { + if (!g_mkdtemp(fakerootdir)) { VIR_TEST_DEBUG("Cannot create fakerootdir"); abort(); } diff --git a/tests/virscsitest.c b/tests/virscsitest.c index 4d40f2bb82..d5a0da4753 100644 --- a/tests/virscsitest.c +++ b/tests/virscsitest.c @@ -194,7 +194,7 @@ mymain(void) virscsi_prefix = g_strdup_printf("%s" VIR_SCSI_DATA, abs_srcdir); - tmpdir = mkdtemp(template); + tmpdir = g_mkdtemp(template); if (tmpdir == NULL) { VIR_WARN("Failed to create temporary directory"); -- 2.21.0

On Thu, Nov 14, 2019 at 14:48:05 +0100, Ján Tomko wrote:
Prefer the GLib version to the one from gnulib.
Signed-off-by: Ján Tomko <jtomko@redhat.com> --- src/qemu/qemu_process.c | 2 +- tests/fdstreamtest.c | 2 +- tests/qemuhotplugtest.c | 2 +- tests/qemumemlocktest.c | 2 +- tests/qemumonitortestutils.c | 2 +- tests/qemuxml2argvtest.c | 2 +- tests/qemuxml2xmltest.c | 2 +- tests/scsihosttest.c | 2 +- tests/testutilsqemu.c | 4 ++-- tests/vircgrouptest.c | 2 +- tests/virhostdevtest.c | 2 +- tests/virnetsockettest.c | 4 ++-- tests/virpcitest.c | 2 +- tests/virscsitest.c | 2 +- 14 files changed, 16 insertions(+), 16 deletions(-)
Reviewed-by: Peter Krempa <pkrempa@redhat.com>

Signed-off-by: Ján Tomko <jtomko@redhat.com> --- build-aux/syntax-check.mk | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/build-aux/syntax-check.mk b/build-aux/syntax-check.mk index 74d0d5f6d4..7d1ac4dbfc 100644 --- a/build-aux/syntax-check.mk +++ b/build-aux/syntax-check.mk @@ -402,10 +402,17 @@ sc_prohibit_fork_wrappers: halt='use virCommand for child processes' \ $(_sc_search_regexp) -# Prefer mkostemp with O_CLOEXEC. +# Prefer g_mkostemp_full with O_CLOEXEC. sc_prohibit_mkstemp: - @prohibit='[^"]\<mkstemps? *\(' \ - halt='use mkostemp with O_CLOEXEC instead of mkstemp' \ + @prohibit='[^"]\<mko?stemps? *\(' \ + in_vc_files='\.[chx]$$' \ + halt='use g_mkstemp_full with O_CLOEXEC instead of mkstemp' \ + $(_sc_search_regexp) + +sc_prohibit_mkdtemp: + @prohibit='[^"]\<mkdtemp *\(' \ + in_vc_files='\.[chx]$$' \ + halt='use g_mkdtemp instead of mkdtemp' \ $(_sc_search_regexp) # access with X_OK accepts directories, but we can't exec() those. -- 2.21.0

On Thu, Nov 14, 2019 at 14:48:06 +0100, Ján Tomko wrote:
Signed-off-by: Ján Tomko <jtomko@redhat.com> --- build-aux/syntax-check.mk | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-)
Reviewed-by: Peter Krempa <pkrempa@redhat.com>
participants (2)
-
Ján Tomko
-
Peter Krempa