void SessionServer::rloop()
{
	if(!validHeader())
		return;
	char cmd[_CMD_SIZE + 1];
	cmd[_CMD_SIZE] = '\0';
	if(!readSBuf(cmd, _CMD_SIZE))
		return;
	if(strcmp(cmd, "cdr") == 0)
		createFolder();
	else if(strcmp(cmd, "cfl") == 0)
		createFile();
	else if(strcmp(cmd, "rdr") == 0)
		readFolder();
	else if(strcmp(cmd, "cmd") == 0)
		changeModel();
	else if(strcmp(cmd, "ofl") == 0)
		openFile();
	else if(strcmp(cmd, "rfl") == 0)
		readFile();
	else if(strcmp(cmd, "wfl") == 0)
		writeFile();
	else if(strcmp(cmd, "skf") == 0)
		seekFile();
	else if(strcmp(cmd, "tlf") == 0)
		tellFile();
	else if(strcmp(cmd, "csf") == 0)
		closeFile();
	else if(strcmp(cmd, "del") == 0)
		deleteItem();
	else if(strcmp(cmd, "gsf") == 0)
		getItemSafeInfo();
	// else if(strcmp(cmd, "fdk") == 0)
	// 	formatDisk(); 
	else if(strcmp(cmd, "lgt") == 0)
		logout();
	else if(strcmp(cmd, "aur") == 0)
		addUsr();
	else if(strcmp(cmd, "cpd") == 0)
		changePsd();
	else
		cmdError();
}
void SessionServer::rlogin()
{
	if(!validHeader())
		return;
	char username[_MAXUNAMESIZE];
	char password[_MAXPSDSIZE];
	if(!readSBuf(username, _MAXUNAMESIZE))
		return;
	if(!readSBuf(password, _MAXPSDSIZE))
		return;
	int rrs;
	uidsize_t uid = validAuth(username, password);
	if(uid)
	{
		rrs = 0;
		status = SessionServer::LOOPING;
		userId = uid;
	}
	else
		rrs = err;
	writeSBuf((char*) &uid, sizeof(uid));
	if(rrs != 0)
		writeSBuf((char*) &rrs, sizeof(rrs));
}
Exemplo n.º 3
0
int main(int argc, char* argv[])
{
	FILE *fileDump1, *fileDump2, *file8xu;	//input file pointers
	char fileNameDump1[FILE_NAME_LENGTH], fileNameDump2[FILE_NAME_LENGTH], fileName8xu[FILE_NAME_LENGTH];
	char calcType[CALCTYPE_LENGTH+1];		//5 characters and NULL
	int calcModel;			//number of calculator (like _GetHardwareVersion)
	char calcModelNumber;	//either '3' or '4'
	char calcModelType;		//either 'B' or 'S'
	int numPages;			//number of pages for the calc model
	int fD1, fD2, f8xu;		//flags if the command line arguments were present and valid
	int v_major, v_minor;

	int count;
	char temp[5];			//for GetOSVersion stuff

	//if too few arguments or arguments (excluding calcType) are not an even count
	//since every switch precedes a file name
	if (argc <= 1 || ((argc - 2) % 2 != 0))	//subtraction is redundant
	{
		fprintf(stderr,usage);
		exit(EXIT_FAILURE);
	}

	//now loop through command-line arguments
	//printf("Parsing arguments...\n");

	if (!validModel(calcType, argv[1], &calcModel))		//if model was not detected
	{
		fprintf(stderr,"%s is not a supported model.\n",calcType);
		exit(EXIT_FAILURE);
	}

	//check if file names available or if 8xu file specified
	fD1 = fD2 = f8xu = FALSE;
	count = 2;
	while (count < argc)
	//for (count = 2; count < argc; count += 2)	//pay attention to even # of arguments
	{
		if (argv[count][0] == '-')
		{
			if ((strlen(argv[count]) == 2) && (count + 1 < argc))
			{
				switch (argv[count][1])
				{
					case '1':
						fD1 = TRUE;
						count++;			//increment to next argument
						strcpy(fileNameDump1,argv[count]);
						break;
					case '2':
						fD2 = TRUE;
						count++;
						strcpy(fileNameDump2,argv[count]);
						break;
					case 'u':
						f8xu = TRUE;
						count++;
						strcpy(fileName8xu,argv[count]);
						break;
					default:
						fprintf(stderr,"%s: invalid switch.\n",argv[count]);
						break;
				}
			}
			else
			{
				fprintf(stderr,"%s: not enough parameters.\n",argv[count]);
			}
		}
		else
		{
			fprintf(stderr,"%s: unknown option.\n",argv[count]);
		}
		count++;
	}

	//fD1, fD2, and f8xu determine if there was a command-line switch available.
	//	next, they will determine if the files were successfully opened, but not now.
	//if fD1 or fD2 were not specified, set the default file name
	//(maybe) also check to see if the correct # of files were specified

// 	switch (calcModel)
// 	{
// 		case 0:					//83PBE
// 			calcModelNumber = '3';
// 			calcModelType = 'B';
// 			break;
// 		case 1:					//83PSE
// 			calcModelNumber = '3';
// 			calcModelType = 'S';
// 			break;
// 		case 2:					//84PBE
// 			calcModelNumber = '4';
// 			calcModelType = 'B';
// 			break;
// 		case 3:					//84PSE
// 			calcModelNumber = '4';
// 			calcModelType = 'S';
// 			break;
// 		default:
// 			fprintf(stderr,"*** Fatal error!  You should never get this message! O_O");
// 			exit(EXIT_FAILURE);
// 	}

// 	//Why doesn't the following compile? O_o
// 	char ModelNumber[5] = "3344";
// 	char ModelType[] = "BSBS";
	calcModelNumber = ModelNumber[calcModel];
	calcModelType = ModelType[calcModel];

	numPages = NumPagesList[calcModel];

	if (!fD1)		//set default file name for #1
	{
		strcpy(fileNameDump1,"D8");
		//strcat(fileNameDump1,calcModelNumber);
		fileNameDump1[2] = calcModelNumber;
		fileNameDump1[3] = '\0';		//NULL
		strcat(fileNameDump1,"P");
		//strcat(fileNameDump1,calcModelType);
		fileNameDump1[4] = calcModelType;
		fileNameDump1[5] = '\0';
		strcat(fileNameDump1,"E1.8xv");
	}
	if (!fD2)		//set default file name for #2
	{
		strcpy(fileNameDump2,"D8");
		//strcat(fileNameDump2,calcModelNumber);
		fileNameDump2[2] = calcModelNumber;
		fileNameDump2[3] = '\0';		//NULL
		strcat(fileNameDump2,"P");
		//strcat(fileNameDump2,calcModelType);
		fileNameDump2[4] = calcModelType;
		fileNameDump2[5] = '\0';		//NULL
		strcat(fileNameDump2,"E2.8xv");
	}

	fprintf(stderr,"Calculator model: %s\nDump 1: %s\n",calcTypeNames,fileNameDump1);
	if (calcModel == 2 || calcModel == 3)
		fprintf(stderr,"Dump 2: %s\n",fileNameDump2);
	if (f8xu)
		fprintf(stderr,"Upgrade file: %s\n",fileName8xu);
	fprintf(stderr,"\n");

	//Now open files (and check if the right files exist for the right calculator)
	fileDump1 = fopen(fileNameDump1,"rb");	//open in reading and binary
	if (!fileDump1)
	{
		perror(fileNameDump1);
		exit(EXIT_FAILURE);
	}
	if (!validHeader(fileDump1, NONFLASH, calcModel))
	{
		fprintf(stderr,"%s: invalid dump file.\n",fileNameDump1);
		exit(EXIT_FAILURE);
	}
	if (calcModel == 2 || calcModel == 3)	//if 84PBE or 84PSE
	{
		fileDump2 = fopen(fileNameDump2,"rb");
		if (!fileDump2)
		{
			perror(fileNameDump2);
			exit(EXIT_FAILURE);
		}
		if (!validHeader(fileDump2, NONFLASH, calcModel))
		{
			fprintf(stderr,"%s: invalid dump file.\n",fileNameDump2);
			exit(EXIT_FAILURE);
		}
	}
	if (f8xu)		//OS upgrade file
	{
		file8xu = fopen(fileName8xu,"rb");
		if (!file8xu)
		{
			perror(fileName8xu);
			exit(EXIT_FAILURE);
		}
		if (!validHeader(file8xu, FLASH, calcModel))
		{
			fprintf(stderr,"%s: invalid OS file.\n",fileName8xu);
			exit(EXIT_FAILURE);
		}
	}
	//and now the ROM file itself, but first initialize the name
	strcpy(fileNameRom,calcType);
	if (f8xu)
	{
		GetOSVersion(file8xu, &v_major, &v_minor);
		//printf("%i\n",v_minor);
		strcat(fileNameRom,"_v");
		temp[0] = v_major + '0';
		temp[1] = ((v_minor - (v_minor % 10))/10) + '0';
		temp[2] = (v_minor % 10) + '0';
		temp[3] = '\0';
		strcat(fileNameRom,temp);
	}
	strcat(fileNameRom,".rom");
	romFile = fopen(fileNameRom,"w+b");	//I suppose r+ could work to one's advantage, but it doesn't compile correctly...
	if (!romFile)
	{
		perror(fileNameRom);
		exit(EXIT_FAILURE);
	}

	romCreated = FALSE;
	ExitHandlerPtr = ExitHandler;
	atexit(ExitHandlerPtr);			//set the "error handler"

	//Let's make the ROM file!
	if (!makeBlankRom(/*romFile,*/ numPages))
	{
		fprintf(stderr,"%s: unable to make blank ROM file.\n",fileNameRom);
		exit(EXIT_FAILURE);
	}

	//Page [137]F
	if (!writePage(/*romFile,*/ fileDump1, numPages - 1))
	{
		//perror(fileNameDump2);
		fprintf(stderr,"%s: unable to write %s to ROM file.\n",fileNameRom, fileNameDump1);
		exit(EXIT_FAILURE);
	}
	//Page [26]F
	if (calcModel == 2 || calcModel == 3)
	{
		if (!writePage(/*romFile,*/ fileDump2, numPages - 1 - 0x10))
		{
			fprintf(stderr,"%s: unable to write %s to ROM file.\n",fileNameRom, fileNameDump2);
			exit(EXIT_FAILURE);
		}
	}
	if (f8xu)
	{
		if (!write8xu(/*romFile,*/ file8xu, calcModel))
		{
			fprintf(stderr,"%s: unable to write %s to ROM file.\n",fileNameRom, fileName8xu);
			exit(EXIT_FAILURE);
		}
		//validate the OS
		fseek(romFile,0x0056l,SEEK_SET);
		fwrite("\x5A\xA5",1,2,romFile);
		fseek(romFile,(((long)(numPages - 2)) * 0x4000) + 0x1FE0, SEEK_SET);
		fwrite("\0",1,1,romFile);
	}

	romCreated = TRUE;		//Success!
	//WE ARE DONE! Close all files

	//the following code is supposed to be in a function that is hooked and called whenever it exit()s, but....
	fclose(fileDump1);
	if (fD2)
		fclose(fileDump2);
	if (f8xu)
		fclose(file8xu);
	//fclose(romFile);

// 	if (!romCreated)
// 	{
// 		remove(fileNameRom);
// 		fprintf(stderr,"\n%s was not created.\n",fileNameRom);
// 		return EXIT_FAILURE;
// 	}
// 	//else
// 	fprintf(stderr,"\n%s was successfully created.\n",fileNameRom);
	return (romCreated ? EXIT_SUCCESS : EXIT_FAILURE);
}