Files
libguestfs/lib/Makefile.am
Laszlo Ersek 45b7f1736b guestfs_readdir(): rewrite with FileOut transfer, to lift protocol limit
Currently the guestfs_readdir() API can not list long directories, due to
it sending back the whole directory listing in a single guestfs protocol
response, which is limited to GUESTFS_MESSAGE_MAX (approx. 4MB) in size.

Introduce the "internal_readdir" action, for transferring the directory
listing from the daemon to the library through a FileOut parameter.
Rewrite guestfs_readdir() on top of this new internal function:

- The new "internal_readdir" action is a daemon action. Do not repurpose
  the "readdir" proc_nr (138) for "internal_readdir", as some distros ship
  the binary appliance to their users, and reusing the proc_nr could
  create a mismatch between library & appliance with obscure symptoms.
  Replace the old proc_nr (138) with a new proc_nr (511) instead; a
  mismatch would then produce a clear error message. Assume the new action
  will first be released in libguestfs-1.48.2.

- Turn "readdir" from a daemon action into a non-daemon one. Call the
  daemon action guestfs_internal_readdir() manually, receive the FileOut
  parameter into a temp file, then deserialize the dirents array from the
  temp file.

This patch sneakily fixes an independent bug, too. In the pre-patch
do_readdir() function [daemon/readdir.c], when readdir() returns NULL, we
don't distinguish "end of directory stream" from "readdir() failed". This
rewrite fixes this problem -- I didn't see much value separating out the
fix for the original do_readdir().

Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1674392
Signed-off-by: Laszlo Ersek <lersek@redhat.com>
Message-Id: <20220502085601.15012-2-lersek@redhat.com>
Reviewed-by: Richard W.M. Jones <rjones@redhat.com>
2022-05-03 10:53:48 +02:00

254 lines
6.1 KiB
Makefile

