1*0Sstevel@tonic-gate /* 2*0Sstevel@tonic-gate * Copyright (c) 2002 Markus Friedl. All rights reserved. 3*0Sstevel@tonic-gate * 4*0Sstevel@tonic-gate * Redistribution and use in source and binary forms, with or without 5*0Sstevel@tonic-gate * modification, are permitted provided that the following conditions 6*0Sstevel@tonic-gate * are met: 7*0Sstevel@tonic-gate * 1. Redistributions of source code must retain the above copyright 8*0Sstevel@tonic-gate * notice, this list of conditions and the following disclaimer. 9*0Sstevel@tonic-gate * 2. Redistributions in binary form must reproduce the above copyright 10*0Sstevel@tonic-gate * notice, this list of conditions and the following disclaimer in the 11*0Sstevel@tonic-gate * documentation and/or other materials provided with the distribution. 12*0Sstevel@tonic-gate * 13*0Sstevel@tonic-gate * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 14*0Sstevel@tonic-gate * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 15*0Sstevel@tonic-gate * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 16*0Sstevel@tonic-gate * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 17*0Sstevel@tonic-gate * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 18*0Sstevel@tonic-gate * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 19*0Sstevel@tonic-gate * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 20*0Sstevel@tonic-gate * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 21*0Sstevel@tonic-gate * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 22*0Sstevel@tonic-gate * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 23*0Sstevel@tonic-gate */ 24*0Sstevel@tonic-gate #include "includes.h" 25*0Sstevel@tonic-gate RCSID("$OpenBSD: msg.c,v 1.4 2002/07/01 16:15:25 deraadt Exp $"); 26*0Sstevel@tonic-gate 27*0Sstevel@tonic-gate #pragma ident "%Z%%M% %I% %E% SMI" 28*0Sstevel@tonic-gate 29*0Sstevel@tonic-gate #include "buffer.h" 30*0Sstevel@tonic-gate #include "getput.h" 31*0Sstevel@tonic-gate #include "log.h" 32*0Sstevel@tonic-gate #include "atomicio.h" 33*0Sstevel@tonic-gate #include "msg.h" 34*0Sstevel@tonic-gate 35*0Sstevel@tonic-gate void 36*0Sstevel@tonic-gate ssh_msg_send(int fd, u_char type, Buffer *m) 37*0Sstevel@tonic-gate { 38*0Sstevel@tonic-gate u_char buf[5]; 39*0Sstevel@tonic-gate u_int mlen = buffer_len(m); 40*0Sstevel@tonic-gate 41*0Sstevel@tonic-gate debug3("ssh_msg_send: type %u", (unsigned int)type & 0xff); 42*0Sstevel@tonic-gate 43*0Sstevel@tonic-gate PUT_32BIT(buf, mlen + 1); 44*0Sstevel@tonic-gate buf[4] = type; /* 1st byte of payload is mesg-type */ 45*0Sstevel@tonic-gate if (atomicio(write, fd, buf, sizeof(buf)) != sizeof(buf)) 46*0Sstevel@tonic-gate fatal("ssh_msg_send: write"); 47*0Sstevel@tonic-gate if (atomicio(write, fd, buffer_ptr(m), mlen) != mlen) 48*0Sstevel@tonic-gate fatal("ssh_msg_send: write"); 49*0Sstevel@tonic-gate } 50*0Sstevel@tonic-gate 51*0Sstevel@tonic-gate int 52*0Sstevel@tonic-gate ssh_msg_recv(int fd, Buffer *m) 53*0Sstevel@tonic-gate { 54*0Sstevel@tonic-gate u_char buf[4]; 55*0Sstevel@tonic-gate ssize_t res; 56*0Sstevel@tonic-gate u_int msg_len; 57*0Sstevel@tonic-gate 58*0Sstevel@tonic-gate debug3("ssh_msg_recv entering"); 59*0Sstevel@tonic-gate 60*0Sstevel@tonic-gate res = atomicio(read, fd, buf, sizeof(buf)); 61*0Sstevel@tonic-gate if (res != sizeof(buf)) { 62*0Sstevel@tonic-gate if (res == 0) 63*0Sstevel@tonic-gate return -1; 64*0Sstevel@tonic-gate fatal("ssh_msg_recv: read: header %ld", (long)res); 65*0Sstevel@tonic-gate } 66*0Sstevel@tonic-gate msg_len = GET_32BIT(buf); 67*0Sstevel@tonic-gate if (msg_len > 256 * 1024) 68*0Sstevel@tonic-gate fatal("ssh_msg_recv: read: bad msg_len %u", msg_len); 69*0Sstevel@tonic-gate buffer_clear(m); 70*0Sstevel@tonic-gate buffer_append_space(m, msg_len); 71*0Sstevel@tonic-gate res = atomicio(read, fd, buffer_ptr(m), msg_len); 72*0Sstevel@tonic-gate if (res != msg_len) 73*0Sstevel@tonic-gate fatal("ssh_msg_recv: read: %ld != msg_len", (long)res); 74*0Sstevel@tonic-gate return 0; 75*0Sstevel@tonic-gate } 76