Changeset 331 for EcnlProtoTool/trunk/mrbgems/mruby-socket/src/socket.c
- Timestamp:
- Jan 21, 2018, 12:10:09 AM (6 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
EcnlProtoTool/trunk/mrbgems/mruby-socket/src/socket.c
r321 r331 4 4 ** See Copyright Notice in mruby.h 5 5 */ 6 #include <sys/types.h> 7 #include <sys/socket.h> 8 #include <sys/un.h> 9 #include <netinet/in.h> 10 #include <netinet/tcp.h> 11 #include <arpa/inet.h> 12 #include <fcntl.h> 13 #include <netdb.h> 14 #include <unistd.h> 6 7 #ifdef _WIN32 8 #define _WIN32_WINNT 0x0501 9 10 #include <winsock2.h> 11 #include <ws2tcpip.h> 12 #include <windows.h> 13 14 #define SHUT_RDWR SD_BOTH 15 #else 16 #include <sys/types.h> 17 #include <sys/socket.h> 18 #include <sys/un.h> 19 #include <netinet/in.h> 20 #include <netinet/tcp.h> 21 #include <arpa/inet.h> 22 #include <fcntl.h> 23 #include <netdb.h> 24 #include <unistd.h> 25 #endif 26 15 27 #include <stddef.h> 16 28 #include <string.h> 17 18 /*#include <unistd.h>*/19 extern int gethostname(char *name, size_t len);20 29 21 30 #include "mruby.h" … … 27 36 #include "error.h" 28 37 29 #ifndef NI_MAXHOST30 #define NI_MAXHOST 25531 #endif32 #ifndef NI_MAXSERV33 #define NI_MAXSERV 3234 #endif35 38 #define E_SOCKET_ERROR (mrb_class_get(mrb, "SocketError")) 36 39 … … 41 44 #endif 42 45 43 //#ifdef _WIN3246 #ifdef _WIN32 44 47 const char *inet_ntop(int af, const void *src, char *dst, socklen_t cnt) 45 48 { … … 59 62 memset(&in, 0, sizeof(in)); 60 63 in.sin6_family = AF_INET6; 61 memcpy(&in.sin6_addr, src, sizeof(struct in 6_addr));64 memcpy(&in.sin6_addr, src, sizeof(struct in_addr6)); 62 65 getnameinfo((struct sockaddr *)&in, sizeof(struct 63 66 sockaddr_in6), dst, cnt, NULL, 0, NI_NUMERICHOST); … … 92 95 } 93 96 94 //#endif97 #endif 95 98 96 99 static mrb_value … … 192 195 } 193 196 197 #ifndef _WIN32 194 198 static mrb_value 195 199 mrb_addrinfo_unix_path(mrb_state *mrb, mrb_value self) … … 202 206 return mrb_str_new_cstr(mrb, ((struct sockaddr_un *)RSTRING_PTR(sastr))->sun_path); 203 207 } 208 #endif 204 209 205 210 static mrb_value … … 256 261 static mrb_value 257 262 mrb_basicsocket_getpeereid(mrb_state *mrb, mrb_value self) 258 { 263 { 259 264 #ifdef HAVE_GETPEEREID 260 265 mrb_value ary; … … 262 267 uid_t euid; 263 268 int s; 264 269 265 270 s = socket_fd(mrb, self); 266 271 if (getpeereid(s, &euid, &egid) != 0) … … 279 284 static mrb_value 280 285 mrb_basicsocket_getpeername(mrb_state *mrb, mrb_value self) 281 { 286 { 282 287 struct sockaddr_storage ss; 283 288 socklen_t salen; 284 289 285 290 salen = sizeof(ss); 286 291 if (getpeername(socket_fd(mrb, self), (struct sockaddr *)&ss, &salen) != 0) … … 292 297 static mrb_value 293 298 mrb_basicsocket_getsockname(mrb_state *mrb, mrb_value self) 294 { 299 { 295 300 struct sockaddr_storage ss; 296 301 socklen_t salen; 297 302 298 303 salen = sizeof(ss); 299 304 if (getsockname(socket_fd(mrb, self), (struct sockaddr *)&ss, &salen) != 0) … … 305 310 static mrb_value 306 311 mrb_basicsocket_getsockopt(mrb_state *mrb, mrb_value self) 307 { 312 { 308 313 char opt[8]; 309 314 int s; … … 325 330 static mrb_value 326 331 mrb_basicsocket_recv(mrb_state *mrb, mrb_value self) 327 { 332 { 328 333 int n; 329 334 mrb_int maxlen, flags = 0; … … 341 346 static mrb_value 342 347 mrb_basicsocket_recvfrom(mrb_state *mrb, mrb_value self) 343 { 348 { 344 349 int n; 345 350 mrb_int maxlen, flags = 0; … … 364 369 static mrb_value 365 370 mrb_basicsocket_send(mrb_state *mrb, mrb_value self) 366 { 371 { 367 372 int n; 368 373 mrb_int flags; … … 383 388 static mrb_value 384 389 mrb_basicsocket_setnonblock(mrb_state *mrb, mrb_value self) 385 { 390 { 386 391 int fd, flags; 387 392 mrb_value bool; 393 #ifdef _WIN32 394 u_long mode = 1; 395 #endif 388 396 389 397 mrb_get_args(mrb, "o", &bool); 390 398 fd = socket_fd(mrb, self); 399 #ifdef _WIN32 400 flags = ioctlsocket(fd, FIONBIO, &mode); 401 if (flags != NO_ERROR) 402 mrb_sys_fail(mrb, "ioctlsocket"); 403 #else 391 404 flags = fcntl(fd, F_GETFL, 0); 392 405 if (flags == 1) … … 398 411 if (fcntl(fd, F_SETFL, flags) == -1) 399 412 mrb_sys_fail(mrb, "fcntl"); 413 #endif 400 414 return mrb_nil_value(); 401 415 } … … 403 417 static mrb_value 404 418 mrb_basicsocket_setsockopt(mrb_state *mrb, mrb_value self) 405 { 419 { 406 420 int argc, s; 407 421 mrb_int level = 0, optname; … … 420 434 optval = mrb_str_new(mrb, (char *)&i, sizeof(i)); 421 435 } else if (mrb_fixnum_p(optval)) { 422 mrb_int i = mrb_fixnum(optval); 423 optval = mrb_str_new(mrb, (char *)&i, sizeof(i)); 436 if (optname == IP_MULTICAST_TTL || optname == IP_MULTICAST_LOOP) { 437 char uc = mrb_fixnum(optval); 438 optval = mrb_str_new(mrb, &uc, sizeof(uc)); 439 } else { 440 mrb_int i = mrb_fixnum(optval); 441 optval = mrb_str_new(mrb, (char *)&i, sizeof(i)); 442 } 424 443 } else { 425 444 mrb_raise(mrb, E_ARGUMENT_ERROR, "optval should be true, false, an integer, or a string"); … … 443 462 static mrb_value 444 463 mrb_basicsocket_shutdown(mrb_state *mrb, mrb_value self) 445 { 464 { 446 465 mrb_int how = SHUT_RDWR; 447 466 … … 454 473 static mrb_value 455 474 mrb_ipsocket_ntop(mrb_state *mrb, mrb_value klass) 456 { 475 { 457 476 mrb_int af, n; 458 477 char *addr, buf[50]; … … 468 487 static mrb_value 469 488 mrb_ipsocket_pton(mrb_state *mrb, mrb_value klass) 470 { 489 { 471 490 mrb_int af, n; 472 491 char *bp, buf[50]; … … 498 517 static mrb_value 499 518 mrb_ipsocket_recvfrom(mrb_state *mrb, mrb_value self) 500 { 519 { 501 520 struct sockaddr_storage ss; 502 521 socklen_t socklen; … … 528 547 mrb_value buf; 529 548 size_t bufsize; 530 549 531 550 #ifdef HOST_NAME_MAX 532 551 bufsize = HOST_NAME_MAX + 1; … … 568 587 { 569 588 mrb_value sastr; 570 int s;589 mrb_int s; 571 590 572 591 mrb_get_args(mrb, "iS", &s, &sastr); 573 if (bind( s, (struct sockaddr *)RSTRING_PTR(sastr), (socklen_t)RSTRING_LEN(sastr)) == -1) {592 if (bind((int)s, (struct sockaddr *)RSTRING_PTR(sastr), (socklen_t)RSTRING_LEN(sastr)) == -1) { 574 593 mrb_sys_fail(mrb, "bind"); 575 594 } … … 581 600 { 582 601 mrb_value sastr; 583 int s;602 mrb_int s; 584 603 585 604 mrb_get_args(mrb, "iS", &s, &sastr); 586 if (connect( s, (struct sockaddr *)RSTRING_PTR(sastr), (socklen_t)RSTRING_LEN(sastr)) == -1) {605 if (connect((int)s, (struct sockaddr *)RSTRING_PTR(sastr), (socklen_t)RSTRING_LEN(sastr)) == -1) { 587 606 mrb_sys_fail(mrb, "connect"); 588 607 } … … 593 612 mrb_socket_listen(mrb_state *mrb, mrb_value klass) 594 613 { 595 int backlog, s;614 mrb_int backlog, s; 596 615 597 616 mrb_get_args(mrb, "ii", &s, &backlog); 598 if (listen( s,backlog) == -1) {617 if (listen((int)s, (int)backlog) == -1) { 599 618 mrb_sys_fail(mrb, "listen"); 600 619 } … … 623 642 mrb_socket_sockaddr_un(mrb_state *mrb, mrb_value klass) 624 643 { 644 #ifdef _WIN32 645 mrb_raise(mrb, E_NOTIMP_ERROR, "sockaddr_un unsupported on Windows"); 646 return mrb_nil_value(); 647 #else 625 648 struct sockaddr_un *sunp; 626 649 mrb_value path, s; 627 650 628 651 mrb_get_args(mrb, "S", &path); 629 652 if (RSTRING_LEN(path) > sizeof(sunp->sun_path) - 1) { … … 637 660 mrb_str_resize(mrb, s, sizeof(struct sockaddr_un)); 638 661 return s; 662 #endif 639 663 } 640 664 … … 642 666 mrb_socket_socketpair(mrb_state *mrb, mrb_value klass) 643 667 { 668 #ifdef _WIN32 669 mrb_raise(mrb, E_NOTIMP_ERROR, "socketpair unsupported on Windows"); 670 return mrb_nil_value(); 671 #else 644 672 mrb_value ary; 645 673 mrb_int domain, type, protocol; … … 655 683 mrb_ary_push(mrb, ary, mrb_fixnum_value(sv[1])); 656 684 return ary; 685 #endif 657 686 } 658 687 … … 686 715 * will break on socket descriptors. 687 716 */ 717 #ifdef _WIN32 718 static mrb_value 719 mrb_win32_basicsocket_close(mrb_state *mrb, mrb_value self) 720 { 721 if (closesocket(socket_fd(mrb, self)) != NO_ERROR) 722 mrb_raise(mrb, E_SOCKET_ERROR, "closesocket unsuccessful"); 723 return mrb_nil_value(); 724 } 725 726 #define E_EOF_ERROR (mrb_class_get(mrb, "EOFError")) 727 static mrb_value 728 mrb_win32_basicsocket_sysread(mrb_state *mrb, mrb_value self) 729 { 730 int sd, ret; 731 mrb_value buf = mrb_nil_value(); 732 mrb_int maxlen; 733 734 mrb_get_args(mrb, "i|S", &maxlen, &buf); 735 if (maxlen < 0) { 736 return mrb_nil_value(); 737 } 738 739 if (mrb_nil_p(buf)) { 740 buf = mrb_str_new(mrb, NULL, maxlen); 741 } 742 if (RSTRING_LEN(buf) != maxlen) { 743 buf = mrb_str_resize(mrb, buf, maxlen); 744 } 745 746 sd = socket_fd(mrb, self); 747 ret = recv(sd, RSTRING_PTR(buf), maxlen, 0); 748 749 switch (ret) { 750 case 0: /* EOF */ 751 if (maxlen == 0) { 752 buf = mrb_str_new_cstr(mrb, ""); 753 } else { 754 mrb_raise(mrb, E_EOF_ERROR, "sysread failed: End of File"); 755 } 756 break; 757 case SOCKET_ERROR: /* Error */ 758 mrb_sys_fail(mrb, "recv"); 759 break; 760 default: 761 if (RSTRING_LEN(buf) != ret) { 762 buf = mrb_str_resize(mrb, buf, ret); 763 } 764 break; 765 } 766 767 return buf; 768 } 769 770 static mrb_value 771 mrb_win32_basicsocket_sysseek(mrb_state *mrb, mrb_value self) 772 { 773 mrb_raise(mrb, E_NOTIMP_ERROR, "sysseek not implemented for windows sockets"); 774 return mrb_nil_value(); 775 } 776 777 static mrb_value 778 mrb_win32_basicsocket_syswrite(mrb_state *mrb, mrb_value self) 779 { 780 int n; 781 SOCKET sd; 782 mrb_value str; 783 784 sd = socket_fd(mrb, self); 785 mrb_get_args(mrb, "S", &str); 786 n = send(sd, RSTRING_PTR(str), RSTRING_LEN(str), 0); 787 if (n == SOCKET_ERROR) 788 mrb_sys_fail(mrb, "send"); 789 return mrb_fixnum_value(n); 790 } 791 792 #endif 688 793 689 794 void … … 693 798 struct RClass *constants; 694 799 800 #ifdef _WIN32 801 WSADATA wsaData; 802 int result; 803 result = WSAStartup(MAKEWORD(2,2), &wsaData); 804 if (result != NO_ERROR) 805 mrb_raise(mrb, E_RUNTIME_ERROR, "WSAStartup failed"); 806 #else 695 807 struct RClass *usock; 808 #endif 696 809 697 810 ai = mrb_define_class(mrb, "Addrinfo", mrb->object_class); … … 699 812 mrb_define_class_method(mrb, ai, "getaddrinfo", mrb_addrinfo_getaddrinfo, MRB_ARGS_REQ(2)|MRB_ARGS_OPT(4)); 700 813 mrb_define_method(mrb, ai, "getnameinfo", mrb_addrinfo_getnameinfo, MRB_ARGS_OPT(1)); 814 #ifndef _WIN32 701 815 mrb_define_method(mrb, ai, "unix_path", mrb_addrinfo_unix_path, MRB_ARGS_NONE()); 816 #endif 702 817 703 818 io = mrb_class_get(mrb, "IO"); … … 746 861 //mrb_define_method(mrb, sock, "sysaccept", mrb_socket_accept, MRB_ARGS_NONE()); 747 862 863 #ifndef _WIN32 748 864 usock = mrb_define_class(mrb, "UNIXSocket", bsock); 865 #endif 749 866 //mrb_define_class_method(mrb, usock, "pair", mrb_unixsocket_open, MRB_ARGS_OPT(2)); 750 867 //mrb_define_class_method(mrb, usock, "socketpair", mrb_unixsocket_open, MRB_ARGS_OPT(2)); … … 755 872 756 873 /* Windows IO Method Overrides on BasicSocket */ 874 #ifdef _WIN32 875 mrb_define_method(mrb, bsock, "close", mrb_win32_basicsocket_close, MRB_ARGS_NONE()); 876 mrb_define_method(mrb, bsock, "sysread", mrb_win32_basicsocket_sysread, MRB_ARGS_REQ(1)|MRB_ARGS_OPT(1)); 877 mrb_define_method(mrb, bsock, "sysseek", mrb_win32_basicsocket_sysseek, MRB_ARGS_REQ(1)); 878 mrb_define_method(mrb, bsock, "syswrite", mrb_win32_basicsocket_syswrite, MRB_ARGS_REQ(1)); 879 #endif 757 880 758 881 constants = mrb_define_module_under(mrb, sock, "Constants"); … … 774 897 freeaddrinfo(mrb_cptr(ai)); 775 898 } 776 } 899 #ifdef _WIN32 900 WSACleanup(); 901 #endif 902 }
Note:
See TracChangeset
for help on using the changeset viewer.