diff options
Diffstat (limited to 'perl-install/resize_fat/c_rewritten.xs')
-rw-r--r-- | perl-install/resize_fat/c_rewritten.xs | 195 |
1 files changed, 13 insertions, 182 deletions
diff --git a/perl-install/resize_fat/c_rewritten.xs b/perl-install/resize_fat/c_rewritten.xs index 92361097d..a42f3d133 100644 --- a/perl-install/resize_fat/c_rewritten.xs +++ b/perl-install/resize_fat/c_rewritten.xs @@ -4,105 +4,31 @@ /* set by scan_fat, used by next */ short *fat = NULL; -char *fat_flag_map = NULL; -unsigned int *fat_remap = NULL; -int fat_remap_size; int type_size, nb_clusters, bad_cluster_value; - -void free_all() { -#define FREE(p) if (p) free(p), p = NULL; - FREE(fat); - FREE(fat_flag_map); - FREE(fat_remap); -#undef FREE -} +char *fat_flag_map; unsigned int next(unsigned int cluster) { short *p = fat + type_size * cluster; - if (!fat) { - free_all(); - croak("fat::next: trying to use null pointer"); - } - if (cluster >= nb_clusters + 2) { - free_all(); - croak("fat::next: cluster %d outside filesystem", cluster); - } + if (cluster > nb_clusters + 2) croak("fat::next: cluster %d outside filesystem", cluster); return type_size == 1 ? *p : *((unsigned int *) p); } -void set_next(unsigned int cluster, unsigned int val) { - short *p = fat + type_size * cluster; - if (!fat) { - free_all(); - croak("fat::set_next: trying to use null pointer"); - } - if (cluster >= nb_clusters + 2) { - free_all(); - croak("fat::set_next: cluster %d outside filesystem", cluster); - } - type_size == 1 ? *p : *((unsigned int *) p) = val; -} - MODULE = resize_fat::c_rewritten PACKAGE = resize_fat::c_rewritten -void -read_fat(fd, offset, size, magic) - int fd - int offset - int size - unsigned char magic - PPCODE: -{ - fat = (short *) malloc(size); - if (!fat) { - free_all(); - croak("read_fat: not enough memory"); - } - if (lseek(fd, offset, SEEK_SET) != offset || - read(fd, fat, size) != size) { - free_all(); - croak("read_fat: reading FAT failed"); - } - if (magic != *(unsigned char *) fat) { - free_all(); - croak("read_fat: FAT has invalid signature"); - } -} - void -write_fat(fd, size) - int fd - int size - PPCODE: -{ - if (write(fd, fat, size) != size) { - free_all(); - croak("write_fat: write failed"); - } -} - -void -free_all() - PPCODE: - free_all(); - -void -scan_fat(nb_clusters_, type_size_) +scan_fat(fat_, nb_clusters_, type_size_) + char *fat_ int nb_clusters_ int type_size_ PPCODE: -{ unsigned int v; int free = 0, bad = 0, used = 0; short *p; - type_size = type_size_; nb_clusters = nb_clusters_; - bad_cluster_value = type_size == 32 ? 0x0ffffff7 : 0xfff7; + fat = (short*) fat_; type_size = type_size_; nb_clusters = nb_clusters_; + bad_cluster_value = type_size ? 0xffffff7 : 0xfff7; - if (type_size % 16) { - free_all(); - croak("scan_fat: unable to handle FAT%d", type_size); - } + if (type_size % 16) fprintf(stderr, "unable to handle type_size"), exit(1); type_size /= 16; for (p = fat + 2 * type_size; p < fat + type_size * (nb_clusters + 2); p += type_size) { @@ -116,7 +42,6 @@ scan_fat(nb_clusters_, type_size_) PUSHs(sv_2mortal(newSViv(free))); PUSHs(sv_2mortal(newSViv(bad))); PUSHs(sv_2mortal(newSViv(used))); -} unsigned int next(unused, cluster) @@ -127,49 +52,20 @@ next(unused, cluster) OUTPUT: RETVAL -void -set_next(unused, cluster, val) - void *unused - unsigned int cluster - unsigned int val - CODE: - set_next(cluster, val); - -void -allocate_fat_flag(size) - int size - CODE: - fat_flag_map = calloc(size, 1); - if (!fat_flag_map) { - free_all(); - croak("allocate_fat_flag: not enough memory"); - } - int -checkFat(cluster, type, name) +checkFat(fat_flag_map_, cluster, type, name) + char *fat_flag_map_ unsigned int cluster int type char *name CODE: int nb = 0; + fat_flag_map = fat_flag_map_; - if (!fat_flag_map) { - free_all(); - croak("Bad FAT: trying to use null pointer"); - } for (; cluster < bad_cluster_value; cluster = next(cluster)) { - if (cluster == 0) { - free_all(); - croak("Bad FAT: unterminated chain for %s\n", name); - } - if (cluster >= nb_clusters + 2) { - free_all(); - croak("Bad FAT: chain outside filesystem for %s\n", name); - } - if (fat_flag_map[cluster]) { - free_all(); - croak("Bad FAT: cluster %d is cross-linked for %s\n", cluster, name); - } + if (cluster == 0) croak("Bad FAT: unterminated chain for %s\n", name); + + if (fat_flag_map[cluster]) croak("Bad FAT: cluster $cluster is cross-linked for %s\n", name); fat_flag_map[cluster] = type; nb++; } @@ -181,14 +77,6 @@ unsigned int flag(cluster) unsigned int cluster CODE: - if (!fat_flag_map) { - free_all(); - croak("Bad FAT: trying to use null pointer"); - } - if (cluster >= nb_clusters + 2) { - free_all(); - croak("Bad FAT: going outside filesystem"); - } RETVAL = fat_flag_map[cluster]; OUTPUT: RETVAL @@ -198,62 +86,5 @@ set_flag(cluster, flag) unsigned int cluster int flag CODE: - if (!fat_flag_map) { - free_all(); - croak("Bad FAT: trying to use null pointer"); - } - if (cluster >= nb_clusters + 2) { - free_all(); - croak("Bad FAT: going outside filesystem"); - } fat_flag_map[cluster] = flag; -void -allocate_fat_remap(size) - int size - CODE: - fat_remap_size = size; - fat_remap = (unsigned int *) calloc(size, sizeof(unsigned int *)); - if (!fat_remap) { - free_all(); - croak("allocate_fat_remap: not enough memory"); - } - -unsigned int -fat_remap(cluster) - unsigned int cluster - CODE: - if (!fat_remap) { - free_all(); - croak("fat_remap: trying to use null pointer"); - } - if (cluster >= bad_cluster_value) { - RETVAL = cluster; /* special cases */ - } else { - if (cluster >= fat_remap_size) { - free_all(); - croak("fat_remap: cluster %d >= %d in fat_remap", cluster, fat_remap_size); - } - RETVAL = fat_remap[cluster]; - } - OUTPUT: - RETVAL - -void -set_fat_remap(cluster, val) - unsigned int cluster - unsigned int val - CODE: - if (!fat_remap) { - free_all(); - croak("set_fat_remap: trying to use null pointer"); - } - if (cluster >= fat_remap_size) { - free_all(); - croak("set_fat_remap: cluster %d >= %d in set_fat_remap", cluster, fat_remap_size); - } - if (val < bad_cluster_value && val >= fat_remap_size) { - free_all(); - croak("set_fat_remap: remapping cluster %d to cluster %d >= %d in set_fat_remap", cluster, val, fat_remap_size); - } - fat_remap[cluster] = val; |