home *** CD-ROM | disk | FTP | other *** search
- /*
- * This program exchanges messages with out-of-line data with the kernel server
- * named "mydriver".
- */
-
- #import <mach/mach.h>
- #import <mach/mach_error.h>
- #import <servers/netname.h>
- #import <ansi/stdlib.h>
- #import <ansi/stdio.h>
- #import "../Library/mydriver.h"
- #import <bsd/strings.h>
-
- #define DATA "blah"
- void main()
- {
- kern_return_t r;
- port_name_t mydriver_port;
- user_data_t data, tmp;
- unsigned int data_len;
-
- /* Allocate space for data. Need to use vm_allocate to set up data
- * or else the LKS won't get paged aligned data. */
- r = vm_allocate((vm_task_t)task_self(), (vm_address_t *)&data,
- (vm_size_t) 8192, TRUE);
- if (r != KERN_SUCCESS) {
- mach_error("Call to vm_allocate failed", r);
- exit(1);
- }
-
- data = strcpy (data, DATA);
- data_len = strlen(data);
-
- printf("Data is: %s\n", data);
-
- /* Look up the advertised port of mydriver so we can send it a message. */
- r = netname_look_up(name_server_port, "", "mydriver0", &mydriver_port);
- if (r != KERN_SUCCESS) {
- mach_error("Can't find mydriver's advertised port", r);
- exit(1);
- }
-
- /* Send out-of-line data to the LKS. */
- printf("Calling mydriver_import().\n");
- r = mydriver_import(mydriver_port, data, data_len);
- if (r != KERN_SUCCESS) {
- mach_error("Error calling mydriver_import", r);
- exit(1);
- }
-
- /* Receive out-of-line data from the LKS. */
- printf("Calling mydriver_export().\n");
- r = mydriver_export(mydriver_port, &data, &data_len);
- if (r != KERN_SUCCESS) {
- mach_error("Error calling mydriver_export", r);
- exit(1);
- }
-
- tmp = data;
- printf("Trying to access data.\n");
- printf("First data element is: %c\n", *tmp++);
- printf("Second data element is: %c\n", *tmp++);
- printf("Third data element is: %c\n", *tmp++);
- printf("Fourth data element is: %c\n", *tmp++);
- printf("Fifth data element is: %c\n", *tmp++);
-
- (void)strncpy(tmp, data, data_len);
- printf("Contents of data are: %s\n", tmp);
- }