Esempio n. 1
0
_PUBLIC_ int swrap_connect(int s, const struct sockaddr *serv_addr, socklen_t addrlen)
{
	int ret;
	struct sockaddr_un un_addr;
	struct socket_info *si = find_socket_info(s);

	if (!si) {
		return real_connect(s, serv_addr, addrlen);
	}

	if (si->bound == 0) {
		ret = swrap_auto_bind(si, serv_addr->sa_family);
		if (ret == -1) return -1;
	}

	if (si->family != serv_addr->sa_family) {
		errno = EINVAL;
		return -1;
	}

	ret = sockaddr_convert_to_un(si, (const struct sockaddr *)serv_addr, addrlen, &un_addr, 0, NULL);
	if (ret == -1) return -1;

	swrap_dump_packet(si, serv_addr, SWRAP_CONNECT_SEND, NULL, 0);

	ret = real_connect(s, (struct sockaddr *)&un_addr, 
			   sizeof(struct sockaddr_un));

	/* to give better errors */
	if (ret == -1 && errno == ENOENT) {
		errno = EHOSTUNREACH;
	}

	if (ret == 0) {
		si->peername_len = addrlen;
		si->peername = sockaddr_dup(serv_addr, addrlen);
		si->connected = 1;

		swrap_dump_packet(si, serv_addr, SWRAP_CONNECT_RECV, NULL, 0);
		swrap_dump_packet(si, serv_addr, SWRAP_CONNECT_ACK, NULL, 0);
	} else {
		swrap_dump_packet(si, serv_addr, SWRAP_CONNECT_UNREACH, NULL, 0);
	}

	return ret;
}
Esempio n. 2
0
int connect (int fd, const struct sockaddr *sk, socklen_t sl){
	static struct sockaddr_in *rsk_in;
	
	rsk_in = (struct sockaddr_in *)sk;

    if ((rsk_in->sin_family == AF_INET) && (bind_addr_env || bind_port_env)) {
		real_bind (fd, (struct sockaddr *)local_sockaddr_in, sizeof (struct sockaddr));
	}

	return real_connect (fd, sk, sl);
}
Esempio n. 3
0
/* Wrapper around connect(2) to explicitly set TCP_NODELAY. */
static int nodelay_connect(
    int (*real_connect)(int, const struct sockaddr *, socklen_t),
    int sock, const struct sockaddr *addr, socklen_t addrlen)
{
	int res = real_connect(sock, addr, addrlen);
	if (!res && addr->sa_family == AF_INET) {
		int opt = 1;
		setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, &opt, sizeof(opt));
	}
	return res;
}
Esempio n. 4
0
int __connect (int sockfd, const struct sockaddr *serv_addr, 
               socklen_t attrlen)
{
  int rc;

  if (flume_libc_interposing ()) 
    rc = flume_connect (sockfd, serv_addr, attrlen);
  else
    rc = real_connect (sockfd, serv_addr, attrlen);
           
  return rc;
}
Esempio n. 5
0
int connect (int fd, const struct sockaddr *sk, socklen_t sl)
{
	static struct sockaddr_in *rsk_in;
	
	rsk_in = (struct sockaddr_in *)sk;
/*	printf("connect: %d %s:%d\n", fd, inet_ntoa (rsk_in->sin_addr.s_addr),
		ntohs (rsk_in->sin_port));*/
        if ((rsk_in->sin_family == AF_INET)
		&& (bind_addr_env)) {
		real_bind (fd, (struct sockaddr *)local_sockaddr_in, sizeof (struct sockaddr));
	}
	return real_connect (fd, sk, sl);
}
Esempio n. 6
0
//--------------------------------------------------------------------------
Connection::Connection (const char *db, const char *host, const char *user,
			const char *passwd, uint port, my_bool compress,
			unsigned int connect_timeout, bool te,
			const char *socket_name)
  : throw_exceptions(te), locked(false)
{
	mysql_init(&mysql);
  if (real_connect (db, host, user, passwd, port, compress,		connect_timeout,socket_name))
  {
    locked = false;
    Success = is_connected = true;
  }
  else
  {
    locked = false; Success = is_connected = false;
    if (throw_exceptions) throw BadQuery(error());
  }
}
int
connect(int sockfd, const struct sockaddr *serv_addr, socklen_t addrlen) 
{
  int retval;

  print_trace ("%*sconnect(%d, %p, %d)=...\n", indent, "",
	       sockfd, serv_addr, addrlen);
  indent+=2;

  /* call the real connect function */
  retval = real_connect (sockfd, serv_addr, addrlen);

  indent-=2;
  print_trace ("%*sconnect(%d, %p, %d)=%d\n", indent, "", 
	       sockfd, serv_addr, addrlen, retval);

  return retval;
}