#define _STRMERGE(a, b) __STRMERGE(a, b)
#ifdef __clang__
-static void __attribute__ ((unused)) _clang_cleanup_func(void (^*dfunc) (void))
+static void __attribute__ ((unused)) __clang_cleanup_func(void (^*dfunc) (void))
{
(*dfunc) ();
}
-#define DEFER(a) void (^_STRMERGE(__defer_f_, __COUNTER__))(void) __attribute__((cleanup(_clang_cleanup_func))) __attribute__((unused)) = ^{ a; }
+#define defer void (^_STRMERGE(__defer_f_, __COUNTER__))(void) __attribute__((cleanup(__clang_cleanup_func))) __attribute__((unused)) = ^
#else
#define __block
-#define _DEFER(a, count) void _STRMERGE(__defer_f_, count)(void *_defer_arg __attribute__((unused))) { a; } ; \
- int _STRMERGE(_defer_var_, count) __attribute__((cleanup(_STRMERGE(__defer_f_, count)))) __attribute__((unused))
-#define DEFER(a) _DEFER(a, __COUNTER__)
+#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
struct pids_t {
PLOG_D("opendir('/proc/self/fd')");
return false;
}
- DEFER(closedir(dir));
+ defer {
+ closedir(dir);
+ };
for (;;) {
errno = 0;
struct dirent *entry = readdir(dir);
LOG_E("Could not allocate socket with nl_socket_alloc()");
return false;
}
- DEFER(nl_socket_free(sk));
+ defer {
+ nl_socket_free(sk);
+ };
int err;
if ((err = nl_connect(sk, NETLINK_ROUTE)) < 0) {
LOG_E("rtnl_link_macvlan_alloc(): %s", nl_geterror(err));
return false;
}
- DEFER(rtnl_link_put(rmv));
+ defer {
+ rtnl_link_put(rmv);
+ };
struct nl_cache *link_cache;
if ((err = rtnl_link_alloc_cache(sk, AF_UNSPEC, &link_cache)) < 0) {
LOG_E("rtnl_link_alloc_cache(): %s", nl_geterror(err));
return false;
}
- DEFER(nl_cache_free(link_cache));
+ defer {
+ nl_cache_free(link_cache);
+ };
int master_index = rtnl_link_name2i(link_cache, nsjconf->iface);
if (master_index == 0) {
PLOG_E("socket(AF_INET, SOCK_STREAM, IPPROTO_IP)");
return false;
}
- DEFER(close(sock));
+ defer {
+ close(sock);
+ };
struct ifreq ifr;
memset(&ifr, '\0', sizeof(ifr));
PLOG_E("socket(AF_INET, SOCK_STREAM, IPPROTO_IP)");
return false;
}
- DEFER(close(sock));
+ defer {
+ close(sock);
+ };
if (inet_pton(AF_INET, nsjconf->iface_vs_ip, &addr) != 1) {
PLOG_E("Cannot convert '%s' into an IPv4 address", nsjconf->iface_vs_ip);
if (listenfd == -1) {
return;
}
- DEFER(close(listenfd));
+ defer {
+ close(listenfd);
+ };
for (;;) {
if (nsjailSigFatal > 0) {
subprocKillAll(nsjconf);
return;
}
int subproc_sock = sv[1];
- DEFER(close(subproc_sock));
+ defer {
+ close(subproc_sock);
+ };
pid_t pid = syscall(__NR_clone, (uintptr_t) flags, NULL, NULL, NULL, (uintptr_t) 0);
if (pid == 0) {
PLOG_E("Couldn't open '%s' for R/O", filename);
return false;
}
- DEFER(close(fd));
+ defer {
+ close(fd);
+ };
if (utilWriteToFd(fd, buf, len) == false) {
PLOG_E("Couldn't write '%zu' bytes to file '%s' (fd='%d')", len, filename, fd);