Checking code reworked to be more robust.
[cert-checker.git] / smtp.c
diff --git a/smtp.c b/smtp.c
index 4adb179a87beaebd2241af145948592b9d2218aa..db8aacd6b81f3f1e3bd2db47a8fb35bece6fb8cc 100644 (file)
--- a/smtp.c
+++ b/smtp.c
@@ -13,6 +13,8 @@
 
 #define _XOPEN_SOURCE 500
 
+#include <gnutls/gnutls.h>
+
 #include <unistd.h>
 #include <string.h>
 
@@ -37,6 +39,20 @@ char* smtp_expect(int fd, char *str) {
        return ptr;
 }
 
+/* Expect status code. This can be done better. */
+char* ssl_smtp_expect(gnutls_session_t session, char *str) {
+       char buffer[BUFFER_SIZE];
+       int len = strlen(str);
+       int bytes = gnutls_record_recv(session, buffer, BUFFER_SIZE);
+       if (bytes < len) goto fail;
+       if (!strncmp(buffer,str,len)) {
+               return NULL;
+       }
+
+       fail:;
+       return strdup(buffer);
+}
+
 /* Send EHLO and check for STARTTLS extension. */
 int smtp_ehlo(int fd) {
        return 0;
@@ -52,3 +68,15 @@ int smtp_starttls(int fd) {
        }
        return 0;
 }
+
+/* Ugly, sending could fail and  other horrible things may happen. */
+int smtp_quit(gnutls_session_t session) {
+       char buffer[] = "QUIT\n";
+       int sent = GNUTLS_E_AGAIN;
+       sent = gnutls_record_send(session, buffer, sizeof(buffer));
+       
+       ssl_smtp_expect(session, "221 ");
+
+       /* TODO: Better (read: some) error handling. */
+       return 0;
+}