| 45 | #define BACKUP_MAXSIZE 5120 |
| 46 | |
| 47 | int save_header(disk_t *disk_car, const partition_t *partition, const int verbose) |
| 48 | { |
| 49 | unsigned char *buffer; |
| 50 | FILE *f_backup; |
| 51 | int res=0; |
| 52 | if(verbose>1) |
| 53 | { |
| 54 | log_trace("save_header\n"); |
| 55 | } |
| 56 | f_backup=fopen("header.log","ab"); |
| 57 | if(!f_backup) |
| 58 | { |
| 59 | log_critical("Can't create header.log file: %s\n",strerror(errno)); |
| 60 | return -1; |
| 61 | } |
| 62 | buffer=(unsigned char *)MALLOC(256*DEFAULT_SECTOR_SIZE); |
| 63 | memset(buffer,0,DEFAULT_SECTOR_SIZE); |
| 64 | { |
| 65 | char status='D'; |
| 66 | switch(partition->status) |
| 67 | { |
| 68 | case STATUS_PRIM: status='P'; break; |
| 69 | case STATUS_PRIM_BOOT: status='*'; break; |
| 70 | case STATUS_EXT: status='E'; break; |
| 71 | case STATUS_EXT_IN_EXT: status='X'; break; |
| 72 | case STATUS_LOG: status='L'; break; |
| 73 | case STATUS_DELETED: status='D'; break; |
| 74 | } |
| 75 | snprintf((char*)buffer,256*DEFAULT_SECTOR_SIZE,"%s\n%2u %c Sys=%02X %5u %3u %2u %5u %3u %2u %10lu\n", |
| 76 | disk_car->description(disk_car), partition->order, status, |
| 77 | (disk_car->arch->get_part_type!=NULL ? disk_car->arch->get_part_type(partition) : 0), |
| 78 | offset2cylinder(disk_car,partition->part_offset), offset2head(disk_car,partition->part_offset),offset2sector(disk_car,partition->part_offset), |
| 79 | offset2cylinder(disk_car,partition->part_offset+partition->part_size-disk_car->sector_size), offset2head(disk_car,partition->part_offset+partition->part_size-disk_car->sector_size),offset2sector(disk_car,partition->part_offset+partition->part_size-disk_car->sector_size), |
| 80 | (unsigned long)(partition->part_size/disk_car->sector_size)); |
| 81 | } |
| 82 | if(fwrite(buffer,DEFAULT_SECTOR_SIZE,1,f_backup)!=1) |
| 83 | res = -1; |
| 84 | if(res>=0 && disk_car->pread(disk_car, buffer, 256 * DEFAULT_SECTOR_SIZE, partition->part_offset) != 256 * DEFAULT_SECTOR_SIZE) |
| 85 | res = -1; |
| 86 | if(res>=0 && fwrite(buffer,DEFAULT_SECTOR_SIZE,256,f_backup)!=256) |
| 87 | res = -1; |
| 88 | fclose(f_backup); |
| 89 | free(buffer); |
| 90 | return res; |
| 91 | } |
| 92 | |
| 93 | backup_disk_t *partition_load(const disk_t *disk_car, const int verbose) |
| 94 | { |
no test coverage detected