void master_deinit(void) { vr_listen **vlisten; vr_eventloop_deinit(&master.vel); while (darray_n(&master.listens) > 0) { vlisten = darray_pop(&master.listens); vr_listen_destroy(*vlisten); } darray_deinit(&master.listens); }
vr_listen * vr_listen_create(sds listen_str) { rstatus_t status; vr_listen *vlisten; uint8_t *p, *name; uint32_t namelen; if (listen_str == NULL) { return NULL; } vlisten = vr_alloc(sizeof(struct vr_listen)); if (vlisten == NULL) { return NULL; } vlisten->name = NULL; vlisten->port = 0; memset(&vlisten->info, 0, sizeof(vlisten->info)); vlisten->sd = -1; if (listen_str == '/') { uint8_t *q, *start, *perm; uint32_t permlen; /* parse "socket_path permissions" from the end */ p = listen_str + sdslen(listen_str) - 1; start = listen_str; q = vr_strrchr(p, start, ' '); if (q == NULL) { /* no permissions field, so use defaults */ name = listen_str; namelen = sdslen(listen_str); } else { perm = q + 1; permlen = (uint32_t)(p - perm + 1); p = q - 1; name = start; namelen = (uint32_t)(p - start + 1); errno = 0; vlisten->perm = (mode_t)strtol((char *)perm, NULL, 8); if (errno || vlisten->perm > 0777) { log_error("config file has an invalid file permission in \"socket_path permission\" format string"); vr_listen_destroy(vlisten); return NULL; } } } else { uint8_t *q, *start, *port; uint32_t portlen; /* parse "hostname:port" from the end */ p = listen_str + sdslen(listen_str) - 1; start = listen_str; q = vr_strrchr(p, start, ':'); if (q == NULL) { log_error("config file has an invalid \"hostname:port\" format string"); vr_listen_destroy(vlisten); return NULL; } port = q + 1; portlen = (uint32_t)(p - port + 1); p = q - 1; name = start; namelen = (uint32_t)(p - start + 1); vlisten->port = vr_atoi(port, portlen); if (vlisten->port < 0 || !vr_valid_port(vlisten->port)) { log_error("config file has an invalid port in \"hostname:port\" format string"); vr_listen_destroy(vlisten); return NULL; } } vlisten->name = sdsnewlen(name, namelen); if (vlisten->name == NULL) { log_error("create a sds string failed: out of memory."); vr_listen_destroy(vlisten); return NULL; } status = vr_resolve(vlisten->name, vlisten->port, &vlisten->info); if (status != VR_OK) { vr_listen_destroy(vlisten); return NULL; } return vlisten; }