diff options
| -rwxr-xr-x | configure | 1 | ||||
| -rw-r--r-- | ipc.c | 15 | 
2 files changed, 16 insertions, 0 deletions
| @@ -681,6 +681,7 @@ IRIX )  SunOS )  	echo 'EFLAGS+=-lresolv -lnsl -lsocket' >> Makefile.settings  	echo 'STRIP=\# skip strip' >> Makefile.settings +	echo '#define NO_FD_PASSING' >> config.h  ;;  AIX )  	echo 'EFLAGS+=-Wl,-brtl' >> Makefile.settings @@ -38,6 +38,13 @@ static int ipc_child_recv_fd = -1;  static void ipc_master_takeover_fail( struct bitlbee_child *child, gboolean both );  static gboolean ipc_send_fd( int fd, int send_fd ); +/* On Solaris and possibly other systems passing FDs between processes is + * not possible (or at least not using the method used in this file. + * Just disable that code, the functionality is not that important. */ +#if defined(NO_FD_PASSING) && !defined(CMSG_SPACE) +#define CMSG_SPACE(len) 1 +#endif +  static void ipc_master_cmd_client( irc_t *data, char **cmd )  {  	/* Normally data points at an irc_t block, but for the IPC master @@ -445,10 +452,12 @@ gboolean ipc_child_identify( irc_t *irc )  {  	if( global.conf->runmode == RUNMODE_FORKDAEMON )  	{ +#ifndef NO_FD_PASSING  		if( !ipc_send_fd( global.listen_socket, irc->fd ) )  			ipc_child_disable();  		ipc_to_master_str( "IDENTIFY %s :%s\r\n", irc->user->nick, irc->password ); +#endif  		return TRUE;  	} @@ -565,12 +574,15 @@ static char *ipc_readline( int fd, int *recv_fd )  	memset( &msg, 0, sizeof( msg ) );  	msg.msg_iov = &iov;  	msg.msg_iovlen = 1; +#ifndef NO_FD_PASSING  	msg.msg_control = ccmsg;  	msg.msg_controllen = sizeof( ccmsg ); +#endif  	if( recvmsg( fd, &msg, 0 ) != size )  		return NULL; +#ifndef NO_FD_PASSING  	if( recv_fd )  		for( cmsg = CMSG_FIRSTHDR( &msg ); cmsg; cmsg = CMSG_NXTHDR( &msg, cmsg ) )  			if( cmsg->cmsg_level == SOL_SOCKET && cmsg->cmsg_type == SCM_RIGHTS ) @@ -585,6 +597,7 @@ static char *ipc_readline( int fd, int *recv_fd )  				fprintf( stderr, "pid %d received fd %d\n", (int) getpid(), *recv_fd );  				*/  			} +#endif  	/*  	fprintf( stderr, "pid %d received: %s", (int) getpid(), buf ); @@ -757,6 +770,7 @@ static gboolean ipc_send_fd( int fd, int send_fd )  	msg.msg_iov = &iov;  	msg.msg_iovlen = 1; +#ifndef NO_FD_PASSING  	msg.msg_control = ccmsg;  	msg.msg_controllen = sizeof( ccmsg );  	cmsg = CMSG_FIRSTHDR( &msg ); @@ -765,6 +779,7 @@ static gboolean ipc_send_fd( int fd, int send_fd )  	cmsg->cmsg_len = CMSG_LEN( sizeof( send_fd ) );  	*(int*)CMSG_DATA( cmsg ) = send_fd;  	msg.msg_controllen = cmsg->cmsg_len; +#endif  	return sendmsg( fd, &msg, 0 ) == 6;  } | 
