xref: /llvm-project/libc/src/spawn/file_actions.h (revision 5ff3ff33ff930e4ec49da7910612d8a41eb068cb)
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