Provided by: nbdkit_1.24.1-2ubuntu4_amd64 bug

NAME

       nbdkit-cc-plugin - write small nbdkit plugins in inline C (and other languages)

SYNOPSIS

        nbdkit cc /path/to/plugin.c [CC=<CC>] [CFLAGS=<CFLAGS>]
                                    [EXTRA_CFLAGS=<EXTRA_CFLAGS>]
        nbdkit cc - <<'EOF'
        ... C code ...
        EOF

DESCRIPTION

       This plugin allows you to write small nbdkit(1) plugins in C (and some other languages).
       When you use this plugin it compiles your source code to a temporary plugin and then jumps
       into your compiled plugin.  It is somewhat similar to nbdkit-sh-plugin(3), except for C
       source code.  This can also be used to write plugins which are "C scripts".

       Note this is not the way you normally write nbdkit plugins in C.  To understand how to
       write plugins in C normally, read nbdkit-plugin(3).

   Simple plugin example
       Simple plugins from the nbdkit source tree can be compiled and run directly using commands
       such as:

        $ nbdkit cc plugins/example1/example1.c EXTRA_CFLAGS="-I. -Iinclude"

       You can also read the source from stdin using "-":

        $ nbdkit cc - EXTRA_CFLAGS="-I. -Iinclude" \
                    < plugins/example1/example1.c

       To replace the compiler flags:

        $ nbdkit cc plugins/example1/example1.c \
                    CFLAGS="-O3 -mavx2 -fPIC -shared"

   Compiler name and flags
       The plugin parameters "CC", "CFLAGS" and "EXTRA_CFLAGS" (written in uppercase) can be used
       to control which C compiler and C compiler flags are used.  If not set, the default
       compiler and flags from when nbdkit was itself compiled from source are used.  To see what
       those were you can do:

        $ nbdkit cc --dump-plugin
        ...
        CC=gcc
        CFLAGS=-g -O2 -fPIC -shared

       The "CFLAGS" parameter overrides the built-in flags completely.  The "EXTRA_CFLAGS"
       parameter adds extra flags to the built-in flags.

   Plugin API version
       Plugins compiled this way must use the same API version as the cc plugin itself uses.
       Currently this is "NBDKIT_API_VERSION=2".

   C plugin as a self-contained script
       You can create a C plugin which is a self-contained script by adding the following lines
       at the top and ensuring the C source is executable ("chmod +x plugin.c"):

        #if 0
        exec nbdkit cc "$0" "$@"
        #endif

       The script can be run as a command with additional nbdkit flags and plugin parameters, eg:

        ./plugin.c -f -v
        ./plugin.c -p 10000 --filter=cow
        ./plugin.c param=1

   Using this plugin with other programming languages
       This plugin can be used with most ahead-of-time compiled programming languages if they can
       create shared objects (.so files).  The only requirement is that the compiler ("CC")
       supports an -o option to write a shared object.  Some examples follow.

       Using this plugin with C++

        nbdkit cc CC=g++ source.cpp

       Using this plugin with OCaml

        nbdkit cc CC=ocamlopt \
                  CFLAGS="-output-obj -runtime-variant _pic NBDKit.cmx -cclib -lnbdkitocaml" \
                  source.ml

       See nbdkit-ocaml-plugin(3).

PARAMETERS

       The script name, or "-", must appear as the first parameter.

       CC=CC
       CFLAGS="CFLAGS"
       EXTRA_CFLAGS="EXTRA_CFLAGS"
           Override the compiler and flags.  See "Compiler name and flags" above.

       All other parameters on the command line are passed to the plugin.

EXAMPLE

        $ nbdkit cc - <<'EOF'
        #include <stdint.h>
        #include <string.h>

        #define NBDKIT_API_VERSION 2
        #include <nbdkit-plugin.h>

        char data[10*1024*1024];

        #define THREAD_MODEL NBDKIT_THREAD_MODEL_PARALLEL

        static void *
        my_open (int readonly)
        {
          return NBDKIT_HANDLE_NOT_NEEDED;
        }

        static int64_t
        my_get_size (void *handle)
        {
          return (int64_t) sizeof (data);
        }

        static int
        my_pread (void *handle, void *buf,
                  uint32_t count, uint64_t offset,
                  uint32_t flags)
        {
          memcpy (buf, data+offset, count);
          return 0;
        }

        static int
        my_pwrite (void *handle, const void *buf,
                   uint32_t count, uint64_t offset,
                   uint32_t flags)
        {
          memcpy (data+offset, buf, count);
          return 0;
        }

        static struct nbdkit_plugin plugin = {
          .name              = "myplugin",
          .open              = my_open,
          .get_size          = my_get_size,
          .pread             = my_pread,
          .pwrite            = my_pwrite,
        };

        NBDKIT_REGISTER_PLUGIN(plugin)
        EOF

FILES

       $plugindir/nbdkit-cc-plugin.so
           The plugin.

           Use "nbdkit --dump-config" to find the location of $plugindir.

VERSION

       "nbdkit-cc-plugin" first appeared in nbdkit 1.22.

SEE ALSO

       nbdkit(1), nbdkit-plugin(3), nbdkit-sh-plugin(3).

AUTHORS

       Richard W.M. Jones

COPYRIGHT

       Copyright (C) 2020 Red Hat Inc.

LICENSE

       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.