1518678f8Sopenharmony_ci/* 2518678f8Sopenharmony_ci * Copyright (C) 2021-2022 Huawei Device Co., Ltd. 3518678f8Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4518678f8Sopenharmony_ci * you may not use this file except in compliance with the License. 5518678f8Sopenharmony_ci * You may obtain a copy of the License at 6518678f8Sopenharmony_ci * 7518678f8Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8518678f8Sopenharmony_ci * 9518678f8Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10518678f8Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11518678f8Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12518678f8Sopenharmony_ci * See the License for the specific language governing permissions and 13518678f8Sopenharmony_ci * limitations under the License. 14518678f8Sopenharmony_ci */ 15518678f8Sopenharmony_ci#include "dhcp_function.h" 16518678f8Sopenharmony_ci 17518678f8Sopenharmony_ci#include <unistd.h> 18518678f8Sopenharmony_ci#include <net/if.h> 19518678f8Sopenharmony_ci#include <sys/ioctl.h> 20518678f8Sopenharmony_ci#include <sys/types.h> 21518678f8Sopenharmony_ci#include <sys/stat.h> 22518678f8Sopenharmony_ci#include <fcntl.h> 23518678f8Sopenharmony_ci#include <vector> 24518678f8Sopenharmony_ci#include <sys/wait.h> 25518678f8Sopenharmony_ci 26518678f8Sopenharmony_ci#include "securec.h" 27518678f8Sopenharmony_ci#include "dhcp_logger.h" 28518678f8Sopenharmony_ci 29518678f8Sopenharmony_cinamespace OHOS { 30518678f8Sopenharmony_cinamespace DHCP { 31518678f8Sopenharmony_ciDEFINE_DHCPLOG_DHCP_LABEL("DhcpFunction"); 32518678f8Sopenharmony_ci 33518678f8Sopenharmony_ciconst int MAX_RETEY_WAIT_COUNT = 60; 34518678f8Sopenharmony_ciconst int WAIT_SLEEP_50MS = 50; 35518678f8Sopenharmony_ci 36518678f8Sopenharmony_cibool DhcpFunction::Ip4StrConToInt(const std::string& strIp, uint32_t& uIp, bool bHost) 37518678f8Sopenharmony_ci{ 38518678f8Sopenharmony_ci if (strIp.empty()) { 39518678f8Sopenharmony_ci DHCP_LOGE("Ip4StrConToInt error, strIp is empty()!"); 40518678f8Sopenharmony_ci return false; 41518678f8Sopenharmony_ci } 42518678f8Sopenharmony_ci 43518678f8Sopenharmony_ci struct in_addr addr4; 44518678f8Sopenharmony_ci int nRet = inet_pton(AF_INET, strIp.c_str(), &addr4); 45518678f8Sopenharmony_ci if (nRet != 1) { 46518678f8Sopenharmony_ci DHCP_LOGE("Ip4StrConToInt strIp:%{private}s failed, nRet:%{public}d!", strIp.c_str(), nRet); 47518678f8Sopenharmony_ci if (nRet == 0) { 48518678f8Sopenharmony_ci DHCP_LOGE("Ip4StrConToInt strIp:%{private}s not in presentation format!", strIp.c_str()); 49518678f8Sopenharmony_ci } else { 50518678f8Sopenharmony_ci DHCP_LOGE("Ip4StrConToInt strIp:%{private}s inet_pton not contain a valid address!", strIp.c_str()); 51518678f8Sopenharmony_ci } 52518678f8Sopenharmony_ci return false; 53518678f8Sopenharmony_ci } 54518678f8Sopenharmony_ci 55518678f8Sopenharmony_ci if (bHost) { 56518678f8Sopenharmony_ci uIp = ntohl(addr4.s_addr); 57518678f8Sopenharmony_ci } else { 58518678f8Sopenharmony_ci uIp = addr4.s_addr; 59518678f8Sopenharmony_ci } 60518678f8Sopenharmony_ci 61518678f8Sopenharmony_ci return true; 62518678f8Sopenharmony_ci} 63518678f8Sopenharmony_ci 64518678f8Sopenharmony_cistd::string DhcpFunction::Ip4IntConvertToStr(uint32_t uIp, bool bHost) 65518678f8Sopenharmony_ci{ 66518678f8Sopenharmony_ci char bufIp4[INET_ADDRSTRLEN] = {0}; 67518678f8Sopenharmony_ci struct in_addr addr4; 68518678f8Sopenharmony_ci if (bHost) { 69518678f8Sopenharmony_ci addr4.s_addr = htonl(uIp); 70518678f8Sopenharmony_ci } else { 71518678f8Sopenharmony_ci addr4.s_addr = uIp; 72518678f8Sopenharmony_ci } 73518678f8Sopenharmony_ci 74518678f8Sopenharmony_ci std::string strIp = ""; 75518678f8Sopenharmony_ci if (inet_ntop(AF_INET, &addr4, bufIp4, INET_ADDRSTRLEN) == nullptr) { 76518678f8Sopenharmony_ci DHCP_LOGE("Ip4IntConvertToStr uIp:%{private}u failed, inet_ntop nullptr!", uIp); 77518678f8Sopenharmony_ci } else { 78518678f8Sopenharmony_ci strIp = bufIp4; 79518678f8Sopenharmony_ci DHCP_LOGI("Ip4IntConvertToStr uIp:%{private}u -> strIp:%{private}s.", uIp, strIp.c_str()); 80518678f8Sopenharmony_ci } 81518678f8Sopenharmony_ci 82518678f8Sopenharmony_ci return strIp; 83518678f8Sopenharmony_ci} 84518678f8Sopenharmony_ci 85518678f8Sopenharmony_cibool DhcpFunction::Ip6StrConToChar(const std::string& strIp, uint8_t chIp[], size_t uSize) 86518678f8Sopenharmony_ci{ 87518678f8Sopenharmony_ci if (strIp.empty()) { 88518678f8Sopenharmony_ci DHCP_LOGE("Ip6StrConToChar param error, strIp is empty()!"); 89518678f8Sopenharmony_ci return false; 90518678f8Sopenharmony_ci } 91518678f8Sopenharmony_ci 92518678f8Sopenharmony_ci struct in6_addr addr6; 93518678f8Sopenharmony_ci if (memset_s(&addr6, sizeof(addr6), 0, sizeof(addr6)) != EOK) { 94518678f8Sopenharmony_ci return false; 95518678f8Sopenharmony_ci } 96518678f8Sopenharmony_ci int nRet = inet_pton(AF_INET6, strIp.c_str(), &addr6); 97518678f8Sopenharmony_ci if (nRet != 1) { 98518678f8Sopenharmony_ci DHCP_LOGE("Ip6StrConToChar inet_pton strIp:%{private}s failed, nRet:%{public}d!", strIp.c_str(), nRet); 99518678f8Sopenharmony_ci if (nRet == 0) { 100518678f8Sopenharmony_ci DHCP_LOGE("Ip6StrConToChar strIp:%{private}s not in presentation format!", strIp.c_str()); 101518678f8Sopenharmony_ci } else { 102518678f8Sopenharmony_ci DHCP_LOGE("Ip6StrConToChar strIp:%{private}s inet_pton not contain a valid address!", strIp.c_str()); 103518678f8Sopenharmony_ci } 104518678f8Sopenharmony_ci return false; 105518678f8Sopenharmony_ci } 106518678f8Sopenharmony_ci 107518678f8Sopenharmony_ci for (size_t i = 0; i < uSize; i++) { 108518678f8Sopenharmony_ci chIp[i] = addr6.s6_addr[i]; 109518678f8Sopenharmony_ci } 110518678f8Sopenharmony_ci 111518678f8Sopenharmony_ci return true; 112518678f8Sopenharmony_ci} 113518678f8Sopenharmony_ci 114518678f8Sopenharmony_cistd::string DhcpFunction::Ip6CharConToStr(uint8_t chIp[], int size) 115518678f8Sopenharmony_ci{ 116518678f8Sopenharmony_ci if (size <= 0) { 117518678f8Sopenharmony_ci DHCP_LOGE("Ip6CharConToStr param error, size:%{public}d!", size); 118518678f8Sopenharmony_ci return ""; 119518678f8Sopenharmony_ci } 120518678f8Sopenharmony_ci 121518678f8Sopenharmony_ci std::string strIp = ""; 122518678f8Sopenharmony_ci char bufIp6[INET6_ADDRSTRLEN] = {0}; 123518678f8Sopenharmony_ci struct in6_addr addr6; 124518678f8Sopenharmony_ci if (memcpy_s(addr6.s6_addr, sizeof(addr6.s6_addr), &chIp, size) != EOK) { 125518678f8Sopenharmony_ci return ""; 126518678f8Sopenharmony_ci } 127518678f8Sopenharmony_ci if (inet_ntop(AF_INET6, &addr6, bufIp6, INET6_ADDRSTRLEN) == nullptr) { 128518678f8Sopenharmony_ci DHCP_LOGE("Ip6CharConToStr chIp failed, inet_ntop nullptr!"); 129518678f8Sopenharmony_ci } else { 130518678f8Sopenharmony_ci strIp = bufIp6; 131518678f8Sopenharmony_ci DHCP_LOGI("Ip6CharConToStr chIp -> strIp:%{private}s.", strIp.c_str()); 132518678f8Sopenharmony_ci } 133518678f8Sopenharmony_ci 134518678f8Sopenharmony_ci return strIp; 135518678f8Sopenharmony_ci} 136518678f8Sopenharmony_ci 137518678f8Sopenharmony_cibool DhcpFunction::CheckIpStr(const std::string& strIp) 138518678f8Sopenharmony_ci{ 139518678f8Sopenharmony_ci if (strIp.empty()) { 140518678f8Sopenharmony_ci DHCP_LOGE("CheckIpStr param error, strIp is empty()!"); 141518678f8Sopenharmony_ci return false; 142518678f8Sopenharmony_ci } 143518678f8Sopenharmony_ci 144518678f8Sopenharmony_ci bool bIp4 = false; 145518678f8Sopenharmony_ci bool bIp6 = false; 146518678f8Sopenharmony_ci std::string::size_type idx = strIp.find(IP4_SEPARATOR); 147518678f8Sopenharmony_ci if (idx != std::string::npos) { 148518678f8Sopenharmony_ci bIp4 = true; 149518678f8Sopenharmony_ci } 150518678f8Sopenharmony_ci idx = strIp.find(IP6_SEPARATOR); 151518678f8Sopenharmony_ci if (idx != std::string::npos) { 152518678f8Sopenharmony_ci bIp6 = true; 153518678f8Sopenharmony_ci } 154518678f8Sopenharmony_ci if ((!bIp4 && !bIp6) || (bIp4 && bIp6)) { 155518678f8Sopenharmony_ci DHCP_LOGE("CheckIpStr strIp:%{private}s error, bIp4:%{public}d,bIp6:%{public}d!", strIp.c_str(), bIp4, bIp6); 156518678f8Sopenharmony_ci return false; 157518678f8Sopenharmony_ci } 158518678f8Sopenharmony_ci 159518678f8Sopenharmony_ci if (bIp4) { 160518678f8Sopenharmony_ci uint32_t uIp = 0; 161518678f8Sopenharmony_ci if (!Ip4StrConToInt(strIp, uIp)) { 162518678f8Sopenharmony_ci DHCP_LOGE("CheckIpStr Ip4StrConToInt failed, strIp:%{private}s.", strIp.c_str()); 163518678f8Sopenharmony_ci return false; 164518678f8Sopenharmony_ci } 165518678f8Sopenharmony_ci } else { 166518678f8Sopenharmony_ci uint8_t addr6[sizeof(struct in6_addr)] = {0}; 167518678f8Sopenharmony_ci if (!Ip6StrConToChar(strIp, addr6, sizeof(struct in6_addr))) { 168518678f8Sopenharmony_ci DHCP_LOGE("CheckIpStr Ip6StrConToChar failed, strIp:%{private}s.", strIp.c_str()); 169518678f8Sopenharmony_ci return false; 170518678f8Sopenharmony_ci } 171518678f8Sopenharmony_ci } 172518678f8Sopenharmony_ci 173518678f8Sopenharmony_ci return true; 174518678f8Sopenharmony_ci} 175518678f8Sopenharmony_ci 176518678f8Sopenharmony_ciint DhcpFunction::GetLocalIp(const std::string strInf, std::string& strIp, std::string& strMask) 177518678f8Sopenharmony_ci{ 178518678f8Sopenharmony_ci if (strInf.empty()) { 179518678f8Sopenharmony_ci DHCP_LOGE("GetLocalIp param error, strInf is empty!"); 180518678f8Sopenharmony_ci return DHCP_OPT_ERROR; 181518678f8Sopenharmony_ci } 182518678f8Sopenharmony_ci 183518678f8Sopenharmony_ci int fd; 184518678f8Sopenharmony_ci if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { 185518678f8Sopenharmony_ci DHCP_LOGE("GetLocalIp strInf:%{public}s failed, socket err:%{public}d!", strInf.c_str(), errno); 186518678f8Sopenharmony_ci return DHCP_OPT_FAILED; 187518678f8Sopenharmony_ci } 188518678f8Sopenharmony_ci 189518678f8Sopenharmony_ci struct ifreq iface; 190518678f8Sopenharmony_ci if (memset_s(&iface, sizeof(iface), 0, sizeof(iface)) != EOK) { 191518678f8Sopenharmony_ci close(fd); 192518678f8Sopenharmony_ci return DHCP_OPT_FAILED; 193518678f8Sopenharmony_ci } 194518678f8Sopenharmony_ci if (strncpy_s(iface.ifr_name, IFNAMSIZ, strInf.c_str(), IFNAMSIZ - 1) != EOK) { 195518678f8Sopenharmony_ci close(fd); 196518678f8Sopenharmony_ci return DHCP_OPT_FAILED; 197518678f8Sopenharmony_ci } 198518678f8Sopenharmony_ci iface.ifr_name[IFNAMSIZ - 1] = 0; 199518678f8Sopenharmony_ci 200518678f8Sopenharmony_ci /* inet addr */ 201518678f8Sopenharmony_ci if (ioctl(fd, SIOCGIFADDR, &iface) < 0) { 202518678f8Sopenharmony_ci DHCP_LOGE("GetLocalIp() %{public}s failed, SIOCGIFADDR err:%{public}d!", strInf.c_str(), errno); 203518678f8Sopenharmony_ci close(fd); 204518678f8Sopenharmony_ci return DHCP_OPT_FAILED; 205518678f8Sopenharmony_ci } 206518678f8Sopenharmony_ci struct sockaddr_in *pSockIn = (struct sockaddr_in *)&iface.ifr_addr; 207518678f8Sopenharmony_ci char bufIp4[INET_ADDRSTRLEN] = {0}; 208518678f8Sopenharmony_ci if (inet_ntop(AF_INET, &(pSockIn->sin_addr), bufIp4, INET_ADDRSTRLEN) != nullptr) { 209518678f8Sopenharmony_ci strIp = bufIp4; 210518678f8Sopenharmony_ci } 211518678f8Sopenharmony_ci 212518678f8Sopenharmony_ci /* netmask addr */ 213518678f8Sopenharmony_ci if (ioctl(fd, SIOCGIFNETMASK, &iface) < 0) { 214518678f8Sopenharmony_ci DHCP_LOGE("GetLocalIp() %{public}s failed, SIOCGIFNETMASK err:%{public}d!", strInf.c_str(), errno); 215518678f8Sopenharmony_ci close(fd); 216518678f8Sopenharmony_ci return DHCP_OPT_FAILED; 217518678f8Sopenharmony_ci } 218518678f8Sopenharmony_ci pSockIn = (struct sockaddr_in *)&iface.ifr_addr; 219518678f8Sopenharmony_ci char bufMask[INET_ADDRSTRLEN] = {0}; 220518678f8Sopenharmony_ci if (inet_ntop(AF_INET, &(pSockIn->sin_addr), bufMask, INET_ADDRSTRLEN) != nullptr) { 221518678f8Sopenharmony_ci strMask = bufMask; 222518678f8Sopenharmony_ci } 223518678f8Sopenharmony_ci 224518678f8Sopenharmony_ci close(fd); 225518678f8Sopenharmony_ci return DHCP_OPT_SUCCESS; 226518678f8Sopenharmony_ci} 227518678f8Sopenharmony_ci 228518678f8Sopenharmony_ciint DhcpFunction::GetLocalMac(const std::string ethInf, std::string& ethMac) 229518678f8Sopenharmony_ci{ 230518678f8Sopenharmony_ci struct ifreq ifr; 231518678f8Sopenharmony_ci int sd = 0; 232518678f8Sopenharmony_ci 233518678f8Sopenharmony_ci bzero(&ifr, sizeof(struct ifreq)); 234518678f8Sopenharmony_ci if ((sd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { 235518678f8Sopenharmony_ci DHCP_LOGE("GetLocalMac socket ethInf:%{public}s,error:%{public}d!", ethInf.c_str(), errno); 236518678f8Sopenharmony_ci return -1; 237518678f8Sopenharmony_ci } 238518678f8Sopenharmony_ci 239518678f8Sopenharmony_ci if (strncpy_s(ifr.ifr_name, IFNAMSIZ, ethInf.c_str(), IFNAMSIZ - 1) != EOK) { 240518678f8Sopenharmony_ci close(sd); 241518678f8Sopenharmony_ci return -1; 242518678f8Sopenharmony_ci } 243518678f8Sopenharmony_ci 244518678f8Sopenharmony_ci if (ioctl(sd, SIOCGIFHWADDR, &ifr) < 0) { 245518678f8Sopenharmony_ci DHCP_LOGE("GetLocalMac ioctl ethInf:%{public}s,error:%{public}d!", ethInf.c_str(), errno); 246518678f8Sopenharmony_ci close(sd); 247518678f8Sopenharmony_ci return -1; 248518678f8Sopenharmony_ci } 249518678f8Sopenharmony_ci 250518678f8Sopenharmony_ci char mac[ETH_MAC_ADDR_LEN * ETH_MAC_ADDR_CHAR_NUM] = { 0 }; 251518678f8Sopenharmony_ci int nRes = snprintf_s(mac, 252518678f8Sopenharmony_ci ETH_MAC_ADDR_LEN * ETH_MAC_ADDR_CHAR_NUM, 253518678f8Sopenharmony_ci ETH_MAC_ADDR_LEN * ETH_MAC_ADDR_CHAR_NUM - 1, 254518678f8Sopenharmony_ci "%02x:%02x:%02x:%02x:%02x:%02x", 255518678f8Sopenharmony_ci (unsigned char)ifr.ifr_hwaddr.sa_data[ETH_MAC_ADDR_INDEX_0], 256518678f8Sopenharmony_ci (unsigned char)ifr.ifr_hwaddr.sa_data[ETH_MAC_ADDR_INDEX_1], 257518678f8Sopenharmony_ci (unsigned char)ifr.ifr_hwaddr.sa_data[ETH_MAC_ADDR_INDEX_2], 258518678f8Sopenharmony_ci (unsigned char)ifr.ifr_hwaddr.sa_data[ETH_MAC_ADDR_INDEX_3], 259518678f8Sopenharmony_ci (unsigned char)ifr.ifr_hwaddr.sa_data[ETH_MAC_ADDR_INDEX_4], 260518678f8Sopenharmony_ci (unsigned char)ifr.ifr_hwaddr.sa_data[ETH_MAC_ADDR_INDEX_5]); 261518678f8Sopenharmony_ci if (nRes < 0) { 262518678f8Sopenharmony_ci DHCP_LOGE("GetLocalMac snprintf_s ethInf:%{public}s,error:%{public}d!", ethInf.c_str(), errno); 263518678f8Sopenharmony_ci close(sd); 264518678f8Sopenharmony_ci return -1; 265518678f8Sopenharmony_ci } 266518678f8Sopenharmony_ci ethMac = mac; 267518678f8Sopenharmony_ci close(sd); 268518678f8Sopenharmony_ci return 0; 269518678f8Sopenharmony_ci} 270518678f8Sopenharmony_ci 271518678f8Sopenharmony_ciint DhcpFunction::CheckRangeNetwork(const std::string strInf, const std::string strBegin, const std::string strEnd) 272518678f8Sopenharmony_ci{ 273518678f8Sopenharmony_ci if (strInf.empty() || strBegin.empty() || strEnd.empty()) { 274518678f8Sopenharmony_ci DHCP_LOGE("CheckRangeNetwork param error, strInf or strBegin or strEnd is empty!"); 275518678f8Sopenharmony_ci return DHCP_OPT_ERROR; 276518678f8Sopenharmony_ci } 277518678f8Sopenharmony_ci 278518678f8Sopenharmony_ci std::string strIp, strMask; 279518678f8Sopenharmony_ci if (GetLocalIp(strInf, strIp, strMask) != DHCP_OPT_SUCCESS) { 280518678f8Sopenharmony_ci DHCP_LOGE("CheckRangeNetwork get %{public}s local ip failed", strInf.c_str()); 281518678f8Sopenharmony_ci return DHCP_OPT_FAILED; 282518678f8Sopenharmony_ci } 283518678f8Sopenharmony_ci 284518678f8Sopenharmony_ci uint32_t uIp, uMask, uBegin, uEnd; 285518678f8Sopenharmony_ci if (!Ip4StrConToInt(strIp, uIp, false) || !Ip4StrConToInt(strMask, uMask, false) || 286518678f8Sopenharmony_ci !Ip4StrConToInt(strBegin, uBegin, false) || !Ip4StrConToInt(strEnd, uEnd, false)) { 287518678f8Sopenharmony_ci DHCP_LOGE("CheckRangeNetwork %{public}s Ip4StrConToInt failed", strInf.c_str()); 288518678f8Sopenharmony_ci return DHCP_OPT_FAILED; 289518678f8Sopenharmony_ci } 290518678f8Sopenharmony_ci 291518678f8Sopenharmony_ci if (!CheckSameNetwork(uIp, uBegin, uMask)) { 292518678f8Sopenharmony_ci DHCP_LOGE("Check %{public}s %{private}s %{public}s failed", strInf.c_str(), strIp.c_str(), strBegin.c_str()); 293518678f8Sopenharmony_ci return DHCP_OPT_FAILED; 294518678f8Sopenharmony_ci } 295518678f8Sopenharmony_ci if (!CheckSameNetwork(uIp, uEnd, uMask)) { 296518678f8Sopenharmony_ci DHCP_LOGE("Check end %{public}s %{private}s %{public}s failed", strInf.c_str(), strIp.c_str(), strEnd.c_str()); 297518678f8Sopenharmony_ci return DHCP_OPT_FAILED; 298518678f8Sopenharmony_ci } 299518678f8Sopenharmony_ci return DHCP_OPT_SUCCESS; 300518678f8Sopenharmony_ci} 301518678f8Sopenharmony_ci 302518678f8Sopenharmony_cibool DhcpFunction::CheckSameNetwork(const uint32_t srcIp, const uint32_t dstIp, const uint32_t maskIp) 303518678f8Sopenharmony_ci{ 304518678f8Sopenharmony_ci uint32_t srcNet = srcIp & maskIp; 305518678f8Sopenharmony_ci uint32_t dstNet = dstIp & maskIp; 306518678f8Sopenharmony_ci return (srcNet == dstNet); 307518678f8Sopenharmony_ci} 308518678f8Sopenharmony_ci 309518678f8Sopenharmony_cibool DhcpFunction::IsExistFile(const std::string& filename) 310518678f8Sopenharmony_ci{ 311518678f8Sopenharmony_ci bool bExist = false; 312518678f8Sopenharmony_ci std::fstream ioFile; 313518678f8Sopenharmony_ci ioFile.open(filename.c_str(), std::ios::in); 314518678f8Sopenharmony_ci if (ioFile) { 315518678f8Sopenharmony_ci bExist = true; 316518678f8Sopenharmony_ci } 317518678f8Sopenharmony_ci DHCP_LOGE("IsExistFile %{public}s failed, err:%{public}d", filename.c_str(), errno); 318518678f8Sopenharmony_ci ioFile.close(); 319518678f8Sopenharmony_ci 320518678f8Sopenharmony_ci return bExist; 321518678f8Sopenharmony_ci} 322518678f8Sopenharmony_ci 323518678f8Sopenharmony_cibool DhcpFunction::CreateFile(const std::string& filename, const std::string& filedata) 324518678f8Sopenharmony_ci{ 325518678f8Sopenharmony_ci std::ofstream outFile; 326518678f8Sopenharmony_ci outFile.open(filename.c_str()); 327518678f8Sopenharmony_ci outFile.flush(); 328518678f8Sopenharmony_ci outFile << filedata << std::endl; 329518678f8Sopenharmony_ci outFile.close(); 330518678f8Sopenharmony_ci return true; 331518678f8Sopenharmony_ci} 332518678f8Sopenharmony_ci 333518678f8Sopenharmony_cibool DhcpFunction::RemoveFile(const std::string& filename) 334518678f8Sopenharmony_ci{ 335518678f8Sopenharmony_ci if (std::remove(filename.c_str()) != 0) { 336518678f8Sopenharmony_ci DHCP_LOGE("RemoveFile filename:%{public}s failed!", filename.c_str()); 337518678f8Sopenharmony_ci return false; 338518678f8Sopenharmony_ci } 339518678f8Sopenharmony_ci DHCP_LOGI("RemoveFile filename:%{public}s success.", filename.c_str()); 340518678f8Sopenharmony_ci return true; 341518678f8Sopenharmony_ci} 342518678f8Sopenharmony_ci 343518678f8Sopenharmony_cibool DhcpFunction::AddFileLineData(const std::string& filename, const std::string& prevdata, const std::string& linedata) 344518678f8Sopenharmony_ci{ 345518678f8Sopenharmony_ci bool bAdd = false; 346518678f8Sopenharmony_ci std::ifstream inFile; 347518678f8Sopenharmony_ci inFile.open(filename.c_str()); 348518678f8Sopenharmony_ci std::string strFileData = ""; 349518678f8Sopenharmony_ci std::string strTemp = ""; 350518678f8Sopenharmony_ci char tmpLineData[1024] = {0}; 351518678f8Sopenharmony_ci while (inFile.getline(tmpLineData, sizeof(tmpLineData))) { 352518678f8Sopenharmony_ci strTemp = tmpLineData; 353518678f8Sopenharmony_ci strFileData += strTemp; 354518678f8Sopenharmony_ci strFileData += "\n"; 355518678f8Sopenharmony_ci if (strTemp == prevdata) { 356518678f8Sopenharmony_ci strFileData += linedata; 357518678f8Sopenharmony_ci bAdd = true; 358518678f8Sopenharmony_ci } 359518678f8Sopenharmony_ci } 360518678f8Sopenharmony_ci inFile.close(); 361518678f8Sopenharmony_ci 362518678f8Sopenharmony_ci if (bAdd) { 363518678f8Sopenharmony_ci std::ofstream outFile; 364518678f8Sopenharmony_ci outFile.open(filename.c_str()); 365518678f8Sopenharmony_ci outFile.flush(); 366518678f8Sopenharmony_ci DHCP_LOGI("AddFileLineData Reflush filename:%{public}s, strFileData:%{public}s.", 367518678f8Sopenharmony_ci filename.c_str(), strFileData.c_str()); 368518678f8Sopenharmony_ci outFile << strFileData; 369518678f8Sopenharmony_ci outFile.close(); 370518678f8Sopenharmony_ci } 371518678f8Sopenharmony_ci return true; 372518678f8Sopenharmony_ci} 373518678f8Sopenharmony_ci 374518678f8Sopenharmony_cibool DhcpFunction::DelFileLineData(const std::string& filename, const std::string& linedata) 375518678f8Sopenharmony_ci{ 376518678f8Sopenharmony_ci bool bDel = false; 377518678f8Sopenharmony_ci std::ifstream inFile; 378518678f8Sopenharmony_ci inFile.open(filename.c_str()); 379518678f8Sopenharmony_ci std::string strFileData = ""; 380518678f8Sopenharmony_ci std::string strTemp = ""; 381518678f8Sopenharmony_ci char tmpLineData[1024] = {0}; 382518678f8Sopenharmony_ci while (inFile.getline(tmpLineData, sizeof(tmpLineData))) { 383518678f8Sopenharmony_ci strTemp = tmpLineData; 384518678f8Sopenharmony_ci if (strTemp != linedata) { 385518678f8Sopenharmony_ci strFileData += strTemp; 386518678f8Sopenharmony_ci strFileData += "\n"; 387518678f8Sopenharmony_ci } else { 388518678f8Sopenharmony_ci bDel = true; 389518678f8Sopenharmony_ci } 390518678f8Sopenharmony_ci } 391518678f8Sopenharmony_ci inFile.close(); 392518678f8Sopenharmony_ci 393518678f8Sopenharmony_ci if (bDel) { 394518678f8Sopenharmony_ci std::ofstream outFile; 395518678f8Sopenharmony_ci outFile.open(filename.c_str()); 396518678f8Sopenharmony_ci outFile.flush(); 397518678f8Sopenharmony_ci DHCP_LOGI("DelFileLineData Reflush filename:%{public}s, strFileData:%{public}s.", 398518678f8Sopenharmony_ci filename.c_str(), strFileData.c_str()); 399518678f8Sopenharmony_ci outFile << strFileData; 400518678f8Sopenharmony_ci outFile.close(); 401518678f8Sopenharmony_ci } 402518678f8Sopenharmony_ci return true; 403518678f8Sopenharmony_ci} 404518678f8Sopenharmony_ci 405518678f8Sopenharmony_cibool DhcpFunction::ModifyFileLineData(const std::string& filename, const std::string& srcdata, 406518678f8Sopenharmony_ci const std::string& dstdata) 407518678f8Sopenharmony_ci{ 408518678f8Sopenharmony_ci bool bModify = false; 409518678f8Sopenharmony_ci std::ifstream inFile; 410518678f8Sopenharmony_ci inFile.open(filename.c_str()); 411518678f8Sopenharmony_ci std::string strFileData = ""; 412518678f8Sopenharmony_ci std::string strTemp = ""; 413518678f8Sopenharmony_ci char tmpLineData[1024] = {0}; 414518678f8Sopenharmony_ci while (inFile.getline(tmpLineData, sizeof(tmpLineData))) { 415518678f8Sopenharmony_ci strTemp = tmpLineData; 416518678f8Sopenharmony_ci if (strTemp != srcdata) { 417518678f8Sopenharmony_ci strFileData += strTemp; 418518678f8Sopenharmony_ci strFileData += "\n"; 419518678f8Sopenharmony_ci } else { 420518678f8Sopenharmony_ci strFileData += dstdata; 421518678f8Sopenharmony_ci strFileData += "\n"; 422518678f8Sopenharmony_ci bModify = true; 423518678f8Sopenharmony_ci } 424518678f8Sopenharmony_ci } 425518678f8Sopenharmony_ci inFile.close(); 426518678f8Sopenharmony_ci 427518678f8Sopenharmony_ci if (bModify) { 428518678f8Sopenharmony_ci std::ofstream outFile; 429518678f8Sopenharmony_ci outFile.open(filename.c_str()); 430518678f8Sopenharmony_ci outFile.flush(); 431518678f8Sopenharmony_ci DHCP_LOGI("ModifyFileLineData Reflush filename:%{public}s, strFileData:%{public}s.", 432518678f8Sopenharmony_ci filename.c_str(), strFileData.c_str()); 433518678f8Sopenharmony_ci outFile << strFileData; 434518678f8Sopenharmony_ci outFile.close(); 435518678f8Sopenharmony_ci } 436518678f8Sopenharmony_ci return true; 437518678f8Sopenharmony_ci} 438518678f8Sopenharmony_ci 439518678f8Sopenharmony_ciint DhcpFunction::FormatString(struct DhcpPacketResult &result) 440518678f8Sopenharmony_ci{ 441518678f8Sopenharmony_ci if (strncmp(result.strYiaddr, "*", 1) == 0) { 442518678f8Sopenharmony_ci if (memset_s(result.strYiaddr, INET_ADDRSTRLEN, 0, INET_ADDRSTRLEN) != EOK) { 443518678f8Sopenharmony_ci return -1; 444518678f8Sopenharmony_ci } 445518678f8Sopenharmony_ci } 446518678f8Sopenharmony_ci if (strncmp(result.strOptServerId, "*", 1) == 0) { 447518678f8Sopenharmony_ci if (memset_s(result.strOptServerId, INET_ADDRSTRLEN, 0, INET_ADDRSTRLEN) != EOK) { 448518678f8Sopenharmony_ci return -1; 449518678f8Sopenharmony_ci } 450518678f8Sopenharmony_ci } 451518678f8Sopenharmony_ci if (strncmp(result.strOptSubnet, "*", 1) == 0) { 452518678f8Sopenharmony_ci if (memset_s(result.strOptSubnet, INET_ADDRSTRLEN, 0, INET_ADDRSTRLEN) != EOK) { 453518678f8Sopenharmony_ci return -1; 454518678f8Sopenharmony_ci } 455518678f8Sopenharmony_ci } 456518678f8Sopenharmony_ci if (strncmp(result.strOptDns1, "*", 1) == 0) { 457518678f8Sopenharmony_ci if (memset_s(result.strOptDns1, INET_ADDRSTRLEN, 0, INET_ADDRSTRLEN) != EOK) { 458518678f8Sopenharmony_ci return -1; 459518678f8Sopenharmony_ci } 460518678f8Sopenharmony_ci } 461518678f8Sopenharmony_ci if (strncmp(result.strOptDns2, "*", 1) == 0) { 462518678f8Sopenharmony_ci if (memset_s(result.strOptDns2, INET_ADDRSTRLEN, 0, INET_ADDRSTRLEN) != EOK) { 463518678f8Sopenharmony_ci return -1; 464518678f8Sopenharmony_ci } 465518678f8Sopenharmony_ci } 466518678f8Sopenharmony_ci if (strncmp(result.strOptRouter1, "*", 1) == 0) { 467518678f8Sopenharmony_ci if (memset_s(result.strOptRouter1, INET_ADDRSTRLEN, 0, INET_ADDRSTRLEN) != EOK) { 468518678f8Sopenharmony_ci return -1; 469518678f8Sopenharmony_ci } 470518678f8Sopenharmony_ci } 471518678f8Sopenharmony_ci if (strncmp(result.strOptRouter2, "*", 1) == 0) { 472518678f8Sopenharmony_ci if (memset_s(result.strOptRouter2, INET_ADDRSTRLEN, 0, INET_ADDRSTRLEN) != EOK) { 473518678f8Sopenharmony_ci return -1; 474518678f8Sopenharmony_ci } 475518678f8Sopenharmony_ci } 476518678f8Sopenharmony_ci if (strncmp(result.strOptVendor, "*", 1) == 0) { 477518678f8Sopenharmony_ci if (memset_s(result.strOptVendor, DHCP_FILE_MAX_BYTES, 0, DHCP_FILE_MAX_BYTES) != EOK) { 478518678f8Sopenharmony_ci return -1; 479518678f8Sopenharmony_ci } 480518678f8Sopenharmony_ci } 481518678f8Sopenharmony_ci return 0; 482518678f8Sopenharmony_ci} 483518678f8Sopenharmony_ci 484518678f8Sopenharmony_ci#ifdef OHOS_ARCH_LITE 485518678f8Sopenharmony_ciint DhcpFunction::GetDhcpPacketResult(const std::string& filename, struct DhcpPacketResult &result) 486518678f8Sopenharmony_ci{ 487518678f8Sopenharmony_ci FILE *pFile = fopen(filename.c_str(), "r"); 488518678f8Sopenharmony_ci if (pFile == nullptr) { 489518678f8Sopenharmony_ci DHCP_LOGE("GetDhcpPacketResult() fopen %{public}s fail, err:%{public}s!", filename.c_str(), strerror(errno)); 490518678f8Sopenharmony_ci return DHCP_OPT_FAILED; 491518678f8Sopenharmony_ci } 492518678f8Sopenharmony_ci 493518678f8Sopenharmony_ci char strIpFlag[DHCP_NUM_EIGHT]; 494518678f8Sopenharmony_ci if (memset_s(strIpFlag, sizeof(strIpFlag), 0, sizeof(strIpFlag)) != EOK) { 495518678f8Sopenharmony_ci fclose(pFile); 496518678f8Sopenharmony_ci return DHCP_OPT_FAILED; 497518678f8Sopenharmony_ci } 498518678f8Sopenharmony_ci /* Format: IpFlag AddTime cliIp servIp subnet dns1 dns2 router1 router2 vendor lease */ 499518678f8Sopenharmony_ci int nRes = fscanf_s(pFile, "%s %u %s %s %s %s %s %s %s %s %u\n", strIpFlag, DHCP_NUM_EIGHT, &result.uAddTime, 500518678f8Sopenharmony_ci result.strYiaddr, INET_ADDRSTRLEN, result.strOptServerId, INET_ADDRSTRLEN, result.strOptSubnet, INET_ADDRSTRLEN, 501518678f8Sopenharmony_ci result.strOptDns1, INET_ADDRSTRLEN, result.strOptDns2, INET_ADDRSTRLEN, result.strOptRouter1, INET_ADDRSTRLEN, 502518678f8Sopenharmony_ci result.strOptRouter2, INET_ADDRSTRLEN, result.strOptVendor, DHCP_FILE_MAX_BYTES, &result.uOptLeasetime); 503518678f8Sopenharmony_ci if (nRes == EOF) { 504518678f8Sopenharmony_ci DHCP_LOGE("GetDhcpPacketResult() fscanf %{public}s err:%{public}s!", filename.c_str(), strerror(errno)); 505518678f8Sopenharmony_ci fclose(pFile); 506518678f8Sopenharmony_ci return DHCP_OPT_FAILED; 507518678f8Sopenharmony_ci } else if (nRes == 0) { 508518678f8Sopenharmony_ci DHCP_LOGW("GetDhcpPacketResult() fscanf file:%{public}s nRes:0 nullptr!", filename.c_str()); 509518678f8Sopenharmony_ci fclose(pFile); 510518678f8Sopenharmony_ci return DHCP_OPT_NULL; 511518678f8Sopenharmony_ci } else if (nRes != EVENT_DATA_NUM) { 512518678f8Sopenharmony_ci DHCP_LOGE("GetDhcpPacketResult() fscanf file:%{public}s nRes:%{public}d ERROR!", filename.c_str(), nRes); 513518678f8Sopenharmony_ci fclose(pFile); 514518678f8Sopenharmony_ci return DHCP_OPT_FAILED; 515518678f8Sopenharmony_ci } 516518678f8Sopenharmony_ci 517518678f8Sopenharmony_ci if (fclose(pFile) != 0) { 518518678f8Sopenharmony_ci DHCP_LOGE("GetDhcpPacketResult() fclose file:%{public}s failed!", filename.c_str()); 519518678f8Sopenharmony_ci return DHCP_OPT_FAILED; 520518678f8Sopenharmony_ci } 521518678f8Sopenharmony_ci 522518678f8Sopenharmony_ci /* Format dhcp packet result */ 523518678f8Sopenharmony_ci if (FormatString(result) != 0) { 524518678f8Sopenharmony_ci DHCP_LOGE("GetDhcpPacketResult() file:%{public}s failed, FormatString result error!", filename.c_str()); 525518678f8Sopenharmony_ci return DHCP_OPT_FAILED; 526518678f8Sopenharmony_ci } 527518678f8Sopenharmony_ci 528518678f8Sopenharmony_ci return DHCP_OPT_SUCCESS; 529518678f8Sopenharmony_ci} 530518678f8Sopenharmony_ci#endif 531518678f8Sopenharmony_ci 532518678f8Sopenharmony_ciint DhcpFunction::InitPidfile(const std::string& piddir, const std::string& pidfile) 533518678f8Sopenharmony_ci{ 534518678f8Sopenharmony_ci if (piddir.empty() || pidfile.empty()) { 535518678f8Sopenharmony_ci DHCP_LOGE("InitPidfile() failed, piddir or pidfile is empty!"); 536518678f8Sopenharmony_ci return DHCP_OPT_FAILED; 537518678f8Sopenharmony_ci } 538518678f8Sopenharmony_ci DHCP_LOGI("InitPidfile() piddir:%{public}s, pidfile:%{public}s.", piddir.c_str(), pidfile.c_str()); 539518678f8Sopenharmony_ci unlink(pidfile.c_str()); 540518678f8Sopenharmony_ci 541518678f8Sopenharmony_ci int fd; 542518678f8Sopenharmony_ci if ((fd = open(pidfile.c_str(), O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH)) < 0) { 543518678f8Sopenharmony_ci DHCP_LOGE("InitPidfile() failed, open pidfile:%{public}s err:%{public}d!", pidfile.c_str(), errno); 544518678f8Sopenharmony_ci return DHCP_OPT_FAILED; 545518678f8Sopenharmony_ci } 546518678f8Sopenharmony_ci 547518678f8Sopenharmony_ci char buf[PID_MAX_LEN] = {0}; 548518678f8Sopenharmony_ci if (snprintf_s(buf, PID_MAX_LEN, PID_MAX_LEN - 1, "%d", getpid()) < 0) { 549518678f8Sopenharmony_ci DHCP_LOGE("InitPidfile() %{public}s failed, snprintf_s error:%{public}d!", pidfile.c_str(), errno); 550518678f8Sopenharmony_ci close(fd); 551518678f8Sopenharmony_ci return DHCP_OPT_FAILED; 552518678f8Sopenharmony_ci } 553518678f8Sopenharmony_ci ssize_t bytes; 554518678f8Sopenharmony_ci if ((bytes = write(fd, buf, strlen(buf))) <= 0) { 555518678f8Sopenharmony_ci DHCP_LOGE("InitPidfile() failed, write pidfile:%{public}s error:%{public}d, bytes:%{public}zd!", 556518678f8Sopenharmony_ci pidfile.c_str(), errno, bytes); 557518678f8Sopenharmony_ci close(fd); 558518678f8Sopenharmony_ci return DHCP_OPT_FAILED; 559518678f8Sopenharmony_ci } 560518678f8Sopenharmony_ci DHCP_LOGI("InitPidfile() pid:%{public}s write %{public}s, bytes:%{public}zd!", buf, pidfile.c_str(), bytes); 561518678f8Sopenharmony_ci close(fd); 562518678f8Sopenharmony_ci 563518678f8Sopenharmony_ci if (chdir(piddir.c_str()) != 0) { 564518678f8Sopenharmony_ci DHCP_LOGE("InitPidfile() failed, chdir piddir:%{public}s err:%{public}d!", piddir.c_str(), errno); 565518678f8Sopenharmony_ci return DHCP_OPT_FAILED; 566518678f8Sopenharmony_ci } 567518678f8Sopenharmony_ci 568518678f8Sopenharmony_ci /* Set default permissions for the specified client process id files and directories. */ 569518678f8Sopenharmony_ci umask(DEFAULT_UMASK); 570518678f8Sopenharmony_ci 571518678f8Sopenharmony_ci /* Change attribs to the specified client process id files: 644 (user=rw, group=r, other=r). */ 572518678f8Sopenharmony_ci chmod(pidfile.c_str(), S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); 573518678f8Sopenharmony_ci 574518678f8Sopenharmony_ci return DHCP_OPT_SUCCESS; 575518678f8Sopenharmony_ci} 576518678f8Sopenharmony_ci 577518678f8Sopenharmony_cipid_t DhcpFunction::GetPID(const std::string& pidfile) 578518678f8Sopenharmony_ci{ 579518678f8Sopenharmony_ci /* Check pidfile is or not exists. */ 580518678f8Sopenharmony_ci struct stat sb; 581518678f8Sopenharmony_ci if (stat(pidfile.c_str(), &sb) != 0) { 582518678f8Sopenharmony_ci DHCP_LOGW("GetPID() pidfile:%{public}s stat:%{public}d!", pidfile.c_str(), errno); 583518678f8Sopenharmony_ci return -1; 584518678f8Sopenharmony_ci } 585518678f8Sopenharmony_ci DHCP_LOGI("GetPID() pidfile:%{public}s stat st_size:%{public}d.", pidfile.c_str(), (int)sb.st_size); 586518678f8Sopenharmony_ci 587518678f8Sopenharmony_ci int fd; 588518678f8Sopenharmony_ci if ((fd = open(pidfile.c_str(), O_RDONLY)) < 0) { 589518678f8Sopenharmony_ci DHCP_LOGE("GetPID() failed, open pidfile:%{public}s error!", pidfile.c_str()); 590518678f8Sopenharmony_ci return -1; 591518678f8Sopenharmony_ci } 592518678f8Sopenharmony_ci 593518678f8Sopenharmony_ci lseek(fd, 0, SEEK_SET); 594518678f8Sopenharmony_ci 595518678f8Sopenharmony_ci char buf[PID_MAX_LEN] = {0}; 596518678f8Sopenharmony_ci ssize_t bytes; 597518678f8Sopenharmony_ci if ((bytes = read(fd, buf, sb.st_size)) < 0) { 598518678f8Sopenharmony_ci DHCP_LOGE("GetPID() failed, read pidfile:%{public}s error, bytes:%{public}zd!", pidfile.c_str(), bytes); 599518678f8Sopenharmony_ci close(fd); 600518678f8Sopenharmony_ci return -1; 601518678f8Sopenharmony_ci } 602518678f8Sopenharmony_ci DHCP_LOGI("GetPID() read pidfile:%{public}s, buf:%{public}s, bytes:%{public}zd.", pidfile.c_str(), buf, bytes); 603518678f8Sopenharmony_ci close(fd); 604518678f8Sopenharmony_ci 605518678f8Sopenharmony_ci return atoi(buf); 606518678f8Sopenharmony_ci} 607518678f8Sopenharmony_ci 608518678f8Sopenharmony_ciint DhcpFunction::CheckProRunning(const pid_t proPid, const std::string& proName) 609518678f8Sopenharmony_ci{ 610518678f8Sopenharmony_ci if ((proPid == 0) || proName.empty()) { 611518678f8Sopenharmony_ci DHCP_LOGE("CheckProRunning %{public}s param error!", proName.c_str()); 612518678f8Sopenharmony_ci return -1; 613518678f8Sopenharmony_ci } 614518678f8Sopenharmony_ci char buf[DIR_MAX_LEN] = {0}; 615518678f8Sopenharmony_ci if (snprintf_s(buf, DIR_MAX_LEN, DIR_MAX_LEN - 1, "/proc/%ld", (long int)proPid) < 0) { 616518678f8Sopenharmony_ci DHCP_LOGE("CheckProRunning %{public}s failed, snprintf_s errno:%{public}d!", proName.c_str(), errno); 617518678f8Sopenharmony_ci return -1; 618518678f8Sopenharmony_ci } 619518678f8Sopenharmony_ci if (access(buf, F_OK) != 0) { 620518678f8Sopenharmony_ci DHCP_LOGI("CheckProRunning %{public}s is not exist, %{public}s no running", buf, proName.c_str()); 621518678f8Sopenharmony_ci return 0; 622518678f8Sopenharmony_ci } 623518678f8Sopenharmony_ci if (strcat_s(buf, sizeof(buf), "/exe") != EOK) { 624518678f8Sopenharmony_ci DHCP_LOGE("CheckProRunning %{public}s failed, strcat_s errno:%{public}d!", proName.c_str(), errno); 625518678f8Sopenharmony_ci return -1; 626518678f8Sopenharmony_ci } 627518678f8Sopenharmony_ci char proBuf[DIR_MAX_LEN] = {0}; 628518678f8Sopenharmony_ci if (readlink(buf, proBuf, sizeof(proBuf)) < 0) { 629518678f8Sopenharmony_ci DHCP_LOGE("CheckProRunning %{public}s failed, readlink errno:%{public}d!", proName.c_str(), errno); 630518678f8Sopenharmony_ci return -1; 631518678f8Sopenharmony_ci } 632518678f8Sopenharmony_ci if (strstr(proBuf, proName.c_str()) == nullptr) { 633518678f8Sopenharmony_ci DHCP_LOGI("CheckProRunning %{public}s exe -> %{public}s, %{public}s no running", buf, proBuf, proName.c_str()); 634518678f8Sopenharmony_ci return 0; 635518678f8Sopenharmony_ci } 636518678f8Sopenharmony_ci DHCP_LOGI("CheckProRunning %{public}s exe -> %{public}s, %{public}s is running", buf, proBuf, proName.c_str()); 637518678f8Sopenharmony_ci return 1; 638518678f8Sopenharmony_ci} 639518678f8Sopenharmony_ci 640518678f8Sopenharmony_ciint DhcpFunction::CreateDirs(const std::string dirs, int mode) 641518678f8Sopenharmony_ci{ 642518678f8Sopenharmony_ci if (dirs.empty() || (dirs.size() >= DIR_MAX_LEN)) { 643518678f8Sopenharmony_ci DHCP_LOGE("CreateDirs() dirs:%{public}s error!", dirs.c_str()); 644518678f8Sopenharmony_ci return DHCP_OPT_FAILED; 645518678f8Sopenharmony_ci } 646518678f8Sopenharmony_ci 647518678f8Sopenharmony_ci int nSrcLen = (int)dirs.size(); 648518678f8Sopenharmony_ci char strDir[DIR_MAX_LEN] = {0}; 649518678f8Sopenharmony_ci if (strncpy_s(strDir, sizeof(strDir), dirs.c_str(), dirs.size()) != EOK) { 650518678f8Sopenharmony_ci DHCP_LOGE("CreateDirs() strncpy_s dirs:%{public}s failed!", dirs.c_str()); 651518678f8Sopenharmony_ci return DHCP_OPT_FAILED; 652518678f8Sopenharmony_ci } 653518678f8Sopenharmony_ci if (strDir[nSrcLen - 1] != '/') { 654518678f8Sopenharmony_ci if (nSrcLen == (DIR_MAX_LEN - 1)) { 655518678f8Sopenharmony_ci DHCP_LOGE("CreateDirs() dirs:%{public}s len:%{public}d error!", dirs.c_str(), nSrcLen); 656518678f8Sopenharmony_ci return DHCP_OPT_FAILED; 657518678f8Sopenharmony_ci } 658518678f8Sopenharmony_ci if (strcat_s(strDir, sizeof(strDir), "/") != EOK) { 659518678f8Sopenharmony_ci DHCP_LOGE("CreateDirs() strcat_s strDir:%{public}s failed!", strDir); 660518678f8Sopenharmony_ci return DHCP_OPT_FAILED; 661518678f8Sopenharmony_ci } 662518678f8Sopenharmony_ci nSrcLen++; 663518678f8Sopenharmony_ci } 664518678f8Sopenharmony_ci 665518678f8Sopenharmony_ci int i = (strDir[0] == '/') ? 1 : 0; 666518678f8Sopenharmony_ci for (; i <= nSrcLen - 1; i++) { 667518678f8Sopenharmony_ci if (strDir[i] == '/') { 668518678f8Sopenharmony_ci strDir[i] = 0; 669518678f8Sopenharmony_ci if ((access(strDir, F_OK) != 0) && (mkdir(strDir, mode) != 0)) { 670518678f8Sopenharmony_ci DHCP_LOGE("CreateDirs() mkdir %{public}s %{public}.4o %{public}d!", strDir, mode, errno); 671518678f8Sopenharmony_ci return DHCP_OPT_FAILED; 672518678f8Sopenharmony_ci } 673518678f8Sopenharmony_ci strDir[i] = '/'; 674518678f8Sopenharmony_ci } 675518678f8Sopenharmony_ci } 676518678f8Sopenharmony_ci DHCP_LOGI("CreateDirs() %{public}s %{public}.4o success.", dirs.c_str(), mode); 677518678f8Sopenharmony_ci return DHCP_OPT_SUCCESS; 678518678f8Sopenharmony_ci} 679518678f8Sopenharmony_ci 680518678f8Sopenharmony_cibool DhcpFunction::SplitString( 681518678f8Sopenharmony_ci const std::string src, const std::string delim, const int count, std::vector<std::string> &splits) 682518678f8Sopenharmony_ci{ 683518678f8Sopenharmony_ci if (src.empty() || delim.empty()) { 684518678f8Sopenharmony_ci DHCP_LOGE("SplitString() error, src or delim is empty!"); 685518678f8Sopenharmony_ci return false; 686518678f8Sopenharmony_ci } 687518678f8Sopenharmony_ci 688518678f8Sopenharmony_ci splits.clear(); 689518678f8Sopenharmony_ci 690518678f8Sopenharmony_ci std::string strData(src); 691518678f8Sopenharmony_ci int nDelim = 0; 692518678f8Sopenharmony_ci char *pSave = nullptr; 693518678f8Sopenharmony_ci char *pTok = strtok_r(const_cast<char *>(strData.c_str()), delim.c_str(), &pSave); 694518678f8Sopenharmony_ci while (pTok != nullptr) { 695518678f8Sopenharmony_ci splits.push_back(std::string(pTok)); 696518678f8Sopenharmony_ci nDelim++; 697518678f8Sopenharmony_ci pTok = strtok_r(nullptr, delim.c_str(), &pSave); 698518678f8Sopenharmony_ci } 699518678f8Sopenharmony_ci if (nDelim != count) { 700518678f8Sopenharmony_ci DHCP_LOGE("SplitString() %{private}s failed, nDelim:%{public}d,count:%{public}d!", src.c_str(), nDelim, count); 701518678f8Sopenharmony_ci return false; 702518678f8Sopenharmony_ci } 703518678f8Sopenharmony_ci DHCP_LOGI("SplitString() %{private}s success, delim:%{public}s, count:%{public}d, splits.size():%{public}d.", 704518678f8Sopenharmony_ci src.c_str(), delim.c_str(), count, (int)splits.size()); 705518678f8Sopenharmony_ci return true; 706518678f8Sopenharmony_ci} 707518678f8Sopenharmony_ci 708518678f8Sopenharmony_ciint DhcpFunction::WaitProcessExit(const pid_t& serverPid) 709518678f8Sopenharmony_ci{ 710518678f8Sopenharmony_ci int retryCount = 0; 711518678f8Sopenharmony_ci while (retryCount < MAX_RETEY_WAIT_COUNT) { 712518678f8Sopenharmony_ci pid_t ret = waitpid(serverPid, nullptr, WNOHANG); 713518678f8Sopenharmony_ci if (ret == -1) { 714518678f8Sopenharmony_ci DHCP_LOGE("WaitProcessExit() waitpid [%{public}d] failed, errno:%{public}d!", serverPid, errno); 715518678f8Sopenharmony_ci return -1; 716518678f8Sopenharmony_ci } else if (ret == 0) { 717518678f8Sopenharmony_ci retryCount++; 718518678f8Sopenharmony_ci usleep(WAIT_SLEEP_50MS); 719518678f8Sopenharmony_ci } 720518678f8Sopenharmony_ci return 0; 721518678f8Sopenharmony_ci } 722518678f8Sopenharmony_ci DHCP_LOGE("WaitProcessExit() timeout waitpid [%{public}d] failed!", serverPid); 723518678f8Sopenharmony_ci return -1; 724518678f8Sopenharmony_ci} 725518678f8Sopenharmony_ci} // namespace DHCP 726518678f8Sopenharmony_ci} // namespace OHOS