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 {
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; }
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, §,disk) == 0){ perror("ler pedido"); exit(1); } put_sector(csector, §); vsslog(confname,diskname, RS, csector, cdir); vsslog(confname,diskname, ER, csector, cdir); } }