Browse Source

Merge pull request #550 from pfzim/master

fdm, tdb, nail: new packages added
lilik-openwrt-22.03
Steven Barth 10 years ago
parent
commit
393929eb4b
11 changed files with 944 additions and 0 deletions
  1. +56
    -0
      libs/tdb/Makefile
  2. +41
    -0
      libs/tdb/patches/001-printf-fix.patch
  3. +10
    -0
      mail/fdm/Config.in
  4. +86
    -0
      mail/fdm/Makefile
  5. +36
    -0
      mail/fdm/files/etc/fdm.conf
  6. +14
    -0
      mail/fdm/patches/001-base64-fix.patch
  7. +20
    -0
      mail/fdm/patches/002-base64-fix.patch
  8. +183
    -0
      mail/fdm/src/compat/b64_ntop.c
  9. +393
    -0
      mail/fdm/src/compat/b64_pton.c
  10. +60
    -0
      mail/nail/Makefile
  11. +45
    -0
      utils/mpack/Makefile

+ 56
- 0
libs/tdb/Makefile View File

@ -0,0 +1,56 @@
#
# Copyright (C) 2007-2014 OpenWrt.org
#
# This is free software, licensed under the GNU General Public License v2.
# See /LICENSE for more information.
#
include $(TOPDIR)/rules.mk
PKG_NAME:=tdb
PKG_VERSION:=1.0.6
PKG_RELEASE:=1
PKG_LICENSE:=GPL-2.0
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
PKG_SOURCE_URL:=@SF/tdb
PKG_MD5SUM:=6b643fdeb48304010dcd5f675e458b58
PKG_INSTALL:=1
PKG_BUILD_DEPENDS:=+libgdbm
include $(INCLUDE_DIR)/package.mk
define Package/tdb
SUBMENU:=database
SECTION:=libs
CATEGORY:=Libraries
TITLE:=Trivial Database
URL:=http://sourceforge.net/projects/tdb/
MAINTAINER:=Dmitry V. Zimin <pfzim@mail.ru>
# DEPENDS:=+libgdbm
endef
define Package/tdb/description
TDB is a Trivial Database. In concept, it is very much like GDBM,
and BSD's DB except that it allows multiple simultaneous writers
and uses locking internally to keep writers from trampling on
each other. TDB is also extremely small.
endef
define Build/InstallDev
$(INSTALL_DIR) $(1)/usr/include
$(CP) $(PKG_INSTALL_DIR)/usr/include/tdb.h $(1)/usr/include/
$(INSTALL_DIR) $(1)/usr/lib
$(CP) $(PKG_INSTALL_DIR)/usr/lib/* $(1)/usr/lib/
endef
define Package/tdb/install
$(INSTALL_DIR) $(1)/usr/lib
$(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/* $(1)/usr/lib/
$(INSTALL_DIR) $(1)/usr/bin
$(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/* $(1)/usr/bin/
endef
$(eval $(call BuildPackage,tdb))

+ 41
- 0
libs/tdb/patches/001-printf-fix.patch View File

@ -0,0 +1,41 @@
--- a/tdbtool.c 2001-12-11 06:45:47.000000000 +0300
+++ b/tdbtool.c 2014-11-14 15:14:00.401164300 +0300
@@ -169,23 +169,21 @@ static void print_data(unsigned char *bu
static void help(void)
{
- printf("
-tdbtool:
- create dbname : create a database
- open dbname : open an existing database
- erase : erase the database
- dump dumpname : dump the database as strings
- insert key data : insert a record
- store key data : store a record (replace)
- show key : show a record by key
- delete key : delete a record by key
- list : print the database hash table and freelist
- free : print the database freelist
- 1 | first : print the first record
- n | next : print the next record
- q | quit : terminate
- \\n : repeat 'next' command
-");
+ printf("tdbtool:\n");
+ printf(" create dbname : create a database\n");
+ printf(" open dbname : open an existing database\n");
+ printf(" erase : erase the database\n");
+ printf(" dump dumpname : dump the database as strings\n");
+ printf(" insert key data : insert a record\n");
+ printf(" store key data : store a record (replace)\n");
+ printf(" show key : show a record by key\n");
+ printf(" delete key : delete a record by key\n");
+ printf(" list : print the database hash table and freelist\n");
+ printf(" free : print the database freelist\n");
+ printf(" 1 | first : print the first record\n");
+ printf(" n | next : print the next record\n");
+ printf(" q | quit : terminate\n");
+ printf(" \\n : repeat 'next' command\n\n");
}
static void terror(char *why)

+ 10
- 0
mail/fdm/Config.in View File

@ -0,0 +1,10 @@
menu "Configuration"
depends on PACKAGE_fdm
config FDM_WITH_PCRE
bool
default y
select libpcre
prompt "Enable PCRE support (elsewhere POSIX regex)"
endmenu

+ 86
- 0
mail/fdm/Makefile View File

@ -0,0 +1,86 @@
#
# Copyright (C) 2007-2014 OpenWrt.org
#
# This is free software, licensed under the GNU General Public License v2.
# See /LICENSE for more information.
#
include $(TOPDIR)/rules.mk
PKG_NAME:=fdm
PKG_VERSION:=1.7
PKG_RELEASE:=1
PKG_LICENSE:=BSD-2-Clause
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
PKG_SOURCE_URL:=@SF/fdm
PKG_MD5SUM:=aea0421571e8f3ec8f747a5d72c84348
PKG_INSTALL:=1
include $(INCLUDE_DIR)/package.mk
define Package/fdm
SECTION:=mail
CATEGORY:=Mail
TITLE:=fetch mail and deliver
URL:=http://fdm.sourceforge.net/
MAINTAINER:=Dmitry V. Zimin <pfzim@mail.ru>
MENU:=1
DEPENDS:=+tdb +zlib +libopenssl +FDM_WITH_PCRE:libpcre
USERID:=_fdm=99:_fdm=99
endef
define Package/fdm/description
fdm is a simple, lightweight replacement for mail fetch, filter
and delivery programs such as fetchmail and procmail. It can
fetch using POP3 or IMAP (with SSL) or from stdin, and deliver
to a pipe, file, maildir, mbox or SMTP server, based on $(if $(CONFIG_FDM_WITH_PCRE),PCRE,POSIX regexp)
endef
MAKE_FLAGS += \
PREFIX="/usr"\
$(if $(CONFIG_FDM_WITH_PCRE),PCRE=1)
define Build/Prepare
$(call Build/Prepare/Default)
$(CP) ./src/compat/* $(PKG_BUILD_DIR)/
endef
define Package/fdm/config
source "$(SOURCE)/Config.in
endef
define Package/fdm/conffiles
/etc/fdm.conf
endef
define Package/fdm/install
$(INSTALL_DIR) $(1)/usr/bin
$(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/* $(1)/usr/bin/
$(INSTALL_DIR) $(1)/etc
$(INSTALL_DATA) ./files/etc/* $(1)/etc/
$(INSTALL_DIR) $(1)/opt/fdm
chmod a+rwx $(1)/opt/fdm
endef
define Package/fdm/postinst
#!/bin/sh
if [ -z "$${IPKG_INSTROOT}" ]; then
echo "Creating cron job template for user _fdm..."
(crontab -l -u _fdm 2>/dev/null; echo "# */13 * * * * fdm -q fetch") | crontab -u _fdm -
echo "Please, edit file /etc/fdm.conf and enable cron job!"
fi
exit 0
endef
define Package/fdm/prerm
#!/bin/sh
if [ -z "$${IPKG_INSTROOT}" ]; then
echo "Don't forget disable cron job!"
echo "# crontab -r -u _fdm"
fi
exit 0
endef
$(eval $(call BuildPackage,fdm))

