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