xref: /plan9/sys/src/ape/lib/bsd/_sock_srv.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 <string.h>
7*219b2ee8SDavid du Colombier #include <fcntl.h>
8*219b2ee8SDavid du Colombier #include <errno.h>
9*219b2ee8SDavid du Colombier 
10*219b2ee8SDavid du Colombier /* socket extensions */
11*219b2ee8SDavid du Colombier #include <sys/uio.h>
12*219b2ee8SDavid du Colombier #include <sys/socket.h>
13*219b2ee8SDavid du Colombier 
14*219b2ee8SDavid du Colombier #include "priv.h"
15*219b2ee8SDavid du Colombier 
16*219b2ee8SDavid du Colombier void
17*219b2ee8SDavid du Colombier _sock_srvname(char *npath, char *path)
18*219b2ee8SDavid du Colombier {
19*219b2ee8SDavid du Colombier 	char *p;
20*219b2ee8SDavid du Colombier 
21*219b2ee8SDavid du Colombier 	strcpy(npath, "/srv/UD.");
22*219b2ee8SDavid du Colombier 	p = strrchr(path, '/');
23*219b2ee8SDavid du Colombier 	if(p == 0)
24*219b2ee8SDavid du Colombier 		p = path;
25*219b2ee8SDavid du Colombier 	else
26*219b2ee8SDavid du Colombier 		p++;
27*219b2ee8SDavid du Colombier 	strcat(npath, p);
28*219b2ee8SDavid du Colombier }
29*219b2ee8SDavid du Colombier 
30*219b2ee8SDavid du Colombier int
31*219b2ee8SDavid du Colombier _sock_srv(char *path, int fd)
32*219b2ee8SDavid du Colombier {
33*219b2ee8SDavid du Colombier 	int sfd;
34*219b2ee8SDavid du Colombier 	char msg[128];
35*219b2ee8SDavid du Colombier 
36*219b2ee8SDavid du Colombier 	/* change the path to something in srv */
37*219b2ee8SDavid du Colombier 	_sock_srvname(msg, path);
38*219b2ee8SDavid du Colombier 
39*219b2ee8SDavid du Colombier 	/* remove any previous instance */
40*219b2ee8SDavid du Colombier 	unlink(msg);
41*219b2ee8SDavid du Colombier 
42*219b2ee8SDavid du Colombier 	/* put the fd in /srv and then close it */
43*219b2ee8SDavid du Colombier 	sfd = creat(msg, 0666);
44*219b2ee8SDavid du Colombier 	if(sfd < 0){
45*219b2ee8SDavid du Colombier 		close(fd);
46*219b2ee8SDavid du Colombier 		_syserrno();
47*219b2ee8SDavid du Colombier 		return -1;
48*219b2ee8SDavid du Colombier 	}
49*219b2ee8SDavid du Colombier 	sprintf(msg, "%d", fd);
50*219b2ee8SDavid du Colombier 	if(write(sfd, msg, strlen(msg)) < 0){
51*219b2ee8SDavid du Colombier 		_syserrno();
52*219b2ee8SDavid du Colombier 		close(sfd);
53*219b2ee8SDavid du Colombier 		close(fd);
54*219b2ee8SDavid du Colombier 		return -1;
55*219b2ee8SDavid du Colombier 	}
56*219b2ee8SDavid du Colombier 	close(sfd);
57*219b2ee8SDavid du Colombier 	close(fd);
58*219b2ee8SDavid du Colombier 	return 0;
59*219b2ee8SDavid du Colombier }
60