1*71db0c75SAndroid Build Coastguard Worker //===-- Spawn file actions -------------------------------------*- C++ -*-===// 2*71db0c75SAndroid Build Coastguard Worker // 3*71db0c75SAndroid Build Coastguard Worker // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*71db0c75SAndroid Build Coastguard Worker // See https://llvm.org/LICENSE.txt for license information. 5*71db0c75SAndroid Build Coastguard Worker // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*71db0c75SAndroid Build Coastguard Worker // 7*71db0c75SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===// 8*71db0c75SAndroid Build Coastguard Worker 9*71db0c75SAndroid Build Coastguard Worker #ifndef LLVM_LIBC_SRC_SPAWN_FILE_ACTIONS_H 10*71db0c75SAndroid Build Coastguard Worker #define LLVM_LIBC_SRC_SPAWN_FILE_ACTIONS_H 11*71db0c75SAndroid Build Coastguard Worker 12*71db0c75SAndroid Build Coastguard Worker #include "src/__support/macros/config.h" 13*71db0c75SAndroid Build Coastguard Worker #include <spawn.h> // For mode_t 14*71db0c75SAndroid Build Coastguard Worker #include <stdint.h> 15*71db0c75SAndroid Build Coastguard Worker 16*71db0c75SAndroid Build Coastguard Worker namespace LIBC_NAMESPACE_DECL { 17*71db0c75SAndroid Build Coastguard Worker 18*71db0c75SAndroid Build Coastguard Worker struct BaseSpawnFileAction { 19*71db0c75SAndroid Build Coastguard Worker enum ActionType { 20*71db0c75SAndroid Build Coastguard Worker OPEN = 111, 21*71db0c75SAndroid Build Coastguard Worker CLOSE = 222, 22*71db0c75SAndroid Build Coastguard Worker DUP2 = 333, 23*71db0c75SAndroid Build Coastguard Worker }; 24*71db0c75SAndroid Build Coastguard Worker 25*71db0c75SAndroid Build Coastguard Worker ActionType type; 26*71db0c75SAndroid Build Coastguard Worker BaseSpawnFileAction *next; 27*71db0c75SAndroid Build Coastguard Worker add_actionBaseSpawnFileAction28*71db0c75SAndroid Build Coastguard Worker static void add_action(posix_spawn_file_actions_t *actions, 29*71db0c75SAndroid Build Coastguard Worker BaseSpawnFileAction *act) { 30*71db0c75SAndroid Build Coastguard Worker if (actions->__back != nullptr) { 31*71db0c75SAndroid Build Coastguard Worker auto *back = reinterpret_cast<BaseSpawnFileAction *>(actions->__back); 32*71db0c75SAndroid Build Coastguard Worker back->next = act; 33*71db0c75SAndroid Build Coastguard Worker actions->__back = act; 34*71db0c75SAndroid Build Coastguard Worker } else { 35*71db0c75SAndroid Build Coastguard Worker // First action is being added. 36*71db0c75SAndroid Build Coastguard Worker actions->__front = actions->__back = act; 37*71db0c75SAndroid Build Coastguard Worker } 38*71db0c75SAndroid Build Coastguard Worker } 39*71db0c75SAndroid Build Coastguard Worker 40*71db0c75SAndroid Build Coastguard Worker protected: BaseSpawnFileActionBaseSpawnFileAction41*71db0c75SAndroid Build Coastguard Worker explicit BaseSpawnFileAction(ActionType t) : type(t), next(nullptr) {} 42*71db0c75SAndroid Build Coastguard Worker }; 43*71db0c75SAndroid Build Coastguard Worker 44*71db0c75SAndroid Build Coastguard Worker struct SpawnFileOpenAction : public BaseSpawnFileAction { 45*71db0c75SAndroid Build Coastguard Worker const char *path; 46*71db0c75SAndroid Build Coastguard Worker int fd; 47*71db0c75SAndroid Build Coastguard Worker int oflag; 48*71db0c75SAndroid Build Coastguard Worker mode_t mode; 49*71db0c75SAndroid Build Coastguard Worker SpawnFileOpenActionSpawnFileOpenAction50*71db0c75SAndroid Build Coastguard Worker SpawnFileOpenAction(const char *p, int fdesc, int flags, mode_t m) 51*71db0c75SAndroid Build Coastguard Worker : BaseSpawnFileAction(BaseSpawnFileAction::OPEN), path(p), fd(fdesc), 52*71db0c75SAndroid Build Coastguard Worker oflag(flags), mode(m) {} 53*71db0c75SAndroid Build Coastguard Worker }; 54*71db0c75SAndroid Build Coastguard Worker 55*71db0c75SAndroid Build Coastguard Worker struct SpawnFileCloseAction : public BaseSpawnFileAction { 56*71db0c75SAndroid Build Coastguard Worker int fd; 57*71db0c75SAndroid Build Coastguard Worker SpawnFileCloseActionSpawnFileCloseAction58*71db0c75SAndroid Build Coastguard Worker SpawnFileCloseAction(int fdesc) 59*71db0c75SAndroid Build Coastguard Worker : BaseSpawnFileAction(BaseSpawnFileAction::CLOSE), fd(fdesc) {} 60*71db0c75SAndroid Build Coastguard Worker }; 61*71db0c75SAndroid Build Coastguard Worker 62*71db0c75SAndroid Build Coastguard Worker struct SpawnFileDup2Action : public BaseSpawnFileAction { 63*71db0c75SAndroid Build Coastguard Worker int fd; 64*71db0c75SAndroid Build Coastguard Worker int newfd; 65*71db0c75SAndroid Build Coastguard Worker SpawnFileDup2ActionSpawnFileDup2Action66*71db0c75SAndroid Build Coastguard Worker SpawnFileDup2Action(int fdesc, int new_fdesc) 67*71db0c75SAndroid Build Coastguard Worker : BaseSpawnFileAction(BaseSpawnFileAction::DUP2), fd(fdesc), 68*71db0c75SAndroid Build Coastguard Worker newfd(new_fdesc) {} 69*71db0c75SAndroid Build Coastguard Worker }; 70*71db0c75SAndroid Build Coastguard Worker 71*71db0c75SAndroid Build Coastguard Worker } // namespace LIBC_NAMESPACE_DECL 72*71db0c75SAndroid Build Coastguard Worker 73*71db0c75SAndroid Build Coastguard Worker #endif // LLVM_LIBC_SRC_SPAWN_FILE_ACTIONS_H 74