{"id":23586567,"url":"https://github.com/doctorwkt/4bsd-uucp","last_synced_at":"2026-01-25T17:01:48.960Z","repository":{"id":89296638,"uuid":"84296037","full_name":"DoctorWkt/4bsd-uucp","owner":"DoctorWkt","description":"Simulate a UUCP network with 4.3BSD SimH images","archived":false,"fork":false,"pushed_at":"2017-04-28T04:31:14.000Z","size":55913,"stargazers_count":34,"open_issues_count":0,"forks_count":8,"subscribers_count":10,"default_branch":"4.3BSD","last_synced_at":"2025-05-13T14:51:02.951Z","etag":null,"topics":["bsd","retro","simh","unix"],"latest_commit_sha":null,"homepage":"","language":"Lex","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-3-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/DoctorWkt.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2017-03-08T08:18:21.000Z","updated_at":"2025-05-13T06:35:16.000Z","dependencies_parsed_at":"2023-03-14T09:30:36.012Z","dependency_job_id":null,"html_url":"https://github.com/DoctorWkt/4bsd-uucp","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/DoctorWkt/4bsd-uucp","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DoctorWkt%2F4bsd-uucp","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DoctorWkt%2F4bsd-uucp/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DoctorWkt%2F4bsd-uucp/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DoctorWkt%2F4bsd-uucp/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/DoctorWkt","download_url":"https://codeload.github.com/DoctorWkt/4bsd-uucp/tar.gz/refs/heads/4.3BSD","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DoctorWkt%2F4bsd-uucp/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28755561,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-25T16:32:25.380Z","status":"ssl_error","status_checked_at":"2026-01-25T16:32:09.189Z","response_time":113,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["bsd","retro","simh","unix"],"created_at":"2024-12-27T04:11:35.349Z","updated_at":"2026-01-25T17:01:48.942Z","avatar_url":"https://github.com/DoctorWkt.png","language":"Lex","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 4bsd-uucp\nThis is a script and a set of template files which customises a generic 4.3BSD\nSimH disk image so that it acts as a uucp node and connects to other uucp\nnodes via TCP links.\n\n# Installation\nYou will need the *bsdtar* program installed so that tarballs compatible with\n4.3BSD can be installed. On Ubuntu, `sudo apt-get install bsdtar`. *Can someone\nadd instructions for other systems? The source for bsdtar is at\n\u003chttp://www.libarchive.org/\u003e*\n\nYou will also need a recent version of SimH: 4.0; version 3.9 doesn't work.\nYou can download the SimH Github repository at \u003chttps://github.com/simh/simh\u003e.\nIn your local copy, build a vax780 SimH binary and copy the resulting binary\nsomewhere useful:\n\n```\nmake vax780\nsudo cp BIN/vax780 /usr/local/bin\n```\n\nDownload this Github repository. In this repository, compile the mktape\nprogram:\n\n```\ncc -o mktape mktape.c\n```\n\nYou will see the generic 4.3BSD SimH image, `rq.dsk.gz`. The `buildimg` script\nbuilds a tarball for each uucp system with the specific changes for that\nsystem.\n\nAs an example, look at the `site_generate` script:\n\n```\n# An example of three uucp sites connected in series\n#\n#    site5 ----- site6 ----- site7\n#\n./buildimg site5:5000 site6:localhost:6000\n./buildimg site6:6000 site5:localhost:5000 site7:localhost:7000\n./buildimg site7:7000 site6:localhost:6000\n```\n\n*site5* allows you to telnet in on TCP port 5000. Ditto *site6* and TCP\nport 6000, and *site7* and TCP port 7000.\n\n*site5* has a (simulated) hard-wired serial connection to *site6* through\nTCP port 6000. The syntax allows *site6* to be on a remote computer, e.g.\navailable through www.somewhere.com:6000.\n\n*site6* has a (simulated) hard-wired serial connection to *site5* and *site7*.\nFinally *site7* has a (simulated) hard-wired serial connection to *site6*.\nThis means that each site can initiate a connection to another site; they\ndon't have to wait for the other site to dial in.\n\nFor each site, there are two files generated:\n* `siteX.ini` is the SimH config file to run this system\n* `siteX.tap` is a tarball in *tap* format with the customisations\n\nWe also need to copy the generic disk image `rq.dsk.gz` to be the disk\nfor each site:\n\n```\nzcat rq.dsk.gz | dd conv=sparse \u003e site5.dsk\nzcat rq.dsk.gz | dd conv=sparse \u003e site6.dsk\nzcat rq.dsk.gz | dd conv=sparse \u003e site7.dsk\n```\n\nI prefer to use `dd conv=sparse` because a lot of the disk image is empty\nand this saves disk space for these files.\n\n# Customising each System\n\nOnce you have a disk, a config file and the customisation tape, here is\nhow you customise the system. Boot up the system:\n\n```\nvax780 site5.ini\n```\n\nAt the `login:` prompt, login as *root* with no password. At the shell prompt,\nread in and unpack the tarball, and run a script which sets appropriate\nfile permissions:\n\n```\nmyname# tar xf /dev/rmt12\ntar: blocksize = 1\nmyname# ./mkdirs\n29 password entries, maximum length 93\nType ctrl-D at the # prompt to restart things\nerase ^?, kill ^U, intr ^C\n#\n```\n\nType a ctrl-D to restart in multi-user mode and login as *root*.\nYour system now has a hostname:\n\n```\nlogin: root\nLast login: Wed Mar  7 10:52:10 on console\nYou have mail.\nDon't login as root, use su\nsite5#\n```\n\nRepeat the process for the other sites, e.g. *site6* and *site7*.\n**SET ROOT PASSWORDS NOW!!** It is a good idea to reboot your simulated\nsystem, as this will pick up the new kernel from the tarball.\n\n# Sending E-mail\n\nOn *site5* you can send e-mail to `site6!root` and `site6!site7!root`.\nWatch out for escaping the bang characters as the shell is *csh*, e.g.\n\n```\necho Hello there | mail site6\\!site7\\!root\n```\n\nYou should be able to work out the bangpaths to send e-mails on the other\nsystems.\n\n# Testing Your Serial Links\n\nYour mail is now sitting on your system waiting to be delivered over uucp.\nBefore you try to do a uucp connection, you can check if you have a working\nserial link with a remote uucp site. In your simulated 4.3BSD system, edit\nthe *dialer* line in */etc/remote* to say:\n\n```\ndialer:dv=/dev/tty00:br#9600:\n```\n\nNow try:\n\n```\n# tip dialer\n```\n\nwhich should connect out over */dev/tty00* to the remote uucp site via the\nTCP connection. Hit Return a few times to see if there is any response. On your\nhost system, do `netstat -a | grep ESTAB` and see if there is a TCP connection\nto the remote system. To get out of *tip*, type in the two characters `~.`\n\n# Performing UUCP Connections\n\nHere is how to perform a manual uucp connection. On *site5*, to call *site6*:\n\n```\n# /usr/lib/uucp/uucico -r1 -ssite6 -x7\nroot site6 (3/9-06:27-166) DEBUG (Local Enabled)\nfinds (site6) called\ngetto: call no. tty00 for sys site6\nUsing DIR to call\nOpening /dev/tty00\nlogin called\nwanted \"\"\"\"\ngot: that\n. . .\nPassword:got: that\nsend \"uucp\"\nroot site6 (3/9-06:27-166) SUCCEEDED (call to site6 )\nimsg looking for SYNC\u003c\n\\20\u003e\nimsg input\u003cShere=site6\\0\u003egot 11 characters\nomsg \u003cSsite5 -Q0 -x7\u003e\nimsg looking for SYNC\u003c\n. . .\nProto started g\nprotocol g\nroot site6 (3/9-06:27-166) OK (startup tty00 9600 baud)\n*** TOP ***  -  role=MASTER\ndaemon site6 (3/9-06:27-166) REQUEST (S D.site5B00D2 D.site5S00D2 daemon)\n. . .\nPROCESS: msg - SY\nSNDFILE:\nsend 0221\nsend 0231\nsend 0241\nrec h-\u003ecntl 042\nstate - 010\n. . .\ndaemon site6 (3/9-06:27-166) OK (conversation complete)\nsend OO 0,omsg \u003cOOOOOO\u003e\nimsg looking for SYNC\u003c\\0\\0\\20\u003e\nimsg input\u003c     \\5*%\\3\\20\u003e\nimsg input\u003c     \"*\\10   \\20\u003e\nimsg input\u003c     \"*\\10   \\20\u003e\nimsg input\u003cOOOOOO\\0\u003egot 6 characters\nsite5#\n```\n\nThe `-x7` flag turns on debugging; it's not normally used in production.\nNow go to *site6* and run a similar command to forward the e-mail to\n*site7*:\n\n```\n# /usr/lib/uucp/uucico -r1 -ssite7 -x7\n```\n\nOn *site7*, you can now read your e-mail:\n\n```\nsite7# mail\nMail version 2.18 5/19/83.  Type ? for help.\n\"/usr/spool/mail/root\": 3 messages 3 new\n\u003eN  1 MAILER-DAEMON Sat Jul  9 23:21  35/1191 \"Returned mail: Host unknown\"\n N  2 MAILER-DAEMON Sat Jul  9 23:22  33/986 \"Returned mail: Host unknown\"\n N  3 site5!root Wed Mar  7 11:02  14/422\n\u0026 3\nMessage  3:\nFrom site6!site5!root Wed Mar  7 11:02:14 1984\nReceived: by site7.ARPA (4.12/4.7)\n        id AA00173; Wed, 7 Mar 84 11:02:14 pst\nReceived: by site6.ARPA (4.12/4.7)\n        id AA00168; Wed, 7 Mar 84 10:58:33 pst\nReceived: by site5.ARPA (4.12/4.7)\n        id AA00170; Wed, 7 Mar 84 10:55:27 pst\nDate: Wed, 7 Mar 84 10:55:27 pst\nFrom: site6!site5!root (Charlie Root)\nMessage-Id: \u003c8403071855.AA00170@site5.ARPA\u003e\nTo: site6!site7!root\nStatus: R\n\nHello there\n\n\u0026\n```\n\n# Automating uucp Connections\n\nYou can edit `/usr/lib/crontab` to have entries that run *uucico* for each site\nthat you connection to. Here is an example line that connects to *site6*\nevery minute:\n\n```\n* * * * * uucp /usr/lib/uucp/uucico -r1 -ssite6\n```\n\n# Dealing with Multiple Outbound Connections\n\nThe system has to dedicate a */dev/tty0x* device for each outbound uucp\nconnection. If you have this situation, read through the \n[tcpdial](Docs/Tcpdial.md) documentation for a solution.\n\n# Setting up Mail\n\nThe mail system uses *pathalias* and *smail*, as well as *sendmail*.\nThese allow you to send e-mail to a uucp site several hops away like this:\n\n```\n$ echo hello | mail user@site.uucp\n$ echo hello | mail site!user\n$ echo hello | mail long!bang!path!to!site!user\n```\n\n*smail* needs to derive a set of best paths to all the remote sites on the\nglobal uucp network. To do this, copy the [uucp.map](uucp.map) file into your\nsystem as the file `/usr/lib/uucp/uucp.map`. Then run the\n`/usr/lib/uucp/mkpaths` script to create the file `/usr/lib/uucp/paths`.\nThis holds the best path to deliver mail to each site.\n\nIf you see very high numbers, that's a *pathalias* bug. Edit the file\nand set the number down to e.g. 10000.\n\n# Setting up News\n\nThe *buildimg* script will configure your system to be ready to run C News,\nbut you need to set up some cron jobs to actually make it happen. Read\nthrough the [C News documentation](Docs/Cnews_setup.md) to see how to do this.\n\n# Other Applications\nIf you want to install other applications, you'll have to find them, compile them\nand install them. There is an archive of applications already configured at\n\u003chttp://www.tuhs.org/Uucp/43BSD_Apps\u003e. You might also want to look at an archive of\nthe [http://ftp.acc.umu.se/mirror/archive/ftp.sunet.se/pub/doc/usenet/ftp.uu.net/comp.sources.unix/](comp.sources.unix) Usenet postings.\n\n# Security\nThe *tty* lines are exposed to the Internet through the bound TCP port, so\nyou may want to implement some firewall rules to only allow connections from\nspecific IP addresses.\n\nThe tty lines are set as insecure in the 4.3BSD `/etc/ttys`, so they won't\nallow root logins. You can only login as root on the console, i.e. the place\nwhere you ran `vax780 system.ini`. You should probably do this in a *tmux*\nor *screen* session, so that you can get back to the 4.3BSD console easily.\n\nIt is a good idea to add a non-root user\nso that you can telnet in on the TCP port: *only do this on localhost, as\nthe telnet session is not encrypted*. If you add this non-root user to the\ngroup *wheel* (in `/etc/group`), then you can `su` and become root.\n\nMake sure that you are running the kernel from the *buildimg*-created tarball:\nyou will see *munnari ... 2017* as the kernel boots. The *tty* lines in the\nnew kernel are set to kill off running shells when an incoming telnet\nsession is closed or disconnects unexpectedly.\n\n# Disabling the Telnet Protocol\n\nIf you are running a SimH site which accepts connections from non-SimH uucp sites\n(or vice versa), then there can be a problem because SimH uses the Telnet protocol\non the TCP port to, for example, know when to echo/not echo text (think: passwords).\nThis can cause uucp protocol problems, as the Telnet can interpret the incoming uucp\ndata, which screws up the uucp protocol.\n\nIf you have this situation, you can set up an incoming TCP port with Telnet disabled.\nYou will still want some of your simulated tty lines doing Telnet, so that you can log\ninto your simulated 4.3BSD system and have your password hidden. Here is an example\nSimH configuration file with Telnet disabled.\n\n```\n# Set up eight DZ serial ports in 8-bit mode.\n# Connect to a remote uucp site on 127.0.0.1:6000\n# Listen on TCP port 5001 with Telnet disabled\n# All other DZ lines will listen on port 5000 with Telnet enabled\nset dz lines=8\nset dz 8b\nattach dz -a -m line=0,Connect=127.0.0.1:6000\nattach dz -a -m line=1,5001;notelnet\nattach dz -a -m 5000\n```\n\n# Notes and Gotchas\n\nAt present, none!\n\n# Joining the Growing UUCP Network\n\nIf you are interested in joining this simulation of the 1980s *uucp* network,\nthen send some e-mail to Warren Toomey. Indicate what historical *uucp*\nsite(s) you want to run and which other sites you want to connect to.\n\nIf you don't know what historical site to choose, have a look at the maps here:\n\u003chttp://www.redace.org/html/logical_usenet_map_1984.html\u003e\n\nIf you have a specific historical site in mind, do a search on the site's\nname, e.g. \"#N decvax\", and include the double quotes; add the *uucp* keyword\nas well if you like. Look for the lines after the \"#N decvax\" without hash\ncharacters: they show you the connectivity that this site used to have.\nAn example for *decvax*:\n\n```\n#N\tdecvax, decvax.dec.com\n#S\tVax 8300; Ultrix 32 V2.2\n#O\tDigital Equipment Corp.\n#C\tLarry Palmer\n#E\tdecvax!lp\n#T\t(603)8848385\n#P\tMK2-1/H10 Continental Blvd, Merrimack, NH 03054\n#L\t42 49 N / 71 31 W\n#R\t\n#W\t\n#U\tbellcore cca mandrill dartvax decwrl genrad gsg harpo ichaya \n#U\tlinus mcnc savax tektronix ucbvax vortex yale\n#R\tdecvax has moved to a new location - an update is expected soon... -jj\n#\n# local calls\ndecvax\tbu-tyng(DIRECT), ichaya(DIRECT), savax(DIRECT), sequitor(DIRECT), \n\tshaman(DIRECT), sii(DIRECT), skippy(DIRECT), stellar(DIRECT)\n# Internet\ndecvax  decwrl(DEDICATED), ucbvax(DEDICATED)\n#\n# frequent calls\ndecvax\tbellcore(HOURLY), cca(HOURLY), cg-atla(HOURLY), mandrill(HOURLY), \n\tdeceds(HOURLY), decuac(HOURLY), genrad(HOURLY), granite(HOURLY), \n\thanauma(HOURLY), ihnp4(HOURLY), lafite(HOURLY), \n\tlinus(HOURLY), mcnc(HOURLY), mit-athena(HOURLY), netrix(HOURLY), \n\ttektronix(HOURLY), vortex(HOURLY), yale(HOURLY)\n#\n# non-prime time calls\ndecvax\tallegra(EVENING), astrovax(EVENING), bobo(EVENING), brunix(EVENING),\n\tbunker(EVENING), cbosg(EVENING), cbosgd(EVENING), cincy(EVENING),\n\tcornell(EVENING), cray(EVENING), duke(EVENING), emory(EVENING), \n\tencore(EVENING), esquire(EVENING), farance(EVENING), freeport(EVENING),\n\tgatech(EVENING), hcr(EVENING), hermix(EVENING), hjuxa(EVENING), \n\thplabs(EVENING), idis(EVENING), ima(EVENING),\n\tmasscomp(EVENING), microsoft(EVENING), mit-vax(EVENING), \n\tmtxinu(EVENING), netword(EVENING), philabs(EVENING), pur-ee(EVENING), \n\tpurdue(EVENING), randvax(EVENING), research(EVENING), \n\trochester(EVENING), sdcsvax(EVENING), sickkids(EVENING), std(EVENING), \n\tstolaf(EVENING), sun(EVENING), trwrb(EVENING), ucf-cs(EVENING), \n\tulysses(EVENING), usenix(EVENING), utah-cs(EVENING), utzoo(EVENING), \n\tuw-beaver(EVENING), vax135(EVENING), watmath(EVENING)\n#\n# very long distance calls\ndecvax\tmulga(DAILY)\n#\n# incoming calls\ndecvax\tapollo(POLLED), attunix(POLLED), bbn(POLLED), bhjat(POLLED), \n\tbrl-smoke(POLLED), chaos(POLLED), cvbnet(POLLED), dartvax(POLLED),\n\telrond(POLLED), epiwrl(POLLED), flkvax(POLLED), \n\tfrog(POLLED), gsg(POLLED), harpo(POLLED), howtek(POLLED), \n\thumus(POLLED), jaxlab(POLLED), ll-xn(POLLED), mindcrft(POLLED), \n\tmkunix(POLLED), necntc(POLLED), nicmad(POLLED), noao(POLLED), \n\tnrl-css(POLLED), plato(POLLED), raster(POLLED), stcvax(POLLED), \n\tsunybcs(POLLED), tifsie(POLLED), unh(POLLED), virgin(POLLED), \n\twang(POLLED)\n```\n\nFor central sites (like *decvax*) that had a lot of connectivity, you will be\nexpected to run them continuously. For edge sites which only dial in to one\nother site to exchange news and e-mail, you can run them whenever you want.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdoctorwkt%2F4bsd-uucp","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdoctorwkt%2F4bsd-uucp","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdoctorwkt%2F4bsd-uucp/lists"}