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