blob: 21bcce4d17ae5b5f4e86ec2233a0b22f8c9459dd [file] [log] [blame]
// Copyright 2014 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package syscall
#include "runtime.h"
#include "defs_GOOS_GOARCH.h"
#include "os_GOOS.h"
#include "cgocall.h"
#include "../../cmd/ld/textflag.h"
#pragma dynimport libc·chdir chdir "libc.so"
#pragma dynimport libc·chroot chroot "libc.so"
#pragma dynimport libc·close close "libc.so"
#pragma dynimport libc·dlclose dlclose "libc.so"
#pragma dynimport libc·dlopen dlopen "libc.so"
#pragma dynimport libc·dlsym dlsym "libc.so"
#pragma dynimport libc·execve execve "libc.so"
#pragma dynimport libc·fcntl fcntl "libc.so"
#pragma dynimport libc·gethostname gethostname "libc.so"
#pragma dynimport libc·ioctl ioctl "libc.so"
#pragma dynimport libc·pipe pipe "libc.so"
#pragma dynimport libc·setgid setgid "libc.so"
#pragma dynimport libc·setgroups setgroups "libc.so"
#pragma dynimport libc·setsid setsid "libc.so"
#pragma dynimport libc·setuid setuid "libc.so"
#pragma dynimport libc·setpgid setsid "libc.so"
#pragma dynimport libc·syscall syscall "libc.so"
#pragma dynimport libc·forkx forkx "libc.so"
#pragma dynimport libc·wait4 wait4 "libc.so"
extern uintptr libc·chdir;
extern uintptr libc·chroot;
extern uintptr libc·close;
extern uintptr libc·dlclose;
extern uintptr libc·dlopen;
extern uintptr libc·dlsym;
extern uintptr libc·execve;
extern uintptr libc·exit;
extern uintptr libc·fcntl;
extern uintptr libc·gethostname;
extern uintptr libc·ioctl;
extern uintptr libc·pipe;
extern uintptr libc·setgid;
extern uintptr libc·setgroups;
extern uintptr libc·setsid;
extern uintptr libc·setuid;
extern uintptr libc·setpgid;
extern uintptr libc·syscall;
extern uintptr libc·forkx;
extern uintptr libc·wait4;
extern uintptr libc·write;
func sysvicall6(func uintptr, nargs uintptr, a1 uintptr, a2 uintptr, a3 uintptr, a4 uintptr, a5 uintptr, a6 uintptr) (r1 uintptr, r2 uintptr, err uintptr)
{
LibCall c;
USED(a2);
USED(a3);
USED(a4);
USED(a5);
USED(a6);
c.fn = (void*)func;
c.n = nargs;
c.args = (void*)&a1;
runtime·cgocall(runtime·asmsysvicall6, &c);
err = c.err;
r1 = c.r1;
r2 = c.r2;
}
#pragma textflag NOSPLIT
func rawSysvicall6(func uintptr, nargs uintptr, a1 uintptr, a2 uintptr, a3 uintptr, a4 uintptr, a5 uintptr, a6 uintptr) (r1 uintptr, r2 uintptr, err uintptr)
{
LibCall c;
USED(a2);
USED(a3);
USED(a4);
USED(a5);
USED(a6);
c.fn = (void*)func;
c.n = nargs;
c.args = (void*)&a1;
runtime·asmcgocall(runtime·asmsysvicall6, &c);
err = c.err;
r1 = c.r1;
r2 = c.r2;
}
#pragma textflag NOSPLIT
func chdir(path uintptr) (err uintptr) {
LibCall c;
c.fn = (void*)libc·chdir;
c.n = 1;
c.args = (void*)&path;
runtime·asmcgocall(runtime·asmsysvicall6, &c);
err = c.err;
}
#pragma textflag NOSPLIT
func chroot1(path uintptr) (err uintptr) {
LibCall c;
c.fn = (void*)libc·chroot;
c.n = 1;
c.args = (void*)&path;
runtime·asmcgocall(runtime·asmsysvicall6, &c);
err = c.err;
}
#pragma textflag NOSPLIT
func close(fd uintptr) (err uintptr) {
LibCall c;
c.fn = (void*)libc·close;
c.n = 1;
c.args = (void*)&fd;
runtime·asmcgocall(runtime·asmsysvicall6, &c);
err = c.err;
}
func dlclose(handle uintptr) (err uintptr) {
LibCall c;
USED(handle);
c.fn = (void*)libc·dlclose;
c.n = 1;
c.args = (void*)&handle;
runtime·cgocall(runtime·asmsysvicall6, &c);
err = c.r1;
}
func dlopen(name *uint8, mode uintptr) (handle uintptr, err uintptr) {
LibCall c;
USED(mode);
c.fn = (void*)libc·dlopen;
c.n = 2;
c.args = (void*)&name;
runtime·cgocall(runtime·asmsysvicall6, &c);
handle = c.r1;
if(handle == 0)
err = c.err;
else
err = 0;
}
func dlsym(handle uintptr, name *uint8) (proc uintptr, err uintptr) {
LibCall c;
USED(name);
c.fn = (void*)libc·dlsym;
c.n = 2;
c.args = &handle;
runtime·cgocall(runtime·asmsysvicall6, &c);
proc = c.r1;
if(proc == 0)
err = c.err;
else
err = 0;
}
#pragma textflag NOSPLIT
func execve(path uintptr, argv uintptr, envp uintptr) (err uintptr) {
LibCall c;
USED(argv);
USED(envp);
c.fn = (void*)libc·execve;
c.n = 3;
c.args = (void*)&path;
runtime·asmcgocall(runtime·asmsysvicall6, &c);
err = c.err;
}
#pragma textflag NOSPLIT
func exit(code uintptr) {
LibCall c;
c.fn = (void*)libc·exit;
c.n = 1;
c.args = (void*)&code;
runtime·asmcgocall(runtime·asmsysvicall6, &c);
}
#pragma textflag NOSPLIT
func fcntl1(fd uintptr, cmd uintptr, arg uintptr) (val uintptr, err uintptr) {
LibCall c;
USED(cmd);
USED(arg);
c.fn = (void*)libc·fcntl;
c.n = 3;
c.args = (void*)&fd;
runtime·asmcgocall(runtime·asmsysvicall6, &c);
err = c.err;
val = c.r1;
}
func gethostname() (name String, err uintptr) {
struct { uintptr v[2]; } args;
uint8 cname[MAXHOSTNAMELEN];
LibCall c;
c.fn = (void*)libc·gethostname;
c.n = 2;
args.v[0] = (uintptr)&cname[0];
args.v[1] = MAXHOSTNAMELEN;
c.args = (void*)&args;
runtime·cgocall(runtime·asmsysvicall6, &c);
err = c.err;
if(c.r1) {
name = runtime·emptystring;
return;
}
cname[MAXHOSTNAMELEN - 1] = 0;
name = runtime·gostring(cname);
}
#pragma textflag NOSPLIT
func ioctl(fd uintptr, req uintptr, arg uintptr) (err uintptr) {
LibCall c;
USED(req);
USED(arg);
c.fn = (void*)libc·ioctl;
c.n = 3;
c.args = (void*)&fd;
runtime·asmcgocall(runtime·asmsysvicall6, &c);
err = c.err;
}
func wait4(pid uintptr, wstatus *uint32, options uintptr, rusage *void) (wpid int, err uintptr) {
LibCall c;
USED(wstatus);
USED(options);
USED(rusage);
c.fn = (void*)libc·wait4;
c.n = 4;
c.args = (void*)&pid;
runtime·cgocall(runtime·asmsysvicall6, &c);
err = c.err;
wpid = c.r1;
}
#pragma textflag NOSPLIT
func setgid(gid uintptr) (err uintptr) {
LibCall c;
c.fn = (void*)libc·setgid;
c.n = 1;
c.args = (void*)&gid;
runtime·asmcgocall(runtime·asmsysvicall6, &c);
err = c.err;
}
#pragma textflag NOSPLIT
func setgroups1(ngid uintptr, gid uintptr) (err uintptr) {
LibCall c;
USED(gid);
c.fn = (void*)libc·setgroups;
c.n = 2;
c.args = (void*)&ngid;
runtime·asmcgocall(runtime·asmsysvicall6, &c);
err = c.err;
}
#pragma textflag NOSPLIT
func setsid() (pid uintptr, err uintptr) {
LibCall c;
c.fn = (void*)libc·setsid;
c.n = 0;
c.args = (void*)0;
runtime·asmcgocall(runtime·asmsysvicall6, &c);
err = c.err;
pid = c.r1;
}
#pragma textflag NOSPLIT
func setuid(uid uintptr) (err uintptr) {
LibCall c;
c.fn = (void*)libc·setuid;
c.n = 1;
c.args = (void*)&uid;
runtime·asmcgocall(runtime·asmsysvicall6, &c);
err = c.err;
}
#pragma textflag NOSPLIT
func setpgid(pid uintptr, pgid uintptr) (err uintptr) {
LibCall c;
USED(pgid);
c.fn = (void*)libc·setpgid;
c.n = 2;
c.args = (void*)&pid;
runtime·asmcgocall(runtime·asmsysvicall6, &c);
err = c.err;
}
#pragma textflag NOSPLIT
func forkx(flags uintptr) (pid uintptr, err uintptr) {
LibCall c;
c.fn = (void*)libc·forkx;
c.n = 1;
c.args = (void*)&flags;
runtime·asmcgocall(runtime·asmsysvicall6, &c);
err = c.err;
pid = c.r1;
}
void runtime·pipe1(void);
func pipe() (r uintptr, w uintptr, err uintptr) {
LibCall c;
c.fn = (void*)runtime·pipe1;
c.n = 0;
c.args = (void*)0;
runtime·cgocall(runtime·asmsysvicall6, &c);
err = c.err;
r = c.r1;
w = c.r2;
}
#pragma textflag NOSPLIT
func write1(fd uintptr, buf uintptr, nbyte uintptr) (n uintptr, err uintptr) {
LibCall c;
USED(buf);
USED(nbyte);
c.fn = (void*)libc·write;
c.n = 3;
c.args = (void*)fd;
runtime·asmcgocall(runtime·asmsysvicall6, &c);
err = c.err;
n = c.r1;
}
func Syscall(trap uintptr, a1 uintptr, a2 uintptr, a3 uintptr) (r1 uintptr, r2 uintptr, err uintptr) {
LibCall c;
USED(a1);
USED(a2);
USED(a3);
c.fn = (void*)libc·syscall;
c.n = 4;
c.args = &trap;
runtime·cgocall(runtime·asmsysvicall6, &c);
err = c.err;
r1 = c.r1;
r2 = c.r2;
}
func RawSyscall(trap uintptr, a1 uintptr, a2 uintptr, a3 uintptr) (r1 uintptr, r2 uintptr, err uintptr) {
LibCall c;
USED(a1);
USED(a2);
USED(a3);
c.fn = (void*)libc·syscall;
c.n = 4;
c.args = &trap;
runtime·asmcgocall(runtime·asmsysvicall6, &c);
err = c.err;
r1 = c.r1;
r2 = c.r2;
}