Who Got Perl from Me?

August 2, 2019

Unexpectedly, I made the de-facto distribution tar files for source code releases of the Perl programming language for a year or two in the early 1990s. Up until sometime in the Perl 4 release cycle, its author Larry Wall distributed Perl by posting a set of several dozen shar (shell archive) files on the Usenet group comp.sources.unix or comp.sources.misc, so people using dialup modems could download them without having to restart if the phone disconnected. In between major releases, he posted patches which were much smaller than a full distribution.

I was volunteering for the GNU project, which distributed Perl as a courtesy since it was popular free software that used the GNU license. The GNU FTP site prep.ai.mit.edu distributed source code in compressed tar files, so each time Larry released a new Perl version, I downloaded the shars and created a single tar file which I uploaded to prep. Dozens of organizations mirrored the GNU FTP server and did their own redistribution, so it was amusing to notice that most of the Perl 3 tar files out there had my user name in them if you did a tar -tvf to list them. They seem to have fallen off the Internet by now, as the last Perl 4 release is the oldest version that’s easy to find.

I finally stopped when Larry started making tar files of Perl releases himself. Larry last posted Perl 4 patch shars to comp.sources.misc in June 1992. I don’t remember whether he started making tar files concurrently, or only after he stopped posting the shars.


Why Do Long Options Start with Two Dashes?

August 2, 2019

Around 1990, Richard Stallman (RMS) and I were writing the GNU C library getopt() and he wanted to extend it to support long (multi-character) option names for user-friendliness. He considered Unix inferior in this regard to other operating systems such as TOPS-20 which supported long options (that could be abbreviated). He wanted GNU to be better than Unix while still compatible. There were a few programs that ran on Unix systems and used long option names starting with either - or no prefix at all, such as find, but those syntaxes were not compatible with Unix getopt() and were parsed by ad-hoc code.

Long options needed a prefix that wouldn’t clash with the Unix conventions, so programs could support both types of options without ambiguity. Richard chose +, since logically if - (for a small number mathematically) is for short options then + would be for long options, and it’s no additional typing. We created an extended interface called getopt_long() to support specifying long options.

But when the IEEE POSIX shell and utilities standard was published in 1992, the + syntax was disallowed. GNU developers discussed what to do over email. We considered -+ as the long options prefix, but that was hard to type, so we settled on --, which wouldn’t violate POSIX or Unix compatibility and wasn’t hard to type.

For a few months, GNU getopt() supported both + and -- to allow time for people to transition their scripts. I’m pretty sure support for + during that transition could be disabled by setting the environment variable POSIX_ME_HARDER (RMS’s exasperation with standards showing there), later changed to the more polite POSIXLY_CORRECT, which also disables recognizing options intermixed with positional arguments.

Because GNU software was popular and the solution was logical, everyone else adopted the -- prefix and implemented variations of it in their own argument parsers. Perl was probably one of the first.

Sharing a Printer from Mavericks to Windows

January 14, 2015

Every few years I have to figure out a new way to share a Mac’s printer with Windows PCs. The printer is connected to a Mac with USB and shared using System Preferences>Sharing>Printer Sharing.

Apple provides Bonjour Print Services for Windows as a free download. It starts a service that discovers printers using the Zeroconf protocol, of which Apple’s implementation is called Bonjour (formerly Rendezvous before they lost a trademark dispute). It works great on Windows XP. But on Windows 7, Apple’s Bonjour service (as of version 2.0.2, which hasn’t been updated in years) is flaky, spewing tons of error messages to the event log and frequently losing the connection to the printer. I had to give up on it (and that’s without a Windows firewall getting involved).

When the Mac with the printer was running Snow Leopard (10.6), I could add the printer on Windows 7 using Control Panel>Hardware and Sound>Devices and Printers>Add a printer>Add a local printer>Create a new port>LPR Port and then entering the hostname or IP address of the Mac and the CUPS printer queue name (which the lpq command in Terminal shows). Snow Leopard shares the printer using the Unix LPD (also called LPR) protocol, among others.

When I upgraded the Mac to Mavericks (10.9), I found that it wasn’t listening on the LPD port. After a lot of research, I discovered that support for LPD printer sharing is included in Mavericks but disabled by default. Here is how to enable it.

Open a Terminal window.

sudo launchctl load -w /System/Library/LaunchDaemons/org.cups.cups-lpd.plist

Type your password. Your Mac should now be listening on the LPD port. If you have its firewall enabled in System Preferences, you might need to open the LPD printer port (TCP port 515) in the firewall. Now printing to it from Windows should work.

The load -w option forces the service to be enabled. If you want to more clearly mark it as enabled, you can:

sudo bash

Edit /System/Library/LaunchDaemons/org.cups.cups-lpd.plist using a text editor like vi or nano.

Under the Disabled key, change the “true” to “false”, then save the file and exit the editor.

All of this probably applies to Yosemite (10.10) too, but I haven’t tested that, or Windows 8 or Vista.