1dffd6523SWilliam A. Kennington III // Copyright 2022 Google LLC 2dffd6523SWilliam A. Kennington III // 3dffd6523SWilliam A. Kennington III // Licensed under the Apache License, Version 2.0 (the "License"); 4dffd6523SWilliam A. Kennington III // you may not use this file except in compliance with the License. 5dffd6523SWilliam A. Kennington III // You may obtain a copy of the License at 6dffd6523SWilliam A. Kennington III // 7dffd6523SWilliam A. Kennington III // http://www.apache.org/licenses/LICENSE-2.0 8dffd6523SWilliam A. Kennington III // 9dffd6523SWilliam A. Kennington III // Unless required by applicable law or agreed to in writing, software 10dffd6523SWilliam A. Kennington III // distributed under the License is distributed on an "AS IS" BASIS, 11dffd6523SWilliam A. Kennington III // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12dffd6523SWilliam A. Kennington III // See the License for the specific language governing permissions and 13dffd6523SWilliam A. Kennington III // limitations under the License. 14dffd6523SWilliam A. Kennington III 151e76060aSYuxiao Zhang #include "file-io.hpp" 161e76060aSYuxiao Zhang 17dffd6523SWilliam A. Kennington III #include <sdeventplus/event.hpp> 18dffd6523SWilliam A. Kennington III #include <sdeventplus/source/io.hpp> 19dffd6523SWilliam A. Kennington III #include <stdplus/fd/create.hpp> 20dffd6523SWilliam A. Kennington III #include <stdplus/fd/ops.hpp> 21253e6463SWilly Tu #include <stdplus/print.hpp> 22dffd6523SWilliam A. Kennington III 235ca20ffeSYuxiao Zhang using namespace std::string_view_literals; 245ca20ffeSYuxiao Zhang 25dffd6523SWilliam A. Kennington III // A privileged port that is reserved for querying BMC DHCP completion. 26dffd6523SWilliam A. Kennington III // This is well known by the clients querying the status. 27dffd6523SWilliam A. Kennington III constexpr uint16_t kListenPort = 23; 28dffd6523SWilliam A. Kennington III 29dffd6523SWilliam A. Kennington III stdplus::ManagedFd createListener() 30dffd6523SWilliam A. Kennington III { 31dffd6523SWilliam A. Kennington III using namespace stdplus::fd; 32*c66ebc35SPatrick Williams auto sock = 33*c66ebc35SPatrick Williams socket(SocketDomain::INet6, SocketType::Stream, SocketProto::TCP); 34dffd6523SWilliam A. Kennington III setFileFlags(sock, getFileFlags(sock).set(stdplus::fd::FileFlag::NonBlock)); 35dffd6523SWilliam A. Kennington III sockaddr_in6 addr = {}; 36dffd6523SWilliam A. Kennington III addr.sin6_family = AF_INET6; 37dffd6523SWilliam A. Kennington III addr.sin6_port = htons(kListenPort); 38dffd6523SWilliam A. Kennington III bind(sock, addr); 39dffd6523SWilliam A. Kennington III listen(sock, 10); 40dffd6523SWilliam A. Kennington III return sock; 41dffd6523SWilliam A. Kennington III } 42dffd6523SWilliam A. Kennington III 431e76060aSYuxiao Zhang int main() 44dffd6523SWilliam A. Kennington III { 45dffd6523SWilliam A. Kennington III try 46dffd6523SWilliam A. Kennington III { 47dffd6523SWilliam A. Kennington III auto listener = createListener(); 48dffd6523SWilliam A. Kennington III auto event = sdeventplus::Event::get_default(); 49dffd6523SWilliam A. Kennington III sdeventplus::source::IO do_accept( 50dffd6523SWilliam A. Kennington III event, listener.get(), EPOLLIN | EPOLLET, 51dffd6523SWilliam A. Kennington III [&](sdeventplus::source::IO&, int, uint32_t) { 525ca20ffeSYuxiao Zhang while (auto fd = stdplus::fd::accept(listener)) 535ca20ffeSYuxiao Zhang { 541e76060aSYuxiao Zhang std::string data; 551e76060aSYuxiao Zhang try 561e76060aSYuxiao Zhang { 571e76060aSYuxiao Zhang data = fileRead(statusFile); 581e76060aSYuxiao Zhang } 591e76060aSYuxiao Zhang catch (const std::exception& e) 601e76060aSYuxiao Zhang { 61*c66ebc35SPatrick Williams // we don't want to fail the upgrade process, set the 62*c66ebc35SPatrick Williams // status to ONGOING 631e76060aSYuxiao Zhang data.push_back(2); 641e76060aSYuxiao Zhang data.append("Failed to read status "); 651e76060aSYuxiao Zhang data.append(e.what()); 661e76060aSYuxiao Zhang } 671e76060aSYuxiao Zhang 68*c66ebc35SPatrick Williams stdplus::fd::sendExact(*fd, data, 69*c66ebc35SPatrick Williams stdplus::fd::SendFlags(0)); 705ca20ffeSYuxiao Zhang } 71dffd6523SWilliam A. Kennington III }); 72dffd6523SWilliam A. Kennington III return event.loop(); 73dffd6523SWilliam A. Kennington III } 74dffd6523SWilliam A. Kennington III catch (const std::exception& e) 75dffd6523SWilliam A. Kennington III { 76253e6463SWilly Tu stdplus::println(stderr, "Failed: {}", e.what()); 77dffd6523SWilliam A. Kennington III return 1; 78dffd6523SWilliam A. Kennington III } 79dffd6523SWilliam A. Kennington III } 80