TLS_PRNG_SRC *tls_prng_egd_open(const char *name, int timeout) { const char *myname = "tls_prng_egd_open"; TLS_PRNG_SRC *egd; ACL_SOCKET fd; if (acl_msg_verbose) acl_msg_info("%s: connect to EGD server %s", myname, name); #ifdef ACL_UNIX fd = acl_unix_connect(name, ACL_BLOCKING, timeout); #elif defined(ACL_MS_WINDOWS) fd = acl_inet_connect(name, ACL_BLOCKING, timeout); #endif if (fd < 0) { if (acl_msg_verbose) acl_msg_info("%s: cannot connect to EGD server %s: %s", myname, name, acl_last_serror()); return (0); } else { egd = (TLS_PRNG_SRC *) acl_mymalloc(sizeof(*egd)); egd->fd.sock = fd; egd->name = acl_mystrdup(name); egd->timeout = timeout; if (acl_msg_verbose) acl_msg_info("%s: connected to EGD server %s", myname, name); return (egd); } }
int acl_inet_trigger(ACL_EVENT *eventp, const char *service, const char *buf, int len, int timeout) { const char *myname = "acl_inet_trigger"; struct ACL_INET_TRIGGER *ip; int fd; if (acl_msg_verbose > 1) acl_msg_info("%s: service %s", myname, service); /* * Connect... */ if ((fd = acl_inet_connect(service, ACL_BLOCKING, timeout)) < 0) { if (acl_msg_verbose) acl_msg_warn("%s: connect to %s: %s", myname, service, strerror(errno)); return (-1); } acl_close_on_exec(fd, ACL_CLOSE_ON_EXEC); /* * Stash away context. */ ip = (struct ACL_INET_TRIGGER *) acl_mymalloc(sizeof(*ip)); ip->fd = fd; ip->service = acl_mystrdup(service); ip->stream = acl_vstream_fdopen(fd, O_RDWR, 4096, timeout, ACL_VSTREAM_TYPE_LISTEN_INET); ip->eventp = eventp; /* * Write the request... */ if (acl_write_buf(fd, buf, len, timeout) < 0 || acl_write_buf(fd, "", 1, timeout) < 0) { if (acl_msg_verbose) acl_msg_warn("%s: write to %s: %s", myname, service, strerror(errno)); } /* * Wakeup when the peer disconnects, or when we lose patience. */ if (timeout > 0) acl_event_enable_read(ip->eventp, ip->stream, timeout + 100, acl_inet_trigger_event, (void *) ip); else acl_event_enable_read(ip->eventp, ip->stream, 0, acl_inet_trigger_event, (void *) ip); return (0); }
int acl_sane_socketpair(int domain, int type, int protocol, ACL_SOCKET result[2]) { ACL_SOCKET listener = acl_inet_listen("127.0.0.1:0", 1, ACL_BLOCKING); char addr[64]; (void) domain; result[0] = ACL_SOCKET_INVALID; result[1] = ACL_SOCKET_INVALID; if (listener == ACL_SOCKET_INVALID) { acl_msg_error("%s(%d), %s: listen error %s", __FILE__, __LINE__, __FUNCTION__, acl_last_serror()); return -1; } acl_tcp_set_nodelay(listener); if (acl_getsockname(listener, addr, sizeof(addr)) < 0) { acl_msg_error("%s(%d), %s: getoskname error %s", __FILE__, __LINE__, __FUNCTION__, acl_last_serror()); acl_socket_close(listener); return -1; } result[0] = acl_inet_connect(addr, ACL_BLOCKING, 0); if (result[0] == ACL_SOCKET_INVALID) { acl_msg_error("%s(%d), %s: connect %s error %s", __FILE__, __LINE__, __FUNCTION__, addr, acl_last_serror()); acl_socket_close(listener); return -1; } result[1] = acl_inet_accept(listener); acl_socket_close(listener); if (result[1] == ACL_SOCKET_INVALID) { acl_msg_error("%s(%d), %s: accept error %s", __FILE__, __LINE__, __FUNCTION__, acl_last_serror()); acl_socket_close(result[0]); result[0] = ACL_SOCKET_INVALID; return -1; } acl_tcp_set_nodelay(result[0]); acl_tcp_set_nodelay(result[1]); return 0; }