~john-koepi/ubuntu/trusty/golang/default

« back to all changes in this revision

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

  • Committer: Bazaar Package Importer
  • Author(s): Ondřej Surý
  • Date: 2011-08-03 17:04:59 UTC
  • mfrom: (14.1.2 sid)
  • Revision ID: james.westby@ubuntu.com-20110803170459-wzd99m3567y80ila
Tags: 1:59-1
* Imported Upstream version 59
* Refresh patches to a new release
* Fix FTBFS on ARM (Closes: #634270)
* Update version.bash to work with Debian packaging and not hg
  repository

Show diffs side-by-side

added added

removed removed

Lines of Context:
155
155
//sys   connect(s int, addr uintptr, addrlen _Socklen) (errno int)
156
156
//sysnb socket(domain int, typ int, proto int) (fd int, errno int)
157
157
//sys   getsockopt(s int, level int, name int, val uintptr, vallen *_Socklen) (errno int)
158
 
//sys   setsockopt(s int, level int, name int, val uintptr, vallen int) (errno int)
 
158
//sys   setsockopt(s int, level int, name int, val uintptr, vallen uintptr) (errno int)
159
159
//sysnb getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (errno int)
160
160
//sysnb getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (errno int)
161
161
//sys   Shutdown(s int, how int) (errno int)
400
400
}
401
401
 
402
402
func SetsockoptString(fd, level, opt int, s string) (errno int) {
403
 
        return setsockopt(fd, level, opt, uintptr(unsafe.Pointer(&[]byte(s)[0])), len(s))
 
403
        return setsockopt(fd, level, opt, uintptr(unsafe.Pointer(&[]byte(s)[0])), uintptr(len(s)))
404
404
}
405
405
 
406
406
//sys recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, errno int)
425
425
        return sendto(fd, p, flags, ptr, n)
426
426
}
427
427
 
 
428
//sys   recvmsg(s int, msg *Msghdr, flags int) (n int, errno int)
 
429
 
 
430
func Recvmsg(fd int, p, oob []byte, flags int) (n, oobn int, recvflags int, from Sockaddr, errno int) {
 
431
        var msg Msghdr
 
432
        var rsa RawSockaddrAny
 
433
        msg.Name = (*byte)(unsafe.Pointer(&rsa))
 
434
        msg.Namelen = uint32(SizeofSockaddrAny)
 
435
        var iov Iovec
 
436
        if len(p) > 0 {
 
437
                iov.Base = (*byte)(unsafe.Pointer(&p[0]))
 
438
                iov.SetLen(len(p))
 
439
        }
 
440
        var dummy byte
 
441
        if len(oob) > 0 {
 
442
                // receive at least one normal byte
 
443
                if len(p) == 0 {
 
444
                        iov.Base = &dummy
 
445
                        iov.SetLen(1)
 
446
                }
 
447
                msg.Control = (*byte)(unsafe.Pointer(&oob[0]))
 
448
                msg.SetControllen(len(oob))
 
449
        }
 
450
        msg.Iov = &iov
 
451
        msg.Iovlen = 1
 
452
        if n, errno = recvmsg(fd, &msg, flags); errno != 0 {
 
453
                return
 
454
        }
 
455
        oobn = int(msg.Controllen)
 
456
        recvflags = int(msg.Flags)
 
457
        // source address is only specified if the socket is unconnected
 
458
        if rsa.Addr.Family != AF_UNSPEC {
 
459
                from, errno = anyToSockaddr(&rsa)
 
460
        }
 
461
        return
 
462
}
 
463
 
 
464
//sys   sendmsg(s int, msg *Msghdr, flags int) (errno int)
 
465
 
 
466
func Sendmsg(fd int, p, oob []byte, to Sockaddr, flags int) (errno int) {
 
467
        var ptr uintptr
 
468
        var salen _Socklen
 
469
        if to != nil {
 
470
                var err int
 
471
                ptr, salen, err = to.sockaddr()
 
472
                if err != 0 {
 
473
                        return err
 
474
                }
 
475
        }
 
476
        var msg Msghdr
 
477
        msg.Name = (*byte)(unsafe.Pointer(ptr))
 
478
        msg.Namelen = uint32(salen)
 
479
        var iov Iovec
 
480
        if len(p) > 0 {
 
481
                iov.Base = (*byte)(unsafe.Pointer(&p[0]))
 
482
                iov.SetLen(len(p))
 
483
        }
 
484
        var dummy byte
 
485
        if len(oob) > 0 {
 
486
                // send at least one normal byte
 
487
                if len(p) == 0 {
 
488
                        iov.Base = &dummy
 
489
                        iov.SetLen(1)
 
490
                }
 
491
                msg.Control = (*byte)(unsafe.Pointer(&oob[0]))
 
492
                msg.SetControllen(len(oob))
 
493
        }
 
494
        msg.Iov = &iov
 
495
        msg.Iovlen = 1
 
496
        if errno = sendmsg(fd, &msg, flags); errno != 0 {
 
497
                return
 
498
        }
 
499
        return
 
500
}
 
501
 
428
502
// TODO:
429
503
// FreeBSD has IP_SENDIF.  Darwin probably needs BSDLLCTest, see:
430
504
// http://developer.apple.com/mac/library/samplecode/BSDLLCTest/index.html
451
525
 
452
526
// Translate "kern.hostname" to []_C_int{0,1,2,3}.
453
527
func nametomib(name string) (mib []_C_int, errno int) {
454
 
        const siz = uintptr(unsafe.Sizeof(mib[0]))
 
528
        const siz = unsafe.Sizeof(mib[0])
455
529
 
456
530
        // NOTE(rsc): It seems strange to set the buffer to have
457
531
        // size CTL_MAXNAME+2 but use only CTL_MAXNAME
540
614
 
541
615
//sys   fcntl(fd int, cmd int, arg int) (val int, errno int)
542
616
 
543
 
func Recvmsg(fd int, p, oob []byte, flags int) (n, oobn int, recvflags int, from Sockaddr, errno int) {
544
 
        return 0, 0, 0, nil, EAFNOSUPPORT
545
 
}
546
 
 
547
 
func Sendmsg(fd int, p, oob []byte, to Sockaddr, flags int) (errno int) {
548
 
        return EAFNOSUPPORT
549
 
}
550
 
 
551
617
// TODO: wrap
552
618
//      Acct(name nil-string) (errno int)
553
619
//      Gethostuuid(uuid *byte, timeout *Timespec) (errno int)