xref: /plan9/sys/src/ape/lib/bsd/_sock_srv.c (revision 7e125112574862ca44c733e2ecf7b75e72c6ed0e)
1219b2ee8SDavid du Colombier /* posix */
2219b2ee8SDavid du Colombier #include <sys/types.h>
3219b2ee8SDavid du Colombier #include <unistd.h>
4219b2ee8SDavid du Colombier #include <stdlib.h>
5219b2ee8SDavid du Colombier #include <stdio.h>
6219b2ee8SDavid du Colombier #include <string.h>
7219b2ee8SDavid du Colombier #include <fcntl.h>
8219b2ee8SDavid du Colombier #include <errno.h>
9219b2ee8SDavid du Colombier 
10219b2ee8SDavid du Colombier /* socket extensions */
11219b2ee8SDavid du Colombier #include <sys/uio.h>
12219b2ee8SDavid du Colombier #include <sys/socket.h>
13219b2ee8SDavid du Colombier 
14219b2ee8SDavid du Colombier #include "priv.h"
15219b2ee8SDavid du Colombier 
16*7e125112SDavid du Colombier /* we can't avoid overrunning npath because we don't know how big it is. */
17219b2ee8SDavid du Colombier void
_sock_srvname(char * npath,char * path)18219b2ee8SDavid du Colombier _sock_srvname(char *npath, char *path)
19219b2ee8SDavid du Colombier {
20219b2ee8SDavid du Colombier 	char *p;
21219b2ee8SDavid du Colombier 
22219b2ee8SDavid du Colombier 	strcpy(npath, "/srv/UD.");
23219b2ee8SDavid du Colombier 	p = strrchr(path, '/');
24219b2ee8SDavid du Colombier 	if(p == 0)
25219b2ee8SDavid du Colombier 		p = path;
26219b2ee8SDavid du Colombier 	else
27219b2ee8SDavid du Colombier 		p++;
28219b2ee8SDavid du Colombier 	strcat(npath, p);
29219b2ee8SDavid du Colombier }
30219b2ee8SDavid du Colombier 
31219b2ee8SDavid du Colombier int
_sock_srv(char * path,int fd)32219b2ee8SDavid du Colombier _sock_srv(char *path, int fd)
33219b2ee8SDavid du Colombier {
34219b2ee8SDavid du Colombier 	int sfd;
35*7e125112SDavid du Colombier 	char msg[8+256+1];
36219b2ee8SDavid du Colombier 
37219b2ee8SDavid du Colombier 	/* change the path to something in srv */
38219b2ee8SDavid du Colombier 	_sock_srvname(msg, path);
39219b2ee8SDavid du Colombier 
40219b2ee8SDavid du Colombier 	/* remove any previous instance */
41219b2ee8SDavid du Colombier 	unlink(msg);
42219b2ee8SDavid du Colombier 
43219b2ee8SDavid du Colombier 	/* put the fd in /srv and then close it */
44219b2ee8SDavid du Colombier 	sfd = creat(msg, 0666);
45219b2ee8SDavid du Colombier 	if(sfd < 0){
46219b2ee8SDavid du Colombier 		close(fd);
47219b2ee8SDavid du Colombier 		_syserrno();
48219b2ee8SDavid du Colombier 		return -1;
49219b2ee8SDavid du Colombier 	}
50*7e125112SDavid du Colombier 	snprintf(msg, sizeof msg, "%d", fd);
51219b2ee8SDavid du Colombier 	if(write(sfd, msg, strlen(msg)) < 0){
52219b2ee8SDavid du Colombier 		_syserrno();
53219b2ee8SDavid du Colombier 		close(sfd);
54219b2ee8SDavid du Colombier 		close(fd);
55219b2ee8SDavid du Colombier 		return -1;
56219b2ee8SDavid du Colombier 	}
57219b2ee8SDavid du Colombier 	close(sfd);
58219b2ee8SDavid du Colombier 	close(fd);
59219b2ee8SDavid du Colombier 	return 0;
60219b2ee8SDavid du Colombier }
61