+ 36
- 0
mail/fdm/files/etc/fdm.conf View File

@ -0,0 +1,36 @@
# /etc/fdm.conf example file
# 1. Edit this file
# 2. Test: fdm -vv fetch
# 3. Enable cron job: crontab -e -u _fdm
set maximum-size 3M
set delete-oversized
set queue-high 1
set queue-low 0
set purge-after 5
set unmatched-mail keep
action "drop" drop
action "keep" keep
action "wakeup" exec "wol -h 192.168.0.255 -p 9 00:11:22:33:44:55"
action "my-test-action" exec "echo \"OK\" > /tmp/fdm.ok"
# This action extract *.torrent files from incoming email and put it
# to watch-dir your torrect client application
action "torrent-add" pipe "munpack -f -q -C /your-path/watch-dir/ ; for i in /your-path/watch-dir/*.torrent ; do chmod a+r \$i ; done"
account "xbmc" disabled
pop3s
server "pop.yandex.ru"
port 995
user "username-enter-here"
pass "password-enter-here"
new-only
cache "/opt/fdm/cache"
match "^Subject:[ \t]+openwrt:[ \t]*wakeup[ \t]*$" in headers actions { "wakeup" "drop" }
match "^Subject:[ \t]+openwrt:[ \t]*torrent[ \t]+add[ \t]*\$" in headers actions { "torrent-add" "drop" }
match "^Subject:[ \t]+openwrt:[ \t]*test[ \t]*$" in headers actions { "my-test-action" "drop" }
match all action "keep"

