ref: 4983adfa2cd403eda22d862917c2ff5ed35b48b3
dir: /sys/src/ape/lib/bsd/_sock_srv.c/
/* posix */ #include <sys/types.h> #include <unistd.h> #include <stdlib.h> #include <stdio.h> #include <string.h> #include <fcntl.h> #include <errno.h> /* socket extensions */ #include <sys/uio.h> #include <sys/socket.h> #include "priv.h" /* we can't avoid overrunning npath because we don't know how big it is. */ void _sock_srvname(char *npath, char *path) { char *p; strcpy(npath, "/srv/UD."); p = strrchr(path, '/'); if(p == 0) p = path; else p++; strcat(npath, p); } int _sock_srv(char *path, int fd) { int sfd; char msg[8+256+1]; /* change the path to something in srv */ _sock_srvname(msg, path); /* remove any previous instance */ unlink(msg); /* put the fd in /srv and then close it */ sfd = creat(msg, 0666); if(sfd < 0){ close(fd); return -1; } snprintf(msg, sizeof msg, "%d", fd); if(write(sfd, msg, strlen(msg)) < 0){ close(sfd); close(fd); return -1; } close(sfd); close(fd); return 0; }