Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
server: Move code for handling debug flags into a separate file.
Just refactoring, no effect.
  • Loading branch information
rwmjones committed Dec 12, 2019
1 parent a1dee1c commit 208ed8a
Show file tree
Hide file tree
Showing 5 changed files with 103 additions and 51 deletions.
1 change: 1 addition & 0 deletions server/Makefile.am
Expand Up @@ -42,6 +42,7 @@ nbdkit_SOURCES = \
connections.c \
crypto.c \
debug.c \
debug-flags.c \
extents.c \
filters.c \
internal.h \
Expand Down
40 changes: 2 additions & 38 deletions server/backend.c
Expand Up @@ -46,42 +46,6 @@

/* Helpers for registering a new backend. */

/* Set all debug flags which apply to this backend. */
static void
set_debug_flags (void *dl, const char *name)
{
struct debug_flag *flag;

for (flag = debug_flags; flag != NULL; flag = flag->next) {
if (!flag->used && strcmp (name, flag->name) == 0) {
CLEANUP_FREE char *var = NULL;
int *sym;

/* Synthesize the name of the variable. */
if (asprintf (&var, "%s_debug_%s", name, flag->flag) == -1) {
perror ("asprintf");
exit (EXIT_FAILURE);
}

/* Find the symbol. */
sym = dlsym (dl, var);
if (sym == NULL) {
fprintf (stderr,
"%s: -D %s.%s: %s does not contain a "
"global variable called %s\n",
program_name, name, flag->flag, name, var);
exit (EXIT_FAILURE);
}

/* Set the flag. */
*sym = flag->value;

/* Mark this flag as used. */
flag->used = true;
}
}
}

void
backend_init (struct backend *b, struct backend *next, size_t index,
const char *filename, void *dl, const char *type)
Expand Down Expand Up @@ -140,8 +104,8 @@ backend_load (struct backend *b, const char *name, void (*load) (void))

debug ("registered %s %s (name %s)", b->type, b->filename, b->name);

/* Set debug flags before calling load. */
set_debug_flags (b->dl, name);
/* Apply debug flags before calling load. */
apply_debug_flags (b->dl, name);

/* Call the on-load callback if it exists. */
debug ("%s: load", name);
Expand Down
95 changes: 95 additions & 0 deletions server/debug-flags.c
@@ -0,0 +1,95 @@
/* nbdkit
* Copyright (C) 2013-2019 Red Hat Inc.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* * Neither the name of Red Hat nor the names of its contributors may be
* used to endorse or promote products derived from this software without
* specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY RED HAT AND CONTRIBUTORS ''AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL RED HAT OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/

#include <config.h>

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include <dlfcn.h>

#include "internal.h"

/* Apply all debug flags applicable to this backend. */
void
apply_debug_flags (void *dl, const char *name)
{
struct debug_flag *flag;

for (flag = debug_flags; flag != NULL; flag = flag->next) {
if (!flag->used && strcmp (name, flag->name) == 0) {
CLEANUP_FREE char *var = NULL;
int *sym;

/* Synthesize the name of the variable. */
if (asprintf (&var, "%s_debug_%s", name, flag->flag) == -1) {
perror ("asprintf");
exit (EXIT_FAILURE);
}

/* Find the symbol. */
sym = dlsym (dl, var);
if (sym == NULL) {
fprintf (stderr,
"%s: -D %s.%s: %s does not contain a "
"global variable called %s\n",
program_name, name, flag->flag, name, var);
exit (EXIT_FAILURE);
}

/* Set the flag. */
*sym = flag->value;

/* Mark this flag as used. */
flag->used = true;
}
}
}

void
free_debug_flags (void)
{
while (debug_flags != NULL) {
struct debug_flag *next = debug_flags->next;

if (!debug_flags->used) {
fprintf (stderr, "%s: warning: debug flag -D %s.%s was not used\n",
program_name, debug_flags->name, debug_flags->flag);
exit (EXIT_FAILURE);
}
free (debug_flags->name);
free (debug_flags->flag);
free (debug_flags);
debug_flags = next;
}
}
4 changes: 4 additions & 0 deletions server/internal.h
Expand Up @@ -287,6 +287,10 @@ extern int crypto_negotiate_tls (struct connection *conn,
nbdkit_debug ((fs), ##__VA_ARGS__); \
} while (0)

/* debug-flags.c */
extern void apply_debug_flags (void *dl, const char *name);
extern void free_debug_flags (void);

/* log-*.c */
#if !HAVE_VFPRINTF_PERCENT_M
#include <stdio.h>
Expand Down
14 changes: 1 addition & 13 deletions server/main.c
Expand Up @@ -614,19 +614,7 @@ main (int argc, char *argv[])
}

/* Check all debug flags were used, and free them. */
while (debug_flags != NULL) {
struct debug_flag *next = debug_flags->next;

if (!debug_flags->used) {
fprintf (stderr, "%s: debug flag -D %s.%s was not used\n",
program_name, debug_flags->name, debug_flags->flag);
exit (EXIT_FAILURE);
}
free (debug_flags->name);
free (debug_flags->flag);
free (debug_flags);
debug_flags = next;
}
free_debug_flags ();

if (help) {
struct backend *b;
Expand Down

0 comments on commit 208ed8a

Please sign in to comment.