SLOANE@kuhub.cc.ukans.edu (Bob Sloane) (08/29/89)
Hi All, Well, I got several requests for the mailing list/newsgroup gateway software, so here it is. Be sure and let me know if you have any problems with it. +-------------------+-------------------------------------+------------------+ | Bob Sloane \Internet: SLOANE@KUHUB.CC.UKANS.EDU/Anything I said is | | Computer Center \ BITNET: SLOANE@UKANVAX.BITNET / my opinion, not my | | University of Kansas\ AT&T: (913) 864-0444 / employer's. | +-----------------------+-----------------------------+----------------------+ $! ------------------ CUT HERE ----------------------- $ v='f$verify(f$trnlnm("SHARE_VERIFY"))' $! $! This archive created by VMS_SHARE Version 7.1-004 3-AUG-1989 $! On 28-AUG-1989 15:21:33.26 By user SLOANE $! $! This VMS_SHARE Written by: $! Andy Harper, Kings College London UK $! $! Acknowledgements to: $! James Gray - Original VMS_SHARE $! Michael Bednarek - Original Concept and implementation $! $! TO UNPACK THIS SHARE FILE, CONCATENATE ALL PARTS IN ORDER $! AND EXECUTE AS A COMMAND PROCEDURE ( @name ) $! $! THE FOLLOWING FILE(S) WILL BE CREATED AFTER UNPACKING: $! 1. GATEMAIL.C;1 $! 2. GATEMAIL.TXT;1 $! 3. GATENEWS.C;1 $! 4. GATENEWS.TXT;1 $! $set="set" $set symbol/scope=(nolocal,noglobal) $f=f$parse("SHARE_TEMP","SYS$SCRATCH:.TMP_"+f$getjpi("","PID")) $e="write sys$error ""%UNPACK"", " $w="write sys$output ""%UNPACK"", " $ if f$trnlnm("SHARE_LOG") then $ w = "!" $ if f$getsyi("version") .ges. "V4.4" then $ goto START $ e "-E-OLDVER, Must run at least VMS 4.4" $ v=f$verify(v) $ exit 44 $UNPACK: SUBROUTINE ! P1=filename, P2=checksum $ if f$search(P1) .eqs. "" then $ goto file_absent $ e "-W-EXISTS, File ''P1' exists. Skipped." $ delete/nolog 'f'* $ exit $file_absent: $ if f$parse(P1) .nes. "" then $ goto dirok $ dn=f$parse(P1,,,"DIRECTORY") $ w "-I-CREDIR, Creating directory ''dn'." $ create/dir 'dn' $ if $status then $ goto dirok $ e "-E-CREDIRFAIL, Unable to create ''dn'. File skipped." $ delete/nolog 'f'* $ exit $dirok: $ w "-I-PROCESS, Processing file ''P1'." $ define/user sys$output nl: $ EDIT/TPU/NOSEC/NODIS/COM=SYS$INPUT 'f'/OUT='P1' PROCEDURE Unpacker ON_ERROR ENDON_ERROR;SET(FACILITY_NAME,"UNPACK");SET( SUCCESS,OFF);SET(INFORMATIONAL,OFF);f:=GET_INFO(COMMAND_LINE,"file_name"); buff:=CREATE_BUFFER(f,f);p:=SPAN(" ")@r&LINE_END;POSITION(BEGINNING_OF(buff)) ;LOOP EXITIF SEARCH(p,FORWARD)=0;POSITION(r);ERASE(r);ENDLOOP;POSITION( BEGINNING_OF(buff));g:=0;LOOP EXITIF MARK(NONE)=END_OF(buff);x:= ERASE_CHARACTER(1);IF g = 0 THEN IF x="X" THEN MOVE_VERTICAL(1);ENDIF;IF x= "V" THEN APPEND_LINE;MOVE_HORIZONTAL(-CURRENT_OFFSET);MOVE_VERTICAL(1);ENDIF; IF x="+" THEN g:=1;ERASE_LINE;ENDIF;ELSE IF x="-" THEN g:=0;ENDIF;ERASE_LINE; ENDIF;ENDLOOP;p:="`";POSITION(BEGINNING_OF(buff));LOOP r:=SEARCH(p,FORWARD); EXITIF r=0;POSITION(r);ERASE(r);COPY_TEXT(ASCII(INT(ERASE_CHARACTER(3)))); ENDLOOP;o:=GET_INFO(COMMAND_LINE,"output_file");WRITE_FILE(buff,o); ENDPROCEDURE;Unpacker;EXIT; $ delete/nolog 'f'* $ CHECKSUM 'P1' $ IF CHECKSUM$CHECKSUM .eqs. P2 THEN $ EXIT $ e "-E-CHKSMFAIL, Checksum of ''P1' failed." $ ENDSUBROUTINE $START: $ create/nolog 'f' X/* X * Gatemail - a program to convert Mail messages from a mailing list into X * News articles suitable for input to the ANU-NEWS ADD FILE X * command. X * X * Copyright 1989 by Robert R. Sloane <sloane@kuhub.cc.ukans.edu>. X * Permission is granted to anyone to make or distribute copie Vs X * of this program, provided that this copyright notice is X * preserved. X */ X#include <stdio.h> X#include <ssdef.h> X XFILE *mfd;`009/* MAIL file */ XFILE *bfd;`009/* NEWS Batch file */ X Xmain(int argc, char **argv) `123 X char line`0911024`093; X int i; X/* X * make sure user gave us both file names and the newsgroup name. X */ X if (argc < 2) `123 X`009printf("Usage: gtmail <input> <output> <system> <newsgroup>\n"); X`009exit(SS$_NORMAL); X `125 X if (argc < 5) X`009exit(SS$_INSFARG); X/* X * now open the input file X */ X if ( !(mfd=fopen(argv`0911`093,"r")) ) `123 X`009perror("can't open input file:"); X`009exit(SS$_ABORT); X `125 X/* X * and the output file X */ X if ( !(bfd=fopen(argv`0912`093,"a")) ) `123 X`009perror("can't open output file:"); X`009exit(SS$_ABORT); X `125 X/* X * now copy selected parts of the input to the output file X */ X while ( get_line(line) ) `123 X/* X * check to see if this is the start of a new mail message X * and if it is, process it. X */ X`009if ( !strncmp(line,"\f\nFrom:\t",8) ) `123 X/* X * skip over unwanted mail headers X */ X`009 while (get_head(line)) ; /* skip MAIL headers */ X/* X * now output the headers we want to keep X */ X`009 fputs("#! rnews ???\n",bfd); /* output batch separator */ X`009 fputs("Path: ",bfd); fputs(argv`0913`093,bfd); fputs("!list\n",bfd); X`009 fputs("Newsgroups: ",bfd); fputs(argv`0914`093,bfd); fputs("\n",bfd) V; X`009 while (get_head(line)) `123 /* look for first null line * V/ X`009`009if (!strncmp(line,"Return-path: ",13))continue; X`009`009if (!strncmp(line,"Newsgroups: ", 12))continue; X`009`009if (!strncmp(line,"Received: ", 10))continue; X`009`009if (!strncmp(line,"X-To: ", 6))continue; X`009`009if (!strncmp(line,"Path: ", 6))continue; X`009`009if (!strncmp(line,"To: ", 4))continue; X`009`009fputs(line,bfd); X`009 `125 X`009 fputs("\n",bfd); /* mark end of headers */ X`009`125 X/* X * if we get here, the headers are done, so copy each line of the text X */ X`009else `123 X/* X * Check each line, and if it looks like and NEWS Batch file separator, X * put a > in front of is, so NEWS won't get confused. X */ X`009 if (!strncmp(line,"#! rnews ",9)) X`009`009fputs(">",bfd); X`009 fputs(line,bfd); X`009`125 X `125 X`125 X/* X * get_line: get one line of text from the input file, exit on EOF. X * If the line consists of just a form feed, concatenate the X * next line on the end. Makes looking for \f\nFrom:\t that X * separates mail messages easier to find. X */ Xget_line( char *line ) `123 X int status; X extern char *mygets(); X/* X * read the next line from the file X */ X if ( !mygets(line,1024,mfd) ) `123 X`009fclose(bfd); X`009exit(SS$_NORMAL); X `125 X/* X * if this line is just a FORMFEED, Combine it with the next line X */ X if ( line`0910`093 == '\f' && line`0911`093 == '\n' ) `123 X`009if ( !mygets(line+2,1022,mfd) ) `123 /* get the next line */ X`009 fclose(bfd); /* trailing formfeeds ignored */ X`009 exit(SS$_NORMAL); X`009`125 X `125 X return 1; X`125 X/* X * get_head: routine to get a single header line from the input file. X * RFC822 standard continuation lines are concatenated together X * to make processing easier. I assume that no header line wil Vl X * be longer than 1024 characters. X */ Xget_head( char *line ) `123 X int ch; X extern char *mygets(); X/* X * read the header line X */ X if ( !mygets(line,1024,mfd) ) `123 X`009fclose(bfd); /* close off the output file */ X`009exit(SS$_ENDOFFILE); /* error in header, exit */ X `125 X/* X * if this line is just a newline, then we have reached the end of the X * headers. X */ X if ( *line == '\n' ) return 0; X/* X * if the next line begins with a blank, then it is a continuation X * of this line. Append it to the end of the current line. X */ X while ( ungetc(getc(mfd),mfd) == ' ' ) X`009if ( !mygets(line+strlen(line),1024-strlen(line),mfd) ) `123 X`009 fclose(bfd); X`009 exit(SS$_ENDOFFILE); X`009`125 X return 1; X`125 X/* X * You may have been wondering why I used mygets rather than the standard X * C library routine gets. I started out that way, but there seems to be X * a problem in the C library when using ungetc, getc, and gets together X * on the same file. It was easier to just write my own than try to find X * out what the problem was with DEC's routine. X */ Xchar *mygets( char *line, int max, FILE *fd ) `123 X int i,ch; X/* X * read up to max characters from the input file X */ X for ( i=0; i<max-1; ++i ) `123 X/* X * if there are no more characters, exit X */ X`009if ( (ch=getc(fd)) == EOF ) `123 X`009 line`091i`093 = '\0'; X`009 return 0; X`009`125 X/* X * stuff the current character in the users line buffer X */ X`009line`091i`093 = ch; X/* X * if this is a newline, then we are done for now, so return. X */ X`009if ( ch == '\n' ) `123 X`009 line`091i+1`093 = '\0'; /* put EOS on the end of the string V */ X`009 return line; X`009`125 X `125 X/* X * if we get here, the line was longer than the users buffer. X * put and EOS on the string, and return. X */ X line`091max`093 = '\0'; X return line; X`125 $ CALL UNPACK GATEMAIL.C;1 289289757 $ create/nolog 'f' XGATEMAIL is a program to take articles extracted from a VMS MAIL file and Xturn them into News articles suitable for inserting in the NEWS database Xusing the NEWS ADD FILE command. This program is currently in use to gateway Xthe ANU-NEWS mailing list to the news.software.anu-news newsgroup. This Xprogram has only been tested using BITNET LISTSERV type mailing lists and Xmay or may not work for other mailing lists. If fact, it may or may not work Xfor all LISTSERV mailing list. It seems to work OK for the ANU-NEWS mailing Xlist. X`032 XThe first thing needed is a subscription to the mailing list. Sign on the t Vhe XNEWSMGR account and use the following command to subscribe to the mailing li Vst: X X$ SEND LISTSERV@somewhere "SUB list-name news.group.GATEWAY" X Xwhere somewhere is the BITNET system that the list is served from, list-name Xis the name of the mailing list to gateway, and news.group is the name of th Ve Xnewsgroup to gateway into. This "personal name" will be used later to ident Vify Xthe mail from the mailing list. X XAfter you get confirmation that you are subscribed to the mailing list, you Xshould send the following command: X X$ SEND LISTSERV@somewhere SET FULLHDR X Xwhich will cause the mailing list processing software to retain all of the Xmail headers in messages sent to you. This is needed so that the Message-id V: Xheaders are preserved. X XNext, you need to modify you periodic News batch job to extract items from t Vhe Xmailing list to a file: X X$ MAIL XMAIL> SELECT/TO=news.group.GATEWAY NEWMAIL !same as the "personal name" ab Vove XMAIL> EXTRACT/ALL/APPEND temp.file !moves the messages to the file X !and also moves them to the fol Vder X !named MAIL XMAIL> SELECT/TO=news.group.GATEWAY MAIL !Assumes that the MAIL folder i Vs X !always empty. XMAIL> DELETE/ALL !delete what we just extracted X X XNext, run the GATEMAIL program on the extracted MAIL: X X$ GATEMAIL:==$disk:`091dir`093GATEMAIL X$ IF F$SEARCH ("temp.file") .nes. "" then - X GATEMAIL temp.file news-group.MAIL news-group news.group X$ IF F$SEARCH ("temp.file") .nes. "" then - X DELETE temp.file;* X Xwhere temp.file is the name of the file containing the extracted mail, Xnews-group.MAIL is the file to be added to news using ADD FILE, system is Xthe system name to be put in the Path: header of the generated article, and Xnews.group is the newsgroup name to go in the Newsgroups: header. The system Xname (news-group) should be the same as was specified in the NEWS.SYS file f Vor Xthe GATENEWS program. See GATENEWS.TXT for more information. X XFinally, you need to add the generated file into the News database: X X$ NEWS/NOSCREEN ADD FILE news-group.MAIL/DELETE X XYou will also need to create the newsgroup in NEWS, and update your NEWS.SYS Xfile to accept the newsgroup. X XIf you have any problems with this program, let me know. X+-------------------+-------------------------------------+----------------- V-+ X`124 Bob Sloane \Internet: SLOANE@KUHUB.CC.UKANS.EDU/Anything I said V is `124 X`124 Computer Center \ BITNET: SLOANE@UKANVAX.BITNET / my opinion, not V my `124 X`124 University of Kansas\ AT&T: (913) 864-0444 / employer's. V `124 X+-----------------------+-----------------------------+--------------------- V-+ $ CALL UNPACK GATEMAIL.TXT;1 1332696240 $ create/nolog 'f' X/* X * Gatenews: a program to take Batches of NEWS from the ANU-NEWS program X * and feed them to a mailing list via BITNET. X * X * Copyright 1989 by Robert R. Sloane <sloane@kuhub.cc.ukans.edu>. X * Permission is granted to anyone to make or distribute copie Vs X * of this program, provided that this copyright notice is X * preserved. X */ X#include <stdio.h> X#include <ssdef.h> X XFILE *mfd = 0;`009/* MAIL file */ XFILE *bfd;`009/* NEWS Batch file */ X Xmain(int argc, char **argv) `123 X char line`0911024`093; X int i; X char sendcmd`0911024`093; X int control; X extern char *mygets(); X/* X * make sure user gave us the file name and the mailing address. X */ X if (argc < 2) `123 X`009printf("Usage: gtnews <input> <address>\n"); X`009exit(SS$_NORMAL); X `125 X if (argc < 3) X`009exit(SS$_INSFARG); X/* X * now open the input file X */ X if ( !(bfd=fopen(argv`0911`093,"r")) ) `123 X`009perror("can't open input file:"); X`009exit(SS$_ABORT); X `125 X/* X * now fix up the command to send the mail X */ X strcpy(sendcmd, X"SEND/FILE/PUNCH/CLASS=M/PRIO=50/NAME=\"LISTSERV MAIL\"/DELETE TEMPMAIL.TMP V "); X strcat(sendcmd,argv`0912`093); X/* X * we don't want to send control messages to the mailing list, so set up X * a flag that says the current message is a control message. If we find X * a Control: line in the message this will be 1, otherwise 0 X */ X control = 0; /* not a control message for now */ X/* X * now copy selected parts of the input to the output file X */ X while ( mygets(line,1024,bfd) ) `123 X/* X * check to see if this is the start of a new mail message X * and if it is, process it. X */ X`009if ( !strncmp(line,"#! rnews ",9) `124`124 !mfd ) `123 X/* X * first we need to close any previous file and send it to the mailing li Vst X */ X`009 if ( mfd && !control ) `123 X`009`009fclose(mfd); X`009`009mfd = 0; X`009`009system(sendcmd); X`009 `125 X`009 else if ( mfd ) `123 X`009`009fclose(mfd); X`009`009mfd = 0; X`009`009delete("TEMPMAIL.TMP"); X`009 `125 X/* X * now open a new output temp file to hold the mail message X */ X`009 if ( !(mfd=fopen("TEMPMAIL.TMP","w")) ) `123 X`009`009perror("can't open scratch file:"); X`009`009exit(SS$_ABORT); X`009 `125 X/* X * skip over unwanted headers and output the ones we want to keep X */ X`009 fputs("To: ",mfd); fputs(argv`0912`093,mfd); fputs("\n",mfd); X`009 control=0; /* assume it's no control msg */ X`009 while (get_head(line)) `123 /* look for first null line */ X`009`009if (!strncmp(line,"From: ", 6))fputs(line,mfd); X`009`009if (!strncmp(line,"Date: ", 6))fputs(line,mfd); X`009`009if (!strncmp(line,"Sender: ", 8))fputs(line,mfd); X`009`009if (!strncmp(line,"Subject: ", 9))fputs(line,mfd); X`009`009if (!strncmp(line,"Reply-to: ", 10))fputs(line,mfd); X`009`009if (!strncmp(line,"Message-ID: ", 12))fputs(line,mfd); X`009`009if (!strncmp(line,"Organization: ",14))fputs(line,mfd); X`009`009if (!strncmp(line,"Control: ", 9))control=1; X`009 `125 X`009 fputs("\n",mfd); /* mark the end of the headers */ X`009`125 X`009else X/* X * if we get here, the headers for this message have been processed, X * so output the line of text. X */ X`009 fputs(line,mfd); X `125 X/* X * found the end of the input file, so send off the last message, if we X * haven't already. X */ X if ( mfd && !control ) `123 X`009fclose(mfd); X`009system(sendcmd); X `125 X else if ( mfd ) `123 X`009fclose(mfd); X`009delete("TEMPMAIL.TMP"); X `125 X`125 X/* X * get_head: get one header line from the input file. Continuation lines X * are concatenated into one long line. It is assumed that no header lin Ve X * is longer than 1024 characters. X */ Xget_head( char *line ) `123 X int ch; X char cline`0911024`093; X extern char *mygets(); X/* X * get the next header line from the input file. X */ X if ( !mygets(line,1024,bfd) ) `123 X`009fclose(mfd); X`009exit(SS$_ENDOFFILE); /* shouldn't get EOF here */ X `125 X/* X * if this line is null, it marks the end of the headers. X */ X if ( *line == '\n' ) return 0; /* return false if no more headers */ X/* X * make sure the header lines aren't longer than 80 characters. X * fold and continue them if needed. X */ X fold_header(line); X/* X * if the next input line starts with a blank, it is a continuation of th Vis X * line, so concatenate it onto the end of this line. X */ X while ( ungetc(ch=fgetc(bfd),bfd) == ' ' ) `123 X`009if ( !mygets(cline,1024-strlen(line),bfd) ) `123 X`009 fclose(mfd); X`009 exit(SS$_ENDOFFILE); /* this shouldn't happen */ X`009`125 X`009fold_header(cline); X`009strcat(line,cline); X `125 X return 1; X`125 X/* X * fold_header: folds headers so that they don't exceed the 80 column lim Vit X * on BITNET mail messages. X */ Xfold_header( char *line ) `123 X char cline`0911024`093; X char ch; X char *cp; X X cline`0910`093 = '\0'; X while ( strlen(line) > 80 ) `123 X`009ch = line`09180`093;`009`009`009 /* save the 80th character */ X`009line`09180`093 = '\0'; /* truncate line at col 80 * V/ X`009cp = strrchr( line, ' ' ); /* find the rightmost blank */ X`009line`09180`093 = ch; /* in the first 80 character Vs */ X`009if ( cp == NULL ) `123 /* if there is no delimiter */ X`009 strcpy( &line`09181`093,&line`09180`093 ); /* make room for a bla Vnk */ X`009 line`09180`093 = ' '; /* and put one in */ X`009 cp = &line`09180`093;`009`009 /* set pointer to the blank */ X`009`125 X`009*cp = '\0'; /* end the line at the blank */ X`009strcat(cline,line); /* build the new line */ X`009strcat(cline,"\n "); /* and continue it later */ X`009strcpy(line,cp+1); /* now move rest of line over */ X `125 X strcat(cline,line); strcpy(line,cline); /* now put the line back */ X`125 X/* X * You may have been wondering why I used mygets rather than the standard X * C library routine gets. I started out that way, but there seems to be X * a problem in the C library when using ungetc, getc, and gets together X * on the same file. It was easier to just write my own than try to find X * out what the problem was with DEC's routine. X */ Xchar *mygets( char *line, int max, FILE *fd ) `123 X int i,ch; X/* X * read up to max characters from the input file X */ X for ( i=0; i<max-1; ++i ) `123 X/* X * if there are no more characters, exit X */ X`009if ( (ch=getc(fd)) == EOF ) `123 X`009 line`091i`093 = '\0'; X`009 return 0; X`009`125 X/* X * stuff the current character in the users line buffer X */ X`009line`091i`093 = ch; X/* X * if this is a newline, then we are done for now, so return. X */ X`009if ( ch == '\n' ) `123 X`009 line`091i+1`093 = '\0'; /* put EOS on the end of the string V */ X`009 return line; X`009`125 X `125 X/* X * if we get here, the line was longer than the users buffer. X * put and EOS on the string, and return. X */ X line`091max`093 = '\0'; X return line; X`125 $ CALL UNPACK GATENEWS.C;1 2071228213 $ create/nolog 'f' XGATENEWS is a program to take an RFC1036 standard news batch file and mail Xthe individual articles to a BITNET LISTSERV mailing list. The program will Xonly work for BITNET sites running the JNET software package from Joiner XAssociates. X XFirst you must configure News to create the "batches" for the newsgroup. Add Xa line to you NEWS.SYS file specifying a dummy system name: X Xnews-group:WORLD,NA,USA,news.group:\ XB:NEWS_MANAGER_DEV:`091MAIL_news-group`093NEWS.BATCH`094B X XIf the newsgroup is to be distributed to other systems, you will need to upd Vate Xyour NEWS.DISTRIBUTION file to reflect the groups distribution to forward th Ve Xarticles to other systems. X XNext you need to update your periodic news batch job to send the mailed batc Vhes Xto the mailing list using GATENEWS. I added the following to my NEWSSKIM.COM Xfile: X X$!-------------------------------------------------------------------------- V--- X$! Send any News items to mailing lists on BITNET. X$! Search for all directories of the form NEWS_MANAGER:MAIL_<list>.DIR . X$! Send all batch files in the list-specific directory to the mailing list. X$! This procedure assumes that all the mailing lists are on the BITNET node X$! NDSUVM1, where the ANU-NEWS mailing list is. Since other lists probably X$! aren't on that system, you will need to change this procedure to suit yo Vur X$! individual needs. One possibility is to define a logical for each mailin Vg X$! list, ie: X$! X$! $ define anu-news "anu-news@ndsuvm1" X$! ... X$! X$! and then change the GATENEWS command below to: X$! X$! $ gatenews news_manager_dev:`091MAIL_'Node'`093NEWS.BATCH "''f$trnl(''No Vde')'" X$! X$! At least I think this should work. I haven't actually tried it. X$! X$DO_MAIL_NEWS: X$ X$ ws "Checking for (and forwarding) to BITNET Mailing lists ..." X$ X$ gatenews:==$dua8:`091newsmgr.exe`093gatenews X$ X$DIR_SEARCH_MAIL: X$ on error then goto ABORT X$ Post_Dir = f$search ("NEWS_MANAGER:MAIL_*.DIR",MAIL_Node_Search) X$ if Post_Dir .eqs. "" then RETURN X$ X$ Node = f$parse (Post_Dir,,,"NAME","SYNTAX_ONLY") - "MAIL_" X$ X$ ws "Checking for News to send to node ''Node' ..." X$ Post_Files = f$search ("NEWS_MANAGER_DEV:`091MAIL_"+Node+"`093NEWS.BATCH;* V",MAIL_File_search) X$ if Post_Files .eqs. "" then ws "No News to send" X$ if Post_Files .eqs. "" then goto DIR_SEARCH_MAIL X$ X$ on error then goto DIR_SEARCH_MAIL X$ ws "Send News to mailing lists..." X$ gatenews news_manager_dev:`091MAIL_'Node'`093NEWS.BATCH "''Node'@NDSUVM1" X$ delete news_manager_dev:`091MAIL_'Node'`093NEWS.BATCH; X$ goto DIR_SEARCH_MAIL X$ X$ RETURN X XRemember that the mailing list must be a LISTSERV type mailing list on a BIT VNET Xnode, and you must be running the JNET software from Joiner Associates for a Vll Xthis to work. Let me know if you have any problems. X+-------------------+-------------------------------------+----------------- V-+ X`124 Bob Sloane \Internet: SLOANE@KUHUB.CC.UKANS.EDU/Anything I said V is `124 X`124 Computer Center \ BITNET: SLOANE@UKANVAX.BITNET / my opinion, not V my `124 X`124 University of Kansas\ AT&T: (913) 864-0444 / employer's. V `124 X+-----------------------+-----------------------------+--------------------- V-+ $ CALL UNPACK GATENEWS.TXT;1 1448763146 $ v=f$verify(v) $ EXIT