kcsbridge: Remove package

We no longer need this code now that it is upstream in phosphor-ipmi-kcs

Change-Id: Iaf1d5450b4c62f35e2deea53e5ce9b5981415f15
Signed-off-by: William A. Kennington III <wak@google.com>
diff --git a/.gitignore b/.gitignore
index 30ae886..210bc0f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,7 +1,6 @@
 build*/
 subprojects/*
 !subprojects/acpi-power-state-daemon/
-!subprojects/kcsbridge/
 !subprojects/metrics-ipmi-blobs/
 !subprojects/ncsid/
 !subprojects/nemora-postd/
diff --git a/kcsbridge b/kcsbridge
deleted file mode 120000
index bf7dcf7..0000000
--- a/kcsbridge
+++ /dev/null
@@ -1 +0,0 @@
-subprojects/kcsbridge
\ No newline at end of file
diff --git a/meson.build b/meson.build
index 534d61f..76719a2 100644
--- a/meson.build
+++ b/meson.build
@@ -35,7 +35,6 @@
 endif
 
 subproject('acpi-power-state-daemon')
-subproject('kcsbridge')
 subproject('ncsid', default_options: 'tests=' + tests_str)
 subproject('metrics-ipmi-blobs', default_options: 'tests=' + tests_str)
 subproject('nemora-postd')
diff --git a/subprojects/kcsbridge/meson.build b/subprojects/kcsbridge/meson.build
deleted file mode 100644
index 3d14785..0000000
--- a/subprojects/kcsbridge/meson.build
+++ /dev/null
@@ -1,26 +0,0 @@
-# Copyright 2021 Google LLC
-#
-# 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.
-
-project(
-  'kcsbridge',
-  ['cpp', 'c'],
-  version: '0.1',
-  meson_version: '>=0.53.2',
-  default_options: [
-    'warning_level=3',
-    'werror=true',
-    'cpp_std=c++17',
-  ])
-
-subdir('src')
diff --git a/subprojects/kcsbridge/src/args.cpp b/subprojects/kcsbridge/src/args.cpp
deleted file mode 100644
index c96ac4b..0000000
--- a/subprojects/kcsbridge/src/args.cpp
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Copyright 2021 Google LLC
- *
- * 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 "args.hpp"
-
-#include <fmt/format.h>
-#include <getopt.h>
-
-#include <stdexcept>
-
-namespace kcsbridge
-{
-
-Args::Args(int argc, char* argv[])
-{
-    static const char opts[] = ":c:";
-    static const struct option longopts[] = {
-        {"channel", required_argument, nullptr, 'c'},
-        {nullptr, 0, nullptr, 0},
-    };
-    int c;
-    optind = 0;
-    while ((c = getopt_long(argc, argv, opts, longopts, nullptr)) > 0)
-    {
-        switch (c)
-        {
-            case 'c':
-                channel = optarg;
-                break;
-            case ':':
-                throw std::runtime_error(
-                    fmt::format("Missing argument for `{}`", argv[optind - 1]));
-                break;
-            default:
-                throw std::runtime_error(fmt::format(
-                    "Invalid command line argument `{}`", argv[optind - 1]));
-        }
-    }
-    if (optind != argc)
-    {
-        throw std::invalid_argument("Requires no additional arguments");
-    }
-    if (channel == nullptr)
-    {
-        throw std::invalid_argument("Missing KCS channel");
-    }
-}
-
-} // namespace kcsbridge
diff --git a/subprojects/kcsbridge/src/args.hpp b/subprojects/kcsbridge/src/args.hpp
deleted file mode 100644
index 39b28c1..0000000
--- a/subprojects/kcsbridge/src/args.hpp
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright 2021 Google LLC
- *
- * 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.
- */
-
-#pragma once
-#include <cstddef>
-
-namespace kcsbridge
-{
-
-struct Args
-{
-    const char* channel = nullptr;
-
-    Args(int argc, char* argv[]);
-};
-
-} // namespace kcsbridge
diff --git a/subprojects/kcsbridge/src/dbus.hpp b/subprojects/kcsbridge/src/dbus.hpp
deleted file mode 100644
index 7a92d2d..0000000
--- a/subprojects/kcsbridge/src/dbus.hpp
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * Copyright 2021 Google LLC
- *
- * 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.
- */
-
-#pragma once
-#include <fmt/format.h>
-#include <systemd/sd-bus.h>
-
-#include <sdbusplus/message.hpp>
-#include <stdplus/handle/managed.hpp>
-#include <stdplus/util/cexec.hpp>
-
-#include <limits>
-#include <stdexcept>
-#include <type_traits>
-#include <utility>
-
-namespace kcsbridge
-{
-
-struct SdBusSlotDrop
-{
-    void operator()(sd_bus_slot* slot) noexcept
-    {
-        sd_bus_slot_unref(slot);
-    }
-};
-using ManagedSdBusSlot = stdplus::Managed<sd_bus_slot*>::HandleF<SdBusSlotDrop>;
-
-template <typename CbT>
-int busCallAsyncCb(sd_bus_message* m, void* userdata, sd_bus_error*) noexcept
-{
-    try
-    {
-        (*reinterpret_cast<CbT*>(userdata))(sdbusplus::message::message(m));
-    }
-    catch (const std::exception& e)
-    {
-        fmt::print(stderr, "Callback failed: {}\n", e.what());
-    }
-    return 1;
-}
-
-template <typename CbT>
-void busCallAsyncDest(void* userdata) noexcept
-{
-    delete reinterpret_cast<CbT*>(userdata);
-}
-
-template <typename Cb>
-auto busCallAsync(sdbusplus::message::message&& m, Cb&& cb)
-{
-    sd_bus_slot* slot;
-    using CbT = std::remove_cv_t<std::remove_reference_t<Cb>>;
-    CHECK_RET(sd_bus_call_async(nullptr, &slot, m.get(), busCallAsyncCb<CbT>,
-                                nullptr, std::numeric_limits<uint64_t>::max()),
-              "sd_bus_call_async");
-    ManagedSdBusSlot ret(std::move(slot));
-    CHECK_RET(sd_bus_slot_set_destroy_callback(*ret, busCallAsyncDest<CbT>),
-              "sd_bus_slot_set_destroy_callback");
-    sd_bus_slot_set_userdata(*ret, new CbT(std::forward<Cb>(cb)));
-    return ret;
-}
-
-template <auto func, typename Data>
-int methodRsp(sd_bus_message* mptr, void* dataptr, sd_bus_error* error) noexcept
-{
-    sdbusplus::message::message m(mptr);
-    try
-    {
-        func(m, *reinterpret_cast<Data*>(dataptr));
-    }
-    catch (const std::exception& e)
-    {
-        fmt::print(stderr, "Method response failed: {}\n", e.what());
-        sd_bus_error_set(error,
-                         "xyz.openbmc_project.Common.Error.InternalFailure",
-                         "The operation failed internally.");
-    }
-    return 1;
-}
-
-} // namespace kcsbridge
diff --git a/subprojects/kcsbridge/src/kcsbridge@.service.in b/subprojects/kcsbridge/src/kcsbridge@.service.in
deleted file mode 100644
index ef62d5f..0000000
--- a/subprojects/kcsbridge/src/kcsbridge@.service.in
+++ /dev/null
@@ -1,11 +0,0 @@
-[Unit]
-Description=Google IPMI KCS Bridge
-After=phosphor-ipmi-host.service
-
-[Service]
-Restart=on-failure
-Type=notify
-ExecStart=@BIN@ -c '%I'
-
-[Install]
-WantedBy=multi-user.target
diff --git a/subprojects/kcsbridge/src/main.cpp b/subprojects/kcsbridge/src/main.cpp
deleted file mode 100644
index 8a7114b..0000000
--- a/subprojects/kcsbridge/src/main.cpp
+++ /dev/null
@@ -1,206 +0,0 @@
-/*
- * Copyright 2021 Google LLC
- *
- * 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 "args.hpp"
-#include "dbus.hpp"
-
-#include <fmt/format.h>
-#include <linux/ipmi_bmc.h>
-#include <systemd/sd-daemon.h>
-
-#include <sdbusplus/bus.hpp>
-#include <sdbusplus/exception.hpp>
-#include <sdbusplus/server/interface.hpp>
-#include <sdbusplus/vtable.hpp>
-#include <sdeventplus/event.hpp>
-#include <sdeventplus/source/io.hpp>
-#include <sdeventplus/source/signal.hpp>
-#include <stdplus/fd/create.hpp>
-#include <stdplus/fd/ops.hpp>
-#include <stdplus/signal.hpp>
-
-#include <array>
-#include <map>
-#include <stdexcept>
-#include <tuple>
-#include <utility>
-#include <variant>
-
-namespace kcsbridge
-{
-
-using sdbusplus::bus::bus;
-using sdbusplus::message::message;
-using sdeventplus::source::IO;
-using sdeventplus::source::Signal;
-using stdplus::fd::OpenAccess;
-using stdplus::fd::OpenFlag;
-using stdplus::fd::OpenFlags;
-
-void setAttention(message& m, stdplus::Fd& kcs)
-{
-    stdplus::fd::ioctl(kcs, IPMI_BMC_IOCTL_SET_SMS_ATN, nullptr);
-    m.new_method_return().method_return();
-}
-
-void clearAttention(message& m, stdplus::Fd& kcs)
-{
-    stdplus::fd::ioctl(kcs, IPMI_BMC_IOCTL_CLEAR_SMS_ATN, nullptr);
-    m.new_method_return().method_return();
-}
-
-void forceAbort(message& m, stdplus::Fd& kcs)
-{
-    stdplus::fd::ioctl(kcs, IPMI_BMC_IOCTL_FORCE_ABORT, nullptr);
-    m.new_method_return().method_return();
-}
-
-template <typename Data>
-constexpr sdbusplus::vtable::vtable_t dbusMethods[] = {
-    sdbusplus::vtable::start(),
-    sdbusplus::vtable::method("setAttention", "", "",
-                              methodRsp<setAttention, Data>),
-    sdbusplus::vtable::method("clearAttention", "", "",
-                              methodRsp<clearAttention, Data>),
-    sdbusplus::vtable::method("forceAbort", "", "",
-                              methodRsp<forceAbort, Data>),
-    sdbusplus::vtable::end(),
-};
-
-void write(stdplus::Fd& kcs, message&& m)
-{
-    std::array<uint8_t, 1024> buffer;
-    stdplus::span<uint8_t> out(buffer.begin(), 3);
-    try
-    {
-        if (m.is_method_error())
-        {
-            // Extra copy to workaround lack of `const sd_bus_error` constructor
-            auto error = *m.get_error();
-            throw sdbusplus::exception::SdBusError(&error, "ipmid response");
-        }
-        std::tuple<uint8_t, uint8_t, uint8_t, uint8_t, std::vector<uint8_t>>
-            ret;
-        m.read(ret);
-        const auto& [netfn, lun, cmd, cc, data] = ret;
-        // Based on the IPMI KCS spec Figure 9-2
-        // netfn needs to be changed to odd in KCS responses
-        buffer[0] = (netfn | 1) << 2;
-        buffer[0] |= lun;
-        buffer[1] = cmd;
-        buffer[2] = cc;
-        memcpy(&buffer[3], data.data(), data.size());
-        out = stdplus::span<uint8_t>(buffer.begin(), data.size() + 3);
-    }
-    catch (const std::exception& e)
-    {
-        fmt::print(stderr, "IPMI response failure: {}\n", e.what());
-        buffer[0] |= 1 << 2;
-        buffer[2] = 0xff;
-    }
-    stdplus::fd::writeExact(kcs, out);
-}
-
-void read(stdplus::Fd& kcs, bus& bus, ManagedSdBusSlot& slot)
-{
-    std::array<uint8_t, 1024> buffer;
-    auto in = stdplus::fd::read(kcs, buffer);
-    if (in.empty())
-    {
-        return;
-    }
-    if (slot)
-    {
-        fmt::print(stderr, "Canceling outstanding request\n");
-        slot.reset();
-    }
-    if (in.size() < 2)
-    {
-        fmt::print(stderr, "Read too small, ignoring\n");
-        return;
-    }
-    auto m = bus.new_method_call("xyz.openbmc_project.Ipmi.Host",
-                                 "/xyz/openbmc_project/Ipmi",
-                                 "xyz.openbmc_project.Ipmi.Server", "execute");
-    std::map<std::string, std::variant<int>> options;
-    // Based on the IPMI KCS spec Figure 9-1
-    uint8_t netfn = in[0] >> 2, lun = in[0] & 3, cmd = in[1];
-    m.append(netfn, lun, cmd, in.subspan(2), options);
-    slot = busCallAsync(std::move(m), [&](message&& m) {
-        slot.reset();
-        write(kcs, std::move(m));
-    });
-}
-
-int execute(const char* channel)
-{
-    // Set up our DBus and event loop
-    auto event = sdeventplus::Event::get_default();
-    auto bus = sdbusplus::bus::new_default();
-    bus.attach_event(event.get(), SD_EVENT_PRIORITY_NORMAL);
-
-    // Configure basic signal handling
-    auto exit_handler = [&](Signal&, const struct signalfd_siginfo*) {
-        fmt::print(stderr, "Interrupted, Exiting\n");
-        event.exit(0);
-    };
-    stdplus::signal::block(SIGINT);
-    Signal sig_int(event, SIGINT, exit_handler);
-    stdplus::signal::block(SIGTERM);
-    Signal sig_term(event, SIGTERM, exit_handler);
-
-    // Open an FD for the KCS channel
-    stdplus::ManagedFd kcs = stdplus::fd::open(
-        fmt::format("/dev/{}", channel),
-        OpenFlags(OpenAccess::ReadWrite).set(OpenFlag::NonBlock));
-    ManagedSdBusSlot slot(std::nullopt);
-
-    // Add a reader to the bus for handling inbound IPMI
-    IO ioSource(event, kcs.get(), EPOLLIN | EPOLLET,
-                [&](IO&, int, uint32_t) { read(kcs, bus, slot); });
-
-    // Allow processes to affect the state machine
-    std::optional<sdbusplus::server::interface::interface> intf;
-    {
-        std::string dbusChannel = channel;
-        std::replace(dbusChannel.begin(), dbusChannel.end(), '-', '_');
-        auto obj = "/xyz/openbmc_project/Ipmi/Channel/" + dbusChannel;
-        auto srv = "com.google.gbmc." + dbusChannel;
-        intf.emplace(bus, obj.c_str(), "xyz.openbmc_project.Ipmi.Channel.SMS",
-                     dbusMethods<stdplus::Fd>,
-                     reinterpret_cast<stdplus::Fd*>(&kcs));
-        bus.request_name(srv.c_str());
-    }
-
-    sd_notify(0, "READY=1");
-    return event.loop();
-}
-
-} // namespace kcsbridge
-
-int main(int argc, char* argv[])
-{
-    try
-    {
-        kcsbridge::Args args(argc, argv);
-        return kcsbridge::execute(args.channel);
-    }
-    catch (const std::exception& e)
-    {
-        fmt::print(stderr, "FAILED: {}\n", e.what());
-        return 1;
-    }
-}
diff --git a/subprojects/kcsbridge/src/meson.build b/subprojects/kcsbridge/src/meson.build
deleted file mode 100644
index f463d92..0000000
--- a/subprojects/kcsbridge/src/meson.build
+++ /dev/null
@@ -1,68 +0,0 @@
-# Copyright 2021 Google LLC
-#
-# 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.
-
-headers = include_directories('.')
-
-fmt_dep = dependency('fmt', required: false)
-if not fmt_dep.found()
-  fmt_proj = import('cmake').subproject(
-    'fmt',
-    cmake_options: [
-      '-DCMAKE_POSITION_INDEPENDENT_CODE=ON',
-      '-DMASTER_PROJECT=OFF'
-    ],
-    required: false)
-  assert(fmt_proj.found(), 'fmtlib is required')
-  fmt_dep = fmt_proj.dependency('fmt')
-endif
-
-deps = [
-  fmt_dep,
-  dependency('stdplus', fallback: ['stdplus', 'stdplus']),
-  dependency('sdbusplus', fallback: ['sdbusplus', 'sdbusplus_dep']),
-  dependency('sdeventplus', fallback: ['sdeventplus', 'sdeventplus']),
-  dependency('libsystemd'),
-]
-
-lib = static_library(
-  'kcsbridged',
-  'args.cpp',
-  include_directories: headers,
-  implicit_include_directories: false,
-  dependencies: deps)
-
-dep = declare_dependency(
-  dependencies: deps,
-  include_directories: headers,
-  link_with: lib)
-
-libexecdir = get_option('prefix') / get_option('libexecdir')
-
-executable(
-  'kcsbridged',
-  'main.cpp',
-  implicit_include_directories: false,
-  dependencies: dep,
-  install: true,
-  install_dir: libexecdir)
-
-systemd = dependency('systemd', required: false)
-if systemd.found()
-  configure_file(
-    configuration: {'BIN': libexecdir / 'kcsbridged'},
-    input: 'kcsbridge@.service.in',
-    output: 'kcsbridge@.service',
-    install_mode: 'rw-r--r--',
-    install_dir: systemd.get_pkgconfig_variable('systemdsystemunitdir'))
-endif
diff --git a/subprojects/kcsbridge/subprojects b/subprojects/kcsbridge/subprojects
deleted file mode 120000
index a96aa0e..0000000
--- a/subprojects/kcsbridge/subprojects
+++ /dev/null
@@ -1 +0,0 @@
-..
\ No newline at end of file
diff --git a/subprojects/sdeventplus.wrap b/subprojects/sdeventplus.wrap
deleted file mode 100644
index 7503664..0000000
--- a/subprojects/sdeventplus.wrap
+++ /dev/null
@@ -1,3 +0,0 @@
-[wrap-git]
-url = https://github.com/openbmc/sdeventplus
-revision = HEAD