If Fort decides to abandon a client because of misbehavior, it will
finish handling the current request (if there is one), cancel all
subsequent queued requests, and terminate the connection.
return result;
}
+void
+pdustream_clear_requests(struct pdu_stream *stream)
+{
+ struct rtr_request *req;
+
+ while ((req = TAILQ_FIRST(&stream->requests)) != NULL) {
+ TAILQ_REMOVE(&stream->requests, req, lh);
+ rtreq_destroy(req);
+ }
+
+ stream->reqcount = 0;
+}
+
void
pdustream_destroy(struct pdu_stream *stream)
{
close(stream->fd);
+ pdustream_clear_requests(stream);
free(stream);
}
};
struct pdu_stream *pdustream_create(int, char const *);
+void pdustream_clear_requests(struct pdu_stream *);
void pdustream_destroy(struct pdu_stream *);
bool pdustream_parse(struct pdu_stream *, bool *);
/* PR_DEBUG_MSG("pfd:%d client:%d", pfd->fd, client->fd); */
- if (client->eos && TAILQ_EMPTY(&client->requests)) {
+ if (!client->claimed && client->eos) {
pdustream_destroy(client);
clients.array[i] = NULL;
}
if (shutdown(stream->fd, SHUT_RD) < 0)
pr_op_warn("Can't shut down read end of client socket: %s",
strerror(errno));
+ pdustream_clear_requests(stream);
stream->eos = true;
}