Esempio n. 1
0
void put_bad_sector_entry(int segment_id, unsigned long new_map)
{
	byte *ptr = bad_sector_map;
	int count;
	int new_count;
	unsigned long map;

	if (format_code == 3 || format_code == 4) {
		count = forward_seek_entry(segment_id, &ptr, &map);
		new_count = count_ones(new_map);
		/*  If format code == 4 put empty segment instead of 32 bad sectors.
		 */
		if (new_count == 32 && format_code == 4) {
			new_count = 1;
		}
		if (count != new_count) {
			/*  insert (or delete if < 0) new_count - count entries.
			 *  Move trailing part of list including terminating 0.
			 */
			byte *hi_ptr = ptr;

			do {
			} while (get_sector(&hi_ptr, forward) != 0);
			memmove(ptr + new_count, ptr + count, hi_ptr - (ptr + count));
		}
		if (new_count == 1 && new_map == EMPTY_SEGMENT) {
			put_sector(&ptr, 0x800001 + segment_id * SECTORS_PER_SEGMENT);
		} else {
			int i = 0;

			while (new_map) {
				if (new_map & 1) {
					put_sector(&ptr, 1 + segment_id * SECTORS_PER_SEGMENT + i);
				}
				++i;
				new_map >>= 1;
			}
		}
	} else {
Esempio n. 2
0
int main(int argc, char** argv)
{
   int result;
   FILE* file;

   if(6 != argc)
   {
      printf("Usage: %s drive head track sector filename\n", argv[0]);
      printf("To write MBR: %s 128 0 0 1 mbr.bin\n", argv[0]);
      printf("To write boot sector: %s 128 1 0 1 bs.bin\n", argv[0]);
      return 0;
   }

   if((file = fopen(argv[5], "rb")) == 0)
   {
      fprintf(stderr, "%s: error opening %s\n", argv[0], argv[5]);
      return 0x12;
   }

   size_t bytes = fread(sector, sector_size, 1, file);
   fclose(file);

   if(sector_size != bytes)
   {
      fprintf(stderr, "%s: error reading %s\n", argv[0], argv[5]);
      result = 0x12;
   }
   else if((result = put_sector(atoi(argv[1]),
                                atoi(argv[2]),
                                atoi(argv[3]),
                                atoi(argv[4]),
                                sector)) != 0)
   {
      fprintf(stderr, "%s: error writing sector\n", argv[0]);
   }

   return result;
}
Esempio n. 3
0
int main( int argc, char *argv[] ){
	char *progname = argv[0];
	char conffile[255];

	if( argc > 1 ){

		if(strcmp(argv[1], "-h") == 0){
			print_help(progname);
			exit(0);
		}
		else if(get_conf_name( argv, conffile ) == 0){
			print_help(progname);
			exit(1);
		}
	}
	else{
		print_help(progname);
		exit(1);
	}

	csector = 0;
	cdir = in;
	confname = argv[argc - 1];

	conf_t conf;
	confresult_t confresult = get_conf(conffile, confname, &conf);
	// verificação de erros de get_conf
	if(confresult != ok){
		if(confresult == filenotfound)
			fprintf(stderr, "ficheiro não encontrado\n");
		else if(confresult == confnotfound)
			fprintf(stderr, "configuração não encontrada\n");
		else if(confresult == disknotfound)
			fprintf(stderr, "disco não encontrado\n");
		else
			fprintf(stderr, "erro no ficheiro\n");

		exit(1);
	}

	// tamanho do disco
	struct stat st;
	if(stat(conf.imagefile, &st) == -1){
		perror("tamanho do disco");
		exit(1);
	}
	disksize = st.st_size;

	// verificar tamanho do ficheiro de imagem com número de
	// setores dos discos. Só é necessário verificar com um
	// disco porque a função get_conf verifica o tamanho dos discos.
	if(disksize != conf.disk[0].sectors){
		fprintf(stderr, "Não conseguio carregar o disco\n");
		exit(1);
	}

	// carregar para memória o ficheiro contendo imagem do disco
	int fd = open(conf.imagefile, O_RDONLY);
	if(fd == -1){
		perror(conf.imagefile);
		exit(1);
	}
	secdata_t disk[disksize];
	if(read (fd, disk, disksize) == -1){
		perror("ler ficheiro img");
		exit(1);
	}
	
	reqpool_t reqpool;
	ipc_t ipc;
	ipc.reqpool = &reqpool;

	// inicializar e associar o processo aos mecanismos de comunicação
	if(init_ipc(progname, confname, &ipc) == -1)
		exit(1);

	// criar o processo filho
	int indice = setup_disks(ipc.reqpool->disks);
	strcpy(diskname, conf.disk[indice].name);

	vsslog(confname,diskname, DS, cdir, disksize, ipc.reqpool->policy);
	vsslog(confname,diskname, ER, csector, cdir);
		
	// arma o sinal SIGUSR1
	signal(SIGUSR1, estaciona_disco);

	// atender pedidos
	request_t req;
	while(1){

		if(ipc.reqpool->policy == FCFS){
			if(take_request(&ipc, &req, select_request_FCFS) != 1){
				perror("carregar pedido");
				exit(1);
			}
		}else{
			if(take_request(&ipc, &req, select_request_LOOK) != 1){
				perror("carregar pedido");
				exit(1);
			}
		}
		vsslog(confname,diskname, OR, req.sector);

		secdata_t sect;
		if(move_and_read(&req, &sect,disk) == 0){
			perror("ler pedido");
			exit(1);
		}
		put_sector(csector, &sect);

		vsslog(confname,diskname, RS, csector, cdir);
		vsslog(confname,diskname, ER, csector, cdir);
	}

}