PageRenderTime 65ms CodeModel.GetById 18ms RepoModel.GetById 1ms app.codeStats 0ms

/ext/socket/constants.c

http://github.com/ruby/ruby
C | 144 lines | 115 code | 12 blank | 17 comment | 16 complexity | 571632d69cf733e5f69bc631fca13184 MD5 | raw file
Possible License(s): GPL-2.0, BSD-3-Clause, AGPL-3.0
  1. /************************************************
  2. constants.c -
  3. created at: Thu Mar 31 12:21:29 JST 1994
  4. Copyright (C) 1993-2007 Yukihiro Matsumoto
  5. ************************************************/
  6. #include "rubysocket.h"
  7. static VALUE rb_mSockConst;
  8. #include "constdefs.c"
  9. static int
  10. constant_arg(VALUE arg, int (*str_to_int)(const char*, long, int*), const char *errmsg)
  11. {
  12. VALUE tmp;
  13. char *ptr;
  14. int ret;
  15. if (SYMBOL_P(arg)) {
  16. arg = rb_sym2str(arg);
  17. goto str;
  18. }
  19. else if (!NIL_P(tmp = rb_check_string_type(arg))) {
  20. arg = tmp;
  21. str:
  22. ptr = RSTRING_PTR(arg);
  23. if (str_to_int(ptr, RSTRING_LEN(arg), &ret) == -1)
  24. rb_raise(rb_eSocket, "%s: %s", errmsg, ptr);
  25. }
  26. else {
  27. ret = NUM2INT(arg);
  28. }
  29. return ret;
  30. }
  31. int
  32. rsock_family_arg(VALUE domain)
  33. {
  34. /* convert AF_INET, etc. */
  35. return constant_arg(domain, rsock_family_to_int, "unknown socket domain");
  36. }
  37. int
  38. rsock_socktype_arg(VALUE type)
  39. {
  40. /* convert SOCK_STREAM, etc. */
  41. return constant_arg(type, rsock_socktype_to_int, "unknown socket type");
  42. }
  43. int
  44. rsock_level_arg(int family, VALUE level)
  45. {
  46. /* convert SOL_SOCKET, IPPROTO_TCP, etc. */
  47. if (IS_IP_FAMILY(family)) {
  48. return constant_arg(level, rsock_ip_level_to_int, "unknown protocol level");
  49. }
  50. else {
  51. return constant_arg(level, rsock_unknown_level_to_int, "unknown protocol level");
  52. }
  53. }
  54. int
  55. rsock_optname_arg(int family, int level, VALUE optname)
  56. {
  57. if (IS_IP_FAMILY(family)) {
  58. switch (level) {
  59. case SOL_SOCKET:
  60. return constant_arg(optname, rsock_so_optname_to_int, "unknown socket level option name");
  61. case IPPROTO_IP:
  62. return constant_arg(optname, rsock_ip_optname_to_int, "unknown IP level option name");
  63. #ifdef IPPROTO_IPV6
  64. case IPPROTO_IPV6:
  65. return constant_arg(optname, rsock_ipv6_optname_to_int, "unknown IPv6 level option name");
  66. #endif
  67. case IPPROTO_TCP:
  68. return constant_arg(optname, rsock_tcp_optname_to_int, "unknown TCP level option name");
  69. case IPPROTO_UDP:
  70. return constant_arg(optname, rsock_udp_optname_to_int, "unknown UDP level option name");
  71. default:
  72. return NUM2INT(optname);
  73. }
  74. }
  75. else {
  76. switch (level) {
  77. case SOL_SOCKET:
  78. return constant_arg(optname, rsock_so_optname_to_int, "unknown socket level option name");
  79. default:
  80. return NUM2INT(optname);
  81. }
  82. }
  83. }
  84. int
  85. rsock_cmsg_type_arg(int family, int level, VALUE type)
  86. {
  87. if (IS_IP_FAMILY(family)) {
  88. switch (level) {
  89. case SOL_SOCKET:
  90. return constant_arg(type, rsock_scm_optname_to_int, "unknown UNIX control message");
  91. case IPPROTO_IP:
  92. return constant_arg(type, rsock_ip_optname_to_int, "unknown IP control message");
  93. #ifdef IPPROTO_IPV6
  94. case IPPROTO_IPV6:
  95. return constant_arg(type, rsock_ipv6_optname_to_int, "unknown IPv6 control message");
  96. #endif
  97. case IPPROTO_TCP:
  98. return constant_arg(type, rsock_tcp_optname_to_int, "unknown TCP control message");
  99. case IPPROTO_UDP:
  100. return constant_arg(type, rsock_udp_optname_to_int, "unknown UDP control message");
  101. default:
  102. return NUM2INT(type);
  103. }
  104. }
  105. else {
  106. switch (level) {
  107. case SOL_SOCKET:
  108. return constant_arg(type, rsock_scm_optname_to_int, "unknown UNIX control message");
  109. default:
  110. return NUM2INT(type);
  111. }
  112. }
  113. }
  114. int
  115. rsock_shutdown_how_arg(VALUE how)
  116. {
  117. /* convert SHUT_RD, SHUT_WR, SHUT_RDWR. */
  118. return constant_arg(how, rsock_shutdown_how_to_int, "unknown shutdown argument");
  119. }
  120. /*
  121. * Socket::Constants module
  122. */
  123. void
  124. rsock_init_socket_constants(void)
  125. {
  126. /* constants */
  127. init_constants();
  128. }