示例#1
0
static SOCKET
efl_net_accept4(SOCKET fd, struct sockaddr *addr, socklen_t *addrlen, Eina_Bool close_on_exec)
{
#ifdef HAVE_ACCEPT4
   int flags = 0;
   if (close_on_exec) flags |= SOCK_CLOEXEC;
   return accept4(fd, addr, addrlen, flags);
#else
   SOCKET client = accept(fd, addr, addrlen);
   if (client == INVALID_SOCKET) return client;

#ifdef FD_CLOEXEC
   if (close_on_exec)
     {
        if (!eina_file_close_on_exec(client, EINA_TRUE))
          {
             int errno_bkp = errno;
             ERR("fcntl(" SOCKET_FMT ", F_SETFD, FD_CLOEXEC): %s", client, strerror(errno));
             closesocket(client);
             errno = errno_bkp;
             return INVALID_SOCKET;
          }
     }
#else
   (void)close_on_exec;
#endif

   return client;
#endif
}
/* Connects to the peer and returns a socket
 * descriptor.
 */
static int
tcp_connect(void)
{
   const char *PORT = "443";
   const char *SERVER = "69.58.181.89"; //verisign.com
   int err, sd;
   int flag = 1, curstate = 0;
   struct sockaddr_in sa;

   /* sets some fd options such as nonblock */
   sd = socket(AF_INET, SOCK_STREAM, 0);
   fcntl(sd, F_SETFL, O_NONBLOCK);
   eina_file_close_on_exec(sd, EINA_TRUE);
   setsockopt(sd, SOL_SOCKET, SO_REUSEADDR, (const void *)&curstate, sizeof(curstate));

   setsockopt(sd, IPPROTO_TCP, TCP_NODELAY, (char *)&flag, sizeof(int));

   memset(&sa, '\0', sizeof (sa));
   sa.sin_family = AF_INET;
   sa.sin_port = eina_htons(atoi(PORT));
   inet_pton(AF_INET, SERVER, &sa.sin_addr);

   /* connects to server
    */
   err = connect(sd, (struct sockaddr *)&sa, sizeof (sa));
   if ((err < 0) && (errno != EINPROGRESS))
     {
        print("Connect error\n");
        exit(1);
     }

   return sd;
}
示例#3
0
EAPI Eina_Bool
eina_mmap_safety_enabled_set(Eina_Bool enabled)
{
#ifndef HAVE_SIGINFO_T
   (void) enabled;
   return EINA_FALSE;
#else
   if (_eina_mmap_log_dom < 0)
     {
        _eina_mmap_log_dom = eina_log_domain_register("eina_mmap",
                                                      EINA_LOG_COLOR_DEFAULT);
        if (_eina_mmap_log_dom < 0)
          {
             EINA_LOG_ERR("Could not register log domain: eina_mmap");
             return EINA_FALSE;
          }
     }

   enabled = !!enabled;

   if (mmap_safe == enabled) return mmap_safe;
   if (enabled)
     {
        struct sigaction  sa;

        /* find out system page size the cleanest way we can */
        _eina_mmap_pagesize = eina_cpu_page_size();

        /* no zero page device - open it */
        if (_eina_mmap_zero_fd < 0)
          {
             _eina_mmap_zero_fd = open("/dev/zero", O_RDWR);
             /* if we don;'t have one - fail to set up mmap safety */
             if (_eina_mmap_zero_fd < 0) return EINA_FALSE;
             eina_file_close_on_exec(_eina_mmap_zero_fd, EINA_TRUE);
          }
        /* set up signal handler for SIGBUS */
        sa.sa_sigaction = _eina_mmap_safe_sigbus;
        sa.sa_flags = SA_RESTART | SA_SIGINFO;
        sigemptyset(&sa.sa_mask);
        if (sigaction(SIGBUS, &sa, &_eina_mmap_prev_sigaction) == 0) goto done;
        /* setup of SIGBUS handler failed, lets close zero page dev and fail */
        close(_eina_mmap_zero_fd);
        _eina_mmap_zero_fd = -1;
        return EINA_FALSE;
     }
   else
     {
        /* reset signal handler to default for SIGBUS */
        if (_eina_mmap_zero_fd >= 0)
          {
             close(_eina_mmap_zero_fd);
             _eina_mmap_zero_fd = -1;
          }
        signal(SIGBUS, SIG_DFL);
     }
done:   
   mmap_safe = enabled;
   return mmap_safe;
#endif
}