meillo@0: /*
meillo@0: ** id_query.c                             Transmit a query to an IDENT server
meillo@0: **
meillo@0: ** Author: Peter Eriksson <pen@lysator.liu.se>
meillo@0: */
meillo@0: 
meillo@0: #ifdef NeXT3
meillo@0: #  include <libc.h>
meillo@0: #endif
meillo@0: 
meillo@0: #include <stdio.h>
meillo@0: #include <errno.h>
meillo@0: #include <signal.h>
meillo@0: 
meillo@0: #ifdef HAVE_ANSIHEADERS
meillo@0: #  include <stdlib.h>
meillo@0: #  include <string.h>
meillo@0: #  include <unistd.h>
meillo@0: #endif
meillo@0: 
meillo@0: #include <sys/types.h>
meillo@0: #include <sys/wait.h>
meillo@0: #include <sys/time.h>
meillo@0: 
meillo@0: #ifdef _AIX
meillo@0: #  include <sys/select.h>
meillo@0: #endif
meillo@0: 
meillo@0: #ifdef _AIX
meillo@0: #  include <sys/select.h>
meillo@0: #endif
meillo@0: #ifdef VMS
meillo@10: #  include <sys/socket.h>  /* for fd_set */
meillo@0: #endif
meillo@0: #define IN_LIBIDENT_SRC
meillo@0: #include "ident.h"
meillo@0: 
meillo@0: 
meillo@0: /*
meillo@10: int
meillo@10: id_query __P4(ident_t *, id, int, lport, int, fport, struct timeval *, timeout)
meillo@0: */
meillo@0: 
meillo@10: int
meillo@10: id_query __P((ident_t * id, int lport, int fport, __STRUCT_TIMEVAL_P timeout))
meillo@0: {
meillo@0: #ifdef SIGRETURNTYPE
meillo@10: 	SIGRETURNTYPE(*old_sig) ();
meillo@0: #else
meillo@10: 	void (*old_sig) __P((int));
meillo@0: #endif
meillo@10: 	int res;
meillo@10: 	char buf[80];
meillo@10: 	fd_set ws;
meillo@10: 
meillo@10: 	sprintf(buf, "%d , %d\r\n", lport, fport);
meillo@10: 
meillo@10: 	if (timeout) {
meillo@10: 		FD_ZERO(&ws);
meillo@10: 		FD_SET(id->fd, &ws);
meillo@0: 
meillo@0: #ifdef __hpux
meillo@10: 		if ((res = select(FD_SETSIZE, (int *) 0, (int *) &ws, (int *) 0, timeout)) < 0)
meillo@0: #else
meillo@10: 		if ((res = select(FD_SETSIZE, (fd_set *) 0, &ws, (fd_set *) 0, timeout)) < 0)
meillo@0: #endif
meillo@10: 			return -1;
meillo@10: 
meillo@10: 		if (res == 0) {
meillo@10: 			errno = ETIMEDOUT;
meillo@10: 			return -1;
meillo@10: 		}
meillo@0: 	}
meillo@0: 
meillo@10: 	old_sig = signal(SIGPIPE, SIG_IGN);
meillo@10: 
meillo@10: 	res = write(id->fd, buf, strlen(buf));
meillo@10: 
meillo@10: 	signal(SIGPIPE, old_sig);
meillo@10: 
meillo@10: 	return res;
meillo@0: }