140 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
			
		
		
	
	
			140 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
  This library provide an easy interface to the black magic that can be done
 | 
						|
  on Unix domain sockets, like passing file descriptors from one process to
 | 
						|
  another.
 | 
						|
 | 
						|
  Programs that uses this library should include the ancillary.h header file.
 | 
						|
  Nothing else is required.
 | 
						|
 | 
						|
  All functions of this library require the following header:
 | 
						|
 | 
						|
	#include <ancillary.h>
 | 
						|
 | 
						|
  At this time, the only ancillary data defined by the Single Unix
 | 
						|
  Specification (v3) is file descriptors.
 | 
						|
 | 
						|
Passing file descriptors
 | 
						|
 | 
						|
	int ancil_send_fd(socket, file_descriptor)
 | 
						|
	  int socket: the Unix socket
 | 
						|
	  int file_descriptor: the file descriptor
 | 
						|
	  Return value: 0 for success, -1 for failure.
 | 
						|
 | 
						|
  Sends one file descriptor on a socket.
 | 
						|
  In case of failure, errno is set; the possible values are the ones of the
 | 
						|
  sendmsg(2) system call.
 | 
						|
 | 
						|
 | 
						|
	int ancil_recv_fd(socket, file_descriptor)
 | 
						|
	  int socket: the Unix socket
 | 
						|
	  int *file_descriptor: pointer to the returned file descriptor
 | 
						|
	  Return value: 0 for success, -1 for failure
 | 
						|
 | 
						|
  Receives one file descriptor from a socket.
 | 
						|
  In case of success, the file descriptor is stored in the integer pointed
 | 
						|
  to by file_descriptor.
 | 
						|
  In case of failure, errno is set; the possible values are the ones of the
 | 
						|
  recvmsg(2) system call.
 | 
						|
  The behavior is undefined if the recv_fd does not match a send_fd* on the
 | 
						|
  other side.
 | 
						|
 | 
						|
 | 
						|
	int ancil_send_fds(socket, file_descriptors, num_file_descriptors)
 | 
						|
	  int socket: the Unix socket
 | 
						|
	  const int *file_descriptors: array of file descriptors
 | 
						|
	  unsigned num_file_descriptors: number of file descriptors
 | 
						|
	  Return value: 0 for success, -1 for failure
 | 
						|
 | 
						|
  Sends several file descriptors on a socket.
 | 
						|
  In case of failure, errno is set; the possible values are the ones of the
 | 
						|
  sendmsg(2) system call.
 | 
						|
  The maximum number of file descriptors that can be sent using this
 | 
						|
  function is ANCIL_MAX_N_FDS; the behavior is undefined in case of
 | 
						|
  overflow, probably a stack corruption.
 | 
						|
 | 
						|
 | 
						|
	int ancil_recv_fds(socket, file_descriptors, num_file_descriptors)
 | 
						|
	  int socket: the Unix socket
 | 
						|
	  int *file_descriptors: return array of file descriptors
 | 
						|
	  unsigned num_file_descriptors: number of file descriptors
 | 
						|
	  Return value: number of received fd for success, -1 for failure
 | 
						|
 | 
						|
  Receives several file descriptors from a socket, no more than
 | 
						|
  num_file_descriptors.
 | 
						|
  In case of success, the received file descriptors are stored in the array
 | 
						|
  pointed to by file_descriptors.
 | 
						|
  In case of failure, errno is set; the possible values are the ones of the
 | 
						|
  recvmsg(2) system call.
 | 
						|
  The maximum number of file descriptors that can be received using this
 | 
						|
  function is ANCIL_MAX_N_FDS; the behavior is undefined in case of
 | 
						|
  overflow, probably a stack corruption.
 | 
						|
  The behavior is undefined if the recv_fds does not match a send_fd* on
 | 
						|
  the other side, or if the number of received file descriptors is more than
 | 
						|
  num_file_descriptors.
 | 
						|
 | 
						|
 | 
						|
	int ancil_send_fds_with_buffer(socket, fds, num, buffer)
 | 
						|
	  int socket: the Unix socket
 | 
						|
	  const int *fds: array of file descriptors
 | 
						|
	  unsigned num: number of file descriptors
 | 
						|
	  void *buffer: buffer to hold the system data structures
 | 
						|
	  Return value: 0 for success, -1 for failure
 | 
						|
 | 
						|
  Sends several file descriptors on a socket.
 | 
						|
  In case of failure, errno is set; the possible values are the ones of the
 | 
						|
  sendmsg(2) system call.
 | 
						|
  The buffer argument must point to a memory area large enough to hold the
 | 
						|
  system data structures, see ANCIL_FD_BUFFER.
 | 
						|
 | 
						|
 | 
						|
	int ancil_send_fds_with_buffer(socket, fds, num, buffer)
 | 
						|
	  int socket: the Unix socket
 | 
						|
	  int *fds: return array of file descriptors
 | 
						|
	  unsigned num: number of file descriptors
 | 
						|
	  void *buffer: buffer to hold the system data structures
 | 
						|
	  Return value: number of received fd for success, -1 for failure
 | 
						|
 | 
						|
  Receives several file descriptors from a socket, no more than
 | 
						|
  num_file_descriptors.
 | 
						|
  In case of success, the received file descriptors are stored in the array
 | 
						|
  pointed to by file_descriptors.
 | 
						|
  In case of failure, errno is set; the possible values are the ones of the
 | 
						|
  recvmsg(2) system call.
 | 
						|
  The behavior is undefined if the recv_fds does not match a send_fd* on
 | 
						|
  the other side, or if the number of received file descriptors is more than
 | 
						|
  num_file_descriptors.
 | 
						|
  The buffer argument must point to a memory area large enough to hold the
 | 
						|
  system data structures, see ANCIL_FD_BUFFER.
 | 
						|
 | 
						|
 | 
						|
	ANCIL_MAX_N_FDS
 | 
						|
 | 
						|
  Maximum number of file descriptors that can be sent with the sent_fds and
 | 
						|
  recv_fds functions. If you have to send more at once, use the
 | 
						|
  *_with_buffer versions. The value is enough to send "quite a few" file
 | 
						|
  descriptors.
 | 
						|
 | 
						|
 | 
						|
	ANCIL_FD_BUFFER(n)
 | 
						|
	  int n: number of file descriptors
 | 
						|
 | 
						|
  Expands to a structure data type large enough to hold the system data
 | 
						|
  structures for n file descriptors. So the address of a variable declared
 | 
						|
  of type ANCIL_FD_BUFFER(n) is suitable as the buffer argument for
 | 
						|
  *_with_buffer on n file descriptors.
 | 
						|
  To use this macro, you need <sys/types.h> and <sys/socket.h>. Bevare: with
 | 
						|
  Solaris, the _XPG4_2 macro must be defined before sys/socket is included.
 | 
						|
 | 
						|
 | 
						|
Tuning the compilation
 | 
						|
 | 
						|
  This library is designed to be included in projects, not installed in
 | 
						|
  /usr/lib. If your project does not use some of the functions, the
 | 
						|
  TUNE_OPTS variable in the Makefile allows not to build them. It is a list
 | 
						|
  of proprocessor options:
 | 
						|
 | 
						|
  -DNDEBUG: turn assertions off (see assert(3))
 | 
						|
  -DSPARE_SEND_FDS: do not build ancil_send_fds
 | 
						|
  -DSPARE_SEND_FD:  do not build ancil_send_fd
 | 
						|
  -DSPARE_RECV_FDS: do not build ancil_recv_fds
 | 
						|
  -DSPARE_RECV_FD:  do not build ancil_recv_fd
 |