diff options
author | Dick Porter <dick@acm.org> | 2004-07-09 20:28:44 +0400 |
---|---|---|
committer | Dick Porter <dick@acm.org> | 2004-07-09 20:28:44 +0400 |
commit | 4dcf4e14729cdd1fe180187dfa3dec759eb263a7 (patch) | |
tree | 01200ae038dcb42b3554cd370a791dcf4a4f29b3 | |
parent | 212c4d31200ceb347c744347639de84bddc06ffc (diff) |
2004-07-09 Dick Porter <dick@ximian.com>
* socket-io.h:
* socket-io.c
(ves_icall_System_Net_Sockets_Socket_GetSocketOption_obj_internal):
Add support for SO_PEERCRED if its available.
svn path=/branches/mono-1-0/mono/; revision=30956
-rw-r--r-- | mono/metadata/ChangeLog | 7 | ||||
-rw-r--r-- | mono/metadata/socket-io.c | 42 | ||||
-rw-r--r-- | mono/metadata/socket-io.h | 15 |
3 files changed, 63 insertions, 1 deletions
diff --git a/mono/metadata/ChangeLog b/mono/metadata/ChangeLog index 89bc945cfa4..9ae7ea41c64 100644 --- a/mono/metadata/ChangeLog +++ b/mono/metadata/ChangeLog @@ -4,6 +4,13 @@ Don't do any more processing if the matched length was 0. It was increasing the size of the string before. Fixes bug 61167. +2004-07-09 Dick Porter <dick@ximian.com> + + * socket-io.h: + * socket-io.c + (ves_icall_System_Net_Sockets_Socket_GetSocketOption_obj_internal): + Add support for SO_PEERCRED if its available. + 2004-07-03 Zoltan Varga <vargaz@freemail.hu> * marshal.c: Fix managed->native stringbuilder marshalling. Implement diff --git a/mono/metadata/socket-io.c b/mono/metadata/socket-io.c index c2b129984e7..1bb44ea75b2 100644 --- a/mono/metadata/socket-io.c +++ b/mono/metadata/socket-io.c @@ -330,6 +330,11 @@ static gint32 convert_sockopt_level_and_name(MonoSocketOptionLevel mono_level, case SocketOptionName_Type: *system_name = SO_TYPE; break; +#ifdef SO_PEERCRED + case SocketOptionName_PeerCred: + *system_name = SO_PEERCRED; + break; +#endif case SocketOptionName_ExclusiveAddressUse: case SocketOptionName_UseLoopback: case SocketOptionName_MaxConnections: @@ -1428,6 +1433,10 @@ void ves_icall_System_Net_Sockets_Socket_GetSocketOption_obj_internal(SOCKET soc int lingersize=sizeof(linger); struct timeval tv; int tvsize=sizeof(tv); +#ifdef SO_PEERCRED + struct ucred cred; + int credsize = sizeof(cred); +#endif MonoDomain *domain=mono_domain_get(); MonoObject *obj; MonoClass *obj_class; @@ -1461,6 +1470,13 @@ void ves_icall_System_Net_Sockets_Socket_GetSocketOption_obj_internal(SOCKET soc &tvsize); break; +#ifdef SO_PEERCRED + case SocketOptionName_PeerCred: + ret = _wapi_getsockopt (sock, system_level, system_name, &cred, + &credsize); + break; +#endif + default: ret = _wapi_getsockopt (sock, system_level, system_name, &val, &valsize); @@ -1500,6 +1516,32 @@ void ves_icall_System_Net_Sockets_Socket_GetSocketOption_obj_internal(SOCKET soc obj = int_to_object (domain, (tv.tv_sec * 1000) + (tv.tv_usec / 1000)); break; +#ifdef SO_PEERCRED + case SocketOptionName_PeerCred: + { + /* build a Mono.Posix.PeerCred+PeerCredData if + * possible + */ + MonoImage *mono_posix_image = mono_image_loaded ("Mono.Posix"); + MonoPeerCredData *cred_data; + + if (mono_posix_image == NULL) { + *error = WSAENOPROTOOPT; + return; + } + + obj_class = mono_class_from_name(mono_posix_image, + "Mono.Posix", + "PeerCred/PeerCredData"); + obj = mono_object_new(domain, obj_class); + cred_data = (MonoPeerCredData *)obj; + cred_data->pid = cred.pid; + cred_data->uid = cred.uid; + cred_data->gid = cred.gid; + break; + } +#endif + default: obj = int_to_object (domain, val); } diff --git a/mono/metadata/socket-io.h b/mono/metadata/socket-io.h index 3540882f105..5c2ee72181a 100644 --- a/mono/metadata/socket-io.h +++ b/mono/metadata/socket-io.h @@ -130,7 +130,12 @@ typedef enum { SocketOptionName_BsdUrgent=2, SocketOptionName_Expedited=2, SocketOptionName_NoChecksum=1, - SocketOptionName_ChecksumCoverage=20 + SocketOptionName_ChecksumCoverage=20, + + /* This is Mono-specific, keep it in sync with + * Mono.Posix/PeerCred.cs + */ + SocketOptionName_PeerCred=10001 } MonoSocketOptionName; typedef struct _MonoSocketAsyncResult { @@ -154,6 +159,14 @@ typedef struct _MonoSocketAsyncResult { gint error; } MonoSocketAsyncResult; +typedef struct +{ + MonoObject obj; + gint pid; + gint uid; + gint gid; +} MonoPeerCredData; + extern gpointer ves_icall_System_Net_Sockets_Socket_Socket_internal(MonoObject *this, gint32 family, gint32 type, gint32 proto, gint32 *error); extern void ves_icall_System_Net_Sockets_Socket_Close_internal(SOCKET sock, gint32 *error); extern gint32 ves_icall_System_Net_Sockets_SocketException_WSAGetLastError_internal(void); |