ShadowM's Q-Link Page(last updated 2013-05-10)
Quantum Link (Q-Link for short) was an online service for Commodore 64 users that started in the mid-80s and ran until Hallowe'en 1994; it later went on to become America Online (AOL). Here's a video of a Q-Link session from 1989, digitized by Raymond Day; you can even hear his modem dialing in at the beginning. In 2005, the original server (which was accessed via modem over a phone line) was reverse-engineered by Jim Brain, Keith Henrickson, and others, and released as a TCP/IP server running under Java. It had its debut at the SWRAP 2005 expo, where it generated tremendous excitement (here's the video I took of Jim's presentation at the show).
Unfortunately, few people joined the project to code, and interest began to fade. I gave a presentation at ECCC 2008 called "Hacking the Q-Link Source: How to get involved in the Q-Link Reloaded Project", but by that time, problems had begun to arise. First the domain the server was hosted on was allowed to expire, then the database the server ran on was lost in a hard drive failure. Eventually, the service had not run for several years. Rather than watch Q-Link fade into oblivion a second time, I decided to run a server myself and make the source available to anyone who wants it. (The server is running on a Raspberry Pi as of 2013-01-10.)
NEWS: Linux Journal asked its readers to post what they've done with the Raspberry Pi; my tweet (and this web page) is mentioned on their letters page!
Connecting to Q-Link
The Q-Link Source Code
To Do List/Status
back to main Commodore page
You can connect to my Q-Link server using the Q-Link client disk (not a web browser) at qlink.lyonlabs.org:5190 (if you have trouble using the URL, try the IP address, which you can find by using ping or nslookup). I didn't use the dump I have of the Q-Link Reloaded database, but instead created one from scratch using the instructions referenced below, so use a fresh Q-Link disk for this server. If there end up being multiple Q-Link servers out there, you'll need to use a different disk for each one. Here's a disk image of a fresh Q-Link disk.
I've registered a channel on NewNet (#qlink) for people to ask questions and have other discussions about Q-Link. If you find a bug, don't hesitate to describe it in channel (or email me at shadowm at lyonlabs dot org); odds are I'll find a stack trace in the logs that points to the problem. A list of steps that will trigger the bug is always helpful, and the date and time you experienced the issue is helpful when inspecting the log file.
Here are some tips on getting it up and running; see also
If you have trouble connecting, the easiest way to verify whether it's your setup or my server is to telnet to port 5190 on my server like this:
telnet qlink.lyonlabs.org 5190Hit Enter a few times; you should see this:
TERMINAL=If you get that, the problem is probably the way you have your Q-Link client configured.
You should connect to Q-Link with a real Commodore 64 (although it's possible with an emulator). The most common way of doing it is to use a serial interface plugged into the user port of the '64, with a null-modem cable running to the serial port of a PC. On the PC, you run software which translates the serial data coming from the '64 to TCP/IP network packets, which get sent out over the internet to the Q-Link server. Your '64 is none the wiser, and thinks it is connected via modem. Most people use tcpser for this, which is available in most Linux distributions. You pass it the same dummy phone number you used when setting up Q-Link (see below). The command I use to start tcpser under Linux is:tcpser -d /dev/ttyS0 -s 1200 -i"e0&k0&c0" -n"5551212=qlink.lyonlabs.org:5190" -tsS
For this configuration, I use the Hayes-compatible settings in Q-Link. Note: if you have trouble using the URL, try the IP address, which you can find by using ping or nslookup.
*** Channel 1 Baudrate 1200, I/F Mode 4C, Flow 02 Port 00000 Remote IP Adr: 192.168.001.205, Port 05190 Connect Mode : D5 Disconn Mode : 80 Flush Mode : 00
With both a Lantronix and the VICE emulator, I use the manual dial settings in Q-Link; just hit Enter when prompted to dial Q-Link.
If you want to use an emulator, naturally all your friends will make fun of you, but it can be done. Here's how I got it to work using the VICE emulator under Linux (I'll assume that you have figured out how to build and install it). The main idea is to get VICE to use netcat to do the serial-to-TCP/IP translation that software or a Lantronix box does when using a real '64 (note the pipe symbol in the last screenshot). See your system's documentation for netcat (or nc; on some distros, those two names point to the same program). A helpful Mac user advises that the version of nc supplied with OS X may be broken and that it would be better to build GNU netcat instead. Beware that netcat (or nc) may still be running after you exit Q-Link, holding open the local port you are trying to use. You may need to restart VICE between runs, or even exit VICE entirely and kill the netcat process.
device: run a program
program to run
program and parameters
Here are some tips on using Q-Link on the '64:
I think part of the reason there wasn't more involvement from people willing to code for the project is that the source was not generally available (people wanting to work on it were asked not to share the source, even though it was released under GPL). I checked out a copy from the trunk on 2011-08-13 and checked it into my own Subversion repository, and I'm making it available to anyone who wants to study it. I've made only small changes so far; you can check the revision history to see. Here are the URLs:
source browsing (ViewVC): http://www.lyonlabs.org/viewvc/qlink
Don't download the ViewVC pages themselves. You can see from the graph on the right what that does to all my other guests who are trying to view the site. ViewVC is for browsing the code online.
svn checkout: http://www.lyonlabs.org/svn/qlink
To checkout the source from Subversion using the command line,
change to the directory you want it in and use this command:
svn co http://www.lyonlabs.org/svn/qlink/
Subversion is available in all the major Linux distros; you can also download it for many operating systems here.
I'm also making available my notes and SQL recipes to help in exploring the source; there's information in my ECCC slides that may be of interest as well. If you find any errors, please let me know (shadowm at lyonlabs dot org). The best protocol reference I've seen so far is in the reference/protocol subdirectory of the source.
For NetBeans users, here's how you can check out the code and create a project:
If you like, instead of just including martyr.jar in the second-last step, you can extract the entire martyr IRC library from this tarball and set up a NetBeans library, in order to get code completion. From NetBeans' main menu, select Tools / Libraries, create a new library called martyr-0.3.9, and fill in the blanks. Classpath is the jar file, and Sources is src/ where you extracted. There's no formal Javadoc, but there are API descriptions that will pop up when you do code completion.
To create the database, make sure you have MySQL installed, then follow the instructions in Mike Naberezny's notes, which you can find in reference/mike_n/01-getting-started.txt in the directory where you checked out from the repository. Make sure to add the extra tables he mentions; I'll commit an updated DDL at some point that also fixes some null dates.
I can't spend a lot of time helping people to get the source built, but any reasonably skilled Java programmer should be able to handle it. If your only interest is in running a server "to see how it works", please don't contact me. I'll only help people I think are sincerely interested in working on the code. If you want commit rights, send me some patches first (shadowm at lyonlabs dot org) and we can discuss them (see the To Do List for ideas).
There's quite a lot of reference material, graphics, disk images, comm dumps, &c. in the tree, including Keith Henrickson's original reverse-engineered server, written in C++. As Keith did much of the original work to decode the Q-Link protocol, it's only fair to mention this thread, which contains a response that looks like it's from him. I know there have been bounties in the Commodore community before; getting Keith to do more work on the project certainly seems like a good reason for one.
One last thing: the web-based administrative interface I was working on at one time has been largely rewritten to use Java EE 6. If making the code available generates more interest, I'll revive and complete that project (I'm already using it on my machine).
As far as documentation goes, the main thing we need is a clear and concise description of the Q-Link protocol. There are bits and pieces in the references directory of the source (the best one is here), but we need an easy-to-read document that says "To do that, send instruction XX with code like this."
//who command broken Probably the most well-known bug in Q-Link Reloaded is that in chat, using the //who command not only trashes the user's session, but makes it impossible to get back into chat at all, even after restarting the '64 and signing back in. Here's a server stack trace from someone using this command.
"stuck" account A person's account can sometimes be "stuck" in a signed-on state, giving the user the message "This account is already signed on" and emitting an entry like this in the log when the user tries to log in again. (This stack trace may be the cause of such an event; it occurred at about the same time a user reported it.)
posting doesn't always work Here's a server stack trace from someone trying to reply to an existing post on a message board.
It's been reported that when an online game ends, one player returns to People Connection normally, while the other experiences a crash of the Q-Link client.
SQL errors There are a lot of places where SQL statements are generated without proper hygeine (doubled single-quotes, &c.). Generally speaking, the whole database layer could use a rewrite.