xref: /plan9/sys/src/ape/lib/bsd/_sock_ingetaddr.c (revision 219b2ee8daee37f4aad58d63f21287faa8e4ffdc)
1*219b2ee8SDavid du Colombier /* posix */
2*219b2ee8SDavid du Colombier #include <sys/types.h>
3*219b2ee8SDavid du Colombier #include <unistd.h>
4*219b2ee8SDavid du Colombier #include <stdlib.h>
5*219b2ee8SDavid du Colombier #include <stdio.h>
6*219b2ee8SDavid du Colombier #include <fcntl.h>
7*219b2ee8SDavid du Colombier #include <errno.h>
8*219b2ee8SDavid du Colombier #include <string.h>
9*219b2ee8SDavid du Colombier 
10*219b2ee8SDavid du Colombier /* bsd extensions */
11*219b2ee8SDavid du Colombier #include <sys/uio.h>
12*219b2ee8SDavid du Colombier #include <sys/socket.h>
13*219b2ee8SDavid du Colombier #include <netinet/in.h>
14*219b2ee8SDavid du Colombier #include <sys/un.h>
15*219b2ee8SDavid du Colombier 
16*219b2ee8SDavid du Colombier #include "priv.h"
17*219b2ee8SDavid du Colombier 
18*219b2ee8SDavid du Colombier void
19*219b2ee8SDavid du Colombier _sock_ingetaddr(Rock *r, struct sockaddr_in *ip, int *alen, char *a)
20*219b2ee8SDavid du Colombier {
21*219b2ee8SDavid du Colombier 	int n, fd;
22*219b2ee8SDavid du Colombier 	char *p;
23*219b2ee8SDavid du Colombier 	char name[Ctlsize];
24*219b2ee8SDavid du Colombier 
25*219b2ee8SDavid du Colombier 	/* get remote address */
26*219b2ee8SDavid du Colombier 	strcpy(name, r->ctl);
27*219b2ee8SDavid du Colombier 	p = strrchr(name, '/');
28*219b2ee8SDavid du Colombier 	strcpy(p+1, a);
29*219b2ee8SDavid du Colombier 	fd = open(name, O_RDONLY);
30*219b2ee8SDavid du Colombier 	if(fd >= 0){
31*219b2ee8SDavid du Colombier 		n = read(fd, name, sizeof(name)-1);
32*219b2ee8SDavid du Colombier 		if(n > 0){
33*219b2ee8SDavid du Colombier 			name[n] = 0;
34*219b2ee8SDavid du Colombier 			p = strchr(name, '!');
35*219b2ee8SDavid du Colombier 			if(p){
36*219b2ee8SDavid du Colombier 				*p++ = 0;
37*219b2ee8SDavid du Colombier 				ip->sin_family = AF_INET;
38*219b2ee8SDavid du Colombier 				ip->sin_port = atoi(p);
39*219b2ee8SDavid du Colombier 				ip->sin_addr.s_addr = inet_addr(name);
40*219b2ee8SDavid du Colombier 				if(alen)
41*219b2ee8SDavid du Colombier 					*alen = sizeof(struct sockaddr_in);
42*219b2ee8SDavid du Colombier 			}
43*219b2ee8SDavid du Colombier 		}
44*219b2ee8SDavid du Colombier 		close(fd);
45*219b2ee8SDavid du Colombier 	}
46*219b2ee8SDavid du Colombier 
47*219b2ee8SDavid du Colombier }
48