<?xml version='1.0'?> <!--*-nxml-*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
  "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
<!-- SPDX-License-Identifier: LGPL-2.1-or-later -->

<refentry id="sd_machine_get_class" xmlns:xi="http://www.w3.org/2001/XInclude">

  <refentryinfo>
    <title>sd_machine_get_class</title>
    <productname>systemd</productname>
  </refentryinfo>

  <refmeta>
    <refentrytitle>sd_machine_get_class</refentrytitle>
    <manvolnum>3</manvolnum>
  </refmeta>

  <refnamediv>
    <refname>sd_machine_get_class</refname>
    <refname>sd_machine_get_ifindices</refname>
    <refpurpose>Determine the class and network interface indices of a
    locally running virtual machine or container</refpurpose>
  </refnamediv>

  <refsynopsisdiv>
    <funcsynopsis>
      <funcsynopsisinfo>#include &lt;systemd/sd-login.h&gt;</funcsynopsisinfo>

      <funcprototype>
        <funcdef>int <function>sd_machine_get_class</function></funcdef>
        <paramdef>const char* <parameter>machine</parameter></paramdef>
        <paramdef>char **<parameter>class</parameter></paramdef>
      </funcprototype>

      <funcprototype>
        <funcdef>int <function>sd_machine_get_ifindices</function></funcdef>
        <paramdef>const char* <parameter>machine</parameter></paramdef>
        <paramdef>int **<parameter>ret_ifindices</parameter></paramdef>
      </funcprototype>
    </funcsynopsis>
  </refsynopsisdiv>

  <refsect1>
    <title>Description</title>

    <para><function>sd_machine_get_class()</function> may be used to
    determine the class of a locally running virtual machine or
    container that is registered with
    <citerefentry><refentrytitle>systemd-machined.service</refentrytitle><manvolnum>8</manvolnum></citerefentry>.
    The string returned is either <literal>vm</literal> or
    <literal>container</literal>. The returned string needs to be
    freed with the libc <citerefentry
    project='man-pages'><refentrytitle>free</refentrytitle><manvolnum>3</manvolnum></citerefentry>
    call after use.</para>

    <para><function>sd_machine_get_ifindices()</function> may be used to determine the numeric indices of the
    network interfaces on the host that are pointing towards the specified locally running virtual machine or
    container. The vm or container must be registered with
    <citerefentry><refentrytitle>systemd-machined.service</refentrytitle><manvolnum>8</manvolnum></citerefentry>.
    The output parameter <parameter>ret_ifindices</parameter> may be passed as <constant>NULL</constant> when
    the output value is not needed. The returned array needs to be freed with the libc <citerefentry
    project='man-pages'><refentrytitle>free</refentrytitle><manvolnum>3</manvolnum></citerefentry> call after
    use.</para>
  </refsect1>

  <refsect1>
    <title>Return Value</title>

    <para>On success, these functions return a non-negative integer.
    <function>sd_machine_get_ifindices()</function> returns the number of the relevant network interfaces.
    On failure, these calls return a negative errno-style error code.</para>

    <refsect2>
      <title>Errors</title>

      <para>Returned errors may indicate the following problems:</para>

      <variablelist>

        <varlistentry>
          <term><constant>-ENXIO</constant></term>

          <listitem><para>The specified machine does not exist or is currently not running.</para>
          </listitem>
        </varlistentry>

        <varlistentry>
          <term><constant>-EINVAL</constant></term>

          <listitem><para>An input parameter was invalid (out of range, or <constant>NULL</constant>, where
          that is not accepted).</para></listitem>
        </varlistentry>

        <varlistentry>
          <term><constant>-ENOMEM</constant></term>

          <listitem><para>Memory allocation failed.</para></listitem>
        </varlistentry>
      </variablelist>
    </refsect2>
  </refsect1>

  <xi:include href="libsystemd-pkgconfig.xml" />

  <refsect1>
    <title>See Also</title>

    <para>
      <citerefentry><refentrytitle>systemd</refentrytitle><manvolnum>1</manvolnum></citerefentry>,
      <citerefentry><refentrytitle>sd-login</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
      <citerefentry><refentrytitle>systemd-machined.service</refentrytitle><manvolnum>8</manvolnum></citerefentry>,
      <citerefentry><refentrytitle>sd_pid_get_machine_name</refentrytitle><manvolnum>3</manvolnum></citerefentry>
    </para>
  </refsect1>

</refentry>
