For plugins/filters where .config_complete was "overloaded" as a place to finish configuration and do some set up before we start serving, use the new .get_ready callback. --- plugins/floppy/floppy.c | 9 ++++++++- plugins/floppy/virtual-floppy.c | 8 ++++---- plugins/iso/iso.c | 10 +++++++--- plugins/linuxdisk/linuxdisk.c | 9 ++++++++- plugins/partitioning/partitioning.c | 9 ++++++++- plugins/streaming/streaming.c | 7 +++++++ plugins/vddk/vddk.c | 14 ++++++++++---- filters/log/log.c | 14 +++++++++++--- filters/rate/rate.c | 4 ++-- filters/stats/stats.c | 11 +++++++++-- 10 files changed, 74 insertions(+), 21 deletions(-) diff --git a/plugins/floppy/floppy.c b/plugins/floppy/floppy.c index 41a23644..1c2f645e 100644 --- a/plugins/floppy/floppy.c +++ b/plugins/floppy/floppy.c @@ -99,13 +99,19 @@ floppy_config_complete (void) return -1; } - return create_virtual_floppy (dir, label, &floppy); + return 0; } #define floppy_config_help \ "dir=<DIRECTORY> (required) The directory to serve.\n" \ "label=<LABEL> The volume label." \ +static int +floppy_get_ready (void) +{ + return create_virtual_floppy (dir, label, &floppy); +} + static void * floppy_open (int readonly) { @@ -204,6 +210,7 @@ static struct nbdkit_plugin plugin = { .config_complete = floppy_config_complete, .config_help = floppy_config_help, .magic_config_key = "dir", + .get_ready = floppy_get_ready, .open = floppy_open, .get_size = floppy_get_size, .can_multi_conn = floppy_can_multi_conn, diff --git a/plugins/floppy/virtual-floppy.c b/plugins/floppy/virtual-floppy.c index b5c29a46..fc0cafa8 100644 --- a/plugins/floppy/virtual-floppy.c +++ b/plugins/floppy/virtual-floppy.c @@ -256,10 +256,10 @@ visit (const char *dir, struct virtual_floppy *floppy) floppy->nr_dirs++; memset (&floppy->dirs[di], 0, sizeof (struct dir)); - /* Because this is called from config_complete, before nbdkit - * daemonizes or starts any threads, it's safe to use chdir here and - * greatly simplifies the code. However we must chdir back to the - * original directory at the end. + /* Because this is called from get_ready, before nbdkit daemonizes + * or starts any threads, it's safe to use chdir here and greatly + * simplifies the code. However we must chdir back to the original + * directory at the end. */ origdir = get_current_dir_name (); if (origdir == NULL) { diff --git a/plugins/iso/iso.c b/plugins/iso/iso.c index 5634bac9..92554ace 100644 --- a/plugins/iso/iso.c +++ b/plugins/iso/iso.c @@ -176,9 +176,6 @@ iso_config_complete (void) return -1; } - if (make_iso () == -1) - return -1; - return 0; } @@ -187,6 +184,12 @@ iso_config_complete (void) "params='<PARAMS>' Extra parameters to pass.\n" \ "prog=<ISOPROG> The program used to make ISOs." \ +static int +iso_get_ready (void) +{ + return make_iso (); +} + static void * iso_open (int readonly) { @@ -254,6 +257,7 @@ static struct nbdkit_plugin plugin = { .config_complete = iso_config_complete, .config_help = iso_config_help, .magic_config_key = "dir", + .get_ready = iso_get_ready, .open = iso_open, .get_size = iso_get_size, .can_multi_conn = iso_can_multi_conn, diff --git a/plugins/linuxdisk/linuxdisk.c b/plugins/linuxdisk/linuxdisk.c index 99dbc996..d7b52242 100644 --- a/plugins/linuxdisk/linuxdisk.c +++ b/plugins/linuxdisk/linuxdisk.c @@ -128,7 +128,7 @@ linuxdisk_config_complete (void) return -1; } - return create_virtual_disk (&disk); + return 0; } #define linuxdisk_config_help \ @@ -137,6 +137,12 @@ linuxdisk_config_complete (void) "type=ext2|ext3|ext4 The filesystem type.\n" \ "size=[+]<SIZE> The virtual filesystem size." +static int +linuxdisk_get_ready (void) +{ + return create_virtual_disk (&disk); +} + static void * linuxdisk_open (int readonly) { @@ -226,6 +232,7 @@ static struct nbdkit_plugin plugin = { .config_complete = linuxdisk_config_complete, .config_help = linuxdisk_config_help, .magic_config_key = "dir", + .get_ready = linuxdisk_get_ready, .open = linuxdisk_open, .get_size = linuxdisk_get_size, .can_multi_conn = linuxdisk_can_multi_conn, diff --git a/plugins/partitioning/partitioning.c b/plugins/partitioning/partitioning.c index 6e426b93..865acd28 100644 --- a/plugins/partitioning/partitioning.c +++ b/plugins/partitioning/partitioning.c @@ -269,13 +269,19 @@ partitioning_config_complete (void) return -1; } - return create_virtual_disk_layout (); + return 0; } #define partitioning_config_help \ "file=<FILENAME> (required) File(s) containing partitions\n" \ "partition-type=mbr|gpt Partition type" +static int +partitioning_get_ready (void) +{ + return create_virtual_disk_layout (); +} + /* Create the per-connection handle. */ static void * partitioning_open (int readonly) @@ -433,6 +439,7 @@ static struct nbdkit_plugin plugin = { .config_complete = partitioning_config_complete, .config_help = partitioning_config_help, .magic_config_key = "file", + .get_ready = partitioning_get_ready, .open = partitioning_open, .get_size = partitioning_get_size, .can_multi_conn = partitioning_can_multi_conn, diff --git a/plugins/streaming/streaming.c b/plugins/streaming/streaming.c index b2359540..71365c58 100644 --- a/plugins/streaming/streaming.c +++ b/plugins/streaming/streaming.c @@ -90,6 +90,12 @@ streaming_config_complete (void) return -1; } + return 0; +} + +static int +streaming_get_ready (void) +{ /* Open the file blindly. If this fails with ENOENT then we create a * FIFO and try again. */ @@ -248,6 +254,7 @@ static struct nbdkit_plugin plugin = { .config = streaming_config, .config_complete = streaming_config_complete, .config_help = streaming_config_help, + .get_ready = streaming_get_ready, .open = streaming_open, .close = streaming_close, .get_size = streaming_get_size, diff --git a/plugins/vddk/vddk.c b/plugins/vddk/vddk.c index 533c5605..7788a31b 100644 --- a/plugins/vddk/vddk.c +++ b/plugins/vddk/vddk.c @@ -60,8 +60,7 @@ int vddk_debug_extents; int vddk_debug_datapath = 1; /* For each VDDK API define a static global variable. These globals - * are initialized when the plugin is loaded (by - * vddk_config_complete). + * are initialized when the plugin is loaded (by vddk_get_ready). */ #define STUB(fn,ret,args) static ret (*fn) args #define OPTIONAL_STUB(fn,ret,args) static ret (*fn) args @@ -432,8 +431,6 @@ load_library (void) static int vddk_config_complete (void) { - VixError err; - if (filename == NULL) { nbdkit_error ("you must supply the file=<FILENAME> parameter " "after the plugin name on the command line"); @@ -506,6 +503,14 @@ vddk_config_complete (void) } } + return 0; +} + +static int +vddk_get_ready (void) +{ + VixError err; + load_library (); /* Initialize VDDK library. */ @@ -1017,6 +1022,7 @@ static struct nbdkit_plugin plugin = { .config_help = vddk_config_help, .magic_config_key = "file", .dump_plugin = vddk_dump_plugin, + .get_ready = vddk_get_ready, .open = vddk_open, .close = vddk_close, .get_size = vddk_get_size, diff --git a/filters/log/log.c b/filters/log/log.c index 7eb608c5..76d139eb 100644 --- a/filters/log/log.c +++ b/filters/log/log.c @@ -86,16 +86,23 @@ log_config (nbdkit_next_config *next, void *nxdata, return next (nxdata, key, value); } -/* Open the logfile. */ static int log_config_complete (nbdkit_next_config_complete *next, void *nxdata) { - int fd; - if (!logfilename) { nbdkit_error ("missing logfile= parameter for the log filter"); return -1; } + + return next (nxdata); +} + +/* Open the logfile. */ +static int +log_get_ready (nbdkit_next_get_ready *next, void *nxdata) +{ + int fd; + /* Using fopen("ae"/"we") would be more convenient, but as Haiku * still lacks that, use this instead. Atomicity is not essential * here since .config completes before threads that might fork, if @@ -444,6 +451,7 @@ static struct nbdkit_filter filter = { .config_complete = log_config_complete, .config_help = log_config_help, .unload = log_unload, + .get_ready = log_get_ready, .open = log_open, .close = log_close, .prepare = log_prepare, diff --git a/filters/rate/rate.c b/filters/rate/rate.c index 2b105f91..f71e9cf3 100644 --- a/filters/rate/rate.c +++ b/filters/rate/rate.c @@ -145,7 +145,7 @@ rate_config (nbdkit_next_config *next, void *nxdata, } static int -rate_config_complete (nbdkit_next_config_complete *next, void *nxdata) +rate_get_ready (nbdkit_next_get_ready *next, void *nxdata) { /* Initialize the global buckets. */ bucket_init (&read_bucket, rate, BUCKET_CAPACITY); @@ -312,8 +312,8 @@ static struct nbdkit_filter filter = { .longname = "nbdkit rate filter", .unload = rate_unload, .config = rate_config, - .config_complete = rate_config_complete, .config_help = rate_config_help, + .get_ready = rate_get_ready, .open = rate_open, .close = rate_close, .pread = rate_pread, diff --git a/filters/stats/stats.c b/filters/stats/stats.c index 0759cebe..05832561 100644 --- a/filters/stats/stats.c +++ b/filters/stats/stats.c @@ -201,13 +201,19 @@ stats_config (nbdkit_next_config *next, void *nxdata, static int stats_config_complete (nbdkit_next_config_complete *next, void *nxdata) { - int fd; - if (filename == NULL) { nbdkit_error ("stats filter requires statsfile parameter"); return -1; } + return next (nxdata); +} + +static int +stats_get_ready (nbdkit_next_get_ready *next, void *nxdata) +{ + int fd; + /* Using fopen("ae"/"we") would be more convenient, but as Haiku * still lacks that, use this instead. Atomicity is not essential * here since .config completes before threads that might fork, if @@ -372,6 +378,7 @@ static struct nbdkit_filter filter = { .config = stats_config, .config_complete = stats_config_complete, .config_help = stats_config_help, + .get_ready = stats_get_ready, .pread = stats_pread, .pwrite = stats_pwrite, .trim = stats_trim, -- 2.25.0