/*
This file is part of GNUnet
- (C) 2003, 2004, 2005, 2006, 2007 Christian Grothoff (and other contributing authors)
+ Copyright (C) 2003-2013 GNUnet e.V.
- GNUnet is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published
- by the Free Software Foundation; either version 3, or (at your
- option) any later version.
+ GNUnet is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Affero General Public License as published
+ by the Free Software Foundation, either version 3 of the License,
+ or (at your option) any later version.
GNUnet is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with GNUnet; see the file COPYING. If not, write to the
- Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA.
+ Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/**
#include "platform.h"
#include "gnunet_util.h"
-#include "gnunet_directories.h"
+#include "gnunet_constants.h"
#include "gnunet_protocols.h"
#include "gnunet_transport.h"
#include "gnunet_stats_service.h"
static GNUNET_CronTime last_transmission;
-/** ******************** Base64 encoding ***********/
-
-#define FILLCHAR '='
-static char *cvt =
- "ABCDEFGHIJKLMNOPQRSTUVWXYZ" "abcdefghijklmnopqrstuvwxyz" "0123456789+/";
-
-/**
- * Encode into Base64.
- *
- * @param data the data to encode
- * @param len the length of the input
- * @param output where to write the output (*output should be NULL,
- * is allocated)
- * @return the size of the output
- */
-static unsigned int
-base64_encode (const char *data, unsigned int len, char **output)
-{
- unsigned int i;
- char c;
- unsigned int ret;
- char *opt;
-
-/* (*output)[ret++] = '\r'; \*/
-#define CHECKLINE \
- if ( (ret % MAX_CHAR_PER_LINE) == 0) { \
- (*output)[ret++] = '\n'; \
- }
- ret = 0;
- opt =
- GNUNET_malloc (2 +
- (((len * 4 / 3) + 8) * (MAX_CHAR_PER_LINE +
- 2)) / MAX_CHAR_PER_LINE);
- /* message must start with \r\n for libesmtp */
- *output = opt;
- opt[0] = '\r';
- opt[1] = '\n';
- ret += 2;
- for (i = 0; i < len; ++i)
- {
- c = (data[i] >> 2) & 0x3f;
- opt[ret++] = cvt[(int) c];
- CHECKLINE;
- c = (data[i] << 4) & 0x3f;
- if (++i < len)
- c |= (data[i] >> 4) & 0x0f;
- opt[ret++] = cvt[(int) c];
- CHECKLINE;
- if (i < len)
- {
- c = (data[i] << 2) & 0x3f;
- if (++i < len)
- c |= (data[i] >> 6) & 0x03;
- opt[ret++] = cvt[(int) c];
- CHECKLINE;
- }
- else
- {
- ++i;
- opt[ret++] = FILLCHAR;
- CHECKLINE;
- }
- if (i < len)
- {
- c = data[i] & 0x3f;
- opt[ret++] = cvt[(int) c];
- CHECKLINE;
- }
- else
- {
- opt[ret++] = FILLCHAR;
- CHECKLINE;
- }
- }
- opt[ret++] = FILLCHAR;
- return ret;
-}
-
-#define cvtfind(a)( (((a) >= 'A')&&((a) <= 'Z'))? (a)-'A'\
- :(((a)>='a')&&((a)<='z')) ? (a)-'a'+26\
- :(((a)>='0')&&((a)<='9')) ? (a)-'0'+52\
- :((a) == '+') ? 62\
- :((a) == '/') ? 63 : -1)
-/**
- * Decode from Base64.
- *
- * @param data the data to encode
- * @param len the length of the input
- * @param output where to write the output (*output should be NULL,
- * is allocated)
- * @return the size of the output
- */
-static unsigned int
-base64_decode (const char *data, unsigned int len, char **output)
-{
- unsigned int i;
- char c;
- char c1;
- unsigned int ret = 0;
-
-#define CHECK_CRLF while (data[i] == '\r' || data[i] == '\n') {\
- GNUNET_GE_LOG(ectx, GNUNET_GE_DEBUG | GNUNET_GE_REQUEST | GNUNET_GE_USER, "ignoring CR/LF\n"); \
- i++; \
- if (i >= len) goto END; \
- }
-
- *output = GNUNET_malloc ((len * 3 / 4) + 8);
-#if DEBUG_SMTP
- GNUNET_GE_LOG (ectx, GNUNET_GE_DEBUG | GNUNET_GE_REQUEST | GNUNET_GE_USER,
- "base64_decode decoding len=%d\n", len);
-#endif
- for (i = 0; i < len; ++i)
- {
- CHECK_CRLF;
- if (data[i] == FILLCHAR)
- break;
- c = (char) cvtfind (data[i]);
- ++i;
- CHECK_CRLF;
- c1 = (char) cvtfind (data[i]);
- c = (c << 2) | ((c1 >> 4) & 0x3);
- (*output)[ret++] = c;
- if (++i < len)
- {
- CHECK_CRLF;
- c = data[i];
- if (FILLCHAR == c)
- break;
- c = (char) cvtfind (c);
- c1 = ((c1 << 4) & 0xf0) | ((c >> 2) & 0xf);
- (*output)[ret++] = c1;
- }
- if (++i < len)
- {
- CHECK_CRLF;
- c1 = data[i];
- if (FILLCHAR == c1)
- break;
-
- c1 = (char) cvtfind (c1);
- c = ((c << 6) & 0xc0) | c1;
- (*output)[ret++] = c;
- }
- }
-END:
- return ret;
-}
/* ********************* the real stuff ******************* */
if ((line[pos] == '\r') || (line[pos] == '\n'))
break; /* empty line => end of message! */
}
- size = base64_decode (line, pos, &out);
+ size = GNUNET_STRINGS_base64_decode (line, pos, &out);
if (size < sizeof (SMTPMessage))
{
GNUNET_GE_BREAK (ectx, 0);
}
if (stats != NULL)
stats->change (stat_bytesReceived, size);
- coreMP = GNUNET_malloc (sizeof (GNUNET_TransportPacket));
+ coreMP = GNUNET_new (GNUNET_TransportPacket);
coreMP->msg = out;
coreMP->size = size - sizeof (SMTPMessage);
coreMP->tsession = NULL;
haddr = (EmailAddress *) &msg[1];
memset (&haddr->filter[0], 0, FILTER_STRING_SIZE);
strcpy (&haddr->filter[0], filter);
- memcpy (&haddr->senderAddress[0], email, strlen (email) + 1);
+ GNUNET_memcpy (&haddr->senderAddress[0], email, strlen (email) + 1);
msg->senderAddressSize = htons (strlen (email) + 1 + sizeof (EmailAddress));
msg->protocol = htons (GNUNET_TRANSPORT_PROTOCOL_NUMBER_SMTP);
msg->MTU = htonl (smtpAPI.mtu);
}
GNUNET_free (filter);
m = GNUNET_malloc (size + sizeof (SMTPMessage));
- memcpy (m, msg, size);
+ GNUNET_memcpy (m, msg, size);
mp = (SMTPMessage *) &m[size];
mp->header.size = htons (size + sizeof (SMTPMessage));
mp->header.type = htons (0);
mp->sender = *core_api->my_identity;
gm_cls.ebody = NULL;
gm_cls.pos = 0;
- gm_cls.esize = base64_encode (m, size + sizeof (SMTPMessage), &gm_cls.ebody);
+ gm_cls.esize = GNUNET_STRINGS_base64_encode (m, size + sizeof (SMTPMessage), &gm_cls.ebody);
GNUNET_free (m);
if (0 == smtp_size_set_estimate (message, gm_cls.esize))
{
{
GNUNET_TSession *tsession;
- tsession = GNUNET_malloc (sizeof (GNUNET_TSession));
+ tsession = GNUNET_new (GNUNET_TSession);
tsession->internal = GNUNET_malloc (GNUNET_sizeof_hello (hello));
tsession->peer = hello->senderIdentity;
- memcpy (tsession->internal, hello, GNUNET_sizeof_hello (hello));
+ GNUNET_memcpy (tsession->internal, hello, GNUNET_sizeof_hello (hello));
tsession->ttype = smtpAPI.protocol_number;
(*tsessionPtr) = tsession;
return GNUNET_OK;