Archive for the ‘Programming’ Category

Flying with one instrument

Sunday, December 27th, 2009

While on vacation I managed to squeeze in a few hours of coding to get my ASI working with FSX. Even with only one gauge it was very rewarding to see my hard work pay off with a working instrument. The software is alpha quality and needs a lot of debugging but it works! At some point in the future I will be releasing all this software and firmware as open source for the curious.

I didn’t get a picture of the ASI sitting on my desk while I fly, but here are some screenshots.

The interface software (usbSimCentral) and FSX

Calibration tool

I think I will build the attitude indicator next.

Standard Linux/Unix error codes

Tuesday, October 27th, 2009

As a System Administrator I will often come across a system error code in a log file and need to look up what it means. I don’t know about you, but I don’t know that error 107 is “Transport endpoint is not connected” off the top of my head. My solution was a small Perl script that will print the error’s meaning or optionally all known error codes and their meaning. The perl code is below this listing of error codes.

001: Operation not permitted
002: No such file or directory
003: No such process
004: Interrupted system call
005: Input/output error
006: No such device or address
007: Argument list too long
008: Exec format error
009: Bad file descriptor
010: No child processes
011: Resource temporarily unavailable
012: Cannot allocate memory
013: Permission denied
014: Bad address
015: Block device required
016: Device or resource busy
017: File exists
018: Invalid cross-device link
019: No such device
020: Not a directory
021: Is a directory
022: Invalid argument
023: Too many open files in system
024: Too many open files
025: Inappropriate ioctl for device
026: Text file busy
027: File too large
028: No space left on device
029: Illegal seek
030: Read-only file system
031: Too many links
032: Broken pipe
033: Numerical argument out of domain
034: Numerical result out of range
035: Resource deadlock avoided
036: File name too long
037: No locks available
038: Function not implemented
039: Directory not empty
040: Too many levels of symbolic links
042: No message of desired type
043: Identifier removed
044: Channel number out of range
045: Level 2 not synchronized
046: Level 3 halted
047: Level 3 reset
048: Link number out of range
049: Protocol driver not attached
050: No CSI structure available
051: Level 2 halted
052: Invalid exchange
053: Invalid request descriptor
054: Exchange full
055: No anode
056: Invalid request code
057: Invalid slot
059: Bad font file format
060: Device not a stream
061: No data available
062: Timer expired
063: Out of streams resources
064: Machine is not on the network
065: Package not installed
066: Object is remote
067: Link has been severed
068: Advertise error
069: Srmount error
070: Communication error on send
071: Protocol error
072: Multihop attempted
073: RFS specific error
074: Bad message
075: Value too large for defined data type
076: Name not unique on network
077: File descriptor in bad state
078: Remote address changed
079: Can not access a needed shared library
080: Accessing a corrupted shared library
081: .lib section in a.out corrupted
082: Attempting to link in too many shared libraries
083: Cannot exec a shared library directly
084: Invalid or incomplete multibyte or wide character
085: Interrupted system call should be restarted
086: Streams pipe error
087: Too many users
088: Socket operation on non-socket
089: Destination address required
090: Message too long
091: Protocol wrong type for socket
092: Protocol not available
093: Protocol not supported
094: Socket type not supported
095: Operation not supported
096: Protocol family not supported
097: Address family not supported by protocol
098: Address already in use
099: Cannot assign requested address
100: Network is down
101: Network is unreachable
102: Network dropped connection on reset
103: Software caused connection abort
104: Connection reset by peer
105: No buffer space available
106: Transport endpoint is already connected
107: Transport endpoint is not connected
108: Cannot send after transport endpoint shutdown
109: Too many references: cannot splice
110: Connection timed out
111: Connection refused
112: Host is down
113: No route to host
114: Operation already in progress
115: Operation now in progress
116: Stale NFS file handle
117: Structure needs cleaning
118: Not a XENIX named type file
119: No XENIX semaphores available
120: Is a named type file
121: Remote I/O error
122: Disk quota exceeded
123: No medium found
124: Wrong medium type
125: Operation canceled


# print out system error strings

use strict;
use warnings;

my $errText = "";

if(!defined($ARGV[0])) {
    for ($! = 1; $! <= 10000; $!++) {
        $errText = $!;
        if(!($! =~ m/^unknown error/i)) {
            printf("%03d: %s\n", $!, $errText);
else {
    $! = $ARGV[0];
    $errText = $!;
    printf("%03d: %s\n", $!, $errText);

JoystickButtonTest utility

Wednesday, October 21st, 2009

The joystick card I am using for my flight simulator has a lot of buttons (112). By default the Windows control panel for game controllers only displays the status of 32 buttons. I wanted a way to see the status of all the buttons so I wrote this little utility called JoystickButtonTest. What an original name!

A zip file with the executable and dll as well as links to the source code are below. This is released as open source with no guarantees it will work on your computer. It does require the .Net version 3.5 libraries and a recent version of DirectX.



Visual C# Source:

The JoystickInterface.dll is based on code by M Harris found here:

OpenOffice and Active Directory?

Wednesday, January 9th, 2008

I tried to start OpenOffice today on my Red Hat 5 workstation and nothing happened. Starting from the command line I saw this error:

(soffice.bin:14419): GLib-WARNING **: getpwuid_r(): failed due to unknown user id (118141)

The user id (118141) is my Active Directory login mapped to a local UID on my Linux workstation. To make a long story short, the ncsd daemon was not running and getpwuid_r() exhibited strange (to me at least) behavior. Starting ncsd immediately let OpenOffice start.

In the process of testing this I whipped up this C program to test the getpwuid_r() function.

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <pwd.h>

int main(int argc, char *argv[]){
if(argc != 2){
uid_t me = atoi(argv[1]);
struct passwd pwbuf;
char buf[2048];
struct passwd *pwbufp;

int ret = getpwuid_r(me, &pwbuf, buf, 2048, &pwbufp);

if(ret == 0){
printf("OK %s\n", pwbuf.pw_name);
} else {
printf("Failed, returned %d\n", ret);


I observed that when the ncsd daemon not running getpwuid_r() would return info correctly for entries in /etc/passwd but not others. Any uid not in /etc/passwd would be returned as if it was the last entry in /etc/passwd. For example, the last entry on my workstation happens to be uid 26, user postgres. Any uid that I passed to the check program that did not exist in /etc/passwd was returned as postgres. Weird. I didn’t investigate any further once Google provided the ncsd hint.