meillo@0: /* meillo@10: ** 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@10: IDENT* meillo@10: ident_lookup __P2(int, fd, int, timeout) meillo@0: { meillo@10: struct sockaddr_in localaddr, remoteaddr; meillo@10: int len; meillo@0: meillo@10: len = sizeof(remoteaddr); meillo@10: if (getpeername(fd, (struct sockaddr *) &remoteaddr, &len) < 0) meillo@10: return 0; meillo@10: meillo@10: len = sizeof(localaddr); meillo@10: if (getsockname(fd, (struct sockaddr *) &localaddr, &len) < 0) meillo@10: return 0; meillo@10: meillo@10: return ident_query(&localaddr.sin_addr, &remoteaddr.sin_addr, ntohs(localaddr.sin_port), ntohs(remoteaddr.sin_port), timeout); meillo@0: } meillo@0: meillo@0: meillo@10: IDENT* meillo@10: ident_query __P5(struct in_addr *, laddr, struct in_addr *, raddr, int, lport, int, rport, int, timeout) meillo@0: { meillo@10: int res; meillo@10: ident_t *id; meillo@10: struct timeval timout; meillo@10: IDENT *ident = 0; meillo@0: meillo@10: meillo@10: timout.tv_sec = timeout; meillo@10: timout.tv_usec = 0; meillo@10: meillo@10: if (timeout) meillo@10: id = id_open(laddr, raddr, &timout); meillo@10: else meillo@10: id = id_open(laddr, raddr, (struct timeval *) 0); meillo@10: meillo@10: if (!id) { meillo@10: errno = EINVAL; meillo@10: return 0; meillo@10: } meillo@10: meillo@10: if (timeout) meillo@10: res = id_query(id, rport, lport, &timout); meillo@10: else meillo@10: res = id_query(id, rport, lport, (struct timeval *) 0); meillo@10: meillo@10: if (res < 0) { meillo@10: id_close(id); meillo@10: return 0; meillo@10: } meillo@10: meillo@10: ident = (IDENT *) malloc(sizeof(IDENT)); meillo@10: if (!ident) { meillo@10: id_close(id); meillo@10: return 0; meillo@10: } meillo@10: meillo@10: if (timeout) meillo@10: res = id_parse(id, &timout, &ident->lport, &ident->fport, &ident->identifier, &ident->opsys, &ident->charset); meillo@10: else meillo@10: res = id_parse(id, (struct timeval *) 0, &ident->lport, &ident->fport, &ident->identifier, &ident->opsys, &ident->charset); meillo@10: meillo@10: if (res != 1) { meillo@10: free(ident); meillo@10: id_close(id); meillo@10: return 0; meillo@10: } meillo@10: meillo@0: id_close(id); meillo@10: return ident; /* At last! */ meillo@0: } meillo@0: meillo@0: meillo@10: char* meillo@10: ident_id __P2(int, fd, int, timeout) meillo@0: { meillo@10: IDENT *ident; meillo@10: char *id = 0; meillo@0: meillo@10: ident = ident_lookup(fd, timeout); meillo@10: if (ident && ident->identifier && *ident->identifier) { meillo@10: id = id_strdup(ident->identifier); meillo@10: if (id == NULL) meillo@10: return NULL; meillo@10: } meillo@10: meillo@10: ident_free(ident); meillo@10: return id; meillo@0: } meillo@0: meillo@0: meillo@10: void meillo@10: ident_free __P1(IDENT *, id) meillo@0: { meillo@10: if (!id) meillo@10: return; meillo@10: if (id->identifier) meillo@10: free(id->identifier); meillo@10: if (id->opsys) meillo@10: free(id->opsys); meillo@10: if (id->charset) meillo@10: free(id->charset); meillo@10: free(id); meillo@0: }