summaryrefslogtreecommitdiff
path: root/glib
diff options
context:
space:
mode:
authorMarc-André Lureau <marcandre.lureau@redhat.com>2022-04-08 14:49:49 +0400
committerMarc-André Lureau <marcandre.lureau@redhat.com>2022-05-12 18:54:11 +0200
commit277657eaccc9dfcc16b177e95cc1df55e5c5be0f (patch)
tree988859521fd6ce0b0f7e40824edd5dedf9d6bdfa /glib
parentc43472060bc1a64715f1d2f90a40afb8f31756ba (diff)
downloadglib-277657eaccc9dfcc16b177e95cc1df55e5c5be0f.tar.gz
glib/win32: introduce private g_win32_handle_is_socket()
Used in following commits, including in some GIO experiments. Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Diffstat (limited to 'glib')
-rw-r--r--glib/glib-init.h1
-rw-r--r--glib/glib-private.c1
-rw-r--r--glib/glib-private.h3
-rw-r--r--glib/gwin32.c19
4 files changed, 24 insertions, 0 deletions
diff --git a/glib/glib-init.h b/glib/glib-init.h
index b01d256b9..73e186199 100644
--- a/glib/glib-init.h
+++ b/glib/glib-init.h
@@ -44,6 +44,7 @@ gboolean _g_win32_call_rtl_version (OSVERSIONINFOEXW *info);
extern HMODULE glib_dll;
gchar *g_win32_find_helper_executable_path (const gchar *process_name, void *dll_handle);
int g_win32_reopen_noninherited (int fd, int mode, GError **err);
+gboolean g_win32_handle_is_socket (void *h);
#endif
diff --git a/glib/glib-private.c b/glib/glib-private.c
index 357a43a30..321efc1d6 100644
--- a/glib/glib-private.c
+++ b/glib/glib-private.c
@@ -56,6 +56,7 @@ glib__private__ (void)
g_win32_fstat,
g_win32_find_helper_executable_path,
g_win32_reopen_noninherited,
+ g_win32_handle_is_socket,
#endif
};
diff --git a/glib/glib-private.h b/glib/glib-private.h
index 787f8f1fa..39b7c0a8e 100644
--- a/glib/glib-private.h
+++ b/glib/glib-private.h
@@ -175,6 +175,9 @@ typedef struct {
int (* g_win32_reopen_noninherited) (int fd,
int mode,
GError **err);
+
+ gboolean (* g_win32_handle_is_socket) (void *handle);
+
#endif
diff --git a/glib/gwin32.c b/glib/gwin32.c
index a4ed386ba..c0e1d7f3f 100644
--- a/glib/gwin32.c
+++ b/glib/gwin32.c
@@ -1451,6 +1451,25 @@ g_win32_find_helper_executable_path (const gchar *executable_name, void *dll_han
}
/*
+ * g_win32_handle_is_socket:
+ * @h: a win32 HANDLE
+ *
+ * Returns: %TRUE if the handle is a `SOCKET`.
+ */
+gboolean
+g_win32_handle_is_socket (HANDLE h)
+{
+ int option = 0;
+ int optlen = sizeof (option);
+
+ /* according to: https://stackoverflow.com/a/50981652/1277510, this is reasonable */
+ if (getsockopt ((SOCKET) h, SOL_SOCKET, SO_DEBUG, (char *) &option, &optlen) == SOCKET_ERROR)
+ return FALSE;
+
+ return TRUE;
+}
+
+/*
* g_win32_reopen_noninherited:
* @fd: (transfer full): A file descriptor
* @mode: _open_osfhandle flags