Ignore:
Timestamp:
Jan 21, 2018, 12:10:09 AM (6 years ago)
Author:
coas-nagasima
Message:

prototoolに関連するプロジェクトをnewlibからmuslを使うよう変更・更新
ntshellをnewlibの下位の実装から、muslのsyscallの実装に変更・更新
以下のOSSをアップデート
・mruby-1.3.0
・musl-1.1.18
・onigmo-6.1.3
・tcc-0.9.27
以下のOSSを追加
・openssl-1.1.0e
・curl-7.57.0
・zlib-1.2.11
以下のmrbgemsを追加
・iij/mruby-digest
・iij/mruby-env
・iij/mruby-errno
・iij/mruby-iijson
・iij/mruby-ipaddr
・iij/mruby-mock
・iij/mruby-require
・iij/mruby-tls-openssl

File:
1 edited

Legend:

Unmodified
Added
Removed
  • EcnlProtoTool/trunk/mrbgems/mruby-socket/src/socket.c

    r321 r331  
    44** See Copyright Notice in mruby.h
    55*/
    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
    1527#include <stddef.h>
    1628#include <string.h>
    17 
    18 /*#include <unistd.h>*/
    19 extern int gethostname(char *name, size_t len);
    2029
    2130#include "mruby.h"
     
    2736#include "error.h"
    2837
    29 #ifndef NI_MAXHOST
    30 #define NI_MAXHOST 255
    31 #endif
    32 #ifndef NI_MAXSERV
    33 #define NI_MAXSERV 32
    34 #endif
    3538#define E_SOCKET_ERROR             (mrb_class_get(mrb, "SocketError"))
    3639
     
    4144#endif
    4245
    43 //#ifdef _WIN32
     46#ifdef _WIN32
    4447const char *inet_ntop(int af, const void *src, char *dst, socklen_t cnt)
    4548{
     
    5962        memset(&in, 0, sizeof(in));
    6063        in.sin6_family = AF_INET6;
    61         memcpy(&in.sin6_addr, src, sizeof(struct in6_addr));
     64        memcpy(&in.sin6_addr, src, sizeof(struct in_addr6));
    6265        getnameinfo((struct sockaddr *)&in, sizeof(struct
    6366                    sockaddr_in6), dst, cnt, NULL, 0, NI_NUMERICHOST);
     
    9295}
    9396
    94 //#endif
     97#endif
    9598
    9699static mrb_value
     
    192195}
    193196
     197#ifndef _WIN32
    194198static mrb_value
    195199mrb_addrinfo_unix_path(mrb_state *mrb, mrb_value self)
     
    202206  return mrb_str_new_cstr(mrb, ((struct sockaddr_un *)RSTRING_PTR(sastr))->sun_path);
    203207}
     208#endif
    204209
    205210static mrb_value
     
    256261static mrb_value
    257262mrb_basicsocket_getpeereid(mrb_state *mrb, mrb_value self)
    258 { 
     263{
    259264#ifdef HAVE_GETPEEREID
    260265  mrb_value ary;
     
    262267  uid_t euid;
    263268  int s;
    264  
     269
    265270  s = socket_fd(mrb, self);
    266271  if (getpeereid(s, &euid, &egid) != 0)
     
    279284static mrb_value
    280285mrb_basicsocket_getpeername(mrb_state *mrb, mrb_value self)
    281 { 
     286{
    282287  struct sockaddr_storage ss;
    283288  socklen_t salen;
    284  
     289
    285290  salen = sizeof(ss);
    286291  if (getpeername(socket_fd(mrb, self), (struct sockaddr *)&ss, &salen) != 0)
     
    292297static mrb_value
    293298mrb_basicsocket_getsockname(mrb_state *mrb, mrb_value self)
    294 { 
     299{
    295300  struct sockaddr_storage ss;
    296301  socklen_t salen;
    297  
     302
    298303  salen = sizeof(ss);
    299304  if (getsockname(socket_fd(mrb, self), (struct sockaddr *)&ss, &salen) != 0)
     
    305310static mrb_value
    306311mrb_basicsocket_getsockopt(mrb_state *mrb, mrb_value self)
    307 { 
     312{
    308313  char opt[8];
    309314  int s;
     
    325330static mrb_value
    326331mrb_basicsocket_recv(mrb_state *mrb, mrb_value self)
    327 { 
     332{
    328333  int n;
    329334  mrb_int maxlen, flags = 0;
     
    341346static mrb_value
    342347mrb_basicsocket_recvfrom(mrb_state *mrb, mrb_value self)
    343 { 
     348{
    344349  int n;
    345350  mrb_int maxlen, flags = 0;
     
    364369static mrb_value
    365370mrb_basicsocket_send(mrb_state *mrb, mrb_value self)
    366 { 
     371{
    367372  int n;
    368373  mrb_int flags;
     
    383388static mrb_value
    384389mrb_basicsocket_setnonblock(mrb_state *mrb, mrb_value self)
    385 { 
     390{
    386391  int fd, flags;
    387392  mrb_value bool;
     393#ifdef _WIN32
     394  u_long mode = 1;
     395#endif
    388396
    389397  mrb_get_args(mrb, "o", &bool);
    390398  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
    391404  flags = fcntl(fd, F_GETFL, 0);
    392405  if (flags == 1)
     
    398411  if (fcntl(fd, F_SETFL, flags) == -1)
    399412    mrb_sys_fail(mrb, "fcntl");
     413#endif
    400414  return mrb_nil_value();
    401415}
     
    403417static mrb_value
    404418mrb_basicsocket_setsockopt(mrb_state *mrb, mrb_value self)
    405 { 
     419{
    406420  int argc, s;
    407421  mrb_int level = 0, optname;
     
    420434      optval = mrb_str_new(mrb, (char *)&i, sizeof(i));
    421435    } 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      }
    424443    } else {
    425444      mrb_raise(mrb, E_ARGUMENT_ERROR, "optval should be true, false, an integer, or a string");
     
    443462static mrb_value
    444463mrb_basicsocket_shutdown(mrb_state *mrb, mrb_value self)
    445 { 
     464{
    446465  mrb_int how = SHUT_RDWR;
    447466
     
    454473static mrb_value
    455474mrb_ipsocket_ntop(mrb_state *mrb, mrb_value klass)
    456 { 
     475{
    457476  mrb_int af, n;
    458477  char *addr, buf[50];
     
    468487static mrb_value
    469488mrb_ipsocket_pton(mrb_state *mrb, mrb_value klass)
    470 { 
     489{
    471490  mrb_int af, n;
    472491  char *bp, buf[50];
     
    498517static mrb_value
    499518mrb_ipsocket_recvfrom(mrb_state *mrb, mrb_value self)
    500 { 
     519{
    501520  struct sockaddr_storage ss;
    502521  socklen_t socklen;
     
    528547  mrb_value buf;
    529548  size_t bufsize;
    530  
     549
    531550#ifdef HOST_NAME_MAX
    532551  bufsize = HOST_NAME_MAX + 1;
     
    568587{
    569588  mrb_value sastr;
    570   int s;
     589  mrb_int s;
    571590
    572591  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) {
    574593    mrb_sys_fail(mrb, "bind");
    575594  }
     
    581600{
    582601  mrb_value sastr;
    583   int s;
     602  mrb_int s;
    584603
    585604  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) {
    587606    mrb_sys_fail(mrb, "connect");
    588607  }
     
    593612mrb_socket_listen(mrb_state *mrb, mrb_value klass)
    594613{
    595   int backlog, s;
     614  mrb_int backlog, s;
    596615
    597616  mrb_get_args(mrb, "ii", &s, &backlog);
    598   if (listen(s, backlog) == -1) {
     617  if (listen((int)s, (int)backlog) == -1) {
    599618    mrb_sys_fail(mrb, "listen");
    600619  }
     
    623642mrb_socket_sockaddr_un(mrb_state *mrb, mrb_value klass)
    624643{
     644#ifdef _WIN32
     645  mrb_raise(mrb, E_NOTIMP_ERROR, "sockaddr_un unsupported on Windows");
     646  return mrb_nil_value();
     647#else
    625648  struct sockaddr_un *sunp;
    626649  mrb_value path, s;
    627  
     650
    628651  mrb_get_args(mrb, "S", &path);
    629652  if (RSTRING_LEN(path) > sizeof(sunp->sun_path) - 1) {
     
    637660  mrb_str_resize(mrb, s, sizeof(struct sockaddr_un));
    638661  return s;
     662#endif
    639663}
    640664
     
    642666mrb_socket_socketpair(mrb_state *mrb, mrb_value klass)
    643667{
     668#ifdef _WIN32
     669  mrb_raise(mrb, E_NOTIMP_ERROR, "socketpair unsupported on Windows");
     670  return mrb_nil_value();
     671#else
    644672  mrb_value ary;
    645673  mrb_int domain, type, protocol;
     
    655683  mrb_ary_push(mrb, ary, mrb_fixnum_value(sv[1]));
    656684  return ary;
     685#endif
    657686}
    658687
     
    686715 * will break on socket descriptors.
    687716 */
     717#ifdef _WIN32
     718static mrb_value
     719mrb_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"))
     727static mrb_value
     728mrb_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
     770static mrb_value
     771mrb_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
     777static mrb_value
     778mrb_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
    688793
    689794void
     
    693798  struct RClass *constants;
    694799
     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
    695807  struct RClass *usock;
     808#endif
    696809
    697810  ai = mrb_define_class(mrb, "Addrinfo", mrb->object_class);
     
    699812  mrb_define_class_method(mrb, ai, "getaddrinfo", mrb_addrinfo_getaddrinfo, MRB_ARGS_REQ(2)|MRB_ARGS_OPT(4));
    700813  mrb_define_method(mrb, ai, "getnameinfo", mrb_addrinfo_getnameinfo, MRB_ARGS_OPT(1));
     814#ifndef _WIN32
    701815  mrb_define_method(mrb, ai, "unix_path", mrb_addrinfo_unix_path, MRB_ARGS_NONE());
     816#endif
    702817
    703818  io = mrb_class_get(mrb, "IO");
     
    746861  //mrb_define_method(mrb, sock, "sysaccept", mrb_socket_accept, MRB_ARGS_NONE());
    747862
     863#ifndef _WIN32
    748864  usock = mrb_define_class(mrb, "UNIXSocket", bsock);
     865#endif
    749866  //mrb_define_class_method(mrb, usock, "pair", mrb_unixsocket_open, MRB_ARGS_OPT(2));
    750867  //mrb_define_class_method(mrb, usock, "socketpair", mrb_unixsocket_open, MRB_ARGS_OPT(2));
     
    755872
    756873  /* 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
    757880
    758881  constants = mrb_define_module_under(mrb, sock, "Constants");
     
    774897    freeaddrinfo(mrb_cptr(ai));
    775898  }
    776 }
     899#ifdef _WIN32
     900  WSACleanup();
     901#endif
     902}
Note: See TracChangeset for help on using the changeset viewer.