net-dns 0.9.0 → 0.20.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (58) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +29 -16
  3. data/README.md +1 -1
  4. data/lib/net/dns/header.rb +48 -64
  5. data/lib/net/dns/names.rb +8 -10
  6. data/lib/net/dns/packet.rb +46 -53
  7. data/lib/net/dns/question.rb +5 -3
  8. data/lib/net/dns/resolver/socks.rb +5 -7
  9. data/lib/net/dns/resolver/timeouts.rb +3 -5
  10. data/lib/net/dns/resolver.rb +54 -69
  11. data/lib/net/dns/rr/a.rb +3 -4
  12. data/lib/net/dns/rr/aaaa.rb +3 -5
  13. data/lib/net/dns/rr/classes.rb +6 -8
  14. data/lib/net/dns/rr/cname.rb +3 -5
  15. data/lib/net/dns/rr/hinfo.rb +9 -13
  16. data/lib/net/dns/rr/mr.rb +3 -5
  17. data/lib/net/dns/rr/mx.rb +5 -7
  18. data/lib/net/dns/rr/ns.rb +3 -5
  19. data/lib/net/dns/rr/null.rb +3 -5
  20. data/lib/net/dns/rr/ptr.rb +3 -5
  21. data/lib/net/dns/rr/soa.rb +11 -7
  22. data/lib/net/dns/rr/srv.rb +5 -2
  23. data/lib/net/dns/rr/txt.rb +4 -6
  24. data/lib/net/dns/rr/types.rb +90 -79
  25. data/lib/net/dns/rr.rb +2 -2
  26. data/lib/net/dns/version.rb +1 -1
  27. data/lib/net/dns.rb +3 -1
  28. metadata +11 -104
  29. data/.gitignore +0 -8
  30. data/.rubocop.yml +0 -3
  31. data/.rubocop_defaults.yml +0 -364
  32. data/.rubocop_todo.yml +0 -207
  33. data/Gemfile +0 -8
  34. data/Rakefile +0 -38
  35. data/bin/console +0 -14
  36. data/lib/net/dns/core_ext.rb +0 -45
  37. data/net-dns.gemspec +0 -23
  38. data/spec/fixtures/resolv.conf +0 -4
  39. data/spec/spec_helper.rb +0 -14
  40. data/spec/unit/resolver/dns_timeout_spec.rb +0 -36
  41. data/spec/unit/resolver/tcp_timeout_spec.rb +0 -46
  42. data/spec/unit/resolver/udp_timeout_spec.rb +0 -46
  43. data/test/test_helper.rb +0 -13
  44. data/test/unit/header_test.rb +0 -164
  45. data/test/unit/names_test.rb +0 -21
  46. data/test/unit/packet_test.rb +0 -47
  47. data/test/unit/question_test.rb +0 -81
  48. data/test/unit/resolver_test.rb +0 -114
  49. data/test/unit/rr/a_test.rb +0 -106
  50. data/test/unit/rr/aaaa_test.rb +0 -102
  51. data/test/unit/rr/classes_test.rb +0 -83
  52. data/test/unit/rr/cname_test.rb +0 -90
  53. data/test/unit/rr/hinfo_test.rb +0 -111
  54. data/test/unit/rr/mr_test.rb +0 -99
  55. data/test/unit/rr/mx_test.rb +0 -106
  56. data/test/unit/rr/ns_test.rb +0 -80
  57. data/test/unit/rr/types_test.rb +0 -71
  58. data/test/unit/rr_test.rb +0 -127
@@ -16,7 +16,7 @@ require 'net/dns/resolver/timeouts'
16
16
  # Resolver("www.google.com") { |packet| puts packet.size + " bytes" }
17
17
  # # => 484 bytes
18
18
  #
19
- def Resolver(name, type = Net::DNS::A, cls = Net::DNS::IN, &block)
19
+ def Resolver(name, type = Net::DNS::A, cls = Net::DNS::IN)
20
20
  resolver = Net::DNS::Resolver.start(name, type, cls)
21
21
  if block_given?
22
22
  yield resolver
@@ -231,9 +231,9 @@ module Net
231
231
  # Net::DNS::Resolver Perl module.
232
232
  #
233
233
  def initialize(config = {})
234
- raise ArgumentError, "Expected `config' to be a Hash" unless config.is_a?(Hash)
234
+ config.is_a?(Hash) or
235
+ raise(ArgumentError, "Expected `config' to be a Hash")
235
236
 
