1/* 2 * Copyright (c) 2021-2021 Huawei Device Co., Ltd. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without modification, 5 * are permitted provided that the following conditions are met: 6 * 7 * 1. Redistributions of source code must retain the above copyright notice, this list of 8 * conditions and the following disclaimer. 9 * 10 * 2. Redistributions in binary form must reproduce the above copyright notice, this list 11 * of conditions and the following disclaimer in the documentation and/or other materials 12 * provided with the distribution. 13 * 14 * 3. Neither the name of the copyright holder nor the names of its contributors may be used 15 * to endorse or promote products derived from this software without specific prior written 16 * permission. 17 * 18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 20 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 21 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR 22 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 23 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 24 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 25 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 26 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 27 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 28 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29 */ 30 31/**************************************************************************** 32 * Included Files 33 ****************************************************************************/ 34#include "fs/file.h" 35#include "fs/fs_operation.h" 36#include "fs/fd_table.h" 37#include "unistd.h" 38 39/**************************************************************************** 40 * Public Functions 41 ****************************************************************************/ 42void CloseOnExec(struct files_struct *files) 43{ 44 int sysFd; 45 if ((files == NULL) || (files->fdt == NULL)) { 46 return; 47 } 48 49 for (int i = 0; i < files->fdt->max_fds; i++) { 50 if (FD_ISSET(i, files->fdt->proc_fds) && 51 FD_ISSET(i, files->fdt->cloexec_fds)) { 52 sysFd = DisassociateProcessFd(i); 53 if (sysFd >= 0) { 54 close(sysFd); 55 } 56 57 FreeProcessFd(i); 58 } 59 } 60} 61 62void SetCloexecFlag(int procFd) 63{ 64 struct fd_table_s *fdt = GetFdTable(); 65 if (fdt == NULL) { 66 return; 67 } 68 69 FileTableLock(fdt); 70 FD_SET(procFd, fdt->cloexec_fds); 71 FileTableUnLock(fdt); 72 return; 73} 74 75bool CheckCloexecFlag(int procFd) 76{ 77 bool isCloexec = 0; 78 struct fd_table_s *fdt = GetFdTable(); 79 if (fdt == NULL) { 80 return false; 81 } 82 83 FileTableLock(fdt); 84 isCloexec = FD_ISSET(procFd, fdt->cloexec_fds); 85 FileTableUnLock(fdt); 86 return isCloexec; 87} 88 89void ClearCloexecFlag(int procFd) 90{ 91 struct fd_table_s *fdt = GetFdTable(); 92 if (fdt == NULL) { 93 return; 94 } 95 96 FileTableLock(fdt); 97 FD_CLR(procFd, fdt->cloexec_fds); 98 FileTableUnLock(fdt); 99 return; 100} 101