Jérémie Courrèges-Anglas
2016-02-01 18:56:01 UTC
Hi,
while glancing at the multicast code I noticed the use of ETOOMANYREFS:
if (imo->imo_num_memberships == imo->imo_max_memberships) {
struct in_multi **nmships, **omships;
size_t newmax;
/*
* Resize the vector to next power-of-two minus 1. If the
* size would exceed the maximum then we know we've really
* run out of entries. Otherwise, we reallocate the vector.
*/
nmships = NULL;
omships = imo->imo_membership;
newmax = ((imo->imo_max_memberships + 1) * 2) - 1;
if (newmax <= IP_MAX_MEMBERSHIPS) {
nmships = (struct in_multi **)malloc(
sizeof(*nmships) * newmax, M_IPMOPTS,
M_NOWAIT|M_ZERO);
if (nmships != NULL) {
memcpy(nmships, omships,
sizeof(*omships) *
imo->imo_max_memberships);
free(omships, M_IPMOPTS,
sizeof(*omships) *
imo->imo_max_memberships);
imo->imo_membership = nmships;
imo->imo_max_memberships = newmax;
}
}
if (nmships == NULL) {
error = ETOOMANYREFS;
if_put(ifp);
break;
}
}
intro(2) describes it as such:
59 ETOOMANYREFS Too many references: can't splice. Not used in OpenBSD.
Obviously it *is* used, since rev. 1.1. FreeBSD and NetBSD also make
use of it, but FreeBSD doesn't document it.
I don't know whether the kernel code should keep on using it, here's
a patch to fix the documentation:
Thoughts?
Index: lib/libc/sys/intro.2
===================================================================
RCS file: /cvs/src/lib/libc/sys/intro.2,v
retrieving revision 1.62
diff -u -p -r1.62 intro.2
--- lib/libc/sys/intro.2 1 Dec 2015 01:34:16 -0000 1.62
+++ lib/libc/sys/intro.2 31 Jan 2016 00:11:06 -0000
@@ -311,8 +311,6 @@ had already been shut down with a previo
.Xr shutdown 2
call.
.It Er 59 ETOOMANYREFS Em "Too many references: can't splice" .
-Not used in
-.Ox .
.It Er 60 ETIMEDOUT Em "Operation timed out" .
A
.Xr connect 2
while glancing at the multicast code I noticed the use of ETOOMANYREFS:
if (imo->imo_num_memberships == imo->imo_max_memberships) {
struct in_multi **nmships, **omships;
size_t newmax;
/*
* Resize the vector to next power-of-two minus 1. If the
* size would exceed the maximum then we know we've really
* run out of entries. Otherwise, we reallocate the vector.
*/
nmships = NULL;
omships = imo->imo_membership;
newmax = ((imo->imo_max_memberships + 1) * 2) - 1;
if (newmax <= IP_MAX_MEMBERSHIPS) {
nmships = (struct in_multi **)malloc(
sizeof(*nmships) * newmax, M_IPMOPTS,
M_NOWAIT|M_ZERO);
if (nmships != NULL) {
memcpy(nmships, omships,
sizeof(*omships) *
imo->imo_max_memberships);
free(omships, M_IPMOPTS,
sizeof(*omships) *
imo->imo_max_memberships);
imo->imo_membership = nmships;
imo->imo_max_memberships = newmax;
}
}
if (nmships == NULL) {
error = ETOOMANYREFS;
if_put(ifp);
break;
}
}
intro(2) describes it as such:
59 ETOOMANYREFS Too many references: can't splice. Not used in OpenBSD.
Obviously it *is* used, since rev. 1.1. FreeBSD and NetBSD also make
use of it, but FreeBSD doesn't document it.
I don't know whether the kernel code should keep on using it, here's
a patch to fix the documentation:
Thoughts?
Index: lib/libc/sys/intro.2
===================================================================
RCS file: /cvs/src/lib/libc/sys/intro.2,v
retrieving revision 1.62
diff -u -p -r1.62 intro.2
--- lib/libc/sys/intro.2 1 Dec 2015 01:34:16 -0000 1.62
+++ lib/libc/sys/intro.2 31 Jan 2016 00:11:06 -0000
@@ -311,8 +311,6 @@ had already been shut down with a previo
.Xr shutdown 2
call.
.It Er 59 ETOOMANYREFS Em "Too many references: can't splice" .
-Not used in
-.Ox .
.It Er 60 ETIMEDOUT Em "Operation timed out" .
A
.Xr connect 2
--
jca | PGP : 0x1524E7EE / 5135 92C1 AD36 5293 2BDF DDCC 0DFA 74AE 1524 E7EE
jca | PGP : 0x1524E7EE / 5135 92C1 AD36 5293 2BDF DDCC 0DFA 74AE 1524 E7EE