e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync/* Copyright (c) 2001, Stanford University
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * All rights reserved
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * See the file LICENSE.txt for information on redistributing this software.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsynctypedef enum {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncstatic struct {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsynccrFileReadExact( CRConnection *conn, void *buf, unsigned int len )
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync while ( len > 0 )
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsynccrFileWriteExact( CRConnection *conn, const void *buf, unsigned int len )
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crError( "crFileWriteExact: %s (tried to write %d bytes, actually wrote %d)", conn->filename, len, retval );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsynccrFileAccept( CRConnection *conn, const char *hostname, unsigned short port )
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync conn->fd = open( conn->filename, O_RDONLY | O_BINARY );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crError( "Couldn't open %s for reading!", conn->filename );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync buf = (CRFileBuffer *) crBufferPoolPop( cr_file.bufpool, conn->buffer_size );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crDebug( "Buffer pool was empty, so I allocated %d bytes",
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crAlloc( sizeof(CRFileBuffer) + conn->buffer_size );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsynccrFileSingleRecv( CRConnection *conn, void *buf, unsigned int len )
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsynccrFileSend( CRConnection *conn, void **bufp, const void *start, unsigned int len )
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* we are doing synchronous sends from user memory, so no need
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * to get fancy. Simply write the length & the payload and
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * return. */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRASSERT( file_buffer->magic == CR_FILE_BUFFER_MAGIC );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* All of the buffers passed to the send function were allocated
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * with crFileAlloc(), which includes a header with a 4 byte
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * length field, to insure that we always have a place to write
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * the length field, even when start == *bufp. */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* reclaim this pointer for reuse and try to keep the client from
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync accidentally reusing it directly */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crBufferPoolPush( cr_file.bufpool, file_buffer, conn->buffer_size );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRFileBuffer *file_buffer = (CRFileBuffer *) buf - 1;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRASSERT( file_buffer->magic == CR_FILE_BUFFER_MAGIC );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crBufferPoolPush( cr_file.bufpool, file_buffer, conn->buffer_size );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crError( "Weird buffer kind trying to free in crFileFree: %d", file_buffer->kind );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync file_buffer = (CRFileBuffer *) crFileAlloc( conn ) - 1;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crNetDispatchMessage( cr_file.recv_list, conn, msg, len );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* CR_MESSAGE_OPCODES is freed in
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * OOB messages are the programmer's problem. -- Humper 12/17/01 */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (msg->header.type != CR_MESSAGE_OPCODES && msg->header.type != CR_MESSAGE_OOB)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsynccrFileHandleNewMessage( CRConnection *conn, CRMessage *msg,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync unsigned int len )
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* build a header so we can delete the message later */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crNetDispatchMessage( cr_file.recv_list, conn, msg, len );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsynccrFileInstantReclaim( CRConnection *conn, CRMessage *mess )
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsynccrFileInit( CRNetReceiveFuncList *rfl, CRNetCloseFuncList *cfl, unsigned int mtu )
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* NOTE: the third parameter (file permissions) is only used/required when
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * we specify O_CREAT as part of the flags. The permissions will be
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * masked according to the effective user's umask setting.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync conn->fd = open( conn->filename, O_CREAT | O_WRONLY | O_BINARY |
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync conn->fd = open( conn->filename, O_CREAT | O_WRONLY | O_BINARY,
c3de4bcdf53b13328f67423fccb8bbb9e4c79ac0vboxsync S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crWarning( "Couldn't open %s for writing!", conn->filename );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crMemcpy( cr_file.conns + conn->index, cr_file.conns + conn->index+1,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync (cr_file.num_conns - conn->index - 1)*sizeof(*(cr_file.conns)) );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync conn->sizeof_buffer_header = sizeof( CRFileBuffer );