236
- # config.downcase_keys!
237
237
  @config = Defaults.merge config
238
238
  @raw = false
239
239
 
@@ -402,12 +402,11 @@ module Net
402
402
  # The default is port 53.
403
403
  #
404
404
  def port=(num)
405
- if (0..65_535).cover? num
406
- @config[:port] = num
407
- @logger.info "Port number changed to #{num}"
408
- else
409
- raise ArgumentError, "Wrong port number #{num}"
410
- end
405
+ (0..65_535).cover?(num) or
406
+ raise(ArgumentError, "Wrong port number #{num}")
407
+
408
+ @config[:port] = num
409
+ @logger.info "Port number changed to #{num}"
411
410
  end
412
411
 
413
412
  # Get the value of the source port number.
@@ -431,15 +430,12 @@ module Net
431
430
  # underlaying layers.
432
431
  #
433
432
  def source_port=(num)
434
- unless root?
435
- raise ResolverPermissionError, "Are you root?"
436
- end
433
+ root? or
434
+ raise(ResolverPermissionError, "Are you root?")
435
+ (0..65_535).cover?(num) or
436
+ raise(ArgumentError, "Wrong port number #{num}")
437
437
 
438
- if (0..65_535).cover?(num)
439
- @config[:source_port] = num
440
- else
441
- raise ArgumentError, "Wrong port number #{num}"
442
- end
438
+ @config[:source_port] = num
443
439
  end
444
440
  alias srcport= source_port=
445
441
 
@@ -482,13 +478,12 @@ module Net
482
478
  # The default is 0.0.0.0, meaning any local address (chosen on routing needs).
483
479
  #
484
480
  def source_address=(addr)
485
- unless addr.respond_to? :to_s
486
- raise ArgumentError, "Wrong address argument #{addr}"
487
- end
481
+ addr.respond_to?(:to_s) or
482
+ raise(ArgumentError, "Wrong address argument #{addr}")
488
483
 
489
484
  begin
490
485
  port = rand(1024..65_023)
491
- @logger.warn "Try to determine state of source address #{addr} with port #{port}"
486
+ @logger.info "Try to determine state of source address #{addr} with port #{port}"
492
487
  a = TCPServer.new(addr.to_s, port)
493
488
  rescue SystemCallError => e
494
489
  case e.errno
@@ -527,12 +522,11 @@ module Net
527
522
 
528
523
  # Set the retrasmission interval in seconds. Default 5 seconds.
529
524
  def retry_interval=(num)
530
- if num > 0
531
- @config[:retry_interval] = num
532
- @logger.info "Retransmission interval changed to #{num} seconds"
533
- else
534
- raise ArgumentError, "Interval must be positive"
535
- end
525
+ num.positive? or
526
+ raise(ArgumentError, "Interval must be positive")
527
+
528
+ @config[:retry_interval] = num
529
+ @logger.info "Retransmission interval changed to #{num} seconds"
536
530
  end
537
531
  alias retrans= retry_interval=
538
532
 
@@ -547,12 +541,11 @@ module Net
547
541
  # Set the number of times the resolver will try a query.
548
542
  # Default 4 times.
549
543
  def retry_number=(num)
550
- if num.is_a?(Integer) && (num > 0)
551
- @config[:retry_number] = num
552
- @logger.info "Retrasmissions number changed to #{num}"
553
- else
554
- raise ArgumentError, "Retry value must be a positive integer"
555
- end
544
+ (num.is_a?(Integer) && (num > 0)) or
545
+ raise(ArgumentError, "Retry value must be a positive integer")
546
+
547
+ @config[:retry_number] = num
548
+ @logger.info "Retrasmissions number changed to #{num}"
556
549
  end
557
550
  alias_method('retry=', 'retry_number=')
558
551
 
@@ -778,7 +771,6 @@ module Net
778
771
  # the old one, which will then be impossibile to recover.
779
772
  #
780
773
  def log_file=(log)
781
- @logger.close
782
774
  @config[:log_file] = log
783
775
  @logger = Logger.new(@config[:log_file])
784
776
  @logger.level = $DEBUG ? Logger::DEBUG : Logger::WARN
@@ -802,12 +794,10 @@ module Net
802
794
  # Note that this will destroy the precedent logger.
803
795
  #
804
796
  def logger=(logger)
