meillo@0: /* meillo@0: ** ident.c High-level calls to the ident lib meillo@0: ** meillo@0: ** Author: Pär Emanuelsson meillo@0: ** Hacked by: Peter Eriksson meillo@0: */ meillo@0: meillo@0: #ifdef NeXT3 meillo@0: # include meillo@0: #endif meillo@0: meillo@0: #include meillo@0: meillo@0: #ifdef HAVE_ANSIHEADERS meillo@0: # include meillo@0: # include meillo@0: #endif meillo@0: meillo@0: #include meillo@0: meillo@0: #include meillo@0: #include meillo@0: meillo@0: #define IN_LIBIDENT_SRC meillo@0: #include "ident.h" meillo@0: meillo@0: #include meillo@0: meillo@0: meillo@0: meillo@0: meillo@0: /* Do a complete ident query and return result */ meillo@0: meillo@0: IDENT *ident_lookup __P2(int, fd, meillo@0: int, timeout) meillo@0: { meillo@0: struct sockaddr_in localaddr, remoteaddr; meillo@0: int len; meillo@0: meillo@0: len = sizeof(remoteaddr); meillo@0: if (getpeername(fd, (struct sockaddr*) &remoteaddr, &len) < 0) meillo@0: return 0; meillo@0: meillo@0: len = sizeof(localaddr); meillo@0: if (getsockname(fd, (struct sockaddr *) &localaddr, &len) < 0) meillo@0: return 0; meillo@0: meillo@0: return ident_query( &localaddr.sin_addr, &remoteaddr.sin_addr, meillo@0: ntohs(localaddr.sin_port), ntohs(remoteaddr.sin_port), meillo@0: timeout); meillo@0: } meillo@0: meillo@0: meillo@0: IDENT *ident_query __P5(struct in_addr *, laddr, meillo@0: struct in_addr *, raddr, meillo@0: int, lport, meillo@0: int, rport, meillo@0: int, timeout) meillo@0: { meillo@0: int res; meillo@0: ident_t *id; meillo@0: struct timeval timout; meillo@0: IDENT *ident=0; meillo@0: meillo@0: meillo@0: timout.tv_sec = timeout; meillo@0: timout.tv_usec = 0; meillo@0: meillo@0: if (timeout) meillo@0: id = id_open( laddr, raddr, &timout); meillo@0: else meillo@0: id = id_open( laddr, raddr, (struct timeval *)0); meillo@0: meillo@0: if (!id) meillo@0: { meillo@0: errno = EINVAL; meillo@0: return 0; meillo@0: } meillo@0: meillo@0: if (timeout) meillo@0: res = id_query(id, rport, lport, &timout); meillo@0: else meillo@0: res = id_query(id, rport, lport, (struct timeval *) 0); meillo@0: meillo@0: if (res < 0) meillo@0: { meillo@0: id_close(id); meillo@0: return 0; meillo@0: } meillo@0: meillo@0: ident = (IDENT *) malloc(sizeof(IDENT)); meillo@0: if (!ident) { meillo@0: id_close(id); meillo@0: return 0; meillo@0: } meillo@0: meillo@0: if (timeout) meillo@0: res = id_parse(id, &timout, meillo@0: &ident->lport, meillo@0: &ident->fport, meillo@0: &ident->identifier, meillo@0: &ident->opsys, meillo@0: &ident->charset); meillo@0: else meillo@0: res = id_parse(id, (struct timeval *) 0, meillo@0: &ident->lport, meillo@0: &ident->fport, meillo@0: &ident->identifier, meillo@0: &ident->opsys, meillo@0: &ident->charset); meillo@0: meillo@0: if (res != 1) meillo@0: { meillo@0: free(ident); meillo@0: id_close(id); meillo@0: return 0; meillo@0: } meillo@0: meillo@0: id_close(id); meillo@0: return ident; /* At last! */ meillo@0: } meillo@0: meillo@0: meillo@0: char *ident_id __P2(int, fd, meillo@0: int, timeout) meillo@0: { meillo@0: IDENT *ident; meillo@0: char *id=0; meillo@0: meillo@0: ident = ident_lookup(fd, timeout); meillo@0: if (ident && ident->identifier && *ident->identifier) meillo@0: { meillo@0: id = id_strdup(ident->identifier); meillo@0: if (id == NULL) meillo@0: return NULL; meillo@0: } meillo@0: meillo@0: ident_free(ident); meillo@0: return id; meillo@0: } meillo@0: meillo@0: meillo@0: void ident_free __P1(IDENT *, id) meillo@0: { meillo@0: if (!id) meillo@0: return; meillo@0: if (id->identifier) meillo@0: free(id->identifier); meillo@0: if (id->opsys) meillo@0: free(id->opsys); meillo@0: if (id->charset) meillo@0: free(id->charset); meillo@0: free(id); meillo@0: } meillo@0: