Esempio n. 1
0
File: Io.c Progetto: CZ-NIC/dionaea
/* set the Io */
int
set_Io(Io *self, PyObject *fd, int events)
{
    int fdnum;

#ifdef MS_WINDOWS
    if (!PyObject_TypeCheck(fd, PySocketModule.Sock_Type)) {
        PyErr_SetString(PyExc_TypeError, "only socket objects are supported "
                        "in this configuration");
        return -1;
    }
#endif
    fdnum = PyObject_AsFileDescriptor(fd);
    if (fdnum == -1) {
        return -1;
    }
#ifdef MS_WINDOWS
    fdnum = EV_WIN32_HANDLE_TO_FD(fdnum);
    if (fdnum == -1) {
        PyErr_SetFromWindowsErr(0);
        return -1;
    }
#endif
    if (events & ~(EV_READ | EV_WRITE)) {
        PyErr_SetString(Error, "illegal event mask");
        return -1;
    }
    ev_io_set(&self->io, fdnum, events);
    return 0;
}
Esempio n. 2
0
int aesocaccept(fd_t s, fd_t *sa, unsigned int *ip, unsigned short *port)
{
    SOCKET socket = EV_FD_TO_WIN32_HANDLE(s);
    SOCKET sockConn = INVALID_SOCKET;
    SOCKADDR_IN  addrIn;
    int len = sizeof(SOCKADDR);    
    
    sockConn = accept(socket, (SOCKADDR*)&addrIn, &len);    
    if(INVALID_SOCKET == sockConn) {
        return _wouldblock;
    }    
    if(SOCKET_ERROR == sockConn){     
        return (WSAGetLastError()==WSAEWOULDBLOCK) ? _wouldblock : (-1);
    }    
    if(!aesocnoblock(sockConn)){
        closesocket(sockConn);
        return (-1);
    }
    if(ip){
        *ip = addrIn.sin_addr.s_addr;
    }
    if(port){
        *port = ntohs(addrIn.sin_port);
    }    
    *sa = EV_WIN32_HANDLE_TO_FD(sockConn);    
    return 0;
}   
Esempio n. 3
0
fd_t aesoccreate(int acceptor)
{
    SOCKET soc = 0;
    int on = 1;
    
    soc = socket(AF_INET,SOCK_STREAM,0);
    if(INVALID_SOCKET == soc){
        return _INVALIDFD;
    }
    if(acceptor&&(setsockopt(soc,SOL_SOCKET,SO_REUSEADDR,(const char*)&on,sizeof(on))==-1)){
        closesocket(soc);
        return _INVALIDFD;
    }    
    if(!aesocnoblock(soc)){
        closesocket(soc);
        return _INVALIDFD;
	}

    return EV_WIN32_HANDLE_TO_FD(soc);
}
Esempio n. 4
0
/* oh, the humanity! */
static int
ev_pipe (int filedes [2])
{
  struct sockaddr_in addr = { 0 };
  int addr_size = sizeof (addr);
  struct sockaddr_in adr2;
  int adr2_size = sizeof (adr2);
  SOCKET listener;
  SOCKET sock [2] = { -1, -1 };

  if ((listener = socket (AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET) 
    return -1;

  addr.sin_family = AF_INET;
  addr.sin_addr.s_addr = htonl (INADDR_LOOPBACK);
  addr.sin_port = 0;

  if (bind (listener, (struct sockaddr *)&addr, addr_size))
    goto fail;

  if (getsockname (listener, (struct sockaddr *)&addr, &addr_size))
    goto fail;

  if (listen (listener, 1))
    goto fail;

  if ((sock [0] = socket (AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET) 
    goto fail;

  if (connect (sock [0], (struct sockaddr *)&addr, addr_size))
    goto fail;

  if ((sock [1] = accept (listener, 0, 0)) < 0)
    goto fail;

  /* windows vista returns fantasy port numbers for sockets:
   * example for two interconnected tcp sockets:
   *
   * (Socket::unpack_sockaddr_in getsockname $sock0)[0] == 53364
   * (Socket::unpack_sockaddr_in getpeername $sock0)[0] == 53363
   * (Socket::unpack_sockaddr_in getsockname $sock1)[0] == 53363
   * (Socket::unpack_sockaddr_in getpeername $sock1)[0] == 53365
   *
   * wow! tridirectional sockets!
   *
   * this way of checking ports seems to work:
   */
  if (getpeername (sock [0], (struct sockaddr *)&addr, &addr_size))
    goto fail;

  if (getsockname (sock [1], (struct sockaddr *)&adr2, &adr2_size))
    goto fail;

  errno = WSAEINVAL;
  if (addr_size != adr2_size
      || addr.sin_addr.s_addr != adr2.sin_addr.s_addr /* just to be sure, I mean, it's windows */
      || addr.sin_port        != adr2.sin_port)
    goto fail;

  closesocket (listener);

#if EV_SELECT_IS_WINSOCKET
  filedes [0] = EV_WIN32_HANDLE_TO_FD (sock [0]);
  filedes [1] = EV_WIN32_HANDLE_TO_FD (sock [1]);
#else
  /* when select isn't winsocket, we also expect socket, connect, accept etc.
   * to work on fds */
  filedes [0] = sock [0];
  filedes [1] = sock [1];
#endif

  return 0;

fail:
  closesocket (listener);

  if (sock [0] != INVALID_SOCKET) closesocket (sock [0]);
  if (sock [1] != INVALID_SOCKET) closesocket (sock [1]);

  return -1;
}