2004-07-09 Dick Porter <dick@ximian.com>
authorDick Porter <dick@acm.org>
Fri, 9 Jul 2004 13:03:03 +0000 (13:03 -0000)
committerDick Porter <dick@acm.org>
Fri, 9 Jul 2004 13:03:03 +0000 (13:03 -0000)
* 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=/trunk/mono/; revision=30927

mono/metadata/ChangeLog
mono/metadata/socket-io.c
mono/metadata/socket-io.h

index 5bf5f0c482e764124dee53ad6b996f958acc1277..3f3be079c958bf5f927dc942f6c12bd01701b242 100644 (file)
@@ -1,3 +1,10 @@
+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-09  Peter Bartok <pbartok@novell.com>
        * loader.c: winelib.exe.so error message is now only displayed if
        MONO_DEBUG is set. To help us avoid questions when people are trying
index c2b129984e7af6637d368c0eb5492e3b71a01af5..1bb44ea75b27109cee2d117fbd2f1569e6366cd4 100644 (file)
@@ -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);
        }
index 3540882f1058d85e0a8650c0f03733aa4a0aadc8..5c2ee72181aba0cd18958c915d250ca7c07b77c0 100644 (file)
@@ -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);