xref: /haiku/src/tests/system/kernel/transfer_area_test.cpp (revision 77b1fd224322628748a663de467af3775a474690)
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