gtsocial-umbx

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README | LICENSE

control_unix.go (1817B)


      1 // Copyright 2012 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 aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris
      6 // +build aix darwin dragonfly freebsd linux netbsd openbsd solaris
      7 
      8 package ipv4
      9 
     10 import (
     11 	"unsafe"
     12 
     13 	"golang.org/x/net/internal/iana"
     14 	"golang.org/x/net/internal/socket"
     15 
     16 	"golang.org/x/sys/unix"
     17 )
     18 
     19 func setControlMessage(c *socket.Conn, opt *rawOpt, cf ControlFlags, on bool) error {
     20 	opt.Lock()
     21 	defer opt.Unlock()
     22 	if so, ok := sockOpts[ssoReceiveTTL]; ok && cf&FlagTTL != 0 {
     23 		if err := so.SetInt(c, boolint(on)); err != nil {
     24 			return err
     25 		}
     26 		if on {
     27 			opt.set(FlagTTL)
     28 		} else {
     29 			opt.clear(FlagTTL)
     30 		}
     31 	}
     32 	if so, ok := sockOpts[ssoPacketInfo]; ok {
     33 		if cf&(FlagSrc|FlagDst|FlagInterface) != 0 {
     34 			if err := so.SetInt(c, boolint(on)); err != nil {
     35 				return err
     36 			}
     37 			if on {
     38 				opt.set(cf & (FlagSrc | FlagDst | FlagInterface))
     39 			} else {
     40 				opt.clear(cf & (FlagSrc | FlagDst | FlagInterface))
     41 			}
     42 		}
     43 	} else {
     44 		if so, ok := sockOpts[ssoReceiveDst]; ok && cf&FlagDst != 0 {
     45 			if err := so.SetInt(c, boolint(on)); err != nil {
     46 				return err
     47 			}
     48 			if on {
     49 				opt.set(FlagDst)
     50 			} else {
     51 				opt.clear(FlagDst)
     52 			}
     53 		}
     54 		if so, ok := sockOpts[ssoReceiveInterface]; ok && cf&FlagInterface != 0 {
     55 			if err := so.SetInt(c, boolint(on)); err != nil {
     56 				return err
     57 			}
     58 			if on {
     59 				opt.set(FlagInterface)
     60 			} else {
     61 				opt.clear(FlagInterface)
     62 			}
     63 		}
     64 	}
     65 	return nil
     66 }
     67 
     68 func marshalTTL(b []byte, cm *ControlMessage) []byte {
     69 	m := socket.ControlMessage(b)
     70 	m.MarshalHeader(iana.ProtocolIP, unix.IP_RECVTTL, 1)
     71 	return m.Next(1)
     72 }
     73 
     74 func parseTTL(cm *ControlMessage, b []byte) {
     75 	cm.TTL = int(*(*byte)(unsafe.Pointer(&b[:1][0])))
     76 }