Relay-Version: version B 2.10 5/3/83; site utzoo.UUCP Posting-Version: version B 2.10.2 9/18/84; site bty.UUCP Path: utzoo!watmath!clyde!burl!ulysses!mhuxr!mhuxt!houxm!whuxl!whuxlm!whuxcc!infopro!bty!yost From: yost@bty.UUCP (Brian Yost) Newsgroups: net.sources,net.news.b Subject: Compressed Batching w/Restricted uux Message-ID: <224@bty.UUCP> Date: Thu, 21-Nov-85 00:23:41 EST Article-I.D.: bty.224 Posted: Thu Nov 21 00:23:41 1985 Date-Received: Sat, 23-Nov-85 00:36:43 EST Distribution: net Organization: BTY, Inc., Rockaway, NJ Lines: 97 Xref: watmath net.sources:3886 net.news.b:1256 Recently, I ported the USENET software to my system, an Altos 586 running XENIX 3.0. One of the problems I ran into was with compressed batching. The problem is that my particular version of ``uux'' will allow the following commands to be executed, and no others: rnews rmail uusend uucp I get the impression that many other sites may have a similarly restricted version of ``uux,'' so I am posting my solution. As distributed, compressed batching requires that ``uux'' run ``cunbatch'' to decompress the batched files. One solution would be to bypass ``cunbatch'' and replace ``rnews'' with a shell script to decompress and then call the real ``rnews.'' However, in order to be capable of receiving unbatched news, batched news, and compressed batched news, I decided to go into the source for ``rnews'' and have it take care of decompression. The idea is straightforward. First, ``rnews'' must check for the magic number used by the ``compress'' program (version 4.0). If this magic number is seen, then fork/exec ``compress'' with a temp file as its standard output. Once this child process has terminated, reopen the temp file as the standard input to ``rnews,'' and continue as usual. The routine ``checkbatch'' in the source file ifuncs.c reads the first character of its input, to see if it is a '#' which indicates batching. The test for the magic number must be inserted just before the test for '#'. If the magic number is seen, the new function ``uncompress'' is called, which takes care of fork/exec'ing ``compress'' and redirecting the i/o. Please note that I have made an effort to limit my modifications to a single source file. The first group of additional lines comes right before the test if (c == '#') in the function checkbatch() of ifuncs.c: 743a744,757 > /* Brian Yost 11/17/85 infopro!bty!yost > * Check for the compress(1) program's magic number, > * 037 235. If found, uncompress the data before checking > * for batching. > */ > if (c == '\037') { /* magic number for compress(1) */ > reset_stdin(); > uncompress(); > c = getc(stdin); > if (c != EOF) > ungetc(c, stdin); > clearerr(stdin); > } > /* no else-if here! */ Note that I've only checked for the first byte of the magic number. The second addition is the function uncompress(), which I chose to place right after checkbatch() to keep the modifications localized as much as possible: 751a766,794 > } > > /* Brian Yost 11/17/85 infopro!bty!yost > * pipe stdin through compress(1) into a temporary file, and > * then redirect the standard input of rnews from this file. > */ > uncompress() > { > int wait_pid, child_pid, exit_status; > char *tmp_file; > > tmp_file = "/tmp/inewsXXXXXX"; > mktemp(tmp_file); > if ((child_pid = fork()) == 0) { > char uncompress[BUFLEN]; > > sprintf(uncompress, "%s/compress", BIN); > /* redirect standard output to tmp_file */ > (void) freopen(tmp_file, "w", stdout); > execl(uncompress, "compress", "-d", (char *)0); > xerror("Unable to exec shell to uncompress news."); > } > while ((wait_pid = wait(&exit_status)) != child_pid) > if (wait_pid == -1) > break; > > /* now redirect standard input from tmp_file */ > (void) freopen(tmp_file, "r", stdin); > (void) unlink(tmp_file); /* will disappear once closed */ I hope these changes will be of some help to sites with picky ``uux'' programs. If any errors or omissions are found in the above code, kindly forward the fixes to me. Thanks in advance. Brian Yost infopro!bty!yost