/* @param cluster: cluster number * @param buffer: the buffer to store the cluster * @param cluster size: cluster size in sectors */ static inline void cluster_read(int cluster, char *buffer, int cluster_size, struct fat_part_desc *desc) { int i, sect; sect = cluster_to_sector(cluster, desc); for (i = 0; i < cluster_size; ++i, ++sect) block_read_lba(sect, buffer + (i * 512)); }
void setlast(int disk, int *track, int *head, int sysonly) { int i; struct DEVICEPARAMS dp; long fatsector,lastsec; int secsfat,datasec; unsigned int nclusters; unsigned short maxcluster; if ((i = disk_getparams(disk,&dp)) != DISK_OK) { /* LIB TODO: make a strliberror() function (like strerror()) */ lib_error("getlast()",i); exit(1); } if (sysonly) { datasec = data_sector(&dp); physical(track,NULL,head,datasec,dp.hidden_sectors,dp.secs_track, dp.num_heads); printf("System extends to track %d, side %d (logical sector %d).\n", MaxTrack,MaxHead,datasec); return; } nclusters = num_clusters(&dp); fatsector = dp.reserved_secs; secsfat = dp.secs_fat; maxcluster = searchfat12(disk,(unsigned short)nclusters, fatsector,secsfat,0); if (maxcluster == 0) die("There seems to be no data on the disk in ","%c:.",disk+'A'); datasec = data_sector(&dp); lastsec = cluster_to_sector(maxcluster,datasec,dp.secs_cluster); lastsec += (dp.secs_cluster-1); physical(track,NULL,head,lastsec,dp.hidden_sectors,dp.secs_track, dp.num_heads); printf("Last allocated cluster, %u, is on ",maxcluster); printf("track %d, side %d.\n",MaxTrack,MaxHead); }