home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / unix / volume2 / uuhosts < prev    next >
Internet Message Format  |  1986-11-30  |  28KB

  1. From: harvard!ut-sally!jsq (John Quarterman)
  2. Subject: uuhosts (updated)
  3. Newsgroups: mod.sources
  4. Approved: john@genrad.UUCP
  5.  
  6. Mod.sources:  Volume 2, Issue 15
  7. Submitted by: harvard!ut-sally!jsq (John Quarterman)
  8.  
  9. Since the format of mod.map.uucp was changed recently (again), and
  10. mod.map.news has been dropped, I've updated uuhosts to reflect that.
  11. This posting of uuhosts works with the latest (June 1985) mod.map.uucp
  12. postings.
  13.  
  14. : This is a shar archive.  Extract with sh, not csh.
  15. echo x - README
  16. sed -e 's/^X//' > README << '!RoNnIe!RaYgUn!'
  17. XThis is the source directory for uuhosts, which may be used to display
  18. XUUCP mail and USENET news information previously extracted from the
  19. XUSENET newsgroup mod.map.uucp.  Mail routing information as produced by
  20. Xpathalias is also displayed.  Since uuhosts needs the map information
  21. Xfrom the USENET spool directory for mod.map.uucp extracted into a more
  22. Xaccessible (and permanent) location, it can be used to do that, too.
  23. X
  24. XIf you don't have a UNIX group named news in /etc/group, you should 
  25. Xcreate one, as uuhosts depends on it.
  26. X
  27. XTo install uuhosts, first look at the beginning of the Makefile and
  28. Xadjust any pathnames which are incorrect for your system.  Then do
  29. X"make" to be sure everything compiles correctly.  To install the
  30. Xnecessary shell script, C program, and manual entry, as well as
  31. Xcreating all necessary new directories, do "make install" as root.
  32. XFinally, modify NEWS/sys by hand so that inews will call "uuhosts -x"
  33. Xwhen mod.map.uucp articles  arrive.  See uuhosts(1) for how to do this.
  34. X
  35. XOnce the program is installed, you will want to feed any existing
  36. Xmod.map.uucp articles through "uuhosts -x" so they will be extracted and
  37. Xuuhosts can later be used to display the information.  To do this, type
  38. X"uuhosts -setup &".  Do not do it as root:  do it as some user in group
  39. Xnews.  It will take a while:  display speed has been bought by slowness
  40. Xin extraction.  You should only ever need to do this once, as any
  41. Xmod.map.uucp articles that arrive later should be extracted
  42. Xautomatically because of the NEWS/sys entry.
  43. X
  44. X
  45. XThis posting of uuhosts works with the latest (June 1985)
  46. Xmod.map.uucp postings.
  47. X
  48. XPathalias is not included here:  it was posted to net.sources a while
  49. Xback.  If you have uupath, you may want to use it to look up UUCP
  50. Xrouting information instead of the method uuhosts uses by default.
  51. XJust look for uupath in uuhosts.sh and it's obvious what to change.
  52. X
  53. X
  54. XFor the mod.map.uucp extraction (and *only* that extraction), uuhosts
  55. Xdepends on a small setuid program called mapsh (included here) which
  56. Xuses chroot(2), which is in (at least) 4BSD, System N, and Version 7.
  57. XThe purpose of mapsh is to limit the commands which may be executed
  58. Xwhen found in a map article.  If you trust everyone who can post to
  59. XUSENET from any machine in the world, you can probably replace mapsh
  60. Xwith "cd $MAPS; sh".  Or you can use unmvax!lee's article parser in C,
  61. Xif you like.
  62. X
  63. X
  64. XHere is an example of the most common use of uuhosts, which is to
  65. Xdisplay information about a particular host:
  66. X
  67. X% uuhosts seismo
  68. XUUCP mail path for seismo:
  69. Xseismo    seismo!%s
  70. XUUCP mail path for seismo annotated by location:
  71. Xseismo(usa.va)    seismo(usa.va)!%s
  72. X
  73. XUUCP mail information for host seismo (#USENET lines show USENET links):
  74. X#Name            seismo
  75. X#System-CPU-OS        Vax 11/780, 4.2BSD
  76. X#Organization        Center for Seismic Studies
  77. X#Contact        Rick Adams
  78. X#Electronic-Address    seismo!postmaster
  79. X#Telephone        (703) 276-7900
  80. X#Postal-Address        1300 N. 17th St., Suite 1450, Arlington, VA 22209
  81. X#Latitude-Longitude    38 53 30 N / 77 03 30 W
  82. X#Remarks        A.k.a seismo.ARPA
  83. X#Written-by        Rick Adams 5/15/85
  84. X#USENET     brl-vgr columbia cmcl2 harvard hao lognet2 trwatf rochester sri-iu
  85. X#USENET     ut-sally umcp-cs uwvax presby utah-cs mcvax munnari kaist
  86. X#
  87. X# 10Mb Pronet
  88. XCSS-RING = {seismo, hugo, janus, sdccis, css-sun}(LOCAL)
  89. X
  90. X# local calls
  91. Xseismo    andi(DIRECT), bdmrrr(DIRECT), cal-unix(DIRECT),
  92. X    damanet(DIRECT), dolqci(DIRECT), elsie(DIRECT), gl-red(DIRECT),
  93. X    gl-blue(DIRECT), grendel(DIRECT), hadron(DIRECT), nbs-amrf(DIRECT),
  94. X    neurad(DIRECT), netword(DIRECT), prcrs(DIRECT), prometheus(DIRECT),
  95. X    rlgvax(DIRECT), trwatf(DIRECT), vrdxhq(DIRECT), wuhep(DIRECT)
  96. X
  97. X# these are in LaJolla, CA, but we have a leased line, so treat them as local
  98. Xseismo    kobold(DIRECT), s3sun(DIRECT)
  99. X
  100. X# long distance
  101. Xseismo    allegra(DEMAND), bellcore(DEMAND), brl-bmd(DEMAND), cbosgd(DEMAND-1),
  102. X    decvax(DEMAND), dual(DEMAND), gatech(DEMAND), hao(DEMAND),
  103. X    harpo(DEMAND), ihnp4(DEMAND+HIGH), lamont(DEMAND), mcnc(DEMAND),
  104. X    mit-erl(DEMAND), nsc(DEMAND), noao(DEMAND),
  105. X    philabs(DEMAND), prcrs(EVENING), presby(DEMAND), princeton(DEMAND),
  106. X    raisun(POLLED), rna(DEMAND), scgvaxd(DEMAND),
  107. X    sun(DEMAND), turtlevax(DEMAND), ucadmus(DEMAND),
  108. X    ulysses(DEMAND), unr70(DEMAND), usna(DEMAND), uw70(DEMAND),
  109. X    vortex(DEMAND), whuxlk(DEMAND), wucs(DEMAND), zehntel(DEMAND)
  110. X
  111. X# X.25 gateway to the world....
  112. Xseismo    mcvax(DEMAND), prlb2(DEMAND+1), munnari(DAILY/5), kaist(DAILY/2),
  113. X    ukc(DEAD)
  114. X
  115. Xseismo    ut-sally(DEDICATED), rochester(DEDICATED), cmcl2(DEDICATED),
  116. X    nta-vax(DEDICATED), lbl-csam(DEDICATED), harvard(DEDICATED),
  117. X    sri-iu(DEDICATED), uwvax(DEDICATED), utah-cs(DEDICATED),
  118. X    umcp-cs(DEDICATED), mordor(DEDICATED), topaz(DEDICATED),
  119. X    tardis(DEDICATED+1), columbia(DEDICATED), lognet2(DEDICATED),
  120. X    cvl(DEDICATED), think(DEDICATED+1)
  121. X
  122. X# These sites are on the arpanet and don't speak uucp. However, the news
  123. X# software makes it look like they talk uucp, so seismo fakes it for them
  124. Xseismo    brl-tgr(DEDICATED), brl-vgr(DEDICATED), brl-vld(DEDICATED),
  125. X    nlm-mcs(DEDICATED), nlm-vax(DEDICATED), cmu-cs-k(DEDICATED),
  126. X    cmu-cs-p(DEDICATED)
  127. X
  128. X# We can not reliably connect to these sites, but we do get through on occasion
  129. Xseismo    uf-cgrl(WEEKLY), duke(WEEKLY)
  130. X
  131. X# We poll these sites even if we don't have traffic for them
  132. Xmcnc    seismo(DAILY/2)
  133. Xuw70    seismo(DAILY)
  134. Xhadron    seismo(DAILY/2)
  135. Xvortex    seismo(DAILY/4)
  136. Xgrendel    seismo(DAILY/4)
  137. Xprcrs    seismo(DAILY)
  138. X
  139. !RoNnIe!RaYgUn!
  140. echo x - uuhosts.sh
  141. sed -e 's/^X//' > uuhosts.sh << '!RoNnIe!RaYgUn!'
  142. X#!/bin/sh
  143. X# '@(#) uuhosts.sh 1.52 85/06/07'
  144. X# uuhosts - UUCP mail and USENET news information
  145. X
  146. XBIN=/usr/local
  147. XLIB=/usr/local/lib
  148. XNEWS=$LIB/news
  149. XMAPS=$NEWS/maps
  150. XUUCPMAPGROUP=mod.map.uucp
  151. XUUCPMAP=$UUCPMAPGROUP
  152. XMAPSH=$NEWS/mapsh
  153. XUUCPSPOOL=/usr/spool/news/mod/map/uucp
  154. X
  155. X# Routing information produced by pathalias.
  156. XPATHS=$LIB/nmail.paths
  157. X# Munged by uuwhere for location information.
  158. XWHERE=$LIB/nmail.where
  159. X
  160. X# The directory $MAPS/$UUCPMAP contains the UUCP and USENET map
  161. X# information extracted from the newsgroup mod.map.uucp.
  162. X# The extraction is done by a line in $NEWS/sys like this:
  163. X
  164. X# maps:mod.map.news,mod.map.uucp:B:$BIN/uuhosts -x
  165. X
  166. X# $MAPSH is needed, to use the chroot(2) system call to limit
  167. X# what can be done when executing a shell with a news article as input.
  168. X# N.B.:  chroot is *only* needed for *automatic extraction* of news
  169. X# articles from mod.map.uucp; it has nothing to do with display of
  170. X# the information by ordinary users.
  171. X
  172. X# Initial installation is done by "make install" as root, followed
  173. X# by "uuhosts -setup" as some user in group news.
  174. X
  175. Xcd $NEWS
  176. X
  177. Xcase $1 in
  178. X    -setup)
  179. X        # Initial setup.  Should only need to be done once.
  180. X        DONTINDEX=1
  181. X        export DONTINDEX
  182. X        cd $UUCPSPOOL
  183. X        for f in *
  184. X        do
  185. X            $BIN/uuhosts -x < $f
  186. X            sleep 30
  187. X        done
  188. X        DONTINDEX=0
  189. X        exec $BIN/uuhosts -i
  190. X        exit 1
  191. X    ;;
  192. X
  193. X    -x)
  194. X        # extract a new map piece into a map directory
  195. X        temphead=/tmp/maphead.$$
  196. X        temptext=/tmp/maptext.$$
  197. X        tempcomm=/tmp/mapcomm.$$
  198. X        cp /dev/null $temphead
  199. X        cp /dev/null $temptext
  200. X        echo 'exec /bin/mail usenet' > $tempcomm
  201. X        awk '
  202. XBEGIN    {
  203. X    temphead = "'$temphead'"; tempcomm = "'$tempcomm'";
  204. X    typeset = 0; isnewsmap = 0; isuucpmap = 0;
  205. X    shead = 0; stext = 1; snews = 2; suucp = 3;
  206. X    state = shead;
  207. X}
  208. Xstate == shead && ($1 == "From:" || $1 == "Sender:" \
  209. X    || $1 == "Date:" || $1 == "Message-ID:" || $1 == "Message-Id:") {
  210. X    print "Original-" $0 >> temphead;
  211. X    next;
  212. X}
  213. Xstate == shead && $1 == "Newsgroups:" {    # no cross-postings allowed
  214. X    if ($2 == "'$UUCPMAPGROUP'") {
  215. X        isuucpmap = 1;
  216. X        typeset = 1;
  217. X        print "Reply-To: postmaster" >> temphead;
  218. X        print "exec /bin/mail postmaster" > tempcomm;
  219. X    }
  220. X}
  221. Xstate == shead && $1 == "Subject:" {
  222. X    if (($2 !~ /^UUCP/ && $2 !~ /^uucp/ && $2 !~ /^Uucp/) \
  223. X    || !typeset) {    # this requires Newsgroups: before Subject:
  224. X        print "Subject:  not a map update" >> temphead;
  225. X        print "Original-" $0 >> temphead;
  226. X        isuucpmap = 0;
  227. X    } else
  228. X        print $0 >> temphead;
  229. X    next;
  230. X}
  231. Xstate == shead && /^$/    {
  232. X    if (isuucpmap != 0) {
  233. X    print "PATH=/bin; umask 0002; cd '$UUCPMAP'" | "'$BIN'/uuhosts -ux";
  234. X        state = suucp;
  235. X    } else
  236. X        state = stext;
  237. X}
  238. Xstate == shead {
  239. X        print $0 >> temphead;
  240. X}
  241. Xstate == suucp    {
  242. X    print | "'$BIN'/uuhosts -ux";
  243. X}
  244. Xstate == stext    {
  245. X    print;
  246. X}
  247. X' > $temptext 2>&1
  248. X        cat $temphead $temptext | sh $tempcomm
  249. X        rm -f $temphead $temptext $tempcomm
  250. X        exit 0
  251. X    ;;
  252. X
  253. X    -nx)
  254. X        exec $BIN/uuhosts -ux
  255. X        exit 1
  256. X    ;;
  257. X
  258. X    -ux)
  259. X        # extract a map piece
  260. X        $MAPSH
  261. X        exec $BIN/uuhosts -i
  262. X        exit 0
  263. X    ;;
  264. X
  265. X    -ui)
  266. X        exec $BIN/uuhosts -i
  267. X        exit 1
  268. X    ;;
  269. X
  270. X    -ni)
  271. X        exec $BIN/uuhosts -i
  272. X        exit 1
  273. X    ;;
  274. X
  275. X
  276. X    -i)
  277. X        case $DONTINDEX in
  278. X        1)
  279. X            exit 0
  280. X            ;;
  281. X        esac
  282. X        cd $MAPS/$UUCPMAP
  283. X        hostmarker="#N"
  284. X        if [ ! -f Local ]; then
  285. X            cp /dev/null Local
  286. X        fi
  287. X        cp /dev/null Index.t.$$
  288. X        for f in Local [a-z]* 
  289. X        do
  290. X             awk '
  291. XBEGIN {
  292. X    isinside = 0;
  293. X    hostmarker = "'"$hostmarker"'";
  294. X}
  295. X$1 == hostmarker {
  296. X    if (isinside)
  297. X        printf ("%s\t%s\t%d\t%d\n", hostname, FILENAME, firstline, NR - 1);
  298. X    isinside = 1;
  299. X    hostname = $2;
  300. X    firstline = NR;
  301. X}
  302. XEND {
  303. X    if (isinside)
  304. X        printf ("%s\t%s\t%d\t%d\n", hostname, FILENAME, firstline, NR);
  305. X    exit (0);
  306. X}
  307. X' $f >> Index.t.$$
  308. X        done
  309. X        sort -f Index.t.$$ > Index.s.$$
  310. X         mv Index.s.$$ Index
  311. X        rm Index.t.$$
  312. X        exit 0
  313. X    ;;
  314. X
  315. X    -r)
  316. X        # by region
  317. X        cd $MAPS/$UUCPMAP
  318. X        shift
  319. X        case $# in
  320. X        0)
  321. X            exec ls
  322. X            exit 1
  323. X        ;;
  324. X        esac
  325. X        exec cat $*
  326. X        exit 1
  327. X    ;;
  328. X
  329. X    -u)
  330. X        exec $BIN/uuhosts -r
  331. X        exit 1
  332. X    ;;
  333. X
  334. X    -n)
  335. X        exec $BIN/uuhosts -r
  336. X        exit 1
  337. X    ;;
  338. X
  339. X    -k)
  340. X        # by keyword
  341. X        cd $MAPS/$UUCPMAP
  342. X        shift
  343. X        exec awk '
  344. XBEGIN        { inside = 1; outside = 0; state = outside; }
  345. X/^#N/ && state == inside    {
  346. X    if (useit == 1) {
  347. X        for (i = 0; i < count; i++) {
  348. X            print block[i];
  349. X        }
  350. X    }
  351. X    state = outside;
  352. X}
  353. X/^#N/    { state = inside; count = 0; useit = 0; }
  354. Xstate == inside    { block[count++] = $0; }
  355. X/'"$*"'/    { useit = 1; }
  356. XEND {
  357. X    if (useit == 1) {
  358. X        for (i = 0; i < count; i++) {
  359. X            print block[i];
  360. X        }
  361. X    }
  362. X}
  363. X' *
  364. X        exit 1
  365. X    ;;
  366. X
  367. X    -*)
  368. X        # unknown option
  369. X    ;;
  370. X
  371. X    "")
  372. X        # no arguments
  373. X    ;;
  374. X
  375. X    *)
  376. X        # by host name
  377. X        if [ -f /usr/bin/look ]; then
  378. X            look=/usr/bin/look
  379. X            lookopt="-f "
  380. X        else
  381. X            look=grep
  382. X            lookopt="^"
  383. X        fi
  384. X        for arg in $*
  385. X        do
  386. X            echo 'UUCP mail path for '$arg':'
  387. X            $look $lookopt$arg $PATHS
  388. X#             uupath $arg
  389. X            if [ -f $WHERE ]; then
  390. X            echo 'UUCP mail path for '$arg' annotated by location:'
  391. X                $look $lookopt$arg $WHERE
  392. X                $LIB/uuwhere &
  393. X            fi
  394. X            echo '
  395. XUUCP mail information for host '$arg' (#USENET lines show USENET links):'
  396. X            cd $MAPS/$UUCPMAP
  397. X            eval `$look $lookopt$arg Index | awk '
  398. X/^'$arg'/ {
  399. X    printf ("sed -n -e \"%d,%dp\" %s;\n", $3, $4, $2);
  400. X}'` | sed -e '
  401. Xs/^#N/#Name        /
  402. Xs/^#S/#System-CPU-OS    /
  403. Xs/^#O/#Organization    /
  404. Xs/^#C/#Contact    /
  405. Xs/^#E/#Electronic-Address/
  406. Xs/^#T/#Telephone    /
  407. Xs/^#P/#Postal-Address    /
  408. Xs/^#L/#Latitude-Longitude/
  409. Xs/^#R/#Remarks    /
  410. Xs/^#W/#Written-by    /
  411. Xs/^#U/#USENET /'
  412. X        done
  413. X        exit 0
  414. X    ;;
  415. Xesac
  416. X
  417. Xecho 'Usage:    'uuhosts' hostname ...
  418. Xfor information about a particular UUCP or USENET host or hosts, or
  419. X
  420. X    'uuhosts' -r region
  421. Xfor information about hosts in a region of the UUCP or USENET networks, or
  422. X
  423. X    'uuhosts' -r
  424. Xfor a list of known regions.
  425. X
  426. XSee uuhosts(1) for further details.
  427. X'
  428. Xexit 1
  429. !RoNnIe!RaYgUn!
  430. echo x - mapsh.c
  431. sed -e 's/^X//' > mapsh.c << '!RoNnIe!RaYgUn!'
  432. X#include <stdio.h>
  433. X/*
  434. X    This command depends on chroot(2), which exists in 4BSD, System V,
  435. X    Version 7, and probably all related systems.
  436. X */
  437. X
  438. X#ifndef MAPS
  439. X#define MAPS "/usr/local/lib/news/maps"
  440. X#endif
  441. X
  442. Xmain(argc,argv)
  443. Xint argc;
  444. Xchar **argv;
  445. X{
  446. X    char *rootdir = MAPS;
  447. X    char *command = "/bin/sh";
  448. X
  449. X    if (geteuid() != 0) {
  450. X        fprintf (stderr, "mapsh must be setuid to root\n");
  451. X        exit(1);
  452. X    }
  453. X    if (chroot(rootdir) == -1) {
  454. X        fprintf (stderr, "mapsh:  chroot(%s) failed\n", rootdir);
  455. X        perror ("");
  456. X        exit(1);
  457. X    }
  458. X    if (setuid(getuid()) == -1) {
  459. X        perror ("mapsh:  setuid(getuid()) failed");
  460. X        exit(1);
  461. X    }
  462. X    if (chdir("/") == -1) {
  463. X        fprintf (stderr, "mapsh:  chdir(%s) failed\n", "/");
  464. X        perror ("");
  465. X        exit(1);
  466. X    }
  467. X    execvp (command, argv);
  468. X    fprintf (stderr, "mapsh:  %s not found\n", command);
  469. X    perror ("mapsh:  execvp(2) failed");
  470. X    exit(1);
  471. X}
  472. !RoNnIe!RaYgUn!
  473. echo x - uuwhere.c
  474. sed -e 's/^X//' > uuwhere.c << '!RoNnIe!RaYgUn!'
  475. X#ifndef lint
  476. Xchar sccsid[] = "@(#) uuwhere.c 1.8 85/02/05";
  477. X#endif
  478. X/*
  479. X * uuwhere:
  480. X * This program is designed to take the ASCII UUCP routing database PATHS
  481. X * on standard input, and produce a version * on standard output annotated
  482. X * by host location, to be put in WHERE.  It gets the location information
  483. X * from the news and UUCP map directories produced by uuhosts.
  484. X * UUCP map information is made to override news map information.
  485. X * The host location information is first put into a dbm(3x)
  486. X * database so that generating the final output will not take forever.
  487. X */
  488. X
  489. X#include <stdio.h>
  490. X#include <ctype.h>
  491. X#include <dbm.h>
  492. X#include <sys/types.h>
  493. X#include <sys/stat.h>
  494. X
  495. X#ifndef UUCPINDEX
  496. X#define UUCPINDEX "/usr/local/lib/news/maps/mod.map.uucp/Index"
  497. X#endif
  498. X#ifndef NEWSINDEX
  499. X#define NEWSINDEX "/usr/local/lib/news/maps/mod.map.news/Index"
  500. X#endif
  501. X#ifndef TMP
  502. X#define TMP "/usr/local/lib/nmail.tmp"
  503. X#endif
  504. X#ifndef PATHS
  505. X#define PATHS "/usr/local/lib/nmail.paths"
  506. X#endif
  507. X#ifndef WHERE
  508. X#define WHERE "/usr/local/lib/nmail.where"
  509. X#endif
  510. X#ifndef DATABASE
  511. X#define DATABASE    "/usr/local/lib/uuindex"
  512. X#endif
  513. X
  514. Xint verbose;
  515. X
  516. Xmain(argc, argv)
  517. Xint argc;
  518. Xchar **argv;
  519. X{
  520. X    register char **cp;
  521. X    int flagcreat = 0;
  522. X    int flagupdate = 1;
  523. X    int flaginput = 0;
  524. X
  525. X    (void) umask(0);
  526. X    for (cp = argv; *++cp != NULL; ) {
  527. X        if (**cp != '-') {
  528. X            flaginput = 1;
  529. X            flagupdate = 0;
  530. X            break;
  531. X        }
  532. X        switch (cp[0][1]) {
  533. X            case '\0':
  534. X                flaginput = 1;
  535. X                flagupdate = 0;
  536. X                break;
  537. X            case 'c':
  538. X                flagcreat = 1;
  539. X                flagupdate = 0;
  540. X                break;
  541. X            case 'v':
  542. X                verbose = 1;
  543. X                break;
  544. X            default:
  545. X                usage();
  546. X                break;
  547. X        }
  548. X    }
  549. X    init(flagcreat, flagupdate, flaginput);
  550. X    if (!flaginput) {
  551. X        char tmpbuf[64];
  552. X
  553. X         if (freopen (PATHS, "r", stdin) == (FILE *)NULL) {
  554. X            perror (PATHS);
  555. X            exit (1);
  556. X        }
  557. X        (void)sprintf(tmpbuf, "%s.%d", TMP, getpid());
  558. X        if (freopen (tmpbuf, "w", stdout) == (FILE *)NULL) {
  559. X            perror (tmpbuf);
  560. X            exit (1);
  561. X        }
  562. X        parsefile();
  563. X        (void)fclose(stdout);
  564. X        if (unlink (WHERE) == -1 || link(tmpbuf, WHERE) == -1) {
  565. X            perror(WHERE);
  566. X            exit(1);
  567. X        }
  568. X        (void)unlink(tmpbuf);
  569. X        exit (0);
  570. X    }
  571. X    for (; *cp != NULL; cp++) {
  572. X        if (strcmp (*cp, "-") != 0
  573. X          && freopen (*cp, "r", stdin) == (FILE *)NULL) {
  574. X            perror (*cp);
  575. X            continue;
  576. X        }
  577. X        parsefile();
  578. X    }
  579. X    exit(0);
  580. X}
  581. X
  582. Xusage()
  583. X{
  584. X    fprintf (stderr, "usage:  uuwhere [-c] [-v] [infiles]\n");
  585. X    exit (1);
  586. X}
  587. X
  588. Xinit(flagcreat, flagupdate, flaginput)
  589. Xint flagcreat, flagupdate, flaginput;
  590. X{
  591. X    char datadir[512], datapag[512];
  592. X    struct stat statuucp, statpaths, statwhere;
  593. X    int fd;
  594. X    char c;
  595. X
  596. X/*
  597. X * If any of the stats fail,
  598. X * an open will fail later and produce a diagnostic.
  599. X */
  600. X    if (flagupdate
  601. X    && stat(WHERE, &statwhere) != -1
  602. X    && stat(PATHS, &statpaths) != -1
  603. X    && stat(UUCPINDEX, &statuucp) != -1) {
  604. X        if (statwhere.st_mtime > statpaths.st_mtime
  605. X        && statwhere.st_mtime > statuucp.st_mtime) {
  606. X            if (verbose)
  607. X                fprintf (stderr, "%s up to date\n", WHERE);
  608. X            exit(0);
  609. X        }
  610. X        if (statuucp.st_mtime > statwhere.st_mtime
  611. X        || statuucp.st_mtime > statpaths.st_mtime)
  612. X            flagcreat = 1;
  613. X    }
  614. X    if (!flaginput) {
  615. X        /* touch WHERE to forestall duplicate uuwheres */
  616. X        if ((fd = open(WHERE, 2)) < 0) {
  617. X            perror(WHERE);
  618. X            exit(1);
  619. X        }
  620. X        if (read (fd, &c, 1) == 1)
  621. X            (void) write (fd, &c, 1);
  622. X        (void) close (fd);
  623. X    }
  624. X    (void) sprintf (datadir, "%s.dir", DATABASE);
  625. X    (void) sprintf (datapag, "%s.pag", DATABASE);
  626. X    if (flagcreat || access(datadir, 0) == -1 || access(datapag, 0) == -1) {
  627. X        flagcreat = 1;
  628. X        if (verbose)
  629. X            fprintf (stderr, "Creating database %s...\n", DATABASE);
  630. X        if (makefile(datadir) == -1 || makefile(datapag) == -1)
  631. X            exit(1);
  632. X    }
  633. X    if (dbminit(DATABASE) < 0)
  634. X        exit(1);
  635. X    if (!flagcreat)
  636. X        return;
  637. X    if (!initit(NEWSINDEX) && !initit(UUCPINDEX))
  638. X        exit(1);
  639. X    if (verbose)
  640. X        fprintf (stderr, "...database %s created.\n", DATABASE);
  641. X}
  642. X
  643. Xmakefile(name)
  644. Xchar *name;
  645. X{
  646. X    register int fd;
  647. X
  648. X    if ((fd = creat(name, 0666)) == -1) {
  649. X        perror(name);
  650. X        return(-1);
  651. X    }
  652. X    (void) close(fd);
  653. X    return (0);
  654. X}
  655. X
  656. Xinitit(name)
  657. Xchar *name;
  658. X{
  659. X    register FILE *fp;
  660. X    char buffer[1024], site[128], where[128];
  661. X    datum key, data;
  662. X
  663. X    if (verbose)
  664. X        fprintf(stderr, "Reading %s...", name);
  665. X    if ((fp = fopen(name, "r")) == (FILE *)NULL) {
  666. X        perror(name);
  667. X        return (0);
  668. X    }
  669. X     while (fgets(buffer, sizeof(buffer), fp) != NULL) {
  670. X        if (sscanf(buffer, "%s%s", site, where) != 2) {
  671. X            fprintf (stderr, "Can't parse:  %s\n", buffer);
  672. X            continue;
  673. X        }
  674. X        key.dptr = site;
  675. X        key.dsize = strlen(key.dptr) + 1;
  676. X        data.dptr = where;
  677. X        data.dsize = strlen(data.dptr) + 1;
  678. X        store (key, data);
  679. X    }
  680. X    (void)fclose(fp);
  681. X    if (verbose)
  682. X        fprintf(stderr, ".\n");
  683. X    return(1);
  684. X}
  685. X
  686. Xparsefile()
  687. X{
  688. X    char buffer[128];
  689. X    register char *cp;
  690. X    register int c;
  691. X    register int inside;
  692. X    register int last = 0;
  693. X
  694. X    for (inside = 0; (c = getchar()) != EOF; (void)putchar(c)) {
  695. X        if (isalnum(c) || (c) == '.' || (c) == '-' || (c) == '_') {
  696. X            if (!inside) {
  697. X                cp = buffer;
  698. X                inside = 1;
  699. X            }
  700. X            *cp++ = c;
  701. X            continue;
  702. X        }
  703. X        if (inside) {
  704. X            *cp = '\0';
  705. X            if (cp != buffer
  706. X/* %s */    && !((cp - buffer) == 1 && last == '%' && buffer[0] == 's'))
  707. X                doit(buffer);
  708. X            inside = 0;
  709. X        }
  710. X        last = c;
  711. X    }
  712. X}
  713. X
  714. Xdoit (site)
  715. Xchar *site;
  716. X{
  717. X    datum key, data;
  718. X
  719. X    key.dptr = site;
  720. X    key.dsize = strlen(key.dptr) + 1;
  721. X    data = fetch(key);
  722. X    if (data.dptr != NULL)
  723. X        printf ("(%s)", data.dptr);
  724. X}
  725. !RoNnIe!RaYgUn!
  726. echo x - uuhosts.man
  727. sed -e 's/^X//' > uuhosts.man << '!RoNnIe!RaYgUn!'
  728. X.TH UUHOSTS 1L 85/06/07
  729. X.SH NAME
  730. Xuuhosts \- UUCP mail and USENET news information.
  731. X.SH SYNOPSIS
  732. X.B
  733. Xuuhosts
  734. Xhostname ...
  735. X.br
  736. X.B
  737. Xuuhosts
  738. X-r [ region ]
  739. X.br
  740. X.B
  741. Xuuhosts
  742. X-x
  743. X.br
  744. X.B
  745. Xuuhosts
  746. X-i
  747. X.SH DESCRIPTION
  748. XThe \fIuuhosts\fP command is used to look up information about
  749. Xthe configurations of the UUCP mail network and the USENET news network.
  750. X.TP
  751. Xuuhosts \fIhostname\fP ...
  752. Xfor information about a particular UUCP or USENET host or hosts.
  753. XThe UUCP mail path is given first, followed by the map information.
  754. XThe USENET map is carried as notations in entries in the UUCP map,
  755. Xin the lines starting with ``#USENET''.
  756. XAny hosts with names for which the argument is a prefix are shown, e.g.:
  757. X.TP
  758. Xuuhosts ut
  759. Xgets information about all hosts whose names start with ``ut''.
  760. X.TP
  761. Xuuhosts \-r \fIregion\fP
  762. Xfor information about hosts in a region (usually geographical) networks.
  763. X.TP
  764. Xuuhosts \-r README
  765. Xgets an introduction to the map.
  766. X.TP
  767. Xuuhosts \-r Local
  768. Xgets map information known only locally.
  769. X.TP
  770. Xuuhosts \-r
  771. Xfor a list of known regions.
  772. X.TP
  773. Xuuhosts
  774. Xwith no arguments gets a short usage message.
  775. X.SH MAINTENANCE
  776. XIn addition to the options mentioned above, there is
  777. X.TP
  778. Xuuhosts \-x
  779. XExtract pieces of the map from a mod.map.uucp article.
  780. X.PP
  781. XThis should be called automatically by a line in \fBNEWS/sys\fP like
  782. X.IP
  783. Xmaps:mod.map.news,mod.map.uucp:B:BIN/uuhosts\ \-x
  784. X.TP
  785. Xuuhosts \-i
  786. Xrebuilds all the Index files (see below).
  787. X.LP
  788. XThere are more details in the uuhosts shell script itself.
  789. X.SH FILES
  790. X.TP
  791. XPATHS
  792. XUUCP mail path database as produced by \fIpathalias\fP and used by \fInmail\fP
  793. X(which is called automatically from \fIsendmail\fP on \fIut\-sally\fP)
  794. XIt is searched by \fIlook\fP(1), if present, else \fIgrep\fP(1).
  795. XThe file WHERE is similarly searched, if present:
  796. Xsee \fIuuwhere\fP(1).
  797. X.TP
  798. XUUCPMAP
  799. XUUCP and USENET map information taken from newsgroup \fBmod.map.uucp\fP
  800. X(thanks to the UUCP mapping project).
  801. XNotices of updates are mailed to postmaster, which should be an alias
  802. Xredistributing to the local mail and UUCP administrators.
  803. X.TP
  804. XUUCPMAP/Index
  805. XThis index is used to decrease search time on the map about an order
  806. Xof magnitude.
  807. XThe search is done by either \fIlook\fP(1) or \fIgrep\fP(1), as above.
  808. XThe index is updated each time a mod.map.uucparticle arrives,
  809. Xand may be manually forced by ``uuhosts\ \-i''.
  810. X.TP
  811. XNEWS/sys
  812. XContains arrangements to call "uuhosts\ \-x".
  813. X.SH SEE ALSO
  814. Xvnews(1), readnews(1), mail(1), sendmail(8), look(1)
  815. X.SH BUGS
  816. XHaving uuhosts\ \-x create a complete new Index for each incoming article
  817. Xis clumsy, takes a long time, and eats CPU.
  818. XOn the other hand, articles don't come in but once or two at a time.
  819. XIf anybody has a clever method of handling this (given that ordinary
  820. Xusers may read but not write on the map directories), let me know.
  821. XIt is possible to disable indexing for a given uuhosts\ \-x call
  822. Xby doing ``DONTINDEX=1;\ export\ DONTINDEX'' (or ``setenv\ DONTINDEX\ 1''
  823. Xin csh) before the uuhosts call.
  824. X.sp
  825. X.nf
  826. XJohn Quarterman, CS Dept., University of Texas, Austin, Texas 78712 USA
  827. Xjsq@ut-sally.ARPA, jsq@ut-sally.UUCP, {ihnp4,seismo,ctvax}!ut-sally!jsq
  828. !RoNnIe!RaYgUn!
  829. echo x - uuwhere.man
  830. sed -e 's/^X//' > uuwhere.man << '!RoNnIe!RaYgUn!'
  831. X.TH UUW\HERE 1L 85/02/02
  832. X.SH NAME
  833. Xuuwhere \- annotate UUCP mail routes by host location
  834. X.SH SYNOPSIS
  835. X.B
  836. XLIB/uuwhere
  837. X[ -c ]
  838. X[ infile ]
  839. X.SH DESCRIPTION
  840. XThe \fIuuwhere\fP command is used take a list of UUCP routes,
  841. Xsuch as produced by \fIpathalias\fP, and make a similar list,
  842. Xannotated by the geographical location of each host as found
  843. Xin the UUCP map posted to USENET newsgroup mod.map.uucp.
  844. XIt is ordinarily called with no arguments by \fIuuhosts\fP(1L),
  845. Xand will update \fBWHERE\fP, taking routes from \fBPATHS\fP and locations
  846. Xfrom \fBUUCPMAP/Index\fP (and possibly \fBNEWSMAP/Index\fP), if either
  847. X\fBPATHS\fP or \fBUUCPMAP/Index\fP is newer than \fBWHERE\fP.
  848. X.PP
  849. XInput file names may be specified as arguments.
  850. XThis also causes output to go to standard output instead of directly to
  851. XInput file name \fI-\fP is taken to be standard input.
  852. X\fBWHERE\fP.
  853. X.TP
  854. X\-\fBc
  855. X\fIUuwhere\fP uses a \fIdbm\fP(3) database to store the location information
  856. Xfrom \fBUUCPMAP/Index\fP before creating output.
  857. XThis option causes \fIuuwhere\fP to recreate the database regardless
  858. Xof the state of any input files.
  859. X.SH FILES
  860. X.TP
  861. XWHERE
  862. XThe place where the output of \fIuuwhere\fP is usually kept for use
  863. Xby \fIuuhosts\fP.
  864. X.TP
  865. XPATHS
  866. XThe default route list used as input by \fIuuwhere\fP.
  867. XProduced by \fIuuhosts\fP.
  868. X.TP
  869. XUUCPMAP/Index
  870. XThe source of the location information used by \fIuuwhere\fP.
  871. XProduced by \fIpathalias\fP.
  872. X.SH SEE ALSO
  873. Xuuhosts(1), pathalias(1), dbm(3).
  874. !RoNnIe!RaYgUn!
  875. echo x - Makefile
  876. sed -e 's/^X//' > Makefile << '!RoNnIe!RaYgUn!'
  877. X# @(#) Makefile 1.21 85/02/05
  878. XSHELL=/bin/sh
  879. X
  880. X# BIN should be either /usr/local or /usr/local/bin
  881. XBIN=/usr/local
  882. XLIB=/usr/local/lib
  883. XPATHS=$(LIB)/nmail.paths
  884. X
  885. X# If you do not have dbm(3), i.e., -ldbm, set UUWHERE to nothing.
  886. XUUWHERE=uuwhere
  887. X# UUWHERE=
  888. XWHERE=$(LIB)/nmail.where
  889. X# TMP should be in the same directory as WHERE.
  890. XTMP=$(LIB)/nmail.tmp
  891. X# -ldbm DATABASE used by uuwhere.
  892. XDATABASE=$(LIB)/uuindex
  893. X
  894. X# Most of the news parameter files and mapsh are in this directory.
  895. XNEWS=$(LIB)/news
  896. X# The maps from mod.map.all are under this directory.
  897. XMAPS=$(NEWS)/maps
  898. X# USENET spool directory containing articles from newsgroup mod.map.news.
  899. XNEWSSPOOL=/usr/spool/news/mod/map/news
  900. X# USENET spool directory containing articles from newsgroup mod.map.uucp.
  901. XUUCPSPOOL=/usr/spool/news/mod/map/uucp
  902. X
  903. X# The filename of the manual entry.
  904. XUUHOSTSMAN=uuhosts.1
  905. XUUWHEREMAN=uuwhere.1
  906. XMAN=$(UUHOSTSMAN) $(UUWHEREMAN)
  907. XMANSOURCES=uuhosts.man uuwhere.man
  908. X# The manual directory for local entries.
  909. XMANDIR=/usr/man/manl
  910. X
  911. X# The rest of the Makefile shouldn't need to be changed.
  912. X
  913. XUUCPMAP=$(MAPS)/mod.map.uucp
  914. XNEWSMAP=$(MAPS)/mod.map.news
  915. X
  916. XSOURCES=uuhosts.sh mapsh.c uuwhere.c $(MANSOURCES)
  917. XALL= uuhosts mapsh $(UUWHERE) $(MAN)
  918. X
  919. Xall: $(ALL)
  920. X
  921. Xuuhosts: uuhosts.sh
  922. X    cat uuhosts.sh \
  923. X    | sed -e 's%^UUCPSPOOL=.*$$%UUCPSPOOL=$(UUCPSPOOL)%;s%^NEWSSPOOL=.*$$%NEWSSPOOL=$(NEWSSPOOL)%' \
  924. X    | sed -e 's%^BIN=.*$$%BIN=$(BIN)%;s%^LIB=.*$$%LIB=$(LIB)%' \
  925. X    | sed -e 's%^PATHS=.*$$%PATHS=$(PATHS)%;s%^WHERE=.*$$%WHERE=$(WHERE)%'\
  926. X    | sed -e 's%^NEWS=.*$$%NEWS=$(NEWS)%;s%^MAPS=.*$$%MAPS=$(MAPS)%'\
  927. X    > uuhosts
  928. X    chmod +x uuhosts
  929. X
  930. Xmapsh: mapsh.c
  931. X    $(CC) -o mapsh -DMAPS=\"$(MAPS)\" mapsh.c
  932. X
  933. Xuuwhere: uuwhere.c
  934. X    $(CC) -o uuwhere -DUUCPINDEX=\"$(UUCPMAP)/Index\" \
  935. X            -DNEWSINDEX=\"$(NEWSMAP)/Index\" \
  936. X            -DPATHS=\"$(PATHS)\" -DWHERE=\"$(WHERE)\" \
  937. X            -DTMP=\"$(TMP)\" -DDATABASE=\"$(DATABASE)\" \
  938. X            uuwhere.c -ldbm
  939. X
  940. Xwhere:    $(LIB)/uuwhere
  941. X
  942. X$(UUHOSTSMAN):    uuhosts.man
  943. X    sed -e 's%NEWSMAP%$(NEWSMAP)%;s%UUCPMAP%$(UUCPMAP)%' uuhosts.man \
  944. X    | sed -e 's%BIN%$(BIN)%;s%LIB%$(LIB)%' \
  945. X    | sed -e 's%PATHS%$(PATHS)%;s%WHERE%$(WHERE)%;s%TMP%$(TMP)%'\
  946. X    | sed -e 's%DATABASE%$(DATABASE)%;s%NEWS%$(NEWS)%;s%MAPS%$(MAPS)%'\
  947. X        > $(UUHOSTSMAN)
  948. X
  949. X$(UUWHEREMAN):    uuwhere.man
  950. X    sed -e 's%NEWSMAP%$(NEWSMAP)%;s%UUCPMAP%$(UUCPMAP)%' uuwhere.man \
  951. X    | sed -e 's%BIN%$(BIN)%;s%LIB%$(LIB)%' \
  952. X    | sed -e 's%PATHS%$(PATHS)%;s%WHERE%$(WHERE)%;s%TMP%$(TMP)%'\
  953. X    | sed -e 's%DATABASE%$(DATABASE)%;s%NEWS%$(NEWS)%;s%MAPS%$(MAPS)%'\
  954. X        > $(UUWHEREMAN)
  955. X
  956. Xinst_:
  957. X
  958. Xinst_uuwhere: $(UUWHERE)
  959. X    -rm -f $(LIB)/uuwhere
  960. X    cp uuwhere $(LIB)/uuwhere
  961. X    chmod 555 $(LIB)/uuwhere
  962. X    -rm -f $(MANDIR)/$(UUWHEREMAN)
  963. X    cp $(UUWHEREMAN) $(MANDIR)
  964. X    chmod 444 $(MANDIR)/$(UUWHEREMAN)
  965. X
  966. Xinstall: $(ALL) inst_$(UUWHERE)
  967. X    -rm -f $(BIN)/uuhosts
  968. X    cp uuhosts $(BIN)/uuhosts
  969. X    chmod 555 $(BIN)/uuhosts
  970. X    -rm -f $(MANDIR)/$(UUHOSTSMAN)
  971. X    cp $(UUHOSTSMAN) $(MANDIR)
  972. X    chmod 444 $(MANDIR)/$(UUHOSTSMAN)
  973. X    @echo "Rest of installation has to be done as root."
  974. X    cp mapsh $(NEWS)/mapsh
  975. X    -strip $(NEWS)/mapsh
  976. X    chown root $(NEWS)/mapsh
  977. X    chgrp news $(NEWS)/mapsh
  978. X    chmod 4750 $(NEWS)/mapsh
  979. X    ls -lg $(NEWS)/mapsh
  980. X    @echo "If the following mkdir of $(MAPS) fails,"
  981. X    @echo "it is assumed that the map directories were set up previously."
  982. X    mkdir $(MAPS)
  983. X    mkdir $(MAPS)/bin $(MAPS)/tmp $(UUCPMAP) $(NEWSMAP)
  984. X    chgrp news $(MAPS) $(MAPS)/*
  985. X    chmod 555 $(MAPS)
  986. X    chmod 775 $(UUCPMAP) $(NEWSMAP)
  987. X    chmod 777 $(MAPS)/tmp
  988. X    chmod 555 $(MAPS)/bin
  989. X    cp /bin/cat $(MAPS)/bin
  990. X    cp /bin/echo $(MAPS)/bin
  991. X    cp /bin/sed $(MAPS)/bin
  992. X    cp /bin/sh $(MAPS)/bin
  993. X    -strip $(MAPS)/bin/*
  994. X    chgrp news $(MAPS)/bin/*
  995. X    chmod 555 $(MAPS)/bin/*
  996. X    @echo ''
  997. X    @echo 'This is what the things just installed *should* look like:'
  998. X    @echo '$(MAPS): total 16'
  999. X    @echo 'dr-xr-xr-x  6 root     news          512 Nov 11 16:42 .'
  1000. X    @echo 'drwxrwxr-x 19 news     news         1024 Nov 11 16:45 ..'
  1001. X    @echo 'dr-xr-xr-x  2 root     news          512 Nov 11 16:39 bin'
  1002. X    @echo 'drwxrwxr-x  2 news     news         2048 Nov 11 16:42 mod.map.news'
  1003. X    @echo 'drwxrwxr-x  2 news     news        10240 Nov 11 16:39 mod.map.uucp'
  1004. X    @echo 'drwxrwxrwx  2 news     news           24 Nov 11 16:41 tmp'
  1005. X    @echo ''
  1006. X    @echo '$(MAPS)/bin: total 59'
  1007. X    @echo '-r-xr-xr-x  1 root     news        10240 Nov 11 15:29 cat'
  1008. X    @echo '-r-xr-xr-x  1 root     news         4096 Nov 11 16:33 echo'
  1009. X    @echo '-r-xr-xr-x  1 root     news        18432 Nov 11 15:29 sed'
  1010. X    @echo '-r-xr-xr-x  1 root     news        27648 Nov 11 15:29 sh'
  1011. X    @echo ''
  1012. X    @echo 'And here is what they actually *do* look like:'
  1013. X    ls -lga $(MAPS)
  1014. X    ls -lga $(MAPS)/bin
  1015. X
  1016. Xclean:
  1017. X    rm -f $(ALL)
  1018. X    rm -f *.pag *.dir
  1019. X    rm -f *.o
  1020. X    rm -f *.shar
  1021. X
  1022. Xshar:
  1023. X    shar README* $(SOURCES) Makefile > uuhosts.shar
  1024. !RoNnIe!RaYgUn!
  1025. exit
  1026.  
  1027.