1 // Copyright 2014 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef COMPONENTS_NACL_LOADER_NONSFI_IRT_UTIL_H_ 6 #define COMPONENTS_NACL_LOADER_NONSFI_IRT_UTIL_H_ 7 8 #include <errno.h> 9 10 namespace nacl { 11 namespace nonsfi { 12 13 // For IRT implementation, the following simple pattern is commonly used. 14 // 15 // if (syscall(...) < 0) 16 // return errno; 17 // return 0; 18 // 19 // This function is a utility to write it in a line as follows: 20 // 21 // return CheckError(syscall(...)); 22 inline int CheckError(int result) { 23 return result < 0 ? errno : 0; 24 } 25 26 // For IRT implementation, another but a similar pattern is also commonly used. 27 // 28 // T result = syscall(...); 29 // if (result < 0) 30 // return errno; 31 // *output = result; 32 // return 0; 33 // 34 // This function is a utility to write it in a line as follows: 35 // 36 // retrun CheckErrorWithResult(syscall(...), output); 37 // 38 // Here, T1 must be a signed integer value, and T2 must be convertible from 39 // T1. 40 template<typename T1, typename T2> 41 int CheckErrorWithResult(const T1& result, T2* out) { 42 if (result < 0) 43 return errno; 44 45 *out = result; 46 return 0; 47 } 48 49 } // namespace nonsfi 50 } // namespace nacl 51 52 #endif // COMPONENTS_NACL_LOADER_NONSFI_IRT_UTIL_H_ 53