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