PCI: adds device-specific data pointer
[akaros.git] / user / bsd / _sock_srv.c
1 /* 
2  * This file is part of the UCB release of Plan 9. It is subject to the license
3  * terms in the LICENSE file found in the top-level directory of this
4  * distribution and at http://akaros.cs.berkeley.edu/files/Plan9License. No
5  * part of the UCB release of Plan 9, including this file, may be copied,
6  * modified, propagated, or distributed except according to the terms contained
7  * in the LICENSE file.
8  */
9 /* posix */
10 #include <sys/types.h>
11 #include <unistd.h>
12 #include <stdlib.h>
13 #include <stdio.h>
14 #include <string.h>
15 #include <fcntl.h>
16 #include <errno.h>
17
18 /* socket extensions */
19 #include <sys/uio.h>
20 #include <sys/socket.h>
21 #include <arpa/inet.h>
22
23 #include "priv.h"
24
25 /* we can't avoid overrunning npath because we don't know how big it is. */
26 void
27 _sock_srvname(char *npath, char *path)
28 {
29         char *p;
30
31         strcpy(npath, "/srv/UD.");
32         p = strrchr(path, '/');
33         if(p == 0)
34                 p = path;
35         else
36                 p++;
37         strcat(npath, p);
38 }
39
40 int
41 _sock_srv(char *path, int fd)
42 {
43         int sfd;
44         char msg[8+256+1];
45
46         /* change the path to something in srv */
47         _sock_srvname(msg, path);
48
49         /* remove any previous instance */
50         unlink(msg);
51
52         /* put the fd in /srv and then close it */
53         sfd = creat(msg, 0666);
54         if(sfd < 0){
55                 close(fd);
56                 return -1;
57         }
58         snprintf(msg, sizeof msg, "%d", fd);
59         if(write(sfd, msg, strlen(msg)) < 0){
60                 close(sfd);
61                 close(fd);
62                 return -1;
63         }
64         close(sfd);
65         close(fd);
66         return 0;
67 }