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(); } } }
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; }