Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/mono.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDick Porter <dick@acm.org>2004-07-09 20:28:44 +0400
committerDick Porter <dick@acm.org>2004-07-09 20:28:44 +0400
commit4dcf4e14729cdd1fe180187dfa3dec759eb263a7 (patch)
tree01200ae038dcb42b3554cd370a791dcf4a4f29b3
parent212c4d31200ceb347c744347639de84bddc06ffc (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/ChangeLog7
-rw-r--r--mono/metadata/socket-io.c42
-rw-r--r--mono/metadata/socket-io.h15
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);