Skip to content

Instantly share code, notes, and snippets.

@maiha
Last active November 8, 2017 19:47
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save maiha/0a257d84ed5d8198804337d2ce4d68c5 to your computer and use it in GitHub Desktop.
Save maiha/0a257d84ed5d8198804337d2ce4d68c5 to your computer and use it in GitHub Desktop.
complex return value in crystal

implementation

enum Pcap::NextError
  EOF     = -2 # EOF or pcap_breakloop
  ERROR   = -1 #
  TIMEOUT =  0 # should be continued
end

class Pcap::Capture
  def next_ex : NextError | Packet
    ret = LibPcap.pcap_next_ex(@pcap, out headp, out bytes)
    NextError.from_value?(ret) || Pcap::Packet.new(headp, bytes)
  end
end

usage : testing

pcap = Pcap::Capture.open_offline("redis-ping.cap")
15.times do
  puts pcap.next_ex
end
22:36:51.327153 IP 127.0.0.1.56903 > 127.0.0.1.6379: Flags [S], seq 3742863884, win 43690, length 0
22:36:51.327193 IP 127.0.0.1.6379 > 127.0.0.1.56903: Flags [SA], seq 3534198769, ack 3742863885, win 43690, length 0
22:36:51.327246 IP 127.0.0.1.56903 > 127.0.0.1.6379: Flags [A], ack 3534198770, win 342, length 0
...
22:36:51.328386 IP 127.0.0.1.56903 > 127.0.0.1.6379: Flags [A], ack 3534198778, win 342, length 0
EOF
EOF
EOF
EOF
EOF

usage: practical usecase

pcap = Pcap::Capture.open_offline("redis-ping.cap")
loop {
  case pkt = pcap.next_ex
  when Pcap::Packet
    puts pkt
  when Pcap::NextError::TIMEOUT
    # next
  when Pcap::NextError::ERROR
    abort "next_ex failed with code=#{pkt}"
  when Pcap::NextError::EOF
    break
  else
    abort "BUG: unexpected status: #{pkt.class}"
  end
}
22:36:51.327153 IP 127.0.0.1.56903 > 127.0.0.1.6379: Flags [S], seq 3742863884, win 43690, length 0
22:36:51.327193 IP 127.0.0.1.6379 > 127.0.0.1.56903: Flags [SA], seq 3534198769, ack 3742863885, win 43690, length 0
22:36:51.327246 IP 127.0.0.1.56903 > 127.0.0.1.6379: Flags [A], ack 3534198770, win 342, length 0
...
22:36:51.328386 IP 127.0.0.1.56903 > 127.0.0.1.6379: Flags [A], ack 3534198778, win 342, length 0
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment