void ep_delete (DDS_DomainParticipant part, DDS_BuiltinTopicKey_t *key) { Topic *tp; Endpoint *ep, *xep, *prev; ep = ep_lookup (key); if (!ep) { printf ("Already deleted?\r\n"); return; } printf ("* Delete %s (%s/%s)\r\n", (ep->writer) ? "writer" : "reader", ep->topic->topic_name, ep->topic->type_name); if (ep->writer) xep = ep->topic->writers; else xep = ep->topic->readers; /* Remove from topic endpoints list. */ for (prev = NULL; xep; prev = xep, xep = xep->link) if (xep == ep) { /* Found it! */ tp = ep->topic; if (!prev) if (ep->writer) tp->writers = ep->link; else tp->readers = ep->link; else prev->next = ep->link; /* If last writer and active reader: stop. */ if (ep->writer && !tp->writers && tp->active) stop_reader (part, tp); /* If no more readers nor writers, free topic. */ if (!tp->readers && !tp->writers) { if (tp->ts) cleanup_reader (part, tp); free (tp->topic_name); free (tp->type_name); LIST_REMOVE (topics, *tp); free (tp); } break; } /* Free endpoint. */ LIST_REMOVE (endpoints, *ep); free (ep); }
int start_reader() { if(reader_tid) stop_reader(); if(control_activate(&(incoming_messages.control))) { LOGE("%s: cannot activate incoming messages queue", __func__); return -1; } if(pthread_create(&reader_tid, NULL, reader, NULL)) { LOGE("%s: pthread_create: %s", __func__, strerror(errno)); return -1; } return 0; }
static int ti_restart(struct tip_cygwin *priv) { /* kill handle to if */ if (priv->tc_h) CloseHandle(priv->tc_h); /* stop reader */ if (stop_reader(priv)) return -1; /* reopen dev */ if (ti_do_open_cygwin(priv)) return -1; return start_reader(priv); }
void t_ignore (const char *cmd, DDS_DomainParticipant part) { Topic *tp; char spec [192]; skip_blanks (&cmd); skip_string (&cmd, spec); if (spec [0]) { lock_take (topic_lock); LIST_FOREACH (topics, tp) if (tp->active && !nmatch (spec, tp->topic_name, NM_CASEFOLD)) stop_reader (part, tp); lock_release (topic_lock); } }
/** * @brief disconnect from UNIX socket */ void disconnect_unix(JNIEnv *env, jclass clazz _U_) { if(!connected) return; stop_notifier(); pthread_mutex_lock(&write_lock); shutdown(sockfd, SHUT_RDWR); pthread_mutex_unlock(&write_lock); stop_reader(); close(sockfd); connected = 0; on_disconnect(env); }
static void ti_do_free(struct tif *ti) { struct tip_cygwin *priv = ti_priv(ti); /* stop reader */ stop_reader(priv); if (priv->tc_pipe[0]) { close(priv->tc_pipe[0]); close(priv->tc_pipe[1]); } /* close card */ if (priv->tc_h) { ti_media_status(priv, 0); CloseHandle(priv->tc_h); } if (priv->tc_key) RegCloseKey(priv->tc_key); free(priv); free(ti); }
/** * @brief connect to a cSploitd UNIX socket * @param jsocket_path path to the UNIX socket * @returns true on success, false on error. */ jboolean connect_unix(JNIEnv *env, jclass clazz _U_, jstring jsocket_path) { const char *socket_path; jboolean ret; struct sockaddr_un addr; if(connected) disconnect_unix(env, clazz); sockfd=-1; ret = JNI_FALSE; socket_path = (*env)->GetStringUTFChars(env, jsocket_path, NULL); if(!socket_path) goto jni_error; sockfd = socket(AF_UNIX, SOCK_STREAM, 0); if(sockfd<0) { LOGE("%s: socket: %s", __func__, strerror(errno)); goto cleanup; // nothing to close } memset(&addr, 0, sizeof(struct sockaddr_un)); addr.sun_family = AF_UNIX; strncpy(addr.sun_path, socket_path, sizeof(addr.sun_path)-1); if(connect(sockfd, (struct sockaddr *) &addr, sizeof(addr))) { LOGE("%s: connect: %s", __func__, strerror(errno)); goto error; } if(start_reader()) { LOGE("%s: cannot start reader", __func__); goto error; } if(start_notifier()) { LOGE("%s: cannot start notifier", __func__); goto error; } connected = 1; on_connect(); ret = JNI_TRUE; goto cleanup; jni_error: if((*env)->ExceptionCheck(env)) { (*env)->ExceptionDescribe(env); (*env)->ExceptionClear(env); } error: stop_notifier(); shutdown(sockfd, SHUT_WR); stop_reader(); close(sockfd); sockfd = -1; cleanup: if(socket_path) (*env)->ReleaseStringUTFChars(env, jsocket_path, socket_path); return ret; }