1// +build !appengine 2 3/* 4 * 5 * Copyright 2018 gRPC authors. 6 * 7 * Licensed under the Apache License, Version 2.0 (the "License"); 8 * you may not use this file except in compliance with the License. 9 * You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, software 14 * distributed under the License is distributed on an "AS IS" BASIS, 15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 16 * See the License for the specific language governing permissions and 17 * limitations under the License. 18 * 19 */ 20 21package channelz 22 23import ( 24 "syscall" 25 26 "golang.org/x/sys/unix" 27) 28 29// SocketOptionData defines the struct to hold socket option data, and related 30// getter function to obtain info from fd. 31type SocketOptionData struct { 32 Linger *unix.Linger 33 RecvTimeout *unix.Timeval 34 SendTimeout *unix.Timeval 35 TCPInfo *unix.TCPInfo 36} 37 38// Getsockopt defines the function to get socket options requested by channelz. 39// It is to be passed to syscall.RawConn.Control(). 40func (s *SocketOptionData) Getsockopt(fd uintptr) { 41 if v, err := unix.GetsockoptLinger(int(fd), syscall.SOL_SOCKET, syscall.SO_LINGER); err == nil { 42 s.Linger = v 43 } 44 if v, err := unix.GetsockoptTimeval(int(fd), syscall.SOL_SOCKET, syscall.SO_RCVTIMEO); err == nil { 45 s.RecvTimeout = v 46 } 47 if v, err := unix.GetsockoptTimeval(int(fd), syscall.SOL_SOCKET, syscall.SO_SNDTIMEO); err == nil { 48 s.SendTimeout = v 49 } 50 if v, err := unix.GetsockoptTCPInfo(int(fd), syscall.SOL_TCP, syscall.TCP_INFO); err == nil { 51 s.TCPInfo = v 52 } 53} 54