grwalter@watcgl.waterloo.edu (Fred Walter) (12/31/88)
With the volume coming through comp.{binaries|sources}.amiga lately (Bob, you're working too hard :-) :-)) I threw together a program (which I call newsbreak) to do all the stripping of headers, unshar'ing, cat'ing and uudecode'ing for me. It currently only works under Unix (since I do all the above before I send stuff down to my Amiga), but as soon as I can get AmigaUUCP working on my setup, I'll have a version that works on an Amiga as well. Think of this as a belated Christmass present :-) If anyone enhances this, I'd appreciate a copy. fred -------cut-here----------ouch!-------------------- /* * newsbreak.c (version 1.00) * * by G. R. Walter (Fred) December 30, 1988 * * Description: * Takes a series of files which are shar files (strips any * garbage at the start of the shar file) that have been posted to * comp.{sources|binaries}.amiga and feeds them through sh. * After they have been fed through sh the original files are * deleted. Then any uuencoded files are uudecoded, after which * the uuencoded files are also deleted. * * NOTE: * This program assumes that all necessary shar files are in the * current directory. It attempts to not delete stuff if it can't * handle it (like when not all the parts of a multi-part uuencoded * file are available). */ #include <stdio.h> #include <ctype.h> #include <sys/types.h> #include <sys/dir.h> main() { DIR *dirp; struct direct *dp; void unshar(); void uudecode(); /* unshar everything */ dirp = opendir("."); for (dp = readdir(dirp); dp != NULL; dp = readdir(dirp)) unshar(dp->d_name); closedir(dirp); /* uudecode everything */ dirp = opendir("."); for (dp = readdir(dirp); dp != NULL; dp = readdir(dirp)) uudecode(dp->d_name); closedir(dirp); exit(0); } void unshar(name) char *name; { FILE *fin; FILE *fout; char buf[200]; fin = fopen(name, "r"); if (fin == NULL) /* file doesn't exist !? */ return; for (;;) { if (fgets(buf, 200, fin) == NULL) { /* not a shar file !? */ fclose(fin); return; } if (strncmp(buf, "#!/bin/sh", 9) == 0) break; } fout = fopen(".unshar.temp.file", "w"); while (fgets(buf, 200, fin) != NULL) fprintf(fout, "%s", buf); fclose(fout); fclose(fin); if (system("sh .unshar.temp.file >> .unshar.output") == 0) unlink(name); unlink(".unshar.temp.file"); } void uudecode(name) char *name; { FILE *file; char buf[200]; char *ptr; /* check if the file still exists */ file = fopen(name, "r"); if (file == NULL) return; fclose(file); /* if the file ends in ".uu" or ".zuu" just uudecode it */ ptr = name + strlen(name) - 1; if ((*ptr == 'u') && (*(ptr - 1) == 'u')) { ptr -= 2; if ((*ptr == '.') || ((*ptr == 'z') && (*(ptr - 1) == '.'))) { sprintf(buf, "uudecode %s", name); if (system(buf) == 0) unlink(name); } } /* handle ".zu#where # is a number */ while (isdigit(*ptr)) ptr--; if ((*ptr == 'u') && ((*(ptr - 1) == 'z') && (*(ptr - 2) == '.'))) { *(ptr + 1) = NULL; sprintf(buf, "cat %s* | uudecode", name); if (system(buf) == 0) { sprintf(buf, "rm %s*", name); system(buf); } } }