148919Srnordier/* $OpenBSD: msg.c,v 1.15 2006/08/03 03:34:42 deraadt Exp $ */ 240269Srnordier/* 340326Srnordier * Copyright (c) 2002 Markus Friedl. All rights reserved. 440326Srnordier * 540326Srnordier * Redistribution and use in source and binary forms, with or without 640326Srnordier * modification, are permitted provided that the following conditions 740326Srnordier * are met: 840326Srnordier * 1. Redistributions of source code must retain the above copyright 940404Srnordier * notice, this list of conditions and the following disclaimer. 1040404Srnordier * 2. Redistributions in binary form must reproduce the above copyright 1140326Srnordier * notice, this list of conditions and the following disclaimer in the 1240269Srnordier * documentation and/or other materials provided with the distribution. 1340269Srnordier * 1448919Srnordier * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 1548919Srnordier * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 1648919Srnordier * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 1742480Srnordier * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 1842480Srnordier * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 1940541Srnordier * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2040541Srnordier * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2140269Srnordier * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2240269Srnordier * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 2340269Srnordier * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2440269Srnordier */ 2540269Srnordier 2640269Srnordier#include "includes.h" 2740269Srnordier 2840269Srnordier#include <sys/types.h> 2940269Srnordier#include <sys/uio.h> 3040330Srnordier 3145334Srnordier#include <errno.h> 3240269Srnordier#include <stdio.h> 3340269Srnordier#include <string.h> 3440269Srnordier#include <unistd.h> 3540269Srnordier#include <stdarg.h> 3640269Srnordier 3740269Srnordier#include "buffer.h" 3840269Srnordier#include "log.h" 3940269Srnordier#include "atomicio.h" 4040269Srnordier#include "msg.h" 4140308Srnordier#include "misc.h" 4240269Srnordier 4340269Srnordierint 4440269Srnordierssh_msg_send(int fd, u_char type, Buffer *m) 4540269Srnordier{ 4640269Srnordier u_char buf[5]; 4748919Srnordier u_int mlen = buffer_len(m); 4840326Srnordier 4940269Srnordier debug3("ssh_msg_send: type %u", (unsigned int)type & 0xff); 5040269Srnordier 5140269Srnordier put_u32(buf, mlen + 1); 5240314Srnordier buf[4] = type; /* 1st byte of payload is mesg-type */ 5340314Srnordier if (atomicio(vwrite, fd, buf, sizeof(buf)) != sizeof(buf)) { 5440314Srnordier error("ssh_msg_send: write"); 5540314Srnordier return (-1); 5640269Srnordier } 5740269Srnordier if (atomicio(vwrite, fd, buffer_ptr(m), mlen) != mlen) { 5840269Srnordier error("ssh_msg_send: write"); 5940269Srnordier return (-1); 6040269Srnordier } 6140308Srnordier return (0); 6240269Srnordier} 6340404Srnordier 6440269Srnordierint 6540404Srnordierssh_msg_recv(int fd, Buffer *m) 6640269Srnordier{ 6740404Srnordier u_char buf[4]; 6842480Srnordier u_int msg_len; 6942480Srnordier 7042480Srnordier debug3("ssh_msg_recv entering"); 7140541Srnordier 7240404Srnordier if (atomicio(read, fd, buf, sizeof(buf)) != sizeof(buf)) { 7340326Srnordier if (errno != EPIPE) 7440326Srnordier error("ssh_msg_recv: read: header"); 7540326Srnordier return (-1); 7640326Srnordier } 7740326Srnordier msg_len = get_u32(buf); 7840326Srnordier if (msg_len > 256 * 1024) { 7940326Srnordier error("ssh_msg_recv: read: bad msg_len %u", msg_len); 80 return (-1); 81 } 82 buffer_clear(m); 83 buffer_append_space(m, msg_len); 84 if (atomicio(read, fd, buffer_ptr(m), msg_len) != msg_len) { 85 error("ssh_msg_recv: read: %s", strerror(errno)); 86 return (-1); 87 } 88 return (0); 89} 90