jaromail

a commandline tool to easily and privately handle your e-mail
git clone git://parazyd.org/jaromail.git
Log | Files | Refs | Submodules | README

commit 605cd15aa2da0c7f22a30c5cb51cf4ad74664db2
parent 218a2ff05c425b787081e18e7453f3ca693952d7
Author: Jaromil <jaromil@dyne.org>
Date:   Wed,  7 May 2014 12:46:59 +0200

some minor cleanup of leftovers

Diffstat:
Mbuild/build-gnu.sh | 49-------------------------------------------------
Dsrc/dotlock.c | 538-------------------------------------------------------------------------------
Dsrc/dotlock.h | 40----------------------------------------
Dsrc/pgpewrap.c | 64----------------------------------------------------------------
Dsrc/zlibs/init | 78------------------------------------------------------------------------------
5 files changed, 0 insertions(+), 769 deletions(-)

diff --git a/build/build-gnu.sh b/build/build-gnu.sh @@ -85,41 +85,6 @@ mkdir -p build/gnu print "All dependencies installed" } -# { test "$target" = "dotlock" } || { -# test "$target" = "all" } && { -# pushd src -# print -n "Compiling the file lock utility... " -# ${=cc} -Wno-unused-result -o dotlock dotlock.c -# popd -# cp src/dotlock build/gnu/dotlock -# print OK -# } - -{ test "$target" = "pgpewrap" } || { - test "$target" = "all" } && { - pushd src - print -n "Compiling the pgp address wrapper... " - ${=cc} -c pgpewrap.c - ${=cc} -o pgpewrap pgpewrap.o - popd - cp src/pgpewrap build/gnu/ - print OK -} - -# { test "$target" = "mairix" } || { -# test "$target" = "all" } && { -# print "Compiling the parser library..." -# pushd src -# parser_sources=(datescan db dotlock expandstr glob md5 nvpscan rfc822 stats tok) -# parser_sources+=(writer dates dirscan dumper fromcheck hash mbox nvp reader search) -# for s in $parser_sources; do -# ${=cc} -I /usr/include -c $s.c -# done -# popd -# print OK -# } - - { test "$target" = "fetchaddr" } || { test "$target" = "all" } && { pushd src @@ -170,20 +135,6 @@ mkdir -p build/gnu cp src/gnome-keyring/jaro-gnome-keyring build/gnu/ } -# build mutt only if specified -{ test "$target" = "mutt" } && { - print "Compiling Mutt (MUA)" - pushd src/mutt-1.5.21 - { test -r configure } || { autoreconf -i } - CC="$cc" LDFLAGS="-lm" ./configure \ - --with-ssl --with-gnutls --enable-imap --disable-debug --with-slang --disable-gpgme \ - --enable-hcache --with-regex --with-tokyocabinet --with-mixmaster --enable-pgp - make > make.log - popd - cp src/mutt-1.5.21/mutt build/gnu/mutt-jaro - cp src/mutt-1.5.21/pgpewrap build/gnu/pgpewrap -} - # build mixmaster only if specified { test "$target" = "mixmaster" } && { print "Compiling Mixmaster (anonymous remailer)" diff --git a/src/dotlock.c b/src/dotlock.c @@ -1,538 +0,0 @@ -/* - * Copyright (C) 1996-2000 Michael R. Elkins <me@mutt.org> - * Copyright (C) 1998-2000 Thomas Roessler <roessler@does-not-exist.org> - * - * This program 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 2 of the License, or - * (at your option) any later version. - * - * This program 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 this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301,, USA. - */ - -/* - * Borrowed from the Mutt mailreader - */ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -#include <unistd.h> -#include <dirent.h> -#include <sys/file.h> -#include <sys/stat.h> -#include <sys/utsname.h> -#include <errno.h> -#include <time.h> -#include <fcntl.h> -#include <limits.h> - -#ifndef _POSIX_PATH_MAX -#include <posix1_lim.h> -#endif - -#include "dotlock.h" -#include "helpers.h" - -#ifdef HAVE_GETOPT_H -#include <getopt.h> -#endif - -#define MAXLINKS 1024 /* maximum link depth */ - -#define LONG_STRING 1024 -#define MAXLOCKATTEMPT 5 - -static int DotlockFlags; -static int Retry = MAXLOCKATTEMPT; - -static char *Hostname; - -static int dotlock_deference_symlink (char *, size_t, const char *); -static int dotlock_prepare (char *, size_t, const char *, int fd); -static int dotlock_check_stats (struct stat *, struct stat *); -static int dotlock_dispatch (const char *, int fd); - -static void usage (const char *); - -static void dotlock_expand_link (char *, const char *, const char *); - -/* These functions work on the current directory. - * Invoke dotlock_prepare () before and check their - * return value. - */ - -static int dotlock_try (void); -static int dotlock_unlock (const char *); -static int dotlock_unlink (const char *); -static int dotlock_lock (const char *); - - -#define check_flags(a) if (a & DL_FL_ACTIONS) usage (argv[0]) - -int main (int argc, char **argv) -{ - int i; - char *p; - struct utsname utsname; - - /* determine the system's host name */ - - uname (&utsname); - if (!(Hostname = strdup (utsname.nodename))) - return DL_EX_ERROR; - if ((p = strchr (Hostname, '.'))) - *p = '\0'; - - - /* parse the command line options. */ - DotlockFlags = 0; - - while ((i = getopt (argc, argv, "dtfur:")) != EOF) - { - switch (i) - { - /* actions, mutually exclusive */ - case 't': check_flags (DotlockFlags); DotlockFlags |= DL_FL_TRY; break; - case 'd': check_flags (DotlockFlags); DotlockFlags |= DL_FL_UNLINK; break; - case 'u': check_flags (DotlockFlags); DotlockFlags |= DL_FL_UNLOCK; break; - - /* other flags */ - case 'f': DotlockFlags |= DL_FL_FORCE; break; - case 'r': DotlockFlags |= DL_FL_RETRY; Retry = atoi (optarg); break; - - default: usage (argv[0]); - } - } - - if (optind == argc || Retry < 0) - usage (argv[0]); - - return dotlock_dispatch (argv[optind], -1); -} - - -static int dotlock_dispatch (const char *f, int fd) -{ - char realpath[_POSIX_PATH_MAX]; - - /* If dotlock_prepare () succeeds [return value == 0], - * realpath contains the basename of f, and we have - * successfully changed our working directory to - * `dirname $f`. Additionally, f has been opened for - * reading to verify that the user has at least read - * permissions on that file. - * - * For a more detailed explanation of all this, see the - * lengthy comment below. - */ - - if (dotlock_prepare (realpath, sizeof (realpath), f, fd) != 0) - return DL_EX_ERROR; - - /* Actually perform the locking operation. */ - - if (DotlockFlags & DL_FL_TRY) - return dotlock_try (); - else if (DotlockFlags & DL_FL_UNLOCK) - return dotlock_unlock (realpath); - else if (DotlockFlags & DL_FL_UNLINK) - return dotlock_unlink (realpath); - else /* lock */ - return dotlock_lock (realpath); -} - - -/* - * Usage information. - * - * This function doesn't return. - * - */ - -static void -usage (const char *av0) -{ - fprintf (stderr, "usage: %s [-t|-f|-u|-d] [-r <retries>] file\n", av0); - - fputs ("\noptions:" - "\n -t\t\ttry" - "\n -f\t\tforce" - "\n -u\t\tunlock" - "\n -d\t\tunlink" - "\n -r <retries>\tRetry locking" - "\n", stderr); - - exit (DL_EX_ERROR); -} - - -/* - * Access checking: Let's avoid to lock other users' mail - * spool files if we aren't permitted to read them. - * - * Some simple-minded access (2) checking isn't sufficient - * here: The problem is that the user may give us a - * deeply nested path to a file which has the same name - * as the file he wants to lock, but different - * permissions, say, e.g. - * /tmp/lots/of/subdirs/var/spool/mail/root. - * - * He may then try to replace /tmp/lots/of/subdirs by a - * symbolic link to / after we have invoked access () to - * check the file's permissions. The lockfile we'd - * create or remove would then actually be - * /var/spool/mail/root. - * - * To avoid this attack, we proceed as follows: - * - * - First, follow symbolic links a la - * dotlock_deference_symlink (). - * - * - get the result's dirname. - * - * - chdir to this directory. If you can't, bail out. - * - * - try to open the file in question, only using its - * basename. If you can't, bail out. - * - * - fstat that file and compare the result to a - * subsequent lstat (only using the basename). If - * the comparison fails, bail out. - * - * dotlock_prepare () is invoked from main () directly - * after the command line parsing has been done. - * - * Return values: - * - * 0 - Evereything's fine. The program's new current - * directory is the contains the file to be locked. - * The string pointed to by bn contains the name of - * the file to be locked. - * - * -1 - Something failed. Don't continue. - * - * tlr, Jul 15 1998 - */ - -static int -dotlock_check_stats (struct stat *fsb, struct stat *lsb) -{ - /* S_ISLNK (fsb->st_mode) should actually be impossible, - * but we may have mixed up the parameters somewhere. - * play safe. - */ - - if (S_ISLNK (lsb->st_mode) || S_ISLNK (fsb->st_mode)) - return -1; - - if ((lsb->st_dev != fsb->st_dev) || - (lsb->st_ino != fsb->st_ino) || - (lsb->st_mode != fsb->st_mode) || - (lsb->st_nlink != fsb->st_nlink) || - (lsb->st_uid != fsb->st_uid) || - (lsb->st_gid != fsb->st_gid) || - (lsb->st_rdev != fsb->st_rdev) || - (lsb->st_size != fsb->st_size)) - { - /* something's fishy */ - return -1; - } - - return 0; -} - -static int -dotlock_prepare (char *bn, size_t l, const char *f, int _fd) -{ - struct stat fsb, lsb; - char realpath[_POSIX_PATH_MAX]; - char *basename, *dirname; - char *p; - int fd; - int r; - - if (dotlock_deference_symlink (realpath, sizeof (realpath), f) == -1) - return -1; - - if ((p = strrchr (realpath, '/'))) - { - *p = '\0'; - basename = p + 1; - dirname = realpath; - } - else - { - basename = realpath; - dirname = "."; - } - - if (strlen (basename) + 1 > l) - return -1; - - strfcpy (bn, basename, l); - - if (chdir (dirname) == -1) - return -1; - - if (_fd != -1) - fd = _fd; - else if ((fd = open (basename, O_RDONLY)) == -1) - return -1; - - r = fstat (fd, &fsb); - - if (_fd == -1) - close (fd); - - if (r == -1) - return -1; - - if (lstat (basename, &lsb) == -1) - return -1; - - if (dotlock_check_stats (&fsb, &lsb) == -1) - return -1; - - return 0; -} - -/* - * Expand a symbolic link. - * - * This function expects newpath to have space for - * at least _POSIX_PATH_MAX characters. - * - */ - -static void -dotlock_expand_link (char *newpath, const char *path, const char *link) -{ - const char *lb = NULL; - size_t len; - - /* link is full path */ - if (*link == '/') - { - strfcpy (newpath, link, _POSIX_PATH_MAX); - return; - } - - if ((lb = strrchr (path, '/')) == NULL) - { - /* no path in link */ - strfcpy (newpath, link, _POSIX_PATH_MAX); - return; - } - - len = lb - path + 1; - memcpy (newpath, path, len); - strfcpy (newpath + len, link, _POSIX_PATH_MAX - len); -} - - -/* - * Deference a chain of symbolic links - * - * The final path is written to d. - * - */ - -static int -dotlock_deference_symlink (char *d, size_t l, const char *path) -{ - struct stat sb; - char realpath[_POSIX_PATH_MAX]; - const char *pathptr = path; - int count = 0; - - while (count++ < MAXLINKS) - { - if (lstat (pathptr, &sb) == -1) - { - /* perror (pathptr); */ - return -1; - } - - if (S_ISLNK (sb.st_mode)) - { - char linkfile[_POSIX_PATH_MAX]; - char linkpath[_POSIX_PATH_MAX]; - int len; - - if ((len = readlink (pathptr, linkfile, sizeof (linkfile))) == -1) - { - /* perror (pathptr); */ - return -1; - } - - linkfile[len] = '\0'; - dotlock_expand_link (linkpath, pathptr, linkfile); - strfcpy (realpath, linkpath, sizeof (realpath)); - pathptr = realpath; - } - else - break; - } - - strfcpy (d, pathptr, l); - return 0; -} - -/* - * Dotlock a file. - * - * realpath is assumed _not_ to be an absolute path to - * the file we are about to lock. Invoke - * dotlock_prepare () before using this function! - * - */ - -#define HARDMAXATTEMPTS 10 - -static int -dotlock_lock (const char *realpath) -{ - char lockfile[_POSIX_PATH_MAX + LONG_STRING]; - char nfslockfile[_POSIX_PATH_MAX + LONG_STRING]; - size_t prev_size = 0; - int fd; - int count = 0; - int hard_count = 0; - struct stat sb; - time_t t; - - sprintf (nfslockfile, "%s.%s.%d", realpath, Hostname, (int) getpid ()); - sprintf (lockfile, "%s.lock", realpath); - - - unlink (nfslockfile); - - while ((fd = open (nfslockfile, O_WRONLY | O_EXCL | O_CREAT, 0)) < 0) - { - if (errno != EAGAIN) - { - /* perror ("cannot open NFS lock file"); */ - return DL_EX_ERROR; - } - } - - - - close (fd); - - while (hard_count++ < HARDMAXATTEMPTS) - { - link (nfslockfile, lockfile); - - if (stat (nfslockfile, &sb) != 0) - { - /* perror ("stat"); */ - return DL_EX_ERROR; - } - - if (sb.st_nlink == 2) - break; - - if (count == 0) - prev_size = sb.st_size; - - if (prev_size == sb.st_size && ++count > Retry) - { - if (DotlockFlags & DL_FL_FORCE) - { - unlink (lockfile); - count = 0; - continue; - } - else - { - unlink (nfslockfile); - return DL_EX_EXIST; - } - } - - prev_size = sb.st_size; - - /* don't trust sleep (3) as it may be interrupted - * by users sending signals. - */ - - t = time (NULL); - do { - sleep (1); - } while (time (NULL) == t); - } - - unlink (nfslockfile); - - return DL_EX_OK; -} - - -/* - * Unlock a file. - * - * The same comment as for dotlock_lock () applies here. - * - */ - -static int -dotlock_unlock (const char *realpath) -{ - char lockfile[_POSIX_PATH_MAX + LONG_STRING]; - int i; - - sprintf (lockfile, "%s.lock", realpath); - - i = unlink (lockfile); - - if (i == -1) - return DL_EX_ERROR; - - return DL_EX_OK; -} - -/* remove an empty file */ - -static int -dotlock_unlink (const char *realpath) -{ - struct stat lsb; - int i = -1; - - if (dotlock_lock (realpath) != DL_EX_OK) - return DL_EX_ERROR; - - if ((i = lstat (realpath, &lsb)) == 0 && lsb.st_size == 0) - unlink (realpath); - - dotlock_unlock (realpath); - - return (i == 0) ? DL_EX_OK : DL_EX_ERROR; -} - - -/* - * Check if a file can be locked at all. - * - * The same comment as for dotlock_lock () applies here. - * - */ - -static int -dotlock_try (void) -{ - if (access (".", W_OK) == 0) - return DL_EX_OK; - - return DL_EX_IMPOSSIBLE; -} diff --git a/src/dotlock.h b/src/dotlock.h @@ -1,40 +0,0 @@ -/* - * Copyright (C) 1996-2000 Michael R. Elkins <me@mutt.org> - * Copyright (C) 1998-2000 Thomas Roessler <roessler@does-not-exist.org> - * - * This program 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 2 of the License, or - * (at your option) any later version. - * - * This program 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 this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301,, USA. - */ - -#ifndef _DOTLOCK_H -#define _DOTLOCK_H - -/* exit values */ - -#define DL_EX_OK 0 -#define DL_EX_ERROR 1 -#define DL_EX_EXIST 3 -#define DL_EX_IMPOSSIBLE 5 - -/* flags */ - -#define DL_FL_TRY (1 << 0) -#define DL_FL_UNLOCK (1 << 1) -#define DL_FL_FORCE (1 << 3) -#define DL_FL_RETRY (1 << 4) -#define DL_FL_UNLINK (1 << 5) - -#define DL_FL_ACTIONS (DL_FL_TRY|DL_FL_UNLOCK|DL_FL_UNLINK) - -#endif diff --git a/src/pgpewrap.c b/src/pgpewrap.c @@ -1,64 +0,0 @@ -/* - * C version by Wessel Dankers <wsl@fruit.eu.org> - * - * This code is in the public domain. - * - */ -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <string.h> - -void print_usage(const char *progname) { - fprintf(stderr, "Command line usage: %s [flags] -- prefix [recipients]\n", progname); - exit(1); -} - -int main(int argc, char **argv) { - char **opts, **opt, *pfx; - int i; - - if (argc <= 1) { - print_usage(argv[0]); - } - - opts = malloc((2 * argc + 1) * sizeof (* opts)); /* __MEM_CHECKED__ */ - if(!opts) { - perror(argv[0]); - exit(2); - } - - if (argc < 2) - { - fprintf (stderr, - "Command line usage: %s [flags] -- prefix [recipients]\n", - argv[0]); - return 1; - } - - opt = opts; - *opt++ = argv[1]; - pfx = NULL; - - for(i = 2; i < argc; ) { - if(!strcmp(argv[i], "--")) { - i += 2; - if(i > argc) { - print_usage(argv[0]); - } - pfx = argv[i-1]; - } - if(pfx) - *opt++ = pfx; - *opt++ = argv[i++]; - } - *opt = NULL; - - execvp(opts[0], opts); - perror(argv[0]); - return 2; -} diff --git a/src/zlibs/init b/src/zlibs/init @@ -1,78 +0,0 @@ -#!/usr/bin/env zsh -# -# Jaro Mail, your humble and faithful electronic postman -# -# a tool to easily and privately handle your e-mail communication -# -# Copyleft (C) 2010-2014 Denis Roio <jaromil@dyne.org> -# -# This source code is free software; you can redistribute it and/or -# modify it under the terms of the GNU Public License as published by -# the Free Software Foundation; either version 3 of the License, or -# (at your option) any later version. -# -# This source code 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. -# Please refer to the GNU Public License for more details. -# -# You should have received a copy of the GNU Public License along with -# this source code; if not, write to: -# Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - -maildir_init() { - - # source functions - source "$WORKDIR/jaro" source - - notice "Initializing current directory for Jaro Mail" - MAILDIRS="${1}" - ${=mkdir} "$MAILDIRS/tmp" "$MAILDIRS/cache" - - - # copy defaults if missing - if ! [ -r "$MAILDIRS/Filters.txt" ]; then - cp -v "$WORKDIR/Filters.txt" "$MAILDIRS/Filters.txt" - act "Default filters created" - else - error "Existing configuration $MAILDIRS/Filters.txt skipped" - fi - - - if ! [ -r "$MAILDIRS/Applications.txt" ]; then - cp -v "$WORKDIR/Applications.txt" "$MAILDIRS/Applications.txt" - act "Default helper applications settings created" - else - error "Existing configuration $MAILDIRS/Applications.txt skipped" - fi - - if ! [ -r "$MAILDIRS/Mutt.txt" ]; then - cp -v "$WORKDIR/Mutt.txt" "$MAILDIRS/Mutt.txt" - act "Default Mutt configuration template created" - else - error "Existing configuration $MAILDIRS/Mutt.txt skipped" - fi - - if ! [ -r "$MAILDIRS/Accounts" ]; then - cp -v -r "$WORKDIR/Accounts" "$MAILDIRS/Accounts" - act "Default accounts directory created" - else - error "Existing configuration $MAILDIRS/Accounts skipped" - fi - - { test -r "$MAILDIRS/Manual.pdf" } || { - cp -f "$WORKDIR/jaromail-manual.pdf" "$MAILDIRS/Manual.pdf" } - - # update the settings - JAROMAILDIR="$MAILDIRS" JAROWORKDIR="$WORKDIR" "$WORKDIR/jaro" update -q - - # create a startup wrapper - cat <<EOF > "$MAILDIRS/jaro" -#!/usr/bin/env zsh -export JAROWORKDIR="${WORKDIR}" -export JAROMAILDIR="${MAILDIRS}" -"${WORKDIR}/jaro" \${=@} -EOF - chmod +x "$MAILDIRS/jaro" - -}