mirror of
https://sourceware.org/git/glibc.git
synced 2025-07-25 02:02:09 +03:00
2008-07-01 Samuel Thibault <samuel.thibault@ens-lyon.org>
* sysdeps/unix/bsd/bsd4.4/bits/socket.h: Define MSG_NOSIGNAL. * hurd/hurd/fd.h (__hurd_sockfail): Add extern inline function. * sysdeps/mach/hurd/recv.c (__recv): Use __hurd_sockfail instead of __hurd_dfail. * sysdeps/mach/hurd/recvfrom.c (__recvfrom): Likewise * sysdeps/mach/hurd/recvmsg.c (__recvmsg): Likewise * sysdeps/mach/hurd/send.c (__send): Likewise * sysdeps/mach/hurd/sendfrom.c (__sendfrom): Likewise * sysdeps/mach/hurd/sendmsg.c (__sendmsg): Likewise
This commit is contained in:
@ -27,6 +27,7 @@
|
|||||||
|
|
||||||
#include <hurd/hurd_types.h>
|
#include <hurd/hurd_types.h>
|
||||||
#include <hurd/port.h>
|
#include <hurd/port.h>
|
||||||
|
#include <sys/socket.h>
|
||||||
|
|
||||||
|
|
||||||
/* Structure representing a file descriptor. */
|
/* Structure representing a file descriptor. */
|
||||||
@ -179,6 +180,18 @@ __hurd_dfail (int fd, error_t err)
|
|||||||
errno = _hurd_fd_error (fd, err);
|
errno = _hurd_fd_error (fd, err);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Likewise, but do not raise SIGPIPE on EPIPE if flags contain
|
||||||
|
MSG_NOSIGNAL. */
|
||||||
|
|
||||||
|
_HURD_FD_H_EXTERN_INLINE int
|
||||||
|
__hurd_sockfail (int fd, int flags, error_t err)
|
||||||
|
{
|
||||||
|
if (!(flags & MSG_NOSIGNAL) || err != EPIPE)
|
||||||
|
err = _hurd_fd_error (fd, err);
|
||||||
|
errno = err;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
/* Set up *FD to have PORT its server port, doing appropriate ctty magic.
|
/* Set up *FD to have PORT its server port, doing appropriate ctty magic.
|
||||||
Does no locking or unlocking. */
|
Does no locking or unlocking. */
|
||||||
|
@ -48,7 +48,7 @@ __recv (fd, buf, n, flags)
|
|||||||
&cdata, &clen,
|
&cdata, &clen,
|
||||||
&flags,
|
&flags,
|
||||||
n)))
|
n)))
|
||||||
return __hurd_dfail (fd, err);
|
return __hurd_sockfail (fd, flags, err);
|
||||||
|
|
||||||
__mach_port_deallocate (__mach_task_self (), addrport);
|
__mach_port_deallocate (__mach_task_self (), addrport);
|
||||||
__vm_deallocate (__mach_task_self (), (vm_address_t) cdata, clen);
|
__vm_deallocate (__mach_task_self (), (vm_address_t) cdata, clen);
|
||||||
|
@ -52,7 +52,7 @@ __recvfrom (fd, buf, n, flags, addrarg, addr_len)
|
|||||||
&cdata, &clen,
|
&cdata, &clen,
|
||||||
&flags,
|
&flags,
|
||||||
n)))
|
n)))
|
||||||
return __hurd_dfail (fd, err);
|
return __hurd_sockfail (fd, flags, err);
|
||||||
|
|
||||||
/* Get address data for the returned address port if requested. */
|
/* Get address data for the returned address port if requested. */
|
||||||
if (addr != NULL)
|
if (addr != NULL)
|
||||||
@ -74,7 +74,7 @@ __recvfrom (fd, buf, n, flags, addrarg, addr_len)
|
|||||||
if (err)
|
if (err)
|
||||||
{
|
{
|
||||||
__mach_port_deallocate (__mach_task_self (), addrport);
|
__mach_port_deallocate (__mach_task_self (), addrport);
|
||||||
return __hurd_dfail (fd, err);
|
return __hurd_sockfail (fd, flags, err);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (*addr_len > buflen)
|
if (*addr_len > buflen)
|
||||||
|
@ -63,7 +63,7 @@ __libc_recvmsg (int fd, struct msghdr *message, int flags)
|
|||||||
&ports, &nports,
|
&ports, &nports,
|
||||||
&cdata, &clen,
|
&cdata, &clen,
|
||||||
&message->msg_flags, amount)))
|
&message->msg_flags, amount)))
|
||||||
return __hurd_dfail (fd, err);
|
return __hurd_sockfail (fd, flags, err);
|
||||||
|
|
||||||
if (message->msg_name != NULL)
|
if (message->msg_name != NULL)
|
||||||
{
|
{
|
||||||
@ -84,7 +84,7 @@ __libc_recvmsg (int fd, struct msghdr *message, int flags)
|
|||||||
if (err)
|
if (err)
|
||||||
{
|
{
|
||||||
__mach_port_deallocate (__mach_task_self (), aport);
|
__mach_port_deallocate (__mach_task_self (), aport);
|
||||||
return __hurd_dfail (fd, err);
|
return __hurd_sockfail (fd, flags, err);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (message->msg_namelen > buflen)
|
if (message->msg_namelen > buflen)
|
||||||
|
@ -38,7 +38,7 @@ __send (fd, buf, n, flags)
|
|||||||
NULL, MACH_MSG_TYPE_COPY_SEND, 0,
|
NULL, MACH_MSG_TYPE_COPY_SEND, 0,
|
||||||
NULL, 0, &wrote));
|
NULL, 0, &wrote));
|
||||||
|
|
||||||
return err ? __hurd_dfail (fd, err) : wrote;
|
return err ? __hurd_sockfail (fd, flags, err) : wrote;
|
||||||
}
|
}
|
||||||
libc_hidden_def (__send)
|
libc_hidden_def (__send)
|
||||||
weak_alias (__send, send)
|
weak_alias (__send, send)
|
||||||
|
@ -149,7 +149,7 @@ __libc_sendmsg (int fd, const struct msghdr *message, int flags)
|
|||||||
if (dealloc)
|
if (dealloc)
|
||||||
__vm_deallocate (__mach_task_self (), data.addr, len);
|
__vm_deallocate (__mach_task_self (), data.addr, len);
|
||||||
|
|
||||||
return err ? __hurd_dfail (fd, err) : amount;
|
return err ? __hurd_sockfail (fd, flags, err) : amount;
|
||||||
}
|
}
|
||||||
|
|
||||||
weak_alias (__libc_sendmsg, sendmsg)
|
weak_alias (__libc_sendmsg, sendmsg)
|
||||||
|
@ -171,8 +171,10 @@ enum
|
|||||||
#define MSG_CTRUNC MSG_CTRUNC
|
#define MSG_CTRUNC MSG_CTRUNC
|
||||||
MSG_WAITALL = 0x40, /* Wait for full request or error. */
|
MSG_WAITALL = 0x40, /* Wait for full request or error. */
|
||||||
#define MSG_WAITALL MSG_WAITALL
|
#define MSG_WAITALL MSG_WAITALL
|
||||||
MSG_DONTWAIT = 0x80 /* This message should be nonblocking. */
|
MSG_DONTWAIT = 0x80, /* This message should be nonblocking. */
|
||||||
#define MSG_DONTWAIT MSG_DONTWAIT
|
#define MSG_DONTWAIT MSG_DONTWAIT
|
||||||
|
MSG_NOSIGNAL = 0x0400 /* Do not generate SIGPIPE on EPIPE. */
|
||||||
|
#define MSG_NOSIGNAL MSG_NOSIGNAL
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user