~ubuntu-branches/ubuntu/trusty/golang/trusty

« back to all changes in this revision

Viewing changes to src/pkg/syscall/syscall_linux.go

  • Committer: Package Import Robot
  • Author(s): James Page
  • Date: 2013-08-20 14:06:23 UTC
  • mfrom: (14.1.23 saucy-proposed)
  • Revision ID: package-import@ubuntu.com-20130820140623-b414jfxi3m0qkmrq
Tags: 2:1.1.2-2ubuntu1
* Merge from Debian unstable (LP: #1211749, #1202027). Remaining changes:
  - 016-armhf-elf-header.patch: Use correct ELF header for armhf binaries.
  - d/control,control.cross: Update Breaks/Replaces for Ubuntu
    versions to ensure smooth upgrades, regenerate control file.

Show diffs side-by-side

added added

removed removed

Lines of Context:
18
18
 */
19
19
 
20
20
//sys   open(path string, mode int, perm uint32) (fd int, err error)
 
21
 
21
22
func Open(path string, mode int, perm uint32) (fd int, err error) {
22
23
        return open(path, mode|O_LARGEFILE, perm)
23
24
}
24
25
 
25
26
//sys   openat(dirfd int, path string, flags int, mode uint32) (fd int, err error)
 
27
 
26
28
func Openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) {
27
29
        return openat(dirfd, path, flags|O_LARGEFILE, mode)
28
30
}
29
31
 
30
32
//sysnb pipe(p *[2]_C_int) (err error)
 
33
 
