1/* 2 * $Id: asp_cmdreply.c,v 1.5 2009-10-13 22:55:37 didg Exp $ 3 * 4 * Copyright (c) 1990,1991 Regents of The University of Michigan. 5 * All Rights Reserved. 6 * 7 * Permission to use, copy, modify, and distribute this software and 8 * its documentation for any purpose and without fee is hereby granted, 9 * provided that the above copyright notice appears in all copies and 10 * that both that copyright notice and this permission notice appear 11 * in supporting documentation, and that the name of The University 12 * of Michigan not be used in advertising or publicity pertaining to 13 * distribution of the software without specific, written prior 14 * permission. This software is supplied as is without expressed or 15 * implied warranties of any kind. 16 * 17 * Research Systems Unix Group 18 * The University of Michigan 19 * c/o Mike Clark 20 * 535 W. William Street 21 * Ann Arbor, Michigan 22 * +1-313-763-0525 23 * netatalk@itd.umich.edu 24 */ 25 26#ifdef HAVE_CONFIG_H 27#include "config.h" 28#endif /* HAVE_CONFIG_H */ 29 30#include <string.h> 31#include <sys/types.h> 32#include <sys/uio.h> 33#include <sys/socket.h> 34 35#include <atalk/atp.h> 36#include <atalk/asp.h> 37 38#if defined(BSD) || defined(BSD4_3) 39#define memmove(a, b, n) bcopy((b), (a), (n)) 40#endif /* BSD || BSD4_3 */ 41 42int asp_cmdreply(ASP asp, int result) 43{ 44 struct iovec iov[ ASP_MAXPACKETS ]; 45 struct atp_block atpb; 46 int iovcnt, buflen; 47 char *buf; 48 49 /* unpack data into a format that atp likes. it needs to get 50 * 4-byte headers prepended before each ASP_CMDSIZ chunk. */ 51 buf = (char *) asp->data; 52 buflen = asp->datalen; 53 asp->write_count += buflen; 54 result = htonl(result); 55 56 iovcnt = 0; 57 do { 58 iov[ iovcnt ].iov_base = buf; 59 memmove(buf + ASP_HDRSIZ, buf, buflen); 60 61 if ( iovcnt == 0 ) { 62 memcpy( iov[ iovcnt ].iov_base, &result, ASP_HDRSIZ ); 63 } else { 64 memset( iov[ iovcnt ].iov_base, 0, ASP_HDRSIZ ); 65 } 66 67 if ( buflen > ASP_CMDSIZ ) { 68 buf += ASP_CMDMAXSIZ; 69 buflen -= ASP_CMDSIZ; 70 iov[ iovcnt ].iov_len = ASP_CMDMAXSIZ; 71 } else { 72 iov[ iovcnt ].iov_len = buflen + ASP_HDRSIZ; 73 buflen = 0; 74 } 75 iovcnt++; 76 } while ( buflen > 0 ); 77 78 atpb.atp_saddr = &asp->asp_sat; 79 atpb.atp_sresiov = iov; 80 atpb.atp_sresiovcnt = iovcnt; 81 if ( atp_sresp( asp->asp_atp, &atpb ) < 0 ) { 82 return( -1 ); 83 } 84 asp->asp_seq++; 85 86 return( 0 ); 87} 88