home *** CD-ROM | disk | FTP | other *** search
- /* add_server_main.c: Main loop and implementation of add server */
-
- #import <mach.h>
- #import <sys/message.h>
- #import "../Library/add_types.h"
-
- void server_loop(port_t port);
- /* defined by MiG: */
- boolean_t add_server(msg_header_t *in, msg_header_t *out);
-
- /* from Request types in addUser.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 */
- };
-
- main()
- {
- port_t server_port;
- kern_return_t r;
-
- /* Register with the Network Name Server. */
- r = port_allocate(task_self(), &server_port);
- if (r != KERN_SUCCESS) {
- mach_error("port_allocate failed", r);
- exit(1);
- }
- r = netname_check_in(name_server_port, ADD_SERVER_NAME,
- PORT_NULL, server_port);
- if (r != KERN_SUCCESS) {
- mach_error("netname_check_in failed", r);
- exit(1);
- }
-
- /* Enter our main loop. */
- server_loop(server_port);
- }
-
- void server_loop(port_t port)
- {
- struct message msg, reply;
- kern_return_t ret;
-
- while (TRUE)
- {
- /* Receive a request from a client. */
- msg.head.msg_local_port = port;
- msg.head.msg_size = sizeof(struct message);
- ret = msg_receive(&msg.head, MSG_OPTION_NONE, 0);
- if (ret != RCV_SUCCESS) /* ignore errors */;
-
- /* Feed the request into the server. */
- (void)add_server((msg_header_t *)&msg, (msg_header_t *)&reply);
-
- /* Send a reply to the client. */
- reply.head.msg_local_port = port;
- ret = msg_send(&reply.head, MSG_OPTION_NONE, 0);
- if (ret != SEND_SUCCESS) /* ignore errors */;
- }
- }
-
- /*
- * This function is called by add_server, which was created by MiG.
- * It is NOT directly called by any client process.
- */
- kern_return_t add2nums(port_t server, int n1, int n2, int *n3)
- {
- *n3 = n1+n2;
- return KERN_SUCCESS;
- }
-
-