home *** CD-ROM | disk | FTP | other *** search
- #include "part.h"
-
- char *progress_bar(int percent)
- {
- int i;
- static char bar[51];
-
- if( percent<0 ) percent=0;
- if( percent>100 ) percent=100;
-
- for( i=0 ; i<percent/2 ; i++ )
- bar[i]=0xB2;
- while( i!=50 ) bar[i++]=0xB0;
- bar[i]=0;
-
- return bar;
- }/* progress_bar */
-
-
- int disk_read_rel(struct disk_info *dinfo, struct part_long *p,
- unsigned long sect, void *buf, int num_sect)
- {
- struct disk_addr daddr;
- unsigned long disk_sect = p->container_base + p->rel_sect + sect;
- unsigned long sect_per_cyl = dinfo->num_sects * dinfo->num_heads;
-
-
- daddr.disk = dinfo->disk;
- daddr.cyl = (disk_sect)/(sect_per_cyl);
- daddr.head = (disk_sect)%(sect_per_cyl)/(dinfo->num_sects);
- daddr.sect = (disk_sect)%(sect_per_cyl)%(dinfo->num_sects)+1;
-
- return disk_read( &daddr, buf, num_sect );
- }/* disk_read_rel */
-
-
- int disk_write_rel(struct disk_info *dinfo, struct part_long *p,
- unsigned long sect, void *buf, int num_sect)
- {
- struct disk_addr daddr;
- unsigned long disk_sect = p->container_base + p->rel_sect + sect;
- unsigned long sect_per_cyl = dinfo->num_sects * dinfo->num_heads;
-
-
- daddr.disk = dinfo->disk;
- daddr.cyl = (disk_sect)/(sect_per_cyl);
- daddr.head = (disk_sect)%(sect_per_cyl)/(dinfo->num_sects);
- daddr.sect = (disk_sect)%(sect_per_cyl)%(dinfo->num_sects)+1;
-
- return disk_write( &daddr, buf, num_sect );
- }/* disk_write_rel */
-
-
-
- int generic_verify(struct disk_info *dinfo, struct part_long *p,
- int bbt_size, unsigned long *bbt, int (*progress)(char*) )
- {
- char tmp[90];
- struct disk_addr daddr;
- unsigned long base_sect=0;
- int i, j, cyl, head, sect, num_sect, x, num_bad=0, hd=dinfo->disk;
-
- disk_lock(hd);
-
- progress(MESG_VERIFYING);
-
- for( cyl=p->start_cyl ; cyl<=p->end_cyl ; cyl++ )
- {
- for( head=((cyl==p->start_cyl)?p->start_head:0) ;
- head<((cyl==p->end_cyl)?p->end_head+1:dinfo->num_heads) ; head++ )
- {
- daddr.disk=hd;
- daddr.cyl=cyl;
- daddr.head=head;
-
- if( cyl==p->end_cyl && head==p->end_head ) daddr.sect=1;
- if( cyl==p->start_cyl && head==p->start_head ) daddr.sect=p->start_sect;
-
- num_sect=dinfo->num_sects-daddr.sect+1;
-
- if( disk_verify(&daddr,num_sect)==-1 )
- {
- for( sect=0 ; sect<num_sect ; sect++ )
- {
- daddr.sect=sect+1;
- if( disk_verify(&daddr,1)==-1 )
- {
- if( num_bad==bbt_size )
- {
- disk_unlock(hd);
- return FORMAT_FAILED;
- }
- bbt[num_bad++]=base_sect+sect;
- }
- }
- }
-
- base_sect+=num_sect;
-
- x=base_sect*100.0/p->num_sect;
-
- sprintf(tmp,"\r%s %3d%% Cylinder: %3d",progress_bar(x),x,cyl);
- if( (x=progress(tmp))<0 )
- {
- disk_unlock(hd);
- return x;
- }
- }/* head */
- }/* cyl */
-
- disk_unlock(hd);
- return num_bad;
- }/* generic_verify */
-
-
- int generic_format(struct disk_info *dinfo, struct part_long *p,
- int bbt_size, unsigned long *bbt, int (*progress)(char*) )
- {
- char tmp[90];
- struct disk_addr daddr;
- unsigned long base_sect=0;
- static unsigned char ftab[512];
- int i, j, cyl, head, sect, num_sect, x, num_bad=0, hd=dinfo->disk;
-
- if( p->start_sect!=1 || p->end_sect!=dinfo->num_sects )
- {
- progress(ERROR_FORMAT_FRACTION);
- return FORMAT_FAILED;
- }
-
- if( detected_os==SYS_WIN95 )
- {
- progress(ERROR_FORMAT_WIN95);
- return FORMAT_FAILED;
- }
-
- disk_lock(hd);
- progress(MESG_FORMATTING);
-
- for( cyl=p->start_cyl ; cyl<=p->end_cyl ; cyl++ )
- {
- for( head=((cyl==p->start_cyl)?p->start_head:0) ;
- head<((cyl==p->end_cyl)?p->end_head+1:dinfo->num_heads) ; head++ )
- {
- daddr.disk=hd;
- daddr.cyl=cyl;
- daddr.head=head;
-
- num_sect=dinfo->num_sects;
-
- for( sect=0 ; sect<num_sect ; sect++ )
- {
- ftab[sect*2+1]=sect+1;
- }
-
- if( disk_format(&daddr,ftab)==-1 )
- {
- progress(ERROR_FORMAT_GEN);
- disk_unlock(hd);
- return FORMAT_FAILED;
- }
-
- for( sect=0 ; sect<num_sect ; sect++ )
- if( ftab[sect*2]!=0 ) /* is it a bad sector? */
- {
- if( num_bad==bbt_size )
- {
- disk_unlock(hd);
- return FORMAT_FAILED;
- }
- bbt[num_bad++]=base_sect+sect;
- }
-
- base_sect+=num_sect;
-
- x=base_sect*100.0/p->num_sect;
-
- sprintf(tmp,"\r%s %3d%% Cylinder: %3d",progress_bar(x),x,cyl);
- if( (x=progress(tmp))<0 )
- {
- disk_unlock(hd);
- return x;
- }
- }/* head */
- }/* cyl */
-
- disk_unlock(hd);
- return num_bad;
- }/* generic_format */
-