Beispiel #1
0
static void route_cmd(int cmd, in_addr_t dest, in_addr_t gate, in_addr_t mask, int index, int direct)
{
	int i = 0;
	int sock;
	int re;
	struct {
		struct rt_msghdr rtm;
		struct sockaddr_in addr[3];
	} buf;

	bzero(&buf, sizeof buf);
	buf.rtm.rtm_version = RTM_VERSION;
	buf.rtm.rtm_type    = cmd;
	buf.rtm.rtm_index   = index;
	buf.rtm.rtm_flags   = RTF_STATIC;
	if ( direct ) {
		buf.rtm.rtm_flags |= RTF_HOST;
	} else {
		buf.rtm.rtm_flags |= RTF_GATEWAY;
	}
	buf.rtm.rtm_addrs   = RTA_DST | RTA_NETMASK;
	if ( gate != 0 ) {
		buf.rtm.rtm_addrs |= RTA_GATEWAY;
	}
	buf.rtm.rtm_inits   = RTV_HOPCOUNT;
	buf.rtm.rtm_rmx.rmx_hopcount = 1;
	buf.rtm.rtm_seq	    = 1;

	buf.addr[i].sin_len = sizeof(struct sockaddr_in);
	buf.addr[i].sin_family = AF_INET;
	buf.addr[i].sin_addr.s_addr = dest;
	i++;

	if ( gate != 0 ) {
		buf.addr[i].sin_len = sizeof(struct sockaddr_in);
		buf.addr[i].sin_family = AF_INET;
		buf.addr[i].sin_addr.s_addr = gate;
		i++;
	}

	buf.addr[i].sin_len = sizeof(struct sockaddr_in);
	buf.addr[i].sin_family = AF_INET;
	buf.addr[i].sin_addr.s_addr = mask;
	i++;

	buf.rtm.rtm_msglen = sizeof(struct rt_msghdr) + sizeof(struct sockaddr) * i;

	sock = so_socket(AF_ROUTE, SOCK_RAW, 0);
	DEBUG_PRINT(("route_add: so_socket = %d(%d, %d)\n", sock, MERCD(sock), SERCD(sock)));
	so_shutdown(sock, SHUT_RD);
	re = so_write(sock, &buf, buf.rtm.rtm_msglen);
	DEBUG_PRINT(("route_add: so_write = %d(%d, %d)\n", re, MERCD(re), SERCD(re)));
	so_close(sock);
}
BOOL cg_socket_close(CgSocket *sock)
{
	cg_log_debug_l4("Entering...\n");

	if (cg_socket_isbound(sock) == FALSE)
		return TRUE;

#if defined(CG_USE_OPENSSL)
	if (cg_socket_isssl(sock) == TRUE) {
		if (sock->ctx) {
			SSL_shutdown(sock->ssl); 
			SSL_free(sock->ssl);
			sock->ssl = NULL;
		}
		if (sock->ctx) {
			SSL_CTX_free(sock->ctx);
			sock->ctx = NULL;
		}
	}
#endif

#if (defined(WIN32) || defined(__CYGWIN__)) && !defined(ITRON)
	#if !defined(WINCE)
	WSAAsyncSelect(sock->id, NULL, 0, FD_CLOSE);
	#endif
	shutdown(sock->id, SD_BOTH );
#if defined WINCE
	{
		int nRet = 1;
		char achDiscard[256];
		while (nRet && (nRet != SOCKET_ERROR)){
			if (nRet>0) {
				achDiscard[nRet]=(char)0;
#if defined DEBUG_SOCKET
				printf("DUMMY READ WHILE CLOSING SOCKET \n%s\n",achDiscard);
#endif
			}
			nRet = recv(sock->id,achDiscard,128,0);
		}
	}
#endif
	closesocket(sock->id);
	#if !defined(__CYGWIN__) && !defined(__MINGW32__)
	sock->id = INVALID_SOCKET;
	#else
	sock->id = -1;
	#endif
#else
	#if defined(BTRON) || (defined(TENGINE) && !defined(CG_TENGINE_NET_KASAGO))
	so_shutdown(sock->id, 2);
	so_close(sock->id);
	#elif defined(TENGINE) && defined(CG_TENGINE_NET_KASAGO)
	ka_tfClose(sock->id);
	#elif defined(ITRON)
	if (cg_socket_issocketstream(sock) == TRUE) {
		tcp_can_cep(sock->id, TFN_TCP_ALL);
		tcp_sht_cep(sock->id);
		tcp_del_cep(sock->id);
		tcp_cls_cep(sock->id, TMO_FEVR);
		tcp_del_rep(sock->id);
	}
	else {
		udp_can_cep(sock->id, TFN_UDP_ALL);
		udp_del_cep(sock->id);
	}
	#else
	int flag = fcntl(sock->id, F_GETFL, 0);
	if (0 <= flag)
		fcntl(sock->id, F_SETFL, flag | O_NONBLOCK);
	shutdown(sock->id, 2);
	close(sock->id);
	#endif
	sock->id = -1;
#endif

	cg_socket_setaddress(sock, "");
	cg_socket_setport(sock, -1);

	return TRUE;

	cg_log_debug_l4("Leaving...\n");
}