@@ -326,6 +326,7 @@ shared_sources = files(
|
||||
'utmp-wtmp.h',
|
||||
'varlink.c',
|
||||
'varlink.h',
|
||||
'varlink-internal.h',
|
||||
'verb-log-control.c',
|
||||
'verb-log-control.h',
|
||||
'verbs.c',
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
/* SPDX-License-Identifier: LGPL-2.1-or-later */
|
||||
#pragma once
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#include "fdset.h"
|
||||
#include "varlink.h"
|
||||
|
||||
int varlink_server_serialize(VarlinkServer *s, FILE *f, FDSet *fds);
|
||||
int varlink_server_deserialize_one(VarlinkServer *s, const char *value, FDSet *fds);
|
||||
@@ -12,6 +12,7 @@
|
||||
#include "list.h"
|
||||
#include "process-util.h"
|
||||
#include "selinux-util.h"
|
||||
#include "serialize.h"
|
||||
#include "set.h"
|
||||
#include "socket-util.h"
|
||||
#include "string-table.h"
|
||||
@@ -21,6 +22,7 @@
|
||||
#include "umask-util.h"
|
||||
#include "user-util.h"
|
||||
#include "varlink.h"
|
||||
#include "varlink-internal.h"
|
||||
|
||||
#define VARLINK_DEFAULT_CONNECTIONS_MAX 4096U
|
||||
#define VARLINK_DEFAULT_CONNECTIONS_PER_UID_MAX 1024U
|
||||
@@ -2577,3 +2579,84 @@ int varlink_server_set_description(VarlinkServer *s, const char *description) {
|
||||
|
||||
return free_and_strdup(&s->description, description);
|
||||
}
|
||||
|
||||
int varlink_server_serialize(VarlinkServer *s, FILE *f, FDSet *fds) {
|
||||
assert(f);
|
||||
assert(fds);
|
||||
|
||||
if (!s)
|
||||
return 0;
|
||||
|
||||
LIST_FOREACH(sockets, ss, s->sockets) {
|
||||
int copy;
|
||||
|
||||
assert(ss->address);
|
||||
assert(ss->fd >= 0);
|
||||
|
||||
fprintf(f, "varlink-server-socket-address=%s", ss->address);
|
||||
|
||||
/* If we fail to serialize the fd, it will be considered an error during deserialization */
|
||||
copy = fdset_put_dup(fds, ss->fd);
|
||||
if (copy < 0)
|
||||
return copy;
|
||||
|
||||
fprintf(f, " varlink-server-socket-fd=%i", copy);
|
||||
|
||||
fputc('\n', f);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int varlink_server_deserialize_one(VarlinkServer *s, const char *value, FDSet *fds) {
|
||||
_cleanup_(varlink_server_socket_freep) VarlinkServerSocket *ss = NULL;
|
||||
_cleanup_free_ char *address = NULL;
|
||||
const char *v = ASSERT_PTR(value);
|
||||
int r, fd = -1;
|
||||
char *buf;
|
||||
size_t n;
|
||||
|
||||
assert(s);
|
||||
assert(fds);
|
||||
|
||||
n = strcspn(v, " ");
|
||||
address = strndup(v, n);
|
||||
if (!address)
|
||||
return log_oom_debug();
|
||||
|
||||
if (v[n] != ' ')
|
||||
return log_debug_errno(SYNTHETIC_ERRNO(EINVAL),
|
||||
"Failed to deserialize VarlinkServerSocket: %s: %m", value);
|
||||
v = startswith(v + n + 1, "varlink-server-socket-fd=");
|
||||
if (!v)
|
||||
return log_debug_errno(SYNTHETIC_ERRNO(EINVAL),
|
||||
"Failed to deserialize VarlinkServerSocket fd %s: %m", value);
|
||||
|
||||
n = strcspn(v, " ");
|
||||
buf = strndupa_safe(v, n);
|
||||
|
||||
r = safe_atoi(buf, &fd);
|
||||
if (r < 0)
|
||||
return log_debug_errno(r, "Unable to parse VarlinkServerSocket varlink-server-socket-fd=%s: %m", buf);
|
||||
|
||||
if (!fdset_contains(fds, fd))
|
||||
return log_debug_errno(SYNTHETIC_ERRNO(EBADF),
|
||||
"VarlinkServerSocket varlink-server-socket-fd= has unknown fd %d: %m", fd);
|
||||
|
||||
ss = new(VarlinkServerSocket, 1);
|
||||
if (!ss)
|
||||
return log_oom_debug();
|
||||
|
||||
*ss = (VarlinkServerSocket) {
|
||||
.server = s,
|
||||
.address = TAKE_PTR(address),
|
||||
.fd = fdset_remove(fds, fd),
|
||||
};
|
||||
|
||||
r = varlink_server_add_socket_event_source(s, ss, SD_EVENT_PRIORITY_NORMAL);
|
||||
if (r < 0)
|
||||
return log_debug_errno(r, "Failed to add VarlinkServerSocket event source to the event loop: %m");
|
||||
|
||||
LIST_PREPEND(sockets, s->sockets, TAKE_PTR(ss));
|
||||
return 0;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user