Text file
src/runtime/cgo/linux_syscall.c
1 // Copyright 2019 The Go Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style
3 // license that can be found in the LICENSE file.
4
5 //go:build linux
6
7 #ifndef _GNU_SOURCE // setres[ug]id() API.
8 #define _GNU_SOURCE
9 #endif
10
11 #include <grp.h>
12 #include <sys/types.h>
13 #include <unistd.h>
14 #include <errno.h>
15 #include "libcgo.h"
16
17 /*
18 * Assumed POSIX compliant libc system call wrappers. For linux, the
19 * glibc/nptl/setxid mechanism ensures that POSIX semantics are
20 * honored for all pthreads (by default), and this in turn with cgo
21 * ensures that all Go threads launched with cgo are kept in sync for
22 * these function calls.
23 */
24
25 // argset_t matches runtime/cgocall.go:argset.
26 typedef struct {
27 uintptr_t* args;
28 uintptr_t retval;
29 } argset_t;
30
31 // libc backed posix-compliant syscalls.
32
33 #define SET_RETVAL(fn) \
34 uintptr_t ret = (uintptr_t) fn ; \
35 if (ret == (uintptr_t) -1) { \
36 x->retval = (uintptr_t) errno; \
37 } else \
38 x->retval = ret
39
40 void
41 _cgo_libc_setegid(argset_t* x) {
42 SET_RETVAL(setegid((gid_t) x->args[0]));
43 }
44
45 void
46 _cgo_libc_seteuid(argset_t* x) {
47 SET_RETVAL(seteuid((uid_t) x->args[0]));
48 }
49
50 void
51 _cgo_libc_setgid(argset_t* x) {
52 SET_RETVAL(setgid((gid_t) x->args[0]));
53 }
54
55 void
56 _cgo_libc_setgroups(argset_t* x) {
57 SET_RETVAL(setgroups((size_t) x->args[0], (const gid_t *) x->args[1]));
58 }
59
60 void
61 _cgo_libc_setregid(argset_t* x) {
62 SET_RETVAL(setregid((gid_t) x->args[0], (gid_t) x->args[1]));
63 }
64
65 void
66 _cgo_libc_setresgid(argset_t* x) {
67 SET_RETVAL(setresgid((gid_t) x->args[0], (gid_t) x->args[1],
68 (gid_t) x->args[2]));
69 }
70
71 void
72 _cgo_libc_setresuid(argset_t* x) {
73 SET_RETVAL(setresuid((uid_t) x->args[0], (uid_t) x->args[1],
74 (uid_t) x->args[2]));
75 }
76
77 void
78 _cgo_libc_setreuid(argset_t* x) {
79 SET_RETVAL(setreuid((uid_t) x->args[0], (uid_t) x->args[1]));
80 }
81
82 void
83 _cgo_libc_setuid(argset_t* x) {
84 SET_RETVAL(setuid((uid_t) x->args[0]));
85 }
86
View as plain text