10d163575Sopenharmony_ci/*
20d163575Sopenharmony_ci * Copyright (c) 2013-2019 Huawei Technologies Co., Ltd. All rights reserved.
30d163575Sopenharmony_ci * Copyright (c) 2020-2021 Huawei Device Co., Ltd. All rights reserved.
40d163575Sopenharmony_ci *
50d163575Sopenharmony_ci * Redistribution and use in source and binary forms, with or without modification,
60d163575Sopenharmony_ci * are permitted provided that the following conditions are met:
70d163575Sopenharmony_ci *
80d163575Sopenharmony_ci * 1. Redistributions of source code must retain the above copyright notice, this list of
90d163575Sopenharmony_ci *    conditions and the following disclaimer.
100d163575Sopenharmony_ci *
110d163575Sopenharmony_ci * 2. Redistributions in binary form must reproduce the above copyright notice, this list
120d163575Sopenharmony_ci *    of conditions and the following disclaimer in the documentation and/or other materials
130d163575Sopenharmony_ci *    provided with the distribution.
140d163575Sopenharmony_ci *
150d163575Sopenharmony_ci * 3. Neither the name of the copyright holder nor the names of its contributors may be used
160d163575Sopenharmony_ci *    to endorse or promote products derived from this software without specific prior written
170d163575Sopenharmony_ci *    permission.
180d163575Sopenharmony_ci *
190d163575Sopenharmony_ci * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
200d163575Sopenharmony_ci * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
210d163575Sopenharmony_ci * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
220d163575Sopenharmony_ci * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
230d163575Sopenharmony_ci * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
240d163575Sopenharmony_ci * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
250d163575Sopenharmony_ci * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
260d163575Sopenharmony_ci * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
270d163575Sopenharmony_ci * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
280d163575Sopenharmony_ci * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
290d163575Sopenharmony_ci * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
300d163575Sopenharmony_ci */
310d163575Sopenharmony_ci
320d163575Sopenharmony_ci#include "syscall_pub.h"
330d163575Sopenharmony_ci#ifdef LOSCFG_FS_VFS
340d163575Sopenharmony_ci#include "errno.h"
350d163575Sopenharmony_ci#include "unistd.h"
360d163575Sopenharmony_ci#include "fs/fd_table.h"
370d163575Sopenharmony_ci#include "fs/file.h"
380d163575Sopenharmony_ci#include "fs/fs.h"
390d163575Sopenharmony_ci#include "fs/fs_operation.h"
400d163575Sopenharmony_ci#include "sys/mount.h"
410d163575Sopenharmony_ci#include "los_task_pri.h"
420d163575Sopenharmony_ci#include "sys/utsname.h"
430d163575Sopenharmony_ci#include "sys/uio.h"
440d163575Sopenharmony_ci#include "poll.h"
450d163575Sopenharmony_ci#include "sys/prctl.h"
460d163575Sopenharmony_ci#include "epoll.h"
470d163575Sopenharmony_ci#ifdef LOSCFG_KERNEL_DYNLOAD
480d163575Sopenharmony_ci#include "los_exec_elf.h"
490d163575Sopenharmony_ci#endif
500d163575Sopenharmony_ci#include "los_syscall.h"
510d163575Sopenharmony_ci#include "dirent.h"
520d163575Sopenharmony_ci#include "user_copy.h"
530d163575Sopenharmony_ci#include "los_vm_map.h"
540d163575Sopenharmony_ci#include "los_memory.h"
550d163575Sopenharmony_ci#include "los_strncpy_from_user.h"
560d163575Sopenharmony_ci#include "capability_type.h"
570d163575Sopenharmony_ci#include "capability_api.h"
580d163575Sopenharmony_ci#include "sys/statfs.h"
590d163575Sopenharmony_ci
600d163575Sopenharmony_ci#define HIGH_SHIFT_BIT 32
610d163575Sopenharmony_ci#define TIMESPEC_TIMES_NUM  2
620d163575Sopenharmony_ci
630d163575Sopenharmony_cistatic int CheckNewAttrTime(struct IATTR *attr, struct timespec times[TIMESPEC_TIMES_NUM])
640d163575Sopenharmony_ci{
650d163575Sopenharmony_ci    int ret = ENOERR;
660d163575Sopenharmony_ci    struct timespec stp = {0};
670d163575Sopenharmony_ci
680d163575Sopenharmony_ci    if (times) {
690d163575Sopenharmony_ci        if (times[0].tv_nsec == UTIME_OMIT) {
700d163575Sopenharmony_ci            attr->attr_chg_valid &= ~CHG_ATIME;
710d163575Sopenharmony_ci        } else if (times[0].tv_nsec == UTIME_NOW) {
720d163575Sopenharmony_ci            ret = clock_gettime(CLOCK_REALTIME, &stp);
730d163575Sopenharmony_ci            if (ret < 0) {
740d163575Sopenharmony_ci                return -get_errno();
750d163575Sopenharmony_ci            }
760d163575Sopenharmony_ci            attr->attr_chg_atime = (unsigned int)stp.tv_sec;
770d163575Sopenharmony_ci            attr->attr_chg_valid |= CHG_ATIME;
780d163575Sopenharmony_ci        } else {
790d163575Sopenharmony_ci            attr->attr_chg_atime = (unsigned int)times[0].tv_sec;
800d163575Sopenharmony_ci            attr->attr_chg_valid |= CHG_ATIME;
810d163575Sopenharmony_ci        }
820d163575Sopenharmony_ci
830d163575Sopenharmony_ci        if (times[1].tv_nsec == UTIME_OMIT) {
840d163575Sopenharmony_ci            attr->attr_chg_valid &= ~CHG_MTIME;
850d163575Sopenharmony_ci        } else if (times[1].tv_nsec == UTIME_NOW) {
860d163575Sopenharmony_ci            ret = clock_gettime(CLOCK_REALTIME, &stp);
870d163575Sopenharmony_ci            if (ret < 0) {
880d163575Sopenharmony_ci                return -get_errno();
890d163575Sopenharmony_ci            }
900d163575Sopenharmony_ci            attr->attr_chg_mtime = (unsigned int)stp.tv_sec;
910d163575Sopenharmony_ci            attr->attr_chg_valid |= CHG_MTIME;
920d163575Sopenharmony_ci        } else {
930d163575Sopenharmony_ci            attr->attr_chg_mtime = (unsigned int)times[1].tv_sec;
940d163575Sopenharmony_ci            attr->attr_chg_valid |= CHG_MTIME;
950d163575Sopenharmony_ci        }
960d163575Sopenharmony_ci    } else {
970d163575Sopenharmony_ci        ret = clock_gettime(CLOCK_REALTIME, &stp);
980d163575Sopenharmony_ci        if (ret < 0) {
990d163575Sopenharmony_ci            return -get_errno();
1000d163575Sopenharmony_ci        }
1010d163575Sopenharmony_ci        attr->attr_chg_atime = (unsigned int)stp.tv_sec;
1020d163575Sopenharmony_ci        attr->attr_chg_mtime = (unsigned int)stp.tv_sec;
1030d163575Sopenharmony_ci        attr->attr_chg_valid |= CHG_ATIME;
1040d163575Sopenharmony_ci        attr->attr_chg_valid |= CHG_MTIME;
1050d163575Sopenharmony_ci    }
1060d163575Sopenharmony_ci
1070d163575Sopenharmony_ci    return ret;
1080d163575Sopenharmony_ci}
1090d163575Sopenharmony_ci
1100d163575Sopenharmony_cistatic int GetFullpathNull(int fd, const char *path, char **filePath)
1110d163575Sopenharmony_ci{
1120d163575Sopenharmony_ci    int ret;
1130d163575Sopenharmony_ci    char *fullPath = NULL;
1140d163575Sopenharmony_ci    struct file *file = NULL;
1150d163575Sopenharmony_ci
1160d163575Sopenharmony_ci    if ((fd != AT_FDCWD) && (path == NULL)) {
1170d163575Sopenharmony_ci        fd = GetAssociatedSystemFd(fd);
1180d163575Sopenharmony_ci        ret = fs_getfilep(fd, &file);
1190d163575Sopenharmony_ci        if (ret < 0) {
1200d163575Sopenharmony_ci            return -get_errno();
1210d163575Sopenharmony_ci        }
1220d163575Sopenharmony_ci        fullPath = strdup(file->f_path);
1230d163575Sopenharmony_ci        if (fullPath == NULL) {
1240d163575Sopenharmony_ci            ret = -ENOMEM;
1250d163575Sopenharmony_ci        }
1260d163575Sopenharmony_ci    } else {
1270d163575Sopenharmony_ci        ret = GetFullpath(fd, path, &fullPath);
1280d163575Sopenharmony_ci        if (ret < 0) {
1290d163575Sopenharmony_ci            return ret;
1300d163575Sopenharmony_ci        }
1310d163575Sopenharmony_ci    }
1320d163575Sopenharmony_ci
1330d163575Sopenharmony_ci    *filePath = fullPath;
1340d163575Sopenharmony_ci    return ret;
1350d163575Sopenharmony_ci}
1360d163575Sopenharmony_ci
1370d163575Sopenharmony_cistatic int UserIovItemCheck(const struct iovec *iov, const int iovcnt)
1380d163575Sopenharmony_ci{
1390d163575Sopenharmony_ci    int i;
1400d163575Sopenharmony_ci    for (i = 0; i < iovcnt; ++i) {
1410d163575Sopenharmony_ci        if (iov[i].iov_len == 0) {
1420d163575Sopenharmony_ci            continue;
1430d163575Sopenharmony_ci        }
1440d163575Sopenharmony_ci
1450d163575Sopenharmony_ci        if (!LOS_IsUserAddressRange((vaddr_t)(UINTPTR)iov[i].iov_base, iov[i].iov_len)) {
1460d163575Sopenharmony_ci            return i;
1470d163575Sopenharmony_ci        }
1480d163575Sopenharmony_ci    }
1490d163575Sopenharmony_ci    return iovcnt;
1500d163575Sopenharmony_ci}
1510d163575Sopenharmony_ci
1520d163575Sopenharmony_cistatic int UserIovCopy(struct iovec **iovBuf, const struct iovec *iov, const int iovcnt, int *valid_iovcnt)
1530d163575Sopenharmony_ci{
1540d163575Sopenharmony_ci    int ret;
1550d163575Sopenharmony_ci    int bufLen = iovcnt * sizeof(struct iovec);
1560d163575Sopenharmony_ci    if (bufLen < 0) {
1570d163575Sopenharmony_ci        return -EINVAL;
1580d163575Sopenharmony_ci    }
1590d163575Sopenharmony_ci
1600d163575Sopenharmony_ci    *iovBuf = (struct iovec*)LOS_MemAlloc(OS_SYS_MEM_ADDR, bufLen);
1610d163575Sopenharmony_ci    if (*iovBuf == NULL) {
1620d163575Sopenharmony_ci        return -ENOMEM;
1630d163575Sopenharmony_ci    }
1640d163575Sopenharmony_ci
1650d163575Sopenharmony_ci    if (LOS_ArchCopyFromUser(*iovBuf, iov, bufLen) != 0) {
1660d163575Sopenharmony_ci        (void)LOS_MemFree(OS_SYS_MEM_ADDR, *iovBuf);
1670d163575Sopenharmony_ci        return -EFAULT;
1680d163575Sopenharmony_ci    }
1690d163575Sopenharmony_ci
1700d163575Sopenharmony_ci    ret = UserIovItemCheck(*iovBuf, iovcnt);
1710d163575Sopenharmony_ci    if (ret == 0) {
1720d163575Sopenharmony_ci        (void)LOS_MemFree(OS_SYS_MEM_ADDR, *iovBuf);
1730d163575Sopenharmony_ci        return -EFAULT;
1740d163575Sopenharmony_ci    }
1750d163575Sopenharmony_ci
1760d163575Sopenharmony_ci    *valid_iovcnt = ret;
1770d163575Sopenharmony_ci    return 0;
1780d163575Sopenharmony_ci}
1790d163575Sopenharmony_ci
1800d163575Sopenharmony_cistatic int PollfdToSystem(struct pollfd *fds, nfds_t nfds, int **pollFdsBak)
1810d163575Sopenharmony_ci{
1820d163575Sopenharmony_ci    if ((nfds != 0 && fds == NULL) || (pollFdsBak == NULL)) {
1830d163575Sopenharmony_ci        set_errno(EINVAL);
1840d163575Sopenharmony_ci        return -1;
1850d163575Sopenharmony_ci    }
1860d163575Sopenharmony_ci    if (nfds == 0) {
1870d163575Sopenharmony_ci        return 0;
1880d163575Sopenharmony_ci    }
1890d163575Sopenharmony_ci    int *pollFds = (int *)malloc(sizeof(int) * nfds);
1900d163575Sopenharmony_ci    if (pollFds == NULL) {
1910d163575Sopenharmony_ci        set_errno(ENOMEM);
1920d163575Sopenharmony_ci        return -1;
1930d163575Sopenharmony_ci    }
1940d163575Sopenharmony_ci    for (int i = 0; i < nfds; ++i) {
1950d163575Sopenharmony_ci        struct pollfd *p_fds = &fds[i];
1960d163575Sopenharmony_ci        pollFds[i] = p_fds->fd;
1970d163575Sopenharmony_ci        if (p_fds->fd < 0) {
1980d163575Sopenharmony_ci            set_errno(EBADF);
1990d163575Sopenharmony_ci            free(pollFds);
2000d163575Sopenharmony_ci            return -1;
2010d163575Sopenharmony_ci        }
2020d163575Sopenharmony_ci        p_fds->fd = GetAssociatedSystemFd(p_fds->fd);
2030d163575Sopenharmony_ci    }
2040d163575Sopenharmony_ci    *pollFdsBak = pollFds;
2050d163575Sopenharmony_ci    return 0;
2060d163575Sopenharmony_ci}
2070d163575Sopenharmony_ci
2080d163575Sopenharmony_cistatic void RestorePollfd(struct pollfd *fds, nfds_t nfds, const int *pollFds)
2090d163575Sopenharmony_ci{
2100d163575Sopenharmony_ci    if ((fds == NULL) || (pollFds == NULL)) {
2110d163575Sopenharmony_ci        return;
2120d163575Sopenharmony_ci    }
2130d163575Sopenharmony_ci    for (int i = 0; i < nfds; ++i) {
2140d163575Sopenharmony_ci        struct pollfd *p_fds = &fds[i];
2150d163575Sopenharmony_ci        p_fds->fd = pollFds[i];
2160d163575Sopenharmony_ci    }
2170d163575Sopenharmony_ci}
2180d163575Sopenharmony_ci
2190d163575Sopenharmony_cistatic int UserPoll(struct pollfd *fds, nfds_t nfds, int timeout)
2200d163575Sopenharmony_ci{
2210d163575Sopenharmony_ci    int *pollFds = NULL;
2220d163575Sopenharmony_ci    int ret = PollfdToSystem(fds, nfds, &pollFds);
2230d163575Sopenharmony_ci    if (ret < 0) {
2240d163575Sopenharmony_ci        return -1;
2250d163575Sopenharmony_ci    }
2260d163575Sopenharmony_ci
2270d163575Sopenharmony_ci    ret = poll(fds, nfds, timeout);
2280d163575Sopenharmony_ci
2290d163575Sopenharmony_ci    RestorePollfd(fds, nfds, pollFds);
2300d163575Sopenharmony_ci
2310d163575Sopenharmony_ci    free(pollFds);
2320d163575Sopenharmony_ci    return ret;
2330d163575Sopenharmony_ci}
2340d163575Sopenharmony_ci
2350d163575Sopenharmony_ciint SysClose(int fd)
2360d163575Sopenharmony_ci{
2370d163575Sopenharmony_ci    int ret;
2380d163575Sopenharmony_ci
2390d163575Sopenharmony_ci    /* Process fd convert to system global fd */
2400d163575Sopenharmony_ci    int sysfd = DisassociateProcessFd(fd);
2410d163575Sopenharmony_ci
2420d163575Sopenharmony_ci    ret = close(sysfd);
2430d163575Sopenharmony_ci    if (ret < 0) {
2440d163575Sopenharmony_ci        AssociateSystemFd(fd, sysfd);
2450d163575Sopenharmony_ci        return -get_errno();
2460d163575Sopenharmony_ci    }
2470d163575Sopenharmony_ci    FreeProcessFd(fd);
2480d163575Sopenharmony_ci    return ret;
2490d163575Sopenharmony_ci}
2500d163575Sopenharmony_ci
2510d163575Sopenharmony_cissize_t SysRead(int fd, void *buf, size_t nbytes)
2520d163575Sopenharmony_ci{
2530d163575Sopenharmony_ci    int ret;
2540d163575Sopenharmony_ci
2550d163575Sopenharmony_ci    if (nbytes == 0) {
2560d163575Sopenharmony_ci        return 0;
2570d163575Sopenharmony_ci    }
2580d163575Sopenharmony_ci
2590d163575Sopenharmony_ci    if (!LOS_IsUserAddressRange((vaddr_t)(UINTPTR)buf, nbytes)) {
2600d163575Sopenharmony_ci        return -EFAULT;
2610d163575Sopenharmony_ci    }
2620d163575Sopenharmony_ci
2630d163575Sopenharmony_ci    /* Process fd convert to system global fd */
2640d163575Sopenharmony_ci    fd = GetAssociatedSystemFd(fd);
2650d163575Sopenharmony_ci
2660d163575Sopenharmony_ci    ret = read(fd, buf, nbytes);
2670d163575Sopenharmony_ci    if (ret < 0) {
2680d163575Sopenharmony_ci        return -get_errno();
2690d163575Sopenharmony_ci    }
2700d163575Sopenharmony_ci    return ret;
2710d163575Sopenharmony_ci}
2720d163575Sopenharmony_ci
2730d163575Sopenharmony_cissize_t SysWrite(int fd, const void *buf, size_t nbytes)
2740d163575Sopenharmony_ci{
2750d163575Sopenharmony_ci    int ret;
2760d163575Sopenharmony_ci
2770d163575Sopenharmony_ci    if (nbytes == 0) {
2780d163575Sopenharmony_ci        return 0;
2790d163575Sopenharmony_ci    }
2800d163575Sopenharmony_ci
2810d163575Sopenharmony_ci    if (!LOS_IsUserAddressRange((vaddr_t)(UINTPTR)buf, nbytes)) {
2820d163575Sopenharmony_ci        return -EFAULT;
2830d163575Sopenharmony_ci    }
2840d163575Sopenharmony_ci
2850d163575Sopenharmony_ci    /* Process fd convert to system global fd */
2860d163575Sopenharmony_ci    int sysfd = GetAssociatedSystemFd(fd);
2870d163575Sopenharmony_ci    ret = write(sysfd, buf, nbytes);
2880d163575Sopenharmony_ci    if (ret < 0) {
2890d163575Sopenharmony_ci        return -get_errno();
2900d163575Sopenharmony_ci    }
2910d163575Sopenharmony_ci    return ret;
2920d163575Sopenharmony_ci}
2930d163575Sopenharmony_ci
2940d163575Sopenharmony_ci// int vfs_normalize_path(const char *directory, const char *filename, char **pathname)
2950d163575Sopenharmony_ci#ifdef LOSCFG_PID_CONTAINER
2960d163575Sopenharmony_ci#ifdef LOSCFG_PROC_PROCESS_DIR
2970d163575Sopenharmony_ci#define PROCESS_DIR_ROOT   "/proc"
2980d163575Sopenharmony_cistatic char *NextName(char *pos, uint8_t *len)
2990d163575Sopenharmony_ci{
3000d163575Sopenharmony_ci    char *name = NULL;
3010d163575Sopenharmony_ci    while (*pos != 0 && *pos == '/') {
3020d163575Sopenharmony_ci        pos++;
3030d163575Sopenharmony_ci    }
3040d163575Sopenharmony_ci    if (*pos == '\0') {
3050d163575Sopenharmony_ci        return NULL;
3060d163575Sopenharmony_ci    }
3070d163575Sopenharmony_ci    name = (char *)pos;
3080d163575Sopenharmony_ci    while (*pos != '\0' && *pos != '/') {
3090d163575Sopenharmony_ci        pos++;
3100d163575Sopenharmony_ci    }
3110d163575Sopenharmony_ci    *len = pos - name;
3120d163575Sopenharmony_ci    return name;
3130d163575Sopenharmony_ci}
3140d163575Sopenharmony_ci
3150d163575Sopenharmony_cistatic unsigned int ProcRealProcessIDGet(unsigned int pid)
3160d163575Sopenharmony_ci{
3170d163575Sopenharmony_ci    unsigned int intSave;
3180d163575Sopenharmony_ci    if (OS_PID_CHECK_INVALID(pid)) {
3190d163575Sopenharmony_ci        return 0;
3200d163575Sopenharmony_ci    }
3210d163575Sopenharmony_ci
3220d163575Sopenharmony_ci    SCHEDULER_LOCK(intSave);
3230d163575Sopenharmony_ci    LosProcessCB *pcb = OsGetPCBFromVpid(pid);
3240d163575Sopenharmony_ci    if (OsProcessIsInactive(pcb)) {
3250d163575Sopenharmony_ci        SCHEDULER_UNLOCK(intSave);
3260d163575Sopenharmony_ci        return 0;
3270d163575Sopenharmony_ci    }
3280d163575Sopenharmony_ci
3290d163575Sopenharmony_ci    int rootPid = OsGetRootPid(pcb);
3300d163575Sopenharmony_ci    SCHEDULER_UNLOCK(intSave);
3310d163575Sopenharmony_ci    if ((rootPid == OS_INVALID_VALUE) || (rootPid == pid)) {
3320d163575Sopenharmony_ci        return 0;
3330d163575Sopenharmony_ci    }
3340d163575Sopenharmony_ci
3350d163575Sopenharmony_ci    return rootPid;
3360d163575Sopenharmony_ci}
3370d163575Sopenharmony_ci
3380d163575Sopenharmony_cistatic int ProcRealProcessDirGet(char *path)
3390d163575Sopenharmony_ci{
3400d163575Sopenharmony_ci    char pidBuf[PATH_MAX] = {0};
3410d163575Sopenharmony_ci    char *fullPath = NULL;
3420d163575Sopenharmony_ci    uint8_t strLen = 0;
3430d163575Sopenharmony_ci    int pid, rootPid;
3440d163575Sopenharmony_ci    int ret = vfs_normalize_path(NULL, path, &fullPath);
3450d163575Sopenharmony_ci    if (ret < 0) {
3460d163575Sopenharmony_ci        return ret;
3470d163575Sopenharmony_ci    }
3480d163575Sopenharmony_ci
3490d163575Sopenharmony_ci    int procLen = strlen(PROCESS_DIR_ROOT);
3500d163575Sopenharmony_ci    if (strncmp(fullPath, PROCESS_DIR_ROOT, procLen) != 0) {
3510d163575Sopenharmony_ci        free(fullPath);
3520d163575Sopenharmony_ci        return 0;
3530d163575Sopenharmony_ci    }
3540d163575Sopenharmony_ci
3550d163575Sopenharmony_ci    char *pidStr = NextName(fullPath + procLen, &strLen);
3560d163575Sopenharmony_ci    if (pidStr == NULL) {
3570d163575Sopenharmony_ci        free(fullPath);
3580d163575Sopenharmony_ci        return 0;
3590d163575Sopenharmony_ci    }
3600d163575Sopenharmony_ci
3610d163575Sopenharmony_ci    if ((*pidStr <= '0') || (*pidStr > '9')) {
3620d163575Sopenharmony_ci        free(fullPath);
3630d163575Sopenharmony_ci        return 0;
3640d163575Sopenharmony_ci    }
3650d163575Sopenharmony_ci
3660d163575Sopenharmony_ci    if (memcpy_s(pidBuf, PATH_MAX, pidStr, strLen) != EOK) {
3670d163575Sopenharmony_ci        free(fullPath);
3680d163575Sopenharmony_ci        return 0;
3690d163575Sopenharmony_ci    }
3700d163575Sopenharmony_ci    pidBuf[strLen] = '\0';
3710d163575Sopenharmony_ci
3720d163575Sopenharmony_ci    pid = atoi(pidBuf);
3730d163575Sopenharmony_ci    if (pid == 0) {
3740d163575Sopenharmony_ci        free(fullPath);
3750d163575Sopenharmony_ci        return 0;
3760d163575Sopenharmony_ci    }
3770d163575Sopenharmony_ci
3780d163575Sopenharmony_ci    rootPid = ProcRealProcessIDGet((unsigned)pid);
3790d163575Sopenharmony_ci    if (rootPid == 0) {
3800d163575Sopenharmony_ci        free(fullPath);
3810d163575Sopenharmony_ci        return 0;
3820d163575Sopenharmony_ci    }
3830d163575Sopenharmony_ci
3840d163575Sopenharmony_ci    if (snprintf_s(path, PATH_MAX + 1, PATH_MAX, "/proc/%d%s", rootPid, (pidStr + strLen)) < 0) {
3850d163575Sopenharmony_ci        free(fullPath);
3860d163575Sopenharmony_ci        return -EFAULT;
3870d163575Sopenharmony_ci    }
3880d163575Sopenharmony_ci
3890d163575Sopenharmony_ci    free(fullPath);
3900d163575Sopenharmony_ci    return 0;
3910d163575Sopenharmony_ci}
3920d163575Sopenharmony_ci#endif
3930d163575Sopenharmony_ci#endif
3940d163575Sopenharmony_ci
3950d163575Sopenharmony_cistatic int GetPath(const char *path, char **pathRet)
3960d163575Sopenharmony_ci{
3970d163575Sopenharmony_ci    int ret = UserPathCopy(path, pathRet);
3980d163575Sopenharmony_ci    if (ret != 0) {
3990d163575Sopenharmony_ci        return ret;
4000d163575Sopenharmony_ci    }
4010d163575Sopenharmony_ci#ifdef LOSCFG_PID_CONTAINER
4020d163575Sopenharmony_ci#ifdef LOSCFG_PROC_PROCESS_DIR
4030d163575Sopenharmony_ci    ret = ProcRealProcessDirGet(*pathRet);
4040d163575Sopenharmony_ci    if (ret != 0) {
4050d163575Sopenharmony_ci        return ret;
4060d163575Sopenharmony_ci    }
4070d163575Sopenharmony_ci#endif
4080d163575Sopenharmony_ci#endif
4090d163575Sopenharmony_ci    return 0;
4100d163575Sopenharmony_ci}
4110d163575Sopenharmony_ci
4120d163575Sopenharmony_ciint SysOpen(const char *path, int oflags, ...)
4130d163575Sopenharmony_ci{
4140d163575Sopenharmony_ci    int ret;
4150d163575Sopenharmony_ci    int procFd = -1;
4160d163575Sopenharmony_ci    mode_t mode = DEFAULT_FILE_MODE; /* 0666: File read-write properties. */
4170d163575Sopenharmony_ci    char *pathRet = NULL;
4180d163575Sopenharmony_ci
4190d163575Sopenharmony_ci    if (path != NULL) {
4200d163575Sopenharmony_ci        ret = GetPath(path, &pathRet);
4210d163575Sopenharmony_ci        if (ret != 0) {
4220d163575Sopenharmony_ci            goto ERROUT;
4230d163575Sopenharmony_ci        }
4240d163575Sopenharmony_ci    }
4250d163575Sopenharmony_ci
4260d163575Sopenharmony_ci    procFd = AllocProcessFd();
4270d163575Sopenharmony_ci    if (procFd < 0) {
4280d163575Sopenharmony_ci        ret = -EMFILE;
4290d163575Sopenharmony_ci        goto ERROUT;
4300d163575Sopenharmony_ci    }
4310d163575Sopenharmony_ci
4320d163575Sopenharmony_ci    if (oflags & O_CLOEXEC) {
4330d163575Sopenharmony_ci        SetCloexecFlag(procFd);
4340d163575Sopenharmony_ci    }
4350d163575Sopenharmony_ci
4360d163575Sopenharmony_ci    if ((unsigned int)oflags & O_DIRECTORY) {
4370d163575Sopenharmony_ci        ret = do_opendir(pathRet, oflags);
4380d163575Sopenharmony_ci    } else {
4390d163575Sopenharmony_ci#ifdef LOSCFG_FILE_MODE
4400d163575Sopenharmony_ci        va_list ap;
4410d163575Sopenharmony_ci        va_start(ap, oflags);
4420d163575Sopenharmony_ci        mode = va_arg(ap, int);
4430d163575Sopenharmony_ci        va_end(ap);
4440d163575Sopenharmony_ci#endif
4450d163575Sopenharmony_ci
4460d163575Sopenharmony_ci        ret = do_open(AT_FDCWD, pathRet, oflags, mode);
4470d163575Sopenharmony_ci    }
4480d163575Sopenharmony_ci
4490d163575Sopenharmony_ci    if (ret < 0) {
4500d163575Sopenharmony_ci        ret = -get_errno();
4510d163575Sopenharmony_ci        goto ERROUT;
4520d163575Sopenharmony_ci    }
4530d163575Sopenharmony_ci
4540d163575Sopenharmony_ci    AssociateSystemFd(procFd, ret);
4550d163575Sopenharmony_ci    if (pathRet != NULL) {
4560d163575Sopenharmony_ci        LOS_MemFree(OS_SYS_MEM_ADDR, pathRet);
4570d163575Sopenharmony_ci    }
4580d163575Sopenharmony_ci    return procFd;
4590d163575Sopenharmony_ci
4600d163575Sopenharmony_ciERROUT:
4610d163575Sopenharmony_ci    if (pathRet != NULL) {
4620d163575Sopenharmony_ci        (void)LOS_MemFree(OS_SYS_MEM_ADDR, pathRet);
4630d163575Sopenharmony_ci    }
4640d163575Sopenharmony_ci    if (procFd >= 0) {
4650d163575Sopenharmony_ci        FreeProcessFd(procFd);
4660d163575Sopenharmony_ci    }
4670d163575Sopenharmony_ci    return ret;
4680d163575Sopenharmony_ci}
4690d163575Sopenharmony_ci
4700d163575Sopenharmony_ciint SysCreat(const char *pathname, mode_t mode)
4710d163575Sopenharmony_ci{
4720d163575Sopenharmony_ci    int ret = 0;
4730d163575Sopenharmony_ci    char *pathRet = NULL;
4740d163575Sopenharmony_ci
4750d163575Sopenharmony_ci    if (pathname != NULL) {
4760d163575Sopenharmony_ci        ret = UserPathCopy(pathname, &pathRet);
4770d163575Sopenharmony_ci        if (ret != 0) {
4780d163575Sopenharmony_ci            goto OUT;
4790d163575Sopenharmony_ci        }
4800d163575Sopenharmony_ci    }
4810d163575Sopenharmony_ci
4820d163575Sopenharmony_ci    int procFd = AllocProcessFd();
4830d163575Sopenharmony_ci    if (procFd  < 0) {
4840d163575Sopenharmony_ci        ret = -EMFILE;
4850d163575Sopenharmony_ci        goto OUT;
4860d163575Sopenharmony_ci    }
4870d163575Sopenharmony_ci
4880d163575Sopenharmony_ci    ret = open((pathname ? pathRet : NULL), O_CREAT | O_TRUNC | O_WRONLY, mode);
4890d163575Sopenharmony_ci    if (ret < 0) {
4900d163575Sopenharmony_ci        FreeProcessFd(procFd);
4910d163575Sopenharmony_ci        ret = -get_errno();
4920d163575Sopenharmony_ci    } else {
4930d163575Sopenharmony_ci        AssociateSystemFd(procFd, ret);
4940d163575Sopenharmony_ci        ret = procFd;
4950d163575Sopenharmony_ci    }
4960d163575Sopenharmony_ci
4970d163575Sopenharmony_ciOUT:
4980d163575Sopenharmony_ci    if (pathRet != NULL) {
4990d163575Sopenharmony_ci        (void)LOS_MemFree(OS_SYS_MEM_ADDR, pathRet);
5000d163575Sopenharmony_ci    }
5010d163575Sopenharmony_ci    return ret;
5020d163575Sopenharmony_ci}
5030d163575Sopenharmony_ci
5040d163575Sopenharmony_ciint SysLink(const char *oldpath, const char *newpath)
5050d163575Sopenharmony_ci{
5060d163575Sopenharmony_ci    int ret;
5070d163575Sopenharmony_ci    char *oldpathRet = NULL;
5080d163575Sopenharmony_ci    char *newpathRet = NULL;
5090d163575Sopenharmony_ci
5100d163575Sopenharmony_ci    if (oldpath != NULL) {
5110d163575Sopenharmony_ci        ret = UserPathCopy(oldpath, &oldpathRet);
5120d163575Sopenharmony_ci        if (ret != 0) {
5130d163575Sopenharmony_ci            goto OUT;
5140d163575Sopenharmony_ci        }
5150d163575Sopenharmony_ci    }
5160d163575Sopenharmony_ci
5170d163575Sopenharmony_ci    if (newpath != NULL) {
5180d163575Sopenharmony_ci        ret = UserPathCopy(newpath, &newpathRet);
5190d163575Sopenharmony_ci        if (ret != 0) {
5200d163575Sopenharmony_ci            goto OUT;
5210d163575Sopenharmony_ci        }
5220d163575Sopenharmony_ci    }
5230d163575Sopenharmony_ci
5240d163575Sopenharmony_ci    ret = link(oldpathRet, newpathRet);
5250d163575Sopenharmony_ci    if (ret < 0) {
5260d163575Sopenharmony_ci        ret = -get_errno();
5270d163575Sopenharmony_ci    }
5280d163575Sopenharmony_ci
5290d163575Sopenharmony_ciOUT:
5300d163575Sopenharmony_ci    if (oldpathRet != NULL) {
5310d163575Sopenharmony_ci        (void)LOS_MemFree(OS_SYS_MEM_ADDR, oldpathRet);
5320d163575Sopenharmony_ci    }
5330d163575Sopenharmony_ci    if (newpathRet != NULL) {
5340d163575Sopenharmony_ci        (void)LOS_MemFree(OS_SYS_MEM_ADDR, newpathRet);
5350d163575Sopenharmony_ci    }
5360d163575Sopenharmony_ci    return ret;
5370d163575Sopenharmony_ci}
5380d163575Sopenharmony_ci
5390d163575Sopenharmony_cissize_t SysReadlink(const char *pathname, char *buf, size_t bufsize)
5400d163575Sopenharmony_ci{
5410d163575Sopenharmony_ci    ssize_t ret;
5420d163575Sopenharmony_ci    char *pathRet = NULL;
5430d163575Sopenharmony_ci
5440d163575Sopenharmony_ci    if (bufsize == 0) {
5450d163575Sopenharmony_ci        return -EINVAL;
5460d163575Sopenharmony_ci    }
5470d163575Sopenharmony_ci
5480d163575Sopenharmony_ci    if (pathname != NULL) {
5490d163575Sopenharmony_ci        ret = UserPathCopy(pathname, &pathRet);
5500d163575Sopenharmony_ci        if (ret != 0) {
5510d163575Sopenharmony_ci            goto OUT;
5520d163575Sopenharmony_ci        }
5530d163575Sopenharmony_ci
5540d163575Sopenharmony_ci#ifdef LOSCFG_PID_CONTAINER
5550d163575Sopenharmony_ci#ifdef LOSCFG_PROC_PROCESS_DIR
5560d163575Sopenharmony_ci        ret = ProcRealProcessDirGet(pathRet);
5570d163575Sopenharmony_ci        if (ret != 0) {
5580d163575Sopenharmony_ci            goto OUT;
5590d163575Sopenharmony_ci        }
5600d163575Sopenharmony_ci#endif
5610d163575Sopenharmony_ci#endif
5620d163575Sopenharmony_ci    }
5630d163575Sopenharmony_ci
5640d163575Sopenharmony_ci    if (!LOS_IsUserAddressRange((vaddr_t)(UINTPTR)buf, bufsize)) {
5650d163575Sopenharmony_ci        ret = -EFAULT;
5660d163575Sopenharmony_ci        goto OUT;
5670d163575Sopenharmony_ci    }
5680d163575Sopenharmony_ci
5690d163575Sopenharmony_ci    ret = readlink(pathRet, buf, bufsize);
5700d163575Sopenharmony_ci    if (ret < 0) {
5710d163575Sopenharmony_ci        ret = -get_errno();
5720d163575Sopenharmony_ci    }
5730d163575Sopenharmony_ci
5740d163575Sopenharmony_ciOUT:
5750d163575Sopenharmony_ci    if (pathRet != NULL) {
5760d163575Sopenharmony_ci        (void)LOS_MemFree(OS_SYS_MEM_ADDR, pathRet);
5770d163575Sopenharmony_ci    }
5780d163575Sopenharmony_ci    return ret;
5790d163575Sopenharmony_ci}
5800d163575Sopenharmony_ci
5810d163575Sopenharmony_ciint SysSymlink(const char *target, const char *linkpath)
5820d163575Sopenharmony_ci{
5830d163575Sopenharmony_ci    int ret;
5840d163575Sopenharmony_ci    char *targetRet = NULL;
5850d163575Sopenharmony_ci    char *pathRet = NULL;
5860d163575Sopenharmony_ci
5870d163575Sopenharmony_ci    if (target != NULL) {
5880d163575Sopenharmony_ci        ret = UserPathCopy(target, &targetRet);
5890d163575Sopenharmony_ci        if (ret != 0) {
5900d163575Sopenharmony_ci            goto OUT;
5910d163575Sopenharmony_ci        }
5920d163575Sopenharmony_ci    }
5930d163575Sopenharmony_ci
5940d163575Sopenharmony_ci    if (linkpath != NULL) {
5950d163575Sopenharmony_ci        ret = UserPathCopy(linkpath, &pathRet);
5960d163575Sopenharmony_ci        if (ret != 0) {
5970d163575Sopenharmony_ci            goto OUT;
5980d163575Sopenharmony_ci        }
5990d163575Sopenharmony_ci    }
6000d163575Sopenharmony_ci
6010d163575Sopenharmony_ci    ret = symlink(targetRet, pathRet);
6020d163575Sopenharmony_ci    if (ret < 0) {
6030d163575Sopenharmony_ci        ret = -get_errno();
6040d163575Sopenharmony_ci    }
6050d163575Sopenharmony_ci
6060d163575Sopenharmony_ciOUT:
6070d163575Sopenharmony_ci    if (pathRet != NULL) {
6080d163575Sopenharmony_ci        (void)LOS_MemFree(OS_SYS_MEM_ADDR, pathRet);
6090d163575Sopenharmony_ci    }
6100d163575Sopenharmony_ci
6110d163575Sopenharmony_ci    if (targetRet != NULL) {
6120d163575Sopenharmony_ci        (void)LOS_MemFree(OS_SYS_MEM_ADDR, targetRet);
6130d163575Sopenharmony_ci    }
6140d163575Sopenharmony_ci    return ret;
6150d163575Sopenharmony_ci}
6160d163575Sopenharmony_ci
6170d163575Sopenharmony_ciint SysUnlink(const char *pathname)
6180d163575Sopenharmony_ci{
6190d163575Sopenharmony_ci    int ret;
6200d163575Sopenharmony_ci    char *pathRet = NULL;
6210d163575Sopenharmony_ci
6220d163575Sopenharmony_ci    if (pathname != NULL) {
6230d163575Sopenharmony_ci        ret = UserPathCopy(pathname, &pathRet);
6240d163575Sopenharmony_ci        if (ret != 0) {
6250d163575Sopenharmony_ci            goto OUT;
6260d163575Sopenharmony_ci        }
6270d163575Sopenharmony_ci    }
6280d163575Sopenharmony_ci
6290d163575Sopenharmony_ci    ret = do_unlink(AT_FDCWD, (pathname ? pathRet : NULL));
6300d163575Sopenharmony_ci    if (ret < 0) {
6310d163575Sopenharmony_ci        ret = -get_errno();
6320d163575Sopenharmony_ci    }
6330d163575Sopenharmony_ci
6340d163575Sopenharmony_ciOUT:
6350d163575Sopenharmony_ci    if (pathRet != NULL) {
6360d163575Sopenharmony_ci        (void)LOS_MemFree(OS_SYS_MEM_ADDR, pathRet);
6370d163575Sopenharmony_ci    }
6380d163575Sopenharmony_ci    return ret;
6390d163575Sopenharmony_ci}
6400d163575Sopenharmony_ci
6410d163575Sopenharmony_ci#ifdef LOSCFG_KERNEL_DYNLOAD
6420d163575Sopenharmony_ciint SysExecve(const char *fileName, char *const *argv, char *const *envp)
6430d163575Sopenharmony_ci{
6440d163575Sopenharmony_ci    return LOS_DoExecveFile(fileName, argv, envp);
6450d163575Sopenharmony_ci}
6460d163575Sopenharmony_ci#endif
6470d163575Sopenharmony_ci
6480d163575Sopenharmony_ciint SysFchdir(int fd)
6490d163575Sopenharmony_ci{
6500d163575Sopenharmony_ci    int ret;
6510d163575Sopenharmony_ci    int sysFd;
6520d163575Sopenharmony_ci    struct file *file = NULL;
6530d163575Sopenharmony_ci
6540d163575Sopenharmony_ci    sysFd = GetAssociatedSystemFd(fd);
6550d163575Sopenharmony_ci    if (sysFd < 0) {
6560d163575Sopenharmony_ci        return -EBADF;
6570d163575Sopenharmony_ci    }
6580d163575Sopenharmony_ci
6590d163575Sopenharmony_ci    ret = fs_getfilep(sysFd, &file);
6600d163575Sopenharmony_ci    if (ret < 0) {
6610d163575Sopenharmony_ci        return -get_errno();
6620d163575Sopenharmony_ci    }
6630d163575Sopenharmony_ci
6640d163575Sopenharmony_ci    ret = chdir(file->f_path);
6650d163575Sopenharmony_ci    if (ret < 0) {
6660d163575Sopenharmony_ci        ret = -get_errno();
6670d163575Sopenharmony_ci    }
6680d163575Sopenharmony_ci
6690d163575Sopenharmony_ci    return ret;
6700d163575Sopenharmony_ci}
6710d163575Sopenharmony_ci
6720d163575Sopenharmony_ciint SysChdir(const char *path)
6730d163575Sopenharmony_ci{
6740d163575Sopenharmony_ci    int ret;
6750d163575Sopenharmony_ci    char *pathRet = NULL;
6760d163575Sopenharmony_ci
6770d163575Sopenharmony_ci    if (path != NULL) {
6780d163575Sopenharmony_ci        ret = UserPathCopy(path, &pathRet);
6790d163575Sopenharmony_ci        if (ret != 0) {
6800d163575Sopenharmony_ci            goto OUT;
6810d163575Sopenharmony_ci        }
6820d163575Sopenharmony_ci    }
6830d163575Sopenharmony_ci
6840d163575Sopenharmony_ci    ret = chdir(path ? pathRet : NULL);
6850d163575Sopenharmony_ci    if (ret < 0) {
6860d163575Sopenharmony_ci        ret = -get_errno();
6870d163575Sopenharmony_ci    }
6880d163575Sopenharmony_ci
6890d163575Sopenharmony_ciOUT:
6900d163575Sopenharmony_ci    if (pathRet != NULL) {
6910d163575Sopenharmony_ci        (void)LOS_MemFree(OS_SYS_MEM_ADDR, pathRet);
6920d163575Sopenharmony_ci    }
6930d163575Sopenharmony_ci    return ret;
6940d163575Sopenharmony_ci}
6950d163575Sopenharmony_ci
6960d163575Sopenharmony_cioff_t SysLseek(int fd, off_t offset, int whence)
6970d163575Sopenharmony_ci{
6980d163575Sopenharmony_ci    /* Process fd convert to system global fd */
6990d163575Sopenharmony_ci    fd = GetAssociatedSystemFd(fd);
7000d163575Sopenharmony_ci
7010d163575Sopenharmony_ci    return _lseek(fd, offset, whence);
7020d163575Sopenharmony_ci}
7030d163575Sopenharmony_ci
7040d163575Sopenharmony_cioff64_t SysLseek64(int fd, int offsetHigh, int offsetLow, off64_t *result, int whence)
7050d163575Sopenharmony_ci{
7060d163575Sopenharmony_ci    off64_t ret;
7070d163575Sopenharmony_ci    off64_t res;
7080d163575Sopenharmony_ci    int retVal;
7090d163575Sopenharmony_ci
7100d163575Sopenharmony_ci    /* Process fd convert to system global fd */
7110d163575Sopenharmony_ci    fd = GetAssociatedSystemFd(fd);
7120d163575Sopenharmony_ci
7130d163575Sopenharmony_ci    ret = _lseek64(fd, offsetHigh, offsetLow, &res, whence);
7140d163575Sopenharmony_ci    if (ret != 0) {
7150d163575Sopenharmony_ci        return ret;
7160d163575Sopenharmony_ci    }
7170d163575Sopenharmony_ci
7180d163575Sopenharmony_ci    retVal = LOS_ArchCopyToUser(result, &res, sizeof(off64_t));
7190d163575Sopenharmony_ci    if (retVal != 0) {
7200d163575Sopenharmony_ci        return -EFAULT;
7210d163575Sopenharmony_ci    }
7220d163575Sopenharmony_ci
7230d163575Sopenharmony_ci    return 0;
7240d163575Sopenharmony_ci}
7250d163575Sopenharmony_ci
7260d163575Sopenharmony_ci#ifdef LOSCFG_FS_NFS
7270d163575Sopenharmony_cistatic int NfsMountRef(const char *serverIpAndPath, const char *mountPath,
7280d163575Sopenharmony_ci                       unsigned int uid, unsigned int gid) __attribute__((weakref("nfs_mount")));
7290d163575Sopenharmony_ci
7300d163575Sopenharmony_cistatic int NfsMount(const char *serverIpAndPath, const char *mountPath,
7310d163575Sopenharmony_ci                    unsigned int uid, unsigned int gid)
7320d163575Sopenharmony_ci{
7330d163575Sopenharmony_ci    int ret;
7340d163575Sopenharmony_ci
7350d163575Sopenharmony_ci    if ((serverIpAndPath == NULL) || (mountPath == NULL)) {
7360d163575Sopenharmony_ci        return -EINVAL;
7370d163575Sopenharmony_ci    }
7380d163575Sopenharmony_ci    ret = NfsMountRef(serverIpAndPath, mountPath, uid, gid);
7390d163575Sopenharmony_ci    if (ret < 0) {
7400d163575Sopenharmony_ci        ret = -get_errno();
7410d163575Sopenharmony_ci    }
7420d163575Sopenharmony_ci    return ret;
7430d163575Sopenharmony_ci}
7440d163575Sopenharmony_ci#endif
7450d163575Sopenharmony_ci
7460d163575Sopenharmony_ciint SysMount(const char *source, const char *target, const char *filesystemtype, unsigned long mountflags,
7470d163575Sopenharmony_ci             const void *data)
7480d163575Sopenharmony_ci{
7490d163575Sopenharmony_ci    int ret;
7500d163575Sopenharmony_ci    char *sourceRet = NULL;
7510d163575Sopenharmony_ci    char *targetRet = NULL;
7520d163575Sopenharmony_ci    char *dataRet = NULL;
7530d163575Sopenharmony_ci    char fstypeRet[FILESYSTEM_TYPE_MAX + 1] = {0};
7540d163575Sopenharmony_ci
7550d163575Sopenharmony_ci    if (!IsCapPermit(CAP_FS_MOUNT)) {
7560d163575Sopenharmony_ci        return -EPERM;
7570d163575Sopenharmony_ci    }
7580d163575Sopenharmony_ci
7590d163575Sopenharmony_ci    if (target != NULL) {
7600d163575Sopenharmony_ci        ret = UserPathCopy(target, &targetRet);
7610d163575Sopenharmony_ci        if (ret != 0) {
7620d163575Sopenharmony_ci            goto OUT;
7630d163575Sopenharmony_ci        }
7640d163575Sopenharmony_ci    }
7650d163575Sopenharmony_ci
7660d163575Sopenharmony_ci    if (filesystemtype != NULL) {
7670d163575Sopenharmony_ci        ret = LOS_StrncpyFromUser(fstypeRet, filesystemtype, FILESYSTEM_TYPE_MAX + 1);
7680d163575Sopenharmony_ci        if (ret < 0) {
7690d163575Sopenharmony_ci            goto OUT;
7700d163575Sopenharmony_ci        } else if (ret > FILESYSTEM_TYPE_MAX) {
7710d163575Sopenharmony_ci            ret = -ENODEV;
7720d163575Sopenharmony_ci            goto OUT;
7730d163575Sopenharmony_ci        }
7740d163575Sopenharmony_ci
7750d163575Sopenharmony_ci        if (strcmp(fstypeRet, "ramfs") && (source != NULL)) {
7760d163575Sopenharmony_ci            ret = UserPathCopy(source, &sourceRet);
7770d163575Sopenharmony_ci            if (ret != 0) {
7780d163575Sopenharmony_ci                goto OUT;
7790d163575Sopenharmony_ci            }
7800d163575Sopenharmony_ci        }
7810d163575Sopenharmony_ci#ifdef LOSCFG_FS_NFS
7820d163575Sopenharmony_ci        if (strcmp(fstypeRet, "nfs") == 0) {
7830d163575Sopenharmony_ci            ret = NfsMount(sourceRet, targetRet, 0, 0);
7840d163575Sopenharmony_ci            goto OUT;
7850d163575Sopenharmony_ci        }
7860d163575Sopenharmony_ci#endif
7870d163575Sopenharmony_ci    }
7880d163575Sopenharmony_ci
7890d163575Sopenharmony_ci    if (data != NULL) {
7900d163575Sopenharmony_ci        ret = UserPathCopy(data, &dataRet);
7910d163575Sopenharmony_ci        if (ret != 0) {
7920d163575Sopenharmony_ci            goto OUT;
7930d163575Sopenharmony_ci        }
7940d163575Sopenharmony_ci    }
7950d163575Sopenharmony_ci
7960d163575Sopenharmony_ci    ret = mount(sourceRet, targetRet, (filesystemtype ? fstypeRet : NULL), mountflags, dataRet);
7970d163575Sopenharmony_ci    if (ret < 0) {
7980d163575Sopenharmony_ci        ret = -get_errno();
7990d163575Sopenharmony_ci    }
8000d163575Sopenharmony_ci
8010d163575Sopenharmony_ciOUT:
8020d163575Sopenharmony_ci    if (sourceRet != NULL) {
8030d163575Sopenharmony_ci        (void)LOS_MemFree(OS_SYS_MEM_ADDR, sourceRet);
8040d163575Sopenharmony_ci    }
8050d163575Sopenharmony_ci    if (targetRet != NULL) {
8060d163575Sopenharmony_ci        (void)LOS_MemFree(OS_SYS_MEM_ADDR, targetRet);
8070d163575Sopenharmony_ci    }
8080d163575Sopenharmony_ci    if (dataRet != NULL) {
8090d163575Sopenharmony_ci        (void)LOS_MemFree(OS_SYS_MEM_ADDR, dataRet);
8100d163575Sopenharmony_ci    }
8110d163575Sopenharmony_ci    return ret;
8120d163575Sopenharmony_ci}
8130d163575Sopenharmony_ci
8140d163575Sopenharmony_ciint SysUmount(const char *target)
8150d163575Sopenharmony_ci{
8160d163575Sopenharmony_ci    int ret;
8170d163575Sopenharmony_ci    char *pathRet = NULL;
8180d163575Sopenharmony_ci
8190d163575Sopenharmony_ci    if (!IsCapPermit(CAP_FS_MOUNT)) {
8200d163575Sopenharmony_ci        return -EPERM;
8210d163575Sopenharmony_ci    }
8220d163575Sopenharmony_ci
8230d163575Sopenharmony_ci    if (target != NULL) {
8240d163575Sopenharmony_ci        ret = UserPathCopy(target, &pathRet);
8250d163575Sopenharmony_ci        if (ret != 0) {
8260d163575Sopenharmony_ci            goto OUT;
8270d163575Sopenharmony_ci        }
8280d163575Sopenharmony_ci    }
8290d163575Sopenharmony_ci
8300d163575Sopenharmony_ci    ret = umount(target ? pathRet : NULL);
8310d163575Sopenharmony_ci    if (ret < 0) {
8320d163575Sopenharmony_ci        ret = -get_errno();
8330d163575Sopenharmony_ci    }
8340d163575Sopenharmony_ci
8350d163575Sopenharmony_ciOUT:
8360d163575Sopenharmony_ci    if (pathRet != NULL) {
8370d163575Sopenharmony_ci        (void)LOS_MemFree(OS_SYS_MEM_ADDR, pathRet);
8380d163575Sopenharmony_ci    }
8390d163575Sopenharmony_ci    return ret;
8400d163575Sopenharmony_ci}
8410d163575Sopenharmony_ci
8420d163575Sopenharmony_ciint SysAccess(const char *path, int amode)
8430d163575Sopenharmony_ci{
8440d163575Sopenharmony_ci    int ret;
8450d163575Sopenharmony_ci    char *pathRet = NULL;
8460d163575Sopenharmony_ci
8470d163575Sopenharmony_ci    if (path != NULL) {
8480d163575Sopenharmony_ci        ret = UserPathCopy(path, &pathRet);
8490d163575Sopenharmony_ci        if (ret != 0) {
8500d163575Sopenharmony_ci            goto OUT;
8510d163575Sopenharmony_ci        }
8520d163575Sopenharmony_ci    }
8530d163575Sopenharmony_ci
8540d163575Sopenharmony_ci    ret = access(pathRet, amode);
8550d163575Sopenharmony_ci    if (ret < 0) {
8560d163575Sopenharmony_ci        ret = -get_errno();
8570d163575Sopenharmony_ci    }
8580d163575Sopenharmony_ci
8590d163575Sopenharmony_ciOUT:
8600d163575Sopenharmony_ci    if (pathRet != NULL) {
8610d163575Sopenharmony_ci        (void)LOS_MemFree(OS_SYS_MEM_ADDR, pathRet);
8620d163575Sopenharmony_ci    }
8630d163575Sopenharmony_ci
8640d163575Sopenharmony_ci    return ret;
8650d163575Sopenharmony_ci}
8660d163575Sopenharmony_ci
8670d163575Sopenharmony_ciint SysRename(const char *oldpath, const char *newpath)
8680d163575Sopenharmony_ci{
8690d163575Sopenharmony_ci    int ret;
8700d163575Sopenharmony_ci    char *pathOldRet = NULL;
8710d163575Sopenharmony_ci    char *pathNewRet = NULL;
8720d163575Sopenharmony_ci
8730d163575Sopenharmony_ci    if (oldpath != NULL) {
8740d163575Sopenharmony_ci        ret = UserPathCopy(oldpath, &pathOldRet);
8750d163575Sopenharmony_ci        if (ret != 0) {
8760d163575Sopenharmony_ci            goto OUT;
8770d163575Sopenharmony_ci        }
8780d163575Sopenharmony_ci    }
8790d163575Sopenharmony_ci
8800d163575Sopenharmony_ci    if (newpath != NULL) {
8810d163575Sopenharmony_ci        ret = UserPathCopy(newpath, &pathNewRet);
8820d163575Sopenharmony_ci        if (ret != 0) {
8830d163575Sopenharmony_ci            goto OUT;
8840d163575Sopenharmony_ci        }
8850d163575Sopenharmony_ci    }
8860d163575Sopenharmony_ci
8870d163575Sopenharmony_ci    ret = do_rename(AT_FDCWD, (oldpath ? pathOldRet : NULL), AT_FDCWD,
8880d163575Sopenharmony_ci                    (newpath ? pathNewRet : NULL));
8890d163575Sopenharmony_ci    if (ret < 0) {
8900d163575Sopenharmony_ci        ret = -get_errno();
8910d163575Sopenharmony_ci    }
8920d163575Sopenharmony_ci
8930d163575Sopenharmony_ciOUT:
8940d163575Sopenharmony_ci    if (pathOldRet != NULL) {
8950d163575Sopenharmony_ci        (void)LOS_MemFree(OS_SYS_MEM_ADDR, pathOldRet);
8960d163575Sopenharmony_ci    }
8970d163575Sopenharmony_ci    if (pathNewRet != NULL) {
8980d163575Sopenharmony_ci        (void)LOS_MemFree(OS_SYS_MEM_ADDR, pathNewRet);
8990d163575Sopenharmony_ci    }
9000d163575Sopenharmony_ci    return ret;
9010d163575Sopenharmony_ci}
9020d163575Sopenharmony_ci
9030d163575Sopenharmony_ciint SysMkdir(const char *pathname, mode_t mode)
9040d163575Sopenharmony_ci{
9050d163575Sopenharmony_ci    int ret;
9060d163575Sopenharmony_ci    char *pathRet = NULL;
9070d163575Sopenharmony_ci
9080d163575Sopenharmony_ci    if (pathname != NULL) {
9090d163575Sopenharmony_ci        ret = UserPathCopy(pathname, &pathRet);
9100d163575Sopenharmony_ci        if (ret != 0) {
9110d163575Sopenharmony_ci            goto OUT;
9120d163575Sopenharmony_ci        }
9130d163575Sopenharmony_ci    }
9140d163575Sopenharmony_ci
9150d163575Sopenharmony_ci    ret = do_mkdir(AT_FDCWD, (pathname ? pathRet : NULL), mode);
9160d163575Sopenharmony_ci    if (ret < 0) {
9170d163575Sopenharmony_ci        ret = -get_errno();
9180d163575Sopenharmony_ci    }
9190d163575Sopenharmony_ci
9200d163575Sopenharmony_ciOUT:
9210d163575Sopenharmony_ci    if (pathRet != NULL) {
9220d163575Sopenharmony_ci        (void)LOS_MemFree(OS_SYS_MEM_ADDR, pathRet);
9230d163575Sopenharmony_ci    }
9240d163575Sopenharmony_ci    return ret;
9250d163575Sopenharmony_ci}
9260d163575Sopenharmony_ci
9270d163575Sopenharmony_ciint SysRmdir(const char *pathname)
9280d163575Sopenharmony_ci{
9290d163575Sopenharmony_ci    int ret;
9300d163575Sopenharmony_ci    char *pathRet = NULL;
9310d163575Sopenharmony_ci
9320d163575Sopenharmony_ci    if (pathname != NULL) {
9330d163575Sopenharmony_ci        ret = UserPathCopy(pathname, &pathRet);
9340d163575Sopenharmony_ci        if (ret != 0) {
9350d163575Sopenharmony_ci            goto OUT;
9360d163575Sopenharmony_ci        }
9370d163575Sopenharmony_ci    }
9380d163575Sopenharmony_ci
9390d163575Sopenharmony_ci    ret = do_rmdir(AT_FDCWD, (pathname ? pathRet : NULL));
9400d163575Sopenharmony_ci    if (ret < 0) {
9410d163575Sopenharmony_ci        ret = -get_errno();
9420d163575Sopenharmony_ci    }
9430d163575Sopenharmony_ci
9440d163575Sopenharmony_ciOUT:
9450d163575Sopenharmony_ci    if (pathRet != NULL) {
9460d163575Sopenharmony_ci        (void)LOS_MemFree(OS_SYS_MEM_ADDR, pathRet);
9470d163575Sopenharmony_ci    }
9480d163575Sopenharmony_ci    return ret;
9490d163575Sopenharmony_ci}
9500d163575Sopenharmony_ci
9510d163575Sopenharmony_ciint SysDup(int fd)
9520d163575Sopenharmony_ci{
9530d163575Sopenharmony_ci    int sysfd = GetAssociatedSystemFd(fd);
9540d163575Sopenharmony_ci    /* Check if the param is valid, note that: socket fd is not support dup2 */
9550d163575Sopenharmony_ci    if ((sysfd < 0) || (sysfd >= CONFIG_NFILE_DESCRIPTORS)) {
9560d163575Sopenharmony_ci        return -EBADF;
9570d163575Sopenharmony_ci    }
9580d163575Sopenharmony_ci
9590d163575Sopenharmony_ci    int dupfd = AllocProcessFd();
9600d163575Sopenharmony_ci    if (dupfd < 0) {
9610d163575Sopenharmony_ci        return -EMFILE;
9620d163575Sopenharmony_ci    }
9630d163575Sopenharmony_ci
9640d163575Sopenharmony_ci    files_refer(sysfd);
9650d163575Sopenharmony_ci    AssociateSystemFd(dupfd, sysfd);
9660d163575Sopenharmony_ci    return dupfd;
9670d163575Sopenharmony_ci}
9680d163575Sopenharmony_ci
9690d163575Sopenharmony_civoid SysSync(void)
9700d163575Sopenharmony_ci{
9710d163575Sopenharmony_ci    sync();
9720d163575Sopenharmony_ci}
9730d163575Sopenharmony_ci
9740d163575Sopenharmony_ciint SysUmount2(const char *target, int flags)
9750d163575Sopenharmony_ci{
9760d163575Sopenharmony_ci    if (flags != 0) {
9770d163575Sopenharmony_ci        return -EINVAL;
9780d163575Sopenharmony_ci    }
9790d163575Sopenharmony_ci    return SysUmount(target);
9800d163575Sopenharmony_ci}
9810d163575Sopenharmony_ci
9820d163575Sopenharmony_ciint SysIoctl(int fd, int req, void *arg)
9830d163575Sopenharmony_ci{
9840d163575Sopenharmony_ci    int ret;
9850d163575Sopenharmony_ci    unsigned int size = _IOC_SIZE((unsigned int)req);
9860d163575Sopenharmony_ci    unsigned int dir = _IOC_DIR((unsigned int)req);
9870d163575Sopenharmony_ci    if ((size == 0) && (dir != _IOC_NONE)) {
9880d163575Sopenharmony_ci        return -EINVAL;
9890d163575Sopenharmony_ci    }
9900d163575Sopenharmony_ci
9910d163575Sopenharmony_ci    if ((dir != _IOC_NONE) && (((void *)(uintptr_t)arg) == NULL)) {
9920d163575Sopenharmony_ci        return -EINVAL;
9930d163575Sopenharmony_ci    }
9940d163575Sopenharmony_ci
9950d163575Sopenharmony_ci    if ((dir & _IOC_READ) || (dir & _IOC_WRITE)) {
9960d163575Sopenharmony_ci        if (!LOS_IsUserAddressRange((uintptr_t)arg, size)) {
9970d163575Sopenharmony_ci            return -EFAULT;
9980d163575Sopenharmony_ci        }
9990d163575Sopenharmony_ci    }
10000d163575Sopenharmony_ci
10010d163575Sopenharmony_ci    /* Process fd convert to system global fd */
10020d163575Sopenharmony_ci    fd = GetAssociatedSystemFd(fd);
10030d163575Sopenharmony_ci
10040d163575Sopenharmony_ci    ret = ioctl(fd, req, arg);
10050d163575Sopenharmony_ci    if (ret < 0) {
10060d163575Sopenharmony_ci        return -get_errno();
10070d163575Sopenharmony_ci    }
10080d163575Sopenharmony_ci    return ret;
10090d163575Sopenharmony_ci}
10100d163575Sopenharmony_ci
10110d163575Sopenharmony_ciint SysFcntl(int fd, int cmd, void *arg)
10120d163575Sopenharmony_ci{
10130d163575Sopenharmony_ci    /* Process fd convert to system global fd */
10140d163575Sopenharmony_ci    int sysfd = GetAssociatedSystemFd(fd);
10150d163575Sopenharmony_ci
10160d163575Sopenharmony_ci    int ret = VfsFcntl(fd, cmd, arg);
10170d163575Sopenharmony_ci    if (ret == CONTINE_NUTTX_FCNTL) {
10180d163575Sopenharmony_ci        ret = fcntl(sysfd, cmd, arg);
10190d163575Sopenharmony_ci    }
10200d163575Sopenharmony_ci
10210d163575Sopenharmony_ci    if (ret < 0) {
10220d163575Sopenharmony_ci        return -get_errno();
10230d163575Sopenharmony_ci    }
10240d163575Sopenharmony_ci    return ret;
10250d163575Sopenharmony_ci}
10260d163575Sopenharmony_ci
10270d163575Sopenharmony_ci#ifdef LOSCFG_KERNEL_PIPE
10280d163575Sopenharmony_ciint SysPipe(int pipefd[2]) /* 2 : pipe fds for read and write */
10290d163575Sopenharmony_ci{
10300d163575Sopenharmony_ci    int ret;
10310d163575Sopenharmony_ci    int pipeFdIntr[2] = {0}; /* 2 : pipe fds for read and write */
10320d163575Sopenharmony_ci
10330d163575Sopenharmony_ci    int procFd0 = AllocProcessFd();
10340d163575Sopenharmony_ci    if (procFd0 < 0) {
10350d163575Sopenharmony_ci        return -EMFILE;
10360d163575Sopenharmony_ci    }
10370d163575Sopenharmony_ci    int procFd1 = AllocProcessFd();
10380d163575Sopenharmony_ci    if (procFd1 < 0) {
10390d163575Sopenharmony_ci        FreeProcessFd(procFd0);
10400d163575Sopenharmony_ci        return -EMFILE;
10410d163575Sopenharmony_ci    }
10420d163575Sopenharmony_ci
10430d163575Sopenharmony_ci    ret = pipe(pipeFdIntr);
10440d163575Sopenharmony_ci    if (ret < 0) {
10450d163575Sopenharmony_ci        FreeProcessFd(procFd0);
10460d163575Sopenharmony_ci        FreeProcessFd(procFd1);
10470d163575Sopenharmony_ci        return -get_errno();
10480d163575Sopenharmony_ci    }
10490d163575Sopenharmony_ci    int sysPipeFd0 = pipeFdIntr[0];
10500d163575Sopenharmony_ci    int sysPipeFd1 = pipeFdIntr[1];
10510d163575Sopenharmony_ci
10520d163575Sopenharmony_ci    AssociateSystemFd(procFd0, sysPipeFd0);
10530d163575Sopenharmony_ci    AssociateSystemFd(procFd1, sysPipeFd1);
10540d163575Sopenharmony_ci
10550d163575Sopenharmony_ci    pipeFdIntr[0] = procFd0;
10560d163575Sopenharmony_ci    pipeFdIntr[1] = procFd1;
10570d163575Sopenharmony_ci
10580d163575Sopenharmony_ci    ret = LOS_ArchCopyToUser(pipefd, pipeFdIntr, sizeof(pipeFdIntr));
10590d163575Sopenharmony_ci    if (ret != 0) {
10600d163575Sopenharmony_ci        FreeProcessFd(procFd0);
10610d163575Sopenharmony_ci        FreeProcessFd(procFd1);
10620d163575Sopenharmony_ci        close(sysPipeFd0);
10630d163575Sopenharmony_ci        close(sysPipeFd1);
10640d163575Sopenharmony_ci        return -EFAULT;
10650d163575Sopenharmony_ci    }
10660d163575Sopenharmony_ci    return ret;
10670d163575Sopenharmony_ci}
10680d163575Sopenharmony_ci#endif
10690d163575Sopenharmony_ci
10700d163575Sopenharmony_ciint SysDup2(int fd1, int fd2)
10710d163575Sopenharmony_ci{
10720d163575Sopenharmony_ci    int ret;
10730d163575Sopenharmony_ci    int sysfd1 = GetAssociatedSystemFd(fd1);
10740d163575Sopenharmony_ci    int sysfd2 = GetAssociatedSystemFd(fd2);
10750d163575Sopenharmony_ci
10760d163575Sopenharmony_ci    /* Check if the param is valid, note that: socket fd is not support dup2 */
10770d163575Sopenharmony_ci    if ((sysfd1 < 0) || (sysfd1 >= CONFIG_NFILE_DESCRIPTORS) || (CheckProcessFd(fd2) != OK)) {
10780d163575Sopenharmony_ci        return -EBADF;
10790d163575Sopenharmony_ci    }
10800d163575Sopenharmony_ci
10810d163575Sopenharmony_ci    /* Handle special circumstances */
10820d163575Sopenharmony_ci    if (fd1 == fd2) {
10830d163575Sopenharmony_ci        return fd2;
10840d163575Sopenharmony_ci    }
10850d163575Sopenharmony_ci
10860d163575Sopenharmony_ci    ret = AllocSpecifiedProcessFd(fd2);
10870d163575Sopenharmony_ci    if (ret != OK) {
10880d163575Sopenharmony_ci        return ret;
10890d163575Sopenharmony_ci    }
10900d163575Sopenharmony_ci
10910d163575Sopenharmony_ci    /* close the sysfd2 in need */
10920d163575Sopenharmony_ci    if (sysfd2 >= 0) {
10930d163575Sopenharmony_ci        ret = close(sysfd2);
10940d163575Sopenharmony_ci        if (ret < 0) {
10950d163575Sopenharmony_ci            AssociateSystemFd(fd2, sysfd2);
10960d163575Sopenharmony_ci            return -get_errno();
10970d163575Sopenharmony_ci        }
10980d163575Sopenharmony_ci    }
10990d163575Sopenharmony_ci
11000d163575Sopenharmony_ci    files_refer(sysfd1);
11010d163575Sopenharmony_ci    AssociateSystemFd(fd2, sysfd1);
11020d163575Sopenharmony_ci
11030d163575Sopenharmony_ci    /* if fd1 is not equal to fd2, the FD_CLOEXEC flag associated with fd2 shall be cleared */
11040d163575Sopenharmony_ci    ClearCloexecFlag(fd2);
11050d163575Sopenharmony_ci    return fd2;
11060d163575Sopenharmony_ci}
11070d163575Sopenharmony_ci
11080d163575Sopenharmony_cistatic int SelectParamCheckCopy(fd_set *readfds, fd_set *writefds, fd_set *exceptfds, fd_set **fdsBuf)
11090d163575Sopenharmony_ci{
11100d163575Sopenharmony_ci    fd_set *readfdsRet = NULL;
11110d163575Sopenharmony_ci    fd_set *writefdsRet = NULL;
11120d163575Sopenharmony_ci    fd_set *exceptfdsRet = NULL;
11130d163575Sopenharmony_ci
11140d163575Sopenharmony_ci    *fdsBuf = (fd_set *)LOS_MemAlloc(OS_SYS_MEM_ADDR, sizeof(fd_set) * 3); /* 3: three param need check and copy */
11150d163575Sopenharmony_ci    if (*fdsBuf == NULL) {
11160d163575Sopenharmony_ci        return -ENOMEM;
11170d163575Sopenharmony_ci    }
11180d163575Sopenharmony_ci
11190d163575Sopenharmony_ci    readfdsRet = *fdsBuf;        /* LOS_MemAlloc 3 sizeof(fd_set) space,first use for readfds */
11200d163575Sopenharmony_ci    writefdsRet = *fdsBuf + 1;   /* 1: LOS_MemAlloc 3 sizeof(fd_set) space,second use for writefds */
11210d163575Sopenharmony_ci    exceptfdsRet = *fdsBuf + 2;  /* 2: LOS_MemAlloc 3 sizeof(fd_set) space,thired use for exceptfds */
11220d163575Sopenharmony_ci
11230d163575Sopenharmony_ci    if (readfds != NULL) {
11240d163575Sopenharmony_ci        if (LOS_ArchCopyFromUser(readfdsRet, readfds, sizeof(fd_set)) != 0) {
11250d163575Sopenharmony_ci            (void)LOS_MemFree(OS_SYS_MEM_ADDR, *fdsBuf);
11260d163575Sopenharmony_ci            return -EFAULT;
11270d163575Sopenharmony_ci        }
11280d163575Sopenharmony_ci    }
11290d163575Sopenharmony_ci
11300d163575Sopenharmony_ci    if (writefds != NULL) {
11310d163575Sopenharmony_ci        if (LOS_ArchCopyFromUser(writefdsRet, writefds, sizeof(fd_set)) != 0) {
11320d163575Sopenharmony_ci            (void)LOS_MemFree(OS_SYS_MEM_ADDR, *fdsBuf);
11330d163575Sopenharmony_ci            return -EFAULT;
11340d163575Sopenharmony_ci        }
11350d163575Sopenharmony_ci    }
11360d163575Sopenharmony_ci
11370d163575Sopenharmony_ci    if (exceptfds != NULL) {
11380d163575Sopenharmony_ci        if (LOS_ArchCopyFromUser(exceptfdsRet, exceptfds, sizeof(fd_set)) != 0) {
11390d163575Sopenharmony_ci            (void)LOS_MemFree(OS_SYS_MEM_ADDR, *fdsBuf);
11400d163575Sopenharmony_ci            return -EFAULT;
11410d163575Sopenharmony_ci        }
11420d163575Sopenharmony_ci    }
11430d163575Sopenharmony_ci
11440d163575Sopenharmony_ci    return 0;
11450d163575Sopenharmony_ci}
11460d163575Sopenharmony_ci
11470d163575Sopenharmony_ciint SysSelect(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout)
11480d163575Sopenharmony_ci{
11490d163575Sopenharmony_ci    int ret;
11500d163575Sopenharmony_ci    fd_set *fdsRet = NULL;
11510d163575Sopenharmony_ci    fd_set *readfdsRet = NULL;
11520d163575Sopenharmony_ci    fd_set *writefdsRet = NULL;
11530d163575Sopenharmony_ci    fd_set *exceptfdsRet = NULL;
11540d163575Sopenharmony_ci    struct timeval timeoutRet = {0};
11550d163575Sopenharmony_ci
11560d163575Sopenharmony_ci    ret = SelectParamCheckCopy(readfds, writefds, exceptfds, &fdsRet);
11570d163575Sopenharmony_ci    if (ret != 0) {
11580d163575Sopenharmony_ci        return ret;
11590d163575Sopenharmony_ci    }
11600d163575Sopenharmony_ci
11610d163575Sopenharmony_ci    readfdsRet = fdsRet;        /* LOS_MemAlloc 3 sizeof(fd_set) space,first use for readfds */
11620d163575Sopenharmony_ci    writefdsRet = fdsRet + 1;   /* 1: LOS_MemAlloc 3 sizeof(fd_set) space,second use for writefds */
11630d163575Sopenharmony_ci    exceptfdsRet = fdsRet + 2;  /* 2: LOS_MemAlloc 3 sizeof(fd_set) space,thired use for exceptfds */
11640d163575Sopenharmony_ci
11650d163575Sopenharmony_ci    if (timeout != NULL) {
11660d163575Sopenharmony_ci        if (LOS_ArchCopyFromUser(&timeoutRet, timeout, sizeof(struct timeval)) != 0) {
11670d163575Sopenharmony_ci            goto ERROUT;
11680d163575Sopenharmony_ci        }
11690d163575Sopenharmony_ci    }
11700d163575Sopenharmony_ci
11710d163575Sopenharmony_ci    ret = do_select(nfds, (readfds ? readfdsRet : NULL), (writefds ? writefdsRet : NULL),
11720d163575Sopenharmony_ci                 (exceptfds ? exceptfdsRet : NULL), (timeout ? (&timeoutRet) : NULL), UserPoll);
11730d163575Sopenharmony_ci    if (ret < 0) {
11740d163575Sopenharmony_ci        (void)LOS_MemFree(OS_SYS_MEM_ADDR, fdsRet);
11750d163575Sopenharmony_ci        return -get_errno();
11760d163575Sopenharmony_ci    }
11770d163575Sopenharmony_ci
11780d163575Sopenharmony_ci    if (readfds != NULL) {
11790d163575Sopenharmony_ci        if (LOS_ArchCopyToUser(readfds, readfdsRet, sizeof(fd_set)) != 0) {
11800d163575Sopenharmony_ci            goto ERROUT;
11810d163575Sopenharmony_ci        }
11820d163575Sopenharmony_ci    }
11830d163575Sopenharmony_ci
11840d163575Sopenharmony_ci    if (writefds != NULL) {
11850d163575Sopenharmony_ci        if (LOS_ArchCopyToUser(writefds, writefdsRet, sizeof(fd_set)) != 0) {
11860d163575Sopenharmony_ci            goto ERROUT;
11870d163575Sopenharmony_ci        }
11880d163575Sopenharmony_ci    }
11890d163575Sopenharmony_ci
11900d163575Sopenharmony_ci    if (exceptfds != 0) {
11910d163575Sopenharmony_ci        if (LOS_ArchCopyToUser(exceptfds, exceptfdsRet, sizeof(fd_set)) != 0) {
11920d163575Sopenharmony_ci            goto ERROUT;
11930d163575Sopenharmony_ci        }
11940d163575Sopenharmony_ci    }
11950d163575Sopenharmony_ci
11960d163575Sopenharmony_ci    (void)LOS_MemFree(OS_SYS_MEM_ADDR, fdsRet);
11970d163575Sopenharmony_ci    return ret;
11980d163575Sopenharmony_ci
11990d163575Sopenharmony_ciERROUT:
12000d163575Sopenharmony_ci    (void)LOS_MemFree(OS_SYS_MEM_ADDR, fdsRet);
12010d163575Sopenharmony_ci    return -EFAULT;
12020d163575Sopenharmony_ci}
12030d163575Sopenharmony_ci
12040d163575Sopenharmony_ciint SysTruncate(const char *path, off_t length)
12050d163575Sopenharmony_ci{
12060d163575Sopenharmony_ci    int ret;
12070d163575Sopenharmony_ci    int fd = -1;
12080d163575Sopenharmony_ci    char *pathRet = NULL;
12090d163575Sopenharmony_ci
12100d163575Sopenharmony_ci    if (path != NULL) {
12110d163575Sopenharmony_ci        ret = UserPathCopy(path, &pathRet);
12120d163575Sopenharmony_ci        if (ret != 0) {
12130d163575Sopenharmony_ci            goto OUT;
12140d163575Sopenharmony_ci        }
12150d163575Sopenharmony_ci    }
12160d163575Sopenharmony_ci
12170d163575Sopenharmony_ci    fd = open((path ? pathRet : NULL), O_RDWR);
12180d163575Sopenharmony_ci    if (fd < 0) {
12190d163575Sopenharmony_ci        /* The errno value has already been set */
12200d163575Sopenharmony_ci        ret = -get_errno();
12210d163575Sopenharmony_ci        goto OUT;
12220d163575Sopenharmony_ci    }
12230d163575Sopenharmony_ci
12240d163575Sopenharmony_ci    ret = ftruncate(fd, length);
12250d163575Sopenharmony_ci    close(fd);
12260d163575Sopenharmony_ci    if (ret < 0) {
12270d163575Sopenharmony_ci        ret = -get_errno();
12280d163575Sopenharmony_ci    }
12290d163575Sopenharmony_ci
12300d163575Sopenharmony_ciOUT:
12310d163575Sopenharmony_ci    if (pathRet != NULL) {
12320d163575Sopenharmony_ci        (void)LOS_MemFree(OS_SYS_MEM_ADDR, pathRet);
12330d163575Sopenharmony_ci    }
12340d163575Sopenharmony_ci    return ret;
12350d163575Sopenharmony_ci}
12360d163575Sopenharmony_ci
12370d163575Sopenharmony_ciint SysTruncate64(const char *path, off64_t length)
12380d163575Sopenharmony_ci{
12390d163575Sopenharmony_ci    int ret;
12400d163575Sopenharmony_ci    int fd = -1;
12410d163575Sopenharmony_ci    char *pathRet = NULL;
12420d163575Sopenharmony_ci
12430d163575Sopenharmony_ci    if (path != NULL) {
12440d163575Sopenharmony_ci        ret = UserPathCopy(path, &pathRet);
12450d163575Sopenharmony_ci        if (ret != 0) {
12460d163575Sopenharmony_ci            goto OUT;
12470d163575Sopenharmony_ci        }
12480d163575Sopenharmony_ci    }
12490d163575Sopenharmony_ci
12500d163575Sopenharmony_ci    fd = open((path ? pathRet : NULL), O_RDWR);
12510d163575Sopenharmony_ci    if (fd < 0) {
12520d163575Sopenharmony_ci        /* The errno value has already been set */
12530d163575Sopenharmony_ci        ret = -get_errno();
12540d163575Sopenharmony_ci        goto OUT;
12550d163575Sopenharmony_ci    }
12560d163575Sopenharmony_ci
12570d163575Sopenharmony_ci    ret = ftruncate64(fd, length);
12580d163575Sopenharmony_ci    close(fd);
12590d163575Sopenharmony_ci    if (ret < 0) {
12600d163575Sopenharmony_ci        ret = -get_errno();
12610d163575Sopenharmony_ci    }
12620d163575Sopenharmony_ci
12630d163575Sopenharmony_ciOUT:
12640d163575Sopenharmony_ci    if (pathRet != NULL) {
12650d163575Sopenharmony_ci        (void)LOS_MemFree(OS_SYS_MEM_ADDR, pathRet);
12660d163575Sopenharmony_ci    }
12670d163575Sopenharmony_ci    return ret;
12680d163575Sopenharmony_ci}
12690d163575Sopenharmony_ci
12700d163575Sopenharmony_ciint SysFtruncate(int fd, off_t length)
12710d163575Sopenharmony_ci{
12720d163575Sopenharmony_ci    int ret;
12730d163575Sopenharmony_ci
12740d163575Sopenharmony_ci    /* Process fd convert to system global fd */
12750d163575Sopenharmony_ci    fd = GetAssociatedSystemFd(fd);
12760d163575Sopenharmony_ci
12770d163575Sopenharmony_ci    ret = ftruncate(fd, length);
12780d163575Sopenharmony_ci    if (ret < 0) {
12790d163575Sopenharmony_ci        return -get_errno();
12800d163575Sopenharmony_ci    }
12810d163575Sopenharmony_ci    return ret;
12820d163575Sopenharmony_ci}
12830d163575Sopenharmony_ci
12840d163575Sopenharmony_ciint SysStatfs(const char *path, struct statfs *buf)
12850d163575Sopenharmony_ci{
12860d163575Sopenharmony_ci    int ret;
12870d163575Sopenharmony_ci    char *pathRet = NULL;
12880d163575Sopenharmony_ci    struct statfs bufRet = {0};
12890d163575Sopenharmony_ci
12900d163575Sopenharmony_ci    if (path != NULL) {
12910d163575Sopenharmony_ci        ret = UserPathCopy(path, &pathRet);
12920d163575Sopenharmony_ci        if (ret != 0) {
12930d163575Sopenharmony_ci            goto OUT;
12940d163575Sopenharmony_ci        }
12950d163575Sopenharmony_ci    }
12960d163575Sopenharmony_ci
12970d163575Sopenharmony_ci    ret = statfs((path ? pathRet : NULL), (buf ? (&bufRet) : NULL));
12980d163575Sopenharmony_ci    if (ret < 0) {
12990d163575Sopenharmony_ci        ret = -get_errno();
13000d163575Sopenharmony_ci        goto OUT;
13010d163575Sopenharmony_ci    }
13020d163575Sopenharmony_ci
13030d163575Sopenharmony_ci    ret = LOS_ArchCopyToUser(buf, &bufRet, sizeof(struct statfs));
13040d163575Sopenharmony_ci    if (ret != 0) {
13050d163575Sopenharmony_ci        ret = -EFAULT;
13060d163575Sopenharmony_ci    }
13070d163575Sopenharmony_ci
13080d163575Sopenharmony_ciOUT:
13090d163575Sopenharmony_ci    if (pathRet != NULL) {
13100d163575Sopenharmony_ci        (void)LOS_MemFree(OS_SYS_MEM_ADDR, pathRet);
13110d163575Sopenharmony_ci    }
13120d163575Sopenharmony_ci    return ret;
13130d163575Sopenharmony_ci}
13140d163575Sopenharmony_ci
13150d163575Sopenharmony_ciint SysStatfs64(const char *path, size_t sz, struct statfs *buf)
13160d163575Sopenharmony_ci{
13170d163575Sopenharmony_ci    int ret;
13180d163575Sopenharmony_ci    char *pathRet = NULL;
13190d163575Sopenharmony_ci    struct statfs bufRet = {0};
13200d163575Sopenharmony_ci
13210d163575Sopenharmony_ci    if (path != NULL) {
13220d163575Sopenharmony_ci        ret = UserPathCopy(path, &pathRet);
13230d163575Sopenharmony_ci        if (ret != 0) {
13240d163575Sopenharmony_ci            goto OUT;
13250d163575Sopenharmony_ci        }
13260d163575Sopenharmony_ci    }
13270d163575Sopenharmony_ci
13280d163575Sopenharmony_ci    if (sz != sizeof(*buf)) {
13290d163575Sopenharmony_ci        ret = -EINVAL;
13300d163575Sopenharmony_ci        goto OUT;
13310d163575Sopenharmony_ci    }
13320d163575Sopenharmony_ci
13330d163575Sopenharmony_ci    ret = statfs((path ? pathRet : NULL), (buf ? (&bufRet) : NULL));
13340d163575Sopenharmony_ci    if (ret < 0) {
13350d163575Sopenharmony_ci        ret = -get_errno();
13360d163575Sopenharmony_ci        goto OUT;
13370d163575Sopenharmony_ci    }
13380d163575Sopenharmony_ci
13390d163575Sopenharmony_ci    ret = LOS_ArchCopyToUser(buf, &bufRet, sizeof(struct statfs));
13400d163575Sopenharmony_ci    if (ret != 0) {
13410d163575Sopenharmony_ci        ret = -EFAULT;
13420d163575Sopenharmony_ci    }
13430d163575Sopenharmony_ci
13440d163575Sopenharmony_ciOUT:
13450d163575Sopenharmony_ci    if (pathRet != NULL) {
13460d163575Sopenharmony_ci        (void)LOS_MemFree(OS_SYS_MEM_ADDR, pathRet);
13470d163575Sopenharmony_ci    }
13480d163575Sopenharmony_ci    return ret;
13490d163575Sopenharmony_ci}
13500d163575Sopenharmony_ci
13510d163575Sopenharmony_ciint SysStat(const char *path, struct kstat *buf)
13520d163575Sopenharmony_ci{
13530d163575Sopenharmony_ci    int ret;
13540d163575Sopenharmony_ci    char *pathRet = NULL;
13550d163575Sopenharmony_ci    struct stat bufRet = {0};
13560d163575Sopenharmony_ci
13570d163575Sopenharmony_ci    if (path != NULL) {
13580d163575Sopenharmony_ci        ret = UserPathCopy(path, &pathRet);
13590d163575Sopenharmony_ci        if (ret != 0) {
13600d163575Sopenharmony_ci            goto OUT;
13610d163575Sopenharmony_ci        }
13620d163575Sopenharmony_ci    }
13630d163575Sopenharmony_ci
13640d163575Sopenharmony_ci    ret = stat((path ? pathRet : NULL), (buf ? (&bufRet) : NULL));
13650d163575Sopenharmony_ci    if (ret < 0) {
13660d163575Sopenharmony_ci        ret = -get_errno();
13670d163575Sopenharmony_ci        goto OUT;
13680d163575Sopenharmony_ci    }
13690d163575Sopenharmony_ci
13700d163575Sopenharmony_ci    ret = LOS_ArchCopyToUser(buf, &bufRet, sizeof(struct kstat));
13710d163575Sopenharmony_ci    if (ret != 0) {
13720d163575Sopenharmony_ci        ret = -EFAULT;
13730d163575Sopenharmony_ci    }
13740d163575Sopenharmony_ci
13750d163575Sopenharmony_ciOUT:
13760d163575Sopenharmony_ci    if (pathRet != NULL) {
13770d163575Sopenharmony_ci        (void)LOS_MemFree(OS_SYS_MEM_ADDR, pathRet);
13780d163575Sopenharmony_ci    }
13790d163575Sopenharmony_ci    return ret;
13800d163575Sopenharmony_ci}
13810d163575Sopenharmony_ci
13820d163575Sopenharmony_ciint SysLstat(const char *path, struct kstat *buffer)
13830d163575Sopenharmony_ci{
13840d163575Sopenharmony_ci    int ret;
13850d163575Sopenharmony_ci    char *pathRet = NULL;
13860d163575Sopenharmony_ci    struct stat bufRet = {0};
13870d163575Sopenharmony_ci
13880d163575Sopenharmony_ci    if (path != NULL) {
13890d163575Sopenharmony_ci        ret = UserPathCopy(path, &pathRet);
13900d163575Sopenharmony_ci        if (ret != 0) {
13910d163575Sopenharmony_ci            goto OUT;
13920d163575Sopenharmony_ci        }
13930d163575Sopenharmony_ci    }
13940d163575Sopenharmony_ci
13950d163575Sopenharmony_ci    ret = stat((path ? pathRet : NULL), (buffer ? (&bufRet) : NULL));
13960d163575Sopenharmony_ci    if (ret < 0) {
13970d163575Sopenharmony_ci        ret = -get_errno();
13980d163575Sopenharmony_ci        goto OUT;
13990d163575Sopenharmony_ci    }
14000d163575Sopenharmony_ci
14010d163575Sopenharmony_ci    ret = LOS_ArchCopyToUser(buffer, &bufRet, sizeof(struct kstat));
14020d163575Sopenharmony_ci    if (ret != 0) {
14030d163575Sopenharmony_ci        ret = -EFAULT;
14040d163575Sopenharmony_ci    }
14050d163575Sopenharmony_ci
14060d163575Sopenharmony_ciOUT:
14070d163575Sopenharmony_ci    if (pathRet != NULL) {
14080d163575Sopenharmony_ci        (void)LOS_MemFree(OS_SYS_MEM_ADDR, pathRet);
14090d163575Sopenharmony_ci    }
14100d163575Sopenharmony_ci    return ret;
14110d163575Sopenharmony_ci}
14120d163575Sopenharmony_ci
14130d163575Sopenharmony_ciint SysFstat(int fd, struct kstat *buf)
14140d163575Sopenharmony_ci{
14150d163575Sopenharmony_ci    int ret;
14160d163575Sopenharmony_ci    struct stat bufRet = {0};
14170d163575Sopenharmony_ci    struct file *filep = NULL;
14180d163575Sopenharmony_ci
14190d163575Sopenharmony_ci    /* Process fd convert to system global fd */
14200d163575Sopenharmony_ci    fd = GetAssociatedSystemFd(fd);
14210d163575Sopenharmony_ci
14220d163575Sopenharmony_ci    ret = fs_getfilep(fd, &filep);
14230d163575Sopenharmony_ci    if (ret < 0) {
14240d163575Sopenharmony_ci        return -get_errno();
14250d163575Sopenharmony_ci    }
14260d163575Sopenharmony_ci
14270d163575Sopenharmony_ci    if (filep->f_oflags & O_DIRECTORY) {
14280d163575Sopenharmony_ci        return -EBADF;
14290d163575Sopenharmony_ci    }
14300d163575Sopenharmony_ci
14310d163575Sopenharmony_ci    ret = stat(filep->f_path, (buf ? (&bufRet) : NULL));
14320d163575Sopenharmony_ci    if (ret < 0) {
14330d163575Sopenharmony_ci        return -get_errno();
14340d163575Sopenharmony_ci    }
14350d163575Sopenharmony_ci
14360d163575Sopenharmony_ci    ret = LOS_ArchCopyToUser(buf, &bufRet, sizeof(struct kstat));
14370d163575Sopenharmony_ci    if (ret != 0) {
14380d163575Sopenharmony_ci        return -EFAULT;
14390d163575Sopenharmony_ci    }
14400d163575Sopenharmony_ci
14410d163575Sopenharmony_ci    return ret;
14420d163575Sopenharmony_ci}
14430d163575Sopenharmony_ci
14440d163575Sopenharmony_ciint SysStatx(int fd, const char *restrict path, int flag, unsigned mask, struct statx *restrict stx)
14450d163575Sopenharmony_ci{
14460d163575Sopenharmony_ci    return -ENOSYS;
14470d163575Sopenharmony_ci}
14480d163575Sopenharmony_ci
14490d163575Sopenharmony_ciint SysFsync(int fd)
14500d163575Sopenharmony_ci{
14510d163575Sopenharmony_ci    int ret;
14520d163575Sopenharmony_ci    struct file *filep = NULL;
14530d163575Sopenharmony_ci
14540d163575Sopenharmony_ci    /* Process fd convert to system global fd */
14550d163575Sopenharmony_ci    fd = GetAssociatedSystemFd(fd);
14560d163575Sopenharmony_ci
14570d163575Sopenharmony_ci    /* Get the file structure corresponding to the file descriptor. */
14580d163575Sopenharmony_ci    ret = fs_getfilep(fd, &filep);
14590d163575Sopenharmony_ci    if (ret < 0) {
14600d163575Sopenharmony_ci        /* The errno value has already been set */
14610d163575Sopenharmony_ci        return -get_errno();
14620d163575Sopenharmony_ci    }
14630d163575Sopenharmony_ci
14640d163575Sopenharmony_ci    if (filep->f_oflags & O_DIRECTORY) {
14650d163575Sopenharmony_ci        return -EBADF;
14660d163575Sopenharmony_ci    }
14670d163575Sopenharmony_ci
14680d163575Sopenharmony_ci    /* Perform the fsync operation */
14690d163575Sopenharmony_ci    ret = file_fsync(filep);
14700d163575Sopenharmony_ci    if (ret < 0) {
14710d163575Sopenharmony_ci        return -get_errno();
14720d163575Sopenharmony_ci    }
14730d163575Sopenharmony_ci    return ret;
14740d163575Sopenharmony_ci}
14750d163575Sopenharmony_ci
14760d163575Sopenharmony_cissize_t SysReadv(int fd, const struct iovec *iov, int iovcnt)
14770d163575Sopenharmony_ci{
14780d163575Sopenharmony_ci    int ret;
14790d163575Sopenharmony_ci    int valid_iovcnt = -1;
14800d163575Sopenharmony_ci    struct iovec *iovRet = NULL;
14810d163575Sopenharmony_ci
14820d163575Sopenharmony_ci    /* Process fd convert to system global fd */
14830d163575Sopenharmony_ci    fd = GetAssociatedSystemFd(fd);
14840d163575Sopenharmony_ci    if ((iov == NULL) || (iovcnt < 0) || (iovcnt > IOV_MAX)) {
14850d163575Sopenharmony_ci        return -EINVAL;
14860d163575Sopenharmony_ci    }
14870d163575Sopenharmony_ci
14880d163575Sopenharmony_ci    if (iovcnt == 0) {
14890d163575Sopenharmony_ci        return 0;
14900d163575Sopenharmony_ci    }
14910d163575Sopenharmony_ci
14920d163575Sopenharmony_ci    ret = UserIovCopy(&iovRet, iov, iovcnt, &valid_iovcnt);
14930d163575Sopenharmony_ci    if (ret != 0) {
14940d163575Sopenharmony_ci        return ret;
14950d163575Sopenharmony_ci    }
14960d163575Sopenharmony_ci
14970d163575Sopenharmony_ci    if (valid_iovcnt <= 0) {
14980d163575Sopenharmony_ci        ret = -EFAULT;
14990d163575Sopenharmony_ci        goto OUT;
15000d163575Sopenharmony_ci    }
15010d163575Sopenharmony_ci
15020d163575Sopenharmony_ci    ret = vfs_readv(fd, iovRet, valid_iovcnt, NULL);
15030d163575Sopenharmony_ci    if (ret < 0) {
15040d163575Sopenharmony_ci        ret = -get_errno();
15050d163575Sopenharmony_ci    }
15060d163575Sopenharmony_ci
15070d163575Sopenharmony_ciOUT:
15080d163575Sopenharmony_ci    (void)LOS_MemFree(OS_SYS_MEM_ADDR, iovRet);
15090d163575Sopenharmony_ci    return ret;
15100d163575Sopenharmony_ci}
15110d163575Sopenharmony_ci
15120d163575Sopenharmony_cissize_t SysWritev(int fd, const struct iovec *iov, int iovcnt)
15130d163575Sopenharmony_ci{
15140d163575Sopenharmony_ci    int ret;
15150d163575Sopenharmony_ci    int valid_iovcnt = -1;
15160d163575Sopenharmony_ci    struct iovec *iovRet = NULL;
15170d163575Sopenharmony_ci
15180d163575Sopenharmony_ci    /* Process fd convert to system global fd */
15190d163575Sopenharmony_ci    int sysfd = GetAssociatedSystemFd(fd);
15200d163575Sopenharmony_ci    if ((iovcnt < 0) || (iovcnt > IOV_MAX)) {
15210d163575Sopenharmony_ci        return -EINVAL;
15220d163575Sopenharmony_ci    }
15230d163575Sopenharmony_ci
15240d163575Sopenharmony_ci    if (iovcnt == 0) {
15250d163575Sopenharmony_ci        return 0;
15260d163575Sopenharmony_ci    }
15270d163575Sopenharmony_ci
15280d163575Sopenharmony_ci    if (iov == NULL) {
15290d163575Sopenharmony_ci        return -EFAULT;
15300d163575Sopenharmony_ci    }
15310d163575Sopenharmony_ci
15320d163575Sopenharmony_ci    ret = UserIovCopy(&iovRet, iov, iovcnt, &valid_iovcnt);
15330d163575Sopenharmony_ci    if (ret != 0) {
15340d163575Sopenharmony_ci        return ret;
15350d163575Sopenharmony_ci    }
15360d163575Sopenharmony_ci
15370d163575Sopenharmony_ci    if (valid_iovcnt != iovcnt) {
15380d163575Sopenharmony_ci        ret = -EFAULT;
15390d163575Sopenharmony_ci        goto OUT_FREE;
15400d163575Sopenharmony_ci    }
15410d163575Sopenharmony_ci
15420d163575Sopenharmony_ci    ret = writev(sysfd, iovRet, valid_iovcnt);
15430d163575Sopenharmony_ci    if (ret < 0) {
15440d163575Sopenharmony_ci        ret = -get_errno();
15450d163575Sopenharmony_ci    }
15460d163575Sopenharmony_ci
15470d163575Sopenharmony_ciOUT_FREE:
15480d163575Sopenharmony_ci    (void)LOS_MemFree(OS_SYS_MEM_ADDR, iovRet);
15490d163575Sopenharmony_ci    return ret;
15500d163575Sopenharmony_ci}
15510d163575Sopenharmony_ci
15520d163575Sopenharmony_ciint SysPoll(struct pollfd *fds, nfds_t nfds, int timeout)
15530d163575Sopenharmony_ci{
15540d163575Sopenharmony_ci    int ret;
15550d163575Sopenharmony_ci    struct pollfd *kfds = NULL;
15560d163575Sopenharmony_ci
15570d163575Sopenharmony_ci    if ((nfds >= MAX_POLL_NFDS) || (nfds == 0) || (fds == NULL)) {
15580d163575Sopenharmony_ci        return -EINVAL;
15590d163575Sopenharmony_ci    }
15600d163575Sopenharmony_ci
15610d163575Sopenharmony_ci    kfds = (struct pollfd *)malloc(sizeof(struct pollfd) * nfds);
15620d163575Sopenharmony_ci    if (kfds != NULL) {
15630d163575Sopenharmony_ci        if (LOS_ArchCopyFromUser(kfds, fds, sizeof(struct pollfd) * nfds) != 0) {
15640d163575Sopenharmony_ci            ret = -EFAULT;
15650d163575Sopenharmony_ci            goto OUT_KFD;
15660d163575Sopenharmony_ci        }
15670d163575Sopenharmony_ci    }
15680d163575Sopenharmony_ci
15690d163575Sopenharmony_ci    int *pollFds = NULL;
15700d163575Sopenharmony_ci    ret = PollfdToSystem(kfds, nfds, &pollFds);
15710d163575Sopenharmony_ci    if (ret < 0) {
15720d163575Sopenharmony_ci        ret = -get_errno();
15730d163575Sopenharmony_ci        goto OUT_KFD;
15740d163575Sopenharmony_ci    }
15750d163575Sopenharmony_ci
15760d163575Sopenharmony_ci    ret = poll(kfds, nfds, timeout);
15770d163575Sopenharmony_ci    if (ret < 0) {
15780d163575Sopenharmony_ci        ret = -get_errno();
15790d163575Sopenharmony_ci        goto OUT;
15800d163575Sopenharmony_ci    }
15810d163575Sopenharmony_ci
15820d163575Sopenharmony_ci    if (kfds != NULL) {
15830d163575Sopenharmony_ci        RestorePollfd(kfds, nfds, pollFds);
15840d163575Sopenharmony_ci        if (LOS_ArchCopyToUser(fds, kfds, sizeof(struct pollfd) * nfds) != 0) {
15850d163575Sopenharmony_ci            ret = -EFAULT;
15860d163575Sopenharmony_ci            goto OUT;
15870d163575Sopenharmony_ci        }
15880d163575Sopenharmony_ci    }
15890d163575Sopenharmony_ci
15900d163575Sopenharmony_ciOUT:
15910d163575Sopenharmony_ci    free(pollFds);
15920d163575Sopenharmony_ciOUT_KFD:
15930d163575Sopenharmony_ci    free(kfds);
15940d163575Sopenharmony_ci    return ret;
15950d163575Sopenharmony_ci}
15960d163575Sopenharmony_ci
15970d163575Sopenharmony_ciint SysPrctl(int option, ...)
15980d163575Sopenharmony_ci{
15990d163575Sopenharmony_ci    unsigned long name;
16000d163575Sopenharmony_ci    va_list ap;
16010d163575Sopenharmony_ci    errno_t err;
16020d163575Sopenharmony_ci
16030d163575Sopenharmony_ci    va_start(ap, option);
16040d163575Sopenharmony_ci    if (option != PR_SET_NAME) {
16050d163575Sopenharmony_ci        PRINT_ERR("%s: %d, no support option : 0x%x\n", __FUNCTION__, __LINE__, option);
16060d163575Sopenharmony_ci        err = EOPNOTSUPP;
16070d163575Sopenharmony_ci        goto ERROR;
16080d163575Sopenharmony_ci    }
16090d163575Sopenharmony_ci
16100d163575Sopenharmony_ci    name = va_arg(ap, unsigned long);
16110d163575Sopenharmony_ci    if (!LOS_IsUserAddress(name)) {
16120d163575Sopenharmony_ci        err = EFAULT;
16130d163575Sopenharmony_ci        goto ERROR;
16140d163575Sopenharmony_ci    }
16150d163575Sopenharmony_ci
16160d163575Sopenharmony_ci    err = OsSetTaskName(OsCurrTaskGet(), (const char *)(uintptr_t)name, TRUE);
16170d163575Sopenharmony_ci    if (err != LOS_OK) {
16180d163575Sopenharmony_ci        goto ERROR;
16190d163575Sopenharmony_ci    }
16200d163575Sopenharmony_ci
16210d163575Sopenharmony_ci    va_end(ap);
16220d163575Sopenharmony_ci    return ENOERR;
16230d163575Sopenharmony_ci
16240d163575Sopenharmony_ciERROR:
16250d163575Sopenharmony_ci    va_end(ap);
16260d163575Sopenharmony_ci    return -err;
16270d163575Sopenharmony_ci}
16280d163575Sopenharmony_ci
16290d163575Sopenharmony_cissize_t SysPread64(int fd, void *buf, size_t nbytes, off64_t offset)
16300d163575Sopenharmony_ci{
16310d163575Sopenharmony_ci    int ret, retVal;
16320d163575Sopenharmony_ci    char *bufRet = NULL;
16330d163575Sopenharmony_ci
16340d163575Sopenharmony_ci    /* Process fd convert to system global fd */
16350d163575Sopenharmony_ci    fd = GetAssociatedSystemFd(fd);
16360d163575Sopenharmony_ci
16370d163575Sopenharmony_ci    if (nbytes == 0) {
16380d163575Sopenharmony_ci        ret = pread64(fd, buf, nbytes, offset);
16390d163575Sopenharmony_ci        if (ret < 0) {
16400d163575Sopenharmony_ci            return -get_errno();
16410d163575Sopenharmony_ci        } else {
16420d163575Sopenharmony_ci            return ret;
16430d163575Sopenharmony_ci        }
16440d163575Sopenharmony_ci    }
16450d163575Sopenharmony_ci
16460d163575Sopenharmony_ci    bufRet = (char *)LOS_MemAlloc(OS_SYS_MEM_ADDR, nbytes);
16470d163575Sopenharmony_ci    if (bufRet == NULL) {
16480d163575Sopenharmony_ci        return -ENOMEM;
16490d163575Sopenharmony_ci    }
16500d163575Sopenharmony_ci    (void)memset_s(bufRet, nbytes, 0, nbytes);
16510d163575Sopenharmony_ci    ret = pread64(fd, (buf ? bufRet : NULL), nbytes, offset);
16520d163575Sopenharmony_ci    if (ret < 0) {
16530d163575Sopenharmony_ci        (void)LOS_MemFree(OS_SYS_MEM_ADDR, bufRet);
16540d163575Sopenharmony_ci        return -get_errno();
16550d163575Sopenharmony_ci    }
16560d163575Sopenharmony_ci
16570d163575Sopenharmony_ci    retVal = LOS_ArchCopyToUser(buf, bufRet, ret);
16580d163575Sopenharmony_ci    if (retVal != 0) {
16590d163575Sopenharmony_ci        (void)LOS_MemFree(OS_SYS_MEM_ADDR, bufRet);
16600d163575Sopenharmony_ci        return -EFAULT;
16610d163575Sopenharmony_ci    }
16620d163575Sopenharmony_ci
16630d163575Sopenharmony_ci    (void)LOS_MemFree(OS_SYS_MEM_ADDR, bufRet);
16640d163575Sopenharmony_ci    return ret;
16650d163575Sopenharmony_ci}
16660d163575Sopenharmony_ci
16670d163575Sopenharmony_cissize_t SysPwrite64(int fd, const void *buf, size_t nbytes, off64_t offset)
16680d163575Sopenharmony_ci{
16690d163575Sopenharmony_ci    int ret;
16700d163575Sopenharmony_ci    char *bufRet = NULL;
16710d163575Sopenharmony_ci
16720d163575Sopenharmony_ci    /* Process fd convert to system global fd */
16730d163575Sopenharmony_ci    fd = GetAssociatedSystemFd(fd);
16740d163575Sopenharmony_ci
16750d163575Sopenharmony_ci    if (nbytes == 0) {
16760d163575Sopenharmony_ci        ret = pwrite64(fd, buf, nbytes, offset);
16770d163575Sopenharmony_ci        if (ret < 0) {
16780d163575Sopenharmony_ci            return -get_errno();
16790d163575Sopenharmony_ci        }
16800d163575Sopenharmony_ci        return ret;
16810d163575Sopenharmony_ci    }
16820d163575Sopenharmony_ci
16830d163575Sopenharmony_ci    bufRet = (char *)LOS_MemAlloc(OS_SYS_MEM_ADDR, nbytes);
16840d163575Sopenharmony_ci    if (bufRet == NULL) {
16850d163575Sopenharmony_ci        return -ENOMEM;
16860d163575Sopenharmony_ci    }
16870d163575Sopenharmony_ci
16880d163575Sopenharmony_ci    if (buf != NULL) {
16890d163575Sopenharmony_ci        ret = LOS_ArchCopyFromUser(bufRet, buf, nbytes);
16900d163575Sopenharmony_ci        if (ret != 0) {
16910d163575Sopenharmony_ci            (void)LOS_MemFree(OS_SYS_MEM_ADDR, bufRet);
16920d163575Sopenharmony_ci            return -EFAULT;
16930d163575Sopenharmony_ci        }
16940d163575Sopenharmony_ci    }
16950d163575Sopenharmony_ci
16960d163575Sopenharmony_ci    ret = pwrite64(fd, (buf ? bufRet : NULL), nbytes, offset);
16970d163575Sopenharmony_ci    if (ret < 0) {
16980d163575Sopenharmony_ci        (void)LOS_MemFree(OS_SYS_MEM_ADDR, bufRet);
16990d163575Sopenharmony_ci        return -get_errno();
17000d163575Sopenharmony_ci    }
17010d163575Sopenharmony_ci
17020d163575Sopenharmony_ci    (void)LOS_MemFree(OS_SYS_MEM_ADDR, bufRet);
17030d163575Sopenharmony_ci    return ret;
17040d163575Sopenharmony_ci}
17050d163575Sopenharmony_ci
17060d163575Sopenharmony_cichar *SysGetcwd(char *buf, size_t n)
17070d163575Sopenharmony_ci{
17080d163575Sopenharmony_ci    char *ret = NULL;
17090d163575Sopenharmony_ci    char *bufRet = NULL;
17100d163575Sopenharmony_ci    size_t bufLen = n;
17110d163575Sopenharmony_ci    int retVal;
17120d163575Sopenharmony_ci
17130d163575Sopenharmony_ci    if (bufLen > PATH_MAX) {
17140d163575Sopenharmony_ci        bufLen = PATH_MAX;
17150d163575Sopenharmony_ci    }
17160d163575Sopenharmony_ci
17170d163575Sopenharmony_ci    bufRet = (char *)LOS_MemAlloc(OS_SYS_MEM_ADDR, bufLen);
17180d163575Sopenharmony_ci    if (bufRet == NULL) {
17190d163575Sopenharmony_ci        return (char *)(intptr_t)-ENOMEM;
17200d163575Sopenharmony_ci    }
17210d163575Sopenharmony_ci    (void)memset_s(bufRet, bufLen, 0, bufLen);
17220d163575Sopenharmony_ci
17230d163575Sopenharmony_ci    ret = getcwd((buf ? bufRet : NULL), bufLen);
17240d163575Sopenharmony_ci    if (ret == NULL) {
17250d163575Sopenharmony_ci        (void)LOS_MemFree(OS_SYS_MEM_ADDR, bufRet);
17260d163575Sopenharmony_ci        return (char *)(intptr_t)-get_errno();
17270d163575Sopenharmony_ci    }
17280d163575Sopenharmony_ci
17290d163575Sopenharmony_ci    retVal = LOS_ArchCopyToUser(buf, bufRet, bufLen);
17300d163575Sopenharmony_ci    if (retVal != 0) {
17310d163575Sopenharmony_ci        (void)LOS_MemFree(OS_SYS_MEM_ADDR, bufRet);
17320d163575Sopenharmony_ci        return (char *)(intptr_t)-EFAULT;
17330d163575Sopenharmony_ci    }
17340d163575Sopenharmony_ci    ret = buf;
17350d163575Sopenharmony_ci
17360d163575Sopenharmony_ci    (void)LOS_MemFree(OS_SYS_MEM_ADDR, bufRet);
17370d163575Sopenharmony_ci    return ret;
17380d163575Sopenharmony_ci}
17390d163575Sopenharmony_ci
17400d163575Sopenharmony_cissize_t SysSendFile(int outfd, int infd, off_t *offset, size_t count)
17410d163575Sopenharmony_ci{
17420d163575Sopenharmony_ci    int ret, retVal;
17430d163575Sopenharmony_ci    off_t offsetRet;
17440d163575Sopenharmony_ci
17450d163575Sopenharmony_ci    retVal = LOS_ArchCopyFromUser(&offsetRet, offset, sizeof(off_t));
17460d163575Sopenharmony_ci    if (retVal != 0) {
17470d163575Sopenharmony_ci        return -EFAULT;
17480d163575Sopenharmony_ci    }
17490d163575Sopenharmony_ci
17500d163575Sopenharmony_ci    /* Process fd convert to system global fd */
17510d163575Sopenharmony_ci    outfd = GetAssociatedSystemFd(outfd);
17520d163575Sopenharmony_ci    infd = GetAssociatedSystemFd(infd);
17530d163575Sopenharmony_ci
17540d163575Sopenharmony_ci    ret = sendfile(outfd, infd, (offset ? (&offsetRet) : NULL), count);
17550d163575Sopenharmony_ci    if (ret < 0) {
17560d163575Sopenharmony_ci        return -get_errno();
17570d163575Sopenharmony_ci    }
17580d163575Sopenharmony_ci
17590d163575Sopenharmony_ci    retVal = LOS_ArchCopyToUser(offset, &offsetRet, sizeof(off_t));
17600d163575Sopenharmony_ci    if (retVal != 0) {
17610d163575Sopenharmony_ci        return -EFAULT;
17620d163575Sopenharmony_ci    }
17630d163575Sopenharmony_ci
17640d163575Sopenharmony_ci    return ret;
17650d163575Sopenharmony_ci}
17660d163575Sopenharmony_ci
17670d163575Sopenharmony_ciint SysFtruncate64(int fd, off64_t length)
17680d163575Sopenharmony_ci{
17690d163575Sopenharmony_ci    int ret;
17700d163575Sopenharmony_ci
17710d163575Sopenharmony_ci    /* Process fd convert to system global fd */
17720d163575Sopenharmony_ci    fd = GetAssociatedSystemFd(fd);
17730d163575Sopenharmony_ci
17740d163575Sopenharmony_ci    ret = ftruncate64(fd, length);
17750d163575Sopenharmony_ci    if (ret < 0) {
17760d163575Sopenharmony_ci        return -get_errno();
17770d163575Sopenharmony_ci    }
17780d163575Sopenharmony_ci    return ret;
17790d163575Sopenharmony_ci}
17800d163575Sopenharmony_ci
17810d163575Sopenharmony_ciint SysOpenat(int dirfd, const char *path, int oflags, ...)
17820d163575Sopenharmony_ci{
17830d163575Sopenharmony_ci    int ret;
17840d163575Sopenharmony_ci    int procFd;
17850d163575Sopenharmony_ci    char *pathRet = NULL;
17860d163575Sopenharmony_ci    mode_t mode;
17870d163575Sopenharmony_ci#ifdef LOSCFG_FILE_MODE
17880d163575Sopenharmony_ci    va_list ap;
17890d163575Sopenharmony_ci
17900d163575Sopenharmony_ci    va_start(ap, oflags);
17910d163575Sopenharmony_ci    mode = va_arg(ap, int);
17920d163575Sopenharmony_ci    va_end(ap);
17930d163575Sopenharmony_ci#else
17940d163575Sopenharmony_ci    mode = 0666; /* 0666: File read-write properties. */
17950d163575Sopenharmony_ci#endif
17960d163575Sopenharmony_ci
17970d163575Sopenharmony_ci    if (path != NULL) {
17980d163575Sopenharmony_ci        ret = UserPathCopy(path, &pathRet);
17990d163575Sopenharmony_ci        if (ret != 0) {
18000d163575Sopenharmony_ci            return ret;
18010d163575Sopenharmony_ci        }
18020d163575Sopenharmony_ci    }
18030d163575Sopenharmony_ci
18040d163575Sopenharmony_ci    procFd = AllocProcessFd();
18050d163575Sopenharmony_ci    if (procFd < 0) {
18060d163575Sopenharmony_ci        ret = -EMFILE;
18070d163575Sopenharmony_ci        goto ERROUT;
18080d163575Sopenharmony_ci    }
18090d163575Sopenharmony_ci
18100d163575Sopenharmony_ci    if (oflags & O_CLOEXEC) {
18110d163575Sopenharmony_ci        SetCloexecFlag(procFd);
18120d163575Sopenharmony_ci    }
18130d163575Sopenharmony_ci
18140d163575Sopenharmony_ci    if (dirfd != AT_FDCWD) {
18150d163575Sopenharmony_ci        /* Process fd convert to system global fd */
18160d163575Sopenharmony_ci        dirfd = GetAssociatedSystemFd(dirfd);
18170d163575Sopenharmony_ci    }
18180d163575Sopenharmony_ci
18190d163575Sopenharmony_ci    ret = do_open(dirfd, (path ? pathRet : NULL), oflags, mode);
18200d163575Sopenharmony_ci    if (ret < 0) {
18210d163575Sopenharmony_ci        ret = -get_errno();
18220d163575Sopenharmony_ci        goto ERROUT;
18230d163575Sopenharmony_ci    }
18240d163575Sopenharmony_ci
18250d163575Sopenharmony_ci    AssociateSystemFd(procFd, ret);
18260d163575Sopenharmony_ci    if (pathRet != NULL) {
18270d163575Sopenharmony_ci        (void)LOS_MemFree(OS_SYS_MEM_ADDR, pathRet);
18280d163575Sopenharmony_ci    }
18290d163575Sopenharmony_ci    return procFd;
18300d163575Sopenharmony_ci
18310d163575Sopenharmony_ciERROUT:
18320d163575Sopenharmony_ci    if (pathRet != NULL) {
18330d163575Sopenharmony_ci        (void)LOS_MemFree(OS_SYS_MEM_ADDR, pathRet);
18340d163575Sopenharmony_ci    }
18350d163575Sopenharmony_ci    if (procFd >= 0) {
18360d163575Sopenharmony_ci        FreeProcessFd(procFd);
18370d163575Sopenharmony_ci    }
18380d163575Sopenharmony_ci    return ret;
18390d163575Sopenharmony_ci}
18400d163575Sopenharmony_ci
18410d163575Sopenharmony_ciint SysMkdirat(int dirfd, const char *pathname, mode_t mode)
18420d163575Sopenharmony_ci{
18430d163575Sopenharmony_ci    int ret;
18440d163575Sopenharmony_ci    char *pathRet = NULL;
18450d163575Sopenharmony_ci
18460d163575Sopenharmony_ci    if (pathname != NULL) {
18470d163575Sopenharmony_ci        ret = UserPathCopy(pathname, &pathRet);
18480d163575Sopenharmony_ci        if (ret != 0) {
18490d163575Sopenharmony_ci            goto OUT;
18500d163575Sopenharmony_ci        }
18510d163575Sopenharmony_ci    }
18520d163575Sopenharmony_ci
18530d163575Sopenharmony_ci    if (dirfd != AT_FDCWD) {
18540d163575Sopenharmony_ci        /* Process fd convert to system global fd */
18550d163575Sopenharmony_ci        dirfd = GetAssociatedSystemFd(dirfd);
18560d163575Sopenharmony_ci    }
18570d163575Sopenharmony_ci
18580d163575Sopenharmony_ci    ret = do_mkdir(dirfd, (pathname ? pathRet : NULL), mode);
18590d163575Sopenharmony_ci    if (ret < 0) {
18600d163575Sopenharmony_ci        ret = -get_errno();
18610d163575Sopenharmony_ci    }
18620d163575Sopenharmony_ci
18630d163575Sopenharmony_ciOUT:
18640d163575Sopenharmony_ci    if (pathRet != NULL) {
18650d163575Sopenharmony_ci        (void)LOS_MemFree(OS_SYS_MEM_ADDR, pathRet);
18660d163575Sopenharmony_ci    }
18670d163575Sopenharmony_ci    return ret;
18680d163575Sopenharmony_ci}
18690d163575Sopenharmony_ci
18700d163575Sopenharmony_ciint SysLinkat(int olddirfd, const char *oldpath, int newdirfd, const char *newpath, int flags)
18710d163575Sopenharmony_ci{
18720d163575Sopenharmony_ci    int ret;
18730d163575Sopenharmony_ci    char *oldpathRet = NULL;
18740d163575Sopenharmony_ci    char *newpathRet = NULL;
18750d163575Sopenharmony_ci
18760d163575Sopenharmony_ci    if (oldpath != NULL) {
18770d163575Sopenharmony_ci        ret = UserPathCopy(oldpath, &oldpathRet);
18780d163575Sopenharmony_ci        if (ret != 0) {
18790d163575Sopenharmony_ci            goto OUT;
18800d163575Sopenharmony_ci        }
18810d163575Sopenharmony_ci    }
18820d163575Sopenharmony_ci
18830d163575Sopenharmony_ci    if (newpath != NULL) {
18840d163575Sopenharmony_ci        ret = UserPathCopy(newpath, &newpathRet);
18850d163575Sopenharmony_ci        if (ret != 0) {
18860d163575Sopenharmony_ci            goto OUT;
18870d163575Sopenharmony_ci        }
18880d163575Sopenharmony_ci    }
18890d163575Sopenharmony_ci
18900d163575Sopenharmony_ci    if (olddirfd != AT_FDCWD) {
18910d163575Sopenharmony_ci        /* Process fd convert to system global fd */
18920d163575Sopenharmony_ci        olddirfd = GetAssociatedSystemFd(olddirfd);
18930d163575Sopenharmony_ci    }
18940d163575Sopenharmony_ci
18950d163575Sopenharmony_ci    if (newdirfd != AT_FDCWD) {
18960d163575Sopenharmony_ci        /* Process fd convert to system global fd */
18970d163575Sopenharmony_ci        newdirfd = GetAssociatedSystemFd(newdirfd);
18980d163575Sopenharmony_ci    }
18990d163575Sopenharmony_ci
19000d163575Sopenharmony_ci    ret = linkat(olddirfd, oldpathRet, newdirfd, newpathRet, flags);
19010d163575Sopenharmony_ci    if (ret < 0) {
19020d163575Sopenharmony_ci        ret = -get_errno();
19030d163575Sopenharmony_ci    }
19040d163575Sopenharmony_ci
19050d163575Sopenharmony_ciOUT:
19060d163575Sopenharmony_ci    if (oldpathRet != NULL) {
19070d163575Sopenharmony_ci        (void)LOS_MemFree(OS_SYS_MEM_ADDR, oldpathRet);
19080d163575Sopenharmony_ci    }
19090d163575Sopenharmony_ci    if (newpathRet != NULL) {
19100d163575Sopenharmony_ci        (void)LOS_MemFree(OS_SYS_MEM_ADDR, newpathRet);
19110d163575Sopenharmony_ci    }
19120d163575Sopenharmony_ci    return ret;
19130d163575Sopenharmony_ci}
19140d163575Sopenharmony_ci
19150d163575Sopenharmony_ciint SysSymlinkat(const char *target, int dirfd, const char *linkpath)
19160d163575Sopenharmony_ci{
19170d163575Sopenharmony_ci    int ret;
19180d163575Sopenharmony_ci    char *pathRet = NULL;
19190d163575Sopenharmony_ci    char *targetRet = NULL;
19200d163575Sopenharmony_ci
19210d163575Sopenharmony_ci    if (target != NULL) {
19220d163575Sopenharmony_ci        ret = UserPathCopy(target, &targetRet);
19230d163575Sopenharmony_ci        if (ret != 0) {
19240d163575Sopenharmony_ci            goto OUT;
19250d163575Sopenharmony_ci        }
19260d163575Sopenharmony_ci    }
19270d163575Sopenharmony_ci
19280d163575Sopenharmony_ci    if (linkpath != NULL) {
19290d163575Sopenharmony_ci        ret = UserPathCopy(linkpath, &pathRet);
19300d163575Sopenharmony_ci        if (ret != 0) {
19310d163575Sopenharmony_ci            goto OUT;
19320d163575Sopenharmony_ci        }
19330d163575Sopenharmony_ci    }
19340d163575Sopenharmony_ci
19350d163575Sopenharmony_ci    if (dirfd != AT_FDCWD) {
19360d163575Sopenharmony_ci        /* Process fd convert to system global fd */
19370d163575Sopenharmony_ci        dirfd = GetAssociatedSystemFd(dirfd);
19380d163575Sopenharmony_ci    }
19390d163575Sopenharmony_ci
19400d163575Sopenharmony_ci    ret = symlinkat(targetRet, dirfd, pathRet);
19410d163575Sopenharmony_ci    if (ret < 0) {
19420d163575Sopenharmony_ci        ret = -get_errno();
19430d163575Sopenharmony_ci    }
19440d163575Sopenharmony_ci
19450d163575Sopenharmony_ciOUT:
19460d163575Sopenharmony_ci    if (pathRet != NULL) {
19470d163575Sopenharmony_ci        (void)LOS_MemFree(OS_SYS_MEM_ADDR, pathRet);
19480d163575Sopenharmony_ci    }
19490d163575Sopenharmony_ci
19500d163575Sopenharmony_ci    if (targetRet != NULL) {
19510d163575Sopenharmony_ci        (void)LOS_MemFree(OS_SYS_MEM_ADDR, targetRet);
19520d163575Sopenharmony_ci    }
19530d163575Sopenharmony_ci    return ret;
19540d163575Sopenharmony_ci}
19550d163575Sopenharmony_ci
19560d163575Sopenharmony_cissize_t SysReadlinkat(int dirfd, const char *pathname, char *buf, size_t bufsize)
19570d163575Sopenharmony_ci{
19580d163575Sopenharmony_ci    ssize_t ret;
19590d163575Sopenharmony_ci    char *pathRet = NULL;
19600d163575Sopenharmony_ci
19610d163575Sopenharmony_ci    if (bufsize == 0) {
19620d163575Sopenharmony_ci        return -EINVAL;
19630d163575Sopenharmony_ci    }
19640d163575Sopenharmony_ci
19650d163575Sopenharmony_ci    if (pathname != NULL) {
19660d163575Sopenharmony_ci        ret = UserPathCopy(pathname, &pathRet);
19670d163575Sopenharmony_ci        if (ret != 0) {
19680d163575Sopenharmony_ci            goto OUT;
19690d163575Sopenharmony_ci        }
19700d163575Sopenharmony_ci
19710d163575Sopenharmony_ci#ifdef LOSCFG_PID_CONTAINER
19720d163575Sopenharmony_ci#ifdef LOSCFG_PROC_PROCESS_DIR
19730d163575Sopenharmony_ci        ret = ProcRealProcessDirGet(pathRet);
19740d163575Sopenharmony_ci        if (ret != 0) {
19750d163575Sopenharmony_ci            goto OUT;
19760d163575Sopenharmony_ci        }
19770d163575Sopenharmony_ci#endif
19780d163575Sopenharmony_ci#endif
19790d163575Sopenharmony_ci    }
19800d163575Sopenharmony_ci
19810d163575Sopenharmony_ci    if (dirfd != AT_FDCWD) {
19820d163575Sopenharmony_ci        /* Process fd convert to system global fd */
19830d163575Sopenharmony_ci        dirfd = GetAssociatedSystemFd(dirfd);
19840d163575Sopenharmony_ci    }
19850d163575Sopenharmony_ci
19860d163575Sopenharmony_ci    if (!LOS_IsUserAddressRange((vaddr_t)(UINTPTR)buf, bufsize)) {
19870d163575Sopenharmony_ci        ret = -EFAULT;
19880d163575Sopenharmony_ci        goto OUT;
19890d163575Sopenharmony_ci    }
19900d163575Sopenharmony_ci
19910d163575Sopenharmony_ci    ret = readlinkat(dirfd, pathRet, buf, bufsize);
19920d163575Sopenharmony_ci    if (ret < 0) {
19930d163575Sopenharmony_ci        ret = -get_errno();
19940d163575Sopenharmony_ci    }
19950d163575Sopenharmony_ci
19960d163575Sopenharmony_ciOUT:
19970d163575Sopenharmony_ci    if (pathRet != NULL) {
19980d163575Sopenharmony_ci        (void)LOS_MemFree(OS_SYS_MEM_ADDR, pathRet);
19990d163575Sopenharmony_ci    }
20000d163575Sopenharmony_ci    return ret;
20010d163575Sopenharmony_ci}
20020d163575Sopenharmony_ci
20030d163575Sopenharmony_ciint SysUnlinkat(int dirfd, const char *pathname, int flag)
20040d163575Sopenharmony_ci{
20050d163575Sopenharmony_ci    int ret;
20060d163575Sopenharmony_ci    char *pathRet = NULL;
20070d163575Sopenharmony_ci
20080d163575Sopenharmony_ci    if (pathname != NULL) {
20090d163575Sopenharmony_ci        ret = UserPathCopy(pathname, &pathRet);
20100d163575Sopenharmony_ci        if (ret != 0) {
20110d163575Sopenharmony_ci            goto OUT;
20120d163575Sopenharmony_ci        }
20130d163575Sopenharmony_ci    }
20140d163575Sopenharmony_ci
20150d163575Sopenharmony_ci    if (dirfd != AT_FDCWD) {
20160d163575Sopenharmony_ci        /* Process fd convert to system global fd */
20170d163575Sopenharmony_ci        dirfd = GetAssociatedSystemFd(dirfd);
20180d163575Sopenharmony_ci    }
20190d163575Sopenharmony_ci
20200d163575Sopenharmony_ci    ret = unlinkat(dirfd, (pathname ? pathRet : NULL), flag);
20210d163575Sopenharmony_ci    if (ret < 0) {
20220d163575Sopenharmony_ci        ret = -get_errno();
20230d163575Sopenharmony_ci    }
20240d163575Sopenharmony_ci
20250d163575Sopenharmony_ciOUT:
20260d163575Sopenharmony_ci    if (pathRet != NULL) {
20270d163575Sopenharmony_ci        (void)LOS_MemFree(OS_SYS_MEM_ADDR, pathRet);
20280d163575Sopenharmony_ci    }
20290d163575Sopenharmony_ci    return ret;
20300d163575Sopenharmony_ci}
20310d163575Sopenharmony_ci
20320d163575Sopenharmony_ciint SysRenameat(int oldfd, const char *oldpath, int newdfd, const char *newpath)
20330d163575Sopenharmony_ci{
20340d163575Sopenharmony_ci    int ret;
20350d163575Sopenharmony_ci    char *pathOldRet = NULL;
20360d163575Sopenharmony_ci    char *pathNewRet = NULL;
20370d163575Sopenharmony_ci
20380d163575Sopenharmony_ci    if (oldpath != NULL) {
20390d163575Sopenharmony_ci        ret = UserPathCopy(oldpath, &pathOldRet);
20400d163575Sopenharmony_ci        if (ret != 0) {
20410d163575Sopenharmony_ci            goto OUT;
20420d163575Sopenharmony_ci        }
20430d163575Sopenharmony_ci    }
20440d163575Sopenharmony_ci
20450d163575Sopenharmony_ci    if (newpath != NULL) {
20460d163575Sopenharmony_ci        ret = UserPathCopy(newpath, &pathNewRet);
20470d163575Sopenharmony_ci        if (ret != 0) {
20480d163575Sopenharmony_ci            goto OUT;
20490d163575Sopenharmony_ci        }
20500d163575Sopenharmony_ci    }
20510d163575Sopenharmony_ci
20520d163575Sopenharmony_ci    if (oldfd != AT_FDCWD) {
20530d163575Sopenharmony_ci        /* Process fd convert to system global fd */
20540d163575Sopenharmony_ci        oldfd = GetAssociatedSystemFd(oldfd);
20550d163575Sopenharmony_ci    }
20560d163575Sopenharmony_ci    if (newdfd != AT_FDCWD) {
20570d163575Sopenharmony_ci        /* Process fd convert to system global fd */
20580d163575Sopenharmony_ci        newdfd = GetAssociatedSystemFd(newdfd);
20590d163575Sopenharmony_ci    }
20600d163575Sopenharmony_ci
20610d163575Sopenharmony_ci    ret = do_rename(oldfd, (oldpath ? pathOldRet : NULL), newdfd, (newpath ? pathNewRet : NULL));
20620d163575Sopenharmony_ci    if (ret < 0) {
20630d163575Sopenharmony_ci        ret = -get_errno();
20640d163575Sopenharmony_ci    }
20650d163575Sopenharmony_ci
20660d163575Sopenharmony_ciOUT:
20670d163575Sopenharmony_ci    if (pathOldRet != NULL) {
20680d163575Sopenharmony_ci        (void)LOS_MemFree(OS_SYS_MEM_ADDR, pathOldRet);
20690d163575Sopenharmony_ci    }
20700d163575Sopenharmony_ci    if (pathNewRet != NULL) {
20710d163575Sopenharmony_ci        (void)LOS_MemFree(OS_SYS_MEM_ADDR, pathNewRet);
20720d163575Sopenharmony_ci    }
20730d163575Sopenharmony_ci    return ret;
20740d163575Sopenharmony_ci}
20750d163575Sopenharmony_ci
20760d163575Sopenharmony_ciint SysFallocate(int fd, int mode, off_t offset, off_t len)
20770d163575Sopenharmony_ci{
20780d163575Sopenharmony_ci    int ret;
20790d163575Sopenharmony_ci
20800d163575Sopenharmony_ci    /* Process fd convert to system global fd */
20810d163575Sopenharmony_ci    fd = GetAssociatedSystemFd(fd);
20820d163575Sopenharmony_ci
20830d163575Sopenharmony_ci    ret = fallocate(fd, mode, offset, len);
20840d163575Sopenharmony_ci    if (ret < 0) {
20850d163575Sopenharmony_ci        return -get_errno();
20860d163575Sopenharmony_ci    }
20870d163575Sopenharmony_ci    return ret;
20880d163575Sopenharmony_ci}
20890d163575Sopenharmony_ci
20900d163575Sopenharmony_ciint SysFallocate64(int fd, int mode, off64_t offset, off64_t len)
20910d163575Sopenharmony_ci{
20920d163575Sopenharmony_ci    int ret;
20930d163575Sopenharmony_ci
20940d163575Sopenharmony_ci    /* Process fd convert to system global fd */
20950d163575Sopenharmony_ci    fd = GetAssociatedSystemFd(fd);
20960d163575Sopenharmony_ci
20970d163575Sopenharmony_ci    ret = fallocate64(fd, mode, offset, len);
20980d163575Sopenharmony_ci    if (ret < 0) {
20990d163575Sopenharmony_ci        return -get_errno();
21000d163575Sopenharmony_ci    }
21010d163575Sopenharmony_ci    return ret;
21020d163575Sopenharmony_ci}
21030d163575Sopenharmony_ci
21040d163575Sopenharmony_cissize_t SysPreadv(int fd, const struct iovec *iov, int iovcnt, long loffset, long hoffset)
21050d163575Sopenharmony_ci{
21060d163575Sopenharmony_ci    off_t offsetflag;
21070d163575Sopenharmony_ci    offsetflag = (off_t)((unsigned long long)loffset | (((unsigned long long)hoffset) << HIGH_SHIFT_BIT));
21080d163575Sopenharmony_ci
21090d163575Sopenharmony_ci    int ret;
21100d163575Sopenharmony_ci    int valid_iovcnt = -1;
21110d163575Sopenharmony_ci    struct iovec *iovRet = NULL;
21120d163575Sopenharmony_ci
21130d163575Sopenharmony_ci    /* Process fd convert to system global fd */
21140d163575Sopenharmony_ci    fd = GetAssociatedSystemFd(fd);
21150d163575Sopenharmony_ci    if ((iov == NULL) || (iovcnt < 0) || (iovcnt > IOV_MAX)) {
21160d163575Sopenharmony_ci        return -EINVAL;
21170d163575Sopenharmony_ci    }
21180d163575Sopenharmony_ci
21190d163575Sopenharmony_ci    if (iovcnt == 0) {
21200d163575Sopenharmony_ci        return 0;
21210d163575Sopenharmony_ci    }
21220d163575Sopenharmony_ci
21230d163575Sopenharmony_ci    ret = UserIovCopy(&iovRet, iov, iovcnt, &valid_iovcnt);
21240d163575Sopenharmony_ci    if (ret != 0) {
21250d163575Sopenharmony_ci        return ret;
21260d163575Sopenharmony_ci    }
21270d163575Sopenharmony_ci
21280d163575Sopenharmony_ci    if (valid_iovcnt <= 0) {
21290d163575Sopenharmony_ci        ret = -EFAULT;
21300d163575Sopenharmony_ci        goto OUT_FREE;
21310d163575Sopenharmony_ci    }
21320d163575Sopenharmony_ci
21330d163575Sopenharmony_ci    ret = preadv(fd, iovRet, valid_iovcnt, offsetflag);
21340d163575Sopenharmony_ci    if (ret < 0) {
21350d163575Sopenharmony_ci        ret = -get_errno();
21360d163575Sopenharmony_ci    }
21370d163575Sopenharmony_ci
21380d163575Sopenharmony_ciOUT_FREE:
21390d163575Sopenharmony_ci    (void)(void)LOS_MemFree(OS_SYS_MEM_ADDR, iovRet);
21400d163575Sopenharmony_ci    return ret;
21410d163575Sopenharmony_ci}
21420d163575Sopenharmony_ci
21430d163575Sopenharmony_cissize_t SysPwritev(int fd, const struct iovec *iov, int iovcnt, long loffset, long hoffset)
21440d163575Sopenharmony_ci{
21450d163575Sopenharmony_ci    off_t offsetflag;
21460d163575Sopenharmony_ci    offsetflag = (off_t)((unsigned long long)loffset | (((unsigned long long)hoffset) << HIGH_SHIFT_BIT));
21470d163575Sopenharmony_ci    int ret;
21480d163575Sopenharmony_ci    int valid_iovcnt = -1;
21490d163575Sopenharmony_ci    struct iovec *iovRet = NULL;
21500d163575Sopenharmony_ci
21510d163575Sopenharmony_ci    /* Process fd convert to system global fd */
21520d163575Sopenharmony_ci    fd = GetAssociatedSystemFd(fd);
21530d163575Sopenharmony_ci    if ((iov == NULL) || (iovcnt < 0) || (iovcnt > IOV_MAX)) {
21540d163575Sopenharmony_ci        return -EINVAL;
21550d163575Sopenharmony_ci    }
21560d163575Sopenharmony_ci
21570d163575Sopenharmony_ci    if (iovcnt == 0) {
21580d163575Sopenharmony_ci        return 0;
21590d163575Sopenharmony_ci    }
21600d163575Sopenharmony_ci
21610d163575Sopenharmony_ci    ret = UserIovCopy(&iovRet, iov, iovcnt, &valid_iovcnt);
21620d163575Sopenharmony_ci    if (ret != 0) {
21630d163575Sopenharmony_ci        return ret;
21640d163575Sopenharmony_ci    }
21650d163575Sopenharmony_ci
21660d163575Sopenharmony_ci    if (valid_iovcnt != iovcnt) {
21670d163575Sopenharmony_ci        ret = -EFAULT;
21680d163575Sopenharmony_ci        goto OUT_FREE;
21690d163575Sopenharmony_ci    }
21700d163575Sopenharmony_ci
21710d163575Sopenharmony_ci    ret = pwritev(fd, iovRet, valid_iovcnt, offsetflag);
21720d163575Sopenharmony_ci    if (ret < 0) {
21730d163575Sopenharmony_ci        ret = -get_errno();
21740d163575Sopenharmony_ci    }
21750d163575Sopenharmony_ci
21760d163575Sopenharmony_ciOUT_FREE:
21770d163575Sopenharmony_ci    (void)LOS_MemFree(OS_SYS_MEM_ADDR, iovRet);
21780d163575Sopenharmony_ci    return ret;
21790d163575Sopenharmony_ci}
21800d163575Sopenharmony_ci
21810d163575Sopenharmony_ci#ifdef LOSCFG_FS_FAT
21820d163575Sopenharmony_ciint SysFormat(const char *dev, int sectors, int option)
21830d163575Sopenharmony_ci{
21840d163575Sopenharmony_ci    int ret;
21850d163575Sopenharmony_ci    char *devRet = NULL;
21860d163575Sopenharmony_ci
21870d163575Sopenharmony_ci    if (!IsCapPermit(CAP_FS_FORMAT)) {
21880d163575Sopenharmony_ci        return -EPERM;
21890d163575Sopenharmony_ci    }
21900d163575Sopenharmony_ci
21910d163575Sopenharmony_ci    if (dev != NULL) {
21920d163575Sopenharmony_ci        ret = UserPathCopy(dev, &devRet);
21930d163575Sopenharmony_ci        if (ret != 0) {
21940d163575Sopenharmony_ci            goto OUT;
21950d163575Sopenharmony_ci        }
21960d163575Sopenharmony_ci    }
21970d163575Sopenharmony_ci
21980d163575Sopenharmony_ci    ret = format((dev ? devRet : NULL), sectors, option);
21990d163575Sopenharmony_ci    if (ret < 0) {
22000d163575Sopenharmony_ci        ret = -get_errno();
22010d163575Sopenharmony_ci    }
22020d163575Sopenharmony_ci
22030d163575Sopenharmony_ciOUT:
22040d163575Sopenharmony_ci    if (devRet != NULL) {
22050d163575Sopenharmony_ci        (void)LOS_MemFree(OS_SYS_MEM_ADDR, devRet);
22060d163575Sopenharmony_ci    }
22070d163575Sopenharmony_ci    return ret;
22080d163575Sopenharmony_ci}
22090d163575Sopenharmony_ci#endif
22100d163575Sopenharmony_ci
22110d163575Sopenharmony_ciint SysFstat64(int fd, struct kstat *buf)
22120d163575Sopenharmony_ci{
22130d163575Sopenharmony_ci    int ret;
22140d163575Sopenharmony_ci    struct stat64 bufRet = {0};
22150d163575Sopenharmony_ci
22160d163575Sopenharmony_ci    /* Process fd convert to system global fd */
22170d163575Sopenharmony_ci    fd = GetAssociatedSystemFd(fd);
22180d163575Sopenharmony_ci
22190d163575Sopenharmony_ci    ret = fstat64(fd, (buf ? (&bufRet) : NULL));
22200d163575Sopenharmony_ci    if (ret < 0) {
22210d163575Sopenharmony_ci        return -get_errno();
22220d163575Sopenharmony_ci    }
22230d163575Sopenharmony_ci
22240d163575Sopenharmony_ci    ret = LOS_ArchCopyToUser(buf, &bufRet, sizeof(struct kstat));
22250d163575Sopenharmony_ci    if (ret != 0) {
22260d163575Sopenharmony_ci        return -EFAULT;
22270d163575Sopenharmony_ci    }
22280d163575Sopenharmony_ci
22290d163575Sopenharmony_ci    return ret;
22300d163575Sopenharmony_ci}
22310d163575Sopenharmony_ci
22320d163575Sopenharmony_ciint SysFcntl64(int fd, int cmd, void *arg)
22330d163575Sopenharmony_ci{
22340d163575Sopenharmony_ci    /* Process fd convert to system global fd */
22350d163575Sopenharmony_ci    int sysfd = GetAssociatedSystemFd(fd);
22360d163575Sopenharmony_ci
22370d163575Sopenharmony_ci    int ret = VfsFcntl(fd, cmd, arg);
22380d163575Sopenharmony_ci    if (ret == CONTINE_NUTTX_FCNTL) {
22390d163575Sopenharmony_ci        ret = fcntl64(sysfd, cmd, arg);
22400d163575Sopenharmony_ci    }
22410d163575Sopenharmony_ci
22420d163575Sopenharmony_ci    if (ret < 0) {
22430d163575Sopenharmony_ci        return -get_errno();
22440d163575Sopenharmony_ci    }
22450d163575Sopenharmony_ci    return ret;
22460d163575Sopenharmony_ci}
22470d163575Sopenharmony_ci
22480d163575Sopenharmony_ciint SysGetdents64(int fd, struct dirent *de_user, unsigned int count)
22490d163575Sopenharmony_ci{
22500d163575Sopenharmony_ci    if (!LOS_IsUserAddressRange((VADDR_T)(UINTPTR)de_user, count)) {
22510d163575Sopenharmony_ci        return -EFAULT;
22520d163575Sopenharmony_ci    }
22530d163575Sopenharmony_ci
22540d163575Sopenharmony_ci    struct dirent *de_knl = NULL;
22550d163575Sopenharmony_ci
22560d163575Sopenharmony_ci    /* Process fd convert to system global fd */
22570d163575Sopenharmony_ci    fd = GetAssociatedSystemFd(fd);
22580d163575Sopenharmony_ci
22590d163575Sopenharmony_ci    int ret = do_readdir(fd, &de_knl, count);
22600d163575Sopenharmony_ci    if (ret < 0) {
22610d163575Sopenharmony_ci        return ret;
22620d163575Sopenharmony_ci    }
22630d163575Sopenharmony_ci    if (de_knl != NULL) {
22640d163575Sopenharmony_ci        int cpy_ret = LOS_ArchCopyToUser(de_user, de_knl, ret);
22650d163575Sopenharmony_ci        if (cpy_ret != 0)
22660d163575Sopenharmony_ci        {
22670d163575Sopenharmony_ci            return -EFAULT;
22680d163575Sopenharmony_ci        }
22690d163575Sopenharmony_ci    }
22700d163575Sopenharmony_ci    return ret;
22710d163575Sopenharmony_ci}
22720d163575Sopenharmony_ci
22730d163575Sopenharmony_cichar *SysRealpath(const char *path, char *resolved_path)
22740d163575Sopenharmony_ci{
22750d163575Sopenharmony_ci    char *pathRet = NULL;
22760d163575Sopenharmony_ci    char *resolved_pathRet = NULL;
22770d163575Sopenharmony_ci    char *result = NULL;
22780d163575Sopenharmony_ci    int ret;
22790d163575Sopenharmony_ci
22800d163575Sopenharmony_ci    if (resolved_path == NULL) {
22810d163575Sopenharmony_ci        return (char *)(intptr_t)-EINVAL;
22820d163575Sopenharmony_ci    }
22830d163575Sopenharmony_ci
22840d163575Sopenharmony_ci    if (path != NULL) {
22850d163575Sopenharmony_ci        ret = UserPathCopy(path, &pathRet);
22860d163575Sopenharmony_ci        if (ret != 0) {
22870d163575Sopenharmony_ci            result = (char *)(intptr_t)ret;
22880d163575Sopenharmony_ci            goto OUT;
22890d163575Sopenharmony_ci        }
22900d163575Sopenharmony_ci    }
22910d163575Sopenharmony_ci
22920d163575Sopenharmony_ci    resolved_pathRet = realpath((path ? pathRet : NULL), NULL);
22930d163575Sopenharmony_ci    if (resolved_pathRet == NULL) {
22940d163575Sopenharmony_ci        result = (char *)(intptr_t)-get_errno();
22950d163575Sopenharmony_ci        goto OUT;
22960d163575Sopenharmony_ci    }
22970d163575Sopenharmony_ci
22980d163575Sopenharmony_ci    ret = LOS_ArchCopyToUser(resolved_path, resolved_pathRet, strlen(resolved_pathRet) + 1);
22990d163575Sopenharmony_ci    if (ret != 0) {
23000d163575Sopenharmony_ci        result = (char *)(intptr_t)-EFAULT;
23010d163575Sopenharmony_ci        goto OUT;
23020d163575Sopenharmony_ci    }
23030d163575Sopenharmony_ci    result = resolved_path;
23040d163575Sopenharmony_ci
23050d163575Sopenharmony_ciOUT:
23060d163575Sopenharmony_ci    if (pathRet != NULL) {
23070d163575Sopenharmony_ci        (void)LOS_MemFree(OS_SYS_MEM_ADDR, pathRet);
23080d163575Sopenharmony_ci    }
23090d163575Sopenharmony_ci    if (resolved_pathRet != NULL) {
23100d163575Sopenharmony_ci        (void)LOS_MemFree(OS_SYS_MEM_ADDR, resolved_pathRet);
23110d163575Sopenharmony_ci    }
23120d163575Sopenharmony_ci    return result;
23130d163575Sopenharmony_ci}
23140d163575Sopenharmony_ci
23150d163575Sopenharmony_ciint SysUtimensat(int fd, const char *path, struct timespec times[TIMESPEC_TIMES_NUM], int flag)
23160d163575Sopenharmony_ci{
23170d163575Sopenharmony_ci    int ret;
23180d163575Sopenharmony_ci    int timeLen;
23190d163575Sopenharmony_ci    struct IATTR attr = {0};
23200d163575Sopenharmony_ci    char *filePath = NULL;
23210d163575Sopenharmony_ci
23220d163575Sopenharmony_ci    timeLen = TIMESPEC_TIMES_NUM * sizeof(struct timespec);
23230d163575Sopenharmony_ci    CHECK_ASPACE(times, timeLen);
23240d163575Sopenharmony_ci    DUP_FROM_USER(times, timeLen);
23250d163575Sopenharmony_ci    ret = CheckNewAttrTime(&attr, times);
23260d163575Sopenharmony_ci    FREE_DUP(times);
23270d163575Sopenharmony_ci    if (ret < 0) {
23280d163575Sopenharmony_ci        goto OUT;
23290d163575Sopenharmony_ci    }
23300d163575Sopenharmony_ci
23310d163575Sopenharmony_ci    ret = GetFullpathNull(fd, path, &filePath);
23320d163575Sopenharmony_ci    if (ret < 0) {
23330d163575Sopenharmony_ci        goto OUT;
23340d163575Sopenharmony_ci    }
23350d163575Sopenharmony_ci
23360d163575Sopenharmony_ci    ret = chattr(filePath, &attr);
23370d163575Sopenharmony_ci    if (ret < 0) {
23380d163575Sopenharmony_ci        ret = -get_errno();
23390d163575Sopenharmony_ci    }
23400d163575Sopenharmony_ci
23410d163575Sopenharmony_ciOUT:
23420d163575Sopenharmony_ci    PointerFree(filePath);
23430d163575Sopenharmony_ci    return ret;
23440d163575Sopenharmony_ci}
23450d163575Sopenharmony_ci
23460d163575Sopenharmony_ciint SysChmod(const char *pathname, mode_t mode)
23470d163575Sopenharmony_ci{
23480d163575Sopenharmony_ci    int ret;
23490d163575Sopenharmony_ci    char *pathRet = NULL;
23500d163575Sopenharmony_ci
23510d163575Sopenharmony_ci    if (pathname != NULL) {
23520d163575Sopenharmony_ci        ret = UserPathCopy(pathname, &pathRet);
23530d163575Sopenharmony_ci        if (ret != 0) {
23540d163575Sopenharmony_ci            goto OUT;
23550d163575Sopenharmony_ci        }
23560d163575Sopenharmony_ci    }
23570d163575Sopenharmony_ci
23580d163575Sopenharmony_ci    ret = chmod(pathRet, mode);
23590d163575Sopenharmony_ci    if (ret < 0) {
23600d163575Sopenharmony_ci        ret = -get_errno();
23610d163575Sopenharmony_ci    }
23620d163575Sopenharmony_ci
23630d163575Sopenharmony_ciOUT:
23640d163575Sopenharmony_ci    if (pathRet != NULL) {
23650d163575Sopenharmony_ci        (void)LOS_MemFree(OS_SYS_MEM_ADDR, pathRet);
23660d163575Sopenharmony_ci    }
23670d163575Sopenharmony_ci    return ret;
23680d163575Sopenharmony_ci}
23690d163575Sopenharmony_ci
23700d163575Sopenharmony_ciint SysFchmodat(int fd, const char *path, mode_t mode, int flag)
23710d163575Sopenharmony_ci{
23720d163575Sopenharmony_ci    int ret;
23730d163575Sopenharmony_ci    char *pathRet = NULL;
23740d163575Sopenharmony_ci    char *fullpath = NULL;
23750d163575Sopenharmony_ci    struct IATTR attr = {
23760d163575Sopenharmony_ci        .attr_chg_mode = mode,
23770d163575Sopenharmony_ci        .attr_chg_valid = CHG_MODE,
23780d163575Sopenharmony_ci    };
23790d163575Sopenharmony_ci
23800d163575Sopenharmony_ci    if (path != NULL) {
23810d163575Sopenharmony_ci        ret = UserPathCopy(path, &pathRet);
23820d163575Sopenharmony_ci        if (ret != 0) {
23830d163575Sopenharmony_ci            goto OUT;
23840d163575Sopenharmony_ci        }
23850d163575Sopenharmony_ci    }
23860d163575Sopenharmony_ci
23870d163575Sopenharmony_ci    if (fd != AT_FDCWD) {
23880d163575Sopenharmony_ci        /* Process fd convert to system global fd */
23890d163575Sopenharmony_ci        fd = GetAssociatedSystemFd(fd);
23900d163575Sopenharmony_ci    }
23910d163575Sopenharmony_ci
23920d163575Sopenharmony_ci    ret = vfs_normalize_pathat(fd, pathRet, &fullpath);
23930d163575Sopenharmony_ci    if (ret < 0) {
23940d163575Sopenharmony_ci        goto OUT;
23950d163575Sopenharmony_ci    }
23960d163575Sopenharmony_ci
23970d163575Sopenharmony_ci    ret = chattr(fullpath, &attr);
23980d163575Sopenharmony_ci    if (ret < 0) {
23990d163575Sopenharmony_ci        ret = -get_errno();
24000d163575Sopenharmony_ci    }
24010d163575Sopenharmony_ci
24020d163575Sopenharmony_ciOUT:
24030d163575Sopenharmony_ci    PointerFree(pathRet);
24040d163575Sopenharmony_ci    PointerFree(fullpath);
24050d163575Sopenharmony_ci
24060d163575Sopenharmony_ci    return ret;
24070d163575Sopenharmony_ci}
24080d163575Sopenharmony_ci
24090d163575Sopenharmony_ciint SysFchmod(int fd, mode_t mode)
24100d163575Sopenharmony_ci{
24110d163575Sopenharmony_ci    int ret;
24120d163575Sopenharmony_ci    int sysFd;
24130d163575Sopenharmony_ci    struct IATTR attr = {
24140d163575Sopenharmony_ci        .attr_chg_mode = mode,
24150d163575Sopenharmony_ci        .attr_chg_valid = CHG_MODE, /* change mode */
24160d163575Sopenharmony_ci    };
24170d163575Sopenharmony_ci    struct file *file = NULL;
24180d163575Sopenharmony_ci
24190d163575Sopenharmony_ci    sysFd = GetAssociatedSystemFd(fd);
24200d163575Sopenharmony_ci    if (sysFd < 0) {
24210d163575Sopenharmony_ci        return -EBADF;
24220d163575Sopenharmony_ci    }
24230d163575Sopenharmony_ci
24240d163575Sopenharmony_ci    ret = fs_getfilep(sysFd, &file);
24250d163575Sopenharmony_ci    if (ret < 0) {
24260d163575Sopenharmony_ci        return -get_errno();
24270d163575Sopenharmony_ci    }
24280d163575Sopenharmony_ci
24290d163575Sopenharmony_ci    ret = chattr(file->f_path, &attr);
24300d163575Sopenharmony_ci    if (ret < 0) {
24310d163575Sopenharmony_ci        return -get_errno();
24320d163575Sopenharmony_ci    }
24330d163575Sopenharmony_ci
24340d163575Sopenharmony_ci    return ret;
24350d163575Sopenharmony_ci}
24360d163575Sopenharmony_ci
24370d163575Sopenharmony_ciint SysFchownat(int fd, const char *path, uid_t owner, gid_t group, int flag)
24380d163575Sopenharmony_ci{
24390d163575Sopenharmony_ci    int ret;
24400d163575Sopenharmony_ci    char *fullpath = NULL;
24410d163575Sopenharmony_ci    struct IATTR attr = {
24420d163575Sopenharmony_ci        .attr_chg_valid = 0,
24430d163575Sopenharmony_ci    };
24440d163575Sopenharmony_ci
24450d163575Sopenharmony_ci    ret = GetFullpath(fd, path, &fullpath);
24460d163575Sopenharmony_ci    if (ret < 0) {
24470d163575Sopenharmony_ci        goto OUT;
24480d163575Sopenharmony_ci    }
24490d163575Sopenharmony_ci
24500d163575Sopenharmony_ci    if (owner != (uid_t)-1) {
24510d163575Sopenharmony_ci        attr.attr_chg_uid = owner;
24520d163575Sopenharmony_ci        attr.attr_chg_valid |= CHG_UID;
24530d163575Sopenharmony_ci    }
24540d163575Sopenharmony_ci    if (group != (gid_t)-1) {
24550d163575Sopenharmony_ci        attr.attr_chg_gid = group;
24560d163575Sopenharmony_ci        attr.attr_chg_valid |= CHG_GID;
24570d163575Sopenharmony_ci    }
24580d163575Sopenharmony_ci
24590d163575Sopenharmony_ci    ret = chattr(fullpath, &attr);
24600d163575Sopenharmony_ci    if (ret < 0) {
24610d163575Sopenharmony_ci        ret = -get_errno();
24620d163575Sopenharmony_ci    }
24630d163575Sopenharmony_ci
24640d163575Sopenharmony_ciOUT:
24650d163575Sopenharmony_ci    PointerFree(fullpath);
24660d163575Sopenharmony_ci
24670d163575Sopenharmony_ci    return ret;
24680d163575Sopenharmony_ci}
24690d163575Sopenharmony_ci
24700d163575Sopenharmony_ciint SysFchown(int fd, uid_t owner, gid_t group)
24710d163575Sopenharmony_ci{
24720d163575Sopenharmony_ci    int ret;
24730d163575Sopenharmony_ci    int sysFd;
24740d163575Sopenharmony_ci    struct IATTR attr = {0};
24750d163575Sopenharmony_ci    attr.attr_chg_valid = 0;
24760d163575Sopenharmony_ci    struct file *file = NULL;
24770d163575Sopenharmony_ci
24780d163575Sopenharmony_ci    sysFd = GetAssociatedSystemFd(fd);
24790d163575Sopenharmony_ci    if (sysFd < 0) {
24800d163575Sopenharmony_ci        return -EBADF;
24810d163575Sopenharmony_ci    }
24820d163575Sopenharmony_ci
24830d163575Sopenharmony_ci    ret = fs_getfilep(sysFd, &file);
24840d163575Sopenharmony_ci    if (ret < 0) {
24850d163575Sopenharmony_ci        return -get_errno();
24860d163575Sopenharmony_ci    }
24870d163575Sopenharmony_ci
24880d163575Sopenharmony_ci    if (owner != (uid_t)-1) {
24890d163575Sopenharmony_ci        attr.attr_chg_uid = owner;
24900d163575Sopenharmony_ci        attr.attr_chg_valid |= CHG_UID;
24910d163575Sopenharmony_ci    }
24920d163575Sopenharmony_ci    if (group != (gid_t)-1) {
24930d163575Sopenharmony_ci        attr.attr_chg_gid = group;
24940d163575Sopenharmony_ci        attr.attr_chg_valid |= CHG_GID;
24950d163575Sopenharmony_ci    }
24960d163575Sopenharmony_ci    ret = chattr(file->f_path, &attr);
24970d163575Sopenharmony_ci    if (ret < 0) {
24980d163575Sopenharmony_ci        ret = -get_errno();
24990d163575Sopenharmony_ci    }
25000d163575Sopenharmony_ci
25010d163575Sopenharmony_ci    return ret;
25020d163575Sopenharmony_ci}
25030d163575Sopenharmony_ci
25040d163575Sopenharmony_ciint SysChown(const char *pathname, uid_t owner, gid_t group)
25050d163575Sopenharmony_ci{
25060d163575Sopenharmony_ci    int ret;
25070d163575Sopenharmony_ci    char *pathRet = NULL;
25080d163575Sopenharmony_ci
25090d163575Sopenharmony_ci    if (pathname != NULL) {
25100d163575Sopenharmony_ci        ret = UserPathCopy(pathname, &pathRet);
25110d163575Sopenharmony_ci        if (ret != 0) {
25120d163575Sopenharmony_ci            goto OUT;
25130d163575Sopenharmony_ci        }
25140d163575Sopenharmony_ci    }
25150d163575Sopenharmony_ci
25160d163575Sopenharmony_ci    ret = chown(pathRet, owner, group);
25170d163575Sopenharmony_ci    if (ret < 0) {
25180d163575Sopenharmony_ci        ret = -get_errno();
25190d163575Sopenharmony_ci    }
25200d163575Sopenharmony_ci
25210d163575Sopenharmony_ciOUT:
25220d163575Sopenharmony_ci    if (pathRet != NULL) {
25230d163575Sopenharmony_ci        (void)LOS_MemFree(OS_SYS_MEM_ADDR, pathRet);
25240d163575Sopenharmony_ci    }
25250d163575Sopenharmony_ci    return ret;
25260d163575Sopenharmony_ci}
25270d163575Sopenharmony_ci
25280d163575Sopenharmony_ciint SysFstatat64(int dirfd, const char *restrict path, struct kstat *restrict buf, int flag)
25290d163575Sopenharmony_ci{
25300d163575Sopenharmony_ci    int ret;
25310d163575Sopenharmony_ci    struct stat bufRet = {0};
25320d163575Sopenharmony_ci    char *pathRet = NULL;
25330d163575Sopenharmony_ci    char *fullpath = NULL;
25340d163575Sopenharmony_ci
25350d163575Sopenharmony_ci    if (path != NULL) {
25360d163575Sopenharmony_ci        ret = UserPathCopy(path, &pathRet);
25370d163575Sopenharmony_ci        if (ret != 0) {
25380d163575Sopenharmony_ci            goto OUT;
25390d163575Sopenharmony_ci        }
25400d163575Sopenharmony_ci    }
25410d163575Sopenharmony_ci
25420d163575Sopenharmony_ci    if (dirfd != AT_FDCWD) {
25430d163575Sopenharmony_ci        /* Process fd convert to system global fd */
25440d163575Sopenharmony_ci        dirfd = GetAssociatedSystemFd(dirfd);
25450d163575Sopenharmony_ci    }
25460d163575Sopenharmony_ci
25470d163575Sopenharmony_ci    ret = vfs_normalize_pathat(dirfd, pathRet, &fullpath);
25480d163575Sopenharmony_ci    if (ret < 0) {
25490d163575Sopenharmony_ci        goto OUT;
25500d163575Sopenharmony_ci    }
25510d163575Sopenharmony_ci
25520d163575Sopenharmony_ci    ret = stat(fullpath, &bufRet);
25530d163575Sopenharmony_ci    if (ret < 0) {
25540d163575Sopenharmony_ci        ret = -get_errno();
25550d163575Sopenharmony_ci        goto OUT;
25560d163575Sopenharmony_ci    }
25570d163575Sopenharmony_ci
25580d163575Sopenharmony_ci    ret = LOS_ArchCopyToUser(buf, &bufRet, sizeof(struct kstat));
25590d163575Sopenharmony_ci    if (ret != 0) {
25600d163575Sopenharmony_ci        ret = -EFAULT;
25610d163575Sopenharmony_ci        goto OUT;
25620d163575Sopenharmony_ci    }
25630d163575Sopenharmony_ci
25640d163575Sopenharmony_ciOUT:
25650d163575Sopenharmony_ci    if (pathRet != NULL) {
25660d163575Sopenharmony_ci        LOS_MemFree(OS_SYS_MEM_ADDR, pathRet);
25670d163575Sopenharmony_ci    }
25680d163575Sopenharmony_ci
25690d163575Sopenharmony_ci    if (fullpath != NULL) {
25700d163575Sopenharmony_ci        free(fullpath);
25710d163575Sopenharmony_ci    }
25720d163575Sopenharmony_ci    return ret;
25730d163575Sopenharmony_ci}
25740d163575Sopenharmony_ci
25750d163575Sopenharmony_ciint SysFaccessat(int fd, const char *filename, int amode, int flag)
25760d163575Sopenharmony_ci{
25770d163575Sopenharmony_ci    int ret;
25780d163575Sopenharmony_ci    struct stat buf;
25790d163575Sopenharmony_ci    struct statfs fsBuf;
25800d163575Sopenharmony_ci    char *fullDirectory = NULL;
25810d163575Sopenharmony_ci
25820d163575Sopenharmony_ci    ret = GetFullpath(fd, filename, &fullDirectory);
25830d163575Sopenharmony_ci    if (ret < 0) {
25840d163575Sopenharmony_ci        goto OUT;
25850d163575Sopenharmony_ci    }
25860d163575Sopenharmony_ci
25870d163575Sopenharmony_ci    ret = statfs(fullDirectory, &fsBuf);
25880d163575Sopenharmony_ci    if (ret != 0) {
25890d163575Sopenharmony_ci        ret = -get_errno();
25900d163575Sopenharmony_ci        goto OUT;
25910d163575Sopenharmony_ci    }
25920d163575Sopenharmony_ci
25930d163575Sopenharmony_ci    if ((fsBuf.f_flags & MS_RDONLY) && ((unsigned int)amode & W_OK)) {
25940d163575Sopenharmony_ci        ret = -EROFS;
25950d163575Sopenharmony_ci        goto OUT;
25960d163575Sopenharmony_ci    }
25970d163575Sopenharmony_ci
25980d163575Sopenharmony_ci    ret = stat(fullDirectory, &buf);
25990d163575Sopenharmony_ci    if (ret != 0) {
26000d163575Sopenharmony_ci        ret = -get_errno();
26010d163575Sopenharmony_ci        goto OUT;
26020d163575Sopenharmony_ci    }
26030d163575Sopenharmony_ci
26040d163575Sopenharmony_ci    if (VfsPermissionCheck(buf.st_uid, buf.st_gid, buf.st_mode, amode)) {
26050d163575Sopenharmony_ci        ret = -EACCES;
26060d163575Sopenharmony_ci    }
26070d163575Sopenharmony_ci
26080d163575Sopenharmony_ciOUT:
26090d163575Sopenharmony_ci    PointerFree(fullDirectory);
26100d163575Sopenharmony_ci
26110d163575Sopenharmony_ci    return ret;
26120d163575Sopenharmony_ci}
26130d163575Sopenharmony_ci
26140d163575Sopenharmony_ciint SysFstatfs(int fd, struct statfs *buf)
26150d163575Sopenharmony_ci{
26160d163575Sopenharmony_ci    int ret;
26170d163575Sopenharmony_ci    struct file *filep = NULL;
26180d163575Sopenharmony_ci    struct statfs bufRet = {0};
26190d163575Sopenharmony_ci
26200d163575Sopenharmony_ci    /* Process fd convert to system global fd */
26210d163575Sopenharmony_ci    fd = GetAssociatedSystemFd(fd);
26220d163575Sopenharmony_ci
26230d163575Sopenharmony_ci    ret = fs_getfilep(fd, &filep);
26240d163575Sopenharmony_ci    if (ret < 0) {
26250d163575Sopenharmony_ci        ret = -get_errno();
26260d163575Sopenharmony_ci        return ret;
26270d163575Sopenharmony_ci    }
26280d163575Sopenharmony_ci
26290d163575Sopenharmony_ci    ret = statfs(filep->f_path, &bufRet);
26300d163575Sopenharmony_ci    if (ret < 0) {
26310d163575Sopenharmony_ci        ret = -get_errno();
26320d163575Sopenharmony_ci        return ret;
26330d163575Sopenharmony_ci    }
26340d163575Sopenharmony_ci
26350d163575Sopenharmony_ci    ret = LOS_ArchCopyToUser(buf, &bufRet, sizeof(struct statfs));
26360d163575Sopenharmony_ci    if (ret != 0) {
26370d163575Sopenharmony_ci        ret = -EFAULT;
26380d163575Sopenharmony_ci    }
26390d163575Sopenharmony_ci
26400d163575Sopenharmony_ci    return ret;
26410d163575Sopenharmony_ci}
26420d163575Sopenharmony_ci
26430d163575Sopenharmony_ciint SysFstatfs64(int fd, size_t sz, struct statfs *buf)
26440d163575Sopenharmony_ci{
26450d163575Sopenharmony_ci    int ret;
26460d163575Sopenharmony_ci
26470d163575Sopenharmony_ci    if (sz != sizeof(struct statfs)) {
26480d163575Sopenharmony_ci        ret = -EINVAL;
26490d163575Sopenharmony_ci        return ret;
26500d163575Sopenharmony_ci    }
26510d163575Sopenharmony_ci
26520d163575Sopenharmony_ci    ret = SysFstatfs(fd, buf);
26530d163575Sopenharmony_ci
26540d163575Sopenharmony_ci    return ret;
26550d163575Sopenharmony_ci}
26560d163575Sopenharmony_ci
26570d163575Sopenharmony_ciint SysPpoll(struct pollfd *fds, nfds_t nfds, const struct timespec *tmo_p, const sigset_t *sigMask, int nsig)
26580d163575Sopenharmony_ci{
26590d163575Sopenharmony_ci    int timeout, retVal;
26600d163575Sopenharmony_ci    sigset_t_l origMask = {0};
26610d163575Sopenharmony_ci    sigset_t_l set = {0};
26620d163575Sopenharmony_ci
26630d163575Sopenharmony_ci    CHECK_ASPACE(tmo_p, sizeof(struct timespec));
26640d163575Sopenharmony_ci    CPY_FROM_USER(tmo_p);
26650d163575Sopenharmony_ci
26660d163575Sopenharmony_ci    if (tmo_p != NULL) {
26670d163575Sopenharmony_ci        timeout = tmo_p->tv_sec * OS_SYS_US_PER_MS + tmo_p->tv_nsec / OS_SYS_NS_PER_MS;
26680d163575Sopenharmony_ci        if (timeout < 0) {
26690d163575Sopenharmony_ci            return -EINVAL;
26700d163575Sopenharmony_ci        }
26710d163575Sopenharmony_ci    } else {
26720d163575Sopenharmony_ci        timeout = -1;
26730d163575Sopenharmony_ci    }
26740d163575Sopenharmony_ci
26750d163575Sopenharmony_ci    if (sigMask != NULL) {
26760d163575Sopenharmony_ci        retVal = LOS_ArchCopyFromUser(&set, sigMask, sizeof(sigset_t));
26770d163575Sopenharmony_ci        if (retVal != 0) {
26780d163575Sopenharmony_ci            return -EFAULT;
26790d163575Sopenharmony_ci        }
26800d163575Sopenharmony_ci        (VOID)OsSigprocMask(SIG_SETMASK, &set, &origMask);
26810d163575Sopenharmony_ci    } else {
26820d163575Sopenharmony_ci        (VOID)OsSigprocMask(SIG_SETMASK, NULL, &origMask);
26830d163575Sopenharmony_ci    }
26840d163575Sopenharmony_ci
26850d163575Sopenharmony_ci    retVal = SysPoll(fds, nfds, timeout);
26860d163575Sopenharmony_ci    (VOID)OsSigprocMask(SIG_SETMASK, &origMask, NULL);
26870d163575Sopenharmony_ci
26880d163575Sopenharmony_ci    return retVal;
26890d163575Sopenharmony_ci}
26900d163575Sopenharmony_ci
26910d163575Sopenharmony_ciint SysPselect6(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds,
26920d163575Sopenharmony_ci    const struct timespec *timeout, const long data[2])
26930d163575Sopenharmony_ci{
26940d163575Sopenharmony_ci    int ret;
26950d163575Sopenharmony_ci    int retVal;
26960d163575Sopenharmony_ci    sigset_t_l origMask;
26970d163575Sopenharmony_ci    sigset_t_l setl;
26980d163575Sopenharmony_ci
26990d163575Sopenharmony_ci    CHECK_ASPACE(readfds, sizeof(fd_set));
27000d163575Sopenharmony_ci    CHECK_ASPACE(writefds, sizeof(fd_set));
27010d163575Sopenharmony_ci    CHECK_ASPACE(exceptfds, sizeof(fd_set));
27020d163575Sopenharmony_ci    CHECK_ASPACE(timeout, sizeof(struct timeval));
27030d163575Sopenharmony_ci
27040d163575Sopenharmony_ci    CPY_FROM_USER(readfds);
27050d163575Sopenharmony_ci    CPY_FROM_USER(writefds);
27060d163575Sopenharmony_ci    CPY_FROM_USER(exceptfds);
27070d163575Sopenharmony_ci    DUP_FROM_USER(timeout, sizeof(struct timeval));
27080d163575Sopenharmony_ci
27090d163575Sopenharmony_ci    if (timeout != NULL) {
27100d163575Sopenharmony_ci        ((struct timeval *)timeout)->tv_usec = timeout->tv_nsec / 1000; /* 1000, convert ns to us */
27110d163575Sopenharmony_ci    }
27120d163575Sopenharmony_ci
27130d163575Sopenharmony_ci    if (data != NULL) {
27140d163575Sopenharmony_ci        retVal = LOS_ArchCopyFromUser(&(setl.sig[0]), (int *)((UINTPTR)data[0]), sizeof(sigset_t));
27150d163575Sopenharmony_ci        if (retVal != 0) {
27160d163575Sopenharmony_ci            ret = -EFAULT;
27170d163575Sopenharmony_ci            FREE_DUP(timeout);
27180d163575Sopenharmony_ci            return ret;
27190d163575Sopenharmony_ci        }
27200d163575Sopenharmony_ci    }
27210d163575Sopenharmony_ci
27220d163575Sopenharmony_ci    OsSigprocMask(SIG_SETMASK, &setl, &origMask);
27230d163575Sopenharmony_ci    ret = do_select(nfds, readfds, writefds, exceptfds, (struct timeval *)timeout, UserPoll);
27240d163575Sopenharmony_ci    if (ret < 0) {
27250d163575Sopenharmony_ci        /* do not copy parameter back to user mode if do_select failed */
27260d163575Sopenharmony_ci        ret = -get_errno();
27270d163575Sopenharmony_ci        FREE_DUP(timeout);
27280d163575Sopenharmony_ci        return ret;
27290d163575Sopenharmony_ci    }
27300d163575Sopenharmony_ci    OsSigprocMask(SIG_SETMASK, &origMask, NULL);
27310d163575Sopenharmony_ci
27320d163575Sopenharmony_ci    CPY_TO_USER(readfds);
27330d163575Sopenharmony_ci    CPY_TO_USER(writefds);
27340d163575Sopenharmony_ci    CPY_TO_USER(exceptfds);
27350d163575Sopenharmony_ci    FREE_DUP(timeout);
27360d163575Sopenharmony_ci
27370d163575Sopenharmony_ci    return ret;
27380d163575Sopenharmony_ci}
27390d163575Sopenharmony_ci
27400d163575Sopenharmony_cistatic int DoEpollCreate1(int flags)
27410d163575Sopenharmony_ci{
27420d163575Sopenharmony_ci    int ret;
27430d163575Sopenharmony_ci    int procFd;
27440d163575Sopenharmony_ci
27450d163575Sopenharmony_ci    ret = epoll_create1(flags);
27460d163575Sopenharmony_ci    if (ret < 0) {
27470d163575Sopenharmony_ci        ret = -get_errno();
27480d163575Sopenharmony_ci        return ret;
27490d163575Sopenharmony_ci    }
27500d163575Sopenharmony_ci
27510d163575Sopenharmony_ci    procFd = AllocAndAssocProcessFd((INTPTR)(ret), MIN_START_FD);
27520d163575Sopenharmony_ci    if (procFd == -1) {
27530d163575Sopenharmony_ci        epoll_close(ret);
27540d163575Sopenharmony_ci        return -EMFILE;
27550d163575Sopenharmony_ci    }
27560d163575Sopenharmony_ci
27570d163575Sopenharmony_ci    return procFd;
27580d163575Sopenharmony_ci}
27590d163575Sopenharmony_ci
27600d163575Sopenharmony_ciint SysEpollCreate(int size)
27610d163575Sopenharmony_ci{
27620d163575Sopenharmony_ci    (void)size;
27630d163575Sopenharmony_ci    return DoEpollCreate1(0);
27640d163575Sopenharmony_ci}
27650d163575Sopenharmony_ci
27660d163575Sopenharmony_ciint SysEpollCreate1(int flags)
27670d163575Sopenharmony_ci{
27680d163575Sopenharmony_ci    return DoEpollCreate1(flags);
27690d163575Sopenharmony_ci}
27700d163575Sopenharmony_ci
27710d163575Sopenharmony_ciint SysEpollCtl(int epfd, int op, int fd, struct epoll_event *ev)
27720d163575Sopenharmony_ci{
27730d163575Sopenharmony_ci    int ret;
27740d163575Sopenharmony_ci
27750d163575Sopenharmony_ci    CHECK_ASPACE(ev, sizeof(struct epoll_event));
27760d163575Sopenharmony_ci    CPY_FROM_USER(ev);
27770d163575Sopenharmony_ci
27780d163575Sopenharmony_ci    fd = GetAssociatedSystemFd(fd);
27790d163575Sopenharmony_ci    epfd = GetAssociatedSystemFd(epfd);
27800d163575Sopenharmony_ci    if ((fd < 0) || (epfd < 0)) {
27810d163575Sopenharmony_ci        ret = -EBADF;
27820d163575Sopenharmony_ci        goto OUT;
27830d163575Sopenharmony_ci    }
27840d163575Sopenharmony_ci
27850d163575Sopenharmony_ci    ret = epoll_ctl(epfd, op, fd, ev);
27860d163575Sopenharmony_ci    if (ret < 0) {
27870d163575Sopenharmony_ci        ret = -EBADF;
27880d163575Sopenharmony_ci        goto OUT;
27890d163575Sopenharmony_ci    }
27900d163575Sopenharmony_ci
27910d163575Sopenharmony_ci    CPY_TO_USER(ev);
27920d163575Sopenharmony_ciOUT:
27930d163575Sopenharmony_ci    return (ret == -1) ? -get_errno() : ret;
27940d163575Sopenharmony_ci}
27950d163575Sopenharmony_ci
27960d163575Sopenharmony_ciint SysEpollWait(int epfd, struct epoll_event *evs, int maxevents, int timeout)
27970d163575Sopenharmony_ci{
27980d163575Sopenharmony_ci    int ret = 0;
27990d163575Sopenharmony_ci
28000d163575Sopenharmony_ci    CHECK_ASPACE(evs, sizeof(struct epoll_event));
28010d163575Sopenharmony_ci    CPY_FROM_USER(evs);
28020d163575Sopenharmony_ci
28030d163575Sopenharmony_ci    epfd = GetAssociatedSystemFd(epfd);
28040d163575Sopenharmony_ci    if  (epfd < 0) {
28050d163575Sopenharmony_ci        ret = -EBADF;
28060d163575Sopenharmony_ci        goto OUT;
28070d163575Sopenharmony_ci    }
28080d163575Sopenharmony_ci
28090d163575Sopenharmony_ci    ret = epoll_wait(epfd, evs, maxevents, timeout);
28100d163575Sopenharmony_ci    if (ret < 0) {
28110d163575Sopenharmony_ci        ret = -get_errno();
28120d163575Sopenharmony_ci    }
28130d163575Sopenharmony_ci
28140d163575Sopenharmony_ci    CPY_TO_USER(evs);
28150d163575Sopenharmony_ciOUT:
28160d163575Sopenharmony_ci    return (ret == -1) ? -get_errno() : ret;
28170d163575Sopenharmony_ci}
28180d163575Sopenharmony_ci
28190d163575Sopenharmony_ciint SysEpollPwait(int epfd, struct epoll_event *evs, int maxevents, int timeout, const sigset_t *mask)
28200d163575Sopenharmony_ci{
28210d163575Sopenharmony_ci    sigset_t_l origMask;
28220d163575Sopenharmony_ci    sigset_t_l setl;
28230d163575Sopenharmony_ci    int ret = 0;
28240d163575Sopenharmony_ci
28250d163575Sopenharmony_ci    CHECK_ASPACE(mask, sizeof(sigset_t));
28260d163575Sopenharmony_ci
28270d163575Sopenharmony_ci    if (mask != NULL) {
28280d163575Sopenharmony_ci        ret = LOS_ArchCopyFromUser(&setl, mask, sizeof(sigset_t));
28290d163575Sopenharmony_ci        if (ret != 0) {
28300d163575Sopenharmony_ci            return -EFAULT;
28310d163575Sopenharmony_ci        }
28320d163575Sopenharmony_ci    }
28330d163575Sopenharmony_ci
28340d163575Sopenharmony_ci    CHECK_ASPACE(evs, sizeof(struct epoll_event));
28350d163575Sopenharmony_ci    CPY_FROM_USER(evs);
28360d163575Sopenharmony_ci
28370d163575Sopenharmony_ci    epfd = GetAssociatedSystemFd(epfd);
28380d163575Sopenharmony_ci    if (epfd < 0) {
28390d163575Sopenharmony_ci        ret = -EBADF;
28400d163575Sopenharmony_ci        goto OUT;
28410d163575Sopenharmony_ci    }
28420d163575Sopenharmony_ci
28430d163575Sopenharmony_ci    OsSigprocMask(SIG_SETMASK, &setl, &origMask);
28440d163575Sopenharmony_ci    ret = epoll_wait(epfd, evs, maxevents, timeout);
28450d163575Sopenharmony_ci    if (ret < 0) {
28460d163575Sopenharmony_ci        ret = -get_errno();
28470d163575Sopenharmony_ci    }
28480d163575Sopenharmony_ci
28490d163575Sopenharmony_ci    OsSigprocMask(SIG_SETMASK, &origMask, NULL);
28500d163575Sopenharmony_ci
28510d163575Sopenharmony_ci    CPY_TO_USER(evs);
28520d163575Sopenharmony_ciOUT:
28530d163575Sopenharmony_ci    return (ret == -1) ? -get_errno() : ret;
28540d163575Sopenharmony_ci}
28550d163575Sopenharmony_ci
28560d163575Sopenharmony_ci#ifdef LOSCFG_CHROOT
28570d163575Sopenharmony_ciint SysChroot(const char *path)
28580d163575Sopenharmony_ci{
28590d163575Sopenharmony_ci    int ret;
28600d163575Sopenharmony_ci    char *pathRet = NULL;
28610d163575Sopenharmony_ci
28620d163575Sopenharmony_ci    if (path != NULL) {
28630d163575Sopenharmony_ci        ret = UserPathCopy(path, &pathRet);
28640d163575Sopenharmony_ci        if (ret != 0) {
28650d163575Sopenharmony_ci            goto OUT;
28660d163575Sopenharmony_ci        }
28670d163575Sopenharmony_ci    }
28680d163575Sopenharmony_ci
28690d163575Sopenharmony_ci    ret = chroot(path ? pathRet : NULL);
28700d163575Sopenharmony_ci    if (ret < 0) {
28710d163575Sopenharmony_ci        ret = -get_errno();
28720d163575Sopenharmony_ci    }
28730d163575Sopenharmony_ciOUT:
28740d163575Sopenharmony_ci    if (pathRet != NULL) {
28750d163575Sopenharmony_ci        (void)LOS_MemFree(OS_SYS_MEM_ADDR, pathRet);
28760d163575Sopenharmony_ci    }
28770d163575Sopenharmony_ci    return ret;
28780d163575Sopenharmony_ci}
28790d163575Sopenharmony_ci#endif
28800d163575Sopenharmony_ci#endif
2881