+ 14
- 0
mail/fdm/patches/001-base64-fix.patch View File

@ -0,0 +1,14 @@
--- a/fdm.h 2011-10-10 17:36:29.000000000 +0400
+++ b/fdm.h 2014-11-13 12:56:59.217083683 +0300
@@ -719,6 +719,11 @@
size_t strlcat(char *, const char *, size_t);
#endif
+int local_b64_ntop(uint8_t const *src, size_t srclength, char *target,
+ size_t targsize);
+
+int local_b64_pton(char const *src, uint8_t *target, size_t targsize);
+
/* shm.c */
char *shm_path(struct shm *);
void *shm_create(struct shm *, size_t);

+ 20
- 0
mail/fdm/patches/002-base64-fix.patch View File

@ -0,0 +1,20 @@
--- a/imap-common.c 2011-12-20 00:19:03.000000000 +0400
+++ b/imap-common.c 2014-11-13 12:56:06.930418446 +0300
@@ -206,7 +206,7 @@
size = (strlen(in) * 2) + 1;
out = xcalloc(1, size);
- if (b64_ntop(in, strlen(in), out, size) < 0) {
+ if (local_b64_ntop(in, strlen(in), out, size) < 0) {
xfree(out);
return (NULL);
}
@@ -222,7 +222,7 @@
size = (strlen(in) * 4) + 1;
out = xcalloc(1, size);
- if (b64_pton(in, out, size) < 0) {
+ if (local_b64_pton(in, out, size) < 0) {
xfree(out);
return (NULL);
}

+ 183
- 0
mail/fdm/src/compat/b64_ntop.c View File

@ -0,0 +1,183 @@
/*
* Copyright (c) 1996, 1998 by Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS
* ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE
* CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
* DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
* PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
* ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
* SOFTWARE.
*/
/*
* Portions Copyright (c) 1995 by International Business Machines, Inc.
*
* International Business Machines, Inc. (hereinafter called IBM) grants
* permission under its copyrights to use, copy, modify, and distribute this
* Software with or without fee, provided that the above copyright notice and
* all paragraphs of this notice appear in all copies, and that the name of IBM
* not be used in connection with the marketing of any product incorporating
* the Software or modifications thereof, without specific, written prior
* permission.
*
* To the extent it has a right to do so, IBM grants an immunity from suit
* under its patents, if any, for the use, sale or manufacture of products to
* the extent that such products are used for performing Domain Name System
* dynamic updates in TCP/IP networks by means of the Software. No immunity is
* granted for any product per se or for any other function of any product.
*
* THE SOFTWARE IS PROVIDED "AS IS", AND IBM DISCLAIMS ALL WARRANTIES,
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
* PARTICULAR PURPOSE. IN NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL,
* DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER ARISING
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE, EVEN
* IF IBM IS APPRISED OF THE POSSIBILITY OF SUCH DAMAGES.
*/
//#include <config.h>
#include <sys/types.h>
#include <sys/param.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "fdm.h"
#define Assert(Cond) if (!(Cond)) abort()
static const char Base64[] =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
static const char Pad64 = '=';
/* (From RFC1521 and draft-ietf-dnssec-secext-03.txt)
The following encoding technique is taken from RFC 1521 by Borenstein
and Freed. It is reproduced here in a slightly edited form for
convenience.
A 65-character subset of US-ASCII is used, enabling 6 bits to be
represented per printable character. (The extra 65th character, "=",
is used to signify a special processing function.)
The encoding process represents 24-bit groups of input bits as output
strings of 4 encoded characters. Proceeding from left to right, a
24-bit input group is formed by concatenating 3 8-bit input groups.
These 24 bits are then treated as 4 concatenated 6-bit groups, each
of which is translated into a single digit in the base64 alphabet.
Each 6-bit group is used as an index into an array of 64 printable
characters. The character referenced by the index is placed in the
output string.
Table 1: The Base64 Alphabet
Value Encoding Value Encoding Value Encoding Value Encoding
0 A 17 R 34 i 51 z
1 B 18 S 35 j 52 0
2 C 19 T 36 k 53 1
3 D 20 U 37 l 54 2
4 E 21 V 38 m 55 3
5 F 22 W 39 n 56 4
6 G 23 X 40 o 57 5
7 H 24 Y 41 p 58 6
8 I 25 Z 42 q 59 7
9 J 26 a 43 r 60 8
10 K 27 b 44 s 61 9
11 L 28 c 45 t 62 +
12 M 29 d 46 u 63 /
13 N 30 e 47 v
14 O 31 f 48 w (pad) =
15 P 32 g 49 x
16 Q 33 h 50 y
Special processing is performed if fewer than 24 bits are available
at the end of the data being encoded. A full encoding quantum is
always completed at the end of a quantity. When fewer than 24 input
bits are available in an input group, zero bits are added (on the
right) to form an integral number of 6-bit groups. Padding at the
end of the data is performed using the '=' character.
Since all base64 input is an integral number of octets, only the
following cases can arise:
(1) the final quantum of encoding input is an integral
multiple of 24 bits; here, the final unit of encoded
output will be an integral multiple of 4 characters
with no "=" padding,
(2) the final quantum of encoding input is exactly 8 bits;
here, the final unit of encoded output will be two
characters followed by two "=" padding characters, or
(3) the final quantum of encoding input is exactly 16 bits;
here, the final unit of encoded output will be three
characters followed by one "=" padding character.
*/
int
local_b64_ntop(uint8_t const *src, size_t srclength, char *target, size_t targsize) {
size_t datalength = 0;
uint8_t input[3];
uint8_t output[4];
size_t i;
while (2 < srclength) {
input[0] = *src++;
input[1] = *src++;
input[2] = *src++;
srclength -= 3;
output[0] = input[0] >> 2;
output[1] = ((input[0] & 0x03) << 4) + (input[1] >> 4);
output[2] = ((input[1] & 0x0f) << 2) + (input[2] >> 6);
output[3] = input[2] & 0x3f;
Assert(output[0] < 64);
Assert(output[1] < 64);
Assert(output[2] < 64);
Assert(output[3] < 64);
if (datalength + 4 > targsize)
return (-1);
target[datalength++] = Base64[output[0]];
target[datalength++] = Base64[output[1]];
target[datalength++] = Base64[output[2]];
target[datalength++] = Base64[output[3]];
}
/* Now we worry about padding. */
if (0 != srclength) {
/* Get what's left. */
input[0] = input[1] = input[2] = '\0';
for (i = 0; i < srclength; i++)
input[i] = *src++;
output[0] = input[0] >> 2;
output[1] = ((input[0] & 0x03) << 4) + (input[1] >> 4);
output[2] = ((input[1] & 0x0f) << 2) + (input[2] >> 6);
Assert(output[0] < 64);
Assert(output[1] < 64);
Assert(output[2] < 64);
if (datalength + 4 > targsize)
return (-1);
target[datalength++] = Base64[output[0]];
target[datalength++] = Base64[output[1]];
if (srclength == 1)
target[datalength++] = Pad64;
else
target[datalength++] = Base64[output[2]];
target[datalength++] = Pad64;
}
if (datalength >= targsize)
return (-1);
target[datalength] = '\0'; /* Returned value doesn't count \0. */
return (datalength);
}

+ 393
- 0
mail/fdm/src/compat/b64_pton.c View File

@ -0,0 +1,393 @@
/*
* Copyright (c) 1996, 1998 by Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS
* ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE
* CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
* DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
* PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
* ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
* SOFTWARE.
*/
/*
* Portions Copyright (c) 1995 by International Business Machines, Inc.
*
* International Business Machines, Inc. (hereinafter called IBM) grants
* permission under its copyrights to use, copy, modify, and distribute this
* Software with or without fee, provided that the above copyright notice and
* all paragraphs of this notice appear in all copies, and that the name of IBM
* not be used in connection with the marketing of any product incorporating
* the Software or modifications thereof, without specific, written prior
* permission.
*
* To the extent it has a right to do so, IBM grants an immunity from suit
* under its patents, if any, for the use, sale or manufacture of products to
* the extent that such products are used for performing Domain Name System
* dynamic updates in TCP/IP networks by means of the Software. No immunity is
* granted for any product per se or for any other function of any product.
*
* THE SOFTWARE IS PROVIDED "AS IS", AND IBM DISCLAIMS ALL WARRANTIES,
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
* PARTICULAR PURPOSE. IN NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL,
* DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER ARISING
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE, EVEN
* IF IBM IS APPRISED OF THE POSSIBILITY OF SUCH DAMAGES.
*/
//#include <config.h>
#include <sys/types.h>
#include <sys/param.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "fdm.h"
#define Assert(Cond) if (!(Cond)) abort()
static const char Base64[] =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
static const char Pad64 = '=';
/* (From RFC1521 and draft-ietf-dnssec-secext-03.txt)
The following encoding technique is taken from RFC 1521 by Borenstein
and Freed. It is reproduced here in a slightly edited form for
convenience.
A 65-character subset of US-ASCII is used, enabling 6 bits to be
represented per printable character. (The extra 65th character, "=",
is used to signify a special processing function.)
The encoding process represents 24-bit groups of input bits as output
strings of 4 encoded characters. Proceeding from left to right, a
24-bit input group is formed by concatenating 3 8-bit input groups.
These 24 bits are then treated as 4 concatenated 6-bit groups, each
of which is translated into a single digit in the base64 alphabet.
Each 6-bit group is used as an index into an array of 64 printable
characters. The character referenced by the index is placed in the
output string.
Table 1: The Base64 Alphabet
Value Encoding Value Encoding Value Encoding Value Encoding
0 A 17 R 34 i 51 z
1 B 18 S 35 j 52 0
2 C 19 T 36 k 53 1
3 D 20 U 37 l 54 2
4 E 21 V 38 m 55 3
5 F 22 W 39 n 56 4
6 G 23 X 40 o 57 5
7 H 24 Y 41 p 58 6
8 I 25 Z 42 q 59 7
9 J 26 a 43 r 60 8
10 K 27 b 44 s 61 9
11 L 28 c 45 t 62 +
12 M 29 d 46 u 63 /
13 N 30 e 47 v
14 O 31 f 48 w (pad) =
15 P 32 g 49 x
16 Q 33 h 50 y
Special processing is performed if fewer than 24 bits are available
at the end of the data being encoded. A full encoding quantum is
always completed at the end of a quantity. When fewer than 24 input
bits are available in an input group, zero bits are added (on the
right) to form an integral number of 6-bit groups. Padding at the
end of the data is performed using the '=' character.
Since all base64 input is an integral number of octets, only the
following cases can arise:
(1) the final quantum of encoding input is an integral
multiple of 24 bits; here, the final unit of encoded
output will be an integral multiple of 4 characters
with no "=" padding,
(2) the final quantum of encoding input is exactly 8 bits;
here, the final unit of encoded output will be two
characters followed by two "=" padding characters, or
(3) the final quantum of encoding input is exactly 16 bits;
here, the final unit of encoded output will be three
characters followed by one "=" padding character.
*/
/* skips all whitespace anywhere.
converts characters, four at a time, starting at (or after)
src from base - 64 numbers into three 8 bit bytes in the target area.
it returns the number of data bytes stored at the target, or -1 on error.
*/
static int b64rmap_initialized = 0;
static uint8_t b64rmap[256];
static const uint8_t b64rmap_special = 0xf0;
static const uint8_t b64rmap_end = 0xfd;
static const uint8_t b64rmap_space = 0xfe;
static const uint8_t b64rmap_invalid = 0xff;
/**
* Initializing the reverse map is not thread safe.
* Which is fine for NSD. For now...
**/
static void
b64_initialize_rmap ()
{
int i;
char ch;
/* Null: end of string, stop parsing */
b64rmap[0] = b64rmap_end;
for (i = 1; i < 256; ++i) {
ch = (char)i;
/* Whitespaces */
if (isspace(ch))
b64rmap[i] = b64rmap_space;
/* Padding: stop parsing */
else if (ch == Pad64)
b64rmap[i] = b64rmap_end;
/* Non-base64 char */
else
b64rmap[i] = b64rmap_invalid;
}
/* Fill reverse mapping for base64 chars */
for (i = 0; Base64[i] != '\0'; ++i)
b64rmap[(uint8_t)Base64[i]] = i;
b64rmap_initialized = 1;
}
static int
b64_pton_do(char const *src, uint8_t *target, size_t targsize)
{
int tarindex, state, ch;
uint8_t ofs;
state = 0;
tarindex = 0;
while (1)
{
ch = *src++;
ofs = b64rmap[ch];
if (ofs >= b64rmap_special) {
/* Ignore whitespaces */
if (ofs == b64rmap_space)
continue;
/* End of base64 characters */
if (ofs == b64rmap_end)
break;
/* A non-base64 character. */
return (-1);
}
switch (state) {
case 0:
if ((size_t)tarindex >= targsize)
return (-1);
target[tarindex] = ofs << 2;
state = 1;
break;
case 1:
if ((size_t)tarindex + 1 >= targsize)
return (-1);
target[tarindex] |= ofs >> 4;
target[tarindex+1] = (ofs & 0x0f)
<< 4 ;
tarindex++;
state = 2;
break;
case 2:
if ((size_t)tarindex + 1 >= targsize)
return (-1);
target[tarindex] |= ofs >> 2;
target[tarindex+1] = (ofs & 0x03)
<< 6;
tarindex++;
state = 3;
break;
case 3:
if ((size_t)tarindex >= targsize)
return (-1);
target[tarindex] |= ofs;
tarindex++;
state = 0;
break;
default:
abort();
}
}
/*
* We are done decoding Base-64 chars. Let's see if we ended
* on a byte boundary, and/or with erroneous trailing characters.
*/
if (ch == Pad64) { /* We got a pad char. */
ch = *src++; /* Skip it, get next. */
switch (state) {
case 0: /* Invalid = in first position */
case 1: /* Invalid = in second position */
return (-1);
case 2: /* Valid, means one byte of info */
/* Skip any number of spaces. */
for ((void)NULL; ch != '\0'; ch = *src++)
if (b64rmap[ch] != b64rmap_space)
break;
/* Make sure there is another trailing = sign. */
if (ch != Pad64)
return (-1);
ch = *src++; /* Skip the = */
/* Fall through to "single trailing =" case. */
/* FALLTHROUGH */
case 3: /* Valid, means two bytes of info */
/*
* We know this char is an =. Is there anything but
* whitespace after it?
*/
for ((void)NULL; ch != '\0'; ch = *src++)
if (b64rmap[ch] != b64rmap_space)
return (-1);
/*
* Now make sure for cases 2 and 3 that the "extra"
* bits that slopped past the last full byte were
* zeros. If we don't check them, they become a
* subliminal channel.
*/
if (target[tarindex] != 0)
return (-1);
}
} else {
/*
* We ended by seeing the end of the string. Make sure we
* have no partial bytes lying around.
*/
if (state != 0)
return (-1);
}
return (tarindex);
}
static int
b64_pton_len(char const *src)
{
int tarindex, state, ch;
uint8_t ofs;
state = 0;
tarindex = 0;
while (1)
{
ch = *src++;
ofs = b64rmap[ch];
if (ofs >= b64rmap_special) {
/* Ignore whitespaces */
if (ofs == b64rmap_space)
continue;
/* End of base64 characters */
if (ofs == b64rmap_end)
break;
/* A non-base64 character. */
return (-1);
}
switch (state) {
case 0:
state = 1;
break;
case 1:
tarindex++;
state = 2;
break;
case 2:
tarindex++;
state = 3;
break;
case 3:
tarindex++;
state = 0;
break;
default:
abort();
}
}
/*
* We are done decoding Base-64 chars. Let's see if we ended
* on a byte boundary, and/or with erroneous trailing characters.
*/
if (ch == Pad64) { /* We got a pad char. */
ch = *src++; /* Skip it, get next. */
switch (state) {
case 0: /* Invalid = in first position */
case 1: /* Invalid = in second position */
return (-1);
case 2: /* Valid, means one byte of info */
/* Skip any number of spaces. */
for ((void)NULL; ch != '\0'; ch = *src++)
if (b64rmap[ch] != b64rmap_space)
break;
/* Make sure there is another trailing = sign. */
if (ch != Pad64)
return (-1);
ch = *src++; /* Skip the = */
/* Fall through to "single trailing =" case. */
/* FALLTHROUGH */
case 3: /* Valid, means two bytes of info */
/*
* We know this char is an =. Is there anything but
* whitespace after it?
*/
for ((void)NULL; ch != '\0'; ch = *src++)
if (b64rmap[ch] != b64rmap_space)
return (-1);
}
} else {
/*
* We ended by seeing the end of the string. Make sure we
* have no partial bytes lying around.
*/
if (state != 0)
return (-1);
}
return (tarindex);
}
int
local_b64_pton(char const *src, uint8_t *target, size_t targsize)
{
if (!b64rmap_initialized)
b64_initialize_rmap ();
if (target)
return b64_pton_do (src, target, targsize);
else
return b64_pton_len (src);
}

+ 60
- 0
mail/nail/Makefile View File

@ -0,0 +1,60 @@
#
# Copyright (C) 2007-2014 OpenWrt.org
#
# This is free software, licensed under the GNU General Public License v2.
# See /LICENSE for more information.
#
include $(TOPDIR)/rules.mk
PKG_NAME:=nail
PKG_VERSION:=
PKG_RELEASE:=1
PKG_LICENSE:=BSD-2-Clause
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
PKG_SOURCE_URL:=:pserver:anonymous@nail.cvs.sourceforge.net:/cvsroot/nail
PKG_SOURCE_SUBDIR:=$(PKG_NAME)
PKG_SOURCE_VERSION:=-D"2014-11-24 00:00"
PKG_SOURCE_PROTO:=cvs
PKG_INSTALL:=0
include $(INCLUDE_DIR)/package.mk
define Package/nail
SECTION:=mail
CATEGORY:=Mail
TITLE:=Heirloom mailx (nail)
URL:=http://heirloom.sourceforge.net/mailx.html
MAINTAINER:=Dmitry V. Zimin <pfzim@mail.ru>
DEPENDS:=+libopenssl
endef
define Package/nail/description
Heirloom mailx (formerly known as "nail") is intended provide
the functionality of the POSIX mailx command with additional
support for MIME messages, IMAP (including caching), POP3,
SMTP, S/MIME, message threading/sorting, scoring, and filtering
endef
define Package/nail/conffiles
/etc/nail.rc
endef
define Build/Install
$(INSTALL_DIR) $(PKG_INSTALL_DIR)/usr/bin
$(CP) $(PKG_BUILD_DIR)/mailx $(PKG_INSTALL_DIR)/usr/bin/
$(INSTALL_DIR) $(PKG_INSTALL_DIR)/etc
$(CP) $(PKG_BUILD_DIR)/nail.rc $(PKG_INSTALL_DIR)/etc/
endef
define Package/nail/install
$(INSTALL_DIR) $(1)/usr/bin
$(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/* $(1)/usr/bin/
$(INSTALL_DIR) $(1)/etc
$(INSTALL_BIN) $(PKG_INSTALL_DIR)/etc/* $(1)/etc/
endef
$(eval $(call BuildPackage,nail))

+ 45
- 0
utils/mpack/Makefile View File

@ -0,0 +1,45 @@
#
# Copyright (C) 2007-2014 OpenWrt.org
#
# This is free software, licensed under the GNU General Public License v2.
# See /LICENSE for more information.
#
include $(TOPDIR)/rules.mk
PKG_NAME:=mpack
PKG_VERSION:=1.6
PKG_RELEASE:=1
PKG_LICENSE:=NLPL
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
PKG_SOURCE_URL:=http://ftp.andrew.cmu.edu/pub/mpack/
PKG_MD5SUM:=a70fa5afa76539a9afb70b9d81568fe8
PKG_INSTALL:=1
include $(INCLUDE_DIR)/package.mk
define Package/mpack
SECTION:=utils
CATEGORY:=Utilities
TITLE:=mpack/munpack MIME format mail messages
URL:=http://ftp.andrew.cmu.edu/pub/mpack/
MAINTAINER:=Dmitry V. Zimin <pfzim@mail.ru>
endef
define Package/mpack/description
Mpack and munpack are utilities for encoding and decoding
(respectively) binary files in MIME (Multipurpose Internet Mail
Extensions) format mail messages. For compatibility with older forms
of transferring binary files, the munpack program can also decode
messages in split-uuencoded format.
endef
define Package/mpack/install
$(INSTALL_DIR) $(1)/usr/bin
$(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/* $(1)/usr/bin/
endef
$(eval $(call BuildPackage,mpack))

Loading…
Cancel
Save