SCO v. End Users: Update


In late December 2003, SCO issued a letter to Fortune 500 Companies that claimed copyright ownership in, and infringement of, certain identified specific file names in the Linux kernel source tree.Here is an extracted list of those file names, organized somewhat differently than in the letter to aid analysis of the list.

Filename
Sample Contents
include/asm-alpha/errno.h
include/asm-arm/errno.h
include/asm-cris/errno.h
include/asm-i386/errno.h
include/asm-ia64/errno.h
include/asm-m68k/errno.h
include/asm-mips/errno.h
include/asm-mips64/errno.h
include/asm-parisc/errno.h
include/asm-ppc/errno.h
include/asm-ppc64/errno.h
include/asm-s390/errno.h
include/asm-s390x/errno.h
include/asm-sh/errno.h
include/asm-sparc/errno.h
include/asm-sparc64/errno.h
include/asm-x86_64/errno.h
#define EPERM            1      /* Operation not permitted */
#define ENOENT           2      /* No such file or directory */
#define ESRCH            3      /* No such process */
#define EINTR            4      /* Interrupted system call */
#define EIO              5      /* I/O error */

Comment
This set of files covers a wide variety of computer architectures, encompassing platforms that run the gamut of modernity from nearly obsolete to cutting edge. The range of cost, size, and complexity extends from PDAs to mainframes. But the errno.h file itself is very similar in all cases, and there's a good reason for that. Please note that text between "/*" and the opposite "*/" is a comment by the programmer, not something processed by the machine.

 What's it for?
