tAdding the possibility of different configurations. - rohrpost - A commandline mail client to change the world as we see it.
 (HTM) git clone git://r-36.net/rohrpost
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) LICENSE
       ---
 (DIR) commit d12066fb46f960728396efe124aa7c4d592e2366
 (DIR) parent 84c06dab64f6e3821faa4569b21b44e3701579bc
 (HTM) Author: Christoph Lohmann <20h@r-36.net>
       Date:   Fri,  7 Dec 2012 10:09:55 +0100
       
       Adding the possibility of different configurations.
       
       Diffstat:
         add.c                               |      16 ++++++++++------
         barebone.c                          |      14 +++++++++-----
         bin/rpcomp                          |       6 ++++--
         bin/rpcountmail                     |       2 +-
         bin/rpdownload                      |       2 +-
         bin/rpdrafts                        |       8 ++++----
         bin/rpedit                          |      21 ++++++++++-----------
         bin/rpfinc                          |       2 +-
         bin/rpfscan                         |       2 +-
         bin/rpfview                         |       2 +-
         bin/rpfwd                           |      16 +++++++++-------
         bin/rpnews                          |       2 +-
         bin/rpnext                          |       8 ++++----
         bin/rpopen                          |       4 ++--
         bin/rppodplay                       |       3 +--
         bin/rppop                           |       4 ++--
         bin/rpprev                          |       4 ++--
         bin/rprepl                          |      14 ++++++++------
         bin/rpsend                          |      16 ++++++++--------
         bin/rpsyncmail                      |       2 +-
         bin/rptailf                         |       4 ++--
         capability.c                        |      12 ++++++++----
         cfg.c                               |     129 +++++++++++++++++++++++++------
         cfg.h                               |       7 ++++++-
         config.mk                           |       2 +-
         copy.c                              |      22 +++++++++++++---------
         cur.c                               |      15 ++++++++++-----
         flag.c                              |      30 +++++++++++++++++-------------
         folder.c                            |      28 ++++++++++++++++------------
         ids.c                               |      13 ++++++++-----
         imap.c                              |      24 +++++++++++++-----------
         imap.h                              |       6 +++---
         inc.c                               |      55 +++++++++++++++++++++----------
         inc.h                               |       8 ++++----
         ind.h                               |       9 ++++++---
         mark.c                              |      39 +++++++++++++++++++++----------
         mark.h                              |       4 ++--
         part.c                              |      16 ++++++++++------
         pick.c                              |      14 +++++++++-----
         remove.c                            |      17 ++++++++++-------
         scan.c                              |      13 ++++++++-----
         select.c                            |      12 ++++++++----
         sieve.c                             |      14 +++++++++-----
         stats.c                             |      12 ++++++++----
         txtdb.c                             |      15 +++++++++++++++
         txtdb.h                             |       3 +++
         view.c                              |      17 ++++++++++-------
       
       47 files changed, 450 insertions(+), 238 deletions(-)
       ---
 (DIR) diff --git a/add.c b/add.c
       t@@ -26,8 +26,8 @@ char *argv0;
        void
        addusage(void)
        {
       -        die("usage: %s [-qh] [-m folder] [-d datetime] [-f flags] file\n",
       -                        argv0);
       +        die("usage: %s [-qh] [-c cfg] [-m folder] [-d datetime] [-f flags]"
       +                        " file\n", argv0);
        }
        
        int
       t@@ -35,7 +35,7 @@ addmain(int argc, char *argv[])
        {
                config_t *cfg;
                imap_t *imap;
       -        char *user, *pass, *netspec, *folder, *flags, *tdate, *filec;
       +        char *user, *pass, *netspec, *folder, *flags, *tdate, *filec, *cfgn;
                int filelen, status;
                llist_t *flagl;
                inc_t *incs;
       t@@ -44,6 +44,7 @@ addmain(int argc, char *argv[])
                flags = NULL;
                tdate = NULL;
                status = 0;
       +        cfgn = NULL;
        
                enum {
                        BEQUIET = 0x01,
       t@@ -52,6 +53,9 @@ addmain(int argc, char *argv[])
                };
        
                ARGBEGIN {
       +        case 'c':
       +                cfgn = EARGF(addusage());
       +                break;
                case 'd':
                        tdate = EARGF(addusage());
                        break;
       t@@ -64,7 +68,6 @@ addmain(int argc, char *argv[])
                case 'q':
                        status |= BEQUIET;
                        break;
       -        case 'h':
                default:
                        addusage();
                } ARGEND;
       t@@ -77,6 +80,7 @@ addmain(int argc, char *argv[])
                } else {
                        filec = readfile(argv[0], &filelen);
                }
       +
                if (filec == NULL || filelen < 1)
                        die("Given file or input was too short or invalid.\n");
        
       t@@ -87,7 +91,7 @@ addmain(int argc, char *argv[])
                                die("Flag parameter seems to be invalid.");
                }
        
       -        cfg = config_init();
       +        cfg = config_init(cfgn);
        
                user = config_checkgetstr(cfg, "imapuser");
                pass = config_checkgetstr(cfg, "imappass");
       t@@ -110,7 +114,7 @@ addmain(int argc, char *argv[])
                if (imap_append(imap, folder, flagl, tdate, filec))
                        imap_die(imap, "imap_append");
        
       -        incs = inc_init();
       +        incs = inc_init(cfgn);
                inc_updatefolder(imap, folder, incs);
                if (!(status & BEQUIET)) {
                        free(filec);
 (DIR) diff --git a/barebone.c b/barebone.c
       t@@ -20,7 +20,8 @@ char *argv0;
        void
        flagusage(void)
        {
       -        fprintf(stderr, "usage: %s [-h] [[-s|-d] flag] [msgs]\n", argv0);
       +        fprintf(stderr, "usage: %s [-h] [-c cfg] [[-s|-d] flag] [msgs]\n",
       +                        argv0);
                exit(1);
        }
        
       t@@ -30,7 +31,7 @@ flagmain(int argc, char *argv[])
                config_t *cfg;
                imap_t *imap;
                int status;
       -        char *user, *pass, *netspec, *selected;
       +        char *user, *pass, *netspec, *selected, *cfgn;
                llist_t *folders, *ffolders, *statusl, *ids;
                llistelem_t *folder, *elem;
        
       t@@ -43,8 +44,12 @@ flagmain(int argc, char *argv[])
                };
        
                status = 0;
       +        cfgn = NULL;
        
                ARGBEGIN {
       +        case 'c':
       +                cfgn = EARGF(flagusage());
       +                break;
                case 'q':
                        status |= BEQUIET;
                        break;
       t@@ -55,14 +60,13 @@ flagmain(int argc, char *argv[])
                        status |= DRYRUN;
                        break;
                case 'e':
       -                addseq = EARGF(pickusage());
       +                addseq = EARGF(flagusage());
                        break;
       -        case 'h':
                default:
                        incusage();
                } ARGEND;
        
       -        cfg = config_init();
       +        cfg = config_init(cfgn);
                user = config_checkgetstr(cfg, "imapuser");
                pass = config_checkgetstr(cfg, "imappass");
                netspec = config_checkgetstr(cfg, "netspec");
 (DIR) diff --git a/bin/rpcomp b/bin/rpcomp
       t@@ -1,6 +1,8 @@
        #!/bin/sh
        
       -if [ ! -x $HOME/.rohrpost/tmpl/compose.sh ];
       +BASE="$(rpcfg -b)"
       +
       +if [ ! -x $BASE/tmpl/compose.sh ];
        then
                echo "$HOME/.rohrpost/tmpl/compose.sh does not exist. Will" \
                       "not proceed."
       t@@ -15,7 +17,7 @@ trap 'signalh' 3 6 9 15
        
        dfolder=$(rpcfg -v fold_drafts)
        
       -$HOME/.rohrpost/tmpl/compose.sh > $tmpfile
       +$BASE/tmpl/compose.sh > $tmpfile
        mid=$(rpadd -m $dfolder -f seen $tmpfile)
        signalh
        
 (DIR) diff --git a/bin/rpcountmail b/bin/rpcountmail
       t@@ -53,7 +53,7 @@
        #set -- `from | wc -l`
        #v=$1
        #v=`from | wc -l`
       -v=`rpstats -a`
       +v=$(rpstats -a)
        
        #v=0
        #exec 0</var/mail/$USER
 (DIR) diff --git a/bin/rpdownload b/bin/rpdownload
       t@@ -20,7 +20,7 @@ fi
        
        msgid="$*"
        
       -url=`rpview -- $msgid | awk '/URL:/ {print $2}' | tr -d '\r'`
       +url=$(rpview -- $msgid | awk '/URL:/ {print $2}' | tr -d '\r')
        cd $DOWNLOADDIR
        for i in $url
        do
 (DIR) diff --git a/bin/rpdrafts b/bin/rpdrafts
       t@@ -28,14 +28,14 @@ do
                        ;;
                esac
        done
       -shift `expr $OPTIND - 1`
       +shift $(expr $OPTIND - 1)
        
       -dfolder=`rpcfg -v fold_drafts`
       +dfolder=$(rpcfg -v fold_drafts)
        
        if [ $# -eq 0 ];
        then
                rpinc -qnu
       -        id=`rpids -m $dfolder : | awk -F' ' '{print $1}'`
       +        id=$(rpids -m $dfolder : | awk -F' ' '{print $1}')
                if [ "$id" = "0" ];
                then
                        echo "No drafts in draft folder."
       t@@ -65,7 +65,7 @@ fi
        
        if [ $doedit -eq 1 ];
        then
       -        id=`rpids -m $dfolder -- "$@" | awk -F' ' '{print $1}'`
       +        id=$(rpids -m $dfolder -- "$@" | awk -F' ' '{print $1}')
                if [ $? -eq 1 ];
                then
                        echo "Please specify a valid message id."
 (DIR) diff --git a/bin/rpedit b/bin/rpedit
       t@@ -1,7 +1,8 @@
        #!/bin/sh
        
        usage() {
       -        echo "usage: `basename $1` [-h] [-m folder] id"
       +        printf "usage: %s [-h] [-m folder] id\n" "$(basename $1)" 2>&1
       +        exit 1
        }
        
        folder=""
       t@@ -14,11 +15,11 @@ do
                        ;;
                *)
                        usage $0
       -                exit 1
                        ;;
                esac
        done
       -shift `expr $OPTIND - 1`
       +shift $(expr $OPTIND - 1)
       +
        if [ "$1" = "--" ];
        then
                shift 1
       t@@ -27,36 +28,34 @@ fi
        if [ $# -lt 1 ];
        then
                usage $0
       -        exit 1
        fi
        
        if [ -z "$folder" ];
        then
       -        folder=`rpsel`
       +        folder=$(rpsel)
        fi
        
       -id=`rpids -m $folder -- $* | awk -F' ' '{print $1}'`
       +id=$(rpids -m $folder -- $* | awk -F' ' '{print $1}')
        if [ -z "$id" ];
        then
                usage $0
       -        exit 1
        fi
        
       -tmpfile=`mktemp /tmp/rpedit.XXXXXXX.eml`
       +tmpfile=$(mktemp /tmp/rpedit.XXXXXXX.eml)
        signalh() {
                rm -f $tmpfile
        }
        trap 'signalh' 3 6 9 15
        
        rpview -m $folder -r $id > $tmpfile
       -md5before=`md5sum $tmpfile`
       +md5before=$(md5sum $tmpfile)
        eval $EDITOR $tmpfile
       -md5after=`md5sum $tmpfile`
       +md5after=$(md5sum $tmpfile)
        
        if [ "$md5before" != "$md5after" ];
        then
                rprm -qm $folder $id
       -        mid=`rpadd -m $folder -f seen $tmpfile`
       +        mid=$(rpadd -m $folder -f seen $tmpfile)
                if [ $? -eq 0 ];
                then
                        rpfscan -m $folder $mid
 (DIR) diff --git a/bin/rpfinc b/bin/rpfinc
       t@@ -1,4 +1,4 @@
        #!/bin/sh
        
       -rpinc "$@" | $HOME/.rohrpost/tmpl/inc.sh
       +rpinc "$@" | $(rpcfg -b)/tmpl/inc.sh
        
 (DIR) diff --git a/bin/rpfscan b/bin/rpfscan
       t@@ -1,4 +1,4 @@
        #!/bin/sh
        
       -rpscan "$@" | $HOME/.rohrpost/tmpl/scan.sh
       +rpscan "$@" | $(rpcfg -b)/tmpl/scan.sh
        
 (DIR) diff --git a/bin/rpfview b/bin/rpfview
       t@@ -1,4 +1,4 @@
        #!/bin/sh
        
       -rpview "$@" | $HOME/.rohrpost/tmpl/view.sh
       +rpview "$@" | $(rpcfg -b)/tmpl/view.sh
        
 (DIR) diff --git a/bin/rpfwd b/bin/rpfwd
       t@@ -1,7 +1,10 @@
        #!/bin/sh
        
       +BASE="$(cfg -b)"
       +
        usage() {
       -        echo "usage: `basename $1` [-h] msgids"
       +        printf "usage. %s [-h] msgids\n" "$(basename $1)" 2>&1
       +        exit 1
        }
        
        if [ "$1" = "--" ];
       t@@ -13,12 +16,11 @@ ids="$@"
        if [ -z "$ids" ];
        then
                usage $0
       -        exit 1
        fi
        
       -if [ ! -x $HOME/.rohrpost/tmpl/fwd.sh ];
       +if [ ! -x $BASE/tmpl/fwd.sh ];
        then
       -        echo "$HOME/.rohrpost/tmpl/fwd.sh does not exist. Will" \
       +        echo "$BASE/tmpl/fwd.sh does not exist. Will" \
                       "not proceed."
                exit 1
        fi
       t@@ -29,10 +31,10 @@ signalh() {
        }
        trap 'signalh' 3 6 9 15 
        
       -dfolder=`rpcfg -v fold_drafts`
       +dfolder=$(rpcfg -v fold_drafts)
        
       -$HOME/.rohrpost/tmpl/fwd.sh -- "$ids" > $tmpfile
       -mid=`rpadd -m $dfolder -f seen $tmpfile`
       +$BASE/tmpl/fwd.sh -- "$ids" > $tmpfile
       +mid=$(rpadd -m $dfolder -f seen $tmpfile)
        signalh
        
        if [ $? -eq 0 ];
 (DIR) diff --git a/bin/rpnews b/bin/rpnews
       t@@ -7,6 +7,6 @@ then
                args="unseen"
        fi
        
       -rpscan $args | $HOME/.rohrpost/tmpl/news.sh \
       +rpscan $args | $(rpcfg -b)/tmpl/news.sh \
                | eval $PAGER
        
 (DIR) diff --git a/bin/rpnext b/bin/rpnext
       t@@ -1,15 +1,15 @@
        #!/bin/sh
        
       -cur=`rpcur`
       +cur=$(rpcur)
        if [ $? -gt 0 ];
        then
                rpcur 1
                cur=1
        fi
       -cursel=`rpsel`
       -max=`rpinc $cursel | tail -n 1 | awk '{print $3}'`
       +cursel=$(rpsel)
       +max=$(rpinc $cursel | tail -n 1 | awk '{print $3}')
        
       -cur=`expr $cur + 1`
       +cur=$(($cur + 1))
        if [ $cur -gt $max ];
        then
                echo "We are at the last element."
 (DIR) diff --git a/bin/rpopen b/bin/rpopen
       t@@ -2,7 +2,7 @@
        
        if [ $# -lt 1 ];
        then
       -        echo "usage: `basename $0` msgid"
       +        printf "usage. %s msgid\n" "$(basename $0)" 2>&1
                exit 1
        fi
        
       t@@ -15,7 +15,7 @@ fi
        
        msgid="$*"
        
       -url=`rpview $msgid | awk '/^URL:/ {print $2}' | tr -d '\r'`
       +url=$(rpview $msgid | awk '/^URL:/ {print $2}' | tr -d '\r')
        for i in $url
        do
                echo $i
 (DIR) diff --git a/bin/rppodplay b/bin/rppodplay
       t@@ -1,7 +1,7 @@
        #!/bin/sh
        
        usage() {
       -        printf "usage: %s [-d] msgid\n" "$(basename $1)" >&2
       +        printf "usage: %s [-d] msgid\n" "$(basename $1)" 2>&1
                exit 1
        }
        
       t@@ -17,7 +17,6 @@ do
                
                *)
                        usage $0
       -                exit 1
                        ;;
                esac
        done
 (DIR) diff --git a/bin/rppop b/bin/rppop
       t@@ -1,7 +1,7 @@
        #!/bin/sh
        
       -markl=`rpmark -v $1`
       -elem=`echo $markl | awk -F' ' '{print $1}'`
       +markl=$(rpmark -v $1)
       +elem=$(echo $markl | awk -F' ' '{print $1}')
        rpmark -qr $1 $elem
        
        rpview $elem
 (DIR) diff --git a/bin/rpprev b/bin/rpprev
       t@@ -1,13 +1,13 @@
        #!/bin/sh
        
       -cur=`rpcur`
       +cur=$(rpcur)
        if [ $? -gt 0 ];
        then
                rpcur 1
                cur=1
        fi
        
       -cur=`expr $cur - 1`
       +cur=$(($cur - 1))
        if [ $cur -lt 1 ];
        then
                cur=1
 (DIR) diff --git a/bin/rprepl b/bin/rprepl
       t@@ -1,28 +1,30 @@
        #!/bin/sh
        
       -if [ ! -x $HOME/.rohrpost/tmpl/repl.sh ];
       +BASE="$(rpcfg -b)"
       +
       +if [ ! -x $BASE/tmpl/repl.sh ];
        then
       -        echo "$HOME/.rohrpost/tmpl/repl.sh does not exist. Will" \
       +        echo "$BASE/tmpl/repl.sh does not exist. Will" \
                       "not proceed."
                exit 1
        fi
        
       -tmpfile=`mktemp`
       +tmpfile=$(mktemp)
        signalh() {
                rm -f $tmpfile
        }
        trap 'signalh' 3 6 9 15 
        
       -dfolder=`rpcfg -v fold_drafts`
       +dfolder=$(rpcfg -v fold_drafts)
        
       -$HOME/.rohrpost/tmpl/repl.sh "$@" > $tmpfile
       +$BASE/tmpl/repl.sh "$@" > $tmpfile
        if [ $? -gt 0 ];
        then
                rm -f $tempfile
                exit 1
        fi
        
       -mid=`rpadd -m $dfolder -f seen $tmpfile`
       +mid=$(rpadd -m $dfolder -f seen $tmpfile)
        signalh
        
        if [ $? -eq 0 ];
 (DIR) diff --git a/bin/rpsend b/bin/rpsend
       t@@ -1,7 +1,9 @@
        #!/bin/sh
        
        usage() {
       -        echo "usage: `basename $1` [-hd] [-s sent folder] [-m folder] id"
       +        printf "usage: %s [-hd] [-s sent folder] [-m folder] id\n" \
       +                "$(basename $1)" 2>&1
       +        exit 1
        }
        
        dodelete=0
       t@@ -22,11 +24,10 @@ do
                        ;;
                *)
                        usage $0
       -                exit 1
                        ;;
                esac
        done
       -shift `expr $OPTIND - 1`
       +shift $(($OPTIND - 1))
        if [ "$1" = "--" ];
        then
                shift 1
       t@@ -35,12 +36,11 @@ fi
        if [ $# -lt 1 ];
        then
                usage $0
       -        exit 1
        fi
        
        if [ -z "$folder" ];
        then
       -        folder=`rpcfg -v fold_drafts`
       +        folder=$(rpcfg -v fold_drafts)
                if [ $? -eq 1 ];
                then
                        echo "Please specify fold_drafts in rpcfg."
       t@@ -50,17 +50,17 @@ fi
        
        if [ -z "$sentfolder" ];
        then
       -        sentfolder=`rpcfg -v fold_sent`
       +        sentfolder=$(rpcfg -v fold_sent)
        fi
        
       -mailer=`rpcfg -v send_cmd`
       +mailer=$(rpcfg -v send_cmd)
        if [ $? -eq 1 ];
        then
                echo "Please specify a send_cmd in rpcfg."
                exit 1
        fi
        
       -for mid in `rpids -m $folder -- "$@"`;
       +for mid in $(rpids -m $folder -- "$@");
        do
                rpview -m $folder -r $mid | eval $mailer
                [ $? -gt 0 ] && exit 1
 (DIR) diff --git a/bin/rpsyncmail b/bin/rpsyncmail
       t@@ -6,7 +6,7 @@ then
        else
                for i in $*;
                do
       -                mailbox=`echo $i | sed "s/^mb://g"`
       +                mailbox=$(echo $i | sed "s/^mb://g")
                        dsync -R -m $mailbox -u chrissi mirror chrissi@r-36.net
                done
        fi
 (DIR) diff --git a/bin/rptailf b/bin/rptailf
       t@@ -2,7 +2,7 @@
        
        if [ -z "$1" ];
        then
       -        echo "usage: `basename $0` folder"
       +        printf "usage: %s folder\n" "$(basename $0)" 2>&1
                exit 1
        fi
        
       t@@ -10,7 +10,7 @@ folder="$1"
        
        while true;
        do
       -        num=`rpinc ${folder} | tail -n 1 | cut -f 3`
       +        num=$(rpinc ${folder} | tail -n 1 | cut -f 3)
        
                if [ $num -gt 0 ];
                then
 (DIR) diff --git a/capability.c b/capability.c
       t@@ -19,7 +19,7 @@ char *argv0;
        void
        capabilityusage(void)
        {
       -        fprintf(stderr, "usage: %s [-h]\n", argv0);
       +        fprintf(stderr, "usage: %s [-h] [-c cfg]\n", argv0);
                exit(1);
        }
        
       t@@ -28,16 +28,20 @@ capabilitymain(int argc, char *argv[])
        {
                config_t *cfg;
                imap_t *imap;
       -        char *user, *pass, *netspec;
       +        char *user, *pass, *netspec, *cfgn;
                llistelem_t *elem;
        
       +        cfgn = NULL;
       +
                ARGBEGIN {
       -        case 'h':
       +        case 'c':
       +                cfgn = EARGF(capabilityusage());
       +                break;
                default:
                        capabilityusage();
                } ARGEND;
        
       -        cfg = config_init();
       +        cfg = config_init(cfgn);
                user = (config_checkget(cfg, "imapuser"))->data;
                pass = (config_checkget(cfg, "imappass"))->data;
                netspec = (config_checkget(cfg, "imapnet"))->data;
 (DIR) diff --git a/cfg.c b/cfg.c
       t@@ -19,30 +19,87 @@
        
        char *argv0;
        
       +char *
       +config_mkcfgpath(char *cfgn)
       +{
       +        char *prefix, *path;
       +
       +        if (cfgn == NULL)
       +                cfgn = "default";
       +
       +        prefix = expandhome(CONFIGFILE);
       +        path = smprintf(prefix, cfgn);
       +        free(prefix);
       +
       +        return path;
       +}
       +
       +char *
       +config_mkbasepath(char *cfgn)
       +{
       +        char *prefix, *path;
       +
       +        if (cfgn == NULL)
       +                cfgn = "default";
       +
       +        prefix = expandhome(BASEPREFIX);
       +        path = smprintf(prefix, cfgn);
       +        free(prefix);
       +
       +        return path;
       +}
       +
        config_t *
       -config_init(void)
       +config_init(char *cfgn)
        {
                char *path;
                config_t *cfg;
        
       -        path = expandhome(CONFIGFILE);
       +        if (cfgn == NULL)
       +                cfgn = "default";
       +
       +        path = config_mkcfgpath(cfgn);
                cfg = config_read(path);
                free(path);
        
       -        if (cfg == NULL)
       -                return config_new();
       +        if (cfg == NULL) {
       +                if (!strcmp(cfgn, "default")) {
       +                        die("No default config is set and no cfg was given."
       +                                " Please use $(rpcfg -e cfg) to set the"
       +                                " default configuration.\n");
       +                }
       +
       +                cfg = config_new();
       +        }
       +
       +        cfg->name = memdup(cfgn, strlen(cfgn)+1);
        
                return cfg;
        }
        
        void
       +config_default(char *cfgn)
       +{
       +        char *defaultpath, *cfgpath;
       +
       +        cfgpath = config_mkbasepath(cfgn);
       +        defaultpath = config_mkbasepath("default");
       +
       +        if (symlink(cfgpath, defaultpath) < 0)
       +                edie("symlink");
       +
       +        free(cfgpath);
       +        free(defaultpath);
       +}
       +
       +void
        config_stop(config_t *cfg)
        {
                char *path;
        
                if (cfg->changed) {
       -                path = expandhome(CONFIGFILE);
       -                if (config_write(cfg, path) == NULL)
       +                path = config_mkcfgpath(cfg->name);
       +                if (config_write(cfg, NULL) == NULL)
                                edie("config_write");
                        free(path);
                }
       t@@ -67,21 +124,19 @@ config_getstr(config_t *cfg, char *key)
        {
                llistelem_t *selitem;
                char *rstr;
       -        config_t *ucfg;
        
                if (cfg == NULL)
       -                ucfg = config_init();
       -        else
       -                ucfg = cfg;
       +                return NULL;
        
       -        selitem = config_get(ucfg, key);
       -        if (selitem != NULL && selitem->data != NULL)
       +        selitem = config_get(cfg, key);
       +        if (selitem != NULL && selitem->data != NULL) {
                        rstr = memdup(selitem->data, selitem->datalen+1);
       -        else
       +        } else {
                        rstr = NULL;
       +        }
        
                if (cfg == NULL)
       -                config_free(ucfg);
       +                config_free(cfg);
        
                return rstr;
        }
       t@@ -101,23 +156,25 @@ config_checkgetstr(config_t *cfg, char *key)
        void
        configprintelem(llistelem_t *elem, int onlydata)
        {
       -        if (onlydata)
       +        if (onlydata) {
                        llistelem_printdata(elem);
       -        else
       +        } else {
                        llistelem_print(elem);
       +        }
        }
        
        void
        configusage(void)
        {
       -        die("usage: %s [-qhv] [-l|key [value]]|-d key|-s regex]\n", argv0);
       +        die("usage: %s [-bhqv] [-c cfg] [-e cfg|-l|key"
       +                        " [value]]|-d key|-s regex]\n", argv0);
        }
        
        int
        configmain(int argc, char *argv[])
        {
                int status;
       -        char *key, *value;
       +        char *key, *value, *cfgn, *def, *path;
                config_t *cfg;
                llist_t *results;
                llistelem_t *result, *elem;
       t@@ -127,17 +184,29 @@ configmain(int argc, char *argv[])
                        ONLYDATA = 0x02,
                        DOLIST = 0x04,
                        DODELETE = 0x08,
       -                DOSEARCH = 0x10
       +                DOSEARCH = 0x10,
       +                DOBASE = 0x20
                };
        
                status = 0;
                key = NULL;
                value = NULL;
       +        cfgn = NULL;
       +        def = NULL;
        
                ARGBEGIN {
       +        case 'c':
       +                cfgn = EARGF(configusage());
       +                break;
       +        case 'b':
       +                status |= DOBASE;
       +                break;
                case 'd':
                        status |= DODELETE;
                        break;
       +        case 'e':
       +                def = EARGF(configusage());
       +                break;
                case 'q':
                        status |= BEQUIET;
                        break;
       t@@ -150,12 +219,27 @@ configmain(int argc, char *argv[])
                case 's':
                        status |= DOSEARCH;
                        break;
       -        case 'h':
                default:
                        configusage();
                } ARGEND;
        
       -        cfg = config_init();
       +        if (def) {
       +                config_default(def);
       +                if (!(status & BEQUIET)) {
       +                        printf("Default configuration set to '%s'.\n",
       +                                        def);
       +                }
       +                return 0;
       +        }
       +
       +        if (status & DOBASE) {
       +                path = config_mkbasepath(cfgn);
       +                printf("%s\n", path);
       +                free(path);
       +                return 0;
       +        }
       +
       +        cfg = config_init(cfgn);
        
                if (status & DOLIST) {
                        forllist(cfg->values, elem)
       t@@ -167,8 +251,9 @@ configmain(int argc, char *argv[])
                        key = argv[0];
                        if (argc > 1)
                                value = argv[1];
       -        } else
       +        } else {
                        configusage();
       +        }
        
                if (value != NULL) {
                        result = config_set(cfg, key, value);
 (DIR) diff --git a/cfg.h b/cfg.h
       t@@ -9,6 +9,8 @@
        #include "llist.h"
        #include "txtdb.h"
        
       +/* For CONFIGFILE see ind.h */
       +
        #define config_t txtdb_t
        
        #define config_new txtdb_new
       t@@ -26,8 +28,11 @@ llistelem_t *config_checkget(config_t *cfg, char *key);
        char *config_getstr(config_t *cfg, char *key);
        char *config_checkgetstr(config_t *cfg, char *key);
        
       -config_t *config_init(void);
       +char *config_mkcfgpath(char *cfgn);
       +char *config_mkbasepath(char *cfgn);
       +config_t *config_init(char *cfgn);
        void config_stop(config_t *cfg);
       +void config_default(char *cfgn);
        
        int configmain(int argc, char *argv[]);
        
 (DIR) diff --git a/config.mk b/config.mk
       t@@ -13,7 +13,7 @@ INCS = -I. -I/usr/include
        LIBS = -L/usr/lib -lc -lssl -lcrypto -lz -ldl
        
        # flags
       -CPPFLAGS = -DVERSION=\"${VERSION}\" -D_XOPEN_SOURCE
       +CPPFLAGS = -DVERSION=\"${VERSION}\" -D_XOPEN_SOURCE=600
        CFLAGS = -g -std=gnu99 -pedantic -Wall -O0 ${INCS} ${CPPFLAGS}
        LDFLAGS = -g ${LIBS}
        #LDFLAGS = -s ${LIBS}
 (DIR) diff --git a/copy.c b/copy.c
       t@@ -22,13 +22,13 @@ char *argv0;
        void
        copyusage(void)
        {
       -        die("usage: %s [-hq] [-m folder] folder msgs\n", argv0);
       +        die("usage: %s [-hq] [-c cfg] [-m folder] folder msgs\n", argv0);
        }
        
        int
        movemain(int argc, char *argv[])
        {
       -        argv[0] = "m";
       +        argv[0] = "rpmv";
                return copymain(argc, argv);
        }
        
       t@@ -38,7 +38,7 @@ copymain(int argc, char *argv[])
                config_t *cfg;
                imap_t *imap;
                int status;
       -        char *user, *pass, *netspec, *selected, *folder;
       +        char *user, *pass, *netspec, *selected, *folder, *cfgn;
                llist_t *ids;
                inc_t *incs;
        
       t@@ -50,18 +50,22 @@ copymain(int argc, char *argv[])
                };
        
                selected = NULL;
       +        cfgn = NULL;
        
                status = 0;
       -        if (argc > 0 && argv[0][0] == 'm')
       +        if (argc > 0 && argv[0][2] == 'm')
                        status |= DOMOVE;
        
                ARGBEGIN {
       -        case 'q':
       -                status |= BEQUIET;
       +        case 'c':
       +                cfgn = EARGF(copyusage());
                        break;
                case 'm':
                        selected = EARGF(copyusage());
                        break;
       +        case 'q':
       +                status |= BEQUIET;
       +                break;
                case 'h':
                default:
                        copyusage();
       t@@ -73,7 +77,7 @@ copymain(int argc, char *argv[])
                argv++;
                argc--;
        
       -        cfg = config_init();
       +        cfg = config_init(cfgn);
                user = config_checkgetstr(cfg, "imapuser");
                pass = config_checkgetstr(cfg, "imappass");
                netspec = config_checkgetstr(cfg, "imapnet");
       t@@ -94,12 +98,12 @@ copymain(int argc, char *argv[])
                if (imap_select(imap, selected))
                        imap_die(imap, "imap_select");
        
       -        ids = imap_argv2ids(selected, argc, argv);
       +        ids = imap_argv2ids(cfgn, selected, argc, argv);
                if (ids == NULL)
                        die("No msgids selected. Aborting.\n");
                user = imap_ids2str(ids);
        
       -        incs = inc_init();
       +        incs = inc_init(cfgn);
                if (status & DOMOVE) {
                        if (imap_move(imap, ids, folder))
                                imap_die(imap, "imap_move");
 (DIR) diff --git a/cur.c b/cur.c
       t@@ -21,7 +21,7 @@ char *argv0;
        void
        curusage(void)
        {
       -        die("usage: %s [-h] [msgid]\n", argv0);
       +        die("usage: %s [-h] [-c cfg] [msgid]\n", argv0);
        }
        
        int
       t@@ -30,18 +30,23 @@ curmain(int argc, char *argv[])
                config_t *cfg;
                mark_t *marks;
                llistelem_t *curseq;
       -        char *msgss, *selected;
       +        char *msgss, *selected, *cfgn;
                int msgs, setn;
        
       +        cfgn = NULL;
       +
                ARGBEGIN {
       -        case 'h':
       +        case 'c':
       +                cfgn = EARGF(curusage());
       +                break;
                default:
                        curusage();
                } ARGEND;
        
       -        cfg = config_init();
       +        cfg = config_init(cfgn);
                marks = mark_cfg(cfg);
                config_free(cfg);
       +
                if (marks == NULL) {
                        fprintf(stderr, "Can not proceed without a selected "
                                        "mailbox.\n");
       t@@ -54,7 +59,7 @@ curmain(int argc, char *argv[])
                                setn = 1;
        
                        selected = config_checkgetstr(cfg, "selected");
       -                msgss = inc_getstr(selected, "messages");
       +                msgss = inc_getstr(cfgn, selected, "messages");
                        if (msgss != NULL) {
                                msgs = atoi(msgss);
                                if (msgs > 0 && setn > msgs)
 (DIR) diff --git a/flag.c b/flag.c
       t@@ -76,7 +76,7 @@ flagsyntax(void)
        void
        flagusage(void)
        {
       -        die("usage: %s [-fht] [-m folder] [[-s|-d] flag] [msgs]\n"
       +        die("usage: %s [-fht] [-c cfg] [-m folder] [[-s|-d] flag] [msgs]\n"
                        "Use -f for displaying the flag syntax.\n", argv0);
        }
        
       t@@ -86,7 +86,7 @@ flagmain(int argc, char *argv[])
                config_t *cfg;
                imap_t *imap;
                int status;
       -        char *user, *pass, *netspec, *selected;
       +        char *user, *pass, *netspec, *selected, *cfgn;
                llist_t *ids, *flagl, *flagrl, *flagel;
                llistelem_t *elem;
        
       t@@ -102,33 +102,37 @@ flagmain(int argc, char *argv[])
                status = 0;
                flagl = NULL;
                selected = NULL;
       +        cfgn = NULL;
        
                ARGBEGIN {
       -        case 'q':
       -                status |= BEQUIET;
       +        case 'c':
       +                cfgn = EARGF(flagusage());
                        break;
                case 'd':
                        status |= DODELETE;
                        break;
       -        case 's':
       -                status |= DOSET;
       -                break;
       -        case 't':
       -                status |= TABSEP;
       -                break;
                case 'f':
                        flagsyntax();
                        break;
                case 'm':
                        selected = EARGF(flagusage());
                        break;
       -        case 'h':
       +        case 'q':
       +                status |= BEQUIET;
       +                break;
       +        case 's':
       +                status |= DOSET;
       +                break;
       +        case 't':
       +                status |= TABSEP;
       +                break;
                default:
                        flagusage();
                } ARGEND;
        
                if (argc < 1)
                        flagusage();
       +
                if (status & DOSET || status & DODELETE) {
                        flagl = flag_sanitize(argv[0]);
                        if (flagl == NULL)
       t@@ -139,7 +143,7 @@ flagmain(int argc, char *argv[])
                if (argc < 1)
                        flagusage();
        
       -        cfg = config_init();
       +        cfg = config_init(cfgn);
                user = config_checkgetstr(cfg, "imapuser");
                pass = config_checkgetstr(cfg, "imappass");
                netspec = config_checkgetstr(cfg, "imapnet");
       t@@ -160,7 +164,7 @@ flagmain(int argc, char *argv[])
                if (imap_select(imap, selected))
                        imap_die(imap, "imap_select");
        
       -        ids = imap_argv2ids(selected, argc, argv);
       +        ids = imap_argv2ids(cfgn, selected, argc, argv);
                if (ids == NULL)
                        die("No msgids selected. Aborting.\n");
        
 (DIR) diff --git a/folder.c b/folder.c
       t@@ -19,8 +19,9 @@ char *argv0;
        void
        folderusage(void)
        {
       -        die("usage: %s [-qh] [-l [folder|searchterm]|-n folder|-d folder|"
       -                        "-s [folder]|-u folder|-r old new]\n", argv0);
       +        die("usage: %s [-qh] [-c cfg] [-l [folder|searchterm]|-n folder|"
       +                        "-d folder|-s [folder]|-u folder|-r old new]\n",
       +                        argv0);
        }
        
        int
       t@@ -29,7 +30,7 @@ foldermain(int argc, char *argv[])
                config_t *cfg;
                imap_t *imap;
                int status;
       -        char *user, *pass, *netspec;
       +        char *user, *pass, *netspec, *cfgn;
                llist_t *folders, *results;
                llistelem_t *elem;
        
       t@@ -46,19 +47,26 @@ foldermain(int argc, char *argv[])
                };
        
                status = 0;
       +        cfgn = NULL;
        
                ARGBEGIN {
       +        case 'c':
       +                cfgn = EARGF(folderusage());
       +                break;
                case 'd':
                        status |= DODELETE;
                        break;
       -        case 'q':
       -                status |= BEQUIET;
       +        case 'l':
       +                status |= DOLIST;
                        break;
                case 'n':
                        status |= DOCREATE;
                        break;
       -        case 'l':
       -                status |= DOLIST;
       +        case 'q':
       +                status |= BEQUIET;
       +                break;
       +        case 'r':
       +                status |= DORENAME;
                        break;
                case 's':
                        status |= DOSUBSCRIBE;
       t@@ -66,15 +74,11 @@ foldermain(int argc, char *argv[])
                case 'u':
                        status |= DOUNSUBSCRIBE;
                        break;
       -        case 'r':
       -                status |= DORENAME;
       -                break;
       -        case 'h':
                default:
                        folderusage();
                } ARGEND;
        
       -        cfg = config_init();
       +        cfg = config_init(cfgn);
                user = (config_checkget(cfg, "imapuser"))->data;
                pass = (config_checkget(cfg, "imappass"))->data;
                netspec = (config_checkget(cfg, "imapnet"))->data;
 (DIR) diff --git a/ids.c b/ids.c
       t@@ -24,23 +24,26 @@ char *argv0;
        void
        idsusage(void)
        {
       -        die("usage: %s [-h] [-m folder] msgs\n", argv0);
       +        die("usage: %s [-h] [-c cfg] [-m folder] msgs\n", argv0);
        }
        
        int
        idsmain(int argc, char *argv[])
        {
                config_t *cfg;
       -        char *selected, *idss;
       +        char *selected, *idss, *cfgn;
                llist_t *ids;
        
                selected = NULL;
       +        cfgn = NULL;
        
                ARGBEGIN {
       +        case 'c':
       +                cfgn = EARGF(idsusage());
       +                break;
                case 'm':
                        selected = EARGF(idsusage());
                        break;
       -        case 'h':
                default:
                        idsusage();
                } ARGEND;
       t@@ -48,7 +51,7 @@ idsmain(int argc, char *argv[])
                if (argc < 1)
                        idsusage();
        
       -        cfg = config_init();
       +        cfg = config_init(cfgn);
                if (selected == NULL) {
                        selected = config_checkgetstr(cfg, "selected");
                } else {
       t@@ -56,7 +59,7 @@ idsmain(int argc, char *argv[])
                }
                config_free(cfg);
        
       -        ids = imap_argv2ids(selected, argc, argv);
       +        ids = imap_argv2ids(cfgn, selected, argc, argv);
                if (ids == NULL)
                        die("No msgsids selected. Aborting.\n");
        
 (DIR) diff --git a/imap.c b/imap.c
       t@@ -75,7 +75,7 @@ imap_die(imap_t *imap, char *fmt, ...)
        }
        
        llist_t *
       -imap_llist2ids(char *mailbox, llist_t *elems)
       +imap_llist2ids(char *cfgn, char *mailbox, llist_t *elems)
        {
                llist_t *ids, *result, *ret;
                llistelem_t *elem;
       t@@ -86,13 +86,13 @@ imap_llist2ids(char *mailbox, llist_t *elems)
                ret = NULL;
                first = 1;
        
       -        rstr = inc_getstr(mailbox, "messages");
       +        rstr = inc_getstr(cfgn, mailbox, "messages");
                if (rstr == NULL)
                        return NULL;
                last = atoi(rstr);
                free(rstr);
        
       -        marks = mark_init(mailbox);
       +        marks = mark_init(cfgn, mailbox);
                if (marks == NULL)
                        return NULL;
        
       t@@ -204,21 +204,21 @@ badmarkending:
        }
        
        llist_t *
       -imap_str2ids(char *mailbox, char *str)
       +imap_str2ids(char *cfgn, char *mailbox, char *str)
        {
                llist_t *ids, *ssplit;
        
                ssplit = llist_splitstr(str, " ,");
                if (ssplit == NULL)
                        return NULL;
       -        ids = imap_llist2ids(mailbox, ssplit);
       +        ids = imap_llist2ids(cfgn, mailbox, ssplit);
                llist_free(ssplit);
        
                return ids;
        }
        
        llist_t *
       -imap_argv2ids(char *mailbox, int argc, char *argv[])
       +imap_argv2ids(char *cfgn, char *mailbox, int argc, char *argv[])
        {
                llist_t *allist, *llist, *ids, *nids;
                llistelem_t *argelem;
       t@@ -236,7 +236,7 @@ imap_argv2ids(char *mailbox, int argc, char *argv[])
                }
                llist_free(allist);
        
       -        ids = imap_llist2ids(mailbox, llist);
       +        ids = imap_llist2ids(cfgn, mailbox, llist);
                llist_free(llist);
        
                return ids;
       t@@ -268,19 +268,21 @@ imap_ids2str(llist_t *ids)
                        if (ida[i] == nb + nc)
                                continue;
        
       -                if (nc > 0)
       +                if (nc > 0) {
                                el = smprintf("%d:%d", nb, nb+nc);
       -                else
       +                } else {
                                el = smprintf("%d", nb);
       +                }
                        llist_addraw(seqs, el, NULL, 0);
                        nb = ida[i];
                        nc = 0;
                }
        
       -        if (nc > 0)
       +        if (nc > 0) {
                        el = smprintf("%d:%d", nb, nb+nc);
       -        else
       +        } else {
                        el = smprintf("%d", nb);
       +        }
                free(ida);
                llist_addraw(seqs, el, NULL, 0);
        
 (DIR) diff --git a/imap.h b/imap.h
       t@@ -32,9 +32,9 @@ void imap_free(imap_t *imap);
        
        void imap_die(imap_t *imap, char *fmt, ...);
        
       -llist_t *imap_llist2ids(char *mailbox, llist_t *ids);
       -llist_t *imap_str2ids(char *mailbox, char *str);
       -llist_t *imap_argv2ids(char *mailbox, int argc, char *argv[]);
       +llist_t *imap_llist2ids(char *cfgn, char *mailbox, llist_t *ids);
       +llist_t *imap_str2ids(char *cfgn, char *mailbox, char *str);
       +llist_t *imap_argv2ids(char *cfgn, char *mailbox, int argc, char *argv[]);
        char *imap_ids2str(llist_t *ids);
        
        void imap_cmd(imap_t *imap, char *cmd, ...);
 (DIR) diff --git a/inc.c b/inc.c
       t@@ -22,23 +22,40 @@
        char *argv0;
        
        char *
       -inc_mkincfile(void)
       +inc_mkincfile(char *cfgn)
        {
       -        return expandhome(INCFILE);
       +        char *prefix, *path;
       +
       +        prefix = expandhome(INCFILE);
       +        path = smprintf(prefix, cfgn);
       +        free(prefix);
       +
       +        return path;
        }
        
        inc_t *
       -inc_init(void)
       +inc_init(char *cfgn)
        {
                inc_t *incs;
                char *path;
        
       -        path = inc_mkincfile();
       +        if (cfgn == NULL)
       +                cfgn = "default";
       +
       +        path = inc_mkincfile(cfgn);
                incs = inc_read(path);
                free(path);
        
       -        if (incs == NULL)
       +        if (incs == NULL) {
       +                if (!strcmp(cfgn, "default")) {
       +                        die("No default config is set and no cfg was given."
       +                                " Please use $(rpcfg -e cfg) to set the"
       +                                " default configuration.\n");
       +                }
                        incs = inc_new();
       +        }
       +
       +        incs->name = memdup(cfgn, strlen(cfgn)+1);
        
                return incs;
        }
       t@@ -49,7 +66,7 @@ inc_stop(inc_t *incs)
                char *path;
        
                if (incs->changed) {
       -                path = inc_mkincfile();
       +                path = inc_mkincfile(incs->name);
                        if (inc_write(incs, path) == NULL)
                                edie("inc_write");
                        free(path);
       t@@ -103,12 +120,12 @@ inc_getstatuselem(inc_t *incs, char *mailbox, char *elem)
        }
        
        char *
       -inc_getstr(char *mailbox, char *elem)
       +inc_getstr(char *cfgn, char *mailbox, char *elem)
        {
                inc_t *incs;
                char *ret;
        
       -        incs = inc_init();
       +        incs = inc_init(cfgn);
                if (incs == NULL)
                        return NULL;
                ret = inc_getstatuselem(incs, mailbox, elem);
       t@@ -168,15 +185,15 @@ inc_updatefolder(imap_t *imap, char *folder, inc_t *gincs)
        }
        
        void
       -inc_mkunseen(imap_t *imap, char *folder)
       +inc_mkunseen(imap_t *imap, char *cfgn, char *folder)
        {
                llist_t *results;
                mark_t *marks;
                char *str;
        
       -        marks = mark_init(folder);
       +        marks = mark_init(cfgn, folder);
                if (marks == NULL)
       -                die("Could not initialize marks for %s.\n", folder);
       +                die("Could not initialize marks for '%s'.\n", folder);
        
                if (imap_select(imap, folder))
                        imap_die(imap, "imap_select");
       t@@ -201,7 +218,7 @@ inc_print(char *folder, char *msgs, char *unseen, char *recent)
        void
        incusage(void)
        {
       -        die("usage: %s [-auqnh] [[-r|] folder]\n", argv0);
       +        die("usage: %s [-auqnh] [-c cfg] [[-r|] folder]\n", argv0);
        }
        
        int
       t@@ -211,7 +228,7 @@ incmain(int argc, char *argv[])
                imap_t *imap;
                inc_t *incs;
                int status;
       -        char *user, *pass, *netspec, *msgs, *recent, *unseen, *ncmd;
       +        char *user, *pass, *netspec, *msgs, *recent, *unseen, *ncmd, *cfgn;
                llist_t *folders, *ffolders;
                llistelem_t *folder;
        
       t@@ -226,11 +243,15 @@ incmain(int argc, char *argv[])
                };
        
                status = 0;
       +        cfgn = NULL;
        
                ARGBEGIN {
                case 'a':
                        status |= SHOWALL;
                        break;
       +        case 'c':
       +                cfgn = EARGF(incusage());
       +                break;
                case 'n':
                        status |= RUNNOTIFY;
                        break;
       t@@ -243,13 +264,11 @@ incmain(int argc, char *argv[])
                case 'u':
                        status |= GENUNSEEN;
                        break;
       -        case 'h':
                default:
                        incusage();
                } ARGEND;
        
       -        cfg = config_init();
       -
       +        cfg = config_init(cfgn);
                user = config_checkgetstr(cfg, "imapuser");
                pass = config_checkgetstr(cfg, "imappass");
                netspec = config_checkgetstr(cfg, "imapnet");
       t@@ -292,7 +311,7 @@ incmain(int argc, char *argv[])
        
                if (!(status & BEQUIET))
                        inc_print("Folder", "Msgs", "Unseen", "Recent");
       -        incs = inc_init();
       +        incs = inc_init(cfgn);
                forllist(ffolders, folder) {
                        if (folder->key == NULL)
                                continue;
       t@@ -310,7 +329,7 @@ incmain(int argc, char *argv[])
                                        inc_print(folder->key, msgs, unseen, recent);
        
                                if (status & GENUNSEEN)
       -                                inc_mkunseen(imap, folder->key);
       +                                inc_mkunseen(imap, cfgn, folder->key);
                                if (status & RUNNOTIFY && ncmd) {
                                        runcmd(ncmd, NULL, NULL, NULL, 0);
                                        wait(NULL);
 (DIR) diff --git a/inc.h b/inc.h
       t@@ -24,17 +24,17 @@
        #define inc_read txtdb_read
        #define inc_write txtdb_write
        
       -char *inc_mkincfile(void);
       -inc_t *inc_init(void);
       +char *inc_mkincfile(char *cfgn);
       +inc_t *inc_init(char *cfgn);
        void inc_stop(inc_t *incs);
        llist_t *inc_getstatus(inc_t *incs, char *mailbox);
        char *inc_getstatuselem(inc_t *incs, char *mailbox, char *elem);
       -char *inc_getstr(char *mailbox, char *elem);
       +char *inc_getstr(char *cfgn, char *mailbox, char *elem);
        void inc_setstatus(inc_t *incs, char *mailbox, char *msgs, char *unseen,
                        char *recent);
        int inc_updatefolder(imap_t *imap, char *folder, inc_t *gincs);
        
       -void inc_mkunseen(imap_t *imap, char *folder);
       +void inc_mkunseen(imap_t *imap, char *cfgn, char *folder);
        
        int incmain(int argc, char *argv[]);
        
 (DIR) diff --git a/ind.h b/ind.h
       t@@ -13,9 +13,12 @@
        #include <time.h>
        
        #define MAXLINESIZE 1048576
       -#define CONFIGFILE "~/.rohrpost/config"
       -#define MARKPREFIX "~/.rohrpost/marks/"
       -#define INCFILE "~/.rohrpost/status"
       +
       +#define RPPREFIX "~/.rohrpost/"
       +#define BASEPREFIX RPPREFIX "%s"
       +#define CONFIGFILE BASEPREFIX "/config"
       +#define MARKPREFIX BASEPREFIX "/marks/%s"
       +#define INCFILE BASEPREFIX "/status"
        
        void die(char *fmt, ...);
        void edie(char *fmt, ...);
 (DIR) diff --git a/mark.c b/mark.c
       t@@ -22,31 +22,42 @@
        char *argv0;
        
        char *
       -mark_mkmarkfile(char *mailbox)
       +mark_mkmarkfile(char *cfgn, char *mailbox)
        {
                char *prefix, *path;
        
                prefix = expandhome(MARKPREFIX);
       -        path = smprintf("%s%s", prefix, mailbox);
       +        path = smprintf(prefix, cfgn, mailbox);
                free(prefix);
        
                return path;
        }
        
        mark_t *
       -mark_init(char *mailbox)
       +mark_init(char *cfgn, char *mailbox)
        {
                char *path;
                mark_t *marks;
        
       -        path = mark_mkmarkfile(mailbox);
       +        if (cfgn == NULL)
       +                cfgn = "default";
       +
       +        path = mark_mkmarkfile(cfgn, mailbox);
                marks = mark_read(path);
                free(path);
        
       -        if (marks == NULL)
       +        if (marks == NULL) {
       +                if (!strcmp(cfgn, "default")) {
       +                        die("No default config is set and no cfg was given."
       +                                " Please use $(rpcfg -e cfg) to set the"
       +                                " default configuration.\n");
       +                }
       +
                        marks = mark_new();
       +        }
        
                marks->data = memdup(mailbox, strlen(mailbox)+1);
       +        marks->name = memdup(cfgn, strlen(cfgn)+1);
        
                return marks;
        }
       t@@ -68,7 +79,7 @@ mark_cfg(config_t *cfg)
                selected = config_getstr(cfg, "selected");
                if (selected == NULL)
                        return NULL;
       -        marks = mark_init(selected);
       +        marks = mark_init(cfg->name, selected);
                free(selected);
        
                return marks;
       t@@ -80,7 +91,7 @@ mark_stop(mark_t *marks)
                char *path;
        
                if (marks->changed) {
       -                path = mark_mkmarkfile((char *)marks->data);
       +                path = mark_mkmarkfile(marks->name, (char *)marks->data);
                        if (mark_write(marks, path) == NULL)
                                edie("mark_write");
                        free(path);
       t@@ -330,7 +341,7 @@ mark_printelem(llistelem_t *elem, int onlyname, int onlyvalue)
        void
        markusage(void)
        {
       -        die("usage: %s [-hnqv] [-m folder] [-l|sequence [value ...]]"
       +        die("usage: %s [-hnqv] [-c cfg] [-m folder] [-l|sequence [value ...]]"
                                "|-d sequence|"
                                "-s regex|-a sequence value ...|-r sequence"
                                " value ...]\n", argv0);
       t@@ -340,7 +351,7 @@ int
        markmain(int argc, char *argv[])
        {
                int status;
       -        char *seqname, *str, *selected;
       +        char *seqname, *str, *selected, *cfgn;
                config_t *cfg;
                mark_t *marks;
                llist_t *results, *values, *sequence;
       t@@ -364,11 +375,15 @@ markmain(int argc, char *argv[])
                seqname = NULL;
                values = NULL;
                selected = NULL;
       +        cfgn = NULL;
        
                ARGBEGIN {
                case 'a':
                        status |= DOADD;
                        break;
       +        case 'c':
       +                cfgn = EARGF(markusage());
       +                break;
                case 'd':
                        status |= DODELETE;
                        break;
       t@@ -399,7 +414,7 @@ markmain(int argc, char *argv[])
                } ARGEND;
        
                if (selected == NULL) {
       -                cfg = config_init();
       +                cfg = config_init(cfgn);
                        selected = config_getstr(cfg, "selected");
                        if (selected == NULL)
                                die("Cannot proceed without any selected mailbox.\n");
       t@@ -407,7 +422,7 @@ markmain(int argc, char *argv[])
                } else {
                        selected = memdup(selected, strlen(selected)+1);
                }
       -        marks = mark_init(selected);
       +        marks = mark_init(cfgn, selected);
        
                if (status & DOLIST) {
                        if (marks->values->len > 0) {
       t@@ -503,7 +518,7 @@ markmain(int argc, char *argv[])
                        markusage();
                }
        
       -        values = imap_argv2ids(selected, argc, argv);
       +        values = imap_argv2ids(cfgn, selected, argc, argv);
                free(selected);
        
                if (status & DOREMOVE) {
 (DIR) diff --git a/mark.h b/mark.h
       t@@ -20,8 +20,8 @@
        #define mark_read txtdb_read
        #define mark_write txtdb_write
        
       -char *mark_mkmarkfile(char *mailbox);
       -mark_t *mark_init(char *mailbox);
       +char *mark_mkmarkfile(char *cfgn, char *mailbox);
       +mark_t *mark_init(char *cfgn, char *mailbox);
        void mark_free(mark_t *marks);
        mark_t *mark_cfg(config_t *cfg);
        void mark_stop(mark_t *marks);
 (DIR) diff --git a/part.c b/part.c
       t@@ -116,8 +116,8 @@ part_write(char *id, mime_t *mime, llist_t *partl, char *type,
        void
        partusage(void)
        {
       -        die("usage: %s [-hq] [-m folder] [-s|-g|-f filename] "
       -                        "[-c type|-p part|-a|-l]"
       +        die("usage: %s [-hq] [-c cfg] [-m folder] [-s|-g|-f filename] "
       +                        "[-t type|-p part|-a|-l]"
                                " [msgs]\n", argv0);
        }
        
       t@@ -128,7 +128,7 @@ partmain(int argc, char *argv[])
                imap_t *imap;
                int status, filelen, retc;
                char *user, *pass, *netspec, *selected, *filename, *type,
       -             *parts, *filec;
       +             *parts, *filec, *cfgn;
                llist_t *ids, *msgs, *partl;
                llistelem_t *elem, *msg, *ide;
                mime_t *mime;
       t@@ -149,13 +149,14 @@ partmain(int argc, char *argv[])
                parts = NULL;
                type = NULL;
                selected = NULL;
       +        cfgn = NULL;
        
                ARGBEGIN {
                case 'a':
                        status |= ALLPARTS;
                        break;
                case 'c':
       -                type = EARGF(partusage());
       +                cfgn = EARGF(partusage());
                        break;
                case 'f':
                        filename = EARGF(partusage());
       t@@ -178,6 +179,9 @@ partmain(int argc, char *argv[])
                case 's':
                        status |= TOSTDOUT;
                        break;
       +        case 't':
       +                type = EARGF(partusage());
       +                break;
                case 'h':
                default:
                        partusage();
       t@@ -231,7 +235,7 @@ partmain(int argc, char *argv[])
                        return retc;
                }
        
       -        cfg = config_init();
       +        cfg = config_init(cfgn);
                user = config_checkgetstr(cfg, "imapuser");
                pass = config_checkgetstr(cfg, "imappass");
                netspec = config_checkgetstr(cfg, "imapnet");
       t@@ -247,7 +251,7 @@ partmain(int argc, char *argv[])
                free(pass);
                free(netspec);
        
       -        ids = imap_argv2ids(selected, argc, argv);
       +        ids = imap_argv2ids(cfgn, selected, argc, argv);
                if (ids == NULL)
                        die("No msgsids selected. Aborting.\n");
        
 (DIR) diff --git a/pick.c b/pick.c
       t@@ -312,7 +312,7 @@ pick_printsyntax(void)
        void
        pickusage(void)
        {
       -        die("usage: %s [-sqdht] [-m folder] [-o sort criteria]"
       +        die("usage: %s [-sqdht] [-c cfg] [-m folder] [-o sort criteria]"
                                " [-e seq] [search syntax]\n"
                                "See -s for syntax help.\n", argv0);
        }
       t@@ -324,7 +324,7 @@ pickmain(int argc, char *argv[])
                imap_t *imap;
                int status;
                char *user, *pass, *netspec, *addseq, *sstr, *pstr, *selected,
       -             *sorts, *talg;
       +             *sorts, *talg, *cfgn;
                llist_t *results, *sortl;
                mark_t *marks;
        
       t@@ -341,8 +341,12 @@ pickmain(int argc, char *argv[])
                addseq = "pseq";
                sorts = NULL;
                selected = NULL;
       +        cfgn = NULL;
        
                ARGBEGIN {
       +        case 'c':
       +                cfgn = EARGF(pickusage());
       +                break;
                case 'd':
                        status |= DRYRUN;
                        break;
       t@@ -364,7 +368,6 @@ pickmain(int argc, char *argv[])
                case 't':
                        status |= DOTHREAD;
                        break;
       -        case 'h':
                default:
                        pickusage();
                } ARGEND;
       t@@ -377,7 +380,7 @@ pickmain(int argc, char *argv[])
                if (argc < 1)
                        pickusage();
        
       -        cfg = config_init();
       +        cfg = config_init(cfgn);
                user = (config_checkget(cfg, "imapuser"))->data;
                pass = (config_checkget(cfg, "imappass"))->data;
                netspec = (config_checkget(cfg, "imapnet"))->data;
       t@@ -386,7 +389,8 @@ pickmain(int argc, char *argv[])
                } else {
                        selected = memdup(selected, strlen(selected)+1);
                }
       -        marks = mark_init(selected);
       +
       +        marks = mark_init(cfg->name, selected);
                if (marks == NULL)
                        die("Could not initialize marks for %s.\n", addseq);
        
 (DIR) diff --git a/remove.c b/remove.c
       t@@ -21,7 +21,7 @@ char *argv0;
        void
        removeusage(void)
        {
       -        die("usage: %s [-hqde] [-m folder] msgs\n", argv0);
       +        die("usage: %s [-hqde] [-c cfg] [-m folder] msgs\n", argv0);
        }
        
        int
       t@@ -30,7 +30,7 @@ removemain(int argc, char *argv[])
                config_t *cfg;
                imap_t *imap;
                int status;
       -        char *user, *pass, *netspec, *selected, *dispose, *dodispose;
       +        char *user, *pass, *netspec, *selected, *dispose, *dodispose, *cfgn;
                llist_t *ids;
        
                enum {
       t@@ -43,10 +43,11 @@ removemain(int argc, char *argv[])
        
                status = 0;
                selected = NULL;
       +        cfgn = NULL;
        
                ARGBEGIN {
       -        case 'q':
       -                status |= BEQUIET;
       +        case 'c':
       +                cfgn = EARGF(removeusage());
                        break;
                case 'd':
                        status |= DODISPOSE;
       t@@ -57,7 +58,9 @@ removemain(int argc, char *argv[])
                case 'm':
                        selected = EARGF(removeusage());
                        break;
       -        case 'h':
       +        case 'q':
       +                status |= BEQUIET;
       +                break;
                default:
                        removeusage();
                } ARGEND;
       t@@ -65,7 +68,7 @@ removemain(int argc, char *argv[])
                if (argc < 1 && !(status & DOEXPUNGE))
                        removeusage();
        
       -        cfg = config_init();
       +        cfg = config_init(cfgn);
                user = config_checkgetstr(cfg, "imapuser");
                pass = config_checkgetstr(cfg, "imappass");
                netspec = config_checkgetstr(cfg, "imapnet");
       t@@ -94,7 +97,7 @@ removemain(int argc, char *argv[])
                        if (!(status & BEQUIET))
                                printf("Ran expunge.\n");
                } else {
       -                ids = imap_argv2ids(selected, argc, argv);
       +                ids = imap_argv2ids(cfgn, selected, argc, argv);
                        user = imap_ids2str(ids);
                        if (status & DODISPOSE || (dodispose && dodispose[0] == '1')) {
                                if (dispose == NULL) {
 (DIR) diff --git a/scan.c b/scan.c
       t@@ -30,7 +30,7 @@ scan_print(char *id, char *date, char *from, char *subject)
        void
        scanusage(void)
        {
       -        die("usage: %s [-h] [-m folder] msgs\n", argv0);
       +        die("usage: %s [-h] [-c cfg] [-m folder] msgs\n", argv0);
        }
        
        int
       t@@ -40,19 +40,22 @@ scanmain(int argc, char *argv[])
                imap_t *imap;
                int filelen;
                char *user, *pass, *netspec, *selected, *date, *subject, *from,
       -             *id, *filec;
       +             *id, *filec, *cfgn;
                llist_t *ids, *msgs;
                llistelem_t *elem, *msg, *datee, *subjecte, *frome, *ide;
                mime_t *mime;
                struct tm *tim;
        
                selected = NULL;
       +        cfgn = NULL;
        
                ARGBEGIN {
       +        case 'c':
       +                cfgn = EARGF(scanusage());
       +                break;
                case 'm':
                        selected = EARGF(scanusage());
                        break;
       -        case 'h':
                default:
                        scanusage();
                } ARGEND;
       t@@ -66,7 +69,7 @@ scanmain(int argc, char *argv[])
                        filec = NULL;
                }
        
       -        cfg = config_init();
       +        cfg = config_init(cfgn);
                if (filec == NULL) {
                        user = config_checkgetstr(cfg, "imapuser");
                        pass = config_checkgetstr(cfg, "imappass");
       t@@ -139,7 +142,7 @@ scanmain(int argc, char *argv[])
                if (imap_select(imap, selected))
                        imap_die(imap, "imap_select");
        
       -        ids = imap_argv2ids(selected, argc, argv);
       +        ids = imap_argv2ids(cfgn, selected, argc, argv);
                if (ids == NULL)
                        die("No msgids selected. Aborting.\n");
        
 (DIR) diff --git a/select.c b/select.c
       t@@ -19,7 +19,7 @@ char *argv0;
        void
        selectusage(void)
        {
       -        die("usage: %s [-h] [mailbox]\n", argv0);
       +        die("usage: %s [-h] [-c cfg] [mailbox]\n", argv0);
        }
        
        int
       t@@ -27,15 +27,19 @@ selectmain(int argc, char *argv[])
        {
                config_t *cfg;
                llistelem_t *result;
       +        char *cfgn;
       +
       +        cfgn = NULL;
        
                ARGBEGIN {
       -        case 'h':
       -                selectusage();
       +        case 'c':
       +                cfgn = EARGF(selectusage());
       +                break;
                default:
                        selectusage();
                } ARGEND;
        
       -        cfg = config_init();
       +        cfg = config_init(cfgn);
        
                if (argc > 0) {
                        config_set(cfg, "selected", argv[0]);
 (DIR) diff --git a/sieve.c b/sieve.c
       t@@ -413,8 +413,8 @@ sieve_init(sieve_t *sieve)
        void
        sieveusage(void)
        {
       -        die("usage: %s [-h] [-b|-l|-d|-v script|-p script [file]|"
       -                        "-g script [file]|-e script|-c [file]|-a script|"
       +        die("usage: %s [-h] [-c cfg] [-b|-l|-d|-v script|-p script [file]|"
       +                        "-g script [file]|-e script|-t [file]|-a script|"
                                "-s script [name [space]]|-r old new]\n", argv0);
        }
        
       t@@ -422,7 +422,7 @@ int
        sievemain(int argc, char *argv[])
        {
                int status, len;
       -        char *script, *file, *netspec, *user, *pass, *data;
       +        char *script, *file, *netspec, *user, *pass, *data, *cfgn;
                config_t *cfg;
                llistelem_t *elem;
                llist_t *results;
       t@@ -446,6 +446,7 @@ sievemain(int argc, char *argv[])
                script = NULL;
                file = NULL;
                results = NULL;
       +        cfgn = NULL;
        
                ARGBEGIN {
                case 'a':
       t@@ -455,7 +456,7 @@ sievemain(int argc, char *argv[])
                        status |= DOSHOWCAPABILITIES;
                        break;
                case 'c':
       -                status |= DOCHECK;
       +                cfgn = EARGF(sieveusage());
                        break;
                case 'd':
                        status |= DODELETE;
       t@@ -478,6 +479,9 @@ sievemain(int argc, char *argv[])
                case 's':
                        status |= DOHAVESPACE;
                        break;
       +        case 't':
       +                status |= DOCHECK;
       +                break;
                case 'v':
                        status |= DODEACTIVATE;
                        break;
       t@@ -488,7 +492,7 @@ sievemain(int argc, char *argv[])
                if (!status)
                        sieveusage();
        
       -        cfg = config_init();
       +        cfg = config_init(cfgn);
                netspec = (config_checkget(cfg, "sievenet"))->data;
                user = (config_checkget(cfg, "sieveuser"))->data;
                pass = (config_checkget(cfg, "sievepass"))->data;
 (DIR) diff --git a/stats.c b/stats.c
       t@@ -20,7 +20,7 @@ char *argv0;
        void
        statsusage(void)
        {
       -        die("usage: %s [-haru] [-m folder]\n", argv0);
       +        die("usage: %s [-haru] [-c cfg] [-m folder]\n", argv0);
        }
        
        int
       t@@ -29,7 +29,8 @@ statsmain(int argc, char *argv[])
                config_t *cfg;
                imap_t *imap;
                int cmsgs, crecent, cunseen, cfolders, domsgs, dorecent, dounseen;
       -        char *user, *pass, *netspec, *msgs, *recent, *unseen, *selected;
       +        char *user, *pass, *netspec, *msgs, *recent, *unseen, *selected,
       +             *cfgn;
                llist_t *folders, *ffolders, *statusl;
                llistelem_t *folder, *elem;
        
       t@@ -37,11 +38,15 @@ statsmain(int argc, char *argv[])
                dorecent = 0;
                dounseen = 0;
                selected = NULL;
       +        cfgn = NULL;
        
                ARGBEGIN {
                case 'a':
                        domsgs = 1;
                        break;
       +        case 'c':
       +                cfgn = EARGF(statsusage());
       +                break;
                case 'm':
                        selected = EARGF(statsusage());
                        break;
       t@@ -51,12 +56,11 @@ statsmain(int argc, char *argv[])
                case 'u':
                        dounseen = 1;
                        break;
       -        case 'h':
                default:
                        statsusage();
                } ARGEND;
        
       -        cfg = config_init();
       +        cfg = config_init(cfgn);
                user = (config_checkget(cfg, "imapuser"))->data;
                pass = (config_checkget(cfg, "imappass"))->data;
                netspec = (config_checkget(cfg, "imapnet"))->data;
 (DIR) diff --git a/txtdb.c b/txtdb.c
       t@@ -32,6 +32,10 @@ void
        txtdb_free(txtdb_t *txtdb)
        {
                llist_free(txtdb->values);
       +        if (txtdb->path != NULL)
       +                free(txtdb->path);
       +        if (txtdb->name != NULL)
       +                free(txtdb->name);
                free(txtdb);
        }
        
       t@@ -133,6 +137,9 @@ txtdb_read(char *file)
                        txtdb_free(txtdb);
                        return NULL;
                }
       +
       +        txtdb->path = memdup(file, strlen(file)+1);
       +
                return txtdb;
        }
        
       t@@ -142,6 +149,14 @@ txtdb_write(txtdb_t *txtdb, char *file)
                FILE *fp;
                llistelem_t *elem;
        
       +        if (file == NULL) {
       +                if (txtdb->path != NULL) {
       +                        file = txtdb->path;
       +                } else {
       +                        return NULL;
       +                }
       +        }
       +
                fp = fopen(file, "w+");
                if (fp == NULL)
                        return NULL;
 (DIR) diff --git a/txtdb.h b/txtdb.h
       t@@ -14,6 +14,9 @@ struct txtdb_t {
        
                int changed;
                void *data;
       +
       +        char *path;
       +        char *name;
        };
        
        txtdb_t *txtdb_new(void);
 (DIR) diff --git a/view.c b/view.c
       t@@ -261,8 +261,8 @@ view_print(char *id, mime_t *mime, llist_t *dhdrs, llist_t *partl,
        void
        viewusage(void)
        {
       -        die("usage: %s [-hbdnrv] [-e headers] [-m folder] [-p parts] msgs\n",
       -                        argv0);
       +        die("usage: %s [-hbdnrv] [-c cfg] [-e headers] [-m folder]"
       +                        " [-p parts] msgs\n", argv0);
        }
        
        int
       t@@ -272,7 +272,7 @@ viewmain(int argc, char *argv[])
                imap_t *imap;
                int status, filelen, printopts, dodebug;
                char *user, *pass, *netspec, *selected, *mfilter, *parts, *filec,
       -             *headers;
       +             *headers, *cfgn;
                llist_t *ids, *msgs, *dhdrs, *partl;
                llistelem_t *elem, *msg, *ide;
                mime_t *mime;
       t@@ -292,11 +292,15 @@ viewmain(int argc, char *argv[])
                headers = NULL;
                printopts = 0;
                dodebug = 0;
       +        cfgn = NULL;
        
                ARGBEGIN {
                case 'b':
                        printopts |= PRINT_BODY;
                        break;
       +        case 'c':
       +                cfgn = EARGF(viewusage());
       +                break;
                case 'd':
                        dodebug = 1;
                        break;
       t@@ -318,7 +322,6 @@ viewmain(int argc, char *argv[])
                case 'v':
                        printopts |= PRINT_VALUE;
                        break;
       -        case 'h':
                default:
                        viewusage();
                } ARGEND;
       t@@ -332,7 +335,7 @@ viewmain(int argc, char *argv[])
                        filec = NULL;
                }
        
       -        cfg = config_init();
       +        cfg = config_init(cfgn);
                if (filec == NULL) {
                        user = config_checkgetstr(cfg, "imapuser");
                        pass = config_checkgetstr(cfg, "imappass");
       t@@ -381,7 +384,7 @@ viewmain(int argc, char *argv[])
                        goto viewcleanup;
                }
        
       -        ids = imap_argv2ids(selected, argc, argv);
       +        ids = imap_argv2ids(cfgn, selected, argc, argv);
                if (ids == NULL)
                        die("No msgids selected. Aborting.\n");
        
       t@@ -421,7 +424,7 @@ viewmain(int argc, char *argv[])
                        mime_free(mime);
                }
                if (ids->last != NULL) {
       -                marks = mark_init(selected);
       +                marks = mark_init(cfgn, selected);
                        mark_set(marks, "cur", ids->last->key);
                        mark_stop(marks);
                }