Subversion Repositories planix.SVN

Rev

Rev 2 | Blame | Compare with Previous | Last modification | View Log | RSS feed

/* 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);
                _syserrno();
                return -1;
        }
        snprintf(msg, sizeof msg, "%d", fd);
        if(write(sfd, msg, strlen(msg)) < 0){
                _syserrno();
                close(sfd);
                close(fd);
                return -1;
        }
        close(sfd);
        close(fd);
        return 0;
}