Class: Socket::Option

Inherits:
Object
  • Object
show all
Defined in:
lib/rubysl/socket.rb

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(family, level, optname, data) ⇒ Option

Returns a new instance of Option.



650
651
652
653
654
655
656
657
658
# File 'lib/rubysl/socket.rb', line 650

def initialize(family, level, optname, data)
  @family = family_arg(family)
  @family_name = family
  @level = level_arg(@family, level)
  @level_name = level
  @optname = optname_arg(@level, optname)
  @opt_name = optname
  @data = data
end

Instance Attribute Details

#dataObject (readonly) Also known as: to_s

Returns the value of attribute data.



622
623
624
# File 'lib/rubysl/socket.rb', line 622

def data
  @data
end

#familyObject (readonly)

Returns the value of attribute family.



622
623
624
# File 'lib/rubysl/socket.rb', line 622

def family
  @family
end

#levelObject (readonly)

Returns the value of attribute level.



622
623
624
# File 'lib/rubysl/socket.rb', line 622

def level
  @level
end

#optnameObject (readonly)

Returns the value of attribute optname.



622
623
624
# File 'lib/rubysl/socket.rb', line 622

def optname
  @optname
end

Class Method Details

.bool(family, level, optname, bool) ⇒ Object



624
625
626
627
# File 'lib/rubysl/socket.rb', line 624

def self.bool(family, level, optname, bool)
  data = [(bool ? 1 : 0)].pack('i')
  new family, level, optname, data
end

.int(family, level, optname, integer) ⇒ Object



629
630
631
# File 'lib/rubysl/socket.rb', line 629

def self.int(family, level, optname, integer)
  new family, level, optname, [integer].pack('i')
end

.linger(onoff, secs) ⇒ Object



633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
# File 'lib/rubysl/socket.rb', line 633

def self.linger(onoff, secs)
  linger = Socket::Foreign::Linger.new

  case onoff
  when Integer
    linger[:l_onoff] = onoff
  else
    linger[:l_onoff] = onoff ? 1 : 0
  end
  linger[:l_linger] = secs

  p = linger.to_ptr
  data = p.read_string(p.total)

  new :UNSPEC, :SOCKET, :LINGER, data
end

Instance Method Details

#boolObject



668
669
670
671
672
673
674
675
676
# File 'lib/rubysl/socket.rb', line 668

def bool
  unless @data.length == Rubinius::FFI.type_size(:int)
    raise TypeError, "size differ. expected as sizeof(int)=" +
      "#{Rubinius::FFI.type_size(:int)} but #{@data.length}"
  end

  i = @data.unpack('i').first
  i == 0 ? false : true
end

#inspectObject



664
665
666
# File 'lib/rubysl/socket.rb', line 664

def inspect
  "#<#{self.class}: #@family_name #@level_name #@opt_name #{@data.inspect}>"
end

#intObject



678
679
680
681
682
683
684
# File 'lib/rubysl/socket.rb', line 678

def int
  unless @data.length == Rubinius::FFI.type_size(:int)
    raise TypeError, "size differ. expected as sizeof(int)=" +
      "#{Rubinius::FFI.type_size(:int)} but #{@data.length}"
  end
  @data.unpack('i').first
end

#lingerObject



686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
# File 'lib/rubysl/socket.rb', line 686

def linger
  if @level != Socket::SOL_SOCKET || @optname != Socket::SO_LINGER
    raise TypeError, "linger socket option expected"
  end
  if @data.bytesize != FFI.config("linger.sizeof")
    raise TypeError, "size differ. expected as sizeof(struct linger)=" +
      "#{FFI.config("linger.sizeof")} but #{@data.length}"
  end

  linger = Socket::Foreign::Linger.new
  linger.to_ptr.write_string @data, @data.bytesize

  onoff = nil
  case linger[:l_onoff]
  when 0 then onoff = false
  when 1 then onoff = true
  else onoff = linger[:l_onoff].to_i
  end

  [onoff, linger[:l_linger].to_i]
end

#unpack(template) ⇒ Object



660
661
662
# File 'lib/rubysl/socket.rb', line 660

def unpack(template)
  @data.unpack template
end