805
- if logger.is_a? Logger
806
- @logger.close
807
- @logger = logger
808
- else
809
- raise ArgumentError, "Argument must be an instance of Logger class"
810
- end
797
+ logger.is_a?(Logger) or
798
+ raise(ArgumentError, "Argument must be an instance of Logger class")
799
+
800
+ @logger = logger
811
801
  end
812
802
 
813
803
  # Set the log level for the built-in logging facility.
@@ -948,9 +938,8 @@ module Net
948
938
  # were any records in the answer section.
949
939
  #
950
940
  def query(argument, type = Net::DNS::A, cls = Net::DNS::IN)
951
- if @config[:nameservers].empty?
952
- raise Resolver::Error, "No nameservers specified!"
953
- end
941
+ !@config[:nameservers].empty? or
942
+ raise(Resolver::Error, "No nameservers specified!")
954
943
 
955
944
  method = :query_udp
956
945
  packet = if argument.is_a? Net::DNS::Packet
@@ -987,10 +976,10 @@ module Net
987
976
 
988
977
  if type == Net::DNS::AXFR
989
978
  if @raw
990
- @logger.warn "AXFR query, switching to TCP over RAW socket"
979
+ @logger.info "AXFR query, switching to TCP over RAW socket"
991
980
  method = :send_raw_tcp
992
981
  else
993
- @logger.warn "AXFR query, switching to TCP"
982
+ @logger.info "AXFR query, switching to TCP"
994
983
  method = :query_tcp
995
984
  end
996
985
  end
@@ -1085,14 +1074,14 @@ module Net
1085
1074
  if ENV['LOCALDOMAIN']
1086
1075
  self.domain = ENV['LOCALDOMAIN']
1087
1076
  end
1088
- if ENV['RES_OPTIONS']
1089
- ENV['RES_OPTIONS'].split(" ").each do |opt|
1090
- name, val = opt.split(":")
1091
- begin
1092
- eval("self.#{name} = #{val}")
1093
- rescue NoMethodError
1094
- raise ArgumentError, "Invalid ENV option #{name}"
1095
- end
1077
+ return unless ENV['RES_OPTIONS']
1078
+
1079
+ ENV['RES_OPTIONS'].split(" ").each do |opt|
1080
+ name, val = opt.split(":")
1081
+ begin
1082
+ eval("self.#{name} = #{val}")
1083
+ rescue NoMethodError
1084
+ raise ArgumentError, "Invalid ENV option #{name}"
1096
1085
  end
1097
1086
  end
1098
1087
  end
@@ -1136,12 +1125,11 @@ module Net
1136
1125
  packet
1137
1126
  end
1138
1127
 
1139
- def query_tcp(packet, packet_data)
1128
+ def query_tcp(_packet, packet_data)
1140
1129
  ans = nil
1141
1130
  length = [packet_data.size].pack("n")
1142
1131
 
1143
1132
  @config[:nameservers].each do |ns|
1144
- begin
1145
1133
  buffer = ""
1146
1134
  socket = Socket.new(Socket::AF_INET, Socket::SOCK_STREAM, 0)
1147
1135
  socket.bind(Socket.pack_sockaddr_in(@config[:source_port], @config[:source_address].to_s))
@@ -1153,12 +1141,12 @@ module Net
1153
1141
  @logger.info "Contacting nameserver #{ns} port #{@config[:port]}"
1154
1142
  socket.write(length + packet_data)
1155
1143
  ans = socket.recv(Net::DNS::INT16SZ)
1156
- len = ans.unpack("n")[0]
1144
+ len = ans.unpack1("n")
1157
1145
 
1158
1146
  @logger.info "Receiving #{len} bytes..."
1159
1147
 
1160
1148
  if len == 0
1161
- @logger.warn "Receiving 0 lenght packet from nameserver #{ns}, trying next."
1149
+ @logger.warn "Receiving 0 length packet from nameserver #{ns}, trying next."
1162
1150
  next
1163
1151
  end
1164
1152
 
@@ -1174,16 +1162,16 @@ module Net
1174
1162
  end
1175
1163
  end
1176
1164
  return [buffer, ["", @config[:port], ns.to_s, ns.to_s]]
1177
- rescue TimeoutError
1165
+ rescue Timeout::Error
1178
1166
  @logger.warn "Nameserver #{ns} not responding within TCP timeout, trying next one"
1179
1167
  next
1180
- ensure
1168
+ ensure
1181
1169
  socket.close
1182
- end
1183
1170
  end
1171
+ ans
1184
1172
  end
1185
1173
 
