[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