char outbuf[] = { DINIT_RP_BADREQ };
if (! queuePacket(outbuf, 1)) return false;
bad_conn_close = true;
- iob.setWatchFlags(out_events);
+ iob.setWatches(OUT_EVENTS);
}
return true;
}
char badreqRep[] = { DINIT_RP_BADREQ };
if (! queuePacket(badreqRep, 1)) return false;
bad_conn_close = true;
- iob.setWatchFlags(out_events);
+ iob.setWatches(OUT_EVENTS);
return true;
}
char badreqRep[] = { DINIT_RP_BADREQ };
if (! queuePacket(badreqRep, 1)) return false;
bad_conn_close = true;
- iob.setWatchFlags(out_events);
+ iob.setWatches(OUT_EVENTS);
return true;
}
else {
char badreqRep[] = { DINIT_RP_BADREQ };
if (! queuePacket(badreqRep, 1)) return false;
bad_conn_close = true;
- iob.setWatchFlags(out_events);
+ iob.setWatches(OUT_EVENTS);
return true;
}
else {
bool ControlConn::queuePacket(const char *pkt, unsigned size) noexcept
{
- int in_flag = bad_conn_close ? 0 : in_events;
+ int in_flag = bad_conn_close ? 0 : IN_EVENTS;
bool was_empty = outbuf.empty();
// If the queue is empty, we can try to write the packet out now rather than queueing it.
int wr = write(iob.fd, pkt, size);
if (wr == -1) {
if (errno == EPIPE) {
- delete this;
return false;
}
if (errno != EAGAIN && errno != EWOULDBLOCK && errno != EINTR) {
// TODO log error
- delete this;
return false;
}
// EAGAIN etc: fall through to below
else {
if ((unsigned)wr == size) {
// Ok, all written.
- iob.setWatchFlags(in_flag);
+ iob.setWatches(in_flag);
return true;
}
pkt += wr;
// Create a vector out of the (remaining part of the) packet:
try {
outbuf.emplace_back(pkt, pkt + size);
- iob.setWatchFlags(in_flag | out_events);
+ iob.setWatches(in_flag | OUT_EVENTS);
return true;
}
catch (std::bad_alloc &baexc) {
// We can't send out-of-memory response as we already wrote as much as we
// could above. Neither can we later send the response since we have currently
// sent an incomplete packet. All we can do is close the connection.
- delete this;
return false;
}
else {
- iob.setWatchFlags(out_events);
+ iob.setWatches(OUT_EVENTS);
return true;
}
}
// make them extraordinary difficult to combine into a single method.
bool ControlConn::queuePacket(std::vector<char> &&pkt) noexcept
{
- int in_flag = bad_conn_close ? 0 : in_events;
+ int in_flag = bad_conn_close ? 0 : IN_EVENTS;
bool was_empty = outbuf.empty();
if (was_empty) {
int wr = write(iob.fd, pkt.data(), pkt.size());
if (wr == -1) {
if (errno == EPIPE) {
- delete this;
return false;
}
if (errno != EAGAIN && errno != EWOULDBLOCK && errno != EINTR) {
// TODO log error
- delete this;
return false;
}
// EAGAIN etc: fall through to below
else {
if ((unsigned)wr == pkt.size()) {
// Ok, all written.
- iob.setWatchFlags(in_flag);
+ iob.setWatches(in_flag);
return true;
}
outpkt_index = wr;
try {
outbuf.emplace_back(pkt);
- iob.setWatchFlags(in_flag | out_events);
+ iob.setWatches(in_flag | OUT_EVENTS);
return true;
}
catch (std::bad_alloc &baexc) {
// We can't send out-of-memory response as we already wrote as much as we
// could above. Neither can we later send the response since we have currently
// sent an incomplete packet. All we can do is close the connection.
- delete this;
return false;
}
else {
- iob.setWatchFlags(out_events);
+ iob.setWatches(OUT_EVENTS);
return true;
}
}
if (r == -1) {
if (errno != EAGAIN && errno != EWOULDBLOCK && errno != EINTR) {
// TODO log error
- delete this;
return true;
}
return false;
}
if (r == 0) {
- delete this;
return true;
}
// complete packet?
if (rbuf.get_length() >= chklen) {
try {
- return processPacket();
+ return !processPacket();
}
catch (std::bad_alloc &baexc) {
doOomClose();
// TODO log error?
// TODO error response?
bad_conn_close = true;
- iob.setWatchFlags(out_events);
+ iob.setWatches(OUT_EVENTS);
}
else {
- int out_flags = (bad_conn_close || !outbuf.empty()) ? out_events : 0;
- iob.setWatchFlags(in_events | out_flags);
+ int out_flags = (bad_conn_close || !outbuf.empty()) ? OUT_EVENTS : 0;
+ iob.setWatches(IN_EVENTS | out_flags);
}
return false;
char oomBuf[] = { DINIT_RP_OOM };
write(iob.fd, oomBuf, 1);
}
- delete this;
return true;
}
if (written == -1) {
if (errno == EPIPE) {
// read end closed
- delete this;
return true;
}
else if (errno == EAGAIN || errno == EWOULDBLOCK || errno == EINTR) {
}
else {
log(LogLevel::ERROR, "Error writing to control connection: ", strerror(errno));
- delete this;
return true;
}
return false;
outpkt_index = 0;
if (outbuf.empty() && ! oom_close) {
if (! bad_conn_close) {
- iob.setWatchFlags(in_events);
+ iob.setWatches(IN_EVENTS);
}
else {
- delete this;
return true;
}
}
ControlConn::~ControlConn() noexcept
{
close(iob.fd);
- iob.deregisterWatch(loop);
+ iob.deregister(*loop);
// Clear service listeners
for (auto p : serviceKeyMap) {