* Destroy node */
| 929 | * Destroy node |
| 930 | */ |
| 931 | static int |
| 932 | ng_ksocket_shutdown(node_p node) |
| 933 | { |
| 934 | const priv_p priv = NG_NODE_PRIVATE(node); |
| 935 | priv_p embryo; |
| 936 | |
| 937 | /* Close our socket (if any) */ |
| 938 | if (priv->so != NULL) { |
| 939 | SOCKBUF_LOCK(&priv->so->so_rcv); |
| 940 | soupcall_clear(priv->so, SO_RCV); |
| 941 | SOCKBUF_UNLOCK(&priv->so->so_rcv); |
| 942 | SOCKBUF_LOCK(&priv->so->so_snd); |
| 943 | soupcall_clear(priv->so, SO_SND); |
| 944 | SOCKBUF_UNLOCK(&priv->so->so_snd); |
| 945 | soclose(priv->so); |
| 946 | priv->so = NULL; |
| 947 | } |
| 948 | |
| 949 | /* If we are an embryo, take ourselves out of the parent's list */ |
| 950 | if (priv->flags & KSF_EMBRYONIC) { |
| 951 | LIST_REMOVE(priv, siblings); |
| 952 | priv->flags &= ~KSF_EMBRYONIC; |
| 953 | } |
| 954 | |
| 955 | /* Remove any embryonic children we have */ |
| 956 | while (!LIST_EMPTY(&priv->embryos)) { |
| 957 | embryo = LIST_FIRST(&priv->embryos); |
| 958 | ng_rmnode_self(embryo->node); |
| 959 | } |
| 960 | |
| 961 | /* Take down netgraph node */ |
| 962 | bzero(priv, sizeof(*priv)); |
| 963 | free(priv, M_NETGRAPH_KSOCKET); |
| 964 | NG_NODE_SET_PRIVATE(node, NULL); |
| 965 | NG_NODE_UNREF(node); /* let the node escape */ |
| 966 | return (0); |
| 967 | } |
| 968 | |
| 969 | /* |
| 970 | * Hook disconnection |
nothing calls this directly
no test coverage detected