daemon: Link guestfsd with libutils.

After the previous refactoring, we are able to link the daemon to
common/utils, and also remove some of the "duplicate" functions that
the daemon carried ("duplicate" in quotes because they were often not
exact duplicates).

Also this removes the duplicate reimplementation of (most) cleanup
functions in the daemon, since those are provided by libutils now.

It also allows us in future (but not in this commit) to move utility
functions from the daemon into libutils.
This commit is contained in:
Richard W.M. Jones
2017-06-08 17:14:55 +01:00
parent e6c89f9631
commit 707f5bcfe0
15 changed files with 52 additions and 200 deletions

View File

@@ -49,6 +49,8 @@ endif
guestfsd_SOURCES = \
../common/errnostring/errnostring.h \
../common/protocol/guestfs_protocol.h \
../common/utils/cleanups.h \
../common/utils/guestfs-utils.h \
9p.c \
acl.c \
actions.h \
@@ -62,7 +64,6 @@ guestfsd_SOURCES = \
cap.c \
checksum.c \
cleanups.c \
cleanups.h \
cmp.c \
command.c \
command.h \
@@ -178,6 +179,7 @@ guestfsd_SOURCES = \
guestfsd_LDADD = \
../common/errnostring/liberrnostring.la \
../common/protocol/libprotocol.la \
../common/utils/libutils.la \
$(ACL_LIBS) \
$(CAP_LIBS) \
$(YAJL_LIBS) \
@@ -206,7 +208,9 @@ guestfsd_CPPFLAGS = \
-I$(top_srcdir)/common/errnostring \
-I$(top_builddir)/common/errnostring \
-I$(top_srcdir)/common/protocol \
-I$(top_builddir)/common/protocol
-I$(top_builddir)/common/protocol \
-I$(top_srcdir)/common/utils \
-I$(top_builddir)/common/utils
guestfsd_CFLAGS = \
$(WARN_CFLAGS) $(WERROR_CFLAGS) \
$(RPC_CFLAGS) \

View File

@@ -436,7 +436,7 @@ do_aug_ls (const char *path)
if (matches == NULL)
return NULL; /* do_aug_match has already sent the error */
sort_strings (matches, count_strings ((void *) matches));
sort_strings (matches, guestfs_int_count_strings ((void *) matches));
return matches; /* Caller frees. */
}

View File

