/*

   nsjail - common macros
   -----------------------------------------

   Copyright 2014 Google Inc. All Rights Reserved.

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

     http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.

*/

#ifndef NS_COMMON_H
#define NS_COMMON_H

#include <unistd.h>

#if !defined(TEMP_FAILURE_RETRY)
#define TEMP_FAILURE_RETRY(expression)                     \
	(__extension__({                                   \
		long int __result;                         \
		do                                         \
			__result = (long int)(expression); \
		while (__result == -1L && errno == EINTR); \
		__result;                                  \
	}))
#endif /* !defined(TEMP_FAILURE_RETRY) */

#if !defined(ARR_SZ)
#define ARR_SZ(array) (sizeof(array) / sizeof(*array))
#endif /* !defined(ARR_SZ) */
#define UNUSED __attribute__((unused))

#if 0 /* Works, but needs -fblocks and libBlocksRuntime with clang */
/* Go-style defer implementation */
#define __STRMERGE(a, b) a##b
#define _STRMERGE(a, b) __STRMERGE(a, b)

#ifdef __clang__
static void __attribute__ ((unused)) __clang_cleanup_func(void (^*dfunc) (void))
{
	(*dfunc) ();
}

#define defer                                            \
	void (^_STRMERGE(__defer_f_, __COUNTER__))(void) \
	    __attribute__((cleanup(__clang_cleanup_func))) __attribute__((unused)) = ^
#else
#define __block
#define _DEFER(a, count)                                                                          \
	auto void _STRMERGE(__defer_f_, count)(void* _defer_arg __attribute__((unused)));         \
	int _STRMERGE(__defer_var_, count) __attribute__((cleanup(_STRMERGE(__defer_f_, count)))) \
	    __attribute__((unused));                                                              \
	void _STRMERGE(__defer_f_, count)(void* _defer_arg __attribute__((unused)))
#define defer _DEFER(a, __COUNTER__)
#endif
#endif

#define NS_VALSTR_STRUCT(x) \
	{ x, #x }

#endif /* NS_COMMON_H */
