Rainer Jung wrote:

Mladen Turk wrote:

Anyhow, I suppose it should be neither int nor unsigned int,
but rather size_t, at least that's the retval from sizeof, right?
Of course its used by getsockopt that OTOH requires socklen_t.


Since it's only use is putting it into getsockopt(), I would suggest the use of socklen_t and explicitely cast the return from sizeof().

I would suggest to have a JK_SOCKLEN_T as we have the JK_INT*, just in case a platform does not have socklen_t. (See configure.in)


Cheers

Jean-Frederic


I just wonder who is the genius that invented something that
stupid as socklen_t :)
I suppose it should be some sort of a size, correct?


Found some interesting pieces:

1) http://www.opengroup.org/onlinepubs/007908799/xns/syssocket.h.html

Says:

<sys/socket.h> makes available a type, socklen_t, which is an unsigned opaque integral type of length of at least 32 bits. To forestall portability problems, it is recommended that applications should not use values larger than 2^32 - 1.

2) http://www.opengroup.org/austin/docs/austin_76r1.txt

has interesting comments (...The type socklen_t is an unfortunate historical accident...):

 The type socklen_t was invented to cover the range of implementations
 seen in the field.  The intent of socklen_t is to be the type for all
 lengths that are naturally bounded in size, that is, that they are the
 length of a buffer which cannot sensibly become of massive size: network
 addresses, hostnames, string representations of these, ancillary data,
 control messages, and socket options are examples.  Truly boundless
 sizes are represented by size_t as in read(), write(), etc.

 All socklen_t types were originally (in BSD UNIX) of type int.
 During the development of the document it was decided to change
 all buffer lengths to size_t, which appears at face value to make sense.
 When dual mode 32/64 bit systems came along, this choice unnecessarily
 complicated system interfaces because size_t (with long) was a different
 size under ILP32 and LP64 models.  Reverting to int would have happened
 except that some systems had already shipped 64-bit only interfaces. The
 compromise was a type which could be defined to be any size by the
 implementation: socklen_t.

and


 People are continually confused about socklen_t.

 The type socklen_t is an unfortunate historical accident, and needed to
 be invented to cover the range of implementations seen in the field.
 The intent of socklen_t is to be the type for all lengths that are
 naturally bounded in size, that is, that they are the length of a
 buffer which cannot sensibly become of massive size: network addresses,
 hostnames, string representations of these, ancillary data, control
 messages, and socket options are examples.  Truly boundless sizes are
 represented by size_t as in read(), write(), etc.

 All socklen_t types were originally (in BSD UNIX) of type int.
 An overzealous unknown decided without significant review to "correct"
 all buffer lengths to size_t, which appears on its face to make sense.
 When dual mode 32/64 bit systems came along, this choice unnecessarily
 complicated system interfaces because size_t (with long) was a different
 size under ILP32 and LP64 models.  Reverting to int would have happened
 except that some systems had already shipped 64-bit only interfaces. The
 compromise was a type which could be defined to be any size by the
 implementation: socklen_t.

Rainer


--
Mladen.

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]




---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to