static void access_lookup_input(struct access_lookup *lookup) { unsigned char buf[3]; ssize_t ret; bool success = FALSE; ret = read(lookup->fd, buf, sizeof(buf)); if (ret < 0) { i_error("read(%s) failed: %m", lookup->path); } else if (ret == 0) { /* connection close -> no success */ } else if (ret == 2 && buf[0] == '0' && buf[1] == '\n') { /* no success */ } else if (ret == 2 && buf[0] == '1' && buf[1] == '\n') { success = TRUE; } else { i_error("access(%s): Invalid input", lookup->path); } lookup->refcount++; lookup->callback(success, lookup->context); if (lookup->refcount > 1) access_lookup_destroy(&lookup); access_lookup_destroy(&lookup); }
static void access_lookup_timeout(struct access_lookup *lookup) { i_error("access(%s): Timed out while waiting for reply", lookup->path); lookup->refcount++; lookup->callback(FALSE, lookup->context); if (lookup->refcount > 1) access_lookup_destroy(&lookup); access_lookup_destroy(&lookup); }
static void login_access_lookup_free(struct login_access_lookup *lookup) { if (lookup->io != NULL) io_remove(&lookup->io); if (lookup->access != NULL) access_lookup_destroy(&lookup->access); if (lookup->conn.fd != -1) { if (close(lookup->conn.fd) < 0) i_error("close(client) failed: %m"); master_service_client_connection_destroyed(master_service); } p_strsplit_free(default_pool, lookup->sockets); i_free(lookup); }