mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-11-01 10:51:12 +00:00
5b8569dd6e
When receiving multiple FDs from systemd during service activation it is neccessary to identify which purpose each FD is used for. While this could be inferred by looking for the specific IP ports or UNIX socket paths, this requires the systemd config to always match what is expected by the code. Using systemd FD names we can remove this restriction and simply identify FDs based on an arbitrary name. The FD names are passed by systemd in the LISTEN_FDNAMES env variable which is populated with the socket unit file names, unless overriden by using the FileDescriptorName setting. This is supported since the system 227 release and unfortunately RHEL7 lacks this version. Thus the code has some back compat support whereby we look at the TCP ports or the UNIX socket paths to identify what socket maps to which name. This back compat code is written such that is it easly deleted when we are able to mandate newer systemd. Reviewed-by: Michal Privoznik <mprivozn@redhat.com> Reviewed-by: Ján Tomko <jtomko@redhat.com> Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
84 lines
2.8 KiB
C
84 lines
2.8 KiB
C
/*
|
|
* virsystemd.h: helpers for using systemd APIs
|
|
*
|
|
* Copyright (C) 2013 Red Hat, Inc.
|
|
*
|
|
* 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.1 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, see
|
|
* <http://www.gnu.org/licenses/>.
|
|
*
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include "internal.h"
|
|
|
|
typedef struct _virSystemdActivation virSystemdActivation;
|
|
typedef virSystemdActivation *virSystemdActivationPtr;
|
|
|
|
/*
|
|
* Back compat for systemd < v227 which lacks LISTEN_FDNAMES.
|
|
* Delete when min systemd is increased ie RHEL7 dropped
|
|
*/
|
|
typedef struct _virSystemdActivationMap {
|
|
const char *name;
|
|
int family;
|
|
int port; /* if family == AF_INET/AF_INET6 */
|
|
const char *path; /* if family == AF_UNIX */
|
|
} virSystemdActivationMap;
|
|
|
|
char *virSystemdMakeScopeName(const char *name,
|
|
const char *drivername,
|
|
bool legacy_behaviour);
|
|
char *virSystemdMakeSliceName(const char *partition);
|
|
|
|
int virSystemdCreateMachine(const char *name,
|
|
const char *drivername,
|
|
const unsigned char *uuid,
|
|
const char *rootdir,
|
|
pid_t pidleader,
|
|
bool iscontainer,
|
|
size_t nnicindexes,
|
|
int *nicindexes,
|
|
const char *partition);
|
|
|
|
int virSystemdTerminateMachine(const char *name);
|
|
|
|
void virSystemdNotifyStartup(void);
|
|
|
|
int virSystemdCanSuspend(bool *result);
|
|
|
|
int virSystemdCanHibernate(bool *result);
|
|
|
|
int virSystemdCanHybridSleep(bool *result);
|
|
|
|
char *virSystemdGetMachineNameByPID(pid_t pid);
|
|
|
|
int virSystemdGetActivation(virSystemdActivationMap *map,
|
|
size_t nmap,
|
|
virSystemdActivationPtr *act);
|
|
|
|
bool virSystemdActivationHasName(virSystemdActivationPtr act,
|
|
const char *name);
|
|
|
|
int virSystemdActivationComplete(virSystemdActivationPtr act);
|
|
|
|
void virSystemdActivationClaimFDs(virSystemdActivationPtr act,
|
|
const char *name,
|
|
int **fds,
|
|
size_t *nfds);
|
|
|
|
void virSystemdActivationFree(virSystemdActivationPtr *act);
|
|
|
|
#define virSystemdActivationAutoPtrFree virSystemdActivationFree
|