xref: /aosp_15_r20/external/llvm-libc/src/spawn/file_actions.h (revision 71db0c75aadcf003ffe3238005f61d7618a3fead)
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