if (connect(sk, (struct sockaddr *) &sa, sizeof(sa)) < 0)
die("Cannot connect: %m");
+ log(L_INFO, "Waiting for initial message");
+ byte msg[256];
+ int i = 0;
+ do
+ {
+ if (i >= (int)sizeof(msg))
+ die("Response too long");
+ int c = read(sk, msg+i, sizeof(msg)-i);
+ if (c <= 0)
+ die("Connection broken");
+ i += c;
+ }
+ while (msg[i-1] != '\n');
+ msg[i-1] = 0;
+ if (msg[0] != '+')
+ die("%s", msg);
+ log(L_INFO, "%s", msg);
+
gnutls_session_t s;
gnutls_init(&s, GNUTLS_CLIENT);
gnutls_set_default_priority(s);
for (;;)
{
byte buf[1024];
- if (!fgets(buf, sizeof(buf), stdin))
- break;
- int len = strlen(buf);
- err = gnutls_record_send(s, buf, len); TLS_CHECK(gnutls_record_send);
- err = gnutls_record_recv(s, buf, len); TLS_CHECK(gnutls_record_recv);
- if (!err)
+ do
+ {
+ if (!fgets(buf, sizeof(buf), stdin))
+ goto done;
+ int len = strlen(buf);
+ err = gnutls_record_send(s, buf, len); TLS_CHECK(gnutls_record_send);
+ }
+ while (buf[0] != '\n');
+ int last = 0;
+ for (;;)
{
- log(L_INFO, "Connection closed");
- break;
+ err = gnutls_record_recv(s, buf, sizeof(buf)); TLS_CHECK(gnutls_record_recv);
+ if (!err)
+ {
+ log(L_INFO, "Connection closed");
+ break;
+ }
+ fwrite(buf, 1, err, stdout);
+ for (int i=0; i<err; i++)
+ {
+ if (buf[i] == '\n' && last == '\n')
+ goto next;
+ last = buf[i];
+ }
}
- fwrite(buf, 1, err, stdout);
+next:
fflush(stdout);
}
+done:
gnutls_bye(s, GNUTLS_SHUT_RDWR);
close(sk);
gnutls_deinit(s);