pledge test mode, no need to reopen goodlist and spamlist for each message in test mode - bmf - bmf (Bayesian Mail Filter) 0.9.4 fork + patches
 (HTM) git clone git://git.codemadness.org/bmf
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit 41e1e6b8e9d49a1300c070f03070db4ce2d0bbbd
 (DIR) parent bd5dd52e982fcb2c07eddb303e585a6e9b738508
 (HTM) Author: Hiltjo Posthuma <hiltjo@codemadness.org>
       Date:   Sat, 22 Sep 2018 18:49:54 +0200
       
       pledge test mode, no need to reopen goodlist and spamlist for each message in test mode
       
       Diffstat:
         M TODO                                |       7 +++++++
         M bmf.c                               |      61 +++++++++++++++++++++++--------
       
       2 files changed, 52 insertions(+), 16 deletions(-)
       ---
 (DIR) diff --git a/TODO b/TODO
       @@ -1,3 +1,10 @@
       +? optimize: reduce loading/writing of goodlist, spamlist table?
       +
       +- optimize: preload goodlist spamlist somehow.
       +- in test mode (-t) reduce privileges (only stdio).
       +
       +===
       +
        * Make extrema size configurable, and default to ~5% of tokens.
        * Teach lexer about multiline MIME headers and case (in)sensitivity.
        * Teach lexer about MIME quoted-printable and base64 encodings.
 (DIR) diff --git a/bmf.c b/bmf.c
       @@ -180,30 +180,50 @@ int main( int argc, char** argv )
                exit( 2 );
            }
        
       -    while( tok.tt != eof )
       -    {
       -        if( mboxtype == mbox && tok.tt != from )
       -        {
       -            fprintf( stderr, "%s: input does not look like an mbox message\n", argv[0] );
       -            exit( 2 );
       -        }
       -
       -        rdonly = (mode == mode_test || mode == mode_reg_n);
       +    if (mode == mode_test) {
       +        rdonly = 1;
                pblist = pdb->opentable( pdb, "spamlist", rdonly );
                if( pblist == NULL )
       -        {
       +               {
                    fprintf( stderr, "%s: cannot open spamlist\n", argv[0] );
       -            exit( 2 );
       +                   exit( 2 );
                }
        
       -        rdonly = (mode == mode_test || mode == mode_reg_s);
       -        pglist = pdb->opentable( pdb, "goodlist", rdonly );
       +               pglist = pdb->opentable( pdb, "goodlist", rdonly );
                if( pglist == NULL )
       -        {
       +               {
                    fprintf( stderr, "%s: cannot open goodlist\n", argv[0] );
       +                   exit( 2 );
       +        }
       +
       +        if (pledge("stdio", NULL) == -1)
       +            err(1, "pledge");
       +    }
       +
       +    while( tok.tt != eof )
       +    {
       +        if( mboxtype == mbox && tok.tt != from )
       +        {
       +            fprintf( stderr, "%s: input does not look like an mbox message\n", argv[0] );
                    exit( 2 );
                }
        
       +        if (mode != mode_test) {
       +            rdonly = 0;
       +            pblist = pdb->opentable( pdb, "spamlist", rdonly );
       +            if( pblist == NULL ) {
       +                fprintf( stderr, "%s: cannot open spamlist\n", argv[0] );
       +                exit( 2 );
       +            }
       +
       +            pglist = pdb->opentable( pdb, "goodlist", rdonly );
       +            if( pglist == NULL )
       +            {
       +                fprintf( stderr, "%s: cannot open goodlist\n", argv[0] );
       +                exit( 2 );
       +            }
       +        }
       +
                vec_create( &mlist );
                bvec_loadmsg( &mlist, &lex, &tok );
        
       @@ -282,9 +302,18 @@ int main( int argc, char** argv )
        
                vec_destroy( &mlist );
        
       -        pglist->close( pglist );
       +        if (mode != mode_test) {
       +                pglist->close( pglist );
       +                free( pglist );
       +                pblist->close( pblist );
       +                free( pblist );
       +        }
       +    }
       +    
       +    if (mode == mode_test) {
       +               pglist->close( pglist );
                free( pglist );
       -        pblist->close( pblist );
       +               pblist->close( pblist );
                free( pblist );
            }