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