xref: /haiku/src/add-ons/kernel/file_systems/nfs4/RPCReply.cpp (revision 25a7b01d15612846f332751841da3579db313082)
1da59bc46SPawel Dziepak /*
2da59bc46SPawel Dziepak  * Copyright 2012 Haiku, Inc. All rights reserved.
3da59bc46SPawel Dziepak  * Distributed under the terms of the MIT License.
4da59bc46SPawel Dziepak  *
5da59bc46SPawel Dziepak  * Authors:
6da59bc46SPawel Dziepak  *		Paweł Dziepak, pdziepak@quarnos.org
7da59bc46SPawel Dziepak  */
8da59bc46SPawel Dziepak 
9da59bc46SPawel Dziepak 
10da59bc46SPawel Dziepak #include "RPCReply.h"
11da59bc46SPawel Dziepak 
12*1e67a2cdSPawel Dziepak #include <debug.h>
13da59bc46SPawel Dziepak #include <util/kernel_cpp.h>
14da59bc46SPawel Dziepak 
15feb15cc6SPawel Dziepak #include "RPCDefs.h"
16feb15cc6SPawel Dziepak 
17da59bc46SPawel Dziepak 
18da59bc46SPawel Dziepak using namespace RPC;
19da59bc46SPawel Dziepak 
20da59bc46SPawel Dziepak 
Reply(void * buffer,int size)21da59bc46SPawel Dziepak Reply::Reply(void* buffer, int size)
22da59bc46SPawel Dziepak 	:
23da59bc46SPawel Dziepak 	fError(B_OK),
24da59bc46SPawel Dziepak 	fStream(buffer, size),
25da59bc46SPawel Dziepak 	fBuffer(buffer)
26da59bc46SPawel Dziepak {
27*1e67a2cdSPawel Dziepak 	ASSERT(buffer != NULL);
28*1e67a2cdSPawel Dziepak 
29da59bc46SPawel Dziepak 	fXID = fStream.GetUInt();
30b82f4c07SPawel Dziepak 	if (fStream.GetInt() != REPLY) {
31b82f4c07SPawel Dziepak 		fError = B_BAD_VALUE;
32b82f4c07SPawel Dziepak 		return;
33b82f4c07SPawel Dziepak 	}
34b82f4c07SPawel Dziepak 
35b82f4c07SPawel Dziepak 	if (fStream.GetInt() == MSG_ACCEPTED) {
36b82f4c07SPawel Dziepak 		fStream.GetInt();
37da59bc46SPawel Dziepak 		fStream.GetOpaque(NULL);
38b82f4c07SPawel Dziepak 
39b82f4c07SPawel Dziepak 		switch (fStream.GetInt()) {
40b82f4c07SPawel Dziepak 			case SUCCESS:
41b82f4c07SPawel Dziepak 				return;
42b82f4c07SPawel Dziepak 			case PROG_UNAVAIL:
43b82f4c07SPawel Dziepak 			case PROG_MISMATCH:
44b82f4c07SPawel Dziepak 			case PROC_UNAVAIL:
45b82f4c07SPawel Dziepak 				fError = B_DEVICE_NOT_FOUND;
46b82f4c07SPawel Dziepak 				return;
47b82f4c07SPawel Dziepak 			case GARBAGE_ARGS:
48b82f4c07SPawel Dziepak 				fError = B_MISMATCHED_VALUES;
49b82f4c07SPawel Dziepak 				return;
50b82f4c07SPawel Dziepak 			case SYSTEM_ERR:
51b82f4c07SPawel Dziepak 				fError = B_ERROR;
52b82f4c07SPawel Dziepak 				return;
53b82f4c07SPawel Dziepak 			default:
54b82f4c07SPawel Dziepak 				fError = B_BAD_VALUE;
55b82f4c07SPawel Dziepak 				return;
56b82f4c07SPawel Dziepak 		}
57b82f4c07SPawel Dziepak 	} else {		// MSG_DENIED
58b82f4c07SPawel Dziepak 		if (fStream.GetInt() == RPC_MISMATCH) {
59b82f4c07SPawel Dziepak 			fError = B_DEVICE_NOT_FOUND;
60b82f4c07SPawel Dziepak 			return;
61b82f4c07SPawel Dziepak 		} else {	// AUTH_ERROR
62b82f4c07SPawel Dziepak 			fError = B_PERMISSION_DENIED;
63b82f4c07SPawel Dziepak 			return;
64b82f4c07SPawel Dziepak 		}
65b82f4c07SPawel Dziepak 	}
66da59bc46SPawel Dziepak }
67da59bc46SPawel Dziepak 
68da59bc46SPawel Dziepak 
~Reply()69da59bc46SPawel Dziepak Reply::~Reply()
70da59bc46SPawel Dziepak {
71da59bc46SPawel Dziepak 	free(fBuffer);
72da59bc46SPawel Dziepak }
73da59bc46SPawel Dziepak 
74