proto_common.c revision 204076
1204076Spjd/*- 2204076Spjd * Copyright (c) 2009-2010 The FreeBSD Foundation 3204076Spjd * All rights reserved. 4204076Spjd * 5204076Spjd * This software was developed by Pawel Jakub Dawidek under sponsorship from 6204076Spjd * the FreeBSD Foundation. 7204076Spjd * 8204076Spjd * Redistribution and use in source and binary forms, with or without 9204076Spjd * modification, are permitted provided that the following conditions 10204076Spjd * are met: 11204076Spjd * 1. Redistributions of source code must retain the above copyright 12204076Spjd * notice, this list of conditions and the following disclaimer. 13204076Spjd * 2. Redistributions in binary form must reproduce the above copyright 14204076Spjd * notice, this list of conditions and the following disclaimer in the 15204076Spjd * documentation and/or other materials provided with the distribution. 16204076Spjd * 17204076Spjd * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND 18204076Spjd * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19204076Spjd * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 20204076Spjd * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE 21204076Spjd * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 22204076Spjd * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 23204076Spjd * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 24204076Spjd * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 25204076Spjd * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 26204076Spjd * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27204076Spjd * SUCH DAMAGE. 28204076Spjd */ 29204076Spjd 30204076Spjd#include <sys/cdefs.h> 31204076Spjd__FBSDID("$FreeBSD: head/sbin/hastd/proto_common.c 204076 2010-02-18 23:16:19Z pjd $"); 32204076Spjd 33204076Spjd#include <sys/types.h> 34204076Spjd#include <sys/socket.h> 35204076Spjd 36204076Spjd#include <assert.h> 37204076Spjd#include <errno.h> 38204076Spjd#include <stdlib.h> 39204076Spjd#include <strings.h> 40204076Spjd 41204076Spjd#include "proto_impl.h" 42204076Spjd 43204076Spjd/* Maximum size of packet we want to use when sending data. */ 44204076Spjd#ifndef MAX_SEND_SIZE 45204076Spjd//#define MAX_SEND_SIZE 32768 46204076Spjd#define MAX_SEND_SIZE 131072 47204076Spjd#endif 48204076Spjd 49204076Spjdint 50204076Spjdproto_common_send(int fd, const unsigned char *data, size_t size) 51204076Spjd{ 52204076Spjd ssize_t done; 53204076Spjd size_t sendsize; 54204076Spjd 55204076Spjd do { 56204076Spjd sendsize = size < MAX_SEND_SIZE ? size : MAX_SEND_SIZE; 57204076Spjd done = send(fd, data, sendsize, MSG_NOSIGNAL); 58204076Spjd if (done == 0) 59204076Spjd return (ENOTCONN); 60204076Spjd else if (done < 0) { 61204076Spjd if (errno == EAGAIN) 62204076Spjd continue; 63204076Spjd return (errno); 64204076Spjd } 65204076Spjd data += done; 66204076Spjd size -= done; 67204076Spjd } while (size > 0); 68204076Spjd 69204076Spjd return (0); 70204076Spjd} 71204076Spjd 72204076Spjdint 73204076Spjdproto_common_recv(int fd, unsigned char *data, size_t size) 74204076Spjd{ 75204076Spjd ssize_t done; 76204076Spjd 77204076Spjd do { 78204076Spjd done = recv(fd, data, size, MSG_WAITALL); 79204076Spjd } while (done == -1 && errno == EAGAIN); 80204076Spjd if (done == 0) 81204076Spjd return (ENOTCONN); 82204076Spjd else if (done < 0) 83204076Spjd return (errno); 84204076Spjd return (0); 85204076Spjd} 86