# libguestfs
# Copyright (C) 2010-2012 Red Hat Inc.
#
# 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; either version 2 of the License, or
# (at your option) any later version.
#
# 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, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
include $(top_srcdir)/subdir-rules.mk
noinst_PROGRAMS =
generator_built = \
guestfs-internal-actions.h \
actions-0.c \
actions-1.c \
actions-2.c \
actions-3.c \
actions-4.c \
actions-5.c \
actions-6.c \
actions-variants.c \
bindtests.c \
event-string.c \
guestfs-actions.pod \
guestfs-availability.pod \
guestfs-structs.pod \
libguestfs.syms \
structs-compare.c \
structs-copy.c \
structs-free.c
BUILT_SOURCES = \
$(generator_built)
EXTRA_DIST = \
$(BUILT_SOURCES) \
MAX_PROC_NR \
libguestfs.pc.in \
local/libguestfs.pc.in \
guestfs.pod
lib_LTLIBRARIES = libguestfs.la
libguestfs_la_SOURCES = \
../common/errnostring/errnostring.h \
../common/protocol/guestfs_protocol.h \
../common/qemuopts/qemuopts.h \
../common/utils/guestfs-utils.h \
../common/structs/structs-cleanups.h \
../include/guestfs.h \
guestfs-internal.h \
guestfs-internal-all.h \
actions-0.c \
actions-1.c \
actions-2.c \
actions-3.c \
actions-4.c \
actions-5.c \
actions-6.c \
actions-support.c \
actions-variants.c \
alloc.c \
appliance.c \
appliance-cpu.c \
appliance-kcmdline.c \
appliance-uefi.c \
available.c \
bindtests.c \
canonical-name.c \
command.c \
conn-socket.c \
copy-in-out.c \
create.c \
drives.c \
errors.c \
event-string.c \
events.c \
file.c \
fuse.c \
guid.c \
handle.c \
info.c \
inspect-apps.c \
inspect-icon.c \
inspect-osinfo.c \
journal.c \
launch.c \
launch-direct.c \
launch-libvirt.c \
libvirt-auth.c \
libvirt-domain.c \
lpj.c \
match.c \
mountable.c \
private-data.c \
proto.c \
qemu.c \
readdir.c \
rescue.c \
stringsbuf.c \
structs-compare.c \
structs-copy.c \
structs-free.c \
tmpdirs.c \
tsk.c \
uefi.c \
umask.c \
version.c \
wait.c \
whole-file.c \
yara.c \
libguestfs.syms
libguestfs_la_CPPFLAGS = \
-DGUESTFS_PRIVATE=1 \
-I$(top_srcdir)/common/errnostring -I$(top_builddir)/common/errnostring \
-I$(top_srcdir)/common/protocol -I$(top_builddir)/common/protocol \
-I$(top_srcdir)/common/qemuopts -I$(top_builddir)/common/qemuopts \
-I$(top_srcdir)/common/utils -I$(top_builddir)/common/utils \
-I$(top_srcdir)/common/structs -I$(top_builddir)/common/structs \
-I$(top_srcdir)/gnulib/lib -I$(top_builddir)/gnulib/lib \
-I$(top_srcdir)/include
libguestfs_la_CFLAGS = \
$(WARN_CFLAGS) $(WERROR_CFLAGS) \
$(RPC_CFLAGS) \
$(GCC_VISIBILITY_HIDDEN) \
$(PCRE2_CFLAGS) \
$(LIBVIRT_CFLAGS) \
$(LIBXML2_CFLAGS) \
$(JANSSON_CFLAGS)
libguestfs_la_LIBADD = \
../common/errnostring/liberrnostring.la \
../common/protocol/libprotocol.la \
../common/qemuopts/libqemuopts.la \
../common/structs/libstructs.la \
../common/utils/libutils.la \
$(PCRE2_LIBS) \
$(LIBVIRT_LIBS) $(LIBXML2_LIBS) \
$(SELINUX_LIBS) \
$(JANSSON_LIBS) \
../gnulib/lib/libgnu.la \
$(LIBSOCKET) \
$(LIB_CLOCK_GETTIME) \
$(LTLIBINTL) \
$(LTLIBTHREAD) \
$(RPC_LIBS)
# Force libtool to name the library 'libguestfs.so.0.$(MAX_PROC_NR).0'.
# Include the version script to limit which symbols are exported.
libguestfs_la_LDFLAGS = \
-version-info $(MAX_PROC_NR):0:$(MAX_PROC_NR) \
$(VERSION_SCRIPT_FLAGS)$(srcdir)/libguestfs.syms
if HAVE_FUSE
# XXX Unfortunately FUSE_CFLAGS defines _FILE_OFFSET_BITS=64.
libguestfs_la_CFLAGS += $(FUSE_CFLAGS)
libguestfs_la_LIBADD += $(FUSE_LIBS)
endif
if HAVE_LIBVIRT
# Small utility to check for a needed libvirt version;
# to be used in shell/script-based tests.
noinst_PROGRAMS += libvirt-is-version
libvirt_is_version_SOURCES = libvirt-is-version.c
libvirt_is_version_LDADD = \
$(LIBVIRT_LIBS) \
$(LTLIBINTL)
libvirt_is_version_CPPFLAGS = \
-DLOCALEBASEDIR=\""$(datadir)/locale"\"
libvirt_is_version_CFLAGS = \
$(WARN_CFLAGS) $(WERROR_CFLAGS) \
$(LIBVIRT_CFLAGS)
endif
# Tests: main tests are in tests/c-api. Here we just have some
# internal tests of utility functions.
TESTS_ENVIRONMENT = $(top_builddir)/run --test
LOG_COMPILER = $(VG)
TESTS = unit-tests
check_PROGRAMS = unit-tests
unit_tests_SOURCES = unit-tests.c
unit_tests_CPPFLAGS = \
-I$(top_srcdir)/gnulib/lib -I$(top_builddir)/gnulib/lib \
-I$(top_srcdir)/common/utils -I$(top_builddir)/common/utils \
-I$(top_srcdir)/common/structs -I$(top_builddir)/common/structs \
-I$(top_srcdir)/lib -I$(top_srcdir)/include -I.
unit_tests_CFLAGS = \
$(WARN_CFLAGS) $(WERROR_CFLAGS) \
$(RPC_CFLAGS)
# We have to link this to libguestfs, but because we want to test
# non-exported functions we have to link with the objects not the
# library.
unit_tests_LDADD = \
../common/structs/libstructs.la \
../common/utils/libutils.la \
$(libguestfs_la_OBJECTS) \
$(libguestfs_la_LIBADD)
check-valgrind:
$(MAKE) VG="@VG@" check
# Pkgconfig.
pkgconfigdir = $(libdir)/pkgconfig
pkgconfig_DATA = libguestfs.pc
# Manual page.
man_MANS = guestfs.3 libguestfs.3
noinst_DATA = $(top_builddir)/website/guestfs.3.html
guestfs.3 $(top_builddir)/website/guestfs.3.html: stamp-guestfs.pod
stamp-guestfs.pod: guestfs.pod \
guestfs-actions.pod \
guestfs-availability.pod \
guestfs-structs.pod
$(PODWRAPPER) \
--section 3 \
--man guestfs.3 \
--html $(top_builddir)/website/guestfs.3.html \
--insert $(srcdir)/guestfs-actions.pod:__ACTIONS__ \
--insert $(srcdir)/guestfs-availability.pod:__AVAILABILITY__ \
--insert $(srcdir)/guestfs-structs.pod:__STRUCTS__ \
--license LGPLv2+ \
$<
touch $@
# The only reason we have to generate this from the Makefile is
# because the global CLEANFILES rule deletes it.
libguestfs.3: Makefile.am
rm -f $@ $@-t
echo '.so man3/guestfs.3' > $@-t
mv $@-t $@