Warren Toomey, June 2026
I got C News to work on 4.3BSD with my 4bsd-uucp project. Now I'm trying to bring C News up on 2.11BSD and I'm stuck!
The symptom: I can post a news article on one machine and I see it transfer
via UUCP over TCP to a second machine. I see it arrive in the X. uucp
spool folder. Then is disappears before being put in the news spool area.
I'm leaving what I've done here, with these notes, in the hope that someone can help work out the problem and fix it.
You will need to install the pdp11 simulator from the
OpenSimH project and also
the bsdtar program (if you are on Linux). Here is what I did:
$ git clone https://github.com/open-simh/simh
$ cd simh
$ make pdp11
$ cp BIN/pdp11 my_local_bin_directory
$ sudo apt-get install libarchive-tools
Now unpack the tarball that came with these instructions. You should see:
usr/ and tmp/ hold the C News source and binaries along with some
scripts that I wrote.Back/ holds a pre-prepared 2.11BSD disk image created from
Chase Covello's
2.11BSD disk image.GEORGE, NEUMANN, george.ini and neumann.ini are the OpenSimH
scripts and configuration files to run two 2.11BSD systems.You should be able to do:
$ make
$ make getback
to copy the pre-prepared disk image to george.dsk and neumann.dsk
and to create the C News install tapes george.tap and neumann.tap.
Have a quick look at the two "ini" files. You will see, in george.ini:
attach dz -a -m line=0,6001;notelnet
att dz 6000
...
att xu nat:tcp=6023:10.0.2.4:23
This means that the simulated DZ-11 lines are connected to localhost TCP port 6000 and localhost port 6023 is forwarded to the simulated 2.11BSD Telnet daemon.
Note that port 6001 is special: this is a DZ-11 line with the Telnet protocol disabled. We will run UUCP on these ports: if we left the Telnet protocol on, then some file transfers will trigger this protocol and make the UUCP transfer fail.
Over on Neumann we have TCP port 7000 for the DZ-11 lines, port 7023 for telnet and port 7001 for UUCP transfers.
This means that you can telnet to localhost ports 6000 or 6023 to connect to George, and localhost ports 7000 or 7023 for Neumann.
You first need to know your real machine's IP address, as the two 2.11BSD systems will talk to each other via TCP ports on your real machine. My laptop's IP address is 10.10.1.45; I will use this below.
I'll go through the setup for neumann but it will be essentially the
same for george.
Run the NEUMANN script to start the pdp11 simulator with neumann.ini:
$ ./NEUMANN
...
login: root There is no password
erase, kill ^U, intr ^C
#
Now extract C News from the attached tape:
# tar xf /dev/rmt0
tar: blocksize = 1
Jun 9 15:03:32 pdp11 unix: tms0 Ver 5 Mod 3
#
Set the password for uucp to e.g. uucp1234:
# passwd uucp
Changing password for uucp.
New password:
Retype new password:
Now cd /tmp; you will see:
# cd /tmp
# ls -l
total 81
drwxr-x--x 2 1000 512 Jun 9 03:29 RCS
-rwxr-x--x 1 1000 1835 Jun 9 01:45 add_newspeer
-rwxr-x--x 1 1000 73706 Jun 9 01:10 ftp
-rwxr-x--x 1 1000 693 Jun 9 01:17 set_hostname
-rwxr-x--x 1 1000 4512 Jun 9 03:30 setup_cnews
ftp is an ftp client which knows about PASV. The set_hostname
script sets your system's hostname. The setup_cnews script does
the C News install, and the add_newspeer script configures a connection
to a news peer.
Start with setting your hostname:
# ./set_hostname neumann
About to change hostname to neumann in 5 seconds
Assuming NETWORKING system ...
add host neumann.home.lan: gateway 127.0.0.1: File exists
add net default: gateway 10.0.2.2: File exists
pool.ntp.org: delay:0.049958 offset:-0.968485 Tue Jun 9 15:06:50 2026
Now run the setup_cnews script:
# ./setup_cnews
mkdir: /usr/lib/news: File exists
Making directory /usr/spool/news
Making directory /usr/spool/news
Making directory /etc/news
...
Adding newsgroup directories
making control (and parents if needed...)
making junk (and parents if needed...)
making news/announce/newusers (and parents if needed...)
making pidp11/test (and parents if needed...)
#
This goes into /usr/local/src/cnews and runs several make actions
as well as setting up several directories and editing a few files.
Finally, add George as a news peer. Remember to use your own IP address! The arguments are: name, IP address, TCP port, UUCP password:
# ./add_newspeer george 10.10.1.45 6001 uucp1234
Done. Now tell the george admin to add your uucp site
with their ./add_newspeer script.
#
Now you can do the same procedure above on George so that it can connect to Neumann.
The main configuration directory is /etc/news:
# cd /etc/news
# ls
active batchparms history mailname report.ctl
active.times bin history.dir mailpaths sys
batchlog explist history.pag organization whoami
active lists the active newsgroups. sys lists the peer news machines
that we know and what newsgroups they want.
Over in /etc/uucp:
# cd /etc/uucp
# ls
L-devices L.sys SEQF clean.weekly
L-dialcodes L_stat USERFILE uucp-map
L.cmds L_sub clean.daily
L.sys holds the list of remote UUCP machines that we know and how to
connect to them. L.cmds holds the commands on this machine that a
remote UUCP machine can execute.
Now the spool directories:
# cd /usr/spool/news
# du
1 ./in.coming/bad
2 ./in.coming
1 ./out.master
1 ./out.going/george
2 ./out.going
1 ./out.nntp
1 ./control
1 ./junk
1 ./news/announce/newusers
2 ./news/announce
3 ./news
1 ./pidp11/test
2 ./pidp11
There is an in.coming directory, an out.going directory for each peer,
an out.master directory to hold news batches, and then directories for
each newsgroup.
# cat /etc/crontab
0,15,30,45 * * * * root /usr/libexec/atrun
5 0 * * * root /bin/sh /usr/adm/daily 2>&1 | mail root
15 0 * * 6 root /bin/sh /usr/adm/weekly 2>&1 | mail root
35 0 1 * * root /bin/sh /usr/adm/monthly 2>&1 | mail root
0-55/5 * * * * news /etc/news/bin/input/newsrun
2-52/5 * * * * news /etc/news/bin/batch/sendbatches
59 0 * * * news /etc/news/bin/expire/doexpire
10 8 * * * news /etc/news/bin/maint/newsdaily
05,35 * * * * news /etc/news/bin/maint/newswatch 3000 300 100
4-54/5 * * * * uucp /usr/sbin/uucico -r1 -sgeorge
newsrun takes incoming postings and moves them into newsgroup directories.
sendbatches prepares news batches to send to other machines.
Make a test call from Neumann to George. On Neumann:
# uucico -r1 -x7 -sgeorge
-r1 means start as the master of the connection, -x7 turns on a high
level of debugging.
# uucico -r1 -x7 -sgeorge
root george (6/9-15:20-1044) DEBUG (Local Enabled)
finds (george) called
getto: call no. george for sys george
Using TCP to call
bsdtcpopn host george, port 6001
login called
wanted "login:"
2.11 BSD UNIX (george) (tty00)
login:got: that
send "uucp"
wanted "assword:"
uucp
Password:got: that
send "uucp1234"
root george (6/9-15:20-1044) SUCCEEDED (call to george )
TCPIP connection -- ioctl-s disabled
imsg looking for SYNC<
\20>
imsg input<Shere=george\0>got 12 characters
omsg <Sneumann -Q0 -x7>
imsg looking for SYNC<
\20>
imsg input<ROK\0>got 3 characters
msg-ROK
Rmtname george, Role MASTER, Ifn - 5, Loginuser - root
rmesg - 'P' imsg looking for SYNC<\20>
imsg input<Ptg\0>got 3 characters
got Ptg
wmesg 'U' t
omsg <Ut>
Proto started t
protocol t
root george (6/9-15:20-1044) OK (startup)
*** TOP *** - role=MASTER
wmesg 'H'
rmesg - 'H' got HY
PROCESS: msg - HY
HUP:
wmesg 'H' Y
cntrl - 0
root george (6/9-15:20-1044) OK (conversation complete)
send OO 0,omsg <OOOOOO>
imsg looking for SYNC<\20>
imsg input<OOOOOO\0>got 6 characters
TCP CLOSE called
closed fd 5
Over on George, if you look in /usr/spool/uucp/LOGFILE, you will see:
uucp neumann (6/9-15:20-1032) DEBUG (Remote Enabled)
uucp neumann (6/9-15:20-1032) OK (startup tty00 9600 baud)
uucp neumann (6/9-15:21-1032) BAD READ (expected 'H' got FAIL (2))
uucp neumann (6/9-15:21-1032) FAILED (conversation complete)
On Neumann, do:
# postnews pidp11.test
Subject: Hello
You will be placed in a vi session. Edit the line that says so, and add
some content:
Newsgroups: pidp11.test
Subject: Hello
Half a league, half a league.
Cheers, Fred
Exit vi. The news post is now here:
# du -a /usr/spool/news
1 /usr/spool/news/in.coming/bad
1 /usr/spool/news/in.coming/0.17810438460.t
To process this posting:
# su - news
% /etc/news/bin/input/newsrun
% /etc/news/bin/batch/sendbatches
Do a ctrl-D to exit from the news shell
You will see the news article now here:
# du -a /usr/spool/news
1 /usr/spool/news/pidp11/test/1
1 /usr/spool/news/pidp11/test/.overview
3 /usr/spool/news/pidp11/test
You can read the news with the rn news reader. Just hit Enter
at each prompt:
# rn
Setting up .newsrc...
Creating .newsrc in / to be used by news programs.
/usr/local/newsetup: /etc/news/bin/getactive: not found
/usr/local/newsetup: /tmp/active.1383: cannot open
Done.
If you have never used the news system before, you may find the articles
in mod.announce.newuser to be helpful. There is also a manual entry for rn.
To get rid of newsgroups you aren't interested in, use the 'u' command.
Type h for help at any time while running rn.
New newsgroups:
Add control? [yn]
Put where? [$^L]
Add junk? [yn]
Put where? [$^.L]
Add news.announce.newusers? [yn]
Put where? [$^.L]
Add pidp11.test? [yn]
Put where? [$^.L]
**** 1 in pidp11.test--read? [ynq]
Article 1 in pidp11.test:
From: root@neumann (The Man)
Subject: Hello
Message-ID: <tGDy86.ur@neumann>
Organization: Sirius Cybernetics, Sirius City branch
Date: Tue, 9 Jun 2026 22:24:06 GMT
Half a league, half a league.
Cheers, Fred
End of article 1 (of 1)--what next? [npq]
End of pidp11.test
**** End--next? [npq]
Let's manually connect via UUCP and send the news batch to George:
# uucico -r1 -x7 -sgeorge
...
#
Over on George, the /usr/spool/uucp/LOGFILE says:
uucp neumann (6/9-15:27-1090) DEBUG (Remote Enabled)
uucp neumann (6/9-15:27-1090) OK (startup tty00 9600 baud)
uucp neumann (6/9-15:27-1090) REQUESTED (S D.neumannB3Qg2 D.neumannS3Qg2 news)
news neumann (6/9-15:27-1090) REQUESTED (S D.neumannX3Qg0 X.neumannd3Qg3 news)
news neumann (6/9-15:27-1090) OK (conversation complete)
uucp neumann (6/9-15:27-1208) news XQT (rnews)
The last line says that the rnews program on George has processed the
incoming news batch.
I used a separate Telnet session to catch the files that were created on
George before rnews processed them.
# cat X./X.neumannd3Qg3
U news neumann
R news
F D.neumannS3Qg2
I D.neumannS3Qg2
C rnews
# cat D./D.neumannS3Qg2
#! cunbatch
followed by compressed content
So, the news batch definitely gets from Neumann to George. George
invokes /etc/news/bin/rnews to process the D. file. rnews
is a shell script which loads the /etc/news/bin/config file;
this has all the paths that C News needs to know.
The cunbatch program is in /etc/news/bin/input/cunbatch.
Perhaps we need to add /etc/news/bin/input to one or more of
the config entries in /etc/news/bin/config?
Unfortunately, C News doesn't log very much information.
In /etc/news there are files log and batchlog but
they contain next to nothing.
That's as far as I've got. If you have any suggestions or, even better, a working solution, please e-mail me at wkt @ tuhs.org, thanks!