mac@esl.UUCP (09/19/86)
I try to keep the mod.maps newsgroup in compacted form, to conserve disk space. When ever I update my pathalias database, I have to uncompact, then recompact these files. I here post a modification of pathalias that allows it to recognize and read compacted input files. *** parse.y.orig Tue Jan 28 09:50:21 1986 --- parse.y Fri Sep 19 11:20:51 1986 *************** *** 1,5 %{ /* pathalias -- by steve bellovin, as told to peter honeyman */ #ifndef lint static char *sccsid = "@(#)parse.y 8.1 (down!honey) 86/01/19"; #endif lint --- 1,8 ----- %{ /* pathalias -- by steve bellovin, as told to peter honeyman */ + + /* Added the ability for pathalias to recognize & read compressed input */ + /* files -esl!mac Fri Sep 19 11:20:08 PDT 1986 */ #ifndef lint static char *sccsid = "@(#)parse.y 8.2 (esl!mac) 86/01/19"; #endif lint *************** *** 1,7 %{ /* pathalias -- by steve bellovin, as told to peter honeyman */ #ifndef lint ! static char *sccsid = "@(#)parse.y 8.1 (down!honey) 86/01/19"; #endif lint #include "def.h" --- 4,10 ----- /* Added the ability for pathalias to recognize & read compressed input */ /* files -esl!mac Fri Sep 19 11:20:08 PDT 1986 */ #ifndef lint ! static char *sccsid = "@(#)parse.y 8.2 (esl!mac) 86/01/19"; #endif lint #include "def.h" *************** *** 369,374 return((Cost) 0); } yywrap() { char errbuf[100]; --- 372,380 ----- return((Cost) 0); } + char magic_header[] = { "\037\235" }; /* 1F 9D */ + #define WRITE 1 + #define READ 0 yywrap() { char errbuf[100]; *************** *** 372,377 yywrap() { char errbuf[100]; fixprivate(); /* munge private host definitions */ --- 378,385 ----- yywrap() { char errbuf[100]; + int fds[2]; + int f; fixprivate(); /* munge private host definitions */ *************** *** 378,384 if (Ifiles == 0) return(1); - fclose(stdin); while (*Ifiles) { Lineno = 1; if (fopen((Cfile = *Ifiles++), "r")) --- 386,391 ----- if (Ifiles == 0) return(1); while (*Ifiles) { Lineno = 1; if (freopen((Cfile = *Ifiles++), "r", stdin)){ *************** *** 381,387 fclose(stdin); while (*Ifiles) { Lineno = 1; ! if (fopen((Cfile = *Ifiles++), "r")) return(0); sprintf(errbuf, "%s: %s", ProgName, Cfile); perror(errbuf); --- 388,413 ----- while (*Ifiles) { Lineno = 1; ! if (freopen((Cfile = *Ifiles++), "r", stdin)){ ! /* if compacted, undo .. */ ! if (strcmp(Cfile + strlen(Cfile) - 2, ".Z") == 0) { ! /* Check the magic number */ ! if ((getchar() == (magic_header[0] & 0xFF)) ! && (getchar() == (magic_header[1] & 0xFF))) { ! pipe(fds); ! if ((f=fork()) == -1 ){ ! perror("Could not fork"); ! exit(0); ! }else if (f==0) { /*child*/ ! close(fds[READ]); ! dup2(fds[WRITE],1); ! execlp("compress","compress","-dc",Cfile,(char*) 0); ! perror("Could not execl..."); ! exit(0); ! }else{ /* parent */ ! close(fds[WRITE]); ! fclose(stdin); ! if (fdopen(fds[READ],"r")) return(0); } }else /* ends in .Z, but nomagic ?? Assume not compressed */ *************** *** 383,388 Lineno = 1; if (fopen((Cfile = *Ifiles++), "r")) return(0); sprintf(errbuf, "%s: %s", ProgName, Cfile); perror(errbuf); } --- 409,420 ----- fclose(stdin); if (fdopen(fds[READ],"r")) return(0); + } + }else /* ends in .Z, but nomagic ?? Assume not compressed */ + return(0); + }else /* not compressed */ + return(0); + } sprintf(errbuf, "%s: %s", ProgName, Cfile); perror(errbuf); } *** CHANGES.orig Fri Sep 19 13:22:44 1986 --- CHANGES Fri Sep 19 13:24:20 1986 *************** *** 1,3 -- mod.sources, 4.3bsd, 1/86 Improved alias treatment. Routes to domain gateways. --- 1,6 ----- + -- mac@esl.UUCP - 9/86 + Gave pathalias the ability to read compressed input files + -- mod.sources, 4.3bsd, 1/86 Improved alias treatment. Routes to domain gateways. -- ------------------------------------+-----------------------------------------+ | Michael Mc Namara | MM MM MM OO SSS AAA II CCCC | | ESL Incorporated | M M M O O S A I C C | | ARPA: mac%esl.UUCP@ames.ARPA | M M M O O SSS AAAA I C | | mac%esl.UUCP@shasta.ARPA | M M M O O S A A I C C | | mac%esl.UUCP@lll-lcc.ARPA | MM M M OO SSS AAA A III CCCC | ------------------------------------+-----------------------------------------+ | Note: esl used to be called tflop; the path mac%tflop will still work awhile| ------------------------------------+-----------------------------------------+
tony@xios.UUCP (Keeper Of News) (10/01/86)
Anyone who has tried mac@esl.UUCP's patch to pathalais has probably noticed that you quickly run out of processses. I find it hard to believe that this patch has ever worked, unless on his system fclose (actually freopen) knows that the file it is closing is a pipe and does a wait() automagicly. Here is a fix, just add it near the beginning of yywrap at the end of parse.y. while (*Ifiles) { Lineno = 1; + if( Cfile != NULL && + strcmp(Cfile + strlen(Cfile) - 2, ".Z") == 0) { + /* + * Ignore the case where it ends in .Z but is not compressed + * This is the hight of paranoia, and is more effort than I wish + * to exert tonight. + */ + pclose(stdin); + } if (freopen((Cfile = *Ifiles++), "r", stdin)){ /* if compacted, undo .. */ if (strcmp(Cfile + strlen(Cfile) - 2, ".Z") == 0) { /* Check the magic number */ -- ------------------------------------------------------------------------------- Tony Lill Keeper of News @ Xios Systems Corporation 1600 Carling Avenue, Suite 150, Ottawa, Ontario, Canada, K1Z 8R8 (613) 725-5411 xios!tony ------------------------------------------------------------------------------- Not the edge of the world, but we can see it from here.