Skip site navigation (1)Skip section navigation (2)

  
 
  

home | help
nbdkit-cc-plugin(3)		     NBDKIT		     nbdkit-cc-plugin(3)

NAME
     nbdkit-cc-plugin - write small nbdkit plugins in inline C (and other lan-
     guages)

SYNOPSIS
      nbdkit cc /path/to/plugin.c [CC=...] [CFLAGS="..."]
				  [EXTRA_CFLAGS="..."]
				  [other plugin parameters ...]

      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 some-
     what 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 under-
     stand 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 upper-
     case) 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 it-
     self 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 "EX-
     TRA_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 C++
      nbdkit cc CC=g++ source.cpp

     C++ plugin scripts can be created similarly to C, but you must add "CC=g++"
     as a parameter to exec nbdkit.

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

     OCaml plugin scripts can be created using this trick:

      (*/.)>/dev/null 2>&1
      exec nbdkit cc "$0" \
	   CC=ocamlopt \
	   CFLAGS="-output-obj -runtime-variant _pic   NBDKit.cmx -cclib -lnbdkitocaml" \
	   "$@"
      *)
      (* followed by OCaml code for the plugin here *)

     As with C plugin scripts, the file must be executable.  See also nbd-
     kit-ocaml-plugin(3).

   Using this plugin with other programming languages
     This plugin can be used with most ahead-of-time compiled programming lan-
     guages 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.

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-eval-plugin(3), nbdkit-ocaml-plugin(3),
     nbdkit-sh-plugin(3).

AUTHORS
     Richard W.M. Jones

COPYRIGHT
     Copyright Red Hat

LICENSE
     Redistribution and use in source and binary forms, with or without modifi-
     cation, 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 no-
	 tice, this list of conditions and the following disclaimer in the docu-
	 mentation 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 EX-
     PRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DIS-
     CLAIMED. IN NO EVENT SHALL RED HAT OR CONTRIBUTORS BE LIABLE FOR ANY DI-
     RECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
     (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SER-
     VICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
     CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABIL-
     ITY, 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 DAM-
     AGE.

nbdkit-1.46.2			   2026-08-30		     nbdkit-cc-plugin(3)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=nbdkit-cc-plugin&sektion=3&manpath=FreeBSD+Ports+15.1.quarterly>

home | help