1 /* This testcase is part of GDB, the GNU debugger. 2 3 Copyright 2008-2016 Free Software Foundation, Inc. 4 5 This program is free software; you can redistribute it and/or modify 6 it under the terms of the GNU General Public License as published by 7 the Free Software Foundation; either version 3 of the License, or 8 (at your option) any later version. 9 10 This program is distributed in the hope that it will be useful, 11 but WITHOUT ANY WARRANTY; without even the implied warranty of 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 GNU General Public License for more details. 14 15 You should have received a copy of the GNU General Public License 16 along with this program. If not, see <http://www.gnu.org/licenses/>. */ 17 18 #define _GNU_SOURCE 19 #include <sys/socket.h> 20 #include <sys/types.h> 21 #include <sys/un.h> 22 #include <unistd.h> 23 24 void 25 marker1 (void) 26 { 27 } 28 29 void 30 marker2 (void) 31 { 32 } 33 34 char wdata[] = "abcdef"; 35 36 struct iovec wv[1] = { 37 { wdata, 6 }, 38 }; 39 40 char wc[CMSG_SPACE (sizeof (struct ucred)) + CMSG_SPACE (sizeof (int))]; 41 42 struct msghdr wmsg = { 43 0, 0, 44 wv, 1, 45 wc, sizeof wc, 46 0, 47 }; 48 49 char rdata[5] = "xxxx"; 50 51 struct iovec rv[2] = { 52 {&rdata[2], 2}, 53 {&rdata[0], 2}, 54 }; 55 56 char rc[CMSG_SPACE (sizeof (struct ucred)) + 7]; 57 58 struct msghdr rmsg = { 59 0, 0, 60 rv, 2, 61 rc, sizeof rc, 62 0, 63 }; 64 65 int fds[2]; 66 67 int 68 main (void) 69 { 70 int itrue = 1; 71 /* prepare cmsg to send */ 72 struct cmsghdr *cm1 = CMSG_FIRSTHDR (&wmsg); 73 cm1->cmsg_len = CMSG_LEN (sizeof (struct ucred)); 74 cm1->cmsg_level = AF_UNIX; 75 cm1->cmsg_type = SCM_CREDENTIALS; 76 struct ucred *uc = (void *) CMSG_DATA (cm1); 77 uc->pid = getpid (); 78 uc->uid = getuid (); 79 uc->gid = getgid (); 80 struct cmsghdr *cm2 = CMSG_NXTHDR (&wmsg, cm1); 81 cm2->cmsg_len = CMSG_LEN (sizeof (int)); 82 cm2->cmsg_level = AF_UNIX; 83 cm2->cmsg_type = SCM_RIGHTS; 84 int *pfd = (void *) CMSG_DATA (cm2); 85 *pfd = 2; 86 /* do the syscalls */ 87 marker1 (); 88 socketpair (AF_UNIX, SOCK_DGRAM, 0, fds); 89 setsockopt (fds[0], SOL_SOCKET, SO_PASSCRED, &itrue, sizeof itrue); 90 sendmsg (fds[1], &wmsg, 0); 91 recvmsg (fds[0], &rmsg, 0); 92 marker2 (); 93 return 0; 94 } 95