| // Copyright 2014 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef COMPONENTS_NACL_LOADER_NONSFI_IRT_UTIL_H_ |
| #define COMPONENTS_NACL_LOADER_NONSFI_IRT_UTIL_H_ |
| |
| #include <errno.h> |
| |
| namespace nacl { |
| namespace nonsfi { |
| |
| // For IRT implementation, the following simple pattern is commonly used. |
| // |
| // if (syscall(...) < 0) |
| // return errno; |
| // return 0; |
| // |
| // This function is a utility to write it in a line as follows: |
| // |
| // return CheckError(syscall(...)); |
| inline int CheckError(int result) { |
| return result < 0 ? errno : 0; |
| } |
| |
| // For IRT implementation, another but a similar pattern is also commonly used. |
| // |
| // T result = syscall(...); |
| // if (result < 0) |
| // return errno; |
| // *output = result; |
| // return 0; |
| // |
| // This function is a utility to write it in a line as follows: |
| // |
| // retrun CheckErrorWithResult(syscall(...), output); |
| // |
| // Here, T1 must be a signed integer value, and T2 must be convertible from |
| // T1. |
| template<typename T1, typename T2> |
| int CheckErrorWithResult(const T1& result, T2* out) { |
| if (result < 0) |
| return errno; |
| |
| *out = result; |
| return 0; |
| } |
| |
| } // namespace nonsfi |
| } // namespace nacl |
| |
| #endif // COMPONENTS_NACL_LOADER_NONSFI_IRT_UTIL_H_ |