@@ -152,7 +152,7 @@ do_mkfs_btrfs (char *const *devices,
int leafsize, const char *label, const char *metadata,
int nodesize, int sectorsize)
{
const size_t nr_devices = count_strings (devices);
const size_t nr_devices = guestfs_int_count_strings (devices);
const size_t MAX_ARGS = nr_devices + 64;
const char *argv[MAX_ARGS];
size_t i = 0, j;
@@ -500,7 +500,7 @@ do_btrfs_subvolume_list (const mountable_t *fs)
guestfs_int_btrfssubvolume_list *ret = NULL;
const size_t nr_subvolumes = count_strings (lines);
const size_t nr_subvolumes = guestfs_int_count_strings (lines);
ret = malloc (sizeof *ret);
if (!ret) {
@@ -733,7 +733,7 @@ int
do_btrfs_device_add (char *const *devices, const char *fs)
{
static int btrfs_device_add_needs_force = -1;
const size_t nr_devices = count_strings (devices);
const size_t nr_devices = guestfs_int_count_strings (devices);
const size_t MAX_ARGS = nr_devices + 8;
const char *argv[MAX_ARGS];
size_t i = 0, j;
@@ -781,7 +781,7 @@ do_btrfs_device_add (char *const *devices, const char *fs)
int
do_btrfs_device_delete (char *const *devices, const char *fs)
{
const size_t nr_devices = count_strings (devices);
const size_t nr_devices = guestfs_int_count_strings (devices);
if (nr_devices == 0)
return 0;
@@ -1391,7 +1391,7 @@ do_btrfs_qgroup_show (const char *path)
* 0/5 9249849344 9249849344
*
*/
const size_t nr_qgroups = count_strings (lines) - 2;
const size_t nr_qgroups = guestfs_int_count_strings (lines) - 2;
guestfs_int_btrfsqgroup_list *ret = NULL;
ret = malloc (sizeof *ret);
if (!ret) {
@@ -1821,7 +1821,7 @@ do_btrfs_balance_status (const char *path)
if (!lines)
return NULL;
nlines = count_strings (lines);
nlines = guestfs_int_count_strings (lines);
ret = calloc (1, sizeof *ret);
if (ret == NULL) {
@@ -1938,7 +1938,7 @@ do_btrfs_scrub_status (const char *path)
if (!lines)
return NULL;
if (count_strings (lines) < 2) {
if (guestfs_int_count_strings (lines) < 2) {
reply_with_error ("truncated output from 'btrfs scrub status -R' command");
return NULL;
}
@@ -2124,7 +2124,7 @@ int
do_btrfs_image (char *const *sources, const char *image,
int compresslevel)
{
const size_t nr_sources = count_strings (sources);
const size_t nr_sources = guestfs_int_count_strings (sources);
const size_t MAX_ARGS = 64 + nr_sources;
const char *argv[MAX_ARGS];
size_t i = 0, j;
@@ -2229,7 +2229,7 @@ do_btrfs_filesystem_show (const char *device)
if (!lines)
return NULL;
if (count_strings (lines) < 3) {
if (guestfs_int_count_strings (lines) < 3) {
reply_with_error ("truncated output from 'btrfs filesystem show' command");
return NULL;
}

View File

@@ -24,51 +24,7 @@
#include <augeas.h>
#include "cleanups.h"
/* Use by the CLEANUP_* macros. Do not call these directly. */
void
cleanup_free (void *ptr)
{
free (* (void **) ptr);
}
extern void free_strings (char **argv);
void
cleanup_free_string_list (void *ptr)
{
free_strings (* (char ***) ptr);
}
void
cleanup_unlink_free (void *ptr)
{
char *filename = * (char **) ptr;
if (filename) {
unlink (filename);
free (filename);
}
}
void
cleanup_close (void *ptr)
{
const int fd = * (int *) ptr;
if (fd >= 0)
close (fd);
}
void
cleanup_fclose (void *ptr)
{
FILE *f = * (FILE **) ptr;
if (f)
fclose (f);
}
#include "daemon.h"
void
cleanup_aug_close (void *ptr)
@@ -79,9 +35,6 @@ cleanup_aug_close (void *ptr)
aug_close (aug);
}
struct stringsbuf;
extern void free_stringsbuf (struct stringsbuf *sb);
void
cleanup_free_stringsbuf (void *ptr)
{

View File

@@ -1,51 +0,0 @@
/* libguestfs - the guestfsd daemon
* Copyright (C) 2009-2015 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.
*/
#ifndef GUESTFSD_CLEANUPS_H
#define GUESTFSD_CLEANUPS_H
/* These functions are used internally by the CLEANUP_* macros.
* Don't call them directly.
*/
extern void cleanup_free (void *ptr);
extern void cleanup_free_string_list (void *ptr);
extern void cleanup_unlink_free (void *ptr);
extern void cleanup_close (void *ptr);
extern void cleanup_fclose (void *ptr);
extern void cleanup_aug_close (void *ptr);
extern void cleanup_free_stringsbuf (void *ptr);
#ifdef HAVE_ATTRIBUTE_CLEANUP
#define CLEANUP_FREE __attribute__((cleanup(cleanup_free)))
#define CLEANUP_FREE_STRING_LIST \
__attribute__((cleanup(cleanup_free_string_list)))
#define CLEANUP_UNLINK_FREE __attribute__((cleanup(cleanup_unlink_free)))
#define CLEANUP_CLOSE __attribute__((cleanup(cleanup_close)))
#define CLEANUP_FCLOSE __attribute__((cleanup(cleanup_fclose)))
#define CLEANUP_AUG_CLOSE __attribute__((cleanup(cleanup_aug_close)))
#define CLEANUP_FREE_STRINGSBUF __attribute__((cleanup(cleanup_free_stringsbuf)))
#else
#define CLEANUP_FREE
#define CLEANUP_FREE_STRING_LIST
#define CLEANUP_UNLINK_FREE
#define CLEANUP_CLOSE
#define CLEANUP_AUG_CLOSE
#define CLEANUP_FREE_STRINGSBUF
#endif
#endif /* GUESTFSD_CLEANUPS_H */

View File

@@ -30,9 +30,11 @@
#include "guestfs_protocol.h"
#include "cleanups.h"
#include "guestfs-utils.h"
#include "guestfs-internal-all.h"
#include "cleanups.h"
#include "structs-cleanups.h"
#include "command.h"
@@ -76,6 +78,22 @@ extern int xread (int sock, void *buf, size_t len)
extern char *mountable_to_string (const mountable_t *mountable);
/*-- in cleanups.c --*/
/* These functions are used internally by the CLEANUP_* macros.
* Don't call them directly.
*/
extern void cleanup_aug_close (void *ptr);
extern void cleanup_free_stringsbuf (void *ptr);
#ifdef HAVE_ATTRIBUTE_CLEANUP
#define CLEANUP_AUG_CLOSE __attribute__((cleanup(cleanup_aug_close)))
#define CLEANUP_FREE_STRINGSBUF __attribute__((cleanup(cleanup_free_stringsbuf)))
#else
#define CLEANUP_AUG_CLOSE
#define CLEANUP_FREE_STRINGSBUF
#endif
/*-- in mount.c --*/
extern int mount_vfs_nochroot (const char *options, const char *vfstype,
@@ -109,21 +127,12 @@ extern int end_stringsbuf (struct stringsbuf *sb);
extern char **take_stringsbuf (struct stringsbuf *sb);
extern void free_stringsbuf (struct stringsbuf *sb);
extern size_t count_strings (char *const *argv);
extern void sort_strings (char **argv, size_t len);
extern void free_strings (char **argv);
extern void free_stringslen (char **argv, size_t len);
extern void sort_device_names (char **argv, size_t len);
extern int compare_device_names (const char *a, const char *b);
/* Concatenate strings, optionally with a separator string between
* each. On error, these return NULL but do NOT call reply_with_* nor
* free anything.
*/
extern char *concat_strings (char *const *argv);
extern char *join_strings (const char *separator, char *const *argv);
extern struct stringsbuf split_lines_sb (char *str);
extern char **split_lines (char *str);

View File

@@ -444,7 +444,7 @@ debug_ldd (const char *subcmd, size_t argc, char *const *const argv)
static char *
debug_ls (const char *subcmd, size_t argc, char *const *const argv)
{
const size_t len = count_strings (argv);
const size_t len = guestfs_int_count_strings (argv);
CLEANUP_FREE const char **cargv = NULL;
size_t i;
int r;
@@ -477,7 +477,7 @@ debug_ls (const char *subcmd, size_t argc, char *const *const argv)
static char *
debug_ll (const char *subcmd, size_t argc, char *const *const argv)
{
const size_t len = count_strings (argv);
const size_t len = guestfs_int_count_strings (argv);
CLEANUP_FREE const char **cargv = NULL;
size_t i;
int r;

View File

@@ -28,7 +28,7 @@ do_echo_daemon (char *const *argv)
{
char *out;
out = join_strings (" ", argv);
out = guestfs_int_join_strings (" ", argv);
if (out == NULL) {
reply_with_perror ("malloc");
return NULL;

View File

@@ -583,16 +583,6 @@ take_stringsbuf (struct stringsbuf *sb)
return ret;
}
size_t
count_strings (char *const *argv)
{
size_t argc;
for (argc = 0; argv[argc] != NULL; ++argc)
;
return argc;
}
/**
* Returns true if C<v> is a power of 2.
*
@@ -619,19 +609,6 @@ sort_strings (char **argv, size_t len)
qsort (argv, len, sizeof (char *), compare);
}
void
free_strings (char **argv)
{
size_t argc;
if (!argv)
return;
for (argc = 0; argv[argc] != NULL; ++argc)
free (argv[argc]);
free (argv);
}
void
free_stringslen (char **argv, size_t len)
{
@@ -720,47 +697,6 @@ sort_device_names (char **argv, size_t len)
qsort (argv, len, sizeof (char *), compare_device_names_vp);
}
char *
concat_strings (char *const *argv)
{
return join_strings ("", argv);
}
char *
join_strings (const char *separator, char *const *argv)
{
size_t i, len, seplen, rlen;
char *r;
seplen = strlen (separator);
len = 0;
for (i = 0; argv[i] != NULL; ++i) {
if (i > 0)
len += seplen;
len += strlen (argv[i]);
}
len++; /* for final \0 */
r = malloc (len);
if (r == NULL)
return NULL;
rlen = 0;
for (i = 0; argv[i] != NULL; ++i) {
if (i > 0) {
memcpy (&r[rlen], separator, seplen);
rlen += seplen;
}
len = strlen (argv[i]);
memcpy (&r[rlen], argv[i], len);
rlen += len;
}
r[rlen] = '\0';
return r;
}
/**
* Split an output string into a NULL-terminated list of lines,
* wrapped into a stringsbuf.

View File

@@ -320,7 +320,7 @@ do_ldmtool_scan_devices (char * const * devices)
int r;
CLEANUP_FREE char *out = NULL, *err = NULL;
nr_devices = count_strings (devices);
nr_devices = guestfs_int_count_strings (devices);
argv = malloc ((3 + nr_devices) * sizeof (char *));
if (argv == NULL) {
reply_with_perror ("malloc");

View File

@@ -337,7 +337,7 @@ do_vgcreate (const char *volgroup, char *const *physvols)
CLEANUP_FREE char *err = NULL;
CLEANUP_FREE const char **argv = NULL;
argc = count_strings (physvols) + 3;
argc = guestfs_int_count_strings (physvols) + 3;
argv = malloc (sizeof (char *) * (argc + 1));
if (argv == NULL) {
reply_with_perror ("malloc");
@@ -643,7 +643,7 @@ do_vg_activate (int activate, char *const *volgroups)
CLEANUP_FREE char *err = NULL;
CLEANUP_FREE const char **argv = NULL;
argc = count_strings (volgroups) + 4;
argc = guestfs_int_count_strings (volgroups) + 4;
argv = malloc (sizeof (char *) * (argc+1));
if (argv == NULL) {
reply_with_perror ("malloc");

View File

@@ -97,7 +97,8 @@ do_md_create (const char *name, char *const *devices,
}
}
else
nrdevices = count_strings (devices) + count_bits (umissingbitmap);
nrdevices =
guestfs_int_count_strings (devices) + count_bits (umissingbitmap);
if (optargs_bitmask & GUESTFS_MD_CREATE_LEVEL_BITMASK) {
if (STRNEQ (level, "linear") && STRNEQ (level, "raid0") &&
@@ -124,10 +125,11 @@ do_md_create (const char *name, char *const *devices,
}
/* Check invariant. */
if (count_strings (devices) + count_bits (umissingbitmap) !=
if (guestfs_int_count_strings (devices) + count_bits (umissingbitmap) !=
(size_t) (nrdevices + spare)) {
reply_with_error ("devices (%zu) + bits set in missingbitmap (%zu) is not equal to nrdevices (%d) + spare (%d)",
count_strings (devices), count_bits (umissingbitmap),
guestfs_int_count_strings (devices),
count_bits (umissingbitmap),
nrdevices, spare);
return -1;
}

View File

@@ -127,7 +127,7 @@ do_internal_lstatnslist (const char *path, char *const *names)
guestfs_int_statns_list *ret;
size_t i, nr_names;
nr_names = count_strings (names);
nr_names = guestfs_int_count_strings (names);
ret = malloc (sizeof *ret);
if (!ret) {

View File

@@ -74,7 +74,6 @@ daemon/btrfs.c
daemon/cap.c
daemon/checksum.c
daemon/cleanups.c
daemon/cleanups.h
daemon/cmp.c
daemon/command.c
daemon/command.h

View File

@@ -397,7 +397,7 @@ let generate_daemon_stubs actions () =
| RStringList (RPlainString, n)
| RHashtable (RPlainString, RPlainString, n) ->
pr " struct guestfs_%s_ret ret;\n" name;
pr " ret.%s.%s_len = count_strings (r);\n" n n;
pr " ret.%s.%s_len = guestfs_int_count_strings (r);\n" n n;
pr " ret.%s.%s_val = r;\n" n n;
pr " reply ((xdrproc_t) &xdr_guestfs_%s_ret, (char *) &ret);\n"
name
@@ -413,7 +413,7 @@ let generate_daemon_stubs actions () =
pr " free (r[i]);\n";
pr " r[i] = rr;\n";
pr " }\n";
pr " ret.%s.%s_len = count_strings (r);\n" n n;
pr " ret.%s.%s_len = guestfs_int_count_strings (r);\n" n n;
pr " ret.%s.%s_val = r;\n" n n;
pr " reply ((xdrproc_t) &xdr_guestfs_%s_ret, (char *) &ret);\n"
name
@@ -428,7 +428,7 @@ let generate_daemon_stubs actions () =
pr " free (r[i]);\n";
pr " r[i] = rr;\n";
pr " }\n";
pr " ret.%s.%s_len = count_strings (r);\n" n n;
pr " ret.%s.%s_len = guestfs_int_count_strings (r);\n" n n;
pr " ret.%s.%s_val = r;\n" n n;
pr " reply ((xdrproc_t) &xdr_guestfs_%s_ret, (char *) &ret);\n"
name
@@ -443,7 +443,7 @@ let generate_daemon_stubs actions () =
pr " free (r[i+1]);\n";
pr " r[i+1] = rr;\n";
pr " }\n";
pr " ret.%s.%s_len = count_strings (r);\n" n n;
pr " ret.%s.%s_len = guestfs_int_count_strings (r);\n" n n;
pr " ret.%s.%s_val = r;\n" n n;
pr " reply ((xdrproc_t) &xdr_guestfs_%s_ret, (char *) &ret);\n"
name