blob: 81a8e9256665df51429b4e418a02873bb32f21d7 [file] [log] [blame]
// 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_