result_t libwrap_del_evt_listener(int32 mask, int32 listener_idx) { int32 count = 0; result_t rc = RESULT_OK; listener_t *header = NULL; rc = get_listeners(mask, &header); if (rc != RESULT_OK) { return rc; } if (header == NULL) return RESULT_NONE_POINTER; if (listener_idx < 1) return RESULT_NO_NODE; else listener_idx--; while (listener_idx) { header = header->pnext; listener_idx--; } if (header) rc = del_listener(header->url); free_listeners(header); return rc; }
static void free_listeners(qpos_t *listener) { if (listener) { free_listeners(listener->next); close(*listener->cfd); free(listener->cfd); free(listener); } }
result_t libwrap_get_evt_listeners_count(int32 mask, int32 *count) { listener_t *header = NULL; listener_t *orig_header; result_t rc = RESULT_OK; *count = 0; rc = get_listeners(mask, &header); orig_header = header; while (header) { *count = *count + 1; header = header->pnext; } free_listeners(orig_header); return rc; }
result_t libwrap_get_evt_listener(int32 mask, evt_listener_t *listener, int32 listener_idx) { int32 count = 0; result_t rc = RESULT_OK; listener_t *header = NULL; rc = get_listeners(mask, &header); if (rc != RESULT_OK) { return rc; } if (header == NULL) return RESULT_NONE_POINTER; if (listener_idx < 1) return RESULT_NO_NODE; else listener_idx--; while (listener_idx) { header = header->pnext; listener_idx--; } if (header) { memcpy_s(listener->url, sizeof(listener->url), header->url, sizeof(listener->url)); memcpy_s(listener->event_types, sizeof(listener->event_types), header->event_types, sizeof(listener->event_types)); memcpy_s(listener->context, sizeof(listener->context), header->context, sizeof(listener->context)); memcpy_s(listener->protocol, sizeof(listener->protocol), header->protocol, sizeof(listener->protocol)); memcpy_s(listener->name, sizeof(listener->name), header->name, sizeof(listener->name)); memcpy_s(listener->description, sizeof(listener->description), header->description, sizeof(listener->description)); listener->evt_index = header->evt_index; } free_listeners(header); return rc; }
/* * Main */ int main(int argc, char* argv[]) { if (argc == 1) { printf("no port is given.\n"); } else { printf("Server: initilizing...\n"); //initialization mpos = 0; qpos_list = NULL; listener_count = 0; pthread_rwlock_init(&global_lock, NULL); size_t qi; for (qi = 0; qi < QUEUE_BACKLOG; qi++) { messages[qi].msg = (char*)malloc(MESSAGE_LIMIT * sizeof(char)); pthread_mutex_init(&messages[qi].mutex, NULL); } //start listening int i, rc; pthread_t handler_tid[argc - 1]; in_port_t port[argc - 1]; pthread_attr_t attr; pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE); for (i = 0; i < argc - 1; i++) { port[i] = htons(atoi(argv[i + 1])); rc = pthread_create(&handler_tid[i], &attr, accept_connection, (void*)&port[i]); printf("Server: start listening port: %hu\n", ntohs(port[i])); if (rc == -1) { printf("failed to start accepting connection pthread_create() is %d\n", rc); exit(-1); } } pthread_attr_destroy(&attr); for (i = 0; i < argc - 1; i++) { rc = pthread_join(handler_tid[i], NULL); if (rc == -1) { printf("failed to join handler pthread_join() is %d\n", rc); exit(-1); } printf("Server: completed join %d handler on port %hu.", i, ntohs(port[i])); } printf("Server: program completed. Free resources.\n"); // free resources for (qi = 0; qi < QUEUE_BACKLOG; qi++) { free(messages[qi].msg); pthread_mutex_destroy(&messages[qi].mutex); } free_listeners(qpos_list); pthread_rwlock_destroy(&global_lock); pthread_exit(NULL); } return 0; }