Hi,

Here is a first shot. Maybe in the dark..

Thanks for this investigation. So far it sounds like everything is
right, but I will follow your further analysis with interest.

One problem could be socklen_t. Linux uses size_t [1].
(yes I read the comment in the code "To forestall portability problems")
(I do not know Mac:s structs, also 32 bit probably size_t and socklen_t are 4 )
I have not enough Python/C interface knowledge to know what dragons
are hidden there..

For example the cast :
message_header.msg_controllen = (socklen_t) all_data_len;

puts an int in the msg.controllen but an long long is expected?
That cast might not be as bad as setting some length using &.

Under linux[2] here, the sizeof is :
sizeof socklen_t 4
sizeof size_t 8

There are several casts (socklen_t) and removing them did not
yet solve the problem. There must be some other error as well.
The transformer t# means char* + int. I added a tmp varible for iovec
as it is also size_t[3].

There are several points and I have tried to fix things, but was
not yet successful.

I need to read up on and create a working under linux sendmsg I think to have something to compare to.
Rebuilding the full calendar server for each test does not make sense.

Please feel free to bother me until I respond when you do :).

Hehe, leaving for vacation today, so I might not be able to follow up for a while.

Given that the problem thus far has been in some C wrapping for the
standard APIs, I'd rather figure out what the existing problem is than
introduce a new dependency and then write a bunch of _new_ C code
wrapping those APIs.

Sure, I understand. The above library also does not seem to be actively developed.

[1]
http://www.kernel.org/doc/man-pages/online/pages/man2/send.2.html

struct msghdr {
       void         *msg_name;       /* optional address */
       socklen_t     msg_namelen;    /* size of address */
       struct iovec *msg_iov;        /* scatter/gather array */
       size_t        msg_iovlen;     /* # elements in msg_iov */
       void         *msg_control;    /* ancillary data, see below */
       size_t        msg_controllen; /* ancillary data buffer len */
       int           msg_flags;      /* flags on received message */
};

http://pubs.opengroup.org/onlinepubs/007908775/xns/syssocket.h.html
void         *msg_name        optional address
socklen_t     msg_namelen     size of address
struct iovec *msg_iov         scatter/gather array
int           msg_iovlen      members in msg_iov
void         *msg_control     ancillary data, see below
socklen_t     msg_controllen  ancillary data buffer len
int           msg_flags       flags on received message

[2]
#include <sys/socket.h>
#include <stdio.h>

main() {
socklen_t t;
size_t s;
printf("sizeof socklen_t %d\n", sizeof(t));
printf("sizeof size_t %d\n", sizeof(s));
}

[3]
struct iovec
  {
    void *iov_base;     /* Pointer to data.  */
    size_t iov_len;     /* Length of data.  */
  };
_______________________________________________
calendarserver-users mailing list
calendarserver-users@lists.macosforge.org
http://lists.macosforge.org/mailman/listinfo/calendarserver-users

Reply via email to