31
34
func Pipe(p []int) (err error) {
32
35
        if len(p) != 2 {
33
36
                return EINVAL
39
42
        return
40
43
}
41
44
 
 
45
//sysnb pipe2(p *[2]_C_int, flags int) (err error)
 
46
 
 
47
func Pipe2(p []int, flags int) (err error) {
 
48
        if len(p) != 2 {
 
49
                return EINVAL
 
50
        }
 
51
        var pp [2]_C_int
 
52
        err = pipe2(&pp, flags)
 
53
        p[0] = int(pp[0])
 
54
        p[1] = int(pp[1])
 
55
        return
 
56
}
 
57
 
42
58
//sys   utimes(path string, times *[2]Timeval) (err error)
 
59
 
43
60
func Utimes(path string, tv []Timeval) (err error) {
44
61
        if len(tv) != 2 {
45
62
                return EINVAL
47
64
        return utimes(path, (*[2]Timeval)(unsafe.Pointer(&tv[0])))
48
65
}
49
66
 
 
67
//sys   utimensat(dirfd int, path string, times *[2]Timespec) (err error)
 
68
 
 
69
func UtimesNano(path string, ts []Timespec) (err error) {
 
70
        if len(ts) != 2 {
 
71
                return EINVAL
 
72
        }
 
73
        err = utimensat(_AT_FDCWD, path, (*[2]Timespec)(unsafe.Pointer(&ts[0])))
 
74
        if err != ENOSYS {
 
75
                return err
 
76
        }
 
77
        // If the utimensat syscall isn't available (utimensat was added to Linux
 
78
        // in 2.6.22, Released, 8 July 2007) then fall back to utimes
 
79
        var tv [2]Timeval
 
80
        for i := 0; i < 2; i++ {
 
81
                tv[i].Sec = ts[i].Sec
 
82
                tv[i].Usec = ts[i].Nsec / 1000
 
83
        }
 
84
        return utimes(path, (*[2]Timeval)(unsafe.Pointer(&tv[0])))
 
85
}
 
86
 
50
87
//sys   futimesat(dirfd int, path *byte, times *[2]Timeval) (err error)
 
88
 
51
89
func Futimesat(dirfd int, path string, tv []Timeval) (err error) {
52
90
        if len(tv) != 2 {
53
91
                return EINVAL
54
92
        }
55
 
        return futimesat(dirfd, StringBytePtr(path), (*[2]Timeval)(unsafe.Pointer(&tv[0])))
 
93
        pathp, err := BytePtrFromString(path)
 
94
        if err != nil {
 
95
                return err
 
96
        }
 
97
        return futimesat(dirfd, pathp, (*[2]Timeval)(unsafe.Pointer(&tv[0])))
56
98
}
57
99
 
58
100
func Futimes(fd int, tv []Timeval) (err error) {
64
106
const ImplementsGetwd = true
65
107
 
66
108
//sys   Getcwd(buf []byte) (n int, err error)
 
109
 
67
110
func Getwd() (wd string, err error) {
68
111
        var buf [PathMax]byte
69
112
        n, err := Getcwd(buf[0:])
173
216
}
174
217
 
175
218
//sys   wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error)
 
219
 
176
220
func Wait4(pid int, wstatus *WaitStatus, options int, rusage *Rusage) (wpid int, err error) {
177
221
        var status _C_int
178
222
        wpid, err = wait4(pid, &status, options, rusage)
244
288
func (sa *SockaddrUnix) sockaddr() (uintptr, _Socklen, error) {
245
289
        name := sa.Name
246
290
        n := len(name)
247
 
        if n >= len(sa.raw.Path) || n == 0 {
 
291
        if n >= len(sa.raw.Path) {
248
292
                return 0, 0, EINVAL
249
293
        }
250
294
        sa.raw.Family = AF_UNIX
252
296
                sa.raw.Path[i] = int8(name[i])
253
297
        }
254
298
        // length is family (uint16), name, NUL.
255
 
        sl := 2 + _Socklen(n) + 1
 
299
        sl := _Socklen(2)
 
300
        if n > 0 {
 
301
                sl += _Socklen(n) + 1
 
302
        }
256
303
        if sa.raw.Path[0] == '@' {
257
304
                sa.raw.Path[0] = 0
258
305
                // Don't count trailing NUL for abstract address.
392
439
        return
393
440
}
394
441
 
 
442
func Accept4(fd int, flags int) (nfd int, sa Sockaddr, err error) {
 
443
        var rsa RawSockaddrAny
 
444
        var len _Socklen = SizeofSockaddrAny
 
445
        nfd, err = accept4(fd, &rsa, &len, flags)
 
446
        if err != nil {
 
447
                return
 
448
        }
 
449
        sa, err = anyToSockaddr(&rsa)
 
450
        if err != nil {
 
451
                Close(nfd)
 
452
                nfd = 0
 
453
        }
 
454
        return
 
455
}
 
456
 
395
457
func Getsockname(fd int) (sa Sockaddr, err error) {
396
458
        var rsa RawSockaddrAny
397
459
        var len _Socklen = SizeofSockaddrAny
435
497
}
436
498
 
437
499
func Socketpair(domain, typ, proto int) (fd [2]int, err error) {
438
 
        err = socketpair(domain, typ, proto, &fd)
 
500
        var fdx [2]int32
 
501
        err = socketpair(domain, typ, proto, &fdx)
 
502
        if err == nil {
 
503
                fd[0] = int(fdx[0])
 
504
                fd[1] = int(fdx[1])
 
505
        }
439
506
        return
440
507
}
441
508
 
473
540
        return &value, err
474
541
}
475
542
 
 
543
func GetsockoptUcred(fd, level, opt int) (*Ucred, error) {
 
544
        var value Ucred
 
545
        vallen := _Socklen(SizeofUcred)
 
546
        err := getsockopt(fd, level, opt, uintptr(unsafe.Pointer(&value)), &vallen)
 
547
        return &value, err
 
548
}
 
549
 
476
550
func SetsockoptInt(fd, level, opt int, value int) (err error) {
477
551
        var n = int32(value)
478
552
        return setsockopt(fd, level, opt, uintptr(unsafe.Pointer(&n)), 4)
512
586
        if n, err = recvfrom(fd, p, flags, &rsa, &len); err != nil {
513
587
                return
514
588
        }
515
 
        from, err = anyToSockaddr(&rsa)
 
589
        if rsa.Addr.Family != AF_UNSPEC {
 
590
                from, err = anyToSockaddr(&rsa)
 
591
        }
516
592
        return
517
593
}
518
594
 
731
807
        return ptrace(PTRACE_CONT, pid, 0, uintptr(signal))
732
808
}
733
809
 
 
810
func PtraceSyscall(pid int, signal int) (err error) {
 
811
        return ptrace(PTRACE_SYSCALL, pid, 0, uintptr(signal))
 
812
}
 
813
 
734
814
func PtraceSingleStep(pid int) (err error) { return ptrace(PTRACE_SINGLESTEP, pid, 0, 0) }
735
815
 
736
816
func PtraceAttach(pid int) (err error) { return ptrace(PTRACE_ATTACH, pid, 0, 0) }
738
818
func PtraceDetach(pid int) (err error) { return ptrace(PTRACE_DETACH, pid, 0, 0) }
739
819
 
740
820
//sys   reboot(magic1 uint, magic2 uint, cmd int, arg string) (err error)
 
821
 
741
822
func Reboot(cmd int) (err error) {
742
823
        return reboot(LINUX_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC2, cmd, "")
743
824
}
777
858
}
778
859
 
779
860
//sys   mount(source string, target string, fstype string, flags uintptr, data *byte) (err error)
 
861
 
780
862
func Mount(source string, target string, fstype string, flags uintptr, data string) (err error) {
781
863
        // Certain file systems get rather angry and EINVAL if you give
782
864
        // them an empty string of data, rather than NULL.
783
865
        if data == "" {
784
866
                return mount(source, target, fstype, flags, nil)
785
867
        }
786
 
        return mount(source, target, fstype, flags, StringBytePtr(data))
 
868
        datap, err := BytePtrFromString(data)
 
869
        if err != nil {
 
870
                return err
 
871
        }
 
872
        return mount(source, target, fstype, flags, datap)
787
873
}
788
874
 
789
875
// Sendto
823
909
//sysnb Getpgrp() (pid int)
824
910
//sysnb Getpid() (pid int)
825
911
//sysnb Getppid() (ppid int)
826
 
//sysnb Getrlimit(resource int, rlim *Rlimit) (err error)
827
912
//sysnb Getrusage(who int, rusage *Rusage) (err error)
828
913
//sysnb Gettid() (tid int)
 
914
//sys   Getxattr(path string, attr string, dest []byte) (sz int, err error)
829
915
//sys   InotifyAddWatch(fd int, pathname string, mask uint32) (watchdesc int, err error)
830
916
//sysnb InotifyInit() (fd int, err error)
831
917
//sysnb InotifyInit1(flags int) (fd int, err error)
833
919
//sysnb Kill(pid int, sig Signal) (err error)
834
920
//sys   Klogctl(typ int, buf []byte) (n int, err error) = SYS_SYSLOG
835
921
//sys   Link(oldpath string, newpath string) (err error)
 
922
//sys   Listxattr(path string, dest []byte) (sz int, err error)
836
923
//sys   Mkdir(path string, mode uint32) (err error)
837
924
//sys   Mkdirat(dirfd int, path string, mode uint32) (err error)
838
925
//sys   Mknod(path string, mode uint32, dev int) (err error)
840
927
//sys   Nanosleep(time *Timespec, leftover *Timespec) (err error)
841
928
//sys   Pause() (err error)
842
929
//sys   PivotRoot(newroot string, putold string) (err error) = SYS_PIVOT_ROOT
843
 
//sys   Read(fd int, p []byte) (n int, err error)
 
930
//sysnb prlimit(pid int, resource int, old *Rlimit, newlimit *Rlimit) (err error) = SYS_PRLIMIT64
 
931
//sys   read(fd int, p []byte) (n int, err error)
844
932
//sys   Readlink(path string, buf []byte) (n int, err error)
 
933
//sys   Removexattr(path string, attr string) (err error)
845
934
//sys   Rename(oldpath string, newpath string) (err error)
846
935
//sys   Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error)
847
936
//sys   Rmdir(path string) (err error)
848
937
//sys   Setdomainname(p []byte) (err error)
849
938
//sys   Sethostname(p []byte) (err error)
850
939
//sysnb Setpgid(pid int, pgid int) (err error)
851
 
//sysnb Setrlimit(resource int, rlim *Rlimit) (err error)
852
940
//sysnb Setsid() (pid int, err error)
853
941
//sysnb Settimeofday(tv *Timeval) (err error)
854
942
//sysnb Setuid(uid int) (err error)
 
943
//sys   Setxattr(path string, attr string, data []byte, flags int) (err error)
855
944
//sys   Symlink(oldpath string, newpath string) (err error)
856
945
//sys   Sync()
857
946
//sysnb Sysinfo(info *Sysinfo_t) (err error)
866
955
//sys   Unshare(flags int) (err error)
867
956
//sys   Ustat(dev int, ubuf *Ustat_t) (err error)
868
957
//sys   Utime(path string, buf *Utimbuf) (err error)
869
 
//sys   Write(fd int, p []byte) (n int, err error)
 
958
//sys   write(fd int, p []byte) (n int, err error)
870
959
//sys   exitThread(code int) (err error) = SYS_EXIT
871
 
//sys   read(fd int, p *byte, np int) (n int, err error)
872
 
//sys   write(fd int, p *byte, np int) (n int, err error)
 
960
//sys   readlen(fd int, p *byte, np int) (n int, err error) = SYS_READ
 
961
//sys   writelen(fd int, p *byte, np int) (n int, err error) = SYS_WRITE
873
962
 
874
963
// mmap varies by architecture; see syscall_linux_*.go.
875
964
//sys   munmap(addr uintptr, length uintptr) (err error)
931
1020
// Getitimer
932
1021
// Getpmsg
933
1022
// Getpriority
934
 
// Getxattr
935
1023
// IoCancel
936
1024
// IoDestroy
937
1025
// IoGetevents
943
1031
// KexecLoad
944
1032
// Keyctl
945
1033
// Lgetxattr
946
 
// Listxattr
947
1034
// Llistxattr
948
1035
// LookupDcookie
949
1036
// Lremovexattr
981
1068
// Readahead
982
1069
// Readv
983
1070
// RemapFilePages
984
 
// Removexattr
985
1071
// RequestKey
986
1072
// RestartSyscall
987
1073
// RtSigaction
1010
1096
// SetThreadArea
1011
1097
// SetTidAddress
1012
1098
// Setpriority
1013
 
// Setxattr
1014
1099
// Shmat
1015
1100
// Shmctl
1016
1101
// Shmdt
1036
1121
// Vmsplice
1037
1122
// Vserver
1038
1123
// Waitid
1039
 
// Writev
1040
1124
// _Sysctl