Relay-Version: version B 2.10 5/3/83; site utzoo.UUCP Posting-Version: version B 2.10.2 9/3/84; site genrad.UUCP Path: utzoo!linus!philabs!cmcl2!seismo!harvard!talcott!panda!genrad!sources-request From: sources-request@genrad.UUCP Newsgroups: mod.sources Subject: rn version 4.3 (kit 2 of 9) Message-ID: <822@genrad.UUCP> Date: Fri, 10-May-85 07:46:16 EDT Article-I.D.: genrad.822 Posted: Fri May 10 07:46:16 1985 Date-Received: Sun, 12-May-85 02:01:43 EDT Sender: john@genrad.UUCP Organization: System Development Corporation R&D, Santa Monica Lines: 2824 Approved: john@genrad.UUCP From: lwall@sdcrdcf.UUCP (Larry Wall) ---------------- cut here --------------- #! /bin/sh # Make a new directory for the rn sources, cd to it, and run kits 1 thru 9 # through sh. When all 9 kits have been run, read README. echo "This is rn kit 2 (of 9). If kit 2 is complete, the line" echo '"'"End of kit 2 (of 9)"'" will echo at the end.' echo "" export PATH || (echo "You didn't use sh, you clunch." ; kill $$) echo Extracting Configure cat >Configure <<'!STUFFY!FUNK!' #! /bin/sh # # If these # comments don't work, trim them. Don't worry about the other # shell scripts, Configure will trim # comments from them for you. # # $Header: Configure,v 4.3 85/05/01 11:31:23 lwall Exp $ # # $Log: Configure,v $ # Revision 4.3 85/05/01 11:31:23 lwall # Baseline for release with 4.3bsd. # # Yes, you may rip this off to use in other distribution packages. n='' c='' libc='' eunicefix='' eunice='' cpp='' shsharp='' spitshell='' startsh='' test='' expr='' sed='' echo='' cat='' rm='' mv='' cp='' tail='' tr='' mkdir='' sort='' uniq='' inews='' grep='' egrep='' contains='' lib='' nametype='' cc='' iandd='' termlib='' jobslib='' ndirlib='' libndir='' usendir='' ndirc='' ndiro='' pager='' mailer='' internet='' rnbin='' filexp='' distlist='' Log='' Header='' sitename='' orgname='' isadmin='' newsadmin='' rnlib='' mansrc='' manext='' maildir='' spool='' active='' myactive='' mininact='' pref='' defeditor='' rootid='' mboxchar='' locpref='' orgpref='' citypref='' statepref='' cntrypref='' contpref='' strchr='' novoid='' novfork='' portable='' passnam='' berknam='' usgnam='' whoami='' termio='' fcntl='' ioctl='' normsig='' havetlib='' getpwent='' gethostname='' douname='' phostname='' hostcmd='' CONFIG='' echo "Beginning of configuration questions for rn kit." : Eunice requires " " instead of "", can you believe it echo " " : sanity checks PATH='.:/bin:/usr/bin:/usr/local/bin:/usr/ucb:/usr/local:/usr/lbin:/etc' export PATH || (echo "OOPS, this isn't sh. Desperation time. I will feed myself to sh."; sh $0; kill $$) if test ! -t 0; then echo "Say 'sh Configure', not 'sh grimble if grep blurfldyick grimble >/dev/null 2>&1 ; then contains=contains else if grep grimblepritz grimble >/dev/null 2>&1 ; then contains=grep else contains=contains fi fi rm grimble : the following should work in any shell case $contains in contains*) echo " " echo "AGH! Grep doesn't return a status. Attempting remedial action." cat >contains <<'EOSS' grep "$1" "$2" >.greptmp && cat .greptmp && test -s .greptmp EOSS chmod 755 contains esac : first determine how to suppress newline on echo command echo "Checking echo to see how to suppress newlines..." (echo "hi there\c" ; echo " ") >.echotmp if $contains c .echotmp >/dev/null 2>&1 ; then echo "...using -n." n='-n' c='' else echo "...using \\\c." n='' c='\c' fi echo $n "Type carriage return to continue. Your cursor should be here-->$c" read ans rm .echotmp : now set up to do reads with possible shell escape : if this does not work on your machine, 1,$s/. myread/read ans/ cat <myread ans='!' while expr "X\$ans" : "X!" >/dev/null; do read ans case "\$ans" in !) sh echo " " echo $n "Your answer: $c" ;; !*) set \`expr "X\$ans" : "X!\(.*\)\$"\` sh -c "\$*" echo " " echo $n "Your answer: $c" ;; esac done EOSC : general instructions cat <<'EOH' This installation shell script will examine your system and ask you questions to determine how rn and its auxiliary files should be installed. If you get stuck on a question, you may use a ! shell escape to start a subshell or execute a command. Many of the questions will have default answers in square brackets--typing carriage return will give you the default. On some of the questions which ask for file or directory names you are allowed to use the ~name construct to specify the login directory belonging to "name", even if you don't have a shell which knows about that. Questions where this is allowed will be marked "(~name ok)". Much effort has been expended to ensure that this shell script will run on any Unix system. If despite that it blows up on you, your best bet is to edit Configure and run it again. (Trying to install rn without having run Configure is well nigh impossible.) Also, let me (lwall@sdcrdcf.UUCP) know how I blew it. This installation script affects things in two ways: 1) it does direct variable substitutions on some of the files included in this kit, and 2) it builds a config.h file for inclusion in C programs. You may edit any of these files as the need arises after running this script. EOH echo $n "[Type carriage return to continue] $c" . myread : get old answers, if there is a config file out there if test -f config.sh; then echo " " echo "(Fetching default answers from your old config.sh file...)" . config.sh fi : get list of predefined functions in a handy place echo " " if test -f /lib/libc.a; then echo "Your C library is in /lib/libc.a. You're normal." libc=/lib/libc.a else if test -f /usr/lib/libc.a; then echo "Your C library is in /usr/lib/libc.a, of all places." libc=/usr/lib/libc.a else if test -f "$libc"; then echo "Your C library is in $libc, like you said before." else cat <<'EOM' I can't seem to find your C library. I've looked for /lib/libc.a and /usr/lib/libc.a, but neither of those are there. What is the full name EOM echo $n "of your C library? $c" . myread libc="$ans" fi fi fi echo " " echo $n "Extracting names from $libc for later perusal...$c" if ar t $libc > libc.list; then echo "done" else echo " " echo "The archiver doesn't think $libc is a reasonable library." exit 1 fi : make some quick guesses about what we are up against echo " " echo $n "Hmm... $c" if $contains SIGTSTP /usr/include/signal.h >/dev/null 2>&1 ; then echo "Looks kind of like a BSD system, but we'll see..." echo exit 0 >bsd echo exit 1 >usg echo exit 1 >v7 else if $contains fcntl.o libc.list >/dev/null 2>&1 ; then echo "Looks kind of like a USG system, but we'll see..." echo exit 1 >bsd echo exit 0 >usg echo exit 1 >v7 else echo "Looks kind of like a version 7 system, but we'll see..." echo exit 1 >bsd echo exit 1 >usg echo exit 0 >v7 fi fi if $contains vmssystem.o libc.list >/dev/null 2>&1 ; then cat <<'EOI' There is, however, a strange, musty smell in the air that reminds me of something...hmm...yes...I've got it...there's a VMS nearby, or I'm a Blit. EOI echo "exit 0" >eunice eunicefix=unixtovms eunice=define : it so happens the Eunice I know will not run shell scripts in Unix format else echo " " echo "Congratulations. You aren't running Eunice." eunicefix=':' eunice=undef echo "exit 1" >eunice fi chmod 755 bsd usg v7 eunice $eunicefix bsd usg v7 eunice : see how we invoke the C preprocessor echo " " echo "Checking to see how your C preprocessor is invoked..." cat <<'EOT' >testcpp.c #define ABC abc #define XYZ xyz ABC+XYZ EOT echo 'Maybe "cc -E" will work...' cc -E testcpp.c >testcpp.out 2>&1 if $contains 'abc+xyz' testcpp.out >/dev/null 2>&1 ; then echo "Yup, it does." cpp='cc -E' else echo 'Nope...maybe "cc -P" will work...' cc -P testcpp.c >testcpp.out 2>&1 if $contains 'abc+xyz' testcpp.out >/dev/null 2>&1 ; then echo "Yup, that does." cpp='cc -P' else echo 'Nixed again...maybe "/lib/cpp" will work...' /lib/cpp testcpp.c >testcpp.out 2>&1 if $contains 'abc+xyz' testcpp.out >/dev/null 2>&1 ; then echo "Hooray, it works! I was beginning to wonder." cpp='/lib/cpp' else echo 'Hmm...maybe you already told me...' case "$cpp" in '') ;; *) $cpp testcpp.c >testcpp.out 2>&1;; esac if $contains 'abc+xyz' testcpp.out >/dev/null 2>&1 ; then echo "Hooray, you did! I was beginning to wonder." else echo "Nope. I can't find a C preprocessor. Name one: $c" . myread cpp="$ans" $cpp testcpp.c >testcpp.out 2>&1 if $contains 'abc+xyz' testcpp.out >/dev/null 2>&1 ; then echo "OK, that will do." else echo "Sorry, I can't get that to work. Go find one." exit 1 fi fi fi fi fi rm -f testcpp.c testcpp.out : check for pdp11 echo " " if usg; then : pdp11 is already defined else cat <<'EOT' >pdp11.c #ifdef pdp11 exit 0 #else exit 1 #endif EOT $cpp pdp11.c | grep exit >pdp11 chmod 755 pdp11 $eunicefix pdp11 rm pdp11.c fi if pdp11; then echo "This looks like a pdp11 to me." else echo "This doesn't look like a pdp11 to me." fi : see if sh knows # comments echo " " echo "Checking your sh to see if it knows about # comments..." if sh -c '#' >/dev/null 2>&1 ; then echo "Your sh handles # comments correctly." shsharp=true spitshell=cat echo " " echo "Okay, let's see if #! works on this system..." echo "#!/bin/echo hi" > try $eunicefix try chmod 755 try try > today if test -s today; then echo "It does." sharpbang='#!' else echo "#! /bin/echo hi" > try $eunicefix try chmod 755 try try > today if test -s today; then echo "It does." sharpbang='#! ' else echo "It doesn't." sharpbang=': use ' fi fi else echo "Your sh doesn't grok # comments--I will strip them later on." shsharp=false echo "exec grep -v '^#'" >spitshell chmod 755 spitshell $eunicefix spitshell spitshell=`pwd`/spitshell echo "I presume that if # doesn't work, #! won't work either!" sharpbang=': use ' fi : figure out how to guarantee sh startup echo " " echo "Checking out how to guarantee sh startup..." startsh=$sharpbang'/bin/sh' echo "Let's see if '$startsh' works..." cat >try <loc $startsh thing=\$1 shift dflt=\$1 shift for dir in \$*; do case "\$thing" in .) if test -d \$dir/\$thing; then echo \$dir exit 0 fi ;; *) if test -f \$dir/\$thing; then echo \$dir/\$thing exit 0 fi ;; esac done echo \$dflt exit 1 EOSC chmod 755 loc $eunicefix loc loclist="expr sed echo cat rm mv cp tail tr mkdir sort uniq grep" trylist="test inews egrep more pg Mcc" for file in $loclist; do xxx=`loc $file $file $pth` eval $file=$xxx case "$xxx" in /*) echo $file is in $xxx. ;; *) echo "I don't know where $file is. I hope it's in everyone's PATH." ;; esac done echo " " echo "Don't worry if any of the following aren't found..." for file in $trylist; do xxx=`loc $file $file $pth` eval $file=$xxx case "$xxx" in /*) echo $file is in $xxx. ;; *) echo "I don't see $file out there, offhand." ;; esac done case $egrep in egrep) echo "Substituting grep for egrep." egrep=$grep ;; *) case "$contains" in grep*) contains=e$contains;; esac ;; esac case $test in test) echo "Hopefully test is built into your sh." ;; /bin/test) echo " " echo $n 'Is your "test" built into sh? [n] (OK to guess) '"$c" . myread case $ans in y*) test=test ;; esac ;; *) test=test ;; esac case $echo in echo) echo "Hopefully echo is built into your sh." ;; /bin/echo) echo " " echo "Checking compatibility between /bin/echo and builtin echo (if any)..." $echo $n "hi there$c" >foo1 echo $n "hi there$c" >foo2 if cmp foo1 foo2 >/dev/null 2>&1; then echo "They are compatible. In fact, they may be identical." else echo "They are not compatible--the echo builtin will be used." echo=echo fi $rm -f foo1 foo2 ;; *) echo=echo ;; esac : decide how portable to be case "$portable" in define) dflt=y;; *) dflt=n;; esac $cat <<'EOH' I can set things up so that your shell scripts and binaries are more portable, at what may be a noticable cost in performance. In particular, if you ask to be portable, the following happens: 1) shell scripts will rely on the PATH variable rather than using the paths derived above. 2) ~username interpretations will be done at run time rather than by Configure. 3) the system name will be determined at run time, if at all possible. EOH $echo $n "Do you expect to run these scripts and binaries on multiple machines? [$dflt] $c" . myread case $ans in '') ans=$dflt;; esac case $ans in y*) portable=define for file in $loclist; do eval $file=$file done ;; *) portable=undef ;; esac : set up shell script to do ~ expansion cat >filexp <&2 exit 1 fi case \$1 in */*) $echo \$dir/\`$expr x\$1 : '..[^/]*/\(.*\)'\` ;; *) $echo \$dir ;; esac fi ;; *) $echo \$1 ;; esac EOSS chmod 755 filexp $eunicefix filexp : now get the site name $echo " " $echo "Figuring out site name..." $echo 'Maybe "hostname" will work...' if ans=`sh -c hostname 2>&1` ; then sitename=$ans hostcmd=hostname else $echo 'No, maybe "uuname -l" will work...' if ans=`sh -c 'uuname -l' 2>&1` ; then sitename=$ans hostcmd='uuname -l' else $echo 'Strange. Maybe "uname -n" will work...' if ans=`sh -c 'uname -n' 2>&1` ; then sitename=$ans hostcmd='uname -n' else $echo 'Oh well, maybe I can mine it out of whoami.h...' if ans=`sh -c $contains' sysname /usr/include/whoami.h' 2>&1` ; then sitename=`$echo "$ans" | $sed 's/^.*"\(.*\)"/\1/'` hostcmd="sed -n -e '"'/sysname/s/^.*\"\\(.*\\)\"/\1/{'"' -e p -e q -e '}' /dev/null 2>&1 ; then dflt=news else if $contains "^usenet:" /etc/passwd >/dev/null 2>&1 ; then dflt=news else if eunice; then dflt=system else dflt=root fi fi fi ;; *) dflt="$newsadmin" ;; esac cat <<'EOM' Many systems keep their news in a private directory, or have a non-superuser in charge of administering news. (If you don't have such a user, take the default answer.) What is the login name (not directory) that is used for news EOM echo $n "administration? [$dflt] $c" . myread newsadmin="$ans" case $newsadmin in '') newsadmin=$dflt ;; esac case $newsadmin in root) isadmin=undef ;; *) isadmin=define ;; esac : figure out news library case "$lib" in '') dflt=/usr/lib/news ;; *) dflt=$lib ;; esac libexp=$lib libexp='blurfl/dyick' while $test ! -d "$libexp"; do $echo " " case "$libexp" in blurfl*) ;; *) $echo "Directory $libexp not found";; esac echo $n "Where is your news library (~name okay)? [$dflt] $c" . myread case "$ans" in '') ans="$dflt";; esac lib="$ans" case $lib in ~*) libexp=`filexp $lib` echo "(That is $libexp on this particular system.)" case $portable in undef) lib=$libexp ;; esac ;; *) libexp=$lib ;; esac done if $test -f $libexp/inews; then echo "Aha! Inews is really in $libexp! Maybe this is 2.10.2..." case $inews in inews) : null ;; *) echo "(Make sure $inews isn't an old version.)" ;; esac inews=$libexp/inews fi : determine where manual pages go case "$mansrc" in '') dflt=`loc . /usr/man/man1 /usr/man/mann /usr/man/local/man1 /usr/man/u_man/man1 /usr/man/man1` ;; *) dflt="$mansrc" ;; esac mansrc='blurfl/dyick' while $test ! -d "$mansrc" ; do case $mansrc in blurfl*) ;; *) $echo "$mansrc does not appear to exist." ;; esac $echo " " $echo $n "Where do the manual pages (source) go? [$dflt] $c" . myread mansrc=`filexp "$ans"` case $mansrc in '') mansrc=$dflt ;; esac done case "$mansrc" in *l) manext=l ;; *n) manext=n ;; *) manext=1 ;; esac : determine where mail is spooled case "$maildir" in '') dflt=`loc . /usr/spool/mail /usr/spool/mail /usr/mail` ;; *) dflt="$maildir" ;; esac maildir='blurfl/dyick' while $test ! -d "$maildir" ; do case $maildir in blurfl*) ;; *) $echo "$maildir does not appear to exist." ;; esac $echo " " $echo $n "Where is yet-to-be-read mail spooled? [$dflt] $c" . myread maildir=`filexp "$ans"` case $maildir in '') maildir=$dflt ;; esac done : find out how to find out full name $echo " " case "$berkname" in define) dflt=y;; undef) dflt=n;; *) if bsd; then dflt=y else dflt=n fi ;; esac $echo "Does your /etc/passwd file keep full names in Berkeley/V7 format (name first" $echo $n "thing after ':' in GCOS field)? [$dflt] $c" . myread case $ans in '') ans=$dflt ;; esac case $ans in y*) passnam=define berknam=define usgnam=undef nametype=bsd ;; *) $echo " " case "$usgname" in define) dflt=y;; undef) dflt=n;; *) if usg; then dflt=y else dflt=n fi ;; esac $echo "Does your passwd file keep full names in USG format (name sandwiched" $echo $n "between a '-' and a '(')? [$dflt] $c" . myread case $ans in '') ans=$dflt ;; esac case $ans in n*) $echo "Full name will be taken from ~/.fullname" passnam=undef berknam=undef usgnam=undef nametype=other ;; *) passnam=define berknam=undef usgnam=define nametype=usg ;; esac ;; esac : see if we need a special compiler $echo " " if usg; then case "$cc" in '') case "$Mcc" in /*) dflt='Mcc' ;; *) if $contains '\-M' $mansrc/cc.1 >/dev/null 2>&1 ; then dflt='cc -M' else dflt='cc' fi ;; esac ;; *) dflt="$cc";; esac $cat <<'EOM' On some systems the default C compiler will not resolve multiple global references that happen to have the same name. On some such systems the "Mcc" command may be used to force these to be resolved. On other systems a "cc -M" command is required. What command will force resolution on EOM $echo $n "this system? [$dflt] $c" . myread cc="$ans" case "$cc" in '') cc="$dflt" ;; esac else $echo "Not a USG system--assuming cc can resolve multiple definitions." cc=cc fi : see if we should throw a -i into the Makefile $echo " " if pdp11; then if $contains '\-i' $mansrc/cc.1 >/dev/null 2>&1 ; then $echo $n "Your system appears to have separate I and D space. Is this true? [y] $c" . myread case $ans in n*|f*) iandd='' ;; *) iandd='-i' ;; esac else $echo "Your system appears to NOT have separate I and D space." $echo $n "Is this correct? [y] $c" . myread case $ans in n*|f*) iandd='-i' ;; *) iandd='' ;; esac fi else $echo "Not a pdp11--assuming no separate I and D." fi : index or strcpy $echo " " if $contains index.o libc.list >/dev/null 2>&1 ; then $echo "Your system appears to use index() and rindex() rather than strchr()" $echo $n "and strrchr(). Is this correct? [y] $c" . myread case $ans in n*|f*) strchr='define' ;; *) strchr='undef' ;; esac else $echo "Your system appears to use strchr() and strrchr() rather than index()" $echo $n "and rindex(). Is this correct? [y] $c" . myread case $ans in n*|f*) strchr=undef ;; *) strchr=define ;; esac fi : determine how to determine when a file is a mailbox case "$mboxchar" in '') dflt=F;; *) dflt="$mboxchar";; esac $cat <<'EOM' In saving articles, rn wants to differentiate between saving to mailbox format files and normal files. It does this by examining the first character of the file in question. On most systems the first line starts "From...", so the first character is F. On other systems there are magic cookies like control codes between articles, so one of those would be first. On your system, if a file is in mailbox format, what is the first character of EOM echo $n "that file? [$dflt] $c" . myread mboxchar="$ans" case $mboxchar in '') mboxchar="$dflt" ;; esac case $mboxchar in 'F') ;; *) cat <<'EOM' You will need to edit the shell script mbox.saver to properly append an article to a mailbox. The arguments to the script are documented in EOM case $shsharp in false) echo "comments in mbox.saver.std." ;; true) echo "comments in the shell script itself." ;; esac esac : where do we get termlib routines from $echo " " if $test -d /usr/lib/terminfo || $test -d /etc/term; then termlib='-lcurses' havetlib=define $echo "Terminfo library found." else if loc libtermlib.a x /usr/lib /usr/local/lib /lib >/dev/null; then termlib='-ltermlib' havetlib=define $echo "Termlib library found." else if loc libtermcap.a x /usr/lib /usr/local/lib /lib >/dev/null; then termlib='-ltermcap' havetlib=define $echo "Termcap library found." else case "$termlib" in '') $echo $n "Your system appears to NOT have termlib-style routines. Is this true? [y] $c" . myread case $ans in n*|f*) havetlib=define $echo "Then where are the termlib-style routines kept (specify either -llibname" $echo $n " or full pathname (~name ok))? $c" . myread termlib=`filexp $ans` ;; *) havetlib=undef termlib='' $echo "You will have to play around with term.c then." ;; esac $echo " " ;; *) $echo "You said termlib was $termlib before." ;; esac fi fi fi : see if there is a whoami file if $test -r /usr/include/whoami.h ; then whoami=define $echo "whoami.h found." else whoami=undef fi : see if this is a termio system if $test -r /usr/include/termio.h ; then termio=define $echo "termio.h found." else if $test -r /usr/include/sgtty.h ; then termio=undef $echo "sgtty.h found." else termio=undef $echo "Neither termio.h nor sgtty.h found--you could have problems." fi fi : see if this is a termio system if $test -r /usr/include/fcntl.h ; then fcntl=define $echo "fcntl.h found." else fcntl=undef $echo "No fcntl.h found, but that's ok." fi : see if ioctl defs are in sgtty/termio or sys/ioctl if $test -r /usr/include/sys/ioctl.h ; then ioctl=define $echo "sys/ioctl.h found." else ioctl=undef $echo "sys/ioctl.h not found, assuming ioctl args are defined in sgtty.h." fi : see if there is a vfork if $contains vfork.o libc.list >/dev/null 2>&1 ; then $echo "vfork() found." novfork='undef' else $echo "No vfork() found--will use fork() instead." novfork='define' fi : see if there is a getpw if $contains getpw.o libc.list >/dev/null 2>&1 ; then $echo "getpw() found." getpwent='undef' else $echo "No getpw() found--will use getpwent() instead." getpwent='define' fi : see how we will look up site name douname=undef gethostname=undef phostname=undef if $contains gethostname.o libc.list >/dev/null 2>&1 ; then $echo "gethostname() found." gethostname=define else if $contains uname.o libc.list >/dev/null 2>&1 ; then $echo "uname() found." douname=define else case $hostcmd in '') ;; *) $cat </dev/null 2>&1 ; then $echo "No ndir library found, but you have readdir() so we'll use that." usendir=undef ndirc='' ndiro='' else $echo "No ndir library found and no readdir() found--using ./ndir.c." usendir=define ndirc='ndir.c' ndiro='ndir.o' fi fi : locate spool directory case "$spool" in '') dflt=/usr/spool/news ;; *) dflt="$spool";; esac ans='blurfl/dyick' while $test ! -d $ans; do $echo " " case "$ans" in blurfl*);; *) echo "Directory $ans not found.";; esac $echo $n "Where is news spooled (~name ok)? [$dflt] $c" . myread case "$ans" in '') ans="$dflt";; esac spool="$ans" case $spool in ~*) ans=`filexp $spool` echo "(That is $ans on this particular system.)" case $portable in undef) spool=$ans ;; esac ;; *) ans=$spool ;; esac done : locate active file case "$active" in '') dflt=$lib/active ;; *) dflt="$active";; esac myactive='blurfl/dyick' while $test ! -f "$myactive"; do $echo " " case "$myactive" in blurfl*);; *) "File $myactive not found.";; esac $echo $n "Where is the active file (~name ok)? [$dflt] $c" . myread case "$ans" in '') ans="$dflt";; esac active="$ans" case $active in ~*) myactive=`filexp $active` echo "(That is $myactive on this particular system.)" case $portable in undef) active=$myactive ;; esac ;; *) myactive=$active ;; esac if $test -d $myactive ; then myactive=$myactive/active active=$active/active fi done : check for 2.10.2 echo " " if $contains ' [0-9][0-9]* [0-9]' "$myactive" >/dev/null 2>&1; then echo "Looks like you are running at least 2.10.2 news." mininact=define else echo "It doesn't look like you are running 2.10.2 news yet. Are you planning" echo $n "to install it in the near future? [y] $c" . myread case $ans in n*) mininact=undef ;; *) mininact=define ;; esac fi : check for void type $echo " " $echo "Checking to see if your C compiler groks the void type..." $cat >try.c <<'EOCP' void main(); EOCP if cc -c try.c >/dev/null 2>&1 ; then novoid='undef' $echo "Yup, it does." else novoid='define' $echo "Nope, it doesn't (boo hiss). I will substitute int." fi $rm try.* : find out which shell people like to use most ans='blurfl/dyick' while $test ! -f "$ans" ; do case $ans in blurfl*) ;; *) $echo "$ans does not appear to exist." ;; esac case "$pref" in '') if $test -f /bin/ksh; then dflt='/bin/ksh' else if $test -f /bin/csh; then dflt='/bin/csh' else dflt='/bin/sh' fi fi ;; *) dflt="$pref";; esac $echo " " $echo "Give the full path name of the shell most people like to use on your" $echo $n "system: [$dflt] $c" . myread case $ans in '') ans=$dflt ;; esac done pref=$ans : locate the preferred pager for this system case "$pager" in '') case $pg in /*) dflt=$pg ;; esac case $more in /*) dflt=$more ;; esac case $dflt in '') dflt=/usr/ucb/more ;; esac ;; *) dflt="$pager";; esac pager='blurfl/dyick' while $test ! -f "$pager" ; do case $pager in blurfl*) $echo " " $echo "(If your kernel does terminal paging then you may answer this with '/bin/cat'.)" ;; /*) $echo "$pager does not appear to exist." $echo " " ;; *) $echo "Please give the full path name." $echo " " ;; esac $echo $n "What pager is used on your system? [$dflt] $c" . myread pager="$ans" case $pager in '') pager="$dflt" ;; esac done : determine default editor case "$defeditor" in '') dflt=/usr/ucb/vi ;; *) dflt="$defeditor" ;; esac defeditor='blurfl/dyick' while $test ! -f "$defeditor" ; do case $defeditor in blurfl*) ;; *) $echo "$defeditor does not appear to exist." ;; esac $echo " " $echo $n "What is the default editor on your system? [$dflt] $c" . myread defeditor="$ans" case $defeditor in '') defeditor=$dflt ;; esac done : determine mailer for Rnmail to use echo " " if $test -f /usr/lib/sendmail; then mailer=/usr/lib/sendmail else if usg && $test -f $libexp/recmail; then mailer=$libexp/recmail else mailer=/bin/mail fi fi echo "Mail sender is $mailer" : check for internet mailer case "$internet" in define) dflt=y;; undef) dflt=n;; *) dflt=n;; esac cat < .distlist fi $cat <<'EOH' Distribution groups are the things you use on the Distribution line to limit where an article will go to. You are likely to be a member of several distribution groups, such as organization, city, state, province, country, continent, etc. For example, Los Angeles has the distribution prefix "la", New Jersey has the prefix "nj", and Europe has the prefix "eunet". The categories you will be asked are: local organization (Could be just one machine or a cluster or an office) organization att, dec, kgb, ... city la, ny, mosc, ... state/province ca, nj, bc, ... country usa, can, rok, whatever continent na (North America, not "Not Applicable"), asia, etc. (If you don't have a distribution prefix in any of these categories then just hit return.) EOH if $test -f .distlist; then distlist=`tr '\012' ' ' <.distlist` if $test "$distlist" ; then $echo "(These are the distributions in your sys file: $distlist)" $echo " " fi fi case "$locpref" in '') dflt="";; *) dflt="[$locpref] ";; esac $echo $n "What is the distribution prefix for your local organization? $dflt$c" . myread case "$ans" in '') ;; *) locpref="$ans";; esac case $locpref in '') locpref=none ;; esac case "$orgpref" in '') dflt="";; *) dflt="[$orgpref] ";; esac $echo $n "What is the distribution prefix for your organization? $dflt$c" . myread case "$ans" in '') ;; *) orgpref="$ans";; esac case $orgpref in '') orgpref=none ;; esac case "$citypref" in '') dflt="";; *) dflt="[$citypref] ";; esac $echo $n "What is the distribution prefix for your city? $dflt$c" . myread case "$ans" in '') ;; *) citypref="$ans";; esac case $citypref in '') citypref=none ;; esac case "$statepref" in '') dflt="";; *) dflt="[$statepref] ";; esac $echo $n "What is the distribution prefix for your state/province? $dflt$c" . myread case "$ans" in '') ;; *) statepref="$ans";; esac case $statepref in '') statepref=none ;; esac case "$cntrypref" in '') dflt="";; *) dflt="[$cntrypref] ";; esac $echo $n "What is the distribution prefix for your country? $dflt$c" . myread case "$ans" in '') ;; *) cntrypref="$ans";; esac case $cntrypref in '') cntrypref=none ;; esac case "$contpref" in '') dflt="";; *) dflt="[$contpref] ";; esac $echo $n "What is the distribution prefix for your continent? $dflt$c" . myread case "$ans" in '') ;; *) contpref="$ans";; esac case $contpref in '') contpref=none ;; esac $echo " " $echo "If you have any other distribution groups you will need to edit Pnews" $echo "and newsetup to add them." $echo " " : determine root id rootid=`$sed config.sh $startsh # config.sh # This file was produced by running the Configure script. n="$n" c="$c" libc="$libc" eunicefix="$eunicefix" eunice="$eunice" cpp="$cpp" shsharp="$shsharp" startsh="$startsh" spitshell="$spitshell" test="$test" expr="$expr" sed="$sed" echo="$echo" cat="$cat" rm="$rm" mv="$mv" cp="$cp" tail="$tail" tr="$tr" mkdir="$mkdir" sort="$sort" uniq="$uniq" inews="$inews" grep="$grep" egrep="$egrep" contains="$contains" lib="$lib" libexp="$libexp" nametype="$nametype" cc="$cc" iandd="$iandd" termlib="$termlib" jobslib="$jobslib" ndirlib="$ndirlib" libndir="$libndir" usendir="$usendir" ndirc="$ndirc" ndiro="$ndiro" pager="$pager" mailer="$mailer" internet="$internet" rnbin="$rnbin" filexp="$filexp" distlist="$distlist" Log="$Log" Header="$Header" sitename="$sitename" orgname="$orgname" isadmin="$isadmin" newsadmin="$newsadmin" rnlib="$rnlib" mansrc="$mansrc" manext="$manext" maildir="$maildir" spool="$spool" active="$active" myactive="$myactive" mininact="$mininact" pref="$pref" defeditor="$defeditor" rootid="$rootid" mboxchar="$mboxchar" locpref="$locpref" orgpref="$orgpref" citypref="$citypref" statepref="$statepref" cntrypref="$cntrypref" contpref="$contpref" strchr="$strchr" novoid="$novoid" novfork="$novfork" portable="$portable" passnam="$passnam" berknam="$berknam" usgnam="$usgnam" whoami="$whoami" termio="$termio" fcntl="$fcntl" ioctl="$ioctl" normsig="$normsig" havetlib="$havetlib" getpwent="$getpwent" gethostname="$gethostname" douname="$douname" phostname="$phostname" hostcmd="$hostcmd" CONFIG=true EOT : create config.h file $echo " " $echo "Creating config.h..." $cat <config.h /* config.h * This file was produced by running the Configure script. * Feel free to modify any of this as the need arises. */ /* name of the site. May be overridden by gethostname, uname, etc. */ #define SITENAME "$sitename" /* name of the organization, may be a file name */ #define ORGNAME "$orgname" /* login name of news administrator, if any. */ #$isadmin NEWSADMIN "$newsadmin" /* news library, may use only ~ and %l expansion */ #define LIB "$lib" /* rn private library, may use ~ expansion, %x and %l */ #define RNLIB "$rnlib" /* location of the news spool directory, may use ~ expansion, %x and %l */ #define SPOOL "$spool" /* location of the active file, may use ~ expansion, %x and %l */ #define ACTIVE "$active" /* location of spooled mail */ #define MAILFILE "$maildir/%L" /* default shell--ok to be a slow shell like csh */ #define PREFSHELL "$pref" /* default editor */ #define DEFEDITOR "$defeditor" /* root uid */ #define ROOTID $rootid /* what is the first character of a mailbox? */ #define MBOXCHAR '$mboxchar' /* how to cancel an article */ #define CANCEL "$inews -h <%h" /* distribution groups */ #define LOCDIST "$locpref" #define ORGDIST "$orgpref" #define CITYDIST "$citypref" #define STATEDIST "$statepref" #define CNTRYDIST "$cntrypref" #define CONTDIST "$contpref" #$strchr index strchr /* cultural */ #$strchr rindex strrchr /* differences? */ #$novoid void int /* is void to be avoided? */ #$novfork vfork fork /* is vfork too virtual? */ #$eunice EUNICE /* no linking? */ #$eunice VMS /* not currently used, here just in case */ #$usendir USENDIR /* include ndir.c? */ #$libndir LIBNDIR /* include /usr/include/ndir.h? */ #$mininact MININACT /* include 2.10.2 optimization? */ #$portable PORTABLE /* do we do extra lookups to start up? */ #$passnam PASSNAMES /* do names come from the passwd file? */ /* (undef to take name from ~/.fullname) */ #$berknam BERKNAMES /* if so, are they Berkeley format? */ /* (that is, ":name,stuff:") */ #$usgnam USGNAMES /* or are they USG format? */ /* (that is, ":stuff-name(stuff):") */ #$whoami WHOAMI /* should we include whoami.h? */ #$termio TERMIO /* is this a termio system? */ #$fcntl FCNTL /* should we include fcntl.h? */ #$ioctl IOCTL /* are ioctl args all defined in one place? */ #$normsig NORMSIG /* use signal rather than sigset? */ #$havetlib HAVETERMLIB /* do we have termlib-style routines? */ #$getpwent GETPWENT /* need we include slow getpwent? */ #$internet INTERNET /* does our mailer do INTERNET addressing? */ #$gethostname GETHOSTNAME /* do we have a gethostname function? */ #$douname DOUNAME /* do we have a uname function? */ #$phostname PHOSTNAME "$hostcmd" /* how to get host name with popen */ EOT CONFIG=true $rm -f libc.list .distlist kit*isdone echo " " echo "Doing variable substitutions on various files..." echo " " set `$grep makedepend.out &"' echo $n "Would you like me to run it for you (it takes quite a while)? [n] $c" . myread case "$ans" in y*) makedepend;; esac : end of Configure !STUFFY!FUNK! echo Extracting rcstuff.c cat >rcstuff.c <<'!STUFFY!FUNK!' /* $Header: rcstuff.c,v 4.3 85/05/01 11:45:56 lwall Exp $ * * $Log: rcstuff.c,v $ * Revision 4.3 85/05/01 11:45:56 lwall * Baseline for release with 4.3bsd. * */ #include "EXTERN.h" #include "common.h" #include "util.h" #include "ngdata.h" #include "term.h" #include "final.h" #include "rn.h" #include "intrp.h" #include "only.h" #include "rcln.h" #include "INTERN.h" #include "rcstuff.h" char *rcname INIT(Nullch); /* path name of .newsrc file */ char *rctname INIT(Nullch); /* path name of temp .newsrc file */ char *rcbname INIT(Nullch); /* path name of backup .newsrc file */ char *softname INIT(Nullch); /* path name of .rnsoft file */ FILE *rcfp INIT(Nullfp); /* .newsrc file pointer */ #ifdef HASHNG short hashtbl[HASHSIZ]; #endif bool rcstuff_init() { register NG_NUM newng; register char *s; register int i; register bool foundany = FALSE; char *some_buf; long length; #ifdef HASHNG for (i=0; i= MAXRCLINE) { /* check for overflow */ fputs("Too many lines in .newsrc\n",stdout) FLUSH; finalize(1); } if (tmpfp != Nullfp && fgets(tmpbuf,10,tmpfp) != Nullch) softptr[newng] = atoi(tmpbuf); else softptr[newng] = 0; some_buf[--length] = '\0'; /* wipe out newline */ if (some_buf == buf) { rcline[newng] = savestr(some_buf); /* make a semipermanent copy */ } else { /*NOSTRICT*/ #ifndef lint some_buf = saferealloc(some_buf,(MEM_SIZE)(length+1)); #endif lint rcline[newng] = some_buf; } #ifdef NOTDEF if (strnEQ(some_buf,"to.",3)) { /* is this a non-newsgroup? */ nextrcline--; /* destroy this line */ continue; } #endif if (*some_buf == ' ' || *some_buf == '\t' || strnEQ(some_buf,"options",7)) { /* non-useful line? */ toread[newng] = TR_JUNK; rcchar[newng] = ' '; rcnums[newng] = 0; continue; } for (s = rcline[newng]; *s && *s != ':' && *s != NEGCHAR; s++) ; if (!*s) { #ifndef lint rcline[newng] = saferealloc(rcline[newng],(MEM_SIZE)length+2); #endif lint s = rcline[newng] + length; *s = ':'; *(s+1) = '\0'; } rcchar[newng] = *s; /* salt away the : or ! */ rcnums[newng] = (char)(s - rcline[newng]); rcnums[newng]++; /* remember where it was */ *s = '\0'; /* null terminate newsgroup name */ #ifdef HASHNG if (!checkflag) sethash(newng); #endif if (rcchar[newng] == NEGCHAR) { toread[newng] = TR_UNSUB; continue; } /* now find out how much there is to read */ if (!inlist(buf) || (suppress_cn && foundany && !paranoid)) toread[newng] = TR_NONE; /* no need to calculate now */ else set_toread(newng); #ifdef VERBOSE if (!checkflag && softmisses == 1) { softmisses++; /* lie a little */ fputs("(Revising soft pointers--be patient.)\n",stdout) FLUSH; } #endif if (toread[newng] > TR_NONE) { /* anything unread? */ if (!foundany) { starthere = newng; foundany = TRUE; /* remember that fact*/ } if (suppress_cn) { /* if no listing desired */ if (checkflag) { /* if that is all they wanted */ finalize(1); /* then bomb out */ } } else { #ifdef VERBOSE IF(verbose) printf("Unread news in %-20s %5ld article%s\n", rcline[newng],(long)toread[newng], toread[newng]==TR_ONE ? nullstr : "s") FLUSH; ELSE #endif #ifdef TERSE printf("%s: %ld article%s\n", rcline[newng],(long)toread[newng], toread[newng]==TR_ONE ? nullstr : "s") FLUSH; #endif if (int_count) { countdown = 1; int_count = 0; } if (countdown) { if (! --countdown) { fputs("etc.\n",stdout) FLUSH; if (checkflag) finalize(1); suppress_cn = TRUE; } } } } } fclose(rcfp); /* close .newsrc */ if (tmpfp != Nullfp) fclose(tmpfp); /* close .rnsoft */ if (checkflag) { /* were we just checking? */ finalize(foundany); /* tell them what we found */ } if (paranoid) cleanup_rc(); #ifdef DEBUGGING if (debug & DEB_HASH) { page_init(); for (i=0; i= TR_NONE; } /* add a newsgroup to the .newsrc file (eventually) */ NG_NUM add_newsgroup(ngn) char *ngn; { register NG_NUM newng = nextrcline++; /* increment max rcline index */ rcnums[newng] = strlen(ngn) + 1; rcline[newng] = safemalloc((MEM_SIZE)(rcnums[newng] + 1)); strcpy(rcline[newng],ngn); /* and copy over the name */ *(rcline[newng] + rcnums[newng]) = '\0'; rcchar[newng] = ':'; /* call it subscribed */ toread[newng] = TR_NONE; /* just for prettiness */ #ifdef HASHNG sethash(newng); /* so we can find it again */ #endif #ifdef RELOCATE return relocate_newsgroup(newng,-1); #else return newng; #endif } #ifdef RELOCATE NG_NUM relocate_newsgroup(ngx,newng) NG_NUM ngx; NG_NUM newng; { char *dflt = (ngx!=current_ng ? "$^.L" : "$^L"); char *tmprcline; ART_UNREAD tmptoread; char tmprcchar; char tmprcnums; ACT_POS tmpsoftptr; register NG_NUM i; #ifdef DEBUGGING ART_NUM tmpngmax; #endif #ifdef CACHEFIRST ART_NUM tmpabs1st; #endif starthere = 0; /* Disable this optimization */ writesoft = TRUE; /* Update soft pointer file */ if (ngx < nextrcline-1) { #ifdef HASHNG for (i=0; i ngx) --hashtbl[i]; else if (hashtbl[i] == ngx) hashtbl[i] = nextrcline-1; } #endif tmprcline = rcline[ngx]; tmptoread = toread[ngx]; tmprcchar = rcchar[ngx]; tmprcnums = rcnums[ngx]; tmpsoftptr = softptr[ngx]; #ifdef DEBUGGING tmpngmax = ngmax[ngx]; #endif #ifdef CACHEFIRST tmpabs1st = abs1st[ngx]; #endif for (i=ngx+1; i ngx) current_ng--; if (newng < 0) { reask_reloc: unflush_output(); /* disable any ^O in effect */ #ifdef VERBOSE IF(verbose) printf("\nPut newsgroup where? [%s] ", dflt); ELSE #endif #ifdef TERSE printf("\nPut where? [%s] ", dflt); #endif fflush(stdout); reinp_reloc: eat_typeahead(); getcmd(buf); if (errno || *buf == '\f') { /* if return from stop signal */ goto reask_reloc; /* give them a prompt again */ } setdef(buf,dflt); #ifdef VERIFY printcmd(); #endif if (*buf == 'h') { #ifdef VERBOSE IF(verbose) { printf("\n\n\ Type ^ to put the newsgroup first (position 0).\n\ Type $ to put the newsgroup last (position %d).\n", nextrcline-1); printf("\ Type . to put it before the current newsgroup (position %d).\n", current_ng); printf("\ Type -newsgroup name to put it before that newsgroup.\n\ Type +newsgroup name to put it after that newsgroup.\n\ Type a number between 0 and %d to put it at that position.\n", nextrcline-1); printf("\ Type L for a listing of newsgroups and their positions.\n") FLUSH; } ELSE #endif #ifdef TERSE { printf("\n\n\ ^ to put newsgroup first (pos 0).\n\ $ to put last (pos %d).\n", nextrcline-1); printf("\ . to put before current newsgroup (pos %d).\n", current_ng); printf("\ -newsgroup to put before newsgroup.\n\ +newsgroup to put after.\n\ number in 0-%d to put at that pos.\n", nextrcline-1); printf("\ L for list of .newsrc.\n") FLUSH; } #endif goto reask_reloc; } else if (*buf == 'L') { putchar('\n') FLUSH; list_newsgroups(); goto reask_reloc; } else if (isdigit(*buf)) { if (!finish_command(TRUE)) /* get rest of command */ goto reinp_reloc; newng = atoi(buf); if (newng < 0) newng = 0; if (newng >= nextrcline) return nextrcline-1; } else if (*buf == '^') { putchar('\n') FLUSH; newng = 0; } else if (*buf == '$') { putchar('\n') FLUSH; return nextrcline-1; } else if (*buf == '.') { putchar('\n') FLUSH; newng = current_ng; } else if (*buf == '-' || *buf == '+') { if (!finish_command(TRUE)) /* get rest of command */ goto reinp_reloc; newng = find_ng(buf+1); if (newng == nextrcline) { fputs("Not found.",stdout) FLUSH; goto reask_reloc; } if (*buf == '+') newng++; } else { printf("\n%s",hforhelp) FLUSH; settle_down(); goto reask_reloc; } } if (newng < nextrcline-1) { #ifdef HASHNG for (i=0; i= newng) ++hashtbl[i]; } #endif tmprcline = rcline[nextrcline-1]; tmptoread = toread[nextrcline-1]; tmprcchar = rcchar[nextrcline-1]; tmprcnums = rcnums[nextrcline-1]; tmpsoftptr = softptr[nextrcline-1]; #ifdef DEBUGGING tmpngmax = ngmax[nextrcline-1]; #endif #ifdef CACHEFIRST tmpabs1st = abs1st[nextrcline-1]; #endif for (i=nextrcline-2; i>=newng; i--) { rcline[i+1] = rcline[i]; toread[i+1] = toread[i]; rcchar[i+1] = rcchar[i]; rcnums[i+1] = rcnums[i]; softptr[i+1] = softptr[i]; #ifdef DEBUGGING ngmax[i+1] = ngmax[i]; #endif #ifdef CACHEFIRST abs1st[i+1] = abs1st[i]; #endif } rcline[newng] = tmprcline; toread[newng] = tmptoread; rcchar[newng] = tmprcchar; rcnums[newng] = tmprcnums; softptr[newng] = tmpsoftptr; #ifdef DEBUGGING ngmax[newng] = tmpngmax; #endif #ifdef CACHEFIRST abs1st[newng] = tmpabs1st; #endif } if (current_ng >= newng) current_ng++; return newng; } #endif /* List out the newsrc with annotations */ void list_newsgroups() { register NG_NUM i; char tmpbuf[2048]; static char *status[] = {"(READ)","(UNSUB)","(BOGUS)","(JUNK)"}; int cmd; page_init(); print_lines("\ # Status Newsgroup\n\ ",STANDOUT); for (i=0; i= 0) set_toread(i); *(rcline[i] + rcnums[i] - 1) = rcchar[i]; if (toread[i] > 0) sprintf(tmpbuf,"%3d %6d ",i,toread[i]); else sprintf(tmpbuf,"%3d %7s ",i,status[-toread[i]]); safecpy(tmpbuf+13,rcline[i],2034); *(rcline[i] + rcnums[i] - 1) = '\0'; if (cmd = print_lines(tmpbuf,NOMARKING)) { if (cmd > 0) pushchar(cmd); break; } } int_count = 0; } /* find a newsgroup in .newsrc */ NG_NUM find_ng(ngnam) char *ngnam; { register NG_NUM ngnum; #ifdef HASHNG register int hashix = hash(ngnam); register int incr = 1; while ((ngnum = hashtbl[hashix]) >= 0) { if (strEQ(rcline[ngnum], ngnam) && toread[ngnum] >= TR_UNSUB) return ngnum; hashix = (hashix + incr) % HASHSIZ; incr += 2; /* offsets from original are in n*2 */ } return nextrcline; /* = notfound */ #else /* just do linear search */ for (ngnum = 0; ngnum < nextrcline; ngnum++) { if (strEQ(rcline[ngnum],ngnam)) break; } return ngnum; #endif } void cleanup_rc() { register NG_NUM ngx; register NG_NUM bogosity = 0; #ifdef VERBOSE IF(verbose) fputs("Checking out your .newsrc--hang on a second...\n",stdout) FLUSH; ELSE #endif #ifdef TERSE fputs("Checking .newsrc--hang on...\n",stdout) FLUSH; #endif for (ngx = 0; ngx < nextrcline; ngx++) { if (toread[ngx] >= TR_UNSUB) { set_toread(ngx); /* this may reset newsgroup */ /* or declare it bogus */ } if (toread[ngx] == TR_BOGUS) bogosity++; } for (ngx = nextrcline-1; ngx >= 0 && toread[ngx] == TR_BOGUS; ngx--) bogosity--; /* discount already moved ones */ if (nextrcline > 5 && bogosity > nextrcline / 2) { fputs( "It looks like the active file is messed up. Contact your news administrator,\n\ ",stdout); fputs( "leave the \"bogus\" groups alone, and they may come back to normal. Maybe.\n\ ",stdout) FLUSH; } #ifdef RELOCATE else if (bogosity) { #ifdef VERBOSE IF(verbose) fputs("Moving bogus newsgroups to the end of your .newsrc.\n", stdout) FLUSH; ELSE #endif #ifdef TERSE fputs("Moving boguses to the end.\n",stdout) FLUSH; #endif for (; ngx >= 0; ngx--) { if (toread[ngx] == TR_BOGUS) relocate_newsgroup(ngx,nextrcline-1); } #ifdef DELBOGUS reask_bogus: in_char("Delete bogus newsgroups? [ny] "); putchar('\n') FLUSH; setdef(buf,"n"); #ifdef VERIFY printcmd(); #endif if (*buf == 'h') { #ifdef VERBOSE IF(verbose) fputs("\ Type y to delete bogus newsgroups.\n\ Type n or SP to leave them at the end in case they return.\n\ ",stdout) FLUSH; ELSE #endif #ifdef TERSE fputs("y to delete, n to keep\n",stdout) FLUSH; #endif goto reask_bogus; } else if (*buf == 'n' || *buf == 'q') ; else if (*buf == 'y') { while (toread[nextrcline-1] == TR_BOGUS && nextrcline > 0) --nextrcline; /* real tough, huh? */ } else { fputs(hforhelp,stdout) FLUSH; settle_down(); goto reask_bogus; } #endif } #else #ifdef VERBOSE IF(verbose) fputs("You should edit bogus newsgroups out of your .newsrc.\n", stdout) FLUSH; ELSE #endif #ifdef TERSE fputs("Edit boguses from .newsrc.\n",stdout) FLUSH; #endif #endif paranoid = FALSE; } #ifdef HASHNG /* make an entry in the hash table for the current newsgroup */ void sethash(thisng) NG_NUM thisng; { register int hashix = hash(rcline[thisng]); register int incr = 1; #ifdef DEBUGGING static int hashhits = 0, hashtries = 0; #endif #ifdef DEBUGGING hashtries++; #endif while (hashtbl[hashix] >= 0) { #ifdef DEBUGGING hashhits++; if (debug & DEB_HASH) { printf(" Hash hits: %d / %d\n",hashhits, hashtries) FLUSH; } hashtries++; #endif hashix = (hashix + incr) % HASHSIZ; incr += 2; /* offsets from original are in n*2 */ } hashtbl[hashix] = thisng; } short prime[] = {1,2,-3,-5,7,11,-13,-17,19,23,-29,-31,37,41,-43,-47,53,57,-59, -61,67,71,-73,-79,83,89,-97,-101,1,1,1,1,1,1,1,1,1,1,1,1}; int hash(ngnam) register char *ngnam; { register int i = 0; register int ch; register int sum = 0; #ifdef DEBUGGING char *ngn = ngnam; #endif while (ch = *ngnam++) { sum += (ch + i) * prime[i]; /* gives ~ 10% hits at 25% full */ i++; } #ifdef DEBUGGING if (debug & DEB_HASH) printf("hash(%s) => %d => %d\n",ngn, sum, (sum<0?-sum:sum)%HASHSIZ) FLUSH; #endif if (sum < 0) sum = -sum; return sum % HASHSIZ; } #endif void newsrc_check() { rcfp = fopen(rcname,"r"); /* open it */ if (rcfp == Nullfp) { /* not there? */ #ifdef VERBOSE IF(verbose) fputs("\ Trying to set up a .newsrc file--running newsetup...\n\n\ ",stdout) FLUSH; ELSE #endif #ifdef TERSE fputs("Setting up .newsrc...\n",stdout) FLUSH; #endif if (doshell(sh,filexp(NEWSETUP)) || (rcfp = fopen(rcname,"r")) == Nullfp) { #ifdef VERBOSE IF(verbose) fputs("\ Can't create a .newsrc--you must do it yourself.\n\ ",stdout) FLUSH; ELSE #endif #ifdef TERSE fputs("(Fatal)\n",stdout) FLUSH; #endif finalize(1); } } else { UNLINK(rcbname); /* unlink backup file name */ link(rcname,rcbname); /* and backup current name */ } } /* write out the (presumably) revised .newsrc */ void write_rc() { register NG_NUM tmpng; register char *delim; rcfp = fopen(rctname, "w"); /* open .newsrc */ if (rcfp == Nullfp) { printf("Can't recreate .newsrc\n") FLUSH; finalize(1); } /* write out each line*/ for (tmpng = 0; tmpng < nextrcline; tmpng++) { if (rcnums[tmpng]) { delim = rcline[tmpng] + rcnums[tmpng] - 1; *delim = rcchar[tmpng]; } else delim = Nullch; #ifdef DEBUGGING if (debug & DEB_NEWSRC_LINE) printf("%s\n",rcline[tmpng]) FLUSH; #endif fprintf(rcfp,"%s\n",rcline[tmpng]); if (delim) *delim = '\0'; /* might still need this line */ } fclose(rcfp); /* close .newsrc */ UNLINK(rcname); link(rctname,rcname); UNLINK(rctname); if (writesoft) { tmpfp = fopen(filexp(softname), "w"); /* open .rnsoft */ if (tmpfp == Nullfp) { printf(cantcreate,filexp(softname)) FLUSH; return; } for (tmpng = 0; tmpng < nextrcline; tmpng++) { fprintf(tmpfp,"%ld\n",(long)softptr[tmpng]); } fclose(tmpfp); } } void get_old_rc() { UNLINK(rctname); link(rcname,rctname); UNLINK(rcname); link(rcbname,rcname); UNLINK(rcbname); } !STUFFY!FUNK! echo "" echo "End of kit 2 (of 9)" cat /dev/null >kit2isdone config=true for iskit in 1 2 3 4 5 6 7 8 9; do if test -f kit${iskit}isdone; then echo "You have run kit ${iskit}." else echo "You still need to run kit ${iskit}." config=false fi done case $config in true) echo "You have run all your kits. Please read README and then type Configure." chmod 755 Configure ;; esac : I do not append .signature, but someone might mail this. exit