blob: 4ea7ed04ef465c59f982bf6c906a8dcc45feadc6 [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 *
adamdunkelsd0791bb2005-02-22 22:23:07 +000033 * $Id: smtp-socket.c,v 1.3 2005/02/22 22:23:08 adamdunkels 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;
51 char *from;
52 char *subject;
53 char *msg;
54 u16_t msglen;
55};
56
57static struct smtp_state s;
58
59static char *localhostname;
60static u16_t smtpserver[2];
61
62#define ISO_nl 0x0a
63#define ISO_cr 0x0d
64
65#define ISO_period 0x2e
66
67#define ISO_2 0x32
68#define ISO_3 0x33
69#define ISO_4 0x34
70#define ISO_5 0x35
71
72
adamdunkelsd0791bb2005-02-22 22:23:07 +000073#define SEND_STRING(s, str) PSOCK_SEND(s, str, strlen(str))
adamdunkels15c3a8b2004-09-01 20:42:03 +000074/*---------------------------------------------------------------------------*/
75static
76PT_THREAD(smtp_thread(void))
77{
adamdunkelsd0791bb2005-02-22 22:23:07 +000078 PSOCK_BEGIN(&s.psock);
adamdunkels15c3a8b2004-09-01 20:42:03 +000079
adamdunkelsd0791bb2005-02-22 22:23:07 +000080 PSOCK_READTO(&s.psock, ISO_nl);
adamdunkels15c3a8b2004-09-01 20:42:03 +000081
82 if(strncmp(s.inputbuffer, smtp_220, 3) != 0) {
adamdunkelsd0791bb2005-02-22 22:23:07 +000083 PSOCK_CLOSE(&s.psock);
84 PSOCK_EXIT(&s.psock);
adamdunkels15c3a8b2004-09-01 20:42:03 +000085 }
86
adamdunkelsd0791bb2005-02-22 22:23:07 +000087 SEND_STRING(&s.psock, (char *)smtp_helo);
88 SEND_STRING(&s.psock, localhostname);
89 SEND_STRING(&s.psock, (char *)smtp_crnl);
adamdunkels15c3a8b2004-09-01 20:42:03 +000090
adamdunkelsd0791bb2005-02-22 22:23:07 +000091 PSOCK_READTO(&s.psock, ISO_nl);
adamdunkels15c3a8b2004-09-01 20:42:03 +000092
93 if(s.inputbuffer[0] != ISO_2) {
adamdunkelsd0791bb2005-02-22 22:23:07 +000094 PSOCK_CLOSE(&s.psock);
95 PSOCK_EXIT(&s.psock);
adamdunkels15c3a8b2004-09-01 20:42:03 +000096 }
97
adamdunkelsd0791bb2005-02-22 22:23:07 +000098 SEND_STRING(&s.psock, (char *)smtp_mail_from);
99 SEND_STRING(&s.psock, s.from);
100 SEND_STRING(&s.psock, (char *)smtp_crnl);
adamdunkels15c3a8b2004-09-01 20:42:03 +0000101
adamdunkelsd0791bb2005-02-22 22:23:07 +0000102 PSOCK_READTO(&s.psock, ISO_nl);
adamdunkels15c3a8b2004-09-01 20:42:03 +0000103
104 if(s.inputbuffer[0] != ISO_2) {
adamdunkelsd0791bb2005-02-22 22:23:07 +0000105 PSOCK_CLOSE(&s.psock);
106 PSOCK_EXIT(&s.psock);
adamdunkels15c3a8b2004-09-01 20:42:03 +0000107 }
108
adamdunkelsd0791bb2005-02-22 22:23:07 +0000109 SEND_STRING(&s.psock, (char *)smtp_rcpt_to);
110 SEND_STRING(&s.psock, s.from);
111 SEND_STRING(&s.psock, (char *)smtp_crnl);
adamdunkels15c3a8b2004-09-01 20:42:03 +0000112
adamdunkelsd0791bb2005-02-22 22:23:07 +0000113 PSOCK_READTO(&s.psock, ISO_nl);
adamdunkels15c3a8b2004-09-01 20:42:03 +0000114
115 if(s.inputbuffer[0] != ISO_2) {
adamdunkelsd0791bb2005-02-22 22:23:07 +0000116 PSOCK_CLOSE(&s.psock);
117 PSOCK_EXIT(&s.psock);
adamdunkels15c3a8b2004-09-01 20:42:03 +0000118 }
119
adamdunkelsd0791bb2005-02-22 22:23:07 +0000120 SEND_STRING(&s.psock, (char *)smtp_data);
adamdunkels15c3a8b2004-09-01 20:42:03 +0000121
adamdunkelsd0791bb2005-02-22 22:23:07 +0000122 PSOCK_READTO(&s.psock, ISO_nl);
adamdunkels15c3a8b2004-09-01 20:42:03 +0000123
124 if(s.inputbuffer[0] != ISO_3) {
adamdunkelsd0791bb2005-02-22 22:23:07 +0000125 PSOCK_CLOSE(&s.psock);
126 PSOCK_EXIT(&s.psock);
adamdunkels15c3a8b2004-09-01 20:42:03 +0000127 }
128
adamdunkelsd0791bb2005-02-22 22:23:07 +0000129 SEND_STRING(&s.psock, (char *)smtp_to);
130 SEND_STRING(&s.psock, s.to);
131 SEND_STRING(&s.psock, (char *)smtp_crnl);
adamdunkels15c3a8b2004-09-01 20:42:03 +0000132
adamdunkelsd0791bb2005-02-22 22:23:07 +0000133 SEND_STRING(&s.psock, (char *)smtp_from);
134 SEND_STRING(&s.psock, s.from);
135 SEND_STRING(&s.psock, (char *)smtp_crnl);
adamdunkels15c3a8b2004-09-01 20:42:03 +0000136
adamdunkelsd0791bb2005-02-22 22:23:07 +0000137 SEND_STRING(&s.psock, (char *)smtp_subject);
138 SEND_STRING(&s.psock, s.subject);
139 SEND_STRING(&s.psock, (char *)smtp_crnl);
adamdunkels15c3a8b2004-09-01 20:42:03 +0000140
adamdunkelsd0791bb2005-02-22 22:23:07 +0000141 PSOCK_SEND(&s.psock, s.msg, s.msglen);
adamdunkels15c3a8b2004-09-01 20:42:03 +0000142
adamdunkelsd0791bb2005-02-22 22:23:07 +0000143 SEND_STRING(&s.psock, (char *)smtp_crnlperiodcrnl);
adamdunkels15c3a8b2004-09-01 20:42:03 +0000144
adamdunkelsd0791bb2005-02-22 22:23:07 +0000145 PSOCK_READTO(&s.psock, ISO_nl);
adamdunkels15c3a8b2004-09-01 20:42:03 +0000146 if(s.inputbuffer[0] != ISO_2) {
adamdunkelsd0791bb2005-02-22 22:23:07 +0000147 PSOCK_CLOSE(&s.psock);
148 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_quit);
adamdunkels15c3a8b2004-09-01 20:42:03 +0000152
adamdunkelsd0791bb2005-02-22 22:23:07 +0000153 PSOCK_END(&s.psock);
adamdunkels15c3a8b2004-09-01 20:42:03 +0000154}
155/*---------------------------------------------------------------------------*/
156void
157smtp_appcall(void *state)
158{
159 if(uip_closed() || uip_aborted() || uip_timedout()) {
160 s.connected = 0;
161 return;
162 } else {
163 smtp_thread();
164 }
165}
166/*---------------------------------------------------------------------------*/
167void
168smtp_configure(char *lhostname, u16_t *server)
169{
170 localhostname = lhostname;
171 smtpserver[0] = server[0];
172 smtpserver[1] = server[1];
173}
174/*---------------------------------------------------------------------------*/
175unsigned char
176smtp_send(char *to, char *from, char *subject,
177 char *msg, u16_t msglen)
178{
179 struct uip_conn *conn;
180
181 conn = tcp_connect(smtpserver, HTONS(25), NULL);
182 if(conn == NULL) {
183 return 0;
184 }
185 s.connected = 1;
186 s.to = to;
187 s.from = from;
188 s.subject = subject;
189 s.msg = msg;
190 s.msglen = msglen;
191
adamdunkelsd0791bb2005-02-22 22:23:07 +0000192 PSOCK_INIT(&s.psock, s.inputbuffer, sizeof(s.inputbuffer));
adamdunkels15c3a8b2004-09-01 20:42:03 +0000193
194 return 1;
195}
196/*---------------------------------------------------------------------------*/
197void
198smtp_init(void)
199{
200 s.connected = 0;
201}
202/*---------------------------------------------------------------------------*/
203