Хрестоматия по программированию на Си в Unix




Примеры. Хрестоматия по программированию на Си в Unix - стр. 5


/* Прочесть boot-sector, вычислить разные параметры дискеты */ void readBoot(dsk) char *dsk; { char BOOT[SECTOR]; int skips, sides;

if((fd = open( dsk, O_RDONLY)) < 0 ){ fprintf(stderr, "Не могу читать %s\n", dsk); exit(5); } /* нулевой сектор дискеты - boot */ Read(fd, BOOT, SECTOR); boot = (struct boot *) BOOT;

line('-'); printf( "Сформатировано \"%8.8s\"\n", boot->label ); printf( "Размер boot-сектора %d байт\n", INT(boot->bfs)); printf( "Кластер содержит %d секторов\n", SPC = boot->sectorsPerCluster ); printf( "Дискета содержит %d секторов ", SECT = INT(boot->sectors)); capacity = SECT * (long) SECTOR; printf( "(%ld KB)\n", capacity / 1024L ); printf( "На треке %d секторов\n", INT(boot->sectorsPerTrack)); sides = INT(boot->sides); printf( "Диск имеет %d сторон%c\n\n", sides, sides==1? 'у':'ы');

printf( "Смещение до FAT %d сектор\n", skips = INT(boot->fatoff)); printf( "Имеется %d копии FAT\n", NFAT = boot->copies ); printf( "FAT занимает %d секторов\n\n", SPF = INT(boot->FATsize));

printf( "Корневой каталог содержит %d записей\n\n", NDIR = INT(boot->dirsize));

printf( "Описатель дискеты = %02X\t(", DESC = boot->desc ); switch( DESC ){ case 0xFF: printf( "double sided, 8 sectors per track" ); break; case 0xFE: printf( "single sided, 8 sectors per track" ); break; case 0xFD: printf( "double sided, 9 sectors per track" ); break; case 0xFC: printf( "single sided, 9 sectors per track" ); break; case 0xF9: printf( "double sided, 15 sectors per track"); break; case 0xF8: printf( "Winchester" ); bit16++; break; default: printf( "неизвестный тип" ); break; } printf( ")\n"); printf( "На диске %d спрятанных секторов\n", INT(boot->hidden));

/* Вычислить характеристики */ CLU = SECTOR * SPC; /* размер кластера в байтах */ FATSIZE = SECTOR * SPF; /* длина FAT в байтах */ FATSTART = SECTOR * skips; /* смещение в байтах до FAT */ /* длина корневого каталога в байтах */ DIRSIZE = NDIR * sizeof(struct dir); /* физический номер первого кластера данных */ DATACLU = ((long) FATSTART + (long) FATSIZE * NFAT + (long) DIRSIZE ) / CLU; printf( "Первый кластер данных (физ.) = %d\n", DATACLU ); /* число записей каталога в кластере */ ENTRperCLUSTER = CLU / sizeof(struct dir);




Содержание  Назад  Вперед