static u_char IPXCloseSocket(u_short port) { ipx_socket_t *mysock; far_t ECBPtr; /* see if this socket is actually open */ n_printf("IPX: close socket %x\n", port); mysock = ipx_find_socket(port); if (mysock == NULL) { n_printf("IPX: close of unopened socket\n"); return (RCODE_SOCKET_NOT_OPEN); } /* cancel all pending events on this socket */ n_printf("IPX: canceling all listen events on socket %x\n", port); ECBPtr = mysock->listenList; while (FARt_PTR(ECBPtr)) { if (IPXCancelEvent(ECBPtr) != RCODE_SUCCESS) return RCODE_CANNOT_CANCEL_EVENT; ECBPtr = mysock->listenList; } n_printf("IPX: canceling all AES events on socket %x\n", port); ECBPtr = mysock->AESList; while (FARt_PTR(ECBPtr)) { if (IPXCancelEvent(ECBPtr) != RCODE_SUCCESS) return RCODE_CANNOT_CANCEL_EVENT; ECBPtr = mysock->AESList; } /* now close the file descriptor for the socket, and free it */ n_printf("IPX: closing file descriptor on socket %x\n", port); remove_from_io_select(mysock->fd); close(mysock->fd); ipx_remove_socket(mysock); n_printf("IPX: successfully closed socket %x\n", port); return (RCODE_SUCCESS); }
void spx_destroy_socket(struct sock *sk) { struct spx_opt *pdata = &sk->tp_pinfo.af_spx; struct sk_buff *skb; ipx_remove_socket(sk); while((skb = skb_dequeue(&sk->receive_queue)) != NULL) kfree_skb(skb); while((skb = skb_dequeue(&pdata->transmit_queue)) != NULL) kfree_skb(skb); while((skb = skb_dequeue(&pdata->retransmit_queue)) != NULL) kfree_skb(skb); while((skb = skb_dequeue(&pdata->rcv_queue)) != NULL) kfree_skb(skb); sk_free(sk); MOD_DEC_USE_COUNT; }