From abb27e7774e3cd12bd3cfe3d4858bbe590e59be0 Mon Sep 17 00:00:00 2001 From: Damian Hobson-Garcia Date: Fri, 19 Feb 2021 03:52:55 +0000 Subject: Add lease request and release protocol Explicitly request / release leases instead of implicitly by opening and closing the connection. This will allow the lease manager to take different action when a client shuts down gracefully vs when it crashes, holding a lease. Bug-AGL: SPEC-3862 Signed-off-by: Damian Hobson-Garcia Change-Id: Ibc68bee855ce18e56eb6f57e5ad1743248320013 --- common/dlm-protocol.c | 66 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 common/dlm-protocol.c (limited to 'common/dlm-protocol.c') diff --git a/common/dlm-protocol.c b/common/dlm-protocol.c new file mode 100644 index 0000000..4fc87b2 --- /dev/null +++ b/common/dlm-protocol.c @@ -0,0 +1,66 @@ +/* Copyright 2020-2021 IGEL Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "dlm-protocol.h" + +#include +#include +#include +#include +#include + +bool receive_dlm_client_request(int socket, struct dlm_client_request *request) +{ + + ssize_t len; + struct iovec iov = { + .iov_base = request, + .iov_len = sizeof(*request), + }; + struct msghdr msg = { + .msg_iov = &iov, + .msg_iovlen = 1, + }; + + while ((len = recvmsg(socket, &msg, 0)) < 0) { + if (errno != EINTR) + return false; + } + + if (len != sizeof(*request)) { + errno = EPROTO; + return false; + } + return true; +} + +bool send_dlm_client_request(int socket, struct dlm_client_request *request) +{ + struct iovec iov = { + .iov_base = request, + .iov_len = sizeof(*request), + }; + + struct msghdr msg = { + .msg_iov = &iov, + .msg_iovlen = 1, + }; + + while (sendmsg(socket, &msg, 0) < 1) { + if (errno != EINTR) + return false; + } + return true; +} -- cgit 1.2.3-korg