nbd_connect_sy...cket_activation(3)
β¨ nbd_connect_systemd_socket_activation β connect using systemd socket activation β¨
okay bestie, this one lives in the libnbd manual (section 3, the "functions" section, iykyk) and it is literally the glow-up of spawning a server and vibing with it π
πΈ NAME πΈ
nbd_connect_systemd_socket_activation β connect using systemd socket activation
π SYNOPSIS π
#include <libnbd.h>
int nbd_connect_systemd_socket_activation (
struct nbd_handle *h, char **argv
);
π DESCRIPTION π
okay so the whole move here: you give it a command, it runs that command as a subprocess, and then it connects to it using systemd socket activation. that's it, that's the vibe π«Ά
it's especially useful for running qemu-nbd(1) as a subprocess of libnbd β for example to use it to open qcow2 files. iconic behavior honestly.
- to run nbdkit as a subprocess: this function can be used, or
nbd_connect_command(3). either is fine, no gatekeeping β¨ - to run
nbd-server(1)as a subprocess: this function cannot be used, you must usenbd_connect_command(3). sorry bestie, that's just the rules π
π Socket activation π
libnbd will fork the argv command and pass an NBD socket to it using special LISTEN_* environment variables (as defined by the systemd socket activation protocol). very official. very protocol. we love to see it π
βββββββββββ¬ββββββββββ βββββββββββββββββ
β program β libnbd β β qemu-nbd or β
β β β β other server β
β β socket βββββββββΆ β
βββββββββββ΄ββββββββββ βββββββββββββββββ
real talk: when the NBD handle is closed, the server subprocess is killed. like, bye. π
π·οΈ Socket name π·οΈ
the socket activation protocol lets you optionally give the socket a name β a little nickname for your socket, cute π₯Ί if you use it, the name is passed to the NBD server using the LISTEN_FDNAMES environment variable.
to provide a socket name, call nbd_set_socket_activation_name(3) before calling the connect function. order matters, bestie, don't do it after πΈ
β RETURN VALUE β
if the call is successful, the function returns 0. slay β¨
π ERRORS π
on error, -1 is returned. not slay π
refer to "ERROR HANDLING" in libnbd(3) for how to get further details of the error β that's where the actual tea is π
the following parameters must not be NULL: h, argv. for more information see "Non-NULL parameters" in libnbd(3). like, don't hand it nothing and expect magic, okay? π
π¦ NOTES π¦
π§ Blocking connect call π§
this call returns when the connection has been made β it blocks, it waits, it's committed. by default, this proceeds all the way to transmission phase, but nbd_set_opt_mode(3) can be used for manual control over option negotiation performed before transmission phase. main character energy: you get to drive π
π HANDLE STATE π
nbd_connect_systemd_socket_activation can be called when the handle is in the following state:
- Handle created, before connecting β β allowed
- Connecting β β error
- Connecting & handshaking (opt_mode) β β error
- Connected to the server β β error
- Connection shut down β β error
- Handle dead β β error
read the room: it's an β before you connect situation and literally nothing else π
π₯ VERSION π₯
this function first appeared in libnbd 1.2.
if you need to test if this function is available at compile time, check if the following macro is defined:
#define LIBNBD_HAVE_NBD_CONNECT_SYSTEMD_SOCKET_ACTIVATION 1
π EXAMPLE π
this example is also available as examples/open-qcow2.c in the libnbd source code. yes, it's real, go look π
/* This example shows how to use qemu-nbd
* to open a local qcow2 file.
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <libnbd.h>
int
main (int argc, const char *argv[])
{
const char *filename;
struct nbd_handle *nbd;
char buf[512];
FILE *fp;
if (argc != 2) {
fprintf (stderr, "open-qcow2 file.qcow2\n");
exit (EXIT_FAILURE);
}
filename = argv[1];
/* Create the libnbd handle. */
nbd = nbd_create ();
if (nbd == NULL) {
fprintf (stderr, "%s\n", nbd_get_error ());
exit (EXIT_FAILURE);
}
/* Run qemu-nbd as a subprocess using
* systemd socket activation.
*/
char *args[] = {
"qemu-nbd", "-f", "qcow2",
(char *)filename,
NULL
};
if (nbd_connect_systemd_socket_activation (nbd,
args) == -1) {
fprintf (stderr, "%s\n", nbd_get_error ());
exit (EXIT_FAILURE);
}
/* Read the first sector and print it. */
if (nbd_pread (nbd, buf, sizeof buf, 0, 0) == -1) {
fprintf (stderr, "%s\n", nbd_get_error ());
exit (EXIT_FAILURE);
}
fp = popen ("hexdump -C", "w");
if (fp == NULL) {
perror ("popen: hexdump");
exit (EXIT_FAILURE);
}
fwrite (buf, sizeof buf, 1, fp);
pclose (fp);
/* Close the libnbd handle. */
nbd_close (nbd);
exit (EXIT_SUCCESS);
}
π SEE ALSO π
nbd_aio_connect_systemd_socket_activation(3)nbd_connect_command(3)nbd_create(3)nbd_get_socket_activation_name(3)nbd_get_subprocess_pid(3)nbd_kill_subprocess(3)nbd_set_opt_mode(3)nbd_set_socket_activation_name(3)libnbd(3)qemu-nbd(1)http://0pointer.de/blog/projects/socket-activation.html
π AUTHORS π
- Eric Blake
- Richard W.M. Jones
π COPYRIGHT π
Copyright Red Hat
π«Ά LICENSE π«Ά
This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.
This library 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 Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
okurrr that's the whole page π this absolute queen of a manpage came to you courtesy of libnbd-1.25.8, dated 2026-10-1 β periodt, go connect something π¦β¨
π¦ where this page comes from
- centos-stream 10: libnbd-devel 1.25.8-1.el10 Β· LGPL-2.0-or-later AND BSD-3-Clause
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms