This is BlackHand.m in view mode; [Download] [Up]
#import <stdio.h> #import <stdlib.h> #import <libc.h> #import <sys/ioctl.h> #import <mach.h> #import <appkit/defaults.h> #import <appkit/Application.h> #import <dpsclient/dpsclient.h> #import "BlackHand.h" #import "EtermSupport.h" #import "etermSupport.h" extern char **environ; extern void kc_init(void); /* * write(2), except it will keep retrying upon partial success. */ static int write_safely(int fd, char *buf) { int i, start = 0, n; n = strlen(buf); while (start < n) { i = write(fd, buf+start, n - start); if (i == -1) return i; /* Some error */ start += i; } return n; } /* * Handle a connection to the event server socket */ static void connection_from_apps(int fd, void *rock) { BlackHand *handle = (BlackHand *)rock; int newfd = accept_server_connection(fd); if (newfd == -1) return; if ([handle eventChannel]) { close(newfd); } else { [handle setEventChannel: fdopen(newfd, "w")]; } } @implementation BlackHand + initialize { static NXDefaultsVector etermDefaults = { {"NXAutoLaunch", "NO" }, {"NXFixedPitchFont", "Ohlfs" }, {"NXFixedPitchFontSize", "10" }, {"Columns", "80" }, {"Rows", "24" }, {"WinLocX", "205"}, {"WinLocY", "85"}, {"HideOnAutoLaunch", "NO" }, {NULL} }; NXRegisterDefaults(AppsName, etermDefaults); kc_init(); return self; } - (FILE *)eventChannel; { return eventChannel; } - setEventChannel: (FILE *)fp; { eventChannel = fp; return self; } // Start up the child apps process - startApps; { int master, slave, portno; char **env; static char *args[] = { ProgName, NULL, NULL }; /* Grab a pty/tty pair */ create_channel (&master, &slave); masterChannel = master; /* Create the server socket */ eventServerSocket = create_server_socket(&portno); DPSAddFD(eventServerSocket, connection_from_apps, (void *)self, NX_RUNMODALTHRESHOLD); /* Frob the environment */ env = patch_env(environ, portno); // get the application arguments. NOT IMPLEMENTED YET /* Fork off the Apps */ fork_shell(ProgName, args, env, slave); (void) close(slave); DPSAddFD(master, input_from_apps, new_display_rock(deputy), NX_RUNMODALTHRESHOLD); return self; } - requestFromDeputy:(char *)request; { write_safely(masterChannel, request); return self; }; - quitApps { if (!eventChannel) return nil; fprintf(eventChannel, "(event-quit)\n"); fflush(eventChannel); return self; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.