Thursday, December 13, 2012

Basic ITS hacking

OK, so ITS has only one level of directory in its file system, otherwise known as the SNAME portion of a filename.

How do you create a directory if there isn't one already? For instance, if you login as an unknown user JAO and ITS complains it can't find MD:USERS1;LOGIN JAO, and Emacs won't let you create a file USERS1;LOGIN JAO because USERS1; doesn't exist, what do you do?

I expected there to be a DDT command to create a directory. But there isn't one. I found a cryptic comment to "look at the documentation for the OPEN UUO." So I did. Examining SYSDOC;_CALLS.124
The file names  ..NEW. (UDIR)  cause a new directory
to be created with the given sname if none already
exists.  Creating a directory in this way causes a
message to be printed on the system console.
(A directory is destroyed only when the disks are
salvaged by the stand-alone salvager, which is generally
run just before the time-sharing system is restarted.
A directory is then destroyed iff it contains no files.) 
I.e., a magic file name which, if opened, causes a new SNAME to be created. I used Emacs Find File: ^X^F USERS1; DSK: ..NEW. (UDIR) (note that Emacs is a bit scrambled in how it presents file names) but you probably should do something simpler like asking DDT to
:PRINT DSK:USERS1;..NEW. (UDIR)
TODO: Document here what I did for PWORD, PANDA

Still to puzzle out: what to do with INQUIR and how to simulate ACOUNT if I have already logged in as the user.

Getting KLH-10 and ITS to work under Mac OS X

I've cycled back to being interested in the Incompatible Timesharing System (ITS). In the interim, I replaced my G4 iBook with a Intel-based MacBookPro. With a bit of hacking, I was actually able to get local networking to communicate with the simulated PDP-10, and thought I would record some of the details.

I needed to
  • Install tuntaposx. I used the macports version.
  • Crudely hack the ks-base-its build in klh10-2.0h from panda-dist (and additional patches) to define KLH10_NET_TUN=1 under Mac OS X. I need to clean up my own sources and put them up on github. Also, I needed to hack around the removal of "mtio.h" from Mac OS X 10.6, borrowing the minimum definitions from FreeBSD headers. I guess Apple decided they really didn't want tape drives connected to their machines. Maybe it is still in OS X server?
  • There are a few rough edges in tun/tap support. Following a hint I found online, I open a bash shell as root, and execute
    • exec 4<> /dev/tap0 # create the interface by opening the device
    • ifconfig tap0 192.168.100.110 192.168.200.105 # .100.110 is the address for the KLH10, 200.105 is the host Mac OS X network address
  • In KLH10, configure dpimp parameters to open the tap interface address
    • devdef imp  ub3   lhdh   addr=767600 br=6 vec=250 ipaddr=192.168.100.110 gwaddr=192.168.200.1 debug=0 ifc=tun0 dpdebug=0 dedic=true doarp=true
  • Boot ITS using the MD image, built to expect 192.168.100.110 as the IMP address and dumped.
    • set the value of the environment variable KLH10_HOME
    • cd ${KLH10_HOME}
    • ./kn10-ks klh10-md.ini
  • Once ITS is up From another shell, I can then 
    • telnet 192.168.100.110
    • :TCTYP vt52 # convince ITS I am not using a hardcopy terminal
  • Using the Java supdup client from Bjorn Victor's site, can can
    • File > Connect 192.168.100.110
I'm still a bit foggy on what dpimp is doing with /dev/(tap|tun)0 and arp commands. The arp seems to fail, but the network still is up. It isn't accessible to other computers on my LAN, although (surprise!) my Mac OS X firewall seems to have been turned off. Ignoring for now that ITS is a dangerously trusting Internet host, I think it should be possible for ITS itself to respond to ARP. What I don't understand yet is whether tap/tun will show the ARP requests from other machines to ITS, whether ITS knows how to reply to them, or whether I need to get the Mac OS X network stack to either route external packets for .100.110 to appear on the tap interface, broadcast that routing information, or reply to ARP requests on behalf the the ITS machine.

What I really want is a chapter suitable for inclusion in Steven's TCP/IP networking book that explains tun/tap and how networking with virtual machines can work. The existing documentation for these kinds of things tends to be "here's a script that works" and not solid explanations.