hare

[hare] The Hare programming language
git clone https://git.torresjrjr.com/hare.git
Log | Files | Refs | README | LICENSE

cmsg.ha (1049B)


      1 // SPDX-License-Identifier: MPL-2.0
      2 // (c) Hare authors <https://harelang.org>
      3 
      4 use io;
      5 use net;
      6 use rt;
      7 
      8 // Adds a list of file descriptors to the ancillary data for a sendmsg
      9 // operation.
     10 export fn addfiles(buf: *net::msghdr, files: io::file...) void = {
     11 	const msgsz = size(io::file) * len(files);
     12 	let buf = net::addcontrol(buf, msgsz, rt::SOL_SOCKET, rt::SCM_RIGHTS);
     13 	let buf = buf: *[*]io::file;
     14 	buf[..len(files)] = files[..];
     15 };
     16 
     17 // Prepares an ancillary data buffer to receive files during a recvmsg
     18 // operation.
     19 export fn allocfiles(buf: *net::msghdr, nfile: size) void = {
     20 	const msgsz = size(io::file) * nfile;
     21 	net::addcontrol(buf, msgsz, rt::SOL_SOCKET, rt::SCM_RIGHTS);
     22 };
     23 
     24 // Receives files from an ancillary data buffer which was previously prepared
     25 // with [[allocfiles]].
     26 export fn recvfiles(buf: *net::msghdr, nfile: size) []io::file = {
     27 	match (net::getcontrol(buf,
     28 		nfile * size(io::file),
     29 		rt::SOL_SOCKET, rt::SCM_RIGHTS)) {
     30 	case let buf: []u8 =>
     31 		return (buf: *[*]io::file)[..nfile];
     32 	case void =>
     33 		return [];
     34 	};
     35 };