Example #1
0
void serverListen(int port)
{
	int sd = UDP_Open(port);
	if(sd < 0)
	{
		printf("Error opening socket on port %d\n", port);
		exit(1);
	}

    printf("Starting server...\n");
    while (1) {
		struct sockaddr_in s;
		Net_Packet packet;
		int rc = UDP_Read(sd, &s, (char *)&packet, sizeof(Net_Packet));
		if (rc > 0) {
		    Net_Packet responsePacket;

		    switch(packet.message){
		    		
		    	case PAK_LOOKUP :
		    		responsePacket.inum = Server_Lookup(packet.inum, packet.name);
		    		break;

		    	case PAK_STAT :
		    		responsePacket.inum = Server_Stat(packet.inum, &(responsePacket.stat));
		    		break;

		    	case PAK_WRITE :
		    		responsePacket.inum = Server_Write(packet.inum, packet.buffer, packet.block);
		    		break;

		    	case PAK_READ:
		    		responsePacket.inum = Server_Read(packet.inum, responsePacket.buffer, packet.block);
		    		break;

		    	case PAK_CREAT:
		    		responsePacket.inum = Server_Creat(packet.inum, packet.type, packet.name);
		    		break;

		    	case PAK_UNLINK:
		    		responsePacket.inum = Server_Unlink(packet.inum, packet.name);
		    		break;

		    	case PAK_SHUTDOWN:
		  			break;
		    	
		    	case PAK_RESPONSE:
		    		break;
		    }

		    responsePacket.message = PAK_RESPONSE;
		    rc = UDP_Write(sd, &s, (char*)&responsePacket, sizeof(Net_Packet));
		    if(packet.message == PAK_SHUTDOWN)
		    	Server_Shutdown();
		}
	}
}
Example #2
0
int main(int argc, char *argv[])
{

	if(argc != 3){
		fprintf(stderr,"usage: server [portnum] [file-system-image]\n");
		fprintf(stderr,"you supplied %d args\n", argc);
		exit(1);
	}
	int portnum = atoi( argv[1] );
	if( ! (portnum > 0 ) ) {
		fprintf(stderr, "  portnum = %d;  this should be a pos number",portnum);
	}

	const int sd = UDP_Open(portnum);
	assert(sd > -1);

	inode_table = (Inode_t *)malloc(MFS_BLOCK_NUMS * sizeof(Inode_t));
	data_region = (Block_t *)malloc(MFS_BLOCK_NUMS * sizeof(Block_t));
	if(inode_table == NULL || data_region == NULL){
		fprintf(stderr, "malloc error\n");
		exit(-1);
	}

	if( (image_fd = open(argv[2],O_RDWR)) == -1){
		image_fd = Image_Init(argv[2]);
	}

	int rc = -1;
	struct sockaddr_in s;
	char buffer_read[ UDP_BUFFER_SIZE];
	char buffer_reply[UDP_BUFFER_SIZE];
	char buffer[BUFFER_SIZE];
	char * ptr = buffer_read;

    int block  = -1;
	int blocks = -1;
	int pinum  = -1;
	int inum   = -1;
	int size   = -1;
	int status = -1;
	int type   = -1;
	char * name   = NULL;

	int * iptr   = NULL;
	char * cptr  = NULL;
	MFS_Stat_t * mptr  = NULL;

	while (1) {

		block  = -1;
		blocks = -1;
		pinum  = -1;
		inum   = -1;
		size   = -1;
		status = -1;
		type   = -1;
		name   = NULL;
		iptr  = NULL;
		cptr  = NULL;

		rc = UDP_Read(sd, &s, buffer_read, UDP_BUFFER_SIZE);
		ptr = buffer_read;
		if (rc < 1) {
			rc = -1;
			continue;
		}

		iptr = (int*) ptr;
		int * op_id = iptr;
		iptr++;
		switch(*op_id)
		{
			case 0:
				printf("op_id == 0 \n");
				break;

			case 1:
				pinum = *( iptr );
				iptr++;
				cptr = (char*)iptr;
				name = cptr;

				inum = Server_LookUp(pinum, name );

				iptr = (int*) buffer_reply;
				*iptr = inum;

				break;


			case 2:


				inum = *( iptr );
				iptr++;
				mptr = (MFS_Stat_t*)iptr;

				status = Server_Stat(inum, mptr );

				iptr = (int*) buffer_reply;
				*iptr = status;

				iptr++;
				memcpy((void*) iptr, (void*)mptr, sizeof( MFS_Stat_t ) );

				break;

			case 3:

				inum = *( iptr );
				iptr++;
				cptr = (char*)iptr;
				memcpy( buffer, cptr, BUFFER_SIZE );
				cptr += BUFFER_SIZE;
				iptr = (int*) cptr;
				block = *iptr;

				status = Server_Write( inum, buffer, block );

				iptr = (int *) buffer_reply;
				*iptr = status;

				break;

			case 4:

				inum = *( iptr );
				iptr++;
				cptr = (char*)iptr;
				memcpy( buffer, cptr, BUFFER_SIZE );
				cptr += BUFFER_SIZE;
				iptr = (int*) cptr;
				block = *iptr;

				status = Server_Read( inum, buffer, block );

				iptr = (int *) buffer_reply;
				*iptr = status;
                iptr++;
                cptr = (char*) iptr;
                memcpy(cptr, buffer, BUFFER_SIZE);

				break;

			case 5:

				pinum = *( iptr );
				iptr++;
				type = *iptr;
				iptr++;
				name = (char*) iptr;

				status = Server_Creat( pinum, type, name );

				iptr = (int *) buffer_reply;
				*iptr = status;

				break;

			case 6:

				pinum  = *(iptr++);
				name   = (char*)(iptr);

				status = Server_Unlink( pinum, name );
				iptr  = (int*) buffer_reply;
				*iptr = status;

				break;

			default:
				fprintf(stderr, "bad function number %d\n", *op_id );
				exit(1);
		}
        
		rc = UDP_Write(sd, &s, buffer_reply, UDP_BUFFER_SIZE);

	}

	return 0;
}