home | help
IDENT(3)		    Library Functions Manual			IDENT(3)

NAME
     ident_lookup,   ident_id,	 ident_free,  id_open_addr,  id_open,  id_close,
     id_query, id_parse, id_fileno - query remote IDENT server

SYNOPSIS
     #include <ident.h>

     High-level calls

     IDENT *ident_lookup(int fd, int timeout)

     char *ident_id(int fd, int timeout)

     void ident_free(IDENT *id)

     Low-level calls

     ident_t *id_open_addr (const struct sockaddr *laddr,
	     const struct sockaddr *faddr, struct timeval *timeout)
     ident_t *id_open(const struct in_addr *laddr,
	     const struct in_addr *faddr, struct timeval *timeout)

     int id_close(ident_t *id)

     int id_query(ident_t *id, int lport, int fport,
	     struct timeval *timeout)

     int id_parse(ident_t *id, struct timeval *timeout,
	     int *lport, int *fport,
	     char **identifier, char **opsys, char **charset)

     int id_fileno(ident_t *id)

DESCRIPTION
     ident_lookup tries to connect to a remote IDENT  server  to  establish  the
     identity  of  the	peer  connected on fd, which should be a socket file de-
     scriptor.	timeout is the longest permissible time to block waiting for  an
     answer,  and  is  given  in seconds. A value of 0 (zero) means wait indefi-
     nitely (which in the most extreme case will normally be until the	underly-
     ing network times out).  ident_lookup returns a pointer to an IDENT struct,
     which has the following contents:

	    typedef struct {
		 int lport;	     /* Local port */
		 int fport;	     /* Far (remote) port */
		 char *identifier;   /* Normally user name */
		 char *opsys;	     /* OS */
		 char *charset;      /* Charset (what did you expect?) */
	    } IDENT;

     For a full description of the different fields, refer to RFC-1413.

     All  data	returned  by ident_lookup (including the IDENT struct) points to
     malloc'd data, which can be freed with a call to ident_free.   ident_lookup
     returns  0 on error or timeout. Presently, this should normally be taken to
     mean that the remote site is not running an IDENT server, but it might nat-
     urally be caused by other network related problems as well.  Note that  all
     fields of the IDENT struct need not necessarily be set.

     ident_id  takes  the  same  parameters  as  ident_lookup but only returns a
     pointer to a malloc'd area containing the identifier string, which is prob-
     ably the most wanted data from the IDENT query. You should free()	the  re-
     sult manually.

     ident_free frees all data areas associated with the IDENT struct pointed to
     by id, including the struct itself.

				   Low-level calls

     The low-level calls can be used when greater flexibility is needed. For ex-
     ample,  if non-blocking I/O is needed, or multiple queries to the same host
     are to be made.

     id_open_addr and id_open both open a connection to the remote IDENT  server
     referred to by faddr.  The timeout is specified by timeout.  A null-pointer
     means  wait  indefinitely,  while a pointer to a zero-valued timeval struct
     sets non-blocking I/O, in the same way as for select(2).  id_open_addr  and
     id_open  return  a pointer to an id_t data, which is an opaque structure to
     be used as future reference to the opened connection. When using non-block-
     ing I/O it might however be useful to access the underlying socket file de-
     scriptior, which can be gotten at through the id_fileno macro described be-
     low.  While id_open only works with IPv4  32-bits	addresses,  id_open_addr
     expects  complete	sockaddr  structures.	At the moment, it supports sock-
     addr_in (AF_INET) and sockaddr_in6 (AF_INET6) structures.	id_open_addr was
     first introduced in libident version 0.30.

     id_close closes the connection opened with id_open and frees all data asso-
     ciated with id.

     id_query sends off a query to a remote IDENT server.  lport and  fport  are
     sent  to  the server to identify the connection for which identification is
     needed.  timeout is given as for id_open.	If successful, id_query  returns
     the  number  of bytes sent to the remote server. If not, -1 is returned and
     errno is set.

     id_parse parses the reply to a query sent off by id_query and  returns  in-
     formation	to  the  locations pointed to by lport, fport, identifier, opsys
     and charset.  For string data (identifier, opsys and charset)  pointers  to
     malloc'd space are returned.

     id_parse returns:

	     1	   If completely successful.

	    -3	   Illegal  reply type from remote server.  identifier is set to
		   the illegal reply.

	    -2	   Cannot parse the reply from the server.  identifier	is  nor-
		   mally set to the illegal reply.

	    -1	   On general errors or timeout.

	     0	   When  non-blocking  mode is set and id_parse has not finished
		   parsing the reply from the remote server.

	     2	   Indicates the query/reply were  successful,	but  the  remote
		   server  experienced some error.  identifier is set to the er-
		   ror message from the remote server.

     For all errors, errno is set as appropriate.

     id_fileno is a macro that takes an  id_t  handle  and  returns  the  actual
     socket file descriptor used for the connection to the remote server.

ERRORS
     ETIMEDOUT	    The call timed out and non-blocking I/O was not set.

EXAMPLES
     Here's  an example how to handle the reply from id_reply() in the case that
     non-blocking I/O is set. Note that id_reply() will return 0 as long as it's
     not finished parsing a reply.

	    int rcode;
	    id_t idp;

	    /* ... */

	    idp = id_open_addr(...);
	    if (idp == NULL)
	    {
	      perror ("id_open_addr");
	      /* ... */
	    }

	    /* ... */

	    while ((rcode = id_parse(idp, timeout,
			    &lport, &fport, &id, &op, &cs)) == 0)
		 ;

	    if (rcode < 0)
	    {
	      if (errno == ETIMEDOUT)
		foo();	  /* Lookup timed out */
	      else
		bar();	    /* Fatal error */
	    }
	    else if (rcode == 1)
	    {
	      /* Valid USERID protocol reply */
	    }
	    else if (rcode == 2)
	    {
	      /* Protocol ERROR reply */
	    }

SEE ALSO
     RFC-1413, socket(2), select(2)

AUTHORS
     Peter Eriksson <pen@lysator.liu.se>
     Par Emanuelsson <pell@lysator.liu.se>
     Remi Denis-Courmont <rdenis (at) simphalempin (dot) com>

BUGS
     For ident_lookup and ident_id the blocking time in extreme cases  might  be
     as much as three times the value given in the timeout parameter.

Lysator ACS			 11 August 2003 			IDENT(3)

home | help