blob: 09d9b1d3bbc2ed8c2ecc1bdd6111e40ea9d3e67d [file] [log] [blame]
adamdunkelsa2f3c422004-09-12 20:24:53 +00001/*
2 * Copyright (c) 2004, Adam Dunkels.
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 * 3. Neither the name of the Institute nor the names of its contributors
14 * may be used to endorse or promote products derived from this software
15 * without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
18 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20 * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
21 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27 * SUCH DAMAGE.
28 *
29 * This file is part of the Contiki operating system.
30 *
31 * Author: Adam Dunkels <adam@sics.se>
32 *
oliverschmidtf9750b52005-05-05 23:02:01 +000033 * $Id: smtp-socket.c,v 1.6 2005/05/05 23:02:01 oliverschmidt Exp $
adamdunkelsa2f3c422004-09-12 20:24:53 +000034 */
adamdunkels15c3a8b2004-09-01 20:42:03 +000035#include "smtp.h"
36
37#include "smtp-strings.h"
adamdunkelsd0791bb2005-02-22 22:23:07 +000038#include "psock.h"
adamdunkels15c3a8b2004-09-01 20:42:03 +000039
40#include <string.h>
41
42struct smtp_state {
43
44 char connected;
45
adamdunkelsd0791bb2005-02-22 22:23:07 +000046 struct psock psock;
adamdunkels15c3a8b2004-09-01 20:42:03 +000047
48 char inputbuffer[4];
49
50 char *to;
oliverschmidt12635002005-05-04 23:51:09 +000051 char *cc;
adamdunkels15c3a8b2004-09-01 20:42:03 +000052 char *from;
53 char *subject;
54 char *msg;
oliverschmidt12635002005-05-04 23:51:09 +000055 u8_t msgwidth;
56 u8_t msgheight;
57 u8_t line;
adamdunkels15c3a8b2004-09-01 20:42:03 +000058};
59
60static struct smtp_state s;
61
62static char *localhostname;
63static u16_t smtpserver[2];
64
65#define ISO_nl 0x0a
66#define ISO_cr 0x0d
67
68#define ISO_period 0x2e
69
70#define ISO_2 0x32
71#define ISO_3 0x33
72#define ISO_4 0x34
73#define ISO_5 0x35
74
75
adamdunkelsd0791bb2005-02-22 22:23:07 +000076#define SEND_STRING(s, str) PSOCK_SEND(s, str, strlen(str))
adamdunkels15c3a8b2004-09-01 20:42:03 +000077/*---------------------------------------------------------------------------*/
78static
79PT_THREAD(smtp_thread(void))
80{
adamdunkelsd0791bb2005-02-22 22:23:07 +000081 PSOCK_BEGIN(&s.psock);
adamdunkels15c3a8b2004-09-01 20:42:03 +000082
adamdunkelsd0791bb2005-02-22 22:23:07 +000083 PSOCK_READTO(&s.psock, ISO_nl);
adamdunkels15c3a8b2004-09-01 20:42:03 +000084
85 if(strncmp(s.inputbuffer, smtp_220, 3) != 0) {
adamdunkelsd0791bb2005-02-22 22:23:07 +000086 PSOCK_CLOSE(&s.psock);
oliverschmidt639f75d2005-05-05 22:15:19 +000087 smtp_done(2);
adamdunkelsd0791bb2005-02-22 22:23:07 +000088 PSOCK_EXIT(&s.psock);
adamdunkels15c3a8b2004-09-01 20:42:03 +000089 }
90
adamdunkelsd0791bb2005-02-22 22:23:07 +000091 SEND_STRING(&s.psock, (char *)smtp_helo);
92 SEND_STRING(&s.psock, localhostname);
93 SEND_STRING(&s.psock, (char *)smtp_crnl);
adamdunkels15c3a8b2004-09-01 20:42:03 +000094
adamdunkelsd0791bb2005-02-22 22:23:07 +000095 PSOCK_READTO(&s.psock, ISO_nl);
adamdunkels15c3a8b2004-09-01 20:42:03 +000096
97 if(s.inputbuffer[0] != ISO_2) {
adamdunkelsd0791bb2005-02-22 22:23:07 +000098 PSOCK_CLOSE(&s.psock);
oliverschmidt639f75d2005-05-05 22:15:19 +000099 smtp_done(3);
adamdunkelsd0791bb2005-02-22 22:23:07 +0000100 PSOCK_EXIT(&s.psock);
adamdunkels15c3a8b2004-09-01 20:42:03 +0000101 }
102
adamdunkelsd0791bb2005-02-22 22:23:07 +0000103 SEND_STRING(&s.psock, (char *)smtp_mail_from);
104 SEND_STRING(&s.psock, s.from);
105 SEND_STRING(&s.psock, (char *)smtp_crnl);
adamdunkels15c3a8b2004-09-01 20:42:03 +0000106
adamdunkelsd0791bb2005-02-22 22:23:07 +0000107 PSOCK_READTO(&s.psock, ISO_nl);
adamdunkels15c3a8b2004-09-01 20:42:03 +0000108
109 if(s.inputbuffer[0] != ISO_2) {
adamdunkelsd0791bb2005-02-22 22:23:07 +0000110 PSOCK_CLOSE(&s.psock);
oliverschmidt639f75d2005-05-05 22:15:19 +0000111 smtp_done(4);
adamdunkelsd0791bb2005-02-22 22:23:07 +0000112 PSOCK_EXIT(&s.psock);
adamdunkels15c3a8b2004-09-01 20:42:03 +0000113 }
114
adamdunkelsd0791bb2005-02-22 22:23:07 +0000115 SEND_STRING(&s.psock, (char *)smtp_rcpt_to);
oliverschmidt12635002005-05-04 23:51:09 +0000116 SEND_STRING(&s.psock, s.to);
adamdunkelsd0791bb2005-02-22 22:23:07 +0000117 SEND_STRING(&s.psock, (char *)smtp_crnl);
adamdunkels15c3a8b2004-09-01 20:42:03 +0000118
adamdunkelsd0791bb2005-02-22 22:23:07 +0000119 PSOCK_READTO(&s.psock, ISO_nl);
adamdunkels15c3a8b2004-09-01 20:42:03 +0000120
121 if(s.inputbuffer[0] != ISO_2) {
adamdunkelsd0791bb2005-02-22 22:23:07 +0000122 PSOCK_CLOSE(&s.psock);
oliverschmidt639f75d2005-05-05 22:15:19 +0000123 smtp_done(5);
adamdunkelsd0791bb2005-02-22 22:23:07 +0000124 PSOCK_EXIT(&s.psock);
adamdunkels15c3a8b2004-09-01 20:42:03 +0000125 }
126
oliverschmidtf9750b52005-05-05 23:02:01 +0000127 if(*s.cc != 0) {
128 SEND_STRING(&s.psock, (char *)smtp_rcpt_to);
129 SEND_STRING(&s.psock, s.cc);
130 SEND_STRING(&s.psock, (char *)smtp_crnl);
131
132 PSOCK_READTO(&s.psock, ISO_nl);
133
134 if(s.inputbuffer[0] != ISO_2) {
135 PSOCK_CLOSE(&s.psock);
136 smtp_done(6);
137 PSOCK_EXIT(&s.psock);
138 }
139 }
140
adamdunkelsd0791bb2005-02-22 22:23:07 +0000141 SEND_STRING(&s.psock, (char *)smtp_data);
adamdunkels15c3a8b2004-09-01 20:42:03 +0000142
adamdunkelsd0791bb2005-02-22 22:23:07 +0000143 PSOCK_READTO(&s.psock, ISO_nl);
adamdunkels15c3a8b2004-09-01 20:42:03 +0000144
145 if(s.inputbuffer[0] != ISO_3) {
adamdunkelsd0791bb2005-02-22 22:23:07 +0000146 PSOCK_CLOSE(&s.psock);
oliverschmidtf9750b52005-05-05 23:02:01 +0000147 smtp_done(7);
adamdunkelsd0791bb2005-02-22 22:23:07 +0000148 PSOCK_EXIT(&s.psock);
adamdunkels15c3a8b2004-09-01 20:42:03 +0000149 }
150
adamdunkelsd0791bb2005-02-22 22:23:07 +0000151 SEND_STRING(&s.psock, (char *)smtp_to);
152 SEND_STRING(&s.psock, s.to);
153 SEND_STRING(&s.psock, (char *)smtp_crnl);
adamdunkels15c3a8b2004-09-01 20:42:03 +0000154
oliverschmidtf9750b52005-05-05 23:02:01 +0000155 if(*s.cc != 0) {
156 SEND_STRING(&s.psock, (char *)smtp_cc);
157 SEND_STRING(&s.psock, s.cc);
158 SEND_STRING(&s.psock, (char *)smtp_crnl);
159 }
oliverschmidt12635002005-05-04 23:51:09 +0000160
adamdunkelsd0791bb2005-02-22 22:23:07 +0000161 SEND_STRING(&s.psock, (char *)smtp_from);
162 SEND_STRING(&s.psock, s.from);
163 SEND_STRING(&s.psock, (char *)smtp_crnl);
adamdunkels15c3a8b2004-09-01 20:42:03 +0000164
adamdunkelsd0791bb2005-02-22 22:23:07 +0000165 SEND_STRING(&s.psock, (char *)smtp_subject);
166 SEND_STRING(&s.psock, s.subject);
167 SEND_STRING(&s.psock, (char *)smtp_crnl);
adamdunkels15c3a8b2004-09-01 20:42:03 +0000168
oliverschmidt12635002005-05-04 23:51:09 +0000169 for(s.line = 0; s.line < s.msgheight; ++s.line) {
170 SEND_STRING(&s.psock, (char *)smtp_crnl);
171 SEND_STRING(&s.psock, &s.msg[s.line * s.msgwidth]);
172 }
adamdunkels15c3a8b2004-09-01 20:42:03 +0000173
adamdunkelsd0791bb2005-02-22 22:23:07 +0000174 SEND_STRING(&s.psock, (char *)smtp_crnlperiodcrnl);
adamdunkels15c3a8b2004-09-01 20:42:03 +0000175
adamdunkelsd0791bb2005-02-22 22:23:07 +0000176 PSOCK_READTO(&s.psock, ISO_nl);
adamdunkels15c3a8b2004-09-01 20:42:03 +0000177 if(s.inputbuffer[0] != ISO_2) {
adamdunkelsd0791bb2005-02-22 22:23:07 +0000178 PSOCK_CLOSE(&s.psock);
oliverschmidtf9750b52005-05-05 23:02:01 +0000179 smtp_done(8);
adamdunkelsd0791bb2005-02-22 22:23:07 +0000180 PSOCK_EXIT(&s.psock);
adamdunkels15c3a8b2004-09-01 20:42:03 +0000181 }
182
adamdunkelsd0791bb2005-02-22 22:23:07 +0000183 SEND_STRING(&s.psock, (char *)smtp_quit);
oliverschmidt639f75d2005-05-05 22:15:19 +0000184 smtp_done(SMTP_ERR_OK);
adamdunkelsd0791bb2005-02-22 22:23:07 +0000185 PSOCK_END(&s.psock);
adamdunkels15c3a8b2004-09-01 20:42:03 +0000186}
187/*---------------------------------------------------------------------------*/
188void
189smtp_appcall(void *state)
190{
oliverschmidt639f75d2005-05-05 22:15:19 +0000191 if(uip_closed()) {
adamdunkels15c3a8b2004-09-01 20:42:03 +0000192 s.connected = 0;
193 return;
adamdunkels15c3a8b2004-09-01 20:42:03 +0000194 }
oliverschmidt639f75d2005-05-05 22:15:19 +0000195 if(uip_aborted() || uip_timedout()) {
196 s.connected = 0;
197 smtp_done(1);
198 return;
199 }
200 smtp_thread();
adamdunkels15c3a8b2004-09-01 20:42:03 +0000201}
202/*---------------------------------------------------------------------------*/
203void
204smtp_configure(char *lhostname, u16_t *server)
205{
206 localhostname = lhostname;
207 smtpserver[0] = server[0];
208 smtpserver[1] = server[1];
209}
210/*---------------------------------------------------------------------------*/
211unsigned char
oliverschmidt12635002005-05-04 23:51:09 +0000212smtp_send(char *to, char *cc, char *from, char *subject,
213 char *msg, u8_t msgwidth, u8_t msgheight)
adamdunkels15c3a8b2004-09-01 20:42:03 +0000214{
215 struct uip_conn *conn;
216
217 conn = tcp_connect(smtpserver, HTONS(25), NULL);
218 if(conn == NULL) {
219 return 0;
220 }
221 s.connected = 1;
222 s.to = to;
oliverschmidt12635002005-05-04 23:51:09 +0000223 s.cc = cc;
adamdunkels15c3a8b2004-09-01 20:42:03 +0000224 s.from = from;
225 s.subject = subject;
226 s.msg = msg;
oliverschmidt12635002005-05-04 23:51:09 +0000227 s.msgwidth = msgwidth;
228 s.msgheight = msgheight;
adamdunkels15c3a8b2004-09-01 20:42:03 +0000229
adamdunkelsd0791bb2005-02-22 22:23:07 +0000230 PSOCK_INIT(&s.psock, s.inputbuffer, sizeof(s.inputbuffer));
adamdunkels15c3a8b2004-09-01 20:42:03 +0000231
232 return 1;
233}
234/*---------------------------------------------------------------------------*/
235void
236smtp_init(void)
237{
238 s.connected = 0;
239}
240/*---------------------------------------------------------------------------*/
241