PageRenderTime 30ms CodeModel.GetById 0ms RepoModel.GetById 0ms app.codeStats 0ms

/benchmarks/rdoc/ruby_trunk/ext/socket/constants.c

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