ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/Linux-Clone/Clone.xs
(Generate patch)

Comparing Linux-Clone/Clone.xs (file contents):
Revision 1.2 by root, Wed Aug 24 03:34:24 2016 UTC vs.
Revision 1.10 by root, Fri Jul 7 07:47:03 2023 UTC

6#include <sys/mman.h> 6#include <sys/mman.h>
7 7
8#undef _GNU_SOURCE 8#undef _GNU_SOURCE
9#define _GNU_SOURCE 9#define _GNU_SOURCE
10#include <sched.h> 10#include <sched.h>
11#include <unistd.h>
12#include <sys/syscall.h>
13
14#include <sched.h>
15
16#include <sys/ioctl.h>
17#include <net/if.h>
18
19#include <linux/nsfs.h>
20#include <linux/kcmp.h>
21
22/* kcmp.h does not define symbols, so there is no way to detect preesence of enum */
23/* members, so we just hardcode new symbols here. */
24#ifndef KCMP_EPOLL_TFD
25 #define KCMP_EPOLL_TFD 7
26#endif
27
28#ifdef __has_include
29 #if !__has_include("linux/kcmp.h") // use "" as GCC wrongly expands macros
30 #undef SYS_kcmp
31 #endif
32#endif
33
34#ifdef SYS_kcmp
35 #include "linux/kcmp.h"
36 #define kcmp(pid1,pid2,type,idx1,idx2) \
37 syscall (SYS_kcmp, (pid_t)pid1, (pid_t)pid2, \
38 (int)type, (unsigned long)idx1, (unsigned long)idx2)
39#else
40 #define kcmp(pid1,pid2,type,idx1,idx2) \
41 (errno = ENOSYS, -1)
42#endif
11 43
12/* from schmorp.h */ 44/* from schmorp.h */
13static int 45static int
14s_fileno (SV *fh, int wr) 46s_fileno (SV *fh, int wr)
15{ 47{
56 88
57 static const struct { 89 static const struct {
58 const char *name; 90 const char *name;
59 IV iv; 91 IV iv;
60 } *civ, const_iv[] = { 92 } *civ, const_iv[] = {
93# define const_iv(name) { # name, (IV)name },
61# define const_iv(name) { # name, (IV) CLONE_ ## name }, 94# define const_iv_clone(name) { # name, (IV) CLONE_ ## name },
95# ifdef CSIGNAL
96 const_iv (CSIGNAL)
97# endif
62# ifdef CLONE_FILES 98# ifdef CLONE_FILES
63 const_iv (FILES) 99 const_iv_clone (FILES)
64# endif 100# endif
65# ifdef CLONE_FS 101# ifdef CLONE_FS
66 const_iv (FS) 102 const_iv_clone (FS)
67# endif 103# endif
68# ifdef CLONE_NEWNS 104# ifdef CLONE_NEWNS
69 const_iv (NEWNS) 105 const_iv_clone (NEWNS)
70# endif 106# endif
71# ifdef CLONE_VM 107# ifdef CLONE_VM
72 const_iv (VM) 108 const_iv_clone (VM)
73# endif 109# endif
74# ifdef CLONE_THREAD 110# ifdef CLONE_THREAD
75 const_iv (THREAD) 111 const_iv_clone (THREAD)
76# endif 112# endif
77# ifdef CLONE_SIGHAND 113# ifdef CLONE_SIGHAND
78 const_iv (SIGHAND) 114 const_iv_clone (SIGHAND)
79# endif 115# endif
80# ifdef CLONE_SYSVSEM 116# ifdef CLONE_SYSVSEM
81 const_iv (SYSVSEM) 117 const_iv_clone (SYSVSEM)
82# endif 118# endif
83# ifdef CLONE_NEWUTS 119# ifdef CLONE_NEWUTS
84 const_iv (NEWUTS) 120 const_iv_clone (NEWUTS)
85# endif 121# endif
86# ifdef CLONE_NEWIPC 122# ifdef CLONE_NEWIPC
87 const_iv (NEWIPC) 123 const_iv_clone (NEWIPC)
88# endif 124# endif
89# ifdef CLONE_NEWNET 125# ifdef CLONE_NEWNET
90 const_iv (NEWNET) 126 const_iv_clone (NEWNET)
127# endif
128# ifdef CLONE_NEWTIME
129 const_iv_clone (NEWTIME)
91# endif 130# endif
92# ifdef CLONE_PTRACE 131# ifdef CLONE_PTRACE
93 const_iv (PTRACE) 132 const_iv_clone (PTRACE)
94# endif 133# endif
95# ifdef CLONE_VFORK 134# ifdef CLONE_VFORK
96 const_iv (VFORK) 135 const_iv_clone (VFORK)
97# endif 136# endif
98# ifdef CLONE_SETTLS 137# ifdef CLONE_SETTLS
99 const_iv (SETTLS) 138 const_iv_clone (SETTLS)
100# endif 139# endif
101# ifdef CLONE_PARENT_SETTID 140# ifdef CLONE_PARENT_SETTID
102 const_iv (PARENT_SETTID) 141 const_iv_clone (PARENT_SETTID)
103# endif 142# endif
104# ifdef CLONE_CHILD_CLEARTID 143# ifdef CLONE_CHILD_CLEARTID
105 const_iv (CHILD_CLEARTID) 144 const_iv_clone (CHILD_CLEARTID)
106# endif 145# endif
107# ifdef CLONE_DETACHED 146# ifdef CLONE_DETACHED
108 const_iv (DETACHED) 147 const_iv_clone (DETACHED)
109# endif 148# endif
110# ifdef CLONE_UNTRACED 149# ifdef CLONE_UNTRACED
111 const_iv (UNTRACED) 150 const_iv_clone (UNTRACED)
112# endif 151# endif
113# ifdef CLONE_CHILD_SETTID 152# ifdef CLONE_CHILD_SETTID
114 const_iv (CHILD_SETTID) 153 const_iv_clone (CHILD_SETTID)
115# endif 154# endif
116# ifdef CLONE_NEWUSER 155# ifdef CLONE_NEWUSER
117 const_iv (NEWUSER) 156 const_iv_clone (NEWUSER)
118# endif 157# endif
119# ifdef CLONE_NEWPID 158# ifdef CLONE_NEWPID
120 const_iv (NEWPID) 159 const_iv_clone (NEWPID)
121# endif 160# endif
122# ifdef CLONE_IO 161# ifdef CLONE_IO
123 const_iv (IO) 162 const_iv_clone (IO)
124# endif 163# endif
125# ifdef CLONE_NEWCGROUP 164# ifdef CLONE_NEWCGROUP
126 const_iv (NEWCGROUP) 165 const_iv_clone (NEWCGROUP)
166# endif
167# ifdef CLONE_PIDFD
168 const_iv_clone (PIDFD)
169# endif
170# ifdef SYS_kcmp
171 const_iv (KCMP_FILE)
172 const_iv (KCMP_VM)
173 const_iv (KCMP_FILES)
174 const_iv (KCMP_FS)
175 const_iv (KCMP_SIGHAND)
176 const_iv (KCMP_IO)
177 const_iv (KCMP_SYSVSEM)
178 const_iv (KCMP_EPOLL_TFD)
179# endif
180# ifdef NS_GET_USERNS
181 const_iv (NS_GET_USERNS)
182# endif
183# ifdef NS_GET_PARENT
184 const_iv (NS_GET_PARENT)
185# endif
186# ifdef NS_GET_NSTYPE
187 const_iv (NS_GET_NSTYPE)
188# endif
189# ifdef NS_OWNER_UID
190 const_iv (NS_OWNER_UID
127# endif 191# endif
128 }; 192 };
129 193
130 for (civ = const_iv + sizeof (const_iv) / sizeof (const_iv [0]); civ > const_iv; civ--) 194 for (civ = const_iv + sizeof (const_iv) / sizeof (const_iv [0]); civ > const_iv; civ--)
131 newCONSTSUB (stash, (char *)civ[-1].name, newSViv (civ[-1].iv)); 195 newCONSTSUB (stash, (char *)civ[-1].name, newSViv (civ[-1].iv));
159 munmap (stack_ptr, stacksize); 223 munmap (stack_ptr, stacksize);
160 errno = old_errno; 224 errno = old_errno;
161 } 225 }
162 } 226 }
163} 227}
164 OUTPUT: 228 OUTPUT: RETVAL
165 RETVAL
166 229
167int 230int
168unshare (int flags) 231unshare (int flags)
232 PROTOTYPE: @
169 233
170int 234int
171setns (SV *fh_or_fd, int nstype = 0) 235setns (SV *fh_or_fd, int nstype = 0)
172 C_ARGS: s_fileno (fh_or_fd, 0), nstype 236 C_ARGS: s_fileno (fh_or_fd, 0), nstype
237
238int
239pivot_root (SV *new_root, SV *old_root)
240 CODE:
241 RETVAL = syscall (SYS_pivot_root,
242 (const char *)SvPVbyte_nolen (new_root),
243 (const char *)SvPVbyte_nolen (old_root));
244 OUTPUT: RETVAL
245
246int
247kcmp (IV pid1, IV pid2, IV type, UV idx1 = 0, UV idx2 = 0)
248
249int
250siocsifflags (char *ifname, U32 flags = IFF_UP)
251 CODE:
252{
253 int saved_errno;
254 struct ifreq ifr;
255 int fd = socket (AF_INET, SOCK_DGRAM, 0);
256 strncpy (ifr.ifr_name, ifname, sizeof (ifr.ifr_name));
257 RETVAL = ioctl (fd, SIOCSIFFLAGS, &ifr);
258 saved_errno = errno;
259 close (fd);
260 errno = saved_errno;
261}
262 OUTPUT: RETVAL
263

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines