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