This "header" file defines the meaning of simple symbols for the purposes of a computer program running on Unix or Linux. When a program wants to return an error code because it encountered an Input/Output error (such as when the system tries to write to the floppy disk , but there's no disk in the drive), it will return a "EIO" error in the form of the value 5.

What's the point? For the operating system, checking to see if the error return value is "5" is simpler and faster than checking to see if it is "EIO" - but for the programmer, remembering that "EIO" is an "Error, Input/Output" is simpler and faster than looking up the associated return value. The programmer writes "EIO", the compiler substitutes "5" when it builds the program, and both parties are satisfied. There are about a hundred more lines in the file, most similar to the sample set.

Why is errno.h the same for most/all architectures?
It's because of a fairly old idea in systems programming - the idea that a program may well outlive a particular operating system (or, indeed, a particular hardware platform), or that a program written for one version of UNIX may also be useful on another version of UNIX. If the two operating systems have different definitions for the values of error returns, the programmer has to alter the source code of the program to make it compile and run correctly on the second operating system. Standardization of low-level features of the operating system makes programming more efficient by reducing busywork and rework.

This applies whether the program is closed-source or open-source - in the first case, the business producing the program can more easily expand its markets or maintain its customer base as computing hardware evolves, and in the second case individual users can adapt a program from one platform to another without customizing the low-level interfaces in the code. Customers of the closed-source business also benefit because they have less chance of being "trapped" by a single hardware or operating system vendor. This cross-platform interoperability is a hallmark of what vendors sometimes refer to as "open systems".

Filename Sample Contents
include/asm-alpha/signal.h
include/asm-arm/signal.h
include/asm-cris/signal.h
include/asm-i386/signal.h
include/asm-ia64/signal.h
include/asm-m68k/signal.h
include/asm-mips/signal.h
include/asm-mips64/signal.h
include/asm-parisc/signal.h
include/asm-ppc/signal.h
include/asm-ppc64/signal.h
include/asm-s390/signal.h
include/asm-s390x/signal.h
include/asm-sh/signal.h
include/asm-sparc/signal.h
include/asm-sparc64/signal.h
include/asm-x86_64/signal.h
#define SIGHUP           1
#define SIGINT           2
#define SIGQUIT          3
#define SIGILL           4
#define SIGTRAP          5
#define SIGABRT          6
struct osf_sigaction {
        __sighandler_t  sa_handler;
        old_sigset_t    sa_mask;
        int             sa_flags;
};

Comment
A signal is a brief message sent from one program running on a system to another program on the same system. SIGHUP, for instance, is the human readable name for the "hangup" signal. What a particular program does when it receives the hangup signal varies, but it would not do to send a "kill" signal inadvertently. Say one platform defined the "hangup" value to be 4. A program written for that platform would transmit the value 4 when it sent a hangup signal. But if the program were transplanted to another platform that assigned the value 4 to the "kill" signal, the transplanted program would be transmitting the value for a "kill" signal -- not what it meant to do. Of course, the program could be rewritten or recompiled to use the new platform's signal definitions, but that adds rework and the risk of typos without adding benefits.

It is most efficient for the various signals to carry the same values across systems. As with errno.h above, signal.h is very similar across the platforms listed, for the same reasons. The sample contents shows that, in addition to simple value definitions, signal.h carries a definition for a data structure called "osf_sigaction". This data structure is likewise part of cross-platform interoperability; in fact the prefix of its name refers to the "Open Software Foundation (OSF)", a group formed in the Eighties by industry members to promote cross-platform interoperability. By the way,  OSF is now known as The Open Group; they are the current owners of the UNIX trademark.


Filename Sample Contents
include/asm-alpha/ioctl.h
include/asm-arm/ioctl.h
include/asm-cris/ioctl.h
include/asm-i386/ioctl.h
include/asm-ia64/ioctl.h
include/asm-m68k/ioctl.h
include/asm-mips/ioctl.h
include/asm-mips64/ioctl.h
include/asm-parisc/ioctl.h
include/asm-ppc/ioctl.h
include/asm-ppc64/ioctl.h
include/asm-s390/ioctl.h
include/asm-s390x/ioctl.h
include/asm-sh/ioctl.h
include/asm-sparc/ioctl.h
include/asm-sparc64/ioctl.h
include/asm-x86_64/ioctl.h
/* used to create numbers */
#define _IO(type,nr)            _IOC(_IOC_NONE,(type),(nr),0)
#define _IOR(type,nr,size)      _IOC(_IOC_READ,(type),(nr),sizeof(size))
#define _IOW(type,nr,size)      _IOC(_IOC_WRITE,(type),(nr),sizeof(size))
#define _IOWR(type,nr,size)     _IOC(_IOC_READ|_IOC_WRITE,(type),(nr),sizeof(size)) 
/* used to decode them.. */
#define _IOC_DIR(nr)            (((nr) >> _IOC_DIRSHIFT) & _IOC_DIRMASK)
#define _IOC_TYPE(nr)           (((nr) >> _IOC_TYPESHIFT) & _IOC_TYPEMASK)
#define _IOC_NR(nr)             (((nr) >> _IOC_NRSHIFT) & _IOC_NRMASK)
#define _IOC_SIZE(nr)           (((nr) >> _IOC_SIZESHIFT) & _IOC_SIZEMASK)

Comment
Just as error return values and signal values are practically the same across interoperable systems, the low-level definitions for reading and writing data correspond.  The author of the ioctl.h file for the "alpha" architecture (presumably Linus Torvalds) placed a lengthy comment near the top of the file which is worth quoting:
/*
 * The original linux ioctl numbering scheme was just a general
 * "anything goes" setup, where more or less random numbers were
 * assigned.  Sorry, I was clueless when I started out on this.
 *
 * On the alpha, we'll try to clean it up a bit, using a more sane
 * ioctl numbering, and also trying to be compatible with OSF/1 in
 * the process. I'd like to clean it up for the i386 as well, but
 * it's so painful recognizing both the new and the old numbers..
 */
The author of the code apologizes for not corresponding to an established numbering scheme, and refers to the Open Group's operating system standard, OSF/1, as a target for compatibility.

Filename Sample Contents

include/asm-alpha/ioctls.h
include/asm-mips64/ioctls.h
include/asm-parisc/ioctls.h
include/asm-ppc/ioctls.h
include/asm-ppc64/ioctls.h
include/asm-sh/ioctls.h
include/asm-sparc/ioctls.h
include/asm-sparc64/ioctls.h

#define FIOCLEX         _IO('f', 1)
#define FIONCLEX        _IO('f', 2)
#define FIOASYNC        _IOW('f', 125, int)
#define FIONBIO         _IOW('f', 126, int)
#define FIONREAD        _IOR('f', 127, int)

Comment
These files cover a smaller range of platforms, mostly constituting proprietary UNIX workstation architectures from such companies as DEC, Sun, Hewlett-Packard, SGI, and IBM. Aside from the narrower coverage, much of the commentary above regarding the other "header" files applies here with equal force.

include/linux/stat.h
include/linux/ctype.h
lib/ctype.c

#define _U      0x01    /* upper */
#define _L      0x02    /* lower */
#define _D      0x04    /* digit */
#define _C      0x08    /* cntrl */
#define _P      0x10    /* punct */


include/linux/ipc.h
include/linux/acct.h
include/asm-sparc/a.out.h
include/linux/a.out.h
arch/mips/boot/ecoff.h

comp_t          ac_utime;               /* Accounting User Time */
comp_t          ac_stime;               /* Accounting System Time */
comp_t          ac_etime;               /* Accounting Elapsed Time */
 

include/asm-sparc/bsderrno.h
include/asm-sparc/solerrno.h
include/asm-sparc64/bsderrno.h
include/asm-sparc64/solerrno.h

#define BSD_EPERM         1      /* Operation not permitted */
#define BSD_ENOENT        2      /* No such file or directory */
#define BSD_ESRCH         3      /* No such process */
#define BSD_EINTR         4      /* Interrupted system call */

NOTES

Of the files listed, only six are included in every Linux kernel; the others have platform specific "flavors" that imply their contents will only be included if the target platform for the kernel is that "flavor".

Whether simple name-value pairs, arranged in ascending numerical order, are sufficiently more creative than the names and phone numbers in Fiest to reach a copyrightable level is debatable; but when one also considers:
the potential for copyrightable material in these files is not great.