1186
- def query_udp(packet, packet_data)
1174
+ def query_udp(_packet, packet_data)
1187
1175
  socket4 = UDPSocket.new
1188
1176
  socket4.bind(@config[:source_address].to_s, @config[:source_port])
1189
1177
  socket6 = UDPSocket.new(Socket::AF_INET6)
@@ -1192,7 +1180,6 @@ module Net
1192
1180
  ans = nil
1193
1181
  response = ""
1194
1182
  @config[:nameservers].each do |ns|
1195
- begin
1196
1183
  @config[:udp_timeout].timeout do
1197
1184
  @logger.info "Contacting nameserver #{ns} port #{@config[:port]}"
1198
1185
  ans = if ns.ipv6?
@@ -1204,21 +1191,19 @@ module Net
1204
1191
  end
1205
1192
  end
1206
1193
  break if ans
1207
- rescue TimeoutError
1194
+ rescue Timeout::Error
1208
1195
  @logger.warn "Nameserver #{ns} not responding within UDP timeout, trying next one"
1209
1196
  next
1210
- end
1211
1197
  end
1212
1198
  ans
1213
1199
  end
1214
1200
 
1215
1201
  # FIXME: a ? method should never raise.
1216
1202
  def valid?(name)
1217
- if name =~ /[^-\w\.]/
1218
- raise ArgumentError, "Invalid domain name #{name}"
1219
- else
1220
- true
1221
- end
1203
+ name !~ /[^-\w\.\*]/ or
1204
+ raise(ArgumentError, "Invalid domain name #{name}")
1205
+
1206
+ true
1222
1207
  end
1223
1208
  end
1224
1209
  end
data/lib/net/dns/rr/a.rb CHANGED
@@ -84,10 +84,9 @@ module Net
84
84
  address = case input
85
85
  when IPAddr
86
86
  input
87
- when Integer # Address in numeric form
88
- tmp = [(input >> 24), (input >> 16) & 0xFF, (input >> 8) & 0xFF, input & 0xFF]
89
- tmp = tmp.collect(&:to_s).join(".")
90
- IPAddr.new(tmp)
87
+ # Address in numeric form
88
+ when Integer
89
+ IPAddr.new(input, Socket::AF_INET)
91
90
  when String
92
91
  IPAddr.new(input)
93
92
  else
@@ -38,11 +38,9 @@ module Net
38
38
  private
39
39
 
40
40
  def subclass_new_from_hash(options)
41
- if options.key?(:address)
42
- @address = check_address(options[:address])
43
- else
44
- raise ArgumentError, ":address field is mandatory"
45
- end
41
+ raise ArgumentError, ":address field is mandatory" unless options.key?(:address)
42
+
43
+ @address = check_address(options[:address])
46
44
  end
47
45
 
48
46
  def subclass_new_from_string(str)
@@ -34,9 +34,9 @@ module Net
34
34
  initialize_from_num(@@default)
35
35
  end
36
36
 
37
- if @str.nil? || @num.nil?
38
- raise ArgumentError, "Unable to create a `Classes' from `#{cls}'"
39
- end
37
+ return unless @str.nil? || @num.nil?
38
+
39
+ raise ArgumentError, "Unable to create a `Classes' from `#{cls}'"
40
40
  end
41
41
 
42
42
  # Returns the class in number format
@@ -67,11 +67,9 @@ module Net
67
67
  # Be able to control the default class to assign when
68
68
  # cls argument is +nil+. Default to +IN+
69
69
  def self.default=(str)
70
- if CLASSES[str]
71
- @@default = CLASSES[str]
72
- else
73
- raise ArgumentError, "Unknown class `#{str}'"
74
- end
70
+ raise ArgumentError, "Unknown class `#{str}'" unless CLASSES[str]
71
+
72
+ @@default = CLASSES[str]
75
73
  end
76
74
 
77
75
  # Returns whether <tt>cls</tt> is a valid RR class.
@@ -27,11 +27,9 @@ module Net # :nodoc:
27
27
  private
28
28
 
29
29
  def subclass_new_from_hash(options)
30
- if options.key?(:cname)
31
- @cname = check_name(options[:cname])
32
- else
33
- raise ArgumentError, ":cname field is mandatory"
34
- end
30
+ raise ArgumentError, ":cname field is mandatory" unless options.key?(:cname)
31
+
32
+ @cname = check_name(options[:cname])
35
33
  end
36
34
 
37
35
  def subclass_new_from_string(str)
