e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync/* Copyright (c) 2001, Stanford University
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * All rights reserved
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync *
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * See the file LICENSE.txt for information on redistributing this software.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#include "cr_net.h"
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#include "cr_mem.h"
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#include "cr_error.h"
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#include "net_internals.h"
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncstatic void
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsynccrDevnullWriteExact( CRConnection *conn, const void *buf, unsigned int len )
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync (void) conn;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync (void) buf;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync (void) len;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncstatic void *
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsynccrDevnullAlloc( CRConnection *conn )
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return crAlloc( conn->buffer_size );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncstatic void
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsynccrDevnullSingleRecv( CRConnection *conn, void *buf, unsigned int len )
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crError( "You can't receive data on a devnull connection!" );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync (void) conn;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync (void) buf;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync (void) len;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncstatic void
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsynccrDevnullFree( CRConnection *conn, void *buf )
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crFree( buf );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync (void) conn;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncstatic void
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsynccrDevnullSend( CRConnection *conn, void **bufp,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync const void *start, unsigned int len )
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (bufp)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync {
ad27e1d5e48ca41245120c331cc88b50464813cevboxsync /* We're sending something we've allocated. It's now ours.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * If the callers wants to send something else, he'll allocate
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * something else.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync *
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * ENFORCE IT! */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crDevnullFree( conn, *bufp );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync (void) conn;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync (void) bufp;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync (void) start;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync (void) len;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncint
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsynccrDevnullRecv( void )
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crError( "You can't receive data on a DevNull network, stupid." );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return 0;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsynccrDevnullInit( CRNetReceiveFuncList *rfl, CRNetCloseFuncList *cfl, unsigned int mtu )
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync (void) rfl;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync (void) cfl;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync (void) mtu;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncstatic void
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsynccrDevnullAccept( CRConnection *conn, const char *hostname, unsigned short port )
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crError( "Well, you *could* accept a devnull client, but you'd be disappointed. ");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync (void) conn;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync (void) port;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncstatic int
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsynccrDevnullDoConnect( CRConnection *conn )
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync (void) conn;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return 1;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncstatic void
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsynccrDevnullDoDisconnect( CRConnection *conn )
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync (void) conn;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid crDevnullConnection( CRConnection *conn )
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync conn->type = CR_DROP_PACKETS;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync conn->Alloc = crDevnullAlloc;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync conn->Send = crDevnullSend;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync conn->SendExact = crDevnullWriteExact;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync conn->Recv = crDevnullSingleRecv;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync conn->Free = crDevnullFree;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync conn->Accept = crDevnullAccept;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync conn->Connect = crDevnullDoConnect;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync conn->Disconnect = crDevnullDoDisconnect;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync conn->actual_network = 0;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncCRConnection** crDevnullDump( int * num )
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync *num = 0;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return NULL;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}