utp.go 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. package utp
  2. /*
  3. #cgo CPPFLAGS: -DPOSIX -DUTP_DEBUG_LOGGING=0
  4. #cgo CFLAGS: -Wall -O3
  5. // These are all copied from the libutp Makefile.
  6. #cgo CXXFLAGS: -Wall -O3 -fPIC -Wno-sign-compare
  7. // There are some variables that aren't used unless UTP_DEBUG_LOGGING is defined.
  8. #cgo CXXFLAGS: -Wno-unused-const-variable
  9. // Windows additional flags
  10. #cgo windows LDFLAGS: -lws2_32
  11. #cgo windows CXXFLAGS: -D_WIN32_WINNT=0x600
  12. #include "utp.h"
  13. uint64_t firewallCallback(utp_callback_arguments *);
  14. uint64_t errorCallback(utp_callback_arguments *);
  15. uint64_t logCallback(utp_callback_arguments *);
  16. uint64_t acceptCallback(utp_callback_arguments *);
  17. uint64_t sendtoCallback(utp_callback_arguments *);
  18. uint64_t stateChangeCallback(utp_callback_arguments *);
  19. uint64_t readCallback(utp_callback_arguments *);
  20. uint64_t getReadBufferSizeCallback(utp_callback_arguments *);
  21. */
  22. import "C"
  23. import "unsafe"
  24. type socklen C.socklen_t
  25. type utpContext C.utp_context
  26. func (ctx *utpContext) asCPtr() *C.utp_context {
  27. return (*C.utp_context)(ctx)
  28. }
  29. func (ctx *utpContext) setCallbacks() {
  30. C.utp_set_callback(ctx.asCPtr(), C.UTP_ON_FIREWALL, (*C.utp_callback_t)(C.firewallCallback))
  31. C.utp_set_callback(ctx.asCPtr(), C.UTP_LOG, (*C.utp_callback_t)(C.logCallback))
  32. C.utp_set_callback(ctx.asCPtr(), C.UTP_ON_ACCEPT, (*C.utp_callback_t)(C.acceptCallback))
  33. C.utp_set_callback(ctx.asCPtr(), C.UTP_SENDTO, (*C.utp_callback_t)(C.sendtoCallback))
  34. C.utp_set_callback(ctx.asCPtr(), C.UTP_ON_STATE_CHANGE, (*C.utp_callback_t)(C.stateChangeCallback))
  35. C.utp_set_callback(ctx.asCPtr(), C.UTP_ON_READ, (*C.utp_callback_t)(C.readCallback))
  36. C.utp_set_callback(ctx.asCPtr(), C.UTP_ON_ERROR, (*C.utp_callback_t)(C.errorCallback))
  37. C.utp_set_callback(ctx.asCPtr(), C.UTP_GET_READ_BUFFER_SIZE, (*C.utp_callback_t)(C.getReadBufferSizeCallback))
  38. }
  39. func (ctx *utpContext) setOption(opt Option, val int) int {
  40. return int(C.utp_context_set_option(ctx.asCPtr(), opt, C.int(val)))
  41. }
  42. func libStateName(state C.int) string {
  43. return C.GoString((*[5]*C.char)(unsafe.Pointer(&C.utp_state_names))[state])
  44. }
  45. func libErrorCodeNames(errorCode C.int) string {
  46. return C.GoString((*[3]*C.char)(unsafe.Pointer(&C.utp_error_code_names))[errorCode])
  47. }