segedy@gsg.UUCP (Catherine Segedy) (12/08/88)
Posting-number: Volume 5, Issue 76 Submitted-by: "Catherine Segedy" <segedy@gsg.UUCP> Archive-name: uns Due to all the noise recently about the dangers of shell scripts for unpacking maps, I recently posted to comp.unix.wizards, news.sysadmin, and news.admin, describing the following program. I would have just posted it, but I was delayed a few days for something. Anyway, here it is. I hope this is helpful. cathy segedy, GSG decvax!gsg!segedy harvard!gsg!segedy ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ #! /bin/sh # This file was wrapped with "dummyshar". "sh" this file to extract. # Contents: uns.c echo extracting 'uns.c' if test -f 'uns.c' -a -z "$1"; then echo Not overwriting 'uns.c'; else sed 's/^X//' << \EOF > 'uns.c' X/* Copyright 1988 by GSG, Salem, NH -- permission is given to copy this and X use it as long as it is not sold or used commercially, and as long as X this copyright is included with it. X X Author: Cathy Segedy X send comments, etc. to: decvax!gsg!segedy or X harvard!gsg!segedy X date: Dec. 7, 1988 Xno guarantees or warranties are made, either implicitly or explicitly about the Xcorrectness of this program, and it is presented as is, and use at your own Xrisk. X Xto compile this program, (uns.c): X cc -o uns uns.c Xto use this program: (I use it this way) X uns mapfilename >> some_output_file Xthis should produce the mapfile. The output file should contain X a message about the opening of the input file X a message about removing end_of_line X a message about the open of the mapfile X all the lines which come after the SHAR_EOF X a message about closing files Xthis program doesn't get rid of any shell commands which someone might try to Xslip in, but since it is not a shell script, they shouldn't get executed. XPlus, the output file will be full of garbage if there was stuff tacked on Xafter the SHAR_EOF. XSomeone might wish to shorten MAXLIN (do map files have a line limit?) X*/ X X#include <stdio.h> X X#define MAXLIN 256 X Xmain(argc,argv) Xint argc; Xchar *argv[]; X{ X FILE *fp, *fp2; X char buffer[MAXLIN]; X int at_beginning, at_end; X char filename[20], file2[20]; X X at_beginning = 0; X at_end = 0; X X if(argc != 2){ X printf("bad arguements\n"); X exit(1); X } X X strcpy(filename,argv[1]); X X printf("opening file {%s}\n",filename); X if((fp = fopen(filename, "r")) == NULL) { X printf("can not open file {%s}\n",filename); X exit(1); X } X else{ X while( (!at_beginning) && (fgets(buffer,MAXLIN,fp) != NULL) ){ X if(strncmp(buffer,"cat << 'SHAR_EOF' > ",20) == 0){ X at_beginning = 1; X } X } X if(!at_beginning){ X printf("couldn't find beginning, exiting\n"); X fclose(fp); X exit(1); X } X printf("removing end-of-line while copying\n"); X strncpy(file2,&buffer[20],(strlen(&buffer[20]) - 1)); X printf("opening file {%s}\n",file2); X if((fp2 = fopen(file2, "w")) == NULL) { X printf("can not open file {%s}\n",file2); X exit(1); X } X X while( (!at_end) && (fgets(buffer,MAXLIN,fp) != NULL) ){ X if(strncmp(buffer,"SHAR_EOF",8) != 0){ X fprintf(fp2,"%s",buffer); X } X else{ X at_end = 1; X } X } X } X while( fgets(buffer,MAXLIN,fp) != NULL){ X printf("%s",buffer); X } X X printf("closing files\n"); X fclose(fp); X fclose(fp2); X} EOF chars=`wc -c < 'uns.c'` if test $chars != 2579; then echo 'uns.c' is $chars characters, should be 2579 characters!; fi fi exit 0