This is gk_rpc.m in view mode; [Download] [Up]
//*****************************************************************************
//
// gk_rpc.m
//
// Mach RPC server for IPC between PPPD and GateKeeper
//
// by Felipe A. Rodriguez
//
// This code is supplied "as is" the author makes no warranty as to its
// suitability for any purpose. This code is free and may be distributed
// in accordance with the terms of the:
//
// GNU GENERAL PUBLIC LICENSE
// Version 2, June 1991
// copyright (C) 1989, 1991 Free Software Foundation, Inc.
// 675 Mass Ave, Cambridge, MA 02139, USA
//
//*****************************************************************************
#import <appkit/appkit.h>
#import <mach/mach.h>
#import <mach/message.h>
#import <mach/mach_error.h>
#import <servers/netname.h>
#import <mach/cthreads.h>
#import <objc/objc-runtime.h>
#include <syslog.h>
#import "Coordinator.h"
#import "CommandScroll.h"
#import "./MiG/Library/gk_rpc_types.h"
// size of RPC messages
#define gk_rpcMaxRequestSize 1024
#define gk_rpcMaxReplySize 1024
// server procedures
void server_loop(port_t port);
kern_return_t set_gk(port_t server, int a);
kern_return_t send_string(port_t server, gk_cstring a);
kern_return_t send_dce_speed(port_t server, gk_cstring a);
// defined by MiG:
boolean_t gk_rpc_server(msg_header_t *in, msg_header_t *out);
// from Request types in nsRPCUser.c
struct message
{
msg_header_t head; /* standard header field */
msg_type_t arg1_type; /* first arg type */
int arg1; /* first arg */
msg_type_t arg2_type; /* second arg type */
int arg2; /* second arg */
};
port_t server_port;
kern_return_t r;
id GKAppDelegateProxy;
//*****************************************************************************
//
// listen for RPC from GateKeeper
//
//*****************************************************************************
void gk_listen(void)
{
// allocate a port for this task, ret in arg 2
if ((r = port_allocate(task_self(), &server_port)) != KERN_SUCCESS)
{
mach_error("port_allocate failed", r);
exit(1);
}
// Register with the Network Name Server.
r = netname_check_in(NameServerPort,GK_SERVER_NAME, PORT_NULL,server_port);
if (r != KERN_SUCCESS)
{
mach_error("netname_check_in failed", r);
exit(1);
}
objc_setMultithreaded(YES); // make objC run time thread safe
// create server thread and detach it
cthread_detach(cthread_fork((cthread_fn_t)server_loop,(any_t)server_port));
}
//*****************************************************************************
//
// remove our name from net name server
//
//*****************************************************************************
void gk_check_out(void)
{
// remove name from Network Name Server.
r = netname_check_out(name_server_port, GK_SERVER_NAME, PORT_NULL);
if (r != KERN_SUCCESS)
{
mach_error("netname_check_out failed", r);
exit(1);
}
}
//*****************************************************************************
//
// c thread loop which listens for RPC
//
//*****************************************************************************
void server_loop(port_t port)
{
kern_return_t ret;
msg_header_t *msg = (msg_header_t *)malloc(gk_rpcMaxRequestSize);
msg_header_t *reply = (msg_header_t *)malloc(gk_rpcMaxReplySize);
// connect to DO thread in app delegate
GKAppDelegateProxy = [NXConnection connectToName:"GKAppDelegate"];
while (TRUE)
{ /* Receive a request from a client. */
msg->msg_local_port = port;
msg->msg_size = gk_rpcMaxRequestSize;
ret = msg_receive(msg, MSG_OPTION_NONE, 0);
if (ret != RCV_SUCCESS) /* ignore errors */;
/* Feed the request into the server. */
(void)gk_rpc_server(msg, reply);
/* Send a reply to the client. */
reply->msg_local_port = port;
ret = msg_send(reply, MSG_OPTION_NONE, 0);
if (ret != SEND_SUCCESS) /* ignore errors */;
continue;
}
}
//*****************************************************************************
//
// called by pppd to inform us of its state
//
// This function is called by RPC server which was created by MiG.
// It is NOT directly called by any client process.
//
//*****************************************************************************
kern_return_t set_gk(port_t server, int a)
{
[GKAppDelegateProxy setPhase:a];
return KERN_SUCCESS;
}
//*****************************************************************************
//
// called by pppd to inform us of its state (no return)
//
// This function is called by RPC server which was created by MiG.
// It is NOT directly called by any client process.
//
//*****************************************************************************
kern_return_t set_gk_oneway(port_t server, int a)
{
[GKAppDelegateProxy setPhase:a];
return KERN_SUCCESS;
}
//*****************************************************************************
//
// called by chat/pppd to inform us of its state
//
// This function is called by RPC server which was created by MiG.
// It is NOT directly called by any client process.
//
//*****************************************************************************
kern_return_t send_string(port_t server, gk_cstring a)
{
[GKAppDelegateProxy displayStatus:a];
return KERN_SUCCESS;
}
//*****************************************************************************
//
// called by chat/pppd to inform us of its state
//
// This function is called by RPC server which was created by MiG.
// It is NOT directly called by any client process.
//
//*****************************************************************************
kern_return_t send_dce_speed(port_t server, gk_cstring a)
{
[GKAppDelegateProxy connectedAt:a];
return KERN_SUCCESS;
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.