85 lines
1.5 KiB
C
85 lines
1.5 KiB
C
/**
|
|
* Copyright (c) 2023-2024 Marcin Niestroj
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
/**
|
|
* @file
|
|
*
|
|
* fcntl.h related code common to Zephyr (top: nsos_sockets.c) and Linux
|
|
* (bottom: nsos_adapt.c).
|
|
*
|
|
* It is needed by both sides to share the same macro definitions/values
|
|
* (prefixed with NSOS_MID_), which is not possible to achieve with two separate
|
|
* standard libc libraries, since they use different values for the same
|
|
* symbols.
|
|
*/
|
|
|
|
#include <fcntl.h>
|
|
|
|
#include "nsos_errno.h"
|
|
#include "nsos_fcntl.h"
|
|
|
|
#include <stdbool.h>
|
|
|
|
static int fl_to_nsos_mid_(int flags, bool strict)
|
|
{
|
|
int flags_mid = 0;
|
|
|
|
#define TO_NSOS_MID(_flag) \
|
|
if (flags & (_flag)) { \
|
|
flags &= ~(_flag); \
|
|
flags_mid |= NSOS_MID_ ## _flag; \
|
|
}
|
|
|
|
TO_NSOS_MID(O_RDONLY);
|
|
TO_NSOS_MID(O_WRONLY);
|
|
TO_NSOS_MID(O_RDWR);
|
|
|
|
TO_NSOS_MID(O_APPEND);
|
|
TO_NSOS_MID(O_EXCL);
|
|
TO_NSOS_MID(O_NONBLOCK);
|
|
|
|
#undef TO_NSOS_MID
|
|
|
|
if (strict && flags != 0) {
|
|
return -NSOS_MID_EINVAL;
|
|
}
|
|
|
|
return flags_mid;
|
|
}
|
|
|
|
int fl_to_nsos_mid(int flags)
|
|
{
|
|
return fl_to_nsos_mid_(flags, false);
|
|
}
|
|
|
|
int fl_to_nsos_mid_strict(int flags)
|
|
{
|
|
return fl_to_nsos_mid_(flags, true);
|
|
}
|
|
|
|
int fl_from_nsos_mid(int flags_mid)
|
|
{
|
|
int flags = 0;
|
|
|
|
#define FROM_NSOS_MID(_flag) \
|
|
if (flags_mid & NSOS_MID_ ## _flag) { \
|
|
flags_mid &= ~NSOS_MID_ ## _flag; \
|
|
flags |= _flag; \
|
|
}
|
|
|
|
FROM_NSOS_MID(O_RDONLY);
|
|
FROM_NSOS_MID(O_WRONLY);
|
|
FROM_NSOS_MID(O_RDWR);
|
|
|
|
FROM_NSOS_MID(O_APPEND);
|
|
FROM_NSOS_MID(O_EXCL);
|
|
FROM_NSOS_MID(O_NONBLOCK);
|
|
|
|
#undef FROM_NSOS_MID
|
|
|
|
return flags;
|
|
}
|