Example #1
0
int rvnamedactive(void)
{
	int fd;
	fd_set sockset;
	struct rvn rpkt;
	struct sockaddr_un su;
	int sstat;
	struct timeval tv;
	socklen_t fr;
	int br;
	char unix_socket[80];

	strncpy(unix_socket, get_path(T_WORKDIR, gen_unix_sockname()), 80);
	unlink(unix_socket);

	fd = socket(PF_UNIX, SOCK_DGRAM, 0);
	su.sun_family = AF_UNIX;
	strcpy(su.sun_path, unix_socket);
	bind(fd, (struct sockaddr *) &su,
	     sizeof(su.sun_family) + strlen(su.sun_path));

	su.sun_family = AF_UNIX;
	strcpy(su.sun_path, IPTSOCKNAME);

	rpkt.type = RVN_HELLO;

	sendto(fd, &rpkt, sizeof(struct rvn), 0, (struct sockaddr *) &su,
	       sizeof(su.sun_family) + strlen(su.sun_path));

	tv.tv_sec = 1;
	tv.tv_usec = 0;

	FD_ZERO(&sockset);
	FD_SET(fd, &sockset);

	do {
		sstat = select(fd + 1, &sockset, NULL, NULL, &tv);
	} while ((sstat < 0) && (errno != ENOMEM) && (errno == EINTR));

	if (sstat == 1) {
		fr = sizeof(su.sun_family) + strlen(su.sun_path);
		do {
			br = recvfrom(fd, &rpkt, sizeof(struct rvn), 0,
				      (struct sockaddr *) &su, &fr);
		} while ((br < 0) && (errno == EINTR));

		if (br < 0)
			printipcerr();
	}

	close(fd);
	unlink(unix_socket);

	if (sstat == 0)
		return 0;
	else
		return 1;
}
Example #2
0
int revname(int *lookup, struct sockaddr_storage *addr,
	    char *target, size_t target_size, int rvnfd)
{
	struct rvn rpkt;
	int br;
	struct sockaddr_un su;
	socklen_t fl;
	fd_set sockset;
	struct timeval tv;
	int sstat = 0;

	memset(target, 0, target_size);
	if (*lookup) {
		if (rvnfd > 0) {
			su.sun_family = AF_UNIX;
			strcpy(su.sun_path, IPTSOCKNAME);

			rpkt.type = RVN_REQUEST;
			sockaddr_copy(&rpkt.addr, addr);

			sendto(rvnfd, &rpkt, sizeof(struct rvn), 0,
			       (struct sockaddr *) &su,
			       sizeof(su.sun_family) + strlen(su.sun_path));

			fl = sizeof(su.sun_family) + strlen(su.sun_path);
			do {
				tv.tv_sec = 10;
				tv.tv_usec = 0;

				FD_ZERO(&sockset);
				FD_SET(rvnfd, &sockset);

				do {
					sstat =
					    select(rvnfd + 1, &sockset, NULL,
						   NULL, &tv);
				} while ((sstat < 0) && (errno == EINTR));

				if (FD_ISSET(rvnfd, &sockset))
					br = recvfrom(rvnfd, &rpkt,
						      sizeof(struct rvn), 0,
						      (struct sockaddr *) &su,
						      &fl);
				else
					br = -1;
			} while ((br < 0) && (errno == EINTR));

			if (br < 0) {
				sockaddr_ntop(addr, target, target_size);
				printipcerr();
				*lookup = 0;
				return RESOLVED;
			}
			strncpy(target, rpkt.fqdn, target_size - 1);
			return (rpkt.ready);
		} else {
			struct hostent *he = sockaddr_gethostbyaddr(addr);
			if (he == NULL) {
				sockaddr_ntop(addr, target, target_size);
			} else {
				strncpy(target, he->h_name, target_size - 1);
			}

			return RESOLVED;
		}
	} else {
		sockaddr_ntop(addr, target, target_size);
		return RESOLVED;
	}
	return NOTRESOLVED;
}
Example #3
0
int revname(int *lookup, struct in_addr *saddr, struct in6_addr *s6addr,
	    char *target, int rvnfd)
{
	struct hostent *he;
	struct rvn rpkt;
	int br;
	struct sockaddr_un su;
	socklen_t fl;
	fd_set sockset;
	struct timeval tv;
	int sstat = 0;

	memset(target, 0, 45);
	if (*lookup) {
		if (rvnfd > 0) {
			su.sun_family = AF_UNIX;
			strcpy(su.sun_path, IPTSOCKNAME);

			rpkt.type = RVN_REQUEST;
			rpkt.saddr.s_addr = saddr->s_addr;

			if (s6addr != NULL)
				memcpy(rpkt.s6addr.s6_addr, s6addr->s6_addr,
				       16);
			else
				memset(rpkt.s6addr.s6_addr, 0, 4);

			sendto(rvnfd, &rpkt, sizeof(struct rvn), 0,
			       (struct sockaddr *) &su,
			       sizeof(su.sun_family) + strlen(su.sun_path));

			fl = sizeof(su.sun_family) + strlen(su.sun_path);
			do {
				tv.tv_sec = 10;
				tv.tv_usec = 0;

				FD_ZERO(&sockset);
				FD_SET(rvnfd, &sockset);

				do {
					sstat =
					    select(rvnfd + 1, &sockset, NULL,
						   NULL, &tv);
				} while ((sstat < 0) && (errno == EINTR));

				if (FD_ISSET(rvnfd, &sockset))
					br = recvfrom(rvnfd, &rpkt,
						      sizeof(struct rvn), 0,
						      (struct sockaddr *) &su,
						      &fl);
				else
					br = -1;
			} while ((br < 0) && (errno == EINTR));

			if (br < 0) {
				if (saddr->s_addr != 0)
					strcpy(target, inet_ntoa(*saddr));
				else
					inet_ntop(AF_INET6, s6addr, target, 44);
				printipcerr();
				*lookup = 0;
				return RESOLVED;
			}
			strncpy(target, rpkt.fqdn, 44);
			return (rpkt.ready);
		} else {
			if (saddr->s_addr != 0)
				he = gethostbyaddr((char *) saddr,
						   sizeof(struct in_addr),
						   AF_INET);
			else
				he = gethostbyaddr((char *) s6addr,
						   sizeof(struct in6_addr),
						   AF_INET6);

			if (he == NULL) {
				if (saddr->s_addr != 0)
					strcpy(target, inet_ntoa(*saddr));
				else
					inet_ntop(AF_INET6, s6addr, target, 44);
			} else {
				strncpy(target, he->h_name, 44);
			}

			return RESOLVED;
		}
	} else {
		if (saddr->s_addr != 0 || s6addr == NULL)
			strcpy(target, inet_ntoa(*saddr));
		else
			inet_ntop(AF_INET6, s6addr, target, 44);

		return RESOLVED;
	}
	return NOTRESOLVED;
}