void uae_slirp_cleanup(void) { #ifdef WITH_QEMU_SLIRP if (impl == QEMU_IMPLEMENTATION) { UAE_LOG_STUB(""); return; } #endif #ifdef WITH_BUILTIN_SLIRP if (impl == BUILTIN_IMPLEMENTATION) { slirp_cleanup(); return; } #endif }
void ethernet_close (struct netdriverdata *ndd, void *vsd) { if (!ndd) return; switch (ndd->type) { case UAENET_SLIRP: case UAENET_SLIRP_INBOUND: if (slirp_data) { slirp_data = NULL; slirp_end (); slirp_cleanup (); uae_sem_destroy (&slirp_sem1); uae_sem_destroy (&slirp_sem2); } return; #ifdef WITH_UAENET_PCAP case UAENET_PCAP: return uaenet_close (vsd); #endif } }
void sim_slirp_close (SLIRP *slirp) { struct redir_tcp_udp *rtmp; if (slirp) { g_free (slirp->args); g_free (slirp->tftp_path); g_free (slirp->boot_file); g_free (slirp->dns_search); g_free (slirp->dns_search_domains); while ((rtmp = slirp->rtcp)) { slirp_remove_hostfwd(slirp->slirp, rtmp->is_udp, rtmp->inaddr, rtmp->lport); slirp->rtcp = rtmp->next; g_free (rtmp); } g_array_free(slirp->gpollfds, true); if (slirp->db_chime != INVALID_SOCKET) closesocket (slirp->db_chime); if (1) { struct slirp_write_request *buffer; while (NULL != (buffer = slirp->write_buffers)) { slirp->write_buffers = buffer->next; free(buffer); } while (NULL != (buffer = slirp->write_requests)) { slirp->write_requests = buffer->next; free(buffer); } } pthread_mutex_destroy (&slirp->write_buffer_lock); if (slirp->slirp) slirp_cleanup(slirp->slirp); } g_free (slirp); }