struct mgmt *mgmt_new(int fd) { struct mgmt *mgmt; if (fd < 0) return NULL; mgmt = g_try_new0(struct mgmt, 1); if (!mgmt) return NULL; mgmt->fd = fd; mgmt->close_on_unref = false; mgmt->len = 512; mgmt->buf = g_try_malloc(mgmt->len); if (!mgmt->buf) { g_free(mgmt); return NULL; } mgmt->io = g_io_channel_unix_new(mgmt->fd); g_io_channel_set_encoding(mgmt->io, NULL, NULL); g_io_channel_set_buffered(mgmt->io, FALSE); mgmt->request_queue = g_queue_new(); mgmt->reply_queue = g_queue_new(); mgmt->read_watch = g_io_add_watch_full(mgmt->io, G_PRIORITY_DEFAULT, G_IO_IN | G_IO_HUP | G_IO_ERR | G_IO_NVAL, received_data, mgmt, read_watch_destroy); return mgmt_ref(mgmt); }
struct mgmt *mgmt_new(int fd) { struct mgmt *mgmt; if (fd < 0) return NULL; mgmt = new0(struct mgmt, 1); if (!mgmt) return NULL; mgmt->fd = fd; mgmt->close_on_unref = false; mgmt->len = 512; mgmt->buf = malloc(mgmt->len); if (!mgmt->buf) { free(mgmt); return NULL; } mgmt->io = io_new(fd); if (!mgmt->io) { free(mgmt->buf); free(mgmt); return NULL; } mgmt->request_queue = queue_new(); if (!mgmt->request_queue) { io_destroy(mgmt->io); free(mgmt->buf); free(mgmt); return NULL; } mgmt->reply_queue = queue_new(); if (!mgmt->reply_queue) { queue_destroy(mgmt->request_queue, NULL); io_destroy(mgmt->io); free(mgmt->buf); free(mgmt); return NULL; } mgmt->pending_list = queue_new(); if (!mgmt->pending_list) { queue_destroy(mgmt->reply_queue, NULL); queue_destroy(mgmt->request_queue, NULL); io_destroy(mgmt->io); free(mgmt->buf); free(mgmt); return NULL; } mgmt->notify_list = queue_new(); if (!mgmt->notify_list) { queue_destroy(mgmt->pending_list, NULL); queue_destroy(mgmt->reply_queue, NULL); queue_destroy(mgmt->request_queue, NULL); io_destroy(mgmt->io); free(mgmt->buf); free(mgmt); return NULL; } if (!io_set_read_handler(mgmt->io, can_read_data, mgmt, read_watch_destroy)) { queue_destroy(mgmt->notify_list, NULL); queue_destroy(mgmt->pending_list, NULL); queue_destroy(mgmt->reply_queue, NULL); queue_destroy(mgmt->request_queue, NULL); io_destroy(mgmt->io); free(mgmt->buf); free(mgmt); return NULL; } mgmt->writer_active = false; return mgmt_ref(mgmt); }