@@ -40,12 +40,10 @@ module Net # :nodoc:
40
40
  private
41
41
 
42
42
  def subclass_new_from_hash(options)
43
- if options.key?(:cpu) && options.key?(:os)
44
- @cpu = options[:cpu]
45
- @os = options[:os]
46
- else
47
- raise ArgumentError, ":cpu and :os fields are mandatory"
48
- end
43
+ raise ArgumentError, ":cpu and :os fields are mandatory" unless options.key?(:cpu) && options.key?(:os)
44
+
45
+ @cpu = options[:cpu]
46
+ @os = options[:os]
49
47
  end
50
48
 
51
49
  def subclass_new_from_string(str)
@@ -53,12 +51,12 @@ module Net # :nodoc:
53
51
  end
54
52
 
55
53
  def subclass_new_from_binary(data, offset)
56
- len = data.unpack("@#{offset} C").first
54
+ len = data.unpack1("@#{offset} C")
57
55
  offset += 1
58
56
  @cpu = data[offset..(offset + len)]
59
57
  offset += len
60
58
 
61
- len = data.unpack("@#{offset} C").first
59
+ len = data.unpack1("@#{offset} C")
62
60
  offset += 1
63
61
  @os = data[offset..(offset + len)]
64
62
  offset += len
@@ -73,11 +71,9 @@ module Net # :nodoc:
73
71
  end
74
72
 
75
73
  def check_hinfo(input)
