summaryrefslogtreecommitdiffstats
path: root/perl-install/resize_fat/c_rewritten.xs
diff options
context:
space:
mode:
Diffstat (limited to 'perl-install/resize_fat/c_rewritten.xs')
-rw-r--r--perl-install/resize_fat/c_rewritten.xs195
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;