[Info-vax] To MIME or not to MIME

Phillip Helbig undress to reply helbig at asclothestro.multivax.de
Sat Aug 4 06:11:49 EDT 2018


In article <00B30867.65D035FD at SendSpamHere.ORG>, VAXman- 
@SendSpamHere.ORG writes: 

> My wife just scanned a laser cut piece of balsa wood -- poorly cut -- and she
> mailed it to my VMS email.
> 
> I'd EXTRACTED the mail message to BALSA.TXT and tried to use the MIME utility
> to extract the incorporated JPG.
> 
> MIME> open sys$manager:balsa.txt
> %MIME-E-FILEERROR, file error: Filename requires a file type delimiter, '.'
> %MIME-E-NOFILNAME, file name must be specified
> %MIME-E-NOFILNAME, file name must be specified   
> %MIME-W-NOMSGOPEN, no currently active message
> MIME>              

I haven't done much with MIME.  It is a bit strange, not well 
documented, not well integrated, and mainly for VMS <---> VMS, where one 
really doesn't need encoding at all (just mail binaries and EXTRACT 
them).

For stuff from outside, I just edit the message, save the encoded parts, 
and run the code below to decode it (yes, this is scripted).

----------8<--------------------------------------------------------------------

#include <stdlib.h>
#include <stdio.h>
#include <ctype.h>

int decode_b64char( int ch )
{
    int  sextet;

         if( ('A' <= ch) && (ch <= 'Z') )  sextet = ch - 'A';
    else if( ('a' <= ch) && (ch <= 'z') )  sextet = (ch - 'a') + 26;
    else if( ('0' <= ch) && (ch <= '9') )  sextet = (ch - '0') + 52;
    else if( ch == '+' )                   sextet = 62;
    else if( ch == '/' )                   sextet = 63;
    else {
        fprintf( stderr, (isprint(ch) ? "Illegal base64 character '%c'\n" :
                                        "Illegal base64 character 0x%02x\n"),
                 ch );
        exit( EXIT_FAILURE );
    }
    return( sextet );
}


main( int argc, char *argv[] )
{
    FILE *fin;
    FILE *fout;
    int  flushing = 0;
    int  temp = 0;
    int  bits = 0;
    int  ch;

    if( argc < 2 ) {
        fprintf( stderr, "Usage: b64decode <infile> [outfile]\n" );
        exit( EXIT_SUCCESS );
    }

    fin = fopen( argv[1], "r" );
    if( fin == NULL ) {
        perror( "openin" );
        exit( EXIT_FAILURE );
    }

    if( argc < 3 )
        fout = stdout;
    else {
        fout = fopen( argv[2], "wb" );
        if( fout == NULL ) {
            perror( "openout" );
            fclose( fin );
            exit( EXIT_FAILURE );
        }
    }

    while( (ch = fgetc( fin )) != EOF ) {
        if( isspace(ch) )
            continue;

        if( flushing ) {
            if( ch != '=' ) {
                fprintf( stderr, "Illegal character in EOF padding\n" );
                exit( EXIT_FAILURE );
            }
        }
        else {
            if( ch == '=' )
                flushing = 1;
            else {
                temp <<= 6;
                temp |= decode_b64char( ch );
                bits += 6;
                if( bits >= 8 ) {
                    bits -= 8;
                    fputc( (0xff & (temp >> bits)), fout );
                }
            }
        }
    }

    fclose( fout );
    fclose( fin );
}




More information about the Info-vax mailing list