summaryrefslogtreecommitdiff
path: root/nuttx/netutils/smtp
diff options
context:
space:
mode:
authorpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2007-08-26 23:12:17 +0000
committerpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2007-08-26 23:12:17 +0000
commit93f9271b27b33e322ffa45ec71c43884674458af (patch)
tree36f9bb5f22dc98aee189714b2733c7cbcb6c08d1 /nuttx/netutils/smtp
parentc010014195f732bf60d018d9432354fba0950a11 (diff)
downloadpx4-nuttx-93f9271b27b33e322ffa45ec71c43884674458af.tar.gz
px4-nuttx-93f9271b27b33e322ffa45ec71c43884674458af.tar.bz2
px4-nuttx-93f9271b27b33e322ffa45ec71c43884674458af.zip
Import of uIP 1.0
git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@308 42af7a65-404d-4744-a932-0658087f49c3
Diffstat (limited to 'nuttx/netutils/smtp')
-rw-r--r--nuttx/netutils/smtp/Make.defs38
-rwxr-xr-xnuttx/netutils/smtp/makestrings40
-rw-r--r--nuttx/netutils/smtp/smtp-strings11
-rw-r--r--nuttx/netutils/smtp/smtp-strings.c33
-rw-r--r--nuttx/netutils/smtp/smtp-strings.h11
-rw-r--r--nuttx/netutils/smtp/smtp.c252
6 files changed, 385 insertions, 0 deletions
diff --git a/nuttx/netutils/smtp/Make.defs b/nuttx/netutils/smtp/Make.defs
new file mode 100644
index 000000000..b749677c9
--- /dev/null
+++ b/nuttx/netutils/smtp/Make.defs
@@ -0,0 +1,38 @@
+############################################################################
+# Make.defs
+#
+# Copyright (C) 2007 Gregory Nutt. All rights reserved.
+# Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# 3. Neither the name NuttX nor the names of its contributors may be
+# used to endorse or promote products derived from this software
+# without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+# OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+#
+############################################################################
+
+# Does not build
+# SMTP_ASRCS =
+# SMTP_CSRCS = smtp.c smtp-strings.c
diff --git a/nuttx/netutils/smtp/makestrings b/nuttx/netutils/smtp/makestrings
new file mode 100755
index 000000000..bea18a6c3
--- /dev/null
+++ b/nuttx/netutils/smtp/makestrings
@@ -0,0 +1,40 @@
+#!/usr/bin/perl
+
+
+sub stringify {
+ my $name = shift(@_);
+ open(OUTPUTC, "> $name.c");
+ open(OUTPUTH, "> $name.h");
+
+ open(FILE, "$name");
+
+ while(<FILE>) {
+ if(/(.+) "(.+)"/) {
+ $var = $1;
+ $data = $2;
+
+ $datan = $data;
+ $datan =~ s/\\r/\r/g;
+ $datan =~ s/\\n/\n/g;
+ $datan =~ s/\\01/\01/g;
+ $datan =~ s/\\0/\0/g;
+
+ printf(OUTPUTC "const char $var\[%d] = \n", length($datan) + 1);
+ printf(OUTPUTC "/* \"$data\" */\n");
+ printf(OUTPUTC "{");
+ for($j = 0; $j < length($datan); $j++) {
+ printf(OUTPUTC "%#02x, ", unpack("C", substr($datan, $j, 1)));
+ }
+ printf(OUTPUTC "};\n");
+
+ printf(OUTPUTH "extern const char $var\[%d];\n", length($datan) + 1);
+
+ }
+ }
+ close(OUTPUTC);
+ close(OUTPUTH);
+}
+stringify("smtp-strings");
+
+exit 0;
+
diff --git a/nuttx/netutils/smtp/smtp-strings b/nuttx/netutils/smtp/smtp-strings
new file mode 100644
index 000000000..27f639c2e
--- /dev/null
+++ b/nuttx/netutils/smtp/smtp-strings
@@ -0,0 +1,11 @@
+smtp_220 "220"
+smtp_helo "HELO "
+smtp_mail_from "MAIL FROM: "
+smtp_rcpt_to "RCPT TO: "
+smtp_data "DATA\r\n"
+smtp_to "To: "
+smtp_from "From: "
+smtp_subject "Subject: "
+smtp_quit "QUIT\r\n"
+smtp_crnl "\r\n"
+smtp_crnlperiodcrnl "\r\n.\r\n" \ No newline at end of file
diff --git a/nuttx/netutils/smtp/smtp-strings.c b/nuttx/netutils/smtp/smtp-strings.c
new file mode 100644
index 000000000..ab216ef0b
--- /dev/null
+++ b/nuttx/netutils/smtp/smtp-strings.c
@@ -0,0 +1,33 @@
+const char smtp_220[4] =
+/* "220" */
+{0x32, 0x32, 0x30, };
+const char smtp_helo[6] =
+/* "HELO " */
+{0x48, 0x45, 0x4c, 0x4f, 0x20, };
+const char smtp_mail_from[12] =
+/* "MAIL FROM: " */
+{0x4d, 0x41, 0x49, 0x4c, 0x20, 0x46, 0x52, 0x4f, 0x4d, 0x3a, 0x20, };
+const char smtp_rcpt_to[10] =
+/* "RCPT TO: " */
+{0x52, 0x43, 0x50, 0x54, 0x20, 0x54, 0x4f, 0x3a, 0x20, };
+const char smtp_data[7] =
+/* "DATA\r\n" */
+{0x44, 0x41, 0x54, 0x41, 0xd, 0xa, };
+const char smtp_to[5] =
+/* "To: " */
+{0x54, 0x6f, 0x3a, 0x20, };
+const char smtp_from[7] =
+/* "From: " */
+{0x46, 0x72, 0x6f, 0x6d, 0x3a, 0x20, };
+const char smtp_subject[10] =
+/* "Subject: " */
+{0x53, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x3a, 0x20, };
+const char smtp_quit[7] =
+/* "QUIT\r\n" */
+{0x51, 0x55, 0x49, 0x54, 0xd, 0xa, };
+const char smtp_crnl[3] =
+/* "\r\n" */
+{0xd, 0xa, };
+const char smtp_crnlperiodcrnl[6] =
+/* "\r\n.\r\n" */
+{0xd, 0xa, 0x2e, 0xd, 0xa, };
diff --git a/nuttx/netutils/smtp/smtp-strings.h b/nuttx/netutils/smtp/smtp-strings.h
new file mode 100644
index 000000000..4bff8583c
--- /dev/null
+++ b/nuttx/netutils/smtp/smtp-strings.h
@@ -0,0 +1,11 @@
+extern const char smtp_220[4];
+extern const char smtp_helo[6];
+extern const char smtp_mail_from[12];
+extern const char smtp_rcpt_to[10];
+extern const char smtp_data[7];
+extern const char smtp_to[5];
+extern const char smtp_from[7];
+extern const char smtp_subject[10];
+extern const char smtp_quit[7];
+extern const char smtp_crnl[3];
+extern const char smtp_crnlperiodcrnl[6];
diff --git a/nuttx/netutils/smtp/smtp.c b/nuttx/netutils/smtp/smtp.c
new file mode 100644
index 000000000..98dd468e3
--- /dev/null
+++ b/nuttx/netutils/smtp/smtp.c
@@ -0,0 +1,252 @@
+/* smtp.c
+ * smtp SMTP E-mail sender
+ * Author: Adam Dunkels <adam@dunkels.com>
+ *
+ * The Simple Mail Transfer Protocol (SMTP) as defined by RFC821 is
+ * the standard way of sending and transfering e-mail on the
+ * Internet. This simple example implementation is intended as an
+ * example of how to implement protocols in uIP, and is able to send
+ * out e-mail but has not been extensively tested.
+ *
+ * Copyright (c) 2004, Adam Dunkels.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the Institute nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * This file is part of the uIP TCP/IP stack.
+ *
+ * Author: Adam Dunkels <adam@sics.se>
+ *
+ * $Id: smtp.c,v 1.1.1.1 2007-08-26 23:07:06 patacongo Exp $
+ */
+
+#include <sys/types.h>
+#include <string.h>
+
+#include <net/uip/uip.h>
+#include <net/uip/psock.h>
+#include <net/uip/smtp.h>
+
+#include "smtp-strings.h"
+
+static struct smtp_state s;
+
+static char *localhostname;
+static uip_ipaddr_t smtpserver;
+
+#define ISO_nl 0x0a
+#define ISO_cr 0x0d
+
+#define ISO_period 0x2e
+
+#define ISO_2 0x32
+#define ISO_3 0x33
+#define ISO_4 0x34
+#define ISO_5 0x35
+
+
+/*---------------------------------------------------------------------------*/
+static
+void smtp_thread(void)
+{
+ psock_readto(&s.psock, ISO_nl);
+
+ if(strncmp(s.inputbuffer, smtp_220, 3) != 0) {
+ PSOCK_CLOSE(&s.psock);
+ smtp_done(2);
+ pthread_exit(NULL);
+ }
+
+ PSOCK_SEND_STR(&s.psock, (char *)smtp_helo);
+ PSOCK_SEND_STR(&s.psock, localhostname);
+ PSOCK_SEND_STR(&s.psock, (char *)smtp_crnl);
+
+ psock_readto(&s.psock, ISO_nl);
+
+ if(s.inputbuffer[0] != ISO_2) {
+ PSOCK_CLOSE(&s.psock);
+ smtp_done(3);
+ pthread_exit(NULL);
+ }
+
+ PSOCK_SEND_STR(&s.psock, (char *)smtp_mail_from);
+ PSOCK_SEND_STR(&s.psock, s.from);
+ PSOCK_SEND_STR(&s.psock, (char *)smtp_crnl);
+
+ psock_readto(&s.psock, ISO_nl);
+
+ if(s.inputbuffer[0] != ISO_2) {
+ PSOCK_CLOSE(&s.psock);
+ smtp_done(4);
+ pthread_exit(NULL);
+ }
+
+ PSOCK_SEND_STR(&s.psock, (char *)smtp_rcpt_to);
+ PSOCK_SEND_STR(&s.psock, s.to);
+ PSOCK_SEND_STR(&s.psock, (char *)smtp_crnl);
+
+ psock_readto(&s.psock, ISO_nl);
+
+ if(s.inputbuffer[0] != ISO_2) {
+ PSOCK_CLOSE(&s.psock);
+ smtp_done(5);
+ pthread_exit(NULL);
+ }
+
+ if(s.cc != 0) {
+ PSOCK_SEND_STR(&s.psock, (char *)smtp_rcpt_to);
+ PSOCK_SEND_STR(&s.psock, s.cc);
+ PSOCK_SEND_STR(&s.psock, (char *)smtp_crnl);
+
+ psock_readto(&s.psock, ISO_nl);
+
+ if(s.inputbuffer[0] != ISO_2) {
+ PSOCK_CLOSE(&s.psock);
+ smtp_done(6);
+ pthread_exit(NULL);
+ }
+ }
+
+ PSOCK_SEND_STR(&s.psock, (char *)smtp_data);
+
+ psock_readto(&s.psock, ISO_nl);
+
+ if(s.inputbuffer[0] != ISO_3) {
+ PSOCK_CLOSE(&s.psock);
+ smtp_done(7);
+ pthread_exit(NULL);
+ }
+
+ PSOCK_SEND_STR(&s.psock, (char *)smtp_to);
+ PSOCK_SEND_STR(&s.psock, s.to);
+ PSOCK_SEND_STR(&s.psock, (char *)smtp_crnl);
+
+ if(s.cc != 0) {
+ PSOCK_SEND_STR(&s.psock, (char *)smtp_cc);
+ PSOCK_SEND_STR(&s.psock, s.cc);
+ PSOCK_SEND_STR(&s.psock, (char *)smtp_crnl);
+ }
+
+ PSOCK_SEND_STR(&s.psock, (char *)smtp_from);
+ PSOCK_SEND_STR(&s.psock, s.from);
+ PSOCK_SEND_STR(&s.psock, (char *)smtp_crnl);
+
+ PSOCK_SEND_STR(&s.psock, (char *)smtp_subject);
+ PSOCK_SEND_STR(&s.psock, s.subject);
+ PSOCK_SEND_STR(&s.psock, (char *)smtp_crnl);
+
+ psock_send(&s.psock, s.msg, s.msglen);
+
+ PSOCK_SEND_STR(&s.psock, (char *)smtp_crnlperiodcrnl);
+
+ psock_readto(&s.psock, ISO_nl);
+ if(s.inputbuffer[0] != ISO_2) {
+ PSOCK_CLOSE(&s.psock);
+ smtp_done(8);
+ pthread_exit(NULL);
+ }
+
+ PSOCK_SEND_STR(&s.psock, (char *)smtp_quit);
+ smtp_done(SMTP_ERR_OK);
+}
+
+/* This function is called by the UIP interrupt handling logic whenevent an
+ * event of interest occurs.
+ */
+
+void uip_interrupt_event(void)
+{
+ if(uip_closed()) {
+ s.connected = 0;
+ return;
+ }
+ if(uip_aborted() || uip_timedout()) {
+ s.connected = 0;
+ smtp_done(1);
+ return;
+ }
+ smtp_thread();
+}
+
+/*---------------------------------------------------------------------------*/
+/**
+ * Specificy an SMTP server and hostname.
+ *
+ * This function is used to configure the SMTP module with an SMTP
+ * server and the hostname of the host.
+ *
+ * \param lhostname The hostname of the uIP host.
+ *
+ * \param server A pointer to a 4-byte array representing the IP
+ * address of the SMTP server to be configured.
+ */
+void
+smtp_configure(char *lhostname, void *server)
+{
+ localhostname = lhostname;
+ uip_ipaddr_copy(smtpserver, server);
+}
+/*---------------------------------------------------------------------------*/
+/**
+ * Send an e-mail.
+ *
+ * \param to The e-mail address of the receiver of the e-mail.
+ * \param cc The e-mail address of the CC: receivers of the e-mail.
+ * \param from The e-mail address of the sender of the e-mail.
+ * \param subject The subject of the e-mail.
+ * \param msg The actual e-mail message.
+ * \param msglen The length of the e-mail message.
+ */
+unsigned char
+smtp_send(char *to, char *cc, char *from,
+ char *subject, char *msg, uint16 msglen)
+{
+ struct uip_conn *conn;
+
+ conn = uip_connect(smtpserver, HTONS(25));
+ if(conn == NULL) {
+ return 0;
+ }
+ s.connected = 1;
+ s.to = to;
+ s.cc = cc;
+ s.from = from;
+ s.subject = subject;
+ s.msg = msg;
+ s.msglen = msglen;
+
+ psock_init(&s.psock, s.inputbuffer, sizeof(s.inputbuffer));
+
+ return 1;
+}
+/*---------------------------------------------------------------------------*/
+void
+smtp_init(void)
+{
+ s.connected = 0;
+}
+/*---------------------------------------------------------------------------*/
+/** @} */
+/** @} */