7 changed files with 114 additions and 15 deletions
-
5include/tr/socket.h
-
2src/Makefile.am
-
4src/socket_accept.c
-
55src/socket_get_fd.c
-
6src/socket_pair.c
-
52src/socket_send_fd.c
-
5src/tcp_socket.c
@ -0,0 +1,55 @@ |
|||||
|
/** |
||||
|
* \file |
||||
|
* |
||||
|
* \author Georg Hopp |
||||
|
* |
||||
|
* \copyright |
||||
|
* Copyright © 2014 Georg Hopp |
||||
|
* |
||||
|
* This program is free software: you can redistribute it and/or modify |
||||
|
* it under the terms of the GNU General Public License as published by |
||||
|
* the Free Software Foundation, either version 3 of the License, or |
||||
|
* (at your option) any later version. |
||||
|
* |
||||
|
* This program is distributed in the hope that it will be useful, |
||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
|
* GNU General Public License for more details. |
||||
|
* |
||||
|
* You should have received a copy of the GNU General Public License |
||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>. |
||||
|
*/ |
||||
|
|
||||
|
#include <errno.h> // for errno |
||||
|
#include <unistd.h> |
||||
|
#include <fcntl.h> |
||||
|
|
||||
|
#include "tr/socket.h" |
||||
|
#include "tr/logger.h" |
||||
|
|
||||
|
int |
||||
|
TR_socketGetFd(TR_Socket this) |
||||
|
{ |
||||
|
struct msghdr msg; |
||||
|
struct cmsghdr * cmsg; |
||||
|
char cmsgbuf[CMSG_SPACE(sizeof(int))]; |
||||
|
int fd = 0; |
||||
|
|
||||
|
memset(&msg, 0, sizeof(msg)); |
||||
|
msg.msg_control = cmsgbuf; |
||||
|
msg.msg_controllen = sizeof(cmsgbuf); |
||||
|
|
||||
|
if (0 > recvmsg(TR_socketHandle(this), &msg, 0)) { |
||||
|
return -1; |
||||
|
} |
||||
|
|
||||
|
cmsg = CMSG_FIRSTHDR(&msg); |
||||
|
if (cmsg == NULL || cmsg->cmsg_type != SCM_RIGHTS) { |
||||
|
return -1; |
||||
|
} |
||||
|
|
||||
|
memcpy(&fd, CMSG_DATA(cmsg), sizeof(int)); |
||||
|
return fd; |
||||
|
} |
||||
|
|
||||
|
// vim: set ts=4 sw=4: |
||||
@ -0,0 +1,52 @@ |
|||||
|
/** |
||||
|
* \file |
||||
|
* |
||||
|
* \author Georg Hopp |
||||
|
* |
||||
|
* \copyright |
||||
|
* Copyright © 2014 Georg Hopp |
||||
|
* |
||||
|
* This program is free software: you can redistribute it and/or modify |
||||
|
* it under the terms of the GNU General Public License as published by |
||||
|
* the Free Software Foundation, either version 3 of the License, or |
||||
|
* (at your option) any later version. |
||||
|
* |
||||
|
* This program is distributed in the hope that it will be useful, |
||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
|
* GNU General Public License for more details. |
||||
|
* |
||||
|
* You should have received a copy of the GNU General Public License |
||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>. |
||||
|
*/ |
||||
|
|
||||
|
#include <errno.h> // for errno |
||||
|
#include <unistd.h> |
||||
|
#include <fcntl.h> |
||||
|
|
||||
|
#include "tr/socket.h" |
||||
|
#include "tr/logger.h" |
||||
|
|
||||
|
void |
||||
|
TR_socketSendFd(TR_Socket this, int fd) |
||||
|
{ |
||||
|
struct msghdr msg; |
||||
|
struct cmsghdr * cmsg; |
||||
|
char cmsgbuf[CMSG_SPACE(sizeof(int))]; |
||||
|
|
||||
|
memset(&msg, 0, sizeof(msg)); |
||||
|
msg.msg_control = cmsgbuf; |
||||
|
msg.msg_controllen = sizeof(cmsgbuf); // necessary for CMSG_FIRSTHDR to |
||||
|
// return the correct value |
||||
|
cmsg = CMSG_FIRSTHDR(&msg); |
||||
|
cmsg->cmsg_level = SOL_SOCKET; |
||||
|
cmsg->cmsg_type = SCM_RIGHTS; |
||||
|
cmsg->cmsg_len = CMSG_LEN(sizeof(int)); |
||||
|
memcpy(CMSG_DATA(cmsg), &fd, sizeof(int)); |
||||
|
msg.msg_controllen = cmsg->cmsg_len; // total size of all control blocks |
||||
|
|
||||
|
sendmsg(TR_socketHandle(this), &msg, 0); |
||||
|
/* TODO error handling... */ |
||||
|
} |
||||
|
|
||||
|
// vim: set ts=4 sw=4: |
||||
Write
Preview
Loading…
Cancel
Save
Reference in new issue