return feof(call_sock) || errno==ECONNRESET;
}
+// Does protocol exchange. Returns 0 if OK, -1 if peer was garbage.
+static int protocol_exchange(FILE *call_sock) {
+ char ack;
+ size_t sr = fread(&ack, sizeof(ack), 1, call_sock);
+ if (sr != 1) {
+ if (was_eof(call_sock)) return -1;
+ diee("read() ack byte");
+ }
+ if (ack != '\n') die("got ack byte 0x%02x, not '\n'", ack);
+
+ // We're committed now, send the request (or bail out)
+ send_request(call_sock);
+
+ return 0;
+}
+
// Returns: call(client-end), or 0 to mean "is garbage"
// find_socket_path must have been called
static FILE *connect_existing(void) {
call_sock = call_sock_from_fd(fd);
fd = -1;
- char ack;
- size_t sr = fread(&ack, sizeof(ack), 1, call_sock);
- if (sr != 1) {
- if (was_eof(call_sock)) goto x_garbage;
- diee("read() ack byte");
- }
- if (ack != '\n') die("got ack byte 0x%02x, not '\n'", ack);
-
- // We're committed now, send the request (or bail out)
- send_request(call_sock);
+ if (protocol_exchange(call_sock) < 0)
+ goto x_garbage;
return call_sock;