#include <sys/types.h> #include <sys/socket.h> #include <sys/un.h> #include <sys/uio.h> #include <stdio.h> main () { int sock, msgsock, rval, rv ; struct sockaddr_un rqsts; char buf[1024] ; sock = socket (AF_UNIX, SOCK_STREAM, 0) ; if (sock < 0) { perror("stream socket") ; exit(1) ; } rqsts.sun_family = AF_UNIX ; strcpy (rqsts.sun_path,"/dev/connect") ; if (bind (sock, &rqsts, sizeof (rqsts))) { perror ("bind /dev/connect") ; exit (1) ; } listen (sock, 5) ; for (;;) { msgsock = accept(sock, 0, 0) ; if (msgsock == -1) { perror ("accept") ; continue ; } loop: rv = read (msgsock, buf, 1024) ; if (rv < 0) perror("read") ; else if (rv > 0) { struct msghdr msg ; int fd ; struct iovec iov[1]; char filename[32] ; write (1, "{", 1) ; write (1, buf, rv) ; write (1, "}\n", 2) ; /*strcat(buf, "-connectd responds") ; write(msgsock, buf, strlen(buf)) ; if (strncmp(buf,"byebye", 6) == 0) break; */ strcpy(filename,"a filename") ; msg.msg_name = ""; /* optional address */ msg.msg_namelen = 0 ; /* size of address */ /* iov->iov_base = filename; iov->iov_len = sizeof (filename); */ iov->iov_base = 0; iov->iov_len = 0 ; msg.msg_iov = iov; msg.msg_iovlen = 1; msg.msg_accrights = (caddr_t) &fd ; /* access rights sent/received */ msg.msg_accrightslen = 4; fd = open (buf, 2) ; printf("fd %d \n", fd) ; printf("$rv %d\n", sendmsg (msgsock, &msg, 0) ); goto exitx ; } if (rv) goto loop ; close (msgsock) ; } exitx: close (sock) ; unlink ("/dev/connect") ; }