This is recvmsg.c in view mode; [Download] [Up]
/*
* $Header: /disk/d/src/devel/gated/dist/src/compat/RCS/recvmsg.c,v 2.1 92/02/24 14:15:02 jch Exp $
*/
/*%Copyright%*/
/************************************************************************
* *
* GateD, Release 2 *
* *
* Copyright (c) 1990,1991,1992 by Cornell University *
* All rights reserved. *
* *
* THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT ANY *
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT *
* LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY *
* AND FITNESS FOR A PARTICULAR PURPOSE. *
* *
* Royalty-free licenses to redistribute GateD Release *
* 2 in whole or in part may be obtained by writing to: *
* *
* GateDaemon Project *
* Information Technologies/Network Resources *
* 143 Caldwell Hall *
* Cornell University *
* Ithaca, NY 14853-2602 *
* *
* GateD is based on Kirton's EGP, UC Berkeley's routing *
* daemon (routed), and DCN's HELLO routing Protocol. *
* Development of Release 2 has been supported by the *
* National Science Foundation. *
* *
* Please forward bug fixes, enhancements and questions to the *
* gated mailing list: gated-people@gated.cornell.edu. *
* *
* Authors: *
* *
* Jeffrey C Honig <jch@gated.cornell.edu> *
* Scott W Brim <swb@gated.cornell.edu> *
* *
*************************************************************************
* *
* Portions of this software may fall under the following *
* copyrights: *
* *
* Copyright (c) 1988 Regents of the University of California. *
* All rights reserved. *
* *
* Redistribution and use in source and binary forms are *
* permitted provided that the above copyright notice and *
* this paragraph are duplicated in all such forms and that *
* any documentation, advertising materials, and other *
* materials related to such distribution and use *
* acknowledge that the software was developed by the *
* University of California, Berkeley. The name of the *
* University may not be used to endorse or promote *
* products derived from this software without specific *
* prior written permission. THIS SOFTWARE IS PROVIDED *
* ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, *
* INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF *
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. *
* *
************************************************************************/
#include "include.h"
#ifdef NEED_RECVMSG
static caddr_t buf_base;
static int buf_size;
int
recvmsg(s, msg, flags)
int s;
struct msghdr *msg;
int flags;
{
register int i, cc, acc;
extern int errno;
extern char etext;
extern char *sbrk();
char *buf_ptr;
if ((msg->msg_iovlen < 1) || (msg->msg_iovlen > MSG_MAXIOVLEN)) {
errno = EINVAL;
return (-1);
}
#ifdef SCM_RIGHTS
if (msg->msg_control) {
*msg->msg_control = (char) 0;
}
#else /* SCM_RIGHTS */
if (msg->msg_accrights) {
*msg->msg_accrights = (char) 0;
}
#endif /* SCM_RIGHTS */
/* only 1 buffer - receive the data directly */
if (msg->msg_iovlen == 1) {
acc = recvfrom(s,
msg->msg_iov->iov_base,
msg->msg_iov->iov_len,
flags,
msg->msg_name,
&msg->msg_namelen);
return (acc);
}
/* Scan through the iovec's to check lengths and figure out */
/* maximum buffer size */
for (acc = i = 0; i < msg->msg_iovlen; i++) {
register int len = msg->msg_iov[i].iov_len;
register char *base = msg->msg_iov[i].iov_base;
if ((len < 0) || (base < &etext) || ((base + len) > sbrk(0))) {
errno = EINVAL;
return (-1);
}
acc += msg->msg_iov[i].iov_len;
}
/* Allocate a receive buffer */
if (acc > buf_size) {
if (buf_base != NULL) {
(void) free(buf_base);
}
buf_base = (caddr_t) malloc(acc);
buf_size = acc;
}
if (!buf_base) {
buf_size = 0;
errno = ENOMEM;
return (-1);
}
acc = cc = recvfrom(s,
buf_base,
acc,
flags,
msg->msg_name,
&msg->msg_namelen);
/* Return if error */
if (cc < 0) {
return (cc);
}
/* Distribute the data as specified in the iovec */
for (i = 0, buf_ptr = buf_base; acc && (i < msg->msg_iovlen); i++) {
register int len = msg->msg_iov[i].iov_len;
(void) memcpy(msg->msg_iov[i].iov_base, buf_ptr, len);
buf_ptr += len;
acc -= len;
}
/* Return the length read */
return (cc);
}
#endif /* NEED_RECVMSG */
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.