* University of Maryland at College Park
*/
/*
- * $Id: dgram.c,v 1.32 2006/07/05 19:54:20 martinea Exp $
+ * $Id: dgram.c,v 1.32.2.4 2006/10/16 18:23:53 martinea Exp $
*
* library routines to marshall/send, recv/unmarshall UDP packets
*/
socklen_t len;
struct sockaddr_in name;
int save_errno;
-#if defined(USE_REUSEADDR)
- const int on = 1;
- int r;
-#endif
*portp = (in_port_t)0;
if((s = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
name.sin_family = (sa_family_t)AF_INET;
name.sin_addr.s_addr = INADDR_ANY;
-#ifdef USE_REUSEADDR
- r = setsockopt(s, SOL_SOCKET, SO_REUSEADDR,
- (void *)&on, (socklen_t)sizeof(on));
- if (r < 0) {
- dbprintf(("%s: dgram_bind: setsockopt(SO_REUSEADDR) failed: %s\n",
- debug_prefix(NULL),
- strerror(errno)));
- }
-#endif
-
/*
* If a port range was specified, we try to get a port in that
* range first. Next, we try to get a reserved port. If that
to.tv_usec = 0;
dbprintf(("%s: dgram_recv(dgram=%p, timeout=%u, fromaddr=%p)\n",
- debug_prefix_time(NULL), timeout, fromaddr));
- dump_sockaddr(fromaddr);
+ debug_prefix_time(NULL), dgram, timeout, fromaddr));
nfound = (ssize_t)select(sock+1, &ready, NULL, NULL, &to);
if(nfound <= 0 || !FD_ISSET(sock, &ready)) {
errno = save_errno;
return -1;
}
+ dump_sockaddr(fromaddr);
dgram->len = (size_t)size;
dgram->data[size] = '\0';
dgram->cur = dgram->data;
arglist_start(argp, fmt);
len = vsnprintf(dgram->cur, (size_t)bufsize, fmt, argp);
arglist_end(argp);
- if((ssize_t)len > bufsize) {
+ if(len < 0) {
+ return -1;
+ } else if((ssize_t)len > bufsize) {
dgram->len = sizeof(dgram->data);
dgram->cur = dgram->data + dgram->len;
return -1;
}
else {
- arglist_start(argp, fmt);
- dgram->len += vsnprintf(dgram->cur, (size_t)bufsize, fmt, argp);
- arglist_end(argp);
+ dgram->len += len;
dgram->cur = dgram->data + dgram->len;
}
return 0;