xref: /haiku/src/tests/system/kernel/transfer_area_test.cpp (revision c6b85a0a7a57c31b7211665c1594964812333e97)
177b1fd22SAxel Dörfler /*
2*c6b85a0aSAxel Dörfler  * Copyright 2005-2009, Axel Dörfler, axeld@pinc-software.de.
377b1fd22SAxel Dörfler  * Distributed under the terms of the MIT License.
477b1fd22SAxel Dörfler  */
577b1fd22SAxel Dörfler 
677b1fd22SAxel Dörfler 
777b1fd22SAxel Dörfler #include <OS.h>
877b1fd22SAxel Dörfler #include <syscalls.h>
977b1fd22SAxel Dörfler 
1077b1fd22SAxel Dörfler #include <stdio.h>
1177b1fd22SAxel Dörfler #include <string.h>
1277b1fd22SAxel Dörfler 
1377b1fd22SAxel Dörfler 
1477b1fd22SAxel Dörfler static const char *kPortName = "transfer area test";
1577b1fd22SAxel Dörfler 
1677b1fd22SAxel Dörfler 
1777b1fd22SAxel Dörfler int
main(int argc,char ** argv)1877b1fd22SAxel Dörfler main(int argc, char **argv)
1977b1fd22SAxel Dörfler {
2077b1fd22SAxel Dörfler 	port_id port;
2177b1fd22SAxel Dörfler 	area_id area;
2277b1fd22SAxel Dörfler 
2377b1fd22SAxel Dörfler 	if (argc > 1) {
2477b1fd22SAxel Dörfler 		// we're the sender
2577b1fd22SAxel Dörfler 		port = find_port(kPortName);
2677b1fd22SAxel Dörfler 		if (port < B_OK) {
2777b1fd22SAxel Dörfler 			fprintf(stderr, "Area receiver is not yet running.\n");
2877b1fd22SAxel Dörfler 			return -1;
2977b1fd22SAxel Dörfler 		}
3077b1fd22SAxel Dörfler 
3177b1fd22SAxel Dörfler 		port_info info;
3277b1fd22SAxel Dörfler 		get_port_info(port, &info);
3377b1fd22SAxel Dörfler 
3477b1fd22SAxel Dörfler 		char *address;
35*c6b85a0aSAxel Dörfler 		area = create_area("test transfer area", (void **)&address,
36*c6b85a0aSAxel Dörfler 			B_ANY_ADDRESS, B_PAGE_SIZE, B_NO_LOCK, B_READ_AREA | B_WRITE_AREA);
37*c6b85a0aSAxel Dörfler 		if (area < 0) {
3877b1fd22SAxel Dörfler 			fprintf(stderr, "Could not create area: %s.\n", strerror(area));
39*c6b85a0aSAxel Dörfler 			return 1;
4077b1fd22SAxel Dörfler 		}
4177b1fd22SAxel Dörfler 
4277b1fd22SAxel Dörfler 		sprintf(address, "Oh my god - it's working! (%s)", argv[1]);
4377b1fd22SAxel Dörfler 
44*c6b85a0aSAxel Dörfler 		area_id targetArea = _kern_transfer_area(area, (void **)&address,
45*c6b85a0aSAxel Dörfler 			B_ANY_ADDRESS, info.team);
46*c6b85a0aSAxel Dörfler 		if (targetArea < 0) {
47*c6b85a0aSAxel Dörfler 			fprintf(stderr, "Could not transfer area: %s.\n",
48*c6b85a0aSAxel Dörfler 				strerror(targetArea));
49*c6b85a0aSAxel Dörfler 			return 1;
5077b1fd22SAxel Dörfler 		}
5177b1fd22SAxel Dörfler 
52*c6b85a0aSAxel Dörfler 		write_port(port, targetArea, NULL, 0);
5377b1fd22SAxel Dörfler 	} else {
5477b1fd22SAxel Dörfler 		// we're the receiver
5577b1fd22SAxel Dörfler 		port = create_port(1, kPortName);
56*c6b85a0aSAxel Dörfler 		if (port < 0) {
5777b1fd22SAxel Dörfler 			fprintf(stderr, "Could not create port: %s.\n", strerror(area));
58*c6b85a0aSAxel Dörfler 			return 1;
5977b1fd22SAxel Dörfler 		}
6077b1fd22SAxel Dörfler 
61*c6b85a0aSAxel Dörfler 		puts("Waiting for an area to be received (start command again with an "
62*c6b85a0aSAxel Dörfler 			"argument)...");
6377b1fd22SAxel Dörfler 
6477b1fd22SAxel Dörfler 		ssize_t size;
6577b1fd22SAxel Dörfler 		if ((size = read_port(port, (int32 *)&area, NULL, 0)) < B_OK) {
6677b1fd22SAxel Dörfler 			fprintf(stderr, "Reading from port failed: %s.\n", strerror(size));
67*c6b85a0aSAxel Dörfler 			return 1;
6877b1fd22SAxel Dörfler 		}
6977b1fd22SAxel Dörfler 
7077b1fd22SAxel Dörfler 		printf("Received Area %ld\n", area);
7177b1fd22SAxel Dörfler 
7277b1fd22SAxel Dörfler 		area_info info;
73*c6b85a0aSAxel Dörfler 		if (get_area_info(area, &info) != B_OK) {
74*c6b85a0aSAxel Dörfler 			fprintf(stderr, "Could not get area info.\n");
75*c6b85a0aSAxel Dörfler 			return 1;
76*c6b85a0aSAxel Dörfler 		}
7777b1fd22SAxel Dörfler 		printf("  name = \"%s\", base = %p, size = %#lx, team = %ld\n",
7877b1fd22SAxel Dörfler 			info.name, info.address, info.size, info.team);
7977b1fd22SAxel Dörfler 		printf("  contents: %s\n", (char *)info.address);
8077b1fd22SAxel Dörfler 
8177b1fd22SAxel Dörfler 		delete_area(area);
8277b1fd22SAxel Dörfler 	}
8377b1fd22SAxel Dörfler 
8477b1fd22SAxel Dörfler 	return 0;
8577b1fd22SAxel Dörfler }
86