#include <errno.h> /* errno, EOVERFLOW */
#include <glib.h> /* g* types, g_assert_not_reached() */
+#if defined (G_MININT8)
+#define CNM_MININT8 G_MININT8
+#else
+#define CNM_MININT8 (-128)
+#endif
+
+#if defined (G_MAXINT8)
+#define CNM_MAXINT8 G_MAXINT8
+#else
+#define CNM_MAXINT8 (127)
+#endif
+
+#if defined (G_MAXUINT8)
+#define CNM_MAXUINT8 G_MAXUINT8
+#else
+#define CNM_MAXUINT8 (255)
+#endif
+
+#if defined (G_MININT16)
+#define CNM_MININT16 G_MININT16
+#else
+#define CNM_MININT16 (-32768)
+#endif
+
+#if defined (G_MAXINT16)
+#define CNM_MAXINT16 G_MAXINT16
+#else
+#define CNM_MAXINT16 (32767)
+#endif
+
+#if defined (G_MAXUINT16)
+#define CNM_MAXUINT16 G_MAXUINT16
+#else
+#define CNM_MAXUINT16 (65535)
+#endif
+
+#if defined (G_MININT32)
+#define CNM_MININT32 G_MININT32
+#else
+#define CNM_MININT32 (-2147483648)
+#endif
+
+#if defined (G_MAXINT32)
+#define CNM_MAXINT32 G_MAXINT32
+#else
+#define CNM_MAXINT32 (2147483647)
+#endif
+
+#if defined (G_MAXUINT32)
+#define CNM_MAXUINT32 G_MAXUINT32
+#else
+#define CNM_MAXUINT32 (4294967295U)
+#endif
+
+#if defined (G_MININT64)
+#define CNM_MININT64 G_MININT64
+#else
+#define CNM_MININT64 (-9223372036854775808LL)
+#endif
+
+#if defined (G_MAXINT64)
+#define CNM_MAXINT64 G_MAXINT64
+#else
+#define CNM_MAXINT64 (9223372036854775807LL)
+#endif
+
+#if defined (G_MAXUINT64)
+#define CNM_MAXUINT64 G_MAXUINT64
+#else
+#define CNM_MAXUINT64 (18446744073709551615ULL)
+#endif
+
+
/* returns TRUE if @type is an unsigned type */
#define _cnm_integral_type_is_unsigned(type) \
(sizeof(type) == sizeof(gint8) \
- ? (((type)-1) > G_MAXINT8) \
+ ? (((type)-1) > CNM_MAXINT8) \
: sizeof(type) == sizeof(gint16) \
- ? (((type)-1) > G_MAXINT16) \
+ ? (((type)-1) > CNM_MAXINT16) \
: sizeof(type) == sizeof(gint32) \
- ? (((type)-1) > G_MAXINT32) \
+ ? (((type)-1) > CNM_MAXINT32) \
: sizeof(type) == sizeof(gint64) \
- ? (((type)-1) > G_MAXINT64) \
+ ? (((type)-1) > CNM_MAXINT64) \
: (g_assert_not_reached (), 0))
/* returns the minimum value of @type as a gint64 */
(_cnm_integral_type_is_unsigned (type) \
? 0 \
: sizeof(type) == sizeof(gint8) \
- ? G_MININT8 \
+ ? CNM_MININT8 \
: sizeof(type) == sizeof(gint16) \
- ? G_MININT16 \
+ ? CNM_MININT16 \
: sizeof(type) == sizeof(gint32) \
- ? G_MININT32 \
+ ? CNM_MININT32 \
: sizeof(type) == sizeof(gint64) \
- ? G_MININT64 \
+ ? CNM_MININT64 \
: (g_assert_not_reached (), 0))
/* returns the maximum value of @type as a guint64 */
#define _cnm_integral_type_max(type) \
(_cnm_integral_type_is_unsigned (type) \
? sizeof(type) == sizeof(gint8) \
- ? G_MAXUINT8 \
+ ? CNM_MAXUINT8 \
: sizeof(type) == sizeof(gint16) \
- ? G_MAXUINT16 \
+ ? CNM_MAXUINT16 \
: sizeof(type) == sizeof(gint32) \
- ? G_MAXUINT32 \
+ ? CNM_MAXUINT32 \
: sizeof(type) == sizeof(gint64) \
- ? G_MAXUINT64 \
+ ? CNM_MAXUINT64 \
: (g_assert_not_reached (), 0) \
: sizeof(type) == sizeof(gint8) \
- ? G_MAXINT8 \
+ ? CNM_MAXINT8 \
: sizeof(type) == sizeof(gint16) \
- ? G_MAXINT16 \
+ ? CNM_MAXINT16 \
: sizeof(type) == sizeof(gint32) \
- ? G_MAXINT32 \
+ ? CNM_MAXINT32 \
: sizeof(type) == sizeof(gint64) \
- ? G_MAXINT64 \
+ ? CNM_MAXINT64 \
: (g_assert_not_reached (), 0))
-#ifdef DEBUG
-#define _cnm_dump_(to_t,from) \
- printf ("# %s -> %s: min=%llx; max=%llx; value=%llx; lt=%i; l0=%i; gt=%i; e=%i\n", \
+#ifdef _CNM_DUMP
+#define _cnm_dump(to_t,from) \
+ printf ("# %s -> %s: uns=%i; min=%llx; max=%llx; value=%llx; lt=%i; l0=%i; gt=%i; e=%i\n", \
#from, #to_t, \
- (gint64) (_cnm_integral_type_min(to_t)), \
+ (int) _cnm_integral_type_is_unsigned (to_t), \
+ (gint64) (_cnm_integral_type_min (to_t)), \
(gint64) (_cnm_integral_type_max (to_t)), \
(gint64) (from), \
- (_cnm_integral_type_min (to_t) <= from), \
+ (((gint64) _cnm_integral_type_min (to_t)) <= (gint64) from), \
(from < 0), \
- /* (_cnm_integral_type_max (to_t) >= from) */ \
- (from <= _cnm_integral_type_max (to_t)), \
- ((_cnm_integral_type_min(to_t) >= from) && \
- ((from < 0) ? 1 : (from <= _cnm_integral_type_max(to_t)))) \
+ (((guint64) from) <= (guint64) _cnm_integral_type_max (to_t)), \
+ !((int) _cnm_integral_type_is_unsigned (to_t) \
+ ? ((0 <= from) && \
+ ((guint64) from <= (guint64) _cnm_integral_type_max (to_t))) \
+ : ((gint64) _cnm_integral_type_min(to_t) <= (gint64) from && \
+ (guint64) from <= (guint64) _cnm_integral_type_max (to_t))) \
)
-#else
-#define _cnm_dump_(to_t, from) do {} while (0)
-#endif
+#else /* ndef _CNM_DUMP */
+#define _cnm_dump(to_t, from) do {} while (0)
+#endif /* def _CNM_DUMP */
+#ifdef DEBUG
#define _cnm_return_val_if_overflow(to_t,from,val) G_STMT_START { \
- if (!(_cnm_integral_type_min(to_t) <= from && \
- ((from < 0) || (from <= _cnm_integral_type_max(to_t))))) { \
- _cnm_dump_(to_t, from); \
+ int uns = _cnm_integral_type_is_unsigned (to_t); \
+ gint64 min = (gint64) _cnm_integral_type_min (to_t); \
+ guint64 max = (guint64) _cnm_integral_type_max (to_t); \
+ gint64 sf = (gint64) from; \
+ guint64 uf = (guint64) from; \
+ if (!(uns ? ((0 <= from) && (uf <= max)) \
+ : (min <= sf && (from < 0 || uf <= max)))) { \
+ _cnm_dump(to_t, from); \
errno = EOVERFLOW; \
return (val); \
} \
} G_STMT_END
+#else /* !def DEBUG */
+/* don't do any overflow checking */
+#define _cnm_return_val_if_overflow(to_t,from,val) G_STMT_START { \
+ } G_STMT_END
+#endif /* def DEBUG */
int Mono_Posix_FromAccessModes (int x, int *r)
{
#ifdef ACCESSPERMS
*r |= ACCESSPERMS;
#else /* def ACCESSPERMS */
- {errno = EINVAL; return -1;}
+ {/* Ignoring Mono_Posix_FilePermissions_ACCESSPERMS, as it is constructed from other values */}
#endif /* ndef ACCESSPERMS */
if ((x & Mono_Posix_FilePermissions_ALLPERMS) == Mono_Posix_FilePermissions_ALLPERMS)
#ifdef ALLPERMS
*r |= ALLPERMS;
#else /* def ALLPERMS */
- {errno = EINVAL; return -1;}
+ {/* Ignoring Mono_Posix_FilePermissions_ALLPERMS, as it is constructed from other values */}
#endif /* ndef ALLPERMS */
if ((x & Mono_Posix_FilePermissions_DEFFILEMODE) == Mono_Posix_FilePermissions_DEFFILEMODE)
#ifdef DEFFILEMODE
*r |= DEFFILEMODE;
#else /* def DEFFILEMODE */
- {errno = EINVAL; return -1;}
+ {/* Ignoring Mono_Posix_FilePermissions_DEFFILEMODE, as it is constructed from other values */}
#endif /* ndef DEFFILEMODE */
- if ((x & Mono_Posix_FilePermissions_S_IFBLK) == Mono_Posix_FilePermissions_S_IFBLK)
+ if ((x & Mono_Posix_FilePermissions_S_IFMT) == Mono_Posix_FilePermissions_S_IFBLK)
#ifdef S_IFBLK
*r |= S_IFBLK;
#else /* def S_IFBLK */
{errno = EINVAL; return -1;}
#endif /* ndef S_IFBLK */
- if ((x & Mono_Posix_FilePermissions_S_IFCHR) == Mono_Posix_FilePermissions_S_IFCHR)
+ if ((x & Mono_Posix_FilePermissions_S_IFMT) == Mono_Posix_FilePermissions_S_IFCHR)
#ifdef S_IFCHR
*r |= S_IFCHR;
#else /* def S_IFCHR */
{errno = EINVAL; return -1;}
#endif /* ndef S_IFCHR */
- if ((x & Mono_Posix_FilePermissions_S_IFDIR) == Mono_Posix_FilePermissions_S_IFDIR)
+ if ((x & Mono_Posix_FilePermissions_S_IFMT) == Mono_Posix_FilePermissions_S_IFDIR)
#ifdef S_IFDIR
*r |= S_IFDIR;
#else /* def S_IFDIR */
{errno = EINVAL; return -1;}
#endif /* ndef S_IFDIR */
- if ((x & Mono_Posix_FilePermissions_S_IFIFO) == Mono_Posix_FilePermissions_S_IFIFO)
+ if ((x & Mono_Posix_FilePermissions_S_IFMT) == Mono_Posix_FilePermissions_S_IFIFO)
#ifdef S_IFIFO
*r |= S_IFIFO;
#else /* def S_IFIFO */
{errno = EINVAL; return -1;}
#endif /* ndef S_IFIFO */
- if ((x & Mono_Posix_FilePermissions_S_IFLNK) == Mono_Posix_FilePermissions_S_IFLNK)
+ if ((x & Mono_Posix_FilePermissions_S_IFMT) == Mono_Posix_FilePermissions_S_IFLNK)
#ifdef S_IFLNK
*r |= S_IFLNK;
#else /* def S_IFLNK */
#ifdef S_IFMT
*r |= S_IFMT;
#else /* def S_IFMT */
- {errno = EINVAL; return -1;}
+ {/* Ignoring Mono_Posix_FilePermissions_S_IFMT, as it is constructed from other values */}
#endif /* ndef S_IFMT */
- if ((x & Mono_Posix_FilePermissions_S_IFREG) == Mono_Posix_FilePermissions_S_IFREG)
+ if ((x & Mono_Posix_FilePermissions_S_IFMT) == Mono_Posix_FilePermissions_S_IFREG)
#ifdef S_IFREG
*r |= S_IFREG;
#else /* def S_IFREG */
{errno = EINVAL; return -1;}
#endif /* ndef S_IFREG */
- if ((x & Mono_Posix_FilePermissions_S_IFSOCK) == Mono_Posix_FilePermissions_S_IFSOCK)
+ if ((x & Mono_Posix_FilePermissions_S_IFMT) == Mono_Posix_FilePermissions_S_IFSOCK)
#ifdef S_IFSOCK
*r |= S_IFSOCK;
#else /* def S_IFSOCK */
#ifdef S_IRWXG
*r |= S_IRWXG;
#else /* def S_IRWXG */
- {errno = EINVAL; return -1;}
+ {/* Ignoring Mono_Posix_FilePermissions_S_IRWXG, as it is constructed from other values */}
#endif /* ndef S_IRWXG */
if ((x & Mono_Posix_FilePermissions_S_IRWXO) == Mono_Posix_FilePermissions_S_IRWXO)
#ifdef S_IRWXO
*r |= S_IRWXO;
#else /* def S_IRWXO */
- {errno = EINVAL; return -1;}
+ {/* Ignoring Mono_Posix_FilePermissions_S_IRWXO, as it is constructed from other values */}
#endif /* ndef S_IRWXO */
if ((x & Mono_Posix_FilePermissions_S_IRWXU) == Mono_Posix_FilePermissions_S_IRWXU)
#ifdef S_IRWXU
*r |= S_IRWXU;
#else /* def S_IRWXU */
- {errno = EINVAL; return -1;}
+ {/* Ignoring Mono_Posix_FilePermissions_S_IRWXU, as it is constructed from other values */}
#endif /* ndef S_IRWXU */
if ((x & Mono_Posix_FilePermissions_S_ISGID) == Mono_Posix_FilePermissions_S_ISGID)
#ifdef S_ISGID
*r |= Mono_Posix_FilePermissions_DEFFILEMODE;
#endif /* ndef DEFFILEMODE */
#ifdef S_IFBLK
- if ((x & S_IFBLK) == S_IFBLK)
+ if ((x & S_IFMT) == S_IFBLK)
*r |= Mono_Posix_FilePermissions_S_IFBLK;
#endif /* ndef S_IFBLK */
#ifdef S_IFCHR
- if ((x & S_IFCHR) == S_IFCHR)
+ if ((x & S_IFMT) == S_IFCHR)
*r |= Mono_Posix_FilePermissions_S_IFCHR;
#endif /* ndef S_IFCHR */
#ifdef S_IFDIR
- if ((x & S_IFDIR) == S_IFDIR)
+ if ((x & S_IFMT) == S_IFDIR)
*r |= Mono_Posix_FilePermissions_S_IFDIR;
#endif /* ndef S_IFDIR */
#ifdef S_IFIFO
- if ((x & S_IFIFO) == S_IFIFO)
+ if ((x & S_IFMT) == S_IFIFO)
*r |= Mono_Posix_FilePermissions_S_IFIFO;
#endif /* ndef S_IFIFO */
#ifdef S_IFLNK
- if ((x & S_IFLNK) == S_IFLNK)
+ if ((x & S_IFMT) == S_IFLNK)
*r |= Mono_Posix_FilePermissions_S_IFLNK;
#endif /* ndef S_IFLNK */
#ifdef S_IFMT
*r |= Mono_Posix_FilePermissions_S_IFMT;
#endif /* ndef S_IFMT */
#ifdef S_IFREG
- if ((x & S_IFREG) == S_IFREG)
+ if ((x & S_IFMT) == S_IFREG)
*r |= Mono_Posix_FilePermissions_S_IFREG;
#endif /* ndef S_IFREG */
#ifdef S_IFSOCK
- if ((x & S_IFSOCK) == S_IFSOCK)
+ if ((x & S_IFMT) == S_IFSOCK)
*r |= Mono_Posix_FilePermissions_S_IFSOCK;
#endif /* ndef S_IFSOCK */
#ifdef S_IRGRP
return 0;
}
+#ifdef HAVE_STRUCT_POLLFD
int
Mono_Posix_FromPollfd (struct Mono_Posix_Pollfd *from, struct pollfd *to)
{
return 0;
}
+#endif /* ndef HAVE_STRUCT_POLLFD */
+#ifdef HAVE_STRUCT_POLLFD
int
Mono_Posix_ToPollfd (struct pollfd *from, struct Mono_Posix_Pollfd *to)
{
return 0;
}
+#endif /* ndef HAVE_STRUCT_POLLFD */
int Mono_Posix_FromPosixFadviseAdvice (int x, int *r)
errno = EINVAL; return -1;
}
+#ifdef HAVE_STRUCT_STAT
int
Mono_Posix_FromStat (struct Mono_Posix_Stat *from, struct stat *to)
{
return 0;
}
+#endif /* ndef HAVE_STRUCT_STAT */
+#ifdef HAVE_STRUCT_STAT
int
Mono_Posix_ToStat (struct stat *from, struct Mono_Posix_Stat *to)
{
return 0;
}
+#endif /* ndef HAVE_STRUCT_STAT */
int Mono_Posix_FromSysconfName (int x, int *r)
return 0;
}
+#ifdef HAVE_STRUCT_TIMEVAL
int
Mono_Posix_FromTimeval (struct Mono_Posix_Timeval *from, struct timeval *to)
{
return 0;
}
+#endif /* ndef HAVE_STRUCT_TIMEVAL */
+#ifdef HAVE_STRUCT_TIMEVAL
int
Mono_Posix_ToTimeval (struct timeval *from, struct Mono_Posix_Timeval *to)
{
return 0;
}
+#endif /* ndef HAVE_STRUCT_TIMEVAL */
+#ifdef HAVE_STRUCT_TIMEZONE
int
Mono_Posix_FromTimezone (struct Mono_Posix_Timezone *from, struct timezone *to)
{
return 0;
}
+#endif /* ndef HAVE_STRUCT_TIMEZONE */
+#ifdef HAVE_STRUCT_TIMEZONE
int
Mono_Posix_ToTimezone (struct timezone *from, struct Mono_Posix_Timezone *to)
{
return 0;
}
+#endif /* ndef HAVE_STRUCT_TIMEZONE */
+
+
+#ifdef HAVE_STRUCT_UTIMBUF
+int
+Mono_Posix_FromUtimbuf (struct Mono_Posix_Utimbuf *from, struct utimbuf *to)
+{
+ _cnm_return_val_if_overflow (time_t, from->actime, -1);
+ _cnm_return_val_if_overflow (time_t, from->modtime, -1);
+
+ memset (to, 0, sizeof(*to));
+
+ to->actime = from->actime;
+ to->modtime = from->modtime;
+
+ return 0;
+}
+#endif /* ndef HAVE_STRUCT_UTIMBUF */
+
+
+#ifdef HAVE_STRUCT_UTIMBUF
+int
+Mono_Posix_ToUtimbuf (struct utimbuf *from, struct Mono_Posix_Utimbuf *to)
+{
+ _cnm_return_val_if_overflow (gint64, from->actime, -1);
+ _cnm_return_val_if_overflow (gint64, from->modtime, -1);
+
+ memset (to, 0, sizeof(*to));
+
+ to->actime = from->actime;
+ to->modtime = from->modtime;
+
+ return 0;
+}
+#endif /* ndef HAVE_STRUCT_UTIMBUF */
int Mono_Posix_FromWaitOptions (int x, int *r)