1*77b1fd22SAxel Dörfler /* 2*77b1fd22SAxel Dörfler * Copyright 2005, Axel Dörfler, axeld@pinc-software.de. 3*77b1fd22SAxel Dörfler * Distributed under the terms of the MIT License. 4*77b1fd22SAxel Dörfler */ 5*77b1fd22SAxel Dörfler 6*77b1fd22SAxel Dörfler 7*77b1fd22SAxel Dörfler #include <OS.h> 8*77b1fd22SAxel Dörfler #include <syscalls.h> 9*77b1fd22SAxel Dörfler 10*77b1fd22SAxel Dörfler #include <stdio.h> 11*77b1fd22SAxel Dörfler #include <string.h> 12*77b1fd22SAxel Dörfler 13*77b1fd22SAxel Dörfler 14*77b1fd22SAxel Dörfler static const char *kPortName = "transfer area test"; 15*77b1fd22SAxel Dörfler 16*77b1fd22SAxel Dörfler 17*77b1fd22SAxel Dörfler int 18*77b1fd22SAxel Dörfler main(int argc, char **argv) 19*77b1fd22SAxel Dörfler { 20*77b1fd22SAxel Dörfler port_id port; 21*77b1fd22SAxel Dörfler area_id area; 22*77b1fd22SAxel Dörfler 23*77b1fd22SAxel Dörfler if (argc > 1) { 24*77b1fd22SAxel Dörfler // we're the sender 25*77b1fd22SAxel Dörfler port = find_port(kPortName); 26*77b1fd22SAxel Dörfler if (port < B_OK) { 27*77b1fd22SAxel Dörfler fprintf(stderr, "Area receiver is not yet running.\n"); 28*77b1fd22SAxel Dörfler return -1; 29*77b1fd22SAxel Dörfler } 30*77b1fd22SAxel Dörfler 31*77b1fd22SAxel Dörfler port_info info; 32*77b1fd22SAxel Dörfler get_port_info(port, &info); 33*77b1fd22SAxel Dörfler 34*77b1fd22SAxel Dörfler char *address; 35*77b1fd22SAxel Dörfler area = create_area("test transfer area", (void **)&address, B_ANY_ADDRESS, B_PAGE_SIZE, 36*77b1fd22SAxel Dörfler B_NO_LOCK, B_READ_AREA | B_WRITE_AREA); 37*77b1fd22SAxel Dörfler if (area < B_OK) { 38*77b1fd22SAxel Dörfler fprintf(stderr, "Could not create area: %s.\n", strerror(area)); 39*77b1fd22SAxel Dörfler return -1; 40*77b1fd22SAxel Dörfler } 41*77b1fd22SAxel Dörfler 42*77b1fd22SAxel Dörfler sprintf(address, "Oh my god - it's working! (%s)", argv[1]); 43*77b1fd22SAxel Dörfler 44*77b1fd22SAxel Dörfler status_t status = _kern_transfer_area(area, (void **)&address, B_ANY_ADDRESS, info.team); 45*77b1fd22SAxel Dörfler if (status < B_OK) { 46*77b1fd22SAxel Dörfler fprintf(stderr, "Could not transfer area: %s.\n", strerror(status)); 47*77b1fd22SAxel Dörfler return -1; 48*77b1fd22SAxel Dörfler } 49*77b1fd22SAxel Dörfler 50*77b1fd22SAxel Dörfler write_port(port, area, NULL, 0); 51*77b1fd22SAxel Dörfler } else { 52*77b1fd22SAxel Dörfler // we're the receiver 53*77b1fd22SAxel Dörfler port = create_port(1, kPortName); 54*77b1fd22SAxel Dörfler if (port < B_OK) { 55*77b1fd22SAxel Dörfler fprintf(stderr, "Could not create port: %s.\n", strerror(area)); 56*77b1fd22SAxel Dörfler return -1; 57*77b1fd22SAxel Dörfler } 58*77b1fd22SAxel Dörfler 59*77b1fd22SAxel Dörfler puts("Waiting for an area to be received (start same command again with an argument)..."); 60*77b1fd22SAxel Dörfler 61*77b1fd22SAxel Dörfler ssize_t size; 62*77b1fd22SAxel Dörfler if ((size = read_port(port, (int32 *)&area, NULL, 0)) < B_OK) { 63*77b1fd22SAxel Dörfler fprintf(stderr, "Reading from port failed: %s.\n", strerror(size)); 64*77b1fd22SAxel Dörfler return -1; 65*77b1fd22SAxel Dörfler } 66*77b1fd22SAxel Dörfler 67*77b1fd22SAxel Dörfler printf("Received Area %ld\n", area); 68*77b1fd22SAxel Dörfler 69*77b1fd22SAxel Dörfler area_info info; 70*77b1fd22SAxel Dörfler get_area_info(area, &info); 71*77b1fd22SAxel Dörfler printf(" name = \"%s\", base = %p, size = %#lx, team = %ld\n", 72*77b1fd22SAxel Dörfler info.name, info.address, info.size, info.team); 73*77b1fd22SAxel Dörfler printf(" contents: %s\n", (char *)info.address); 74*77b1fd22SAxel Dörfler 75*77b1fd22SAxel Dörfler delete_area(area); 76*77b1fd22SAxel Dörfler } 77*77b1fd22SAxel Dörfler 78*77b1fd22SAxel Dörfler return 0; 79*77b1fd22SAxel Dörfler } 80