[gnutls-dev] gnutls-cli -s triggered by SIGALRM too?
Simon Josefsson
simon+gnutls-dev@josefsson.org
Sun Sep 21 03:07:01 2003
Hello, I'm working on a STARTTLS interface for Emacs using GNUTLS,
since the current Emacs solution uses a non-standard command line
application based on OpenSSL, so moving to gnutls-cli seems better.
However, triggering the STARTTLS negotiation by EOF seem slightly
problematic to do in a portable way from Emacs. The old starttls
application triggered the STARTTLS negotiation by SIGALRM. Would it
be possible to support this as well, in gnutls-cli? Suggested patch
attached.
Btw, elisp code is at
<http://quimby.gnus.org/cgi-bin/cvsweb.cgi/gnus/contrib/starttls.el?rev=1.3&content-type=text/x-cvsweb-markup>.
As you can see, it searches for certain strings that gnutls-cli
prints, so it would be good if those didn't change too much.
Thanks.
Index: src/cli.c
===================================================================
RCS file: /cvs/gnutls/gnutls/src/cli.c,v
retrieving revision 2.211
diff -u -p -r2.211 cli.c
--- src/cli.c 17 Sep 2003 20:00:14 -0000 2.211
+++ src/cli.c 21 Sep 2003 01:04:42 -0000
@@ -236,6 +236,12 @@ static int handle_error(socket_st hd, in
return ret;
}
+int starttls_alarmed;
+
+void starttls_alarm (int signum)
+{
+ starttls_alarmed = 1;
+}
int main(int argc, char **argv)
{
@@ -358,6 +364,8 @@ int main(int argc, char **argv)
printf("\n- Simple Client Mode:\n\n");
+ signal (SIGALRM, &starttls_alarm);
+
FD_ZERO(&rset);
for (;;) {
FD_SET(fileno(stdin), &rset);
@@ -366,7 +374,26 @@ int main(int argc, char **argv)
maxfd = MAX(fileno(stdin), sd);
tv.tv_sec = 3;
tv.tv_usec = 0;
- select(maxfd + 1, &rset, NULL, NULL, &tv);
+ err = select(maxfd + 1, &rset, NULL, NULL, &tv);
+
+ if (err < 0) {
+ if (errno == EINTR && starttls_alarmed) {
+ if (hd.secure == 0) {
+ fprintf(stderr,
+ "*** Starting TLS handshake\n");
+ ret = do_handshake(&hd);
+ if (ret < 0) {
+ fprintf(stderr,
+ "*** Handshake has failed\n");
+ socket_bye(&hd);
+ user_term = 1;
+ }
+ } else {
+ user_term = 1;
+ }
+ }
+ continue;
+ }
if (FD_ISSET(sd, &rset)) {
bzero(buffer, MAX_BUF + 1);
Index: src/common.c
===================================================================
RCS file: /cvs/gnutls/gnutls/src/common.c,v
retrieving revision 2.61
diff -u -p -r2.61 common.c
--- src/common.c 17 Sep 2003 20:00:14 -0000 2.61
+++ src/common.c 21 Sep 2003 01:04:43 -0000
@@ -362,6 +362,8 @@ int print_info(gnutls_session session, c
tmp = gnutls_compression_get_name(gnutls_compression_get(session));
printf("- Compression: %s\n", tmp);
+ fflush (stdout);
+
return 0;
}