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"); }