Bugzilla – Attachment 1231 Details for
Bug 1263
connection sharing often freezes
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
[x]
|
Forgot Password
Login:
[x]
fd passing test program
testfdpass.c (text/plain), 4.48 KB, created by
Damien Miller
on 2007-01-22 16:52:12 AEDT
(
hide
)
Description:
fd passing test program
Filename:
MIME Type:
Creator:
Damien Miller
Created:
2007-01-22 16:52:12 AEDT
Size:
4.48 KB
patch
obsolete
>/* $OpenBSD: monitor_fdpass.c,v 1.12 2006/08/03 03:34:42 deraadt Exp $ */ >/* > * Copyright 2001 Niels Provos <provos@citi.umich.edu> > * All rights reserved. > * > * Redistribution and use in source and binary forms, with or without > * modification, are permitted provided that the following conditions > * are met: > * 1. Redistributions of source code must retain the above copyright > * notice, this list of conditions and the following disclaimer. > * 2. Redistributions in binary form must reproduce the above copyright > * notice, this list of conditions and the following disclaimer in the > * documentation and/or other materials provided with the distribution. > * > * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR > * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES > * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. > * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, > * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT > * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, > * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY > * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT > * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF > * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. > */ > >#include <sys/types.h> >#include <sys/socket.h> >#include <sys/uio.h> >#include <sys/un.h> > >#include <err.h> >#include <fcntl.h> >#include <errno.h> >#include <signal.h> >#include <string.h> >#include <stdarg.h> >#include <stdio.h> >#include <unistd.h> > >#undef HAVE_ACCRIGHTS_IN_MSGHDR >#undef BROKEN_CMSG_TYPE > >static pid_t other_pid = 0; > >void >mm_send_fd(int sock, int fd) >{ > struct msghdr msg; > struct iovec vec; > char ch = '\0'; > ssize_t n; >#ifndef HAVE_ACCRIGHTS_IN_MSGHDR > char tmp[CMSG_SPACE(sizeof(int))]; > struct cmsghdr *cmsg; >#endif > > memset(&msg, 0, sizeof(msg)); >#ifdef HAVE_ACCRIGHTS_IN_MSGHDR > msg.msg_accrights = (caddr_t)&fd; > msg.msg_accrightslen = sizeof(fd); >#else > msg.msg_control = (caddr_t)tmp; > msg.msg_controllen = CMSG_LEN(sizeof(int)); > cmsg = CMSG_FIRSTHDR(&msg); > cmsg->cmsg_len = CMSG_LEN(sizeof(int)); > cmsg->cmsg_level = SOL_SOCKET; > cmsg->cmsg_type = SCM_RIGHTS; > *(int *)CMSG_DATA(cmsg) = fd; >#endif > > vec.iov_base = &ch; > vec.iov_len = 1; > msg.msg_iov = &vec; > msg.msg_iovlen = 1; > > if ((n = sendmsg(sock, &msg, 0)) == -1) > errx(1, "%s: sendmsg(%d): %s", __func__, fd, > strerror(errno)); > if (n != 1) > errx(1, "%s: sendmsg: expected sent 1 got %ld", > __func__, (long)n); >} > >int >mm_receive_fd(int sock) >{ > struct msghdr msg; > struct iovec vec; > ssize_t n; > char ch; > int fd; >#ifndef HAVE_ACCRIGHTS_IN_MSGHDR > char tmp[CMSG_SPACE(sizeof(int))]; > struct cmsghdr *cmsg; >#endif > > memset(&msg, 0, sizeof(msg)); > vec.iov_base = &ch; > vec.iov_len = 1; > msg.msg_iov = &vec; > msg.msg_iovlen = 1; >#ifdef HAVE_ACCRIGHTS_IN_MSGHDR > msg.msg_accrights = (caddr_t)&fd; > msg.msg_accrightslen = sizeof(fd); >#else > msg.msg_control = tmp; > msg.msg_controllen = sizeof(tmp); >#endif > > if ((n = recvmsg(sock, &msg, 0)) == -1) > errx(1, "%s: recvmsg: %s", __func__, strerror(errno)); > if (n != 1) > errx(1, "%s: recvmsg: expected received 1 got %ld", > __func__, (long)n); > >#ifdef HAVE_ACCRIGHTS_IN_MSGHDR > if (msg.msg_accrightslen != sizeof(fd)) > errx(1, "%s: no fd", __func__); >#else > cmsg = CMSG_FIRSTHDR(&msg); > if (cmsg == NULL) > errx(1, "%s: no message header", __func__); >#ifndef BROKEN_CMSG_TYPE > if (cmsg->cmsg_type != SCM_RIGHTS) > errx(1, "%s: expected type %d got %d", __func__, > SCM_RIGHTS, cmsg->cmsg_type); >#endif > fd = (*(int *)CMSG_DATA(cmsg)); >#endif > return fd; >} > >void sigzap(int signo) >{ > if (other_pid > 1) > kill(other_pid, signo); > _exit(1); >} > >int >main(int argc, char **argv) >{ > int s[2], devnull, fd, n; > pid_t p; > > if ((devnull = open("/dev/null", O_RDWR)) == -1) > err(1, "open"); > if (socketpair(AF_UNIX, SOCK_STREAM, 0, s) == -1) > err(1, "socketpair"); > switch (p = fork()) { > case -1: > err(1, "fork"); > case 0: > /* Child */ > other_pid = getppid(); > signal(SIGINT, sigzap); > signal(SIGTERM, sigzap); > for (n = 0; ; n++) { > fd = mm_receive_fd(s[0]); > fprintf(stderr, "child recv %d fd %d\n", n, fd); > close(fd); > } > /* NOTREACHED */ > return (0); > default: > /* Parent */ > other_pid = p; > signal(SIGINT, sigzap); > signal(SIGTERM, sigzap); > signal(SIGCHLD, _exit); > for (n = 0; ; n++) { > mm_send_fd(s[1], devnull); > fprintf(stderr, "parent send %d\n", n); > } > } > /* NOTREACHED */ > return (0); >} >
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Raw
Actions:
View
Attachments on
bug 1263
:
1209
|
1210
|
1230
| 1231 |
1371