76
- if input.to_s.strip =~ /^(?:["']?(.*?)["']?)\s+(?:["']?(.*?)["']?)$/
77
- [Regexp.last_match(1), Regexp.last_match(2)]
78
- else
79
- raise ArgumentError, "Invalid HINFO Section `#{input}'"
80
- end
74
+ raise ArgumentError, "Invalid HINFO Section `#{input}'" unless input.to_s.strip =~ /^(?:["']?(.*?)["']?)\s+(?:["']?(.*?)["']?)$/
75
+
76
+ [Regexp.last_match(1), Regexp.last_match(2)]
81
77
  end
82
78
 
83
79
  def build_pack
data/lib/net/dns/rr/mr.rb CHANGED
@@ -23,11 +23,9 @@ module Net # :nodoc:
23
23
  private
24
24
 
25
25
  def subclass_new_from_hash(options)
26
- if options.key?(:newname)
27
- @newname = check_name(options[:newname])
28
- else
29
- raise ArgumentError, ":newname field is mandatory"
30
- end
26
+ raise ArgumentError, ":newname field is mandatory" unless options.key?(:newname)
27
+
28
+ @newname = check_name(options[:newname])
31
29
  end
32
30
 
33
31
  def subclass_new_from_string(str)
data/lib/net/dns/rr/mx.rb CHANGED
@@ -32,12 +32,10 @@ module Net # :nodoc:
32
32
  private
33
33
 
34
34
  def subclass_new_from_hash(options)
35
- if options.key?(:preference) && options.key?(:exchange)
36
- @preference = options[:preference].to_i
37
- @exchange = options[:exchange]
38
- else
39
- raise ArgumentError, ":preference and :exchange fields are mandatory"
40
- end
35
+ raise ArgumentError, ":preference and :exchange fields are mandatory" unless options.key?(:preference) && options.key?(:exchange)
36
+
37
+ @preference = options[:preference].to_i
38
+ @exchange = options[:exchange]
41
39
  end
42
40
 
43
41
  def subclass_new_from_string(str)
@@ -45,7 +43,7 @@ module Net # :nodoc:
45
43
  end
46
44
 
47
45
  def subclass_new_from_binary(data, offset)
48
- @preference = data.unpack("@#{offset} n")[0]
46
+ @preference = data.unpack1("@#{offset} n")
49
47
  offset += 2
50
48
  @exchange, offset = dn_expand(data, offset)
51
49
  offset
data/lib/net/dns/rr/ns.rb CHANGED
@@ -23,11 +23,9 @@ module Net # :nodoc:
23
23
  private
24
24
 
25
25
  def subclass_new_from_hash(options)
26
- if options.key?(:nsdname)
27
- @nsdname = check_name(options[:nsdname])
28
- else
29
- raise ArgumentError, ":nsdname field is mandatory"
30
- end
26
+ raise ArgumentError, ":nsdname field is mandatory" unless options.key?(:nsdname)
27
+
28
+ @nsdname = check_name(options[:nsdname])
31
29
  end
32
30
 
33
31
  def subclass_new_from_string(str)
@@ -23,11 +23,9 @@ module Net # :nodoc:
23
23
  end
24
24
 
25
25
  def subclass_new_from_hash(args)
26
- if args.key? :null
27
- @null = args[:null]
28
- else
29
- raise ArgumentError, ":null field is mandatory but missing"
30
- end
26
+ raise ArgumentError, ":null field is mandatory but missing" unless args.key? :null
27
+
28
+ @null = args[:null]
31
29
  end
32
30
 
33
31
  def subclass_new_from_string(str)
@@ -40,11 +40,9 @@ module Net
40
40
  end
41
41
 
42
42
  def subclass_new_from_hash(args)
43
- if args.key?(:ptrdname) || args.key?(:ptr)
44
- @ptrdname = args[:ptrdname]
45
- else
46
- raise ArgumentError, ":ptrdname or :ptr field is mandatory"
47
- end
43
+ raise ArgumentError, ":ptrdname or :ptr field is mandatory" unless args.key?(:ptrdname) || args.key?(:ptr)
44
+
45
+ @ptrdname = args[:ptrdname]
48
46
  end
49
47
 
50
48
  def subclass_new_from_string(str)
@@ -5,7 +5,13 @@ module Net # :nodoc:
5
5
  # RR type SOA
6
6
  #------------------------------------------------------------
7
7
  class SOA < RR
8
- attr_reader :mname, :rname, :serial, :refresh, :retry, :expire, :minimum
8
+ attr_reader :mname
9
+ attr_reader :rname
10
+ attr_reader :serial
11
+ attr_reader :refresh
12
+ attr_reader :retry
13
+ attr_reader :expire
14
+ attr_reader :minimum
9
15
 
10
16
  private
11
17
 
@@ -41,11 +47,9 @@ module Net # :nodoc:
41
47
  end
42
48
 
43
49
  def number?(num)
44
- if num.is_a?(Integer) && (num > 0)
45
- true
46
- else
47
- raise ArgumentError, "Wrong format field: #{num} not a number or less than zero"
48
- end
50
+ raise ArgumentError, "Wrong format field: #{num} not a number or less than zero" unless num.is_a?(Integer) && (num > 0)
51
+
52
+ true
49
53
  end
50
54
 
51
55
  def subclass_new_from_string(str)
@@ -61,7 +65,7 @@ module Net # :nodoc:
61
65
  @mname, offset = dn_expand(data, offset)
62
66
  @rname, offset = dn_expand(data, offset)
63
67
  @serial, @refresh, @retry, @expire, @minimum = data.unpack("@#{offset} N5")
64
- offset + 5 * Net::DNS::INT32SZ
68
+ offset + (5 * Net::DNS::INT32SZ)
65
69
  end
66
70
 
67
71
  private
@@ -5,7 +5,10 @@ module Net # :nodoc:
5
5
  # RR type SRV
6
6
  #------------------------------------------------------------
7
7
  class SRV < RR
8
- attr_reader :priority, :weight, :port, :host
8
+ attr_reader :priority
9
+ attr_reader :weight
10
+ attr_reader :port
11
+ attr_reader :host
9
12
 
10
13
  private
11
14
 
@@ -20,7 +23,7 @@ module Net # :nodoc:
20
23
 
21
24
  @host = []
22
25
  while offset < off_end
23
- len = data.unpack("@#{offset} C")[0]
26
+ len = data.unpack1("@#{offset} C")
24
27
  offset += 1
25
28
  str = data[offset..offset + len - 1]
26
29
  offset += len
@@ -23,11 +23,9 @@ module Net # :nodoc:
23
23
  end
24
24
 
25
25
  def subclass_new_from_hash(args)
26
- if args.key? :txt
27
- @txt = args[:txt].strip
28
- else
29
- raise ArgumentError, ":txt field is mandatory but missing"
30
- end
26
+ raise ArgumentError, ":txt field is mandatory but missing" unless args.key? :txt
27
+
28
+ @txt = args[:txt].strip
31
29
  end
32
30
 
33
31
  def subclass_new_from_string(str)
@@ -38,7 +36,7 @@ module Net # :nodoc:
38
36
  off_end = offset + @rdlength
39
37
  @txt = ""
40
38
  while offset < off_end
41
- len = data.unpack("@#{offset} C")[0]
39
+ len = data.unpack1("@#{offset} C")
42
40
  offset += 1
43
41
  str = data[offset..offset + len - 1]
44
42
  offset += len