X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=libraries%2Flibldap%2Fos-local.c;h=a6f7318610b765598429d0f73a2a2eb8165a04cb;hb=427f4ee0f66cac081a712e4ccc08609813b17fdc;hp=70f948de19713af0f4d614d5f013fe80c1411544;hpb=c890c96d13c53cf0fa1d9580fea2ab47a2c8caa9;p=openldap diff --git a/libraries/libldap/os-local.c b/libraries/libldap/os-local.c index 70f948de19..a6f7318610 100644 --- a/libraries/libldap/os-local.c +++ b/libraries/libldap/os-local.c @@ -2,7 +2,7 @@ /* $OpenLDAP$ */ /* This work is part of OpenLDAP Software . * - * Copyright 1998-2008 The OpenLDAP Foundation. + * Copyright 1998-2010 The OpenLDAP Foundation. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -47,6 +47,9 @@ #ifdef HAVE_IO_H #include #endif /* HAVE_IO_H */ +#ifdef HAVE_FCNTL_H +#include +#endif #include "ldap-int.h" #include "ldap_defaults.h" @@ -89,6 +92,9 @@ ldap_pvt_socket(LDAP *ld) { ber_socket_t s = socket(PF_LOCAL, SOCK_STREAM, 0); oslocal_debug(ld, "ldap_new_socket: %d\n",s,0,0); +#ifdef FD_CLOEXEC + fcntl(s, F_SETFD, FD_CLOEXEC); +#endif return ( s ); } @@ -143,7 +149,7 @@ ldap_pvt_is_socket_ready(LDAP *ld, int s) == AC_SOCKET_ERROR ) { /* XXX: needs to be replace with ber_stream_read() */ - read(s, &ch, 1); + (void)read(s, &ch, 1); TRACE; return -1; } @@ -228,7 +234,7 @@ sendcred: msg.msg_accrights = (char *)fds; msg.msg_accrightslen = sizeof(int); # endif /* HAVE_STRUCT_MSGHDR_MSG_CONTROL */ - getpeername( s, sa, &salen ); + getpeername( s, (struct sockaddr *) sa, &salen ); fchmod( fds[0], S_ISUID|S_IRWXU ); write( fds[1], sa, salen ); sendmsg( s, &msg, 0 ); @@ -313,11 +319,12 @@ sendcred: } int -ldap_connect_to_path(LDAP *ld, Sockbuf *sb, const char *path, int async) +ldap_connect_to_path(LDAP *ld, Sockbuf *sb, LDAPURLDesc *srv, int async) { struct sockaddr_un server; ber_socket_t s; int rc; + const char *path = srv->lud_host; oslocal_debug(ld, "ldap_connect_to_path\n",0,0,0); @@ -344,8 +351,12 @@ ldap_connect_to_path(LDAP *ld, Sockbuf *sb, const char *path, int async) rc = ldap_pvt_connect(ld, s, &server, async); if (rc == 0) { - ber_sockbuf_ctrl( sb, LBER_SB_OPT_SET_FD, (void *)&s ); - } else { + int err; + err = ldap_int_connect_cbs( ld, sb, &s, srv, (struct sockaddr *)&server ); + if ( err ) + rc = err; + } + if ( rc ) { ldap_pvt_close_socket(ld, s); } return rc;