128943d61SSiva Chandra Reddy //===-- Spawn file actions -------------------------------------*- C++ -*-===// 228943d61SSiva Chandra Reddy // 328943d61SSiva Chandra Reddy // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 428943d61SSiva Chandra Reddy // See https://llvm.org/LICENSE.txt for license information. 528943d61SSiva Chandra Reddy // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 628943d61SSiva Chandra Reddy // 728943d61SSiva Chandra Reddy //===----------------------------------------------------------------------===// 828943d61SSiva Chandra Reddy 928943d61SSiva Chandra Reddy #ifndef LLVM_LIBC_SRC_SPAWN_FILE_ACTIONS_H 1028943d61SSiva Chandra Reddy #define LLVM_LIBC_SRC_SPAWN_FILE_ACTIONS_H 1128943d61SSiva Chandra Reddy 12*5ff3ff33SPetr Hosek #include "src/__support/macros/config.h" 1328943d61SSiva Chandra Reddy #include <spawn.h> // For mode_t 1428943d61SSiva Chandra Reddy #include <stdint.h> 1528943d61SSiva Chandra Reddy 16*5ff3ff33SPetr Hosek namespace LIBC_NAMESPACE_DECL { 1728943d61SSiva Chandra Reddy 1828943d61SSiva Chandra Reddy struct BaseSpawnFileAction { 1928943d61SSiva Chandra Reddy enum ActionType { 2028943d61SSiva Chandra Reddy OPEN = 111, 2128943d61SSiva Chandra Reddy CLOSE = 222, 2228943d61SSiva Chandra Reddy DUP2 = 333, 2328943d61SSiva Chandra Reddy }; 2428943d61SSiva Chandra Reddy 2528943d61SSiva Chandra Reddy ActionType type; 2628943d61SSiva Chandra Reddy BaseSpawnFileAction *next; 2728943d61SSiva Chandra Reddy 28f1129601SSiva Chandra Reddy static void add_action(posix_spawn_file_actions_t *actions, 2928943d61SSiva Chandra Reddy BaseSpawnFileAction *act) { 3028943d61SSiva Chandra Reddy if (actions->__back != nullptr) { 3128943d61SSiva Chandra Reddy auto *back = reinterpret_cast<BaseSpawnFileAction *>(actions->__back); 3228943d61SSiva Chandra Reddy back->next = act; 3328943d61SSiva Chandra Reddy actions->__back = act; 3428943d61SSiva Chandra Reddy } else { 3528943d61SSiva Chandra Reddy // First action is being added. 3628943d61SSiva Chandra Reddy actions->__front = actions->__back = act; 3728943d61SSiva Chandra Reddy } 3828943d61SSiva Chandra Reddy } 3928943d61SSiva Chandra Reddy 40f1129601SSiva Chandra Reddy protected: 41f1129601SSiva Chandra Reddy explicit BaseSpawnFileAction(ActionType t) : type(t), next(nullptr) {} 42f1129601SSiva Chandra Reddy }; 43f1129601SSiva Chandra Reddy 44f1129601SSiva Chandra Reddy struct SpawnFileOpenAction : public BaseSpawnFileAction { 45f1129601SSiva Chandra Reddy const char *path; 46f1129601SSiva Chandra Reddy int fd; 47f1129601SSiva Chandra Reddy int oflag; 48f1129601SSiva Chandra Reddy mode_t mode; 49f1129601SSiva Chandra Reddy 50f1129601SSiva Chandra Reddy SpawnFileOpenAction(const char *p, int fdesc, int flags, mode_t m) 51f1129601SSiva Chandra Reddy : BaseSpawnFileAction(BaseSpawnFileAction::OPEN), path(p), fd(fdesc), 52f1129601SSiva Chandra Reddy oflag(flags), mode(m) {} 53f1129601SSiva Chandra Reddy }; 54f1129601SSiva Chandra Reddy 55f1129601SSiva Chandra Reddy struct SpawnFileCloseAction : public BaseSpawnFileAction { 56f1129601SSiva Chandra Reddy int fd; 57f1129601SSiva Chandra Reddy 58f1129601SSiva Chandra Reddy SpawnFileCloseAction(int fdesc) 59f1129601SSiva Chandra Reddy : BaseSpawnFileAction(BaseSpawnFileAction::CLOSE), fd(fdesc) {} 60f1129601SSiva Chandra Reddy }; 61f1129601SSiva Chandra Reddy 62f1129601SSiva Chandra Reddy struct SpawnFileDup2Action : public BaseSpawnFileAction { 63f1129601SSiva Chandra Reddy int fd; 64f1129601SSiva Chandra Reddy int newfd; 65f1129601SSiva Chandra Reddy 66f1129601SSiva Chandra Reddy SpawnFileDup2Action(int fdesc, int new_fdesc) 67f1129601SSiva Chandra Reddy : BaseSpawnFileAction(BaseSpawnFileAction::DUP2), fd(fdesc), 68f1129601SSiva Chandra Reddy newfd(new_fdesc) {} 69f1129601SSiva Chandra Reddy }; 70f1129601SSiva Chandra Reddy 71*5ff3ff33SPetr Hosek } // namespace LIBC_NAMESPACE_DECL 7228943d61SSiva Chandra Reddy 7328943d61SSiva Chandra Reddy #endif // LLVM_LIBC_SRC_SPAWN_FILE_ACTIONS_H 74