Home | History | Annotate | Line # | Download | only in back-sock
      1 /*	$NetBSD: opensock.c,v 1.4 2025/09/05 21:16:31 christos Exp $	*/
      2 
      3 /* opensock.c - open a unix domain socket */
      4 /* $OpenLDAP$ */
      5 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
      6  *
      7  * Copyright 2007-2024 The OpenLDAP Foundation.
      8  * All rights reserved.
      9  *
     10  * Redistribution and use in source and binary forms, with or without
     11  * modification, are permitted only as authorized by the OpenLDAP
     12  * Public License.
     13  *
     14  * A copy of this license is available in the file LICENSE in the
     15  * top-level directory of the distribution or, alternatively, at
     16  * <http://www.OpenLDAP.org/license.html>.
     17  */
     18 /* ACKNOWLEDGEMENTS:
     19  * This work was initially developed by Brian Candler for inclusion
     20  * in OpenLDAP Software.
     21  */
     22 
     23 #include <sys/cdefs.h>
     24 __RCSID("$NetBSD: opensock.c,v 1.4 2025/09/05 21:16:31 christos Exp $");
     25 
     26 #include "portable.h"
     27 
     28 #include <stdio.h>
     29 
     30 #include <ac/errno.h>
     31 #include <ac/string.h>
     32 #include <ac/socket.h>
     33 #include <ac/unistd.h>
     34 
     35 #include "slap.h"
     36 #include "back-sock.h"
     37 
     38 /*
     39  * FIXME: count the number of concurrent open sockets (since each thread
     40  * may open one). Perhaps block here if a soft limit is reached, and fail
     41  * if a hard limit reached
     42  */
     43 
     44 FILE *
     45 opensock(
     46     const char	*sockpath
     47 )
     48 {
     49 	int	fd;
     50 	FILE	*fp;
     51 	struct sockaddr_un sockun;
     52 
     53 	fd = socket(PF_UNIX, SOCK_STREAM, 0);
     54 	if ( fd < 0 ) {
     55 		Debug( LDAP_DEBUG_ANY, "socket create failed\n" );
     56 		return( NULL );
     57 	}
     58 
     59 	sockun.sun_family = AF_UNIX;
     60 	sprintf(sockun.sun_path, "%.*s", (int)(sizeof(sockun.sun_path)-1),
     61 		sockpath);
     62 	if ( connect( fd, (struct sockaddr *)&sockun, sizeof(sockun) ) < 0 ) {
     63 		Debug( LDAP_DEBUG_ANY, "socket connect(%s) failed\n",
     64 			sockpath ? sockpath : "<null>" );
     65 		close( fd );
     66 		return( NULL );
     67 	}
     68 
     69 	if ( ( fp = fdopen( fd, "r+" ) ) == NULL ) {
     70 		Debug( LDAP_DEBUG_ANY, "fdopen failed\n" );
     71 		close( fd );
     72 		return( NULL );
     73 	}
     74 
     75 	return( fp );
     76 }
     77