aboutsummaryrefslogtreecommitdiff
path: root/src/util/connection.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/util/connection.c')
-rw-r--r--src/util/connection.c49
1 files changed, 48 insertions, 1 deletions
diff --git a/src/util/connection.c b/src/util/connection.c
index aa5db91bf..12969b3ba 100644
--- a/src/util/connection.c
+++ b/src/util/connection.c
@@ -346,6 +346,12 @@ GNUNET_CONNECTION_create_from_accept (GNUNET_CONNECTION_AccessCheck access,
346 struct sockaddr_in6 *v6; 346 struct sockaddr_in6 *v6;
347 struct sockaddr *sa; 347 struct sockaddr *sa;
348 void *uaddr; 348 void *uaddr;
349 struct GNUNET_CONNECTION_Credentials *gcp;
350 struct GNUNET_CONNECTION_Credentials gc;
351#ifdef SO_PEERCRED
352 struct ucred uc;
353 socklen_t olen;
354#endif
349 355
350 addrlen = sizeof (addr); 356 addrlen = sizeof (addr);
351 sock = 357 sock =
@@ -384,9 +390,50 @@ GNUNET_CONNECTION_create_from_accept (GNUNET_CONNECTION_AccessCheck access,
384 uaddr = GNUNET_malloc (addrlen); 390 uaddr = GNUNET_malloc (addrlen);
385 memcpy (uaddr, addr, addrlen); 391 memcpy (uaddr, addr, addrlen);
386 } 392 }
393 gcp = NULL;
394 gc.uid = 0;
395 gc.gid = 0;
396 if (sa->sa_family == AF_UNIX)
397 {
398#if HAVE_GETPEEREID
399 /* most BSDs */
400 if (0 == getpeereid (GNUNET_NETWORK_get_fd (sock),
401 &gc.uid,
402 &gc.gid))
403 gcp = &gc;
404#else
405#ifdef SO_PEERCRED
406 /* largely traditional GNU/Linux */
407 olen = sizeof (uc);
408 if ( (0 ==
409 getsockopt (GNUNET_NETWORK_get_fd (sock),
410 SOL_SOCKET, SO_PEERCRED, &uc, &olen)) &&
411 (olen == sizeof (uc)) )
412 {
413 gc.uid = uc.uid;
414 gc.gid = uc.gid;
415 gcp = &gc;
416 }
417#else
418#if HAVE_GETPEERUCRED
419 /* this is for Solaris 10 */
420 ucred_t *uc;
421
422 uc = NULL;
423 if (0 == getpeerucred (GNUNET_NETWORK_get_fd (sock), &uc))
424 {
425 gc.uid = ucred_geteuid (uc);
426 gc.gid = ucred_getegid (uc);
427 gcp = &gc;
428 }
429 ucred_free (uc);
430#endif
431#endif
432#endif
433 }
387 434
388 if ((access != NULL) && 435 if ((access != NULL) &&
389 (GNUNET_YES != (aret = access (access_cls, uaddr, addrlen)))) 436 (GNUNET_YES != (aret = access (access_cls, gcp, uaddr, addrlen))))
390 { 437 {
391 if (aret == GNUNET_NO) 438 if (aret == GNUNET_NO)
392 GNUNET_log (GNUNET_ERROR_TYPE_INFO, 439 GNUNET_log (GNUNET_ERROR_TYPE_INFO,