home *** CD-ROM | disk | FTP | other *** search
/ NeXTSTEP 3.3 (Developer) / NeXT_Developer-3.3.iso / NextLibrary / Documentation / NextDev / Examples / Log / User / log.c next >
Encoding:
C/C++ Source or Header  |  1995-01-27  |  3.6 KB  |  141 lines

  1. /*
  2.  * This program prints out log messages from the kernel server named 
  3.  * "mydriver".
  4.  */
  5.  
  6. #import <mach.h>
  7. #import <cthreads.h>
  8. #import <kernserv/kern_loader_reply_handler.h>
  9. #import <syslog.h>
  10. #import <stdio.h>
  11.  
  12. void listen(port_name_t port);
  13.  
  14. kern_return_t log_data(void *arg, printf_data_t log_data, unsigned int log_data_count);
  15.  
  16. port_name_t server_com_port, kl_port, reply_port;
  17.  
  18. main()
  19. {
  20.     kern_return_t   r;
  21.     port_name_t kern_port, mydriver_port;
  22.  
  23.     /* Allocate a port for reply messages from kern_loader. */
  24.     r = port_allocate(task_self(), &reply_port);
  25.     if (r != KERN_SUCCESS) {
  26.         mach_error("Can't allocate reply port", r);
  27.         exit(1);
  28.     }
  29.  
  30.     /* Find kern_loader's port. */
  31.     r = kern_loader_look_up(&kl_port);
  32.     if (r != KERN_SUCCESS) {
  33.         mach_error("Can't find kernel loader", r);
  34.         exit(1);
  35.     }
  36.  
  37.     /* Get the server's communication port. */
  38.     r = task_by_unix_pid(task_self(), 0, &kern_port);
  39.     if (r != KERN_SUCCESS) {
  40.         mach_error("Error looking up kernel's port", r);
  41.         exit(1);
  42.     }
  43.     r = kern_loader_server_com_port(kl_port, kern_port, "mydriver",
  44.         &server_com_port);
  45.     if (r != KERN_SUCCESS) {
  46.         kern_loader_error("Error looking up server com port", r);
  47.         exit(1);
  48.     }
  49.         
  50.     /* Set the log level so we'll get log messages. */
  51.     r = kern_loader_log_level(kl_port, server_com_port, LOG_NOTICE);
  52.     if (r != KERN_SUCCESS) {
  53.         kern_loader_error("Can't change log level", r);
  54.         exit(1);
  55.     }
  56.     
  57.     /* Wait for the log level to change. */
  58.     printf("Waiting for the log level to change before calling mydriver_do_log()...\n");
  59.     sleep(5);    
  60.         
  61.     /* Look up the advertised port of mydriver. */
  62.     r = netname_look_up(name_server_port, "", "mydriver0", &mydriver_port);
  63.     if (r != KERN_SUCCESS) {
  64.         mach_error("Can't find mydriver's advertised port", r);
  65.         exit(1);
  66.     }
  67.     
  68.     printf("Calling mydriver_do_log().\n");
  69.     /* Make the driver log a message. */
  70.     r = mydriver_do_log(mydriver_port);
  71.     if (r != KERN_SUCCESS) {
  72.         mach_error("Error calling mydriver_do_log", r);
  73.         exit(1);
  74.     }
  75.     
  76.     printf("Calling kern_loader_get_log().\n");
  77.     /* Put this message into the message log. */
  78.     r = kern_loader_get_log(kl_port, server_com_port, reply_port);
  79.     if (r != KERN_SUCCESS) {
  80.         kern_loader_error("Error calling kern_loader_get_log", r);
  81.         exit(1);
  82.     }
  83.     
  84.     listen(reply_port);
  85. }
  86.  
  87. kern_loader_reply_t kern_loader_reply = {
  88.     0,            /* argument to pass to function */
  89.     0,            /* timeout for rpc return msg_send */
  90.     0,            /* string function */
  91.     0,            /* ping function */
  92.     log_data    /* log_data function */
  93. };
  94.  
  95. void listen(port_name_t port)
  96. {
  97.     char          msg_buf[KERN_LOADER_REPLY_INMSG_SIZE];
  98.     msg_header_t *msg = (msg_header_t *)msg_buf;
  99.     kern_return_t r;
  100.  
  101.     /* Receive the next message in the queue. */
  102.     msg->msg_size = KERN_LOADER_REPLY_INMSG_SIZE;
  103.     msg->msg_local_port = port;
  104.     r = msg_receive(msg, MSG_OPTION_NONE, 0);
  105.  
  106.     printf("Received a message on the reply port.\n");
  107.     if (r != KERN_SUCCESS) {
  108.         mach_error("listen msg_receive", r);
  109.         exit(1);
  110.     }
  111.             
  112.     /* Handle the message we just received. */
  113.     printf("Calling kern_loader_reply_handler().\n");
  114.     kern_loader_reply_handler(msg, &kern_loader_reply);
  115. }
  116.     
  117.  
  118. kern_return_t log_data(void *arg, printf_data_t log_data, unsigned int log_data_count)
  119. {
  120.     kern_return_t r;
  121.         
  122.     /* Print the string we were passed, with our own special prefix. */
  123.     printf("log_data: %s\n", log_data);
  124.     vm_deallocate(task_self(), (vm_address_t)log_data, 
  125.         log_data_count*sizeof(*log_data));
  126.  
  127. #ifdef NOTDEF
  128.     /* 
  129.      * If this were a real program, we'd probably want to request
  130.      * the next log message. 
  131.      */
  132.     r = kern_loader_get_log(kl_port, server_com_port, reply_port);
  133.     if (r != KERN_SUCCESS) {
  134.         kern_loader_error("log_data:  Error calling kern_loader_get_log", r);
  135.         exit(1);
  136.     }
  137. #endif
  138.  
  139.     return KERN_SUCCESS;
  140. }
  141.