Changeset 753:cb79175b94f9 in roaraudio


Ignore:
Timestamp:
09/05/08 03:55:23 (16 years ago)
Author:
phi
Branch:
default
Phase:
public
Message:

added int roar_socket_recv_fh (int sock, char * mes, size_t * len);

Files:
2 edited

Legend:

Unmodified
Added
Removed
  • include/libroar/socket.h

    r690 r753  
    9393int roar_socket_dup_udp_local_end (int fh); 
    9494 
     95int roar_socket_send_fh (int sock, int fh, char * mes, size_t   len); 
     96int roar_socket_recv_fh (int sock,         char * mes, size_t * len); 
     97 
    9598int roar_socket_open_socks4a(int mode, int fh, char * host, int port); 
    9699 
  • libroar/socket.c

    r752 r753  
    211211} 
    212212 
     213 
     214#define _SCMR_CONTROLLEN (sizeof(struct cmsghdr) + sizeof(int)) 
     215int roar_socket_send_fh (int sock, int fh, char * mes, size_t len) { 
     216 struct iovec     iov[1]; 
     217 struct msghdr    msg; 
     218 char             cmptr_buf[_SCMR_CONTROLLEN]; 
     219 struct cmsghdr * cmptr = (struct cmsghdr *) cmptr_buf; 
     220 
     221 if ( sock < 0 || fh < 0 || len == 0 ) 
     222  return -1; 
     223 
     224 iov[0].iov_base = mes; 
     225 iov[0].iov_len  = len; 
     226 msg.msg_iov     = iov; 
     227 msg.msg_iovlen  = 1; 
     228 msg.msg_name    = NULL; 
     229 msg.msg_namelen = 0; 
     230 
     231 cmptr->cmsg_level        = SOL_SOCKET; 
     232 cmptr->cmsg_type         = SCM_RIGHTS; 
     233 cmptr->cmsg_len          = _SCMR_CONTROLLEN; 
     234 msg.msg_control          = (caddr_t) cmptr; 
     235 msg.msg_controllen       = _SCMR_CONTROLLEN; 
     236 *(int *)CMSG_DATA(cmptr) = fh; 
     237 
     238 return sendmsg(sock, &msg, 0); 
     239} 
     240 
     241int roar_socket_recv_fh (int sock,         char * mes, size_t * len) { 
     242 struct iovec     iov[1]; 
     243 struct msghdr    msg; 
     244 char             cmptr_buf[_SCMR_CONTROLLEN]; 
     245 struct cmsghdr * cmptr = (struct cmsghdr *) cmptr_buf; 
     246 
     247 if ( sock < 0 ) 
     248  return -1; 
     249 
     250 iov[0].iov_base = mes; 
     251 iov[0].iov_len  = *len; 
     252 msg.msg_iov     = iov; 
     253 msg.msg_iovlen  = 1; 
     254 msg.msg_name    = NULL; 
     255 msg.msg_namelen = 0; 
     256 
     257 msg.msg_control    = (caddr_t) cmptr; 
     258 msg.msg_controllen = _SCMR_CONTROLLEN; 
     259 
     260 if ( (*len = recvmsg(sock, &msg, 0)) == -1 ) 
     261  return -1; 
     262 
     263 if ( msg.msg_controllen != _SCMR_CONTROLLEN ) 
     264  return -1; 
     265 
     266 return *(int *)CMSG_DATA(cmptr); 
     267} 
     268 
    213269int roar_socket_listen  (int type, char * host, int port) { 
    214270 return roar_socket_open(MODE_LISTEN, type, host, port); 
Note: See TracChangeset for help on using the changeset viewer.