This is pgppager.c in view mode; [Download] [Up]
/* pgppager, designed to be possibly integrated with elm mail reader * * by Alessandro Bottonelli (c)1993, A.Bottonelli@it12.bull.it * version 1.0 - 29/Jan/93 * * This program is put in the public domain and permission is granted * to use it for any purpose, provided this copyright notice is retained. * NO WARRANTIES expressed or implied are given. USE THIS PROGRAM AT * YOUR OWN RISK! * * This programs reads from a specified file or from stdin if no file is * specified and creates three temporary files (header, encrypted, and * trailer) as needed, in order to store the header portion in cleartext, * the encrypted portion still in cypher text, and the trailer portion of * the clear text. Then, if applicable, the cleartext header is outputted, * the encrypted portion is piped through pgp as needed, then the trailer * (if any) is outputted. THIS PROCESS IS TRANSPARENT TO NON PGP ENCRYPTED * TEXTS * * For use with ELM, it is necessary to specify the display to be: * * <whatever_path>/pgppager | pg * * in the elm option menu. * */ #include <stdio.h> /* * you may need to customize the next DEFINEs */ #define PGP "/usr/local/bin/pgp -f" #define BEGIN "-----BEGIN PGP MESSAGE---" #define END "-----END PGP MESSAGE---" #define TEMP "/usr/tmp" /* Temporary dir of your choice */ #define CAT "cat -s" /* -s option to avoid cat complaining */ /* about missing files */ /* * program should be invoked as "pgppager [file] | pg" * actually no check is made to verify that the program * is piped through "pg" or "more", just in case someone * wants to redirect it to a file or a printer. * BEWARE: redirecting it to a file or printer may be * not good for your security if the file or printer level * of security is unknown or poor ... */ /* * This three variables global to be visible to the Exit() routine */ char fh[128]; /* Header temporary file */ char fe[128]; /* Encrypted temporary file */ char fr[128]; /* Trailer temporary file */ main(ac,av) int ac; char **av; { FILE *fp; /* File pointer to read file(s) */ FILE *ft; /* File pointer to temp file(s) */ char line[256]; /* Read/Write buffer */ char cmd[128]; /* command string */ /* * Must be invoked as "pgppager [file_name]" */ if ( ac > 2 ) { fprintf(stderr,"Usage: %s [file_name]\n", av[0]); Exit(1); } /* * File ( if specified ) must exist and be readable */ if ( ac == 2 ) { if ( ( fp = fopen( av[1], "r") ) == NULL ) { fprintf(stderr,"%s: cannot read %s\n", av[0], av[1]); Exit(2); } } else fp=stdin; /* if no file specified assume standard input */ /* * Build temporary file names * * please note how, as files are created for writing, they are * also chmod(ed) to 0600. I expect most PGP users to have their * umask set to 077, but just to be on the safe side ... :-) */ sprintf ( fh, "%s/pgpm.head.%d", TEMP, (int )getpid() ); sprintf ( fe, "%s/pgpm.encr.%d", TEMP, (int )getpid() ); sprintf ( fr, "%s/pgpm.trai.%d", TEMP, (int )getpid() ); /* * READ file until Eof, redirect to "fe" only those portions of the * file that are between the BEGIN PGP and END PGP MESSAGE lines. */ if ( ( ft = fopen ( fh, "w") ) == NULL ) { fprintf(stderr,"%s: error opening temp file\n", av[0]); Exit(4); } if ( (int )chmod( fh, 0600) != 0 ) { fprintf(stderr,"%s: cannot chmod temp file\n", av[0]); Exit(5); } fprintf( ft, "\n"); /* Just to start with a blank line */ while ( fgets( line, 128, fp) != NULL ) { if ( !strncmp( BEGIN, line, strlen( BEGIN) )) { fprintf(ft, "\n===pgp encrypted message begins===\n"); fclose(ft); if ( ( ft = fopen ( fe, "w") ) == NULL ) { fprintf(stderr,"%s: error opening temp file\n", av[0]); Exit(4); } if ( (int )chmod( fe, 0600) != 0 ) { fprintf(stderr,"%s: cannot chmod temp file\n", av[0]); Exit(5); } } fprintf( ft, "%s", line); if ( !strncmp( END, line, strlen( END) )) { fclose(ft); if ( ( ft = fopen ( fr, "w") ) == NULL ) { fprintf(stderr,"%s: error opening temp file\n", av[0]); Exit(4); } if ( (int )chmod( fr, 0600) != 0 ) { fprintf(stderr,"%s: cannot chmod temp file\n", av[0]); Exit(5); } fprintf(ft, "\n===pgp encrypted message ends===\n"); } } fclose(fp); fclose(ft); sprintf( cmd, "%s %s", CAT, fh); system(cmd); sprintf( cmd, "%s %s | %s", CAT, fe, PGP); system(cmd); sprintf( cmd, "%s %s", CAT, fr); system(cmd); Exit(0); /* That's all folks ... */ } /* * Exit(s) are centralized in this routine to make sure we wipe out * temporary files in any case ... */ Exit(n) int n; /* value to be returned to the shell (0 = OK) */ { /* * Remove temporary files (if any) * and sync() just for the sake of it */ unlink(fh); unlink(fe); unlink(fr); sync(); exit(n); }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.