Added upstream from http://ftp.icm.edu.pl/pub/loglan/
[loglan.git] / sources / int / net / ip / udpmsg.c
1 #ifndef NO_PROTOTYPES
2 int sendmsg( int sock, struct msghdr *hdr, int flags );
3 int recvmsg( int sock, struct msghdr *hdr, int flags );
4 #else
5 int sendmsg();
6 int recvmsg();
7 #endif
8
9
10 #ifdef SCO
11 #define msghdr dumb_name_for_wrong_msghdr_9873
12 #endif
13
14 #ifdef SCO
15 #undef msghdr
16 #endif
17
18 #ifdef SCO    /* wrong structute msghdr + sendmsg not implemented !!!? */
19
20 struct  iovec {
21         caddr_t iov_base;
22         int     iov_len;
23 };
24
25 /*
26  * Message header for recvmsg and sendmsg calls.
27  */
28 struct msghdr {
29         caddr_t msg_name;               /* optional address */
30         int     msg_namelen;            /* size of address */
31         struct  iovec *msg_iov;         /* scatter/gather array */
32         int     msg_iovlen;             /* # elements in msg_iov */
33         caddr_t msg_accrights;          /* access rights sent/received */
34         int     msg_accrightslen;
35 };
36
37
38
39
40 /* SCO did not implement these functions ! */
41
42 static char buffer[8192];   /* maybe there won't be bigger message */
43
44
45 int sendmsg( sock, hdr, flags ) int sock; struct msghdr *hdr; int flags; {
46    int i,size;
47    char *ptr=buffer;
48
49    for( size=i=0;
50         i < hdr -> msg_iovlen ;
51         size+=hdr->msg_iov[i].iov_len, ptr+=hdr->msg_iov[i].iov_len, i++
52       ){
53       if( size + hdr->msg_iov[i].iov_len >= sizeof(buffer) ){
54          errno=EMSGSIZE;
55          return -1;
56       }
57       bcopy( hdr->msg_iov[i].iov_base, ptr, hdr->msg_iov[i].iov_len );
58    }
59
60    if( hdr->msg_name != NULL )
61       return sendto( sock,buffer,size,flags, hdr->msg_name,hdr->msg_namelen );
62    else
63       return   send( sock,buffer,size,flags );
64 }
65
66
67 int recvmsg( sock, hdr, flags ) int sock; struct msghdr *hdr; int flags; {
68    int i,sizegot,size;
69    char *ptr=buffer;
70
71    if( hdr->msg_name != NULL )
72       size = recvfrom( sock,buffer,size,flags, hdr->msg_name,hdr->msg_namelen );
73    else
74       size =     recv( sock,buffer,size,flags );
75
76    if( size<=0 )  return size;
77
78    for( sizegot=i=0;
79         i < hdr -> msg_iovlen ;
80         sizegot+=hdr->msg_iov[i].iov_len, ptr+=hdr->msg_iov[i].iov_len, i++
81       ){
82       if( sizegot + hdr->msg_iov[i].iov_len >= sizeof(buffer) ){
83          bcopy( ptr, hdr->msg_iov[i].iov_base, sizeof(buffer)-sizegot);
84          size = sizeof(buffer);
85          break;
86       }
87       bcopy( ptr, hdr->msg_iov[i].iov_base, hdr->msg_iov[i].iov_len );
88    }
89
